diff options
author | sameerasw <[email protected]> | 2025-04-29 04:01:51 +0530 |
---|---|---|
committer | sameerasw <[email protected]> | 2025-04-29 04:01:51 +0530 |
commit | 9847eac10e4164a272eb247587c8f3cc9c46bd61 (patch) | |
tree | 4cc9a18b08e19c019b97a7616aaa7edf775ef9bc | |
parent | 1ede58e69461bd4b4be80b1ca5d35297b940927b (diff) |
website specific blacklisting
-rw-r--r-- | data-viewer/data-viewer.css | 87 | ||||
-rw-r--r-- | data-viewer/data-viewer.js | 186 | ||||
-rw-r--r-- | popup/popup.css | 21 | ||||
-rw-r--r-- | popup/popup.html | 78 | ||||
-rw-r--r-- | popup/popup.js | 70 |
5 files changed, 356 insertions, 86 deletions
diff --git a/data-viewer/data-viewer.css b/data-viewer/data-viewer.css index fd5c3e7..508d34f 100644 --- a/data-viewer/data-viewer.css +++ b/data-viewer/data-viewer.css @@ -346,18 +346,7 @@ body { /* Clear list button styling */ .clear-list-button { - margin-top: 8px; - margin-bottom: 16px; - background-color: var(--secondary-bg); - border-color: var(--border-color); - font-size: 12px; - padding: 6px 12px; -} - -.clear-list-button:hover { - background-color: rgba(220, 53, 69, 0.1); - border-color: var(--danger-color); - color: var(--danger-color); + margin-bottom: 20px; } /* Null and object value styling */ @@ -446,3 +435,77 @@ body { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); } } + +/* Styling for the website lists section */ +.tables-container { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; + margin-top: 16px; +} + +.list-title-section { + margin-bottom: 16px; +} + +.list-title-section h3 { + margin-top: 0; + margin-bottom: 12px; + color: var(--text-primary); + font-size: 18px; +} + +.list-section { + background-color: var(--bg-color); + border-radius: var(--radius-sm); + padding: 16px; +} + +.list-section h4 { + margin-top: 0; + margin-bottom: 8px; + color: var(--accent-color); +} + +.list-description { + margin-top: 0; + margin-bottom: 16px; + font-size: 13px; + color: var(--text-secondary); + font-style: italic; +} + +.remove-site-button { + background-color: var(--danger-color); + color: white; + border: none; + border-radius: 50%; + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: var(--transition); +} + +.remove-site-button:hover { + background-color: var(--danger-hover-color); + transform: scale(1.1); +} + +.remove-site-button i { + font-size: 12px; +} + +.clear-list-button { + margin-bottom: 20px; +} + +/* Responsive handling for mobile */ +@media (max-width: 768px) { + .tables-container { + grid-template-columns: 1fr; + gap: 16px; + } +} diff --git a/data-viewer/data-viewer.js b/data-viewer/data-viewer.js index f6dd566..c006f09 100644 --- a/data-viewer/data-viewer.js +++ b/data-viewer/data-viewer.js @@ -1,6 +1,7 @@ document.addEventListener("DOMContentLoaded", function () { const BROWSER_STORAGE_KEY = "transparentZenSettings"; const SKIP_FORCE_THEMING_KEY = "skipForceThemingList"; + const SKIP_THEMING_KEY = "skipThemingList"; const globalSettingsElement = document.getElementById("global-settings-data"); const skipListElement = document.getElementById("skip-list-data"); @@ -100,9 +101,15 @@ document.addEventListener("DOMContentLoaded", function () { disableTransparencyToggle.checked = globalSettings.disableTransparency || false; - // Display skip/enable list - const skipList = data[SKIP_FORCE_THEMING_KEY] || []; - displaySkipList(skipList, globalSettings.whitelistMode); + // Display skip/enable lists for both forced and non-forced websites + const skipForceList = data[SKIP_FORCE_THEMING_KEY] || []; + const skipThemingList = data[SKIP_THEMING_KEY] || []; + displayCombinedSkipLists( + skipForceList, + skipThemingList, + globalSettings.whitelistMode, + globalSettings.whitelistStyleMode + ); // Display combined websites and settings displayCombinedWebsiteData(data); @@ -155,46 +162,117 @@ document.addEventListener("DOMContentLoaded", function () { globalSettingsElement.appendChild(table); } - function displaySkipList(skipList, isWhitelistMode) { + function displayCombinedSkipLists( + skipForceList, + skipThemingList, + isWhitelistMode, + isWhitelistStyleMode + ) { skipListElement.innerHTML = ""; - const modeType = isWhitelistMode ? "Whitelist" : "Blacklist"; - const actionType = isWhitelistMode ? "Enabled" : "Skipped"; + // Create title and description section + const titleSection = document.createElement("div"); + titleSection.className = "list-title-section"; - const modeInfo = document.createElement("div"); - modeInfo.classList.add("mode-info"); - modeInfo.innerHTML = `<strong>Current Mode:</strong> ${modeType} Mode - ${ - isWhitelistMode - ? "Only apply forced styling to sites in the list" - : "Apply forced styling to all sites except those in the list" - }`; - skipListElement.appendChild(modeInfo); + const forceModeName = isWhitelistMode ? "Whitelist" : "Blacklist"; + const styleModeName = isWhitelistStyleMode ? "Whitelist" : "Blacklist"; - // Add Clear List button - if (skipList.length > 0) { + titleSection.innerHTML = ` + <h3>Website Lists Overview</h3> + <div class="mode-info"> + <div><strong>Force Styling Mode:</strong> ${forceModeName} Mode (${ + isWhitelistMode + ? "only apply to sites in the list" + : "apply to all except sites in the list" + })</div> + <div><strong>General Styling Mode:</strong> ${styleModeName} Mode (${ + isWhitelistStyleMode + ? "only apply to sites in the list" + : "apply to all except sites in the list" + })</div> + </div> + `; + + skipListElement.appendChild(titleSection); + + // Add Clear Both Lists button + if (skipForceList.length > 0 || skipThemingList.length > 0) { const clearListButton = document.createElement("button"); clearListButton.classList.add( "action-button", "secondary", "clear-list-button" ); - clearListButton.innerHTML = '<i class="fas fa-trash"></i> Clear List'; + clearListButton.innerHTML = + '<i class="fas fa-trash"></i> Clear All Website Lists'; clearListButton.addEventListener("click", function () { if ( confirm( - `Are you sure you want to clear the entire ${modeType} list? This will affect how styling is applied to websites.` + `Are you sure you want to clear ALL website lists? This will reset both Forced and Regular styling lists and may affect how styling is applied to websites.` ) ) { - clearSkipList(); + clearAllSkipLists(); } }); skipListElement.appendChild(clearListButton); } - if (skipList.length === 0) { - skipListElement.innerHTML += - '<div class="no-data">No websites in the list.</div>'; - return; + // Create container for the two tables + const tablesContainer = document.createElement("div"); + tablesContainer.className = "tables-container"; + + // Create force styling list + const forceListSection = createSingleListSection( + skipForceList, + isWhitelistMode, + "Force Styling List", + isWhitelistMode + ? "Sites where forced styling IS applied" + : "Sites where forced styling is NOT applied", + SKIP_FORCE_THEMING_KEY + ); + + // Create regular styling list + const regularListSection = createSingleListSection( + skipThemingList, + isWhitelistStyleMode, + "Regular Styling List", + isWhitelistStyleMode + ? "Sites where regular styling IS applied" + : "Sites where regular styling is NOT applied", + SKIP_THEMING_KEY + ); + + tablesContainer.appendChild(forceListSection); + tablesContainer.appendChild(regularListSection); + skipListElement.appendChild(tablesContainer); + } + + function createSingleListSection( + list, + isWhitelistMode, + title, + description, + storageKey + ) { + const section = document.createElement("div"); + section.className = "list-section"; + + const sectionTitle = document.createElement("h4"); + sectionTitle.textContent = title; + section.appendChild(sectionTitle); + + const sectionDescription = document.createElement("p"); + sectionDescription.className = "list-description"; + sectionDescription.textContent = description; + section.appendChild(sectionDescription); + + if (list.length === 0) { + const emptyMessage = document.createElement("div"); + emptyMessage.className = "no-data"; + emptyMessage.textContent = "No websites in this list"; + section.appendChild(emptyMessage); + return section; } const table = document.createElement("table"); @@ -203,32 +281,76 @@ document.addEventListener("DOMContentLoaded", function () { // Table header const thead = document.createElement("thead"); const headerRow = document.createElement("tr"); - headerRow.innerHTML = `<th>${actionType} Websites</th>`; + headerRow.innerHTML = `<th>Website</th><th>Action</th>`; thead.appendChild(headerRow); table.appendChild(thead); // Table body const tbody = document.createElement("tbody"); - for (const site of skipList) { + for (const site of list) { const row = document.createElement("tr"); - row.innerHTML = `<td>${site}</td>`; + + // Website column + const siteCell = document.createElement("td"); + siteCell.textContent = site; + row.appendChild(siteCell); + + // Action column + const actionCell = document.createElement("td"); + const removeButton = document.createElement("button"); + removeButton.className = "remove-site-button"; + removeButton.innerHTML = '<i class="fas fa-times"></i>'; + removeButton.title = "Remove from list"; + removeButton.addEventListener("click", function () { + removeSiteFromList(site, storageKey); + }); + actionCell.appendChild(removeButton); + row.appendChild(actionCell); + tbody.appendChild(row); } table.appendChild(tbody); - skipListElement.appendChild(table); + section.appendChild(table); + return section; + } + + async function removeSiteFromList(site, listKey) { + try { + // Get current list + const data = await browser.storage.local.get(listKey); + const list = data[listKey] || []; + + // Remove the site + const newList = list.filter((item) => item !== site); + + // Save updated list + await browser.storage.local.set({ [listKey]: newList }); + + // Refresh the display + loadAllData(); + + console.log(`Removed ${site} from ${listKey}`); + } catch (error) { + console.error(`Error removing site from list: ${error}`); + alert(`An error occurred: ${error.message}`); + } } - async function clearSkipList() { + async function clearAllSkipLists() { try { - await browser.storage.local.remove(SKIP_FORCE_THEMING_KEY); - alert(`${SKIP_FORCE_THEMING_KEY} has been cleared successfully.`); + // Clear both lists at once + await browser.storage.local.remove([ + SKIP_FORCE_THEMING_KEY, + SKIP_THEMING_KEY, + ]); + alert("All website lists have been cleared successfully."); loadAllData(); // Reload data to reflect changes } catch (error) { - console.error("Error clearing skip list:", error); + console.error("Error clearing lists:", error); alert( - "An error occurred while trying to clear the list: " + error.message + "An error occurred while trying to clear the lists: " + error.message ); } } diff --git a/popup/popup.css b/popup/popup.css index f1d23e4..3ffd5cb 100644 --- a/popup/popup.css +++ b/popup/popup.css @@ -60,14 +60,14 @@ body { font-size: 30px;
}
-#header-container{
+#header-container {
display: flex;
justify-content: space-between;
flex-direction: column;
width: 100%;
}
-.miniheader{
+.miniheader {
margin-top: 2px;
font-size: 11px;
display: flex;
@@ -502,6 +502,11 @@ input:checked + .slider:before { margin-bottom: 16px;
}
+/* Make forcing container collapsible */
+.forcing-container.collapsed {
+ display: none;
+}
+
.warning {
color: var(--warning-color);
margin-top: 8px;
@@ -554,3 +559,15 @@ input:checked + .slider:before { .toggle-switch.disabled input:checked + .slider {
background-color: rgba(249, 135, 100, 0.5);
}
+
+.site-domain {
+ color: var(--accent-color);
+ font-weight: 600;
+ max-width: 180px;
+ display: inline-block;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ vertical-align: bottom;
+ margin-right: 4px;
+}
diff --git a/popup/popup.html b/popup/popup.html index c4d96e4..1ab05c3 100644 --- a/popup/popup.html +++ b/popup/popup.html @@ -27,35 +27,38 @@ <main class="app-content"> <div class="features-container"> - <div class="toggle-container"> - <label class="toggle-switch"> - <input type="checkbox" id="enable-styling"> - <span class="slider round"></span> - </label> - <span class="toggle-label">Enable Styling</span> - </div> <div class="toggle-container"> <label class="toggle-switch"> - <input type="checkbox" id="whitelist-style-mode"> + <input type="checkbox" id="enable-styling"> <span class="slider round"></span> </label> - <span id="whitelist-style-mode-label" class="toggle-label">Blacklist Mode</span> + <span class="toggle-label">Global Styling</span> </div> <div class="toggle-container"> <label class="toggle-switch"> - <input type="checkbox" id="skip-theming"> + <input type="checkbox" id="whitelist-style-mode"> <span class="slider round"></span> </label> - <span id="site-style-toggle-label" class="toggle-label">Skip Styling for this Site</span> + <span id="whitelist-style-mode-label" class="toggle-label">Blacklist Mode</span> </div> </div> <!-- Current Site Features Section --> <div id="current-site-features" class="features-container"> <button class="collapsible-button" id="toggle-features"> - <span>Current Site Features</span> + <span id="current-site-label"> + <span id="site-domain" class="site-domain"></span> + <span>Features</span> + </span> <i class="fas fa-chevron-down"></i> </button> + <div class="toggle-container"> + <label class="toggle-switch"> + <input type="checkbox" id="skip-theming"> + <span class="slider round"></span> + </label> + <span id="site-style-toggle-label" class="toggle-label">Skip Styling for this Site</span> + </div> <div id="current-site-toggles" class="features-list collapsed"></div> <div class="actions" id="current-site-actions"> <!-- reload botton --> @@ -79,27 +82,34 @@ <span class="toggle-label">Auto Update Styles</span> </div> <div id="last-fetched-time" class="last-fetched-time"></div> - <div class="forcing-container"> - <div class="toggle-container"> - <label class="toggle-switch"> - <input type="checkbox" id="force-styling"> - <span class="slider round"></span> - </label> - <span class="toggle-label">Force Styling</span> - </div> - <div class="toggle-container"> - <label class="toggle-switch"> - <input type="checkbox" id="whitelist-mode"> - <span class="slider round"></span> - </label> - <span id="whitelist-mode-label" class="toggle-label">Blacklist Mode</span> - </div> - <div class="toggle-container"> - <label class="toggle-switch"> - <input type="checkbox" id="skip-force-theming"> - <span class="slider round"></span> - </label> - <span id="site-toggle-label" class="toggle-label">Skip Forcing for this Site</span> + + <div class="features-container"> + <button class="collapsible-button" id="toggle-forcing"> + <span>Force Styling Settings</span> + <i class="fas fa-chevron-down"></i> + </button> + <div id="forcing-content" class="forcing-container collapsed"> + <div class="toggle-container"> + <label class="toggle-switch"> + <input type="checkbox" id="force-styling"> + <span class="slider round"></span> + </label> + <span class="toggle-label">Force Styling</span> + </div> + <div class="toggle-container"> + <label class="toggle-switch"> + <input type="checkbox" id="whitelist-mode"> + <span class="slider round"></span> + </label> + <span id="whitelist-mode-label" class="toggle-label">Blacklist Mode</span> + </div> + <div class="toggle-container"> + <label class="toggle-switch"> + <input type="checkbox" id="skip-force-theming"> + <span class="slider round"></span> + </label> + <span id="site-toggle-label" class="toggle-label">Skip Forcing for this Site</span> + </div> </div> </div> @@ -126,4 +136,4 @@ <script src="popup.js"></script> </body> -</html> +</html>
\ No newline at end of file diff --git a/popup/popup.js b/popup/popup.js index 9c546e8..c86a882 100644 --- a/popup/popup.js +++ b/popup/popup.js @@ -13,7 +13,9 @@ new (class ExtensionPopup { siteSettings = {}; enableStylingSwitch = document.getElementById("enable-styling"); whitelistStylingModeSwitch = document.getElementById("whitelist-style-mode"); - whitelistStylingModeLabel = document.getElementById("whitelist-style-mode-label"); + whitelistStylingModeLabel = document.getElementById( + "whitelist-style-mode-label" + ); skipThemingSwitch = document.getElementById("skip-theming"); siteStyleToggleLabel = document.getElementById("site-style-toggle-label"); skipThemingList = []; @@ -69,6 +71,11 @@ new (class ExtensionPopup { .getElementById("toggle-features") ?.addEventListener("click", this.toggleFeatures.bind(this)); + // Add toggle forcing button event listener + document + .getElementById("toggle-forcing") + ?.addEventListener("click", this.toggleForcing.bind(this)); + this.whitelistModeSwitch.addEventListener( "change", this.handleWhitelistModeChange.bind(this) @@ -116,6 +123,14 @@ new (class ExtensionPopup { this.normalizedCurrentSiteHostname, ")" ); + + // Update the site label with current hostname (without www.) + const siteDomainElement = document.getElementById("site-domain"); + if (siteDomainElement) { + const displayDomain = normalizeHostname(this.currentSiteHostname); + siteDomainElement.textContent = displayDomain; + siteDomainElement.title = displayDomain; // Add full domain as tooltip for long domains + } } } catch (error) { console.error("Error getting current tab info:", error); @@ -163,7 +178,7 @@ new (class ExtensionPopup { this.updateModeLabels(); // In whitelist mode, checked means "include this site" - // In blacklist mode, checked means "skip this site" + // In blacklist mode, checked means "skip this site" this.skipForceThemingSwitch.checked = this.skipForceThemingList.includes( normalizeHostname(this.currentSiteHostname) ); @@ -226,7 +241,8 @@ new (class ExtensionPopup { this.globalSettings.autoUpdate = this.autoUpdateSwitch.checked; this.globalSettings.forceStyling = this.forceStylingSwitch.checked; this.globalSettings.whitelistMode = this.whitelistModeSwitch.checked; - this.globalSettings.whitelistStyleMode = this.whitelistStylingModeSwitch.checked; + this.globalSettings.whitelistStyleMode = + this.whitelistStylingModeSwitch.checked; browser.storage.local .set({ @@ -280,11 +296,15 @@ new (class ExtensionPopup { saveSkipForceThemingList() { const isChecked = this.skipForceThemingSwitch.checked; - const index = this.skipForceThemingList.indexOf(normalizeHostname(this.currentSiteHostname)); + const index = this.skipForceThemingList.indexOf( + normalizeHostname(this.currentSiteHostname) + ); if (isChecked && index === -1) { // Add to the list (whitelist: include, blacklist: skip) - this.skipForceThemingList.push(normalizeHostname(this.currentSiteHostname)); + this.skipForceThemingList.push( + normalizeHostname(this.currentSiteHostname) + ); } else if (!isChecked && index !== -1) { // Remove from the list (whitelist: exclude, blacklist: include) this.skipForceThemingList.splice(index, 1); @@ -301,7 +321,9 @@ new (class ExtensionPopup { saveSkipThemingList() { const isChecked = this.skipThemingSwitch.checked; - const index = this.skipThemingList.indexOf(normalizeHostname(this.currentSiteHostname)); + const index = this.skipThemingList.indexOf( + normalizeHostname(this.currentSiteHostname) + ); if (isChecked && index === -1) { // Add to the list (whitelist: include, blacklist: skip) @@ -384,6 +406,26 @@ new (class ExtensionPopup { } } + // Set the forcing section's initial collapsed state + const forcingContent = document.getElementById("forcing-content"); + const toggleForcingButton = document.getElementById("toggle-forcing"); + + if (hasSpecificTheme) { + // We have a specific theme, collapse the forcing section + forcingContent.classList.add("collapsed"); + if (toggleForcingButton) { + const icon = toggleForcingButton.querySelector("i"); + if (icon) icon.className = "fas fa-chevron-down"; + } + } else { + // No specific theme found, expand the forcing section + forcingContent.classList.remove("collapsed"); + if (toggleForcingButton) { + const icon = toggleForcingButton.querySelector("i"); + if (icon) icon.className = "fas fa-chevron-up"; + } + } + // Disable the force styling toggle if we found a theme for this site if (hasSpecificTheme) { // We found a specific theme for this site, no need for force styling @@ -906,4 +948,20 @@ new (class ExtensionPopup { icon.className = "fas fa-chevron-up"; } } + + // Toggle forcing section visibility + toggleForcing() { + const forcingContent = document.getElementById("forcing-content"); + const toggleButton = document.getElementById("toggle-forcing"); + + forcingContent.classList.toggle("collapsed"); + + // Update the icon + const icon = toggleButton.querySelector("i"); + if (forcingContent.classList.contains("collapsed")) { + icon.className = "fas fa-chevron-down"; + } else { + icon.className = "fas fa-chevron-up"; + } + } })(); |