您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
f95zone exclude tags and min like filter.
// ==UserScript== // @name f95zone tweaks // @namespace f95zone tweaks // @description f95zone exclude tags and min like filter. // @match https://f95zone.to/sam/latest_alpha/ // @license GNU GPLv3 // @version 2.0.0 // @author 3xd_Tango // @require https://cdn.jsdelivr.net/combine/npm/@violentmonkey/dom@2,npm/@violentmonkey/[email protected] // @require https://cdn.jsdelivr.net/npm/@violentmonkey/dom@2/dist/solid.js // @require https://cdn.jsdelivr.net/npm/lodash@4/lodash.min.js // @run-at document-idle // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // ==/UserScript== (function (web, lodash, solidJs) { 'use strict'; var css_248z$1 = ".customTags{border-radius:2px;box-shadow:0 0 0 0 transparent,0 1px 1px 0 rgba(0,0,0,.15),0 1px 2px 0 rgba(0,0,0,.15);display:inline-block;font-size:.8em;line-height:1.8em;margin:4px 4px 0 0;padding:0 6px;text-shadow:1px 1px 2px rgba(0,0,0,.75)}.selected-tags-wrap span:hover{background-color:#ba4545}.selected-tags-wrap span{background-color:#181a1d;border-radius:3px;cursor:pointer;display:inline-block;font-size:.9em;line-height:24px;margin:4px 4px 0 0;padding:0 7px;transition:.2s}.input-tag{left:0;opacity:1;position:relative;width:127px}.border-gradient{border:3px solid;border-image-slice:1}.flxgrow{flex-grow:1}.solid-select-multi-value{background-color:#181a1d;border-radius:3px;display:inline-block;font-size:.9em;gap:5px;line-height:24px;margin:4px 4px 0 0;padding:0 7px;transition:.2s}.solid-select-multi-value-remove{background-color:#ba4545;background-color:#953737;border:none;border-radius:2px;cursor:pointer}.solid-select-list{background:#181a1b;z-index:2}.select-likes.select-likes{border:1px solid grey;margin-bottom:5px;padding:5px}"; var css_248z = ".solid-select-container[data-disabled=true]{pointer-events:none}.solid-select-container{position:relative}.solid-select-control[data-disabled=true]{--tw-bg-opacity:1;--tw-border-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity));border-color:rgba(209,213,219,var(--tw-border-opacity))}.solid-select-control{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity));border-radius:.25rem;border-width:1px;display:-ms-grid;display:grid;grid-template-columns:repeat(1,minmax(0,1fr));line-height:1.5;padding:.25rem .5rem}.solid-select-control[data-multiple=true][data-has-value=true]{-webkit-box-align:stretch;-ms-flex-align:stretch;grid-gap:.25rem;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;gap:.25rem}.solid-select-control:focus-within{--tw-outline-opacity:1;outline-color:rgba(209,213,219,var(--tw-outline-opacity))}.solid-select-placeholder{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.solid-select-placeholder,.solid-select-single-value{grid-column-start:1;grid-row-start:1}.solid-select-multi-value{--tw-bg-opacity:1;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background-color:rgba(243,244,246,var(--tw-bg-opacity));border-radius:.25rem;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;font-size:85%;line-height:1;line-height:inherit;padding-left:4px;padding-right:4px}.solid-select-multi-value-remove{padding-left:.25rem;padding-right:.25rem}.solid-select-multi-value-remove:hover{text-shadow:1px 1px 3px rgba(0,0,0,.29),2px 4px 7px rgba(73,64,125,.35)}.solid-select-input{-webkit-box-flex:1;background-color:initial;border-width:0;caret-color:transparent;-ms-flex:1 1 0%;-webkit-flex:1 1 0%;flex:1 1 0%;font:inherit;grid-column-start:1;grid-row-start:1;margin:0;outline:2px solid transparent;outline-offset:2px;padding:0}.solid-select-input:read-only{cursor:default}.solid-select-input[data-is-active=true],.solid-select-input[data-multiple=true]{caret-color:currentColor}.solid-select-list{--tw-shadow:0 10px 15px -3px rgb(0 0 0/0.1),0 4px 6px -4px rgb(0 0 0/0.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);background-color:inherit;border-radius:.125rem;-webkit-box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);margin-top:.25rem;max-height:50vh;min-width:100%;overflow-y:auto;padding:.5rem;position:absolute;white-space:nowrap;z-index:1}.solid-select-option:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.solid-select-option[data-focused=true]{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.solid-select-option>mark{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgba(unset,var(--tw-bg-opacity));color:rgba(unset,var(--tw-text-opacity));-webkit-text-decoration-line:underline;text-decoration-line:underline}.solid-select-option{cursor:default;padding:.5rem 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.solid-select-option[data-disabled=true]{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity));pointer-events:none}.solid-select-list-placeholder{cursor:default;padding:.5rem 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}"; var SelectCss = css_248z; const likes = GM_getValue('likes', [{ name: 'incest', tag: '30', color: '#ff0000' }, { name: 'harem', tag: '254', color: '#0011ff' }, { name: 'futa/trans', tag: '191', color: '#EE82EE' }, { name: 'loli', tag: '639', color: '#00f5ffff' }, { name: 'futa/trans protagonist', tag: '2255', color: '#EE82EE' }]); const dislikes = GM_getValue('dislikes', [{ name: 'female protagonist', tag: '392' }, { name: 'text based', tag: '522' }, { name: 'mind control', tag: '111' }]); const totalTags = GM_getValue('tags', [['2d game', '2214'], ['2dcg', '1507'], ['3d game', '1434'], ['3dcg', '107'], ['adventure', '162'], ['ahegao', '916'], ['anal sex', '2241'], ['animated', '783'], ['bdsm', '264'], ['bestiality', '105'], ['big ass', '817'], ['big tits', '130'], ['blackmail', '339'], ['bukkake', '216'], ['censored', '2247'], ['character creation', '2246'], ['cheating', '924'], ['combat', '550'], ['corruption', '103'], ['cosplay', '606'], ['creampie', '278'], ['dating sim', '348'], ['dilf', '1407'], ['drugs', '2217'], ['dystopian setting', '2249'], ['exhibitionism', '384'], ['fantasy', '179'], ['female domination', '2252'], ['female protagonist', '392'], ['footjob', '553'], ['furry', '382'], ['futa/trans', '191'], ['futa/trans protagonist', '2255'], ['gay', '360'], ['graphic violence', '728'], ['groping', '535'], ['group sex', '498'], ['handjob', '259'], ['harem', '254'], ['horror', '708'], ['humiliation', '871'], ['humor', '361'], ['incest', '30'], ['internal view', '1483'], ['interracial', '894'], ['japanese game', '736'], ['kinetic novel', '1111'], ['lactation', '290'], ['lesbian', '181'], ['loli', '639'], ['male domination', '174'], ['male protagonist', '173'], ['management', '449'], ['masturbation', '176'], ['milf', '75'], ['mind control', '111'], ['mobile game', '2229'], ['monster', '182'], ['monster girl', '394'], ['multiple endings', '322'], ['multiple penetration', '1556'], ['multiple protagonist', '2242'], ['necrophilia', '1828'], ['netorare', '258'], ['no sexual content', '324'], ['oral sex', '237'], ['paranormal', '408'], ['parody', '505'], ['platformer', '1508'], ['point & click', '1525'], ['possession', '1476'], ['pov', '1766'], ['pregnancy', '225'], ['prostitution', '374'], ['puzzle', '1471'], ['rape', '417'], ['real porn', '1707'], ['religion', '2218'], ['romance', '330'], ['rpg', '45'], ['sandbox', '2257'], ['scat', '689'], ['school setting', '547'], ['sci-fi', '141'], ['sex toys', '2216'], ['sexual harassment', '670'], ['shooter', '1079'], ['shota', '749'], ['side-scroller', '776'], ['simulator', '448'], ['sissification', '2215'], ['slave', '44'], ['sleep sex', '1305'], ['spanking', '769'], ['strategy', '628'], ['stripping', '480'], ['superpowers', '354'], ['swinging', '2234'], ['teasing', '351'], ['tentacles', '215'], ['text based', '522'], ['titfuck', '411'], ['trainer', '199'], ['transformation', '875'], ['trap', '362'], ['turn based combat', '452'], ['twins', '327'], ['urination', '1254'], ['vaginal sex', '2209'], ['virgin', '833'], ['virtual reality', '895'], ['voiced', '1506'], ['vore', '757'], ['voyeurism', '485']]); function checkTags(element, dataTags) { const dislikeGM = GM_getValue('dislikes', dislikes); let tagProt = ['female protagonist', 'male protagonist', 'futa/trans protagonist']; const tagProtNames = dislikeGM.filter(e => e.name.includes('protagonist')); const b = []; let c = 0; dataTags.forEach(e => { if (tagProtNames.length >= 1) { if (tagProtNames.some(t => t.tag === e)) { return b.push(e); } } if (dislikeGM.some(d => d.tag.includes(e))) { c += 1; } }); if (c > 0) { return true; } if (b.length > 0) { b.forEach(e => { tagProt = tagProt.filter(r => r !== e); }); for (let i = 0; i <= tagProt.length - 1; i++) { console.debug(`datatags includes? = ${dataTags.includes(tagProt[i])} for ${tagProt[i]} `); if (dataTags.includes(tagProt[i])) { return false; } if (i === tagProt.length - 1) { return true; } } } console.debug(`tagProt = ${tagProt}`); return false; } function dislikeFilter() { const element = document.querySelectorAll('.resource-tile'); for (let i = 0; i < element.length; i++) { const dataTags = element[i].dataset.tags.split(','); const isFP = checkTags(element[i], dataTags); if (isFP) { element[i].setAttribute('isDislike', 'true'); } else { element[i].setAttribute('isDislike', 'false'); } } } function filterOut() { const element = document.querySelectorAll('.resource-tile'); for (let i = 0; i < element.length; i++) { if (element[i].getAttribute('isDislike') === 'true' || element[i].getAttribute('isLikeLimit') === 'true' || element[i].getAttribute('isIgnore') === 'true') { element[i].style.setProperty('display', 'none', 'important'); element[i].style.setProperty('height', '0px', 'important'); element[i].style.setProperty('margin', '0px', 'important'); } else { element[i].style.setProperty('display', 'block', 'important'); element[i].style.setProperty('height', 'unset', 'important'); element[i].style.setProperty('margin', 'unset', 'important'); } } } function likeFilter() { const element = document.querySelectorAll('.resource-tile'); document.querySelectorAll('.customTags').forEach(e => e.parentNode.remove()); for (let i = 0; i < element.length; i += 1) { element[i].style = ''; element[i].classList.remove('border-gradient'); element[i].setAttribute('isDisplay', 'false'); const colors = []; const node = document.createElement('DIV'); const dataTags = element[i].dataset.tags.split(','); node.style.padding = '.5rem 0'; for (let j = likes.length - 1; j >= 0; j -= 1) { if (dataTags.includes(likes[j].tag)) { if (!element[i].classList.contains('border-gradient')) { element[i].classList.add('border-gradient'); } const node1 = document.createElement('SPAN'); colors.push(likes[j].color); node1.classList.add('customTags'); node1.style.borderLeft = `${likes[j].color} solid`; node1.appendChild(document.createTextNode(likes[j].name)); node.appendChild(node1); element[i].setAttribute('isDisplay', 'true'); } else if (element[i].getAttribute('isDisplay') === null) { element[i].setAttribute('isDisplay', 'false'); } } if (colors.length > 1) { element[i].style.borderImageSource = `linear-gradient(to bottom right, ${colors.toString()})`; } else { element[i].style.color = colors[0]; } if (element[i].getAttribute('isDisplay') === 'true') { try { element[i].querySelector('div.resource-tile_info').appendChild(node); } catch (e) { console.error(e); setTimeout(likeFilter, 200); } } } } function likeLimit() { const element = document.querySelectorAll('.resource-tile_info'); // if (likesLimit === '') { // likesLimit = -1; // } for (let i = 0; i < element.length; i++) { const elementLikes = element[i].querySelector('div.resource-tile_info-meta_likes').innerText; // const elementName = // element[i].childNodes[0].childNodes[0].childNodes[0].innerText; const checkFilter = Number(elementLikes) <= Number(GM_getValue('like_limit', 200)); // console.debug(`we get Like limit of ${elementName} is ${elementLikes} with check ${checkFilter} with display attribute of ${(element[i].parentNode.parentNode.parentNode.getAttribute('isDisplay').toLowerCase() !== 'false')}`); if (checkFilter) { if (element[i].parentNode.parentNode.parentNode.getAttribute('isDisplay') === 'false') { element[i].parentNode.parentNode.parentNode.setAttribute('isLikeLimit', 'true'); continue; } if (GM_getValue('favLikeFilter', false)) { element[i].parentNode.parentNode.parentNode.setAttribute('isLikeLimit', 'true'); continue; } } element[i].parentNode.parentNode.parentNode.setAttribute('isLikeLimit', 'false'); } } function tagRemoveHandler(event, isLikes) { let filtered = []; if (isLikes) { filtered = likes.filter(r => r.name !== event.target.textContent); console.debug(`You have clicked the Like Tag to Remove it and the filtered is: ${filtered} within ${likes}`); const removed = lodash.remove(likes, n => { return n.name === event.target.textContent; }); console.debug(`after filtred you got likes tags: ${likes} and you removed ${removed}`); likeFilter(); likeLimit(); } else { filtered = dislikes.filter(r => r.name !== event.target.textContent); console.debug(`You have clicked the dislike Tag to Remove it and the filtered is: ${filtered} within ${dislikes}`); const removed = lodash.remove(dislikes, n => { return n.name === event.target.textContent; }); console.debug(`after filtred you got dislike tags: ${dislikes} and you removed ${removed}`); dislikeFilter(); } // event.target.remove(); GM_setValue(isLikes ? 'likes' : 'dislikes', filtered); filterOut(); } // function tagRemoveHandler1(event) { // likes = likes.filter(r => r[0] !== event.target.textContent); // event.target.remove(); // GM_setValue('likes', likes); // likeFilter(); // likeLimit(); // filterOut(); // } function clickTotalTags() { const y = document.querySelector('.selectize-control'); if (y !== null) { y.addEventListener('click', () => { const x = document.querySelectorAll('div.option'); console.log('clicked', x); if (x.length !== 0) { const totalTags = []; x.forEach(e => totalTags.push(e.innerHTML)); GM_setValue('tags', totalTags); } }); } } function IgnoreFilter() { const element = document.querySelectorAll('.resource-tile'); const isChecked = GM_getValue('ignoreThreadFilter', false); console.log(isChecked, typeof isChecked); for (let i = 0; i < element.length; i++) { const classNames = element[i].className; const isFP = classNames.includes('resource-tile_ignored'); if (isFP && isChecked) { element[i].setAttribute('isIgnore', 'true'); } else { element[i].setAttribute('isIgnore', 'false'); } } } function init() { const element = document.querySelectorAll('.resource-tile'); const elementLength = element.length; if (element[0]) { likeFilter(); clickTotalTags(); for (let i = 0; i < 3; i++) { IgnoreFilter(); dislikeFilter(); likeLimit(); filterOut(); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore const filtered = _.filter(document.querySelectorAll('.resource-tile'), e => { return e.getAttribute('isDisplay') === 'true'; }); console.debug('Filtered', filtered); if (filtered.length < elementLength) { break; } } } else { setTimeout(init, 100); } } const _tmpl$$6 = /*#__PURE__*/web.template(`<div class=filter-block><h4 class=filter-block_title>Tags Like Limits</h4><div class=selectize-input><input autocomplete=off style=width:127px;>`); function LikeLimitDisplay() { const onLimit = event => { GM_setValue('like_limit', event.target.value); likeLimit(); filterOut(); }; return (() => { const _el$ = _tmpl$$6(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild; _el$4.addEventListener("change", onLimit); web.effect(() => _el$4.value = GM_getValue('like_limit', 200)); return _el$; })(); } const _tmpl$$5 = /*#__PURE__*/web.template(`<div class=filter-block><div class=filter-block_button-wrap><span class="filter-block_title flxgrow">Filter Fav likes:</span><input type=checkbox id=filter-fav-likes>`); function FilterFavLikes() { const onChange = event => { GM_setValue('favLikeFilter', event.target.checked); likeLimit(); filterOut(); }; return (() => { const _el$ = _tmpl$$5(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling; _el$2.style.setProperty("display", "flex"); _el$4.addEventListener("change", onChange); web.effect(() => _el$4.checked = GM_getValue('favLikeFilter', false)); return _el$; })(); } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } const createSelect = props => { const config = solidJs.mergeProps({ multiple: false, disabled: false, optionToValue: option => option, isOptionDisabled: option => false }, props); const parseValue = value => { if (config.multiple && Array.isArray(value)) { return value; } else if (!config.multiple && !Array.isArray(value)) { return value !== null ? [value] : []; } else { throw new Error(`Incompatible value type for ${config.multiple ? "multple" : "single"} select.`); } }; const [_value, _setValue] = solidJs.createSignal(config.initialValue !== undefined ? parseValue(config.initialValue) : []); const value = () => config.multiple ? _value() : _value()[0] || null; const setValue = value => _setValue(parseValue(value)); const clearValue = () => _setValue([]); const hasValue = () => !!(config.multiple ? value().length : value()); solidJs.createEffect(solidJs.on(_value, () => config.onChange?.(value()), { defer: true })); const [inputValue, setInputValue] = solidJs.createSignal(""); const clearInputValue = () => setInputValue(""); const hasInputValue = () => !!inputValue().length; solidJs.createEffect(solidJs.on(inputValue, inputValue => config.onInput?.(inputValue), { defer: true })); solidJs.createEffect(solidJs.on(inputValue, inputValue => { if (inputValue && !isOpen()) { setIsOpen(true); } }, { defer: true })); const options = typeof config.options === "function" ? solidJs.createMemo(() => config.options(inputValue()), config.options(inputValue())) : () => config.options; const optionsCount = () => options().length; const pickOption = option => { if (config.isOptionDisabled(option)) return; const value = config.optionToValue(option); if (config.multiple) { setValue([..._value(), value]); } else { setValue(value); setIsActive(false); } setIsOpen(false); }; const [isActive, setIsActive] = solidJs.createSignal(false); const [isOpen, setIsOpen] = solidJs.createSignal(false); const toggleOpen = () => setIsOpen(!isOpen()); const [focusedOptionIndex, setFocusedOptionIndex] = solidJs.createSignal(-1); const focusedOption = () => options()[focusedOptionIndex()]; const isOptionFocused = option => option === focusedOption(); const focusOption = direction => { if (!optionsCount()) setFocusedOptionIndex(-1); const max = optionsCount() - 1; const delta = direction === "next" ? 1 : -1; let index = focusedOptionIndex() + delta; if (index > max) { index = 0; } if (index < 0) { index = max; } setFocusedOptionIndex(index); }; const focusPreviousOption = () => focusOption("previous"); const focusNextOption = () => focusOption("next"); solidJs.createEffect(solidJs.on(options, options => { if (isOpen()) setFocusedOptionIndex(Math.min(0, options.length - 1)); }, { defer: true })); solidJs.createEffect(solidJs.on(() => config.disabled, isDisabled => { if (isDisabled && isOpen()) { setIsOpen(false); } })); solidJs.createEffect(solidJs.on(isOpen, isOpen => { if (isOpen) { if (focusedOptionIndex() === -1) focusNextOption(); setIsActive(true); } else { if (focusedOptionIndex() > -1) setFocusedOptionIndex(-1); setInputValue(""); } }, { defer: true })); solidJs.createEffect(solidJs.on(focusedOptionIndex, focusedOptionIndex => { if (focusedOptionIndex > -1 && !isOpen()) { setIsOpen(true); } }, { defer: true })); const onFocusIn = () => setIsActive(true); const onFocusOut = () => { setIsActive(false); setIsOpen(false); }; const onMouseDown = event => event.preventDefault(); const onClick = event => { if (!config.disabled && !hasInputValue()) toggleOpen(); }; const onInput = event => { setInputValue(event.target.value); }; const onKeyDown = event => { switch (event.key) { case "ArrowDown": focusNextOption(); break; case "ArrowUp": focusPreviousOption(); break; case "Enter": if (isOpen() && focusedOption()) { pickOption(focusedOption()); break; } return; case "Escape": if (isOpen()) { setIsOpen(false); break; } return; case "Delete": case "Backspace": if (inputValue()) { return; } if (config.multiple) { const currentValue = value(); setValue([...currentValue.slice(0, -1)]); } else { clearValue(); } break; case " ": if (inputValue()) { return; } if (!isOpen()) { setIsOpen(true); } else { if (focusedOption()) { pickOption(focusedOption()); } } break; case "Tab": if (focusedOption() && isOpen()) { pickOption(focusedOption()); break; } return; default: return; } event.preventDefault(); event.stopPropagation(); }; return { options, value, setValue, hasValue, clearValue, inputValue, setInputValue, hasInputValue, clearInputValue, isOpen, setIsOpen, toggleOpen, isActive, setIsActive, get multiple() { return config.multiple; }, get disabled() { return config.disabled; }, pickOption, isOptionFocused, isOptionDisabled: config.isOptionDisabled, onFocusIn, onFocusOut, onMouseDown, onClick, onInput, onKeyDown }; }; const _tmpl$$2$1 = /*#__PURE__*/web.template(`<mark></mark>`, 2); const SCORING = { NO_MATCH: 0, MATCH: 1, WORD_START: 2, START: 3 }; const fuzzySearch = (value, target) => { let score = SCORING.NO_MATCH; let matches = []; if (value.length <= target.length) { const valueChars = Array.from(value.toLocaleLowerCase()); const targetChars = Array.from(target.toLocaleLowerCase()); let delta = SCORING.START; outer: for (let valueIndex = 0, targetIndex = 0; valueIndex < valueChars.length; valueIndex++) { while (targetIndex < targetChars.length) { if (targetChars[targetIndex] === valueChars[valueIndex]) { matches[targetIndex] = true; if (delta === SCORING.MATCH && targetChars[targetIndex - 1] === " " && targetChars[targetIndex] !== " ") { delta = SCORING.WORD_START; } score += delta; delta++; targetIndex++; continue outer; } else { delta = SCORING.MATCH; targetIndex++; } } // Didn't exhaust search value. score = SCORING.NO_MATCH; matches.length = 0; } } return { target, score, matches }; }; const fuzzyHighlight = (searchResult, highlighter = match => (() => { const _el$ = _tmpl$$2$1.cloneNode(true); web.insert(_el$, match); return _el$; })()) => { const target = searchResult.target; const matches = searchResult.matches; const separator = "\x00"; const highlighted = []; let open = false; for (let index = 0; index < target.length; index++) { const char = target[index]; const matched = matches[index]; if (!open && matched) { highlighted.push(separator); open = true; } else if (open && !matched) { highlighted.push(separator); open = false; } highlighted.push(char); } if (open) { highlighted.push(separator); open = false; } return web.memo(() => highlighted.join("").split(separator).map((part, index) => index % 2 ? highlighter(part) : part)); }; const fuzzySort = (value, items, key) => { const sorted = []; for (let index = 0; index < items.length; index++) { const item = items[index]; const target = key ? item[key] : item; const result = fuzzySearch(value, target); if (result.score) { sorted.push({ ...result, item, index }); } } sorted.sort((a, b) => { let delta = b.score - a.score; if (delta === 0) { delta = a.index - b.index; } return delta; }); return sorted; }; const _tmpl$$1$1 = /*#__PURE__*/web.template(`<mark></mark>`, 2); const createOptions = (values, userConfig) => { const config = Object.assign({ filterable: true, disable: () => false }, userConfig || {}); const getLabel = value => config?.key !== undefined ? value[config.key] : value; const options = inputValue => { const initialValues = typeof values === "function" ? values(inputValue) : values; let createdOptions = initialValues.map(value => { return { label: getLabel(value), value: value, disabled: config.disable(value) }; }); if (config.filterable && inputValue) { createdOptions = fuzzySort(inputValue, createdOptions, "label").map(result => ({ ...result.item, label: fuzzyHighlight(result) })); } if (config.createable !== undefined) { const trimmedValue = inputValue.trim(); const exists = createdOptions.some(option => areEqualIgnoringCase(inputValue, getLabel(option.value))); if (trimmedValue && !exists) { let value; if (typeof config.createable === "function") { value = config.createable(trimmedValue); } else { value = config.key ? { [config.key]: trimmedValue } : trimmedValue; } const option = { label: ["Create ", (() => { const _el$ = _tmpl$$1$1.cloneNode(true); web.insert(_el$, () => getLabel(value)); return _el$; })()], value, disabled: false }; createdOptions = [...createdOptions, option]; } } return createdOptions; }; const optionToValue = option => option.value; const format = (item, type) => type === "option" ? item.label : getLabel(item); const isOptionDisabled = option => option.disabled; return { options, optionToValue, isOptionDisabled, format }; }; const areEqualIgnoringCase = (firstString, secondString) => firstString.localeCompare(secondString, undefined, { sensitivity: "base" }) === 0; const _tmpl$$4 = /*#__PURE__*/web.template(`<div></div>`, 2), _tmpl$2$2 = /*#__PURE__*/web.template(`<div class="solid-select-control"></div>`, 2), _tmpl$3$1 = /*#__PURE__*/web.template(`<div class="solid-select-placeholder"></div>`, 2), _tmpl$4 = /*#__PURE__*/web.template(`<div class="solid-select-single-value"></div>`, 2), _tmpl$5 = /*#__PURE__*/web.template(`<div class="solid-select-multi-value"><button type="button" class="solid-select-multi-value-remove">⨯</button></div>`, 4), _tmpl$6 = /*#__PURE__*/web.template(`<input class="solid-select-input" type="text" tabindex="0" autocomplete="off" autocapitalize="none" size="1">`, 1), _tmpl$7 = /*#__PURE__*/web.template(`<div class="solid-select-list"></div>`, 2), _tmpl$8 = /*#__PURE__*/web.template(`<div class="solid-select-list-placeholder"></div>`, 2), _tmpl$9 = /*#__PURE__*/web.template(`<div class="solid-select-option"></div>`, 2); const SelectContext = solidJs.createContext(); const useSelect = () => { const context = solidJs.useContext(SelectContext); if (!context) throw new Error("No SelectContext found in ancestry."); return context; }; const Select = props => { const [selectProps, local] = solidJs.splitProps(solidJs.mergeProps({ format: (data, type) => data, placeholder: "Select...", readonly: typeof props.options !== "function", loading: false, loadingPlaceholder: "Loading...", emptyPlaceholder: "No options" }, props), ["options", "optionToValue", "isOptionDisabled", "multiple", "disabled", "onInput", "onChange"]); const select = createSelect(selectProps); solidJs.createEffect(solidJs.on(() => local.initialValue, value => value !== undefined && select.setValue(value))); return web.createComponent(SelectContext.Provider, { value: select, get children() { return web.createComponent(Container, { get ["class"]() { return local.class; }, get children() { return [web.createComponent(Control, { get id() { return local.id; }, get name() { return local.name; }, get format() { return local.format; }, get placeholder() { return local.placeholder; }, get autofocus() { return local.autofocus; }, get readonly() { return local.readonly; } }), web.createComponent(List, { get loading() { return local.loading; }, get loadingPlaceholder() { return local.loadingPlaceholder; }, get emptyPlaceholder() { return local.emptyPlaceholder; }, get format() { return local.format; } })]; } }); } }); }; const Container = props => { const select = useSelect(); return (() => { const _el$ = _tmpl$$4.cloneNode(true); _el$.$$mousedown = event => { select.onMouseDown(event); event.currentTarget.getElementsByTagName("input")[0].focus(); }; web.addEventListener(_el$, "focusout", select.onFocusOut, true); web.addEventListener(_el$, "focusin", select.onFocusIn, true); web.insert(_el$, () => props.children); web.effect(_p$ => { const _v$ = `solid-select-container ${props.class !== undefined ? props.class : ""}`, _v$2 = select.disabled; _v$ !== _p$._v$ && web.className(_el$, _p$._v$ = _v$); _v$2 !== _p$._v$2 && web.setAttribute(_el$, "data-disabled", _p$._v$2 = _v$2); return _p$; }, { _v$: undefined, _v$2: undefined }); return _el$; })(); }; const Control = props => { const select = useSelect(); const removeValue = index => { const value = select.value(); select.setValue([...value.slice(0, index), ...value.slice(index + 1)]); }; return (() => { const _el$2 = _tmpl$2$2.cloneNode(true); web.addEventListener(_el$2, "click", select.onClick, true); web.insert(_el$2, web.createComponent(solidJs.Show, { get when() { return web.memo(() => !!!select.hasValue(), true)() && !select.hasInputValue(); }, get children() { return web.createComponent(Placeholder, { get children() { return props.placeholder; } }); } }), null); web.insert(_el$2, web.createComponent(solidJs.Show, { get when() { return web.memo(() => !!(select.hasValue() && !select.multiple), true)() && !select.hasInputValue(); }, get children() { return web.createComponent(SingleValue, { get children() { return props.format(select.value(), "value"); } }); } }), null); web.insert(_el$2, web.createComponent(solidJs.Show, { get when() { return select.hasValue() && select.multiple; }, get children() { return web.createComponent(solidJs.For, { get each() { return select.value(); }, children: (value, index) => web.createComponent(MultiValue, { onRemove: () => removeValue(index()), get children() { return props.format(value, "value"); } }) }); } }), null); web.insert(_el$2, web.createComponent(Input, { get id() { return props.id; }, get name() { return props.name; }, get autofocus() { return props.autofocus; }, get readonly() { return props.readonly; } }), null); web.effect(_p$ => { const _v$3 = select.multiple, _v$4 = select.hasValue(), _v$5 = select.disabled; _v$3 !== _p$._v$3 && web.setAttribute(_el$2, "data-multiple", _p$._v$3 = _v$3); _v$4 !== _p$._v$4 && web.setAttribute(_el$2, "data-has-value", _p$._v$4 = _v$4); _v$5 !== _p$._v$5 && web.setAttribute(_el$2, "data-disabled", _p$._v$5 = _v$5); return _p$; }, { _v$3: undefined, _v$4: undefined, _v$5: undefined }); return _el$2; })(); }; const Placeholder = props => { return (() => { const _el$3 = _tmpl$3$1.cloneNode(true); web.insert(_el$3, () => props.children); return _el$3; })(); }; const SingleValue = props => { return (() => { const _el$4 = _tmpl$4.cloneNode(true); web.insert(_el$4, () => props.children); return _el$4; })(); }; const MultiValue = props => { useSelect(); return (() => { const _el$5 = _tmpl$5.cloneNode(true), _el$6 = _el$5.firstChild; web.insert(_el$5, () => props.children, _el$6); _el$6.$$click = event => { event.stopPropagation(); props.onRemove(); }; return _el$5; })(); }; const Input = props => { const select = useSelect(); return (() => { const _el$7 = _tmpl$6.cloneNode(true); _el$7.$$mousedown = event => { event.stopPropagation(); }; _el$7.$$keydown = event => { select.onKeyDown(event); if (!event.defaultPrevented) { if (event.key === "Escape") { event.preventDefault(); event.stopPropagation(); event.target.blur(); } } }; web.addEventListener(_el$7, "input", select.onInput, true); web.effect(_p$ => { const _v$6 = props.id, _v$7 = props.name, _v$8 = select.multiple, _v$9 = select.isActive(), _v$10 = props.autofocus, _v$11 = props.readonly, _v$12 = select.disabled; _v$6 !== _p$._v$6 && web.setAttribute(_el$7, "id", _p$._v$6 = _v$6); _v$7 !== _p$._v$7 && web.setAttribute(_el$7, "name", _p$._v$7 = _v$7); _v$8 !== _p$._v$8 && web.setAttribute(_el$7, "data-multiple", _p$._v$8 = _v$8); _v$9 !== _p$._v$9 && web.setAttribute(_el$7, "data-is-active", _p$._v$9 = _v$9); _v$10 !== _p$._v$10 && (_el$7.autofocus = _p$._v$10 = _v$10); _v$11 !== _p$._v$11 && (_el$7.readOnly = _p$._v$11 = _v$11); _v$12 !== _p$._v$12 && (_el$7.disabled = _p$._v$12 = _v$12); return _p$; }, { _v$6: undefined, _v$7: undefined, _v$8: undefined, _v$9: undefined, _v$10: undefined, _v$11: undefined, _v$12: undefined }); web.effect(() => _el$7.value = select.inputValue()); return _el$7; })(); }; const List = props => { const select = useSelect(); return web.createComponent(solidJs.Show, { get when() { return select.isOpen(); }, get children() { const _el$8 = _tmpl$7.cloneNode(true); web.insert(_el$8, web.createComponent(solidJs.Show, { get when() { return !props.loading; }, get fallback() { return (() => { const _el$9 = _tmpl$8.cloneNode(true); web.insert(_el$9, () => props.loadingPlaceholder); return _el$9; })(); }, get children() { return web.createComponent(solidJs.For, { get each() { return select.options(); }, get fallback() { return (() => { const _el$10 = _tmpl$8.cloneNode(true); web.insert(_el$10, () => props.emptyPlaceholder); return _el$10; })(); }, children: option => web.createComponent(Option, { option: option, get children() { return props.format(option, "option"); } }) }); } })); return _el$8; } }); }; const Option = props => { const select = useSelect(); const scrollIntoViewOnFocus = element => { solidJs.createEffect(() => { if (select.isOptionFocused(props.option)) { element.scrollIntoView({ block: "nearest" }); } }); }; return (() => { const _el$11 = _tmpl$9.cloneNode(true); _el$11.$$click = () => select.pickOption(props.option); scrollIntoViewOnFocus(_el$11); web.insert(_el$11, () => props.children); web.effect(_p$ => { const _v$13 = select.isOptionDisabled(props.option), _v$14 = select.isOptionFocused(props.option); _v$13 !== _p$._v$13 && web.setAttribute(_el$11, "data-disabled", _p$._v$13 = _v$13); _v$14 !== _p$._v$14 && web.setAttribute(_el$11, "data-focused", _p$._v$14 = _v$14); return _p$; }, { _v$13: undefined, _v$14: undefined }); return _el$11; })(); }; web.delegateEvents(["focusin", "focusout", "mousedown", "click", "input", "keydown"]); const $RAW = Symbol("store-raw"), $NODE = Symbol("store-node"), $HAS = Symbol("store-has"), $SELF = Symbol("store-self"); function wrap$1(value) { let p = value[solidJs.$PROXY]; if (!p) { Object.defineProperty(value, solidJs.$PROXY, { value: p = new Proxy(value, proxyTraps$1) }); if (!Array.isArray(value)) { const keys = Object.keys(value), desc = Object.getOwnPropertyDescriptors(value); for (let i = 0, l = keys.length; i < l; i++) { const prop = keys[i]; if (desc[prop].get) { Object.defineProperty(value, prop, { enumerable: desc[prop].enumerable, get: desc[prop].get.bind(p) }); } } } } return p; } function isWrappable(obj) { let proto; return obj != null && typeof obj === "object" && (obj[solidJs.$PROXY] || !(proto = Object.getPrototypeOf(obj)) || proto === Object.prototype || Array.isArray(obj)); } function unwrap(item, set = new Set()) { let result, unwrapped, v, prop; if (result = item != null && item[$RAW]) return result; if (!isWrappable(item) || set.has(item)) return item; if (Array.isArray(item)) { if (Object.isFrozen(item)) item = item.slice(0);else set.add(item); for (let i = 0, l = item.length; i < l; i++) { v = item[i]; if ((unwrapped = unwrap(v, set)) !== v) item[i] = unwrapped; } } else { if (Object.isFrozen(item)) item = Object.assign({}, item);else set.add(item); const keys = Object.keys(item), desc = Object.getOwnPropertyDescriptors(item); for (let i = 0, l = keys.length; i < l; i++) { prop = keys[i]; if (desc[prop].get) continue; v = item[prop]; if ((unwrapped = unwrap(v, set)) !== v) item[prop] = unwrapped; } } return item; } function getNodes(target, symbol) { let nodes = target[symbol]; if (!nodes) Object.defineProperty(target, symbol, { value: nodes = Object.create(null) }); return nodes; } function getNode(nodes, property, value) { if (nodes[property]) return nodes[property]; const [s, set] = solidJs.createSignal(value, { equals: false, internal: true }); s.$ = set; return nodes[property] = s; } function proxyDescriptor$1(target, property) { const desc = Reflect.getOwnPropertyDescriptor(target, property); if (!desc || desc.get || !desc.configurable || property === solidJs.$PROXY || property === $NODE) return desc; delete desc.value; delete desc.writable; desc.get = () => target[solidJs.$PROXY][property]; return desc; } function trackSelf(target) { solidJs.getListener() && getNode(getNodes(target, $NODE), $SELF)(); } function ownKeys(target) { trackSelf(target); return Reflect.ownKeys(target); } const proxyTraps$1 = { get(target, property, receiver) { if (property === $RAW) return target; if (property === solidJs.$PROXY) return receiver; if (property === solidJs.$TRACK) { trackSelf(target); return receiver; } const nodes = getNodes(target, $NODE); const tracked = nodes[property]; let value = tracked ? tracked() : target[property]; if (property === $NODE || property === $HAS || property === "__proto__") return value; if (!tracked) { const desc = Object.getOwnPropertyDescriptor(target, property); if (solidJs.getListener() && (typeof value !== "function" || target.hasOwnProperty(property)) && !(desc && desc.get)) value = getNode(nodes, property, value)(); } return isWrappable(value) ? wrap$1(value) : value; }, has(target, property) { if (property === $RAW || property === solidJs.$PROXY || property === solidJs.$TRACK || property === $NODE || property === $HAS || property === "__proto__") return true; solidJs.getListener() && getNode(getNodes(target, $HAS), property)(); return property in target; }, set() { return true; }, deleteProperty() { return true; }, ownKeys: ownKeys, getOwnPropertyDescriptor: proxyDescriptor$1 }; function setProperty(state, property, value, deleting = false) { if (!deleting && state[property] === value) return; const prev = state[property], len = state.length; if (value === undefined) { delete state[property]; if (state[$HAS] && state[$HAS][property] && prev !== undefined) state[$HAS][property].$(); } else { state[property] = value; if (state[$HAS] && state[$HAS][property] && prev === undefined) state[$HAS][property].$(); } let nodes = getNodes(state, $NODE), node; if (node = getNode(nodes, property, prev)) node.$(() => value); if (Array.isArray(state) && state.length !== len) { for (let i = state.length; i < len; i++) (node = nodes[i]) && node.$(); (node = getNode(nodes, "length", len)) && node.$(state.length); } (node = nodes[$SELF]) && node.$(); } function mergeStoreNode(state, value) { const keys = Object.keys(value); for (let i = 0; i < keys.length; i += 1) { const key = keys[i]; setProperty(state, key, value[key]); } } function updateArray(current, next) { if (typeof next === "function") next = next(current); next = unwrap(next); if (Array.isArray(next)) { if (current === next) return; let i = 0, len = next.length; for (; i < len; i++) { const value = next[i]; if (current[i] !== value) setProperty(current, i, value); } setProperty(current, "length", len); } else mergeStoreNode(current, next); } function updatePath(current, path, traversed = []) { let part, prev = current; if (path.length > 1) { part = path.shift(); const partType = typeof part, isArray = Array.isArray(current); if (Array.isArray(part)) { for (let i = 0; i < part.length; i++) { updatePath(current, [part[i]].concat(path), traversed); } return; } else if (isArray && partType === "function") { for (let i = 0; i < current.length; i++) { if (part(current[i], i)) updatePath(current, [i].concat(path), traversed); } return; } else if (isArray && partType === "object") { const { from = 0, to = current.length - 1, by = 1 } = part; for (let i = from; i <= to; i += by) { updatePath(current, [i].concat(path), traversed); } return; } else if (path.length > 1) { updatePath(current[part], path, [part].concat(traversed)); return; } prev = current[part]; traversed = [part].concat(traversed); } let value = path[0]; if (typeof value === "function") { value = value(prev, traversed); if (value === prev) return; } if (part === undefined && value == undefined) return; value = unwrap(value); if (part === undefined || isWrappable(prev) && isWrappable(value) && !Array.isArray(value)) { mergeStoreNode(prev, value); } else setProperty(current, part, value); } function createStore(...[store, options]) { const unwrappedStore = unwrap(store || {}); const isArray = Array.isArray(unwrappedStore); const wrappedStore = wrap$1(unwrappedStore); function setStore(...args) { solidJs.batch(() => { isArray && args.length === 1 ? updateArray(unwrappedStore, args[0]) : updatePath(unwrappedStore, args); }); } return [wrappedStore, setStore]; } const [store, setStore] = createStore({ dislikes, likes }); const getDislikes = solidJs.createMemo(() => store.dislikes); const addDislike = dislike => { const dislikes = [...store.dislikes, dislike]; setDislikes(dislikes); }; const setDislikes = dislikes => { setStore('dislikes', dislikes); GM_setValue('dislikes', dislikes); }; const removeDislike = dislike => { const dislikes = store.dislikes.filter(t => t.tag !== dislike.tag); setDislikes(dislikes); }; const getLikes = solidJs.createMemo(() => store.likes); const setLikes = likes => { setStore('likes', likes); GM_setValue('likes', likes); }; const addLike = like => { const likes = [...store.likes, like]; setLikes(likes); }; const removeLike = like => { const likes = store.likes.filter(l => l.tag !== like.tag); setLikes(likes); }; const _tmpl$$3 = /*#__PURE__*/web.template(`<div class=filter-block><h4 class="filter-block_title accordion-toggle">Like Tags</h4><div class="filter-block_content accordion-content"><datalist id=totalTagName></datalist><div class=selected-tags-wrap>`), _tmpl$2$1 = /*#__PURE__*/web.template(`<option>`), _tmpl$3 = /*#__PURE__*/web.template(`<span>`); function LikesTagFilter() { const [initialValue, setInitialValue] = solidJs.createSignal(null, { equals: false }); const selectProps = createOptions(totalTags.map(t => ({ name: t[0], tag: t[1] })), { key: 'name', filterable: true }); const onLikeChange = data => { if (!data) { return; } const isExist = getLikes().some(l => l.tag === data.tag); if (isExist) { alert('Tag already exist in Likes!'); return; } let x; do { x = prompt("Please Enter the Color in Hex like '#FFFFFF' for " + data.name); } while (!x.includes('#') && x === '' && x.length <= 1); console.debug(`you have entered color in hex: ${x} with tagName: ${JSON.stringify(data)} and the condition ${!!x}`); setInitialValue(null); if (x) { const tag = _extends({}, data, { color: x }); console.debug(`the likes after pushing the ${tag} is ${likes}`); addLike(tag); likeFilter(); likeLimit(); filterOut(); } }; return (() => { const _el$ = _tmpl$$3(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling; web.insert(_el$3, web.createComponent(Select, web.mergeProps(selectProps, { "class": 'select-likes', get initialValue() { return initialValue(); }, onChange: onLikeChange, placeholder: 'Select Likes...' })), _el$4); web.insert(_el$4, () => totalTags.map(item => { return (() => { const _el$6 = _tmpl$2$1(); web.insert(_el$6, () => item[0]); web.effect(() => _el$6.value = item[1]); return _el$6; })(); })); web.insert(_el$5, web.createComponent(solidJs.For, { get each() { return getLikes(); }, children: item => (() => { const _el$7 = _tmpl$3(); _el$7.$$click = e => { removeLike(item); tagRemoveHandler(e, true); }; web.insert(_el$7, () => item.name); web.effect(() => `${item.color} solid` != null ? _el$7.style.setProperty("border-left", `${item.color} solid`) : _el$7.style.removeProperty("border-left")); return _el$7; })() })); return _el$; })(); } web.delegateEvents(["click"]); const _tmpl$$2 = /*#__PURE__*/web.template(`<div class=filter-block><h4 class="filter-block_title accordion-toggle">Dislike Tags</h4><div class="filter-block_content accordion-content"><div class=selected-tags-wrap>`), _tmpl$2 = /*#__PURE__*/web.template(`<span>`); function DislikeTagFilter() { const [initialValue, setInitialValue] = solidJs.createSignal(null, { equals: false }); const selectProps = createOptions(totalTags.map(t => ({ name: t[0], tag: t[1] })), { key: 'name', filterable: true }); const onDislike = value => { setInitialValue(null); if (!value) { return; } const isExist = getDislikes().some(d => d.tag === value.tag); if (isExist) { alert('Tag already exist in Dislikes!'); return; } addDislike(value); dislikeFilter(); filterOut(); }; return (() => { const _el$ = _tmpl$$2(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild; _el$.style.setProperty("border-bottom", "1px solid #3f4043"); web.insert(_el$3, web.createComponent(Select, web.mergeProps(selectProps, { get initialValue() { return initialValue(); }, onChange: onDislike, placeholder: 'Select Dislikes...' })), _el$4); web.insert(_el$4, web.createComponent(solidJs.For, { get each() { return getDislikes(); }, children: dislike => (() => { const _el$5 = _tmpl$2(); _el$5.$$click = e => { removeDislike(dislike); tagRemoveHandler(e, false); }; web.insert(_el$5, () => dislike.name); return _el$5; })() })); return _el$; })(); } web.delegateEvents(["click"]); const _tmpl$$1 = /*#__PURE__*/web.template(`<div class=filter-block><div class=filter-block_button-wrap><span class="filter-block_title flxgrow">Filter Ignore Thread:</span><input type=checkbox id=filter-ignore-thread>`); function FilterIgnore() { const onChange = event => { GM_setValue('ignoreThreadFilter', event.target.checked); IgnoreFilter(); filterOut(); }; return (() => { const _el$ = _tmpl$$1(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling; _el$2.style.setProperty("display", "flex"); _el$4.addEventListener("change", onChange); web.effect(() => _el$4.checked = GM_getValue('ignoreThreadFilter', false)); return _el$; })(); } const _tmpl$ = /*#__PURE__*/web.template(`<style>`); function mainFilter() { solidJs.createEffect(() => { init(); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore window.history.onpushstate = function () { setTimeout(init, 200); }; (function (history) { const pushState = history.pushState; history.pushState = function (state) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore if (typeof history.onpushstate === 'function') { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore history.onpushstate({ state }); } return pushState.apply(history); }; })(window.history); }, [window.history]); return [web.createComponent(LikesTagFilter, {}), web.createComponent(DislikeTagFilter, {}), web.createComponent(LikeLimitDisplay, {}), web.createComponent(FilterFavLikes, {}), web.createComponent(FilterIgnore, {}), (() => { const _el$ = _tmpl$(); web.insert(_el$, SelectCss); return _el$; })(), (() => { const _el$2 = _tmpl$(); web.insert(_el$2, css_248z$1); return _el$2; })()]; } web.render(mainFilter, document.querySelector('.content-block_filter')); // render(LikesTagFilter, document.querySelector('#filter-block_prefixes')); // render(DislikeTagFilter, document.querySelector('#filter-block_prefixes')); })(VM.solid.web, _, VM.solid);