您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
4/9/2025, 5:57:43 PM
// ==UserScript== // @name tenno.tools highlight // @match https://tenno.tools/* // @version 0.1 // @author Jere // @description 4/9/2025, 5:57:43 PM // @grant GM_addStyle // @license MIT // @namespace https://greasyfork.org/users/1521722 // ==/UserScript== // the first element is the type# of the table const missionLocationsArray = [0, "mercury", "venus", "earth", "mars", "phobos", "deimos", "ceres", "jupiter", "europa", "saturn", "uranus", "neptune", "pluto", "sedna", "eris", "void", "lua", "kuva fortress", "zariman", "veil"]; const missionTypesArray = [1, "capture", "exterminate", "mobile defense", "rescue", "sabotage", "spy", "alchemy", "disruption", "defense", "excavation", "interception", "survival", "void cascade", "void flood", "skirmish"]; missionTypesArray.sort(); const missionTiersArray = [2, "lith", "meso", "neo", "axi", "omnia", "requiem"]; let highlightsArray = [ [], [], [] ]; let excludesArray = [ [], [], [] ]; let specialExcludesArray = []; function parseFromLocalStorage(key, dataset) { const storageData = localStorage.getItem(key + dataset) if (storageData) { return JSON.parse(storageData); } else { return []; } } function loadSettings(datasetTable) { // check the special exclusions separately from the normal ones i.e. datasetTable=3 const excludeSpecialCheckboxes = document.querySelectorAll("#filters input.exclude-filter[data-table='3']"); const storedSpecialExcludes = localStorage.getItem("specialExcludes"); if (datasetTable === 3) { if (storedSpecialExcludes) { specialExcludesArray = JSON.parse(storedSpecialExcludes); for (let i = 0; i < excludeSpecialCheckboxes.length; i++) { const excludeSpecialCheckboxName = excludeSpecialCheckboxes[i].name.split("_")[1]; if (specialExcludesArray.includes(excludeSpecialCheckboxName)) { excludeSpecialCheckboxes[i].checked = true; } } } return; } const excludeCheckboxes = document.querySelectorAll("#filters input.exclude-filter[data-table='" + datasetTable + "']"); const includeCheckboxes = document.querySelectorAll("#filters input.include-filter[data-table='" + datasetTable + "']"); highlightsArray[datasetTable] = parseFromLocalStorage("hilights", datasetTable); excludesArray[datasetTable] = parseFromLocalStorage("excludes", datasetTable); // check the boxes on the page if found in the localStorages // using excludeCheckboxes.lenght but includeCheckboxes should be the same size for (let i = 0; i < excludeCheckboxes.length; i++) { const includeCheckboxName = includeCheckboxes[i].name.split("_")[1]; const excludeCheckboxName = excludeCheckboxes[i].name.split("_")[1]; if (highlightsArray[datasetTable].includes(includeCheckboxName)) { includeCheckboxes[i].checked = true; } if (excludesArray[datasetTable].includes(excludeCheckboxName)) { excludeCheckboxes[i].checked = true; } } } function checkboxClick(event) { const checkbox = event.target; const [checkboxType, checkboxName] = checkbox.name.split("_"); // include/exclude, planet/missiontype/era const checkboxTable = checkbox.dataset.table; // identifier for from which table // checkbox for the special exclusions, normal, steelpath and railjack if (checkboxTable == 3) { if (checkbox.checked === true) { if (!specialExcludesArray.includes(checkboxName)) { specialExcludesArray.push(checkboxName); } } else { if (specialExcludesArray.includes(checkboxName)) { specialExcludesArray = specialExcludesArray.filter(item => item !== checkboxName); } } localStorage.setItem("specialExcludes", JSON.stringify(specialExcludesArray)); } else { // fetch the adjacent checkboxes let checkboxOpposite; if (checkboxType == "include") { checkboxOpposite = document.querySelector("#filters input[name='exclude_" + checkboxName + "']"); } else if (checkboxType == "exclude") { checkboxOpposite = document.querySelector("#filters input[name='include_" + checkboxName + "']"); } // break the input's name i.e "exclude_earth" const checkboxOppositeLocation = checkbox.name.split("_")[1]; // remove from the array if the opposite box is checked if (checkboxOpposite.checked) { checkboxOpposite.checked = false; // remove from the excludes if (checkboxType == "include") { excludesArray[checkboxTable] = excludesArray[checkboxTable].filter(item => item !== checkboxOppositeLocation); } // remove from the array else if (checkboxType == "exclude") { highlightsArray[checkboxTable] = highlightsArray[checkboxTable].filter(item => item !== checkboxOppositeLocation); } } // add to array if is checked if (checkbox.checked) { if (checkboxType == "include") { highlightsArray[checkboxTable].push(checkboxName); } else if (checkboxType == "exclude") { excludesArray[checkboxTable].push(checkboxName); } } // if not checked -> remove from the arrays else { if (checkboxType == "include") { highlightsArray[checkboxTable] = highlightsArray[checkboxTable].filter(item => item !== checkboxName); } else if (checkboxType == "exclude") { excludesArray[checkboxTable] = excludesArray[checkboxTable].filter(item => item !== checkboxName); } } //save the selections to the localstorage localStorage.setItem("hilights" + checkboxTable, JSON.stringify(highlightsArray[checkboxTable])); localStorage.setItem("excludes" + checkboxTable, JSON.stringify(excludesArray[checkboxTable])); } highlightPage(); } function createCheckbox(boxClass, boxName, dataTable) { const checkboxInput = document.createElement("input"); checkboxInput.setAttribute("type", "checkbox"); checkboxInput.setAttribute("class", boxClass); checkboxInput.setAttribute("name", boxName); checkboxInput.setAttribute("data-table", dataTable); checkboxInput.addEventListener("change", checkboxClick); return checkboxInput; } function createHighlightDiv(fissureType, fissureTypeText) { const highlightDivContainer = document.createElement("div"); highlightDivContainer.setAttribute("class", "highlight-container light-box gap hidden " + fissureType); //highlightDivContainer.style.display = "none"; const fissuresDiv = document.querySelector('wf-fissures'); fissuresDiv.insertBefore(highlightDivContainer, fissuresDiv.querySelector('.light-box.gap')); const highlightDivType = document.createElement("div"); highlightDivType.setAttribute("class", "entries " + fissureType); const highlightTypeH2 = document.createElement("h2"); highlightTypeH2.innerText = fissureTypeText; highlightDivType.appendChild(highlightTypeH2); highlightDivContainer.appendChild(highlightDivType); } function createTable(rows, columns, contentArray) { const table = document.createElement("table"); for (let row = 1; row < rows; row++) { const tr = document.createElement("tr"); for (let col = 0; col < columns; col++) { const td = document.createElement("td"); // 0=planets 1=missions 2=era switch (col) { case 0: td.setAttribute("class", "label"); td.innerText = contentArray[row]; break; case 1: td.setAttribute("class", "include-filter"); td.appendChild(createCheckbox("include-filter", "include_" + contentArray[row], contentArray[0])); break; case 2: td.setAttribute("class", "exclude-filter"); td.appendChild(createCheckbox("exclude-filter", "exclude_" + contentArray[row], contentArray[0])); break; } tr.appendChild(td); } table.appendChild(tr); } return table; } function setup() { const filterDiv = document.createElement("div"); filterDiv.setAttribute("id", "filters"); const locationsDiv = document.createElement("div"); locationsDiv.setAttribute("id", "location-filter") const typesDiv = document.createElement("div"); typesDiv.setAttribute("id", "missiontype-filter"); const tiersDiv = document.createElement("div"); tiersDiv.setAttribute("id", "tier-filter"); const excludeSpecialDiv = document.createElement("div"); excludeSpecialDiv.setAttribute("id", "exclude-special"); const overlayDiv = document.createElement("div"); overlayDiv.setAttribute("id", "overlay"); const filterSettings = document.createElement("div"); filterSettings.setAttribute("id", "filter-settings"); filterDiv.appendChild(locationsDiv); filterDiv.appendChild(typesDiv); filterDiv.appendChild(tiersDiv); locationsDiv.appendChild(createTable(missionLocationsArray.length, 3, missionLocationsArray)); typesDiv.appendChild(createTable(missionTypesArray.length, 3, missionTypesArray)); tiersDiv.appendChild(createTable(missionTiersArray.length, 3, missionTiersArray)); tiersDiv.appendChild(excludeSpecialDiv); const excludeSpecialTable = document.createElement("table"); excludeSpecialTable.setAttribute("class", "exclude-special"); for (let row = 0; row < 3; row++) { const tr = document.createElement("tr"); for (let col = 0; col < 2; col++) { const td = document.createElement("td"); if (col == 0) { td.setAttribute("class", "label"); } else if (col === 1) { td.setAttribute("class", "exclude-filter"); } tr.appendChild(td); } excludeSpecialTable.appendChild(tr); } const fissureType0 = "Normal"; const fissuretype1 = "Steel Path"; const fissureType2 = "Void Storm"; excludeSpecialTable.rows[0].cells[0].innerText = fissureType0 excludeSpecialTable.rows[1].cells[0].innerText = fissuretype1 excludeSpecialTable.rows[2].cells[0].innerText = fissureType2 excludeSpecialTable.rows[0].cells[1].appendChild(createCheckbox("exclude-filter", "exclude_normal", 3)); excludeSpecialTable.rows[1].cells[1].appendChild(createCheckbox("exclude-filter", "exclude_steelpath", 3)); excludeSpecialTable.rows[2].cells[1].appendChild(createCheckbox("exclude-filter", "exclude_railjack", 3)); excludeSpecialDiv.append(excludeSpecialTable); const resetButton = document.createElement("input"); resetButton.setAttribute("type", "button"); resetButton.setAttribute("value", "Reset all"); // reset button -> uncheck all of the checkboxes, empty arrays and localstorage, fuck em. resetButton.addEventListener("click", function(event) { let allButtons = document.querySelectorAll("#filters input[type='checkbox']"); for (let i = 0; i < allButtons.length; i++) { allButtons[i].checked = false; } highlightsArray[0].length = 0; highlightsArray[1].length = 0; highlightsArray[2].length = 0; excludesArray[0].length = 0; excludesArray[1].length = 0; excludesArray[2].length = 0; localStorage.setItem("hilights0", ""); localStorage.setItem("hilights1", ""); localStorage.setItem("hilights2", ""); localStorage.setItem("excludes0", ""); localStorage.setItem("excludes1", ""); localStorage.setItem("excludes2", ""); localStorage.setItem("specialExcludes", ""); highlightPage(); }); excludeSpecialDiv.appendChild(resetButton); // added in "reverse" order because first is last, etc. AST#fasew7u createHighlightDiv("railjack", fissureType2); createHighlightDiv("steelpath", fissuretype1); createHighlightDiv("normal", fissureType0); document.body.appendChild(filterSettings); document.body.appendChild(filterDiv); document.body.appendChild(overlayDiv); // listener for the settings popup document.addEventListener("click", function(event) { // if settings div clicked if (event.target === filterSettings) { const currentDisplay = window.getComputedStyle(filterDiv).display; if (currentDisplay === "none") { filterDiv.style.display = "flex"; overlayDiv.style.display = "block"; } else { filterDiv.style.display = "none"; overlayDiv.style.display = "none"; } return; } // close if clicked outside if (filterDiv.style.display === "flex" && !filterDiv.contains(event.target)) { filterDiv.style.display = "none"; overlayDiv.style.display = "none"; } }); // 0=planets, 1=mission type, 2=era, 3=special excludes loadSettings(0); loadSettings(1); loadSettings(2); loadSettings(3); highlightPage(); } function highlightPage() { const clonedHighlightDivContent = document.querySelectorAll("wf-fissures > .highlight-container .entry"); const missionElements = document.querySelectorAll("wf-fissures > div:not(.highlight-container) .entry"); // check if the cloned highlights at the top are expired if (clonedHighlightDivContent) { for (let i = 0; i < clonedHighlightDivContent.length; i++) { const clonedHighlightEndtime = clonedHighlightDivContent[i].querySelector(".reltime").getAttribute("data-time") * 1000; if (clonedHighlightEndtime < Date.now()) { clonedHighlightDivContent[i].remove(); } } } let foundHilight = 0; for (let missionIndex = 0; missionIndex < missionElements.length; missionIndex++) { const missionLocation = missionElements[missionIndex].querySelector(".mission-location"); const missionType = missionElements[missionIndex].querySelector(".mission-type"); const missionTier = missionElements[missionIndex].querySelector(".fissure-tier"); const [missionPlanetText, missionNodeText] = missionLocation.innerText.toLowerCase().split("/"); const missionTypeText = missionType.innerText.toLowerCase(); const missionTierText = missionTier.innerText.toLowerCase(); // get the h2 for the fissure type let fissureTypeText = missionElements[missionIndex].closest("wf-fissures > div").querySelector("h2").innerText; let fissureType; if (fissureTypeText == "Steel Path") { fissureType = "steelpath"; } else if (fissureTypeText == "Void Storms") { fissureType = "railjack"; } else { fissureType = "normal" } // the logic of highlighting if ( (highlightsArray[0].includes(missionPlanetText) || highlightsArray[1].includes(missionTypeText) || highlightsArray[2].includes(missionTierText) ) && !( excludesArray[0].includes(missionPlanetText) || excludesArray[1].includes(missionTypeText) || excludesArray[2].includes(missionTierText) || specialExcludesArray.includes(fissureType) ) ) { foundHilight++; let highlightDiv if (!missionElements[missionIndex].classList.contains("hilight")) { //show the main container for the fissure type highlightDiv = document.querySelector("wf-fissures > .highlight-container." + fissureType); if (highlightDiv && highlightDiv.classList.contains("hidden")) { highlightDiv.classList.remove("hidden"); } missionElements[missionIndex].classList.add("hilight"); // check for duplicates let matchFound = false; for (let clonesIndex = 0; clonesIndex < clonedHighlightDivContent.length; clonesIndex++) { const cloneInfo = clonedHighlightDivContent[clonesIndex].querySelector(".mission-info"); const missionInfo = missionElements[missionIndex].querySelector(".mission-info"); if (cloneInfo && missionInfo && cloneInfo.isEqualNode(missionInfo)) { matchFound = true; break; } } // if not a duplicate -> clone if (!matchFound) { const clonedHighlight = missionElements[missionIndex].cloneNode(true); highlightDiv.appendChild(clonedHighlight); console.log("Added:"); console.log(clonedHighlight); } } } else { if (missionElements[missionIndex].classList.contains("hilight")) { missionElements[missionIndex].classList.remove("hilight"); for (let clonesIndex = 0; clonesIndex < clonedHighlightDivContent.length; clonesIndex++) { clonedHighlightDivContent[clonesIndex].classList.remove("hilight"); // also remove the cloned if (missionElements[missionIndex].querySelector(".mission-info").isEqualNode(clonedHighlightDivContent[clonesIndex].querySelector(".mission-info"))) { clonedHighlightDivContent[clonesIndex].remove(); console.log("Removed:"); console.log(clonedHighlightDivContent[clonesIndex]); } // re-highlight if no need to remove else { clonedHighlightDivContent[clonesIndex].classList.add("hilight"); } } } } // hide the container if empty highlightDiv = document.querySelector("wf-fissures > .highlight-container." + fissureType); if (highlightDiv && highlightDiv.children.length === 1) { highlightDiv.classList.add("hidden"); } } // highlight and show the amount at the h1 const fissureHeader = document.querySelector("wf-fissures > h1 > span"); if (foundHilight >= 1) { fissureHeader.classList.add("hilight"); fissureHeader.innerText = "Void Fissures (" + foundHilight + ")"; } else { fissureHeader.classList.remove("hilight"); fissureHeader.innerText = "Void Fissures"; } // find the topmost visible highlight container in a clunky way const topNonHighlight = document.querySelector("wf-fissures > .light-box:not(.highlight-container)"); highlightDiv = document.querySelectorAll("wf-fissures > .highlight-container:not(.hidden)"); if (highlightDiv[0]) { topNonHighlight.classList.remove("top-container"); highlightDiv[0].classList.add("top-container"); for (let i = 1; i < highlightDiv.length; i++) { highlightDiv[i].classList.remove("top-container"); } } // else { topNonHighlight.classList.add("top-container"); } } let highlightTimeout = null; const observer = new MutationObserver((mutations) => { if (highlightTimeout !== null) return; highlightTimeout = setTimeout(() => { highlightPage(); highlightTimeout = null; }, 5000); }); observer.observe(document.body, { childList: true, subtree: true }); window.addEventListener("load", function() { setup(); }, false); GM_addStyle(` :root { --highlight-background: #2f3544; --highlight-color: 255, 111, 111; } wf-fissures > .highlight-container { background-color: var(--highlight-background); } .hilight { color: rgb(var(--highlight-color)); } .highlight-container { padding-left: 0.3em; } .highlight-container h2 { color: rgb(var(--highlight-color)); border-bottom: 2px solid rgba(var(--highlight-color), 0.3); } .highlight-container .hidden { display: none; } .top-container { margin-top: 0 !important; } .gap:nth-of-type(1) { margin-top: 0; } #filter-settings { position: fixed; top: 60px; left: 10px; height: 30px; width: 30px; cursor: pointer; z-index: 999; background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBMaWNlbnNlOiBNSVQuIE1hZGUgYnkgdm13YXJlOiBodHRwczovL2dpdGh1Yi5jb20vdm13YXJlL2NsYXJpdHktYXNzZXRzIC0tPgo8c3ZnIGZpbGw9IiMwMDAwMDAiIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDM2IDM2IiB2ZXJzaW9uPSIxLjEiICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5zZXR0aW5ncy1saW5lPC90aXRsZT4KICAgIDxwYXRoIGNsYXNzPSJjbHItaS1vdXRsaW5lIGNsci1pLW91dGxpbmUtcGF0aC0xIiBkPSJNMTguMSwxMWMtMy45LDAtNywzLjEtNyw3czMuMSw3LDcsN2MzLjksMCw3LTMuMSw3LTdTMjIsMTEsMTguMSwxMXogTTE4LjEsMjNjLTIuOCwwLTUtMi4yLTUtNXMyLjItNSw1LTVjMi44LDAsNSwyLjIsNSw1UzIwLjksMjMsMTguMSwyM3oiPjwvcGF0aD48cGF0aCBjbGFzcz0iY2xyLWktb3V0bGluZSBjbHItaS1vdXRsaW5lLXBhdGgtMiIgZD0iTTMyLjgsMTQuN0wzMCwxMy44bC0wLjYtMS41bDEuNC0yLjZjMC4zLTAuNiwwLjItMS40LTAuMy0xLjlsLTIuNC0yLjRjLTAuNS0wLjUtMS4zLTAuNi0xLjktMC4zbC0yLjYsMS40bC0xLjUtMC42bC0wLjktMi44QzIxLDIuNSwyMC40LDIsMTkuNywyaC0zLjRjLTAuNywwLTEuMywwLjUtMS40LDEuMkwxNCw2Yy0wLjYsMC4xLTEuMSwwLjMtMS42LDAuNkw5LjgsNS4yQzkuMiw0LjksOC40LDUsNy45LDUuNUw1LjUsNy45QzUsOC40LDQuOSw5LjIsNS4yLDkuOGwxLjMsMi41Yy0wLjIsMC41LTAuNCwxLjEtMC42LDEuNmwtMi44LDAuOUMyLjUsMTUsMiwxNS42LDIsMTYuM3YzLjRjMCwwLjcsMC41LDEuMywxLjIsMS41TDYsMjIuMWwwLjYsMS41bC0xLjQsMi42Yy0wLjMsMC42LTAuMiwxLjQsMC4zLDEuOWwyLjQsMi40YzAuNSwwLjUsMS4zLDAuNiwxLjksMC4zbDIuNi0xLjRsMS41LDAuNmwwLjksMi45YzAuMiwwLjYsMC44LDEuMSwxLjUsMS4xaDMuNGMwLjcsMCwxLjMtMC41LDEuNS0xLjFsMC45LTIuOWwxLjUtMC42bDIuNiwxLjRjMC42LDAuMywxLjQsMC4yLDEuOS0wLjNsMi40LTIuNGMwLjUtMC41LDAuNi0xLjMsMC4zLTEuOWwtMS40LTIuNmwwLjYtMS41bDIuOS0wLjljMC42LTAuMiwxLjEtMC44LDEuMS0xLjV2LTMuNEMzNCwxNS42LDMzLjUsMTQuOSwzMi44LDE0Ljd6IE0zMiwxOS40bC0zLjYsMS4xTDI4LjMsMjFjLTAuMywwLjctMC42LDEuNC0wLjksMi4xbC0wLjMsMC41bDEuOCwzLjNsLTIsMmwtMy4zLTEuOGwtMC41LDAuM2MtMC43LDAuNC0xLjQsMC43LTIuMSwwLjlsLTAuNSwwLjFMMTkuNCwzMmgtMi44bC0xLjEtMy42TDE1LDI4LjNjLTAuNy0wLjMtMS40LTAuNi0yLjEtMC45bC0wLjUtMC4zbC0zLjMsMS44bC0yLTJsMS44LTMuM2wtMC4zLTAuNWMtMC40LTAuNy0wLjctMS40LTAuOS0yLjFsLTAuMS0wLjVMNCwxOS40di0yLjhsMy40LTFsMC4yLTAuNWMwLjItMC44LDAuNS0xLjUsMC45LTIuMmwwLjMtMC41TDcuMSw5LjFsMi0ybDMuMiwxLjhsMC41LTAuM2MwLjctMC40LDEuNC0wLjcsMi4yLTAuOWwwLjUtMC4yTDE2LjYsNGgyLjhsMS4xLDMuNUwyMSw3LjdjMC43LDAuMiwxLjQsMC41LDIuMSwwLjlsMC41LDAuM2wzLjMtMS44bDIsMmwtMS44LDMuM2wwLjMsMC41YzAuNCwwLjcsMC43LDEuNCwwLjksMi4xbDAuMSwwLjVsMy42LDEuMVYxOS40eiI+PC9wYXRoPgogICAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjM2IiBmaWxsLW9wYWNpdHk9IjAiLz4KPC9zdmc+"); background-repeat: no-repeat; background-position: center; background-size: contain; filter: invert(1); transition: transform 0.1s linear; } #filter-settings:hover { transform: scale(1.2); filter: invert(1) drop-shadow(0 0 0.2rem rgba(255, 255, 255, 0.3)); } #filters #exclude-special { position: absolute; bottom: 0; right: 0; border-top: 1px dashed #7388a1; } #filters { display: none; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); border: 5px solid rgba(0, 0, 0, 0.2); padding: 1em; border-radius: 10px; color: #fff; font: 10pt Gudea, sans-serif !important; background-color: rgba(30, 45, 50, 0.5); backdrop-filter: blur(5px); z-index: 1000; } #overlay { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: #000; opacity: 0.7; display: none; z-index: 999; } #filters, #overlay { animation-name: fade; animation-timing-function: linear; animation-duration: 0.15s; } @keyframes fade { 0% { opacity: 0; } 100% { opacity: 0.7; } } #filters > div { border-right: 1px dashed #7388a1; } #filters > div:last-child { border-right: 0; } #filters input[type="checkbox"] { cursor: pointer; outline: 1px solid black; } #filters input[type="checkbox"]:not(:checked) { opacity: 0.3; } #filters input[type="checkbox"].include-filter { accent-color: darkgreen; } #filters input[type="checkbox"].exclude-filter { accent-color: darkred; } #filters input[type="button"] { background-color: #2f3544; border: 2px solid black; border-radius: 5px; float: right; margin: 0.3em; } #filters input[type="button"]:hover { background-color: #7388a1; } #filters td.include-filter, #filters td.exclude-filter { border-radius: 5px; text-align: center; vertical-align: middle; width: 1em; height: 1em; } #filters td.include-filter { background-color: green; } #filters td.exclude-filter { background-color: red; } #filters td.include-filter:hover { background-color: #4ca64c; } #filters td.exclude-filter:hover { background-color: #ff4c4c; } #filters table { width: 10rem; margin: 0.5em; } #filters .label { text-transform: capitalize; } wf-fissures .state-icons { display: none; } `);