chore(web): reset web dir

This commit is contained in:
Collin Barrett 2025-06-10 18:45:45 -05:00
parent b663b61e86
commit bf30d5a316
128 changed files with 0 additions and 2828 deletions

25
web/.gitignore vendored
View file

@ -1,25 +0,0 @@
# https://raw.githubusercontent.com/facebook/create-react-app/master/packages/cra-template/template/gitignore
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*

View file

@ -1,3 +0,0 @@
{
"endOfLine": "auto"
}

View file

@ -1,30 +0,0 @@
const { getThemeVariables } = require("antd/dist/theme");
const {
override,
fixBabelImports,
addLessLoader,
adjustStyleLoaders,
} = require("customize-cra");
module.exports = override(
fixBabelImports("import", {
libraryName: "antd",
libraryDirectory: "es",
style: true,
}),
addLessLoader({
lessOptions: {
javascriptEnabled: true,
modifyVars: {
...getThemeVariables({
dark: true,
compact: true,
}),
},
},
}),
adjustStyleLoaders(({ use: [, , postcss] }) => {
const postcssOptions = postcss.options;
postcss.options = { postcssOptions };
}),
);

BIN
web/package-lock.json generated

Binary file not shown.

View file

@ -1,59 +0,0 @@
{
"name": "filterlists.web",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^6.6.4",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.1",
"@types/jest": "^30.0.0",
"@types/node": "^24.1.0",
"@types/react": "^19.1.9",
"@types/react-dom": "^19.1.7",
"@types/react-router-dom": "^5.3.3",
"antd": "^4.24.16",
"babel-plugin-import": "^1.13.8",
"customize-cra": "^1.0.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.3",
"http-proxy-middleware": "^3.0.5",
"less": "^4.4.0",
"less-loader": "^12.3.0",
"prettier": "^3.3.2",
"react": "^19.1.1",
"react-app-rewired": "^2.1.11",
"react-dom": "^19.1.1",
"react-router-dom": "^5.3.4",
"react-scripts": "^5.0.0",
"slugify": "^1.6.6",
"typescript": "^4.6.4",
"web-vitals": "^3.5.2"
},
"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-scripts eject",
"prettier:check": "prettier --check 'src/**/*.{js,jsx,ts,tsx}'",
"eslint:check": "eslint 'src/**/*.{js,jsx,ts,tsx}'"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest",
"plugin:prettier/recommended"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -1,69 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<link rel="preload" as="image" href="/logo_filterlists.png" />
<!-- For IE <= 9 -->
<!--[if IE]>
<script type="text/javascript">
window.location = "https://filterlists.com/tpl.html";
</script>
<![endif]-->
<!-- For IE > 9 -->
<script src="/tpl-redirect.js" defer></script>
<link rel="shortcut icon" href="%PUBLIC_URL%/icon_filterlists.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="FilterLists is the independent, comprehensive directory of filter and host lists for advertisements, trackers, malware, and annoyances. By Collin M. Barrett."
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/icon_filterlists.png" />
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>
FilterLists | Subscriptions for uBlock Origin, Adblock Plus, AdGuard, ...
</title>
<link rel="canonical" href="https://filterlists.com/" />
</head>
<body>
<noscript>
<p>
FilterLists is built with JavaScript which does not seem to be supported
by or enabled in your browser.
</p>
<p>
<a href="https://github.com/collinbarrett/FilterLists"
>FilterLists on GitHub</a
>
</p>
</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -1,20 +0,0 @@
{
"short_name": "FilterLists",
"name": "FilterLists | Subscriptions for uBlock Origin, Adblock Plus, AdGuard, ...",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "icon_filterlists.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

View file

@ -1,3 +0,0 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:

View file

@ -1,3 +0,0 @@
if (window.navigator.msPointerEnabled) {
window.location = "https://filterlists.com/tpl.html";
}

View file

@ -1,579 +0,0 @@
<!doctype html>
<html>
<head>
<title>FilterLists.com for Internet Explorer</title>
</head>
<body>
Because FilterLists.com cannot be loaded in Internet Explorer, here's a
workaround to assist in subscribing to TPL lists.<br /><br />
In some circumstances, the link will be blocked the first time around. If
so, click on "Allow Blocked Content" in the resulting prompt below, and then
click the link again.<br /><br />
-------------------------------------------------------<br /><br />
* International lists:<br /><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylist.tpl', 'EasyList')"
>EasyList</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylist.tpl">View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylist_noelemhide.tpl', 'EasyList Without Element Hiding Rules')"
>EasyList Without Element Hiding Rules</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylist_noelemhide.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylist_noadult.tpl', 'EasyList Without Rules for Adult Sites')"
>EasyList Without Rules for Adult Sites</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylist_noadult.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easyprivacy.tpl', 'EasyPrivacy')"
>EasyPrivacy</a
>
-
<a href="https://easylist-msie.adblockplus.org/easyprivacy.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easyprivacy_nointernational.tpl', 'EasyPrivacy Without International Rules')"
>EasyPrivacy Without International Rules</a
>
-
<a
href="https://easylist-msie.adblockplus.org/easyprivacy_nointernational.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easyprivacy+easylist.tpl', 'EasyList + EasyPrivacy')"
>EasyList + EasyPrivacy</a
>
-
<a href="https://easylist-msie.adblockplus.org/easyprivacy+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/adwarefilters.tpl', 'Adware Filters')"
>Adware Filters</a
>
-
<a href="https://easylist-downloads.adblockplus.org/adwarefilters.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/easytest.tpl', 'EasyTest')"
>EasyTest</a
>
-
<a href="https://easylist-downloads.adblockplus.org/easytest.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/exceptionrules.tpl', 'Acceptable Ads')"
>Acceptable Ads</a
>
-
<a href="https://easylist-downloads.adblockplus.org/exceptionrules.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/antiadblockfilters.tpl', 'Adblock Warning Removal List')"
>Adblock Warning Removal List</a
>
-
<a href="https://easylist-msie.adblockplus.org/antiadblockfilters.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/abp-filters-anti-cv.tpl', 'ABP Anti-Circumvention Filter List')"
>ABP Anti-Circumvention Filter List</a
>
-
<a href="https://easylist-downloads.adblockplus.org/abp-filters-anti-cv.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/fanboy-annoyance.tpl', 'Fanboy\'s Annoyance List')"
>Fanboy's Annoyance List</a
>
-
<a href="https://easylist-msie.adblockplus.org/fanboy-annoyance.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylist-cookie.tpl', 'EasyList Cookie List')"
>EasyList Cookie List</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylist-cookie.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/fanboy-social.tpl', 'Fanboy\'s Social Blocking List')"
>Fanboy's Social Blocking List</a
>
-
<a href="https://easylist-msie.adblockplus.org/fanboy-social.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/fanboy-notifications.tpl', 'Fanboy\'s Notifications Blocking List')"
>Fanboy's Notifications Blocking List</a
>
-
<a href="https://easylist-msie.adblockplus.org/fanboy-notifications.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/malwaredomains_full.tpl', 'DNS-BH Malware Domains')"
>DNS-BH Malware Domains</a
>
-
<a href="https://easylist-msie.adblockplus.org/malwaredomains_full.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://pgl.yoyo.org/adservers/serverlist.tpl', 'Peter Lowe\'s List')"
>Peter Lowe's List</a
>
- <a href="https://pgl.yoyo.org/adservers/serverlist.tpl">View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://raw.githubusercontent.com/DandelionSprout/adfilt/master/Alternate%20versions%20Anti-Malware%20List/AntiMalwareTPL.tpl', 'Dandelion Sprout\'s Anti-Malware List')"
>Dandelion Sprout's Anti-Malware List</a
>
-
<a
href="https://raw.githubusercontent.com/DandelionSprout/adfilt/master/Alternate%20versions%20Anti-Malware%20List/AntiMalwareTPL.tpl"
>View ruleset</a
><br /><br />
* Language-specific lists:<br /><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/abpindo+easylist.tpl', 'ABPindo + EasyList')"
>ABPindo + EasyList</a
>
-
<a href="https://easylist-downloads.adblockplus.org/abpindo+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/abpvn+easylist.tpl', 'ABPVN + EasyList')"
>ABPVN + EasyList</a
>
-
<a href="https://easylist-msie.adblockplus.org/abpvn+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/bulgarian_list+easylist.tpl', 'Bulgarian List + EasyList')"
>Bulgarian List + EasyList</a
>
-
<a href="https://easylist-msie.adblockplus.org/bulgarian_list+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/indianlist+easylist.tpl', 'IndianList + EasyList')"
>IndianList + EasyList</a
>
-
<a href="https://easylist-downloads.adblockplus.org/indianlist+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/indianlist.tpl', 'IndianList')"
>IndianList</a
>
-
<a href="https://easylist-downloads.adblockplus.org/indianlist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/koreanlist+easylist.tpl', 'KoreanList + EasyList')"
>KoreanList + EasyList</a
>
-
<a href="https://easylist-downloads.adblockplus.org/koreanlist+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/koreanlist.tpl', 'KoreanList')"
>KoreanList</a
>
-
<a href="https://easylist-downloads.adblockplus.org/koreanlist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylistchina+easylist.tpl', 'EasyList China + EasyList')"
>EasyList China + EasyList</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylistchina+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylistchina.tpl', 'EasyList China')"
>EasyList China</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylistchina.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylistczechslovak+easylist.tpl', 'EasyList Czech and Slovak + EasyList')"
>EasyList Czech and Slovak + EasyList</a
>
-
<a
href="https://easylist-msie.adblockplus.org/easylistczechslovak+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylistdutch+easylist.tpl', 'EasyList Dutch + EasyList')"
>EasyList Dutch + EasyList</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylistdutch+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylistdutch.tpl', 'EasyList Dutch')"
>EasyList Dutch</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylistdutch.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylistgermany+easylist.tpl', 'EasyList Germany + EasyList')"
>EasyList Germany + EasyList</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylistgermany+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylistgermany.tpl', 'EasyList Germany')"
>EasyList Germany</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylistgermany.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylistitaly+easylist.tpl', 'EasyList Italy + EasyList')"
>EasyList Italy + EasyList</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylistitaly+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylistitaly.tpl', 'EasyList Italy')"
>EasyList Italy</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylistitaly.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylistlithuania+easylist.tpl', 'EasyList Lithuania + EasyList')"
>EasyList Lithuania + EasyList</a
>
-
<a
href="https://easylist-msie.adblockplus.org/easylistlithuania+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylistspanish+easylist.tpl', 'EasyList Spanish + EasyList')"
>EasyList Spanish + EasyList</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylistspanish+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/easylistspanish.tpl', 'EasyList Spanish')"
>EasyList Spanish</a
>
-
<a href="https://easylist-msie.adblockplus.org/easylistspanish.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/easylistpolish+easylist.tpl', 'EasyList Polish + EasyList')"
>EasyList Polish + EasyList</a
>
-
<a
href="https://easylist-downloads.adblockplus.org/easylistpolish+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/easylistpolish.tpl', 'EasyList Polish')"
>EasyList Polish</a
>
-
<a href="https://easylist-downloads.adblockplus.org/easylistpolish.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/easylistportuguese+easylist.tpl', 'EasyList Portuguese + EasyList')"
>EasyList Portuguese + EasyList</a
>
-
<a
href="https://easylist-downloads.adblockplus.org/easylistportuguese+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/easylistportuguese.tpl', 'EasyList Portuguese')"
>EasyList Portuguese</a
>
-
<a href="https://easylist-downloads.adblockplus.org/easylistportuguese.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/israellist+easylist.tpl', 'EasyList Hebrew + EasyList')"
>EasyList Hebrew</a
>
-
<a href="https://easylist-msie.adblockplus.org/israellist+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/latvianlist+easylist.tpl', 'Latvian List + EasyList')"
>Latvian List + EasyList</a
>
-
<a href="https://easylist-msie.adblockplus.org/latvianlist+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/liste_ar+liste_fr+easylist.tpl', 'Liste AR + Liste FR + EasyList')"
>Liste AR + Liste FR + EasyList</a
>
-
<a
href="https://easylist-msie.adblockplus.org/liste_ar+liste_fr+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/Liste_AR.tpl', 'Liste AR')"
>Liste AR</a
>
-
<a href="https://easylist-msie.adblockplus.org/Liste_AR.tpl">View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/liste_fr+easylist.tpl', 'Liste FR + EasyList')"
>Liste FR + EasyList</a
>
-
<a href="https://easylist-msie.adblockplus.org/liste_fr+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/liste_fr.tpl', 'Liste FR')"
>Liste FR</a
>
-
<a href="https://easylist-msie.adblockplus.org/liste_fr.tpl">View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/rolist+easylist.tpl', 'ROList + EasyList')"
>ROList + EasyList</a
>
-
<a href="https://easylist-msie.adblockplus.org/rolist+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/ruadlist+easylist.tpl', 'RU AdList + EasyList')"
>RU AdList + EasyList</a
>
-
<a href="https://easylist-msie.adblockplus.org/ruadlist+easylist.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/advblock.tpl', 'RU AdList')"
>RU AdList</a
>
-
<a href="https://easylist-msie.adblockplus.org/advblock.tpl">View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/bitblockext.tpl', 'RU AdList: BitBlock + Fanboy's Annoyance List')"
>RU AdList: BitBlock + Fanboy's Annoyance List</a
>
-
<a href="https://easylist-downloads.adblockplus.org/bitblockext.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/bitblock.tpl', 'RU AdList: Bitblock')"
>RU AdList: BitBlock</a
>
-
<a href="https://easylist-msie.adblockplus.org/bitblock.tpl">View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/cntblock.tpl', 'RU AdList: Counters')"
>RU AdList: Counters</a
>
-
<a href="https://easylist-msie.adblockplus.org/cntblock.tpl">View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-downloads.adblockplus.org/antinuha.tpl', 'RU AntiPron List')"
>RU AntiPron List</a
>
-
<a href="https://easylist-downloads.adblockplus.org/antinuha.tpl"
>View ruleset</a
><br />
<a
href="javascript:window.external.msAddTrackingProtectionList('https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianExperimentalList%20alternate%20versions/DandelionSproutsNorskeFiltre.tpl', 'Dandelion Sprouts nordiske filtre')"
>Dandelion Sprouts nordiske filtre</a
>
-
<a
href="https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianExperimentalList%20alternate%20versions/DandelionSproutsNorskeFiltre.tpl"
>View ruleset</a
><br /><br />
-------------------------------------------------------<br /><br />
* Outdated international lists (Last updated more than 24 months ago), that
have not been succeeded by more recently updated TPL lists<br /><br />
(2016)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://jansal.net/tpl/fanboy/enhancedstats-addon.tpl', 'Fanboy\'s Enhanced Tracking List')"
>Fanboy's Enhanced Tracking List</a
>
-
<a href="https://jansal.net/tpl/fanboy/enhancedstats-addon.tpl"
>View ruleset</a
><br />
(2016)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://jansal.net/tpl/malpatrol.tpl', 'Malware Patrol')"
>Malware Patrol</a
>
- <a href="https://jansal.net/tpl/malpatrol.tpl">View ruleset</a><br />
(2016)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://jansal.net/tpl/ricklist.tpl', 'Rickroll Blacklist')"
>Rickroll Blacklist</a
>
- <a href="https://jansal.net/tpl/ricklist.tpl">View ruleset</a><br />
(2013)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://jansal.net/tpl/m.tpl', 'M')"
>M</a
>
- <a href="https://jansal.net/tpl/m.tpl">View ruleset</a><br />
(2013)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://jansal.net/tpl/Adversity/Adversity.tpl', 'Adversity')"
>Adversity</a
>
- <a href="https://jansal.net/tpl/Adversity/Adversity.tpl">View ruleset</a
><br />
(2013)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://jansal.net/tpl/Adversity/Antisocial.tpl', 'Adversity - AntiSocial')"
>Adversity - AntiSocial</a
>
- <a href="https://jansal.net/tpl/Adversity/Antisocial.tpl">View ruleset</a
><br />
(2013)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://www.microsoft.com/cms/api/am/binary/RWilsQ', 'Stop Google Tracking')"
>Stop Google Tracking</a
>
-
<a href="https://www.microsoft.com/cms/api/am/binary/RWilsQ">View ruleset</a
><br />
(2011)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://jansal.net/tpl/popup-block.tpl', 'Popup Block List for Adblock Plus Popup Addon')"
>Popup Block List for Adblock Plus Popup Addon</a
>
- <a href="https://jansal.net/tpl/popup-block.tpl">View ruleset</a><br />
(2011)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://jansal.net/tpl/facebook-connect-optout-adblockplusfilter.tpl', 'Facebook Connect Opt-Out')"
>Facebook Connect Opt-Out</a
>
-
<a
href="https://jansal.net/tpl/facebook-connect-optout-adblockplusfilter.tpl"
>View ruleset</a
><br />
(Unknown year)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easy-tracking-protection.truste.com/easy.tpl', 'TRUSTe Easy Tracking Protection List')"
>TRUSTe Easy Tracking Protection List</a
>
-
<a href="https://easy-tracking-protection.truste.com/easy.tpl"
>View ruleset</a
><br /><br />
* Outdated language-specific lists (Last updated more than 24 months ago),
that have not been succeeded by more recently updated TPL lists<br /><br />
(2016)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://jansal.net/tpl/adblock-persian.tpl', 'Adblock Persian List')"
>Adblock Persian List</a
>
- <a href="http://jansal.net/tpl/adblock-persian.tpl">View ruleset</a><br />
(2015)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://raw.githubusercontent.com/wiltteri/subscriptions/master/wiltteri.tpl', 'Wiltteri')"
>Wiltteri</a
>
-
<a href="https://easylist-msie.adblockplus.org/wiltteri+easylist.tpl"
>View ruleset</a
><br />
(2015)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://easylist-msie.adblockplus.org/wiltteri+easylist.tpl', 'Wiltteri + EasyList')"
>Wiltteri + EasyList</a
>
-
<a href="https://easylist-msie.adblockplus.org/wiltteri+easylist.tpl"
>View ruleset</a
><br />
(2015)
<a
href="javascript:window.external.msAddTrackingProtectionList('https://raw.githubusercontent.com/wiltteri/subscriptions/master/wiltteri-reborn.tpl', 'Wiltteri Reborn')"
>Wiltteri Reborn</a
>
-
<a
href="https://raw.githubusercontent.com/wiltteri/subscriptions/master/wiltteri-reborn.tpl"
>View ruleset</a
>
</body>
</html>

View file

@ -1,8 +0,0 @@
import { render, screen } from "@testing-library/react";
import { App } from "./App";
xtest("renders learn react link", () => {
render(<App />);
const linkElement = screen.getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});

View file

@ -1,150 +0,0 @@
import {
ApiOutlined,
DollarOutlined,
GithubOutlined,
IeOutlined,
TwitterOutlined,
} from "@ant-design/icons";
import { Layout, Tag } from "antd";
import {
BrowserRouter as Router,
Link,
Route,
RouteComponentProps,
Switch,
} from "react-router-dom";
import { ListsTable } from "./components";
const { Header, Content, Footer } = Layout;
export const App: React.FC = () => (
<Router>
<Layout>
<Header style={{ background: "#000" }}>
<Logo />
</Header>
<Content>
<div
style={{
paddingLeft: 4,
paddingRight: 4,
minHeight: 280,
}}
>
<Switch>
<Route exact path="/" component={ListsTable} />
<Route path="/lists/*" component={ListsTable} />
<Route path="*" component={NotFound} />
</Switch>
</div>
</Content>
<Footer
style={{
textAlign: "center",
padding: "24px 0px 24px",
lineHeight: "24px",
}}
>
<CopyrightAuthor />
<Twitter />
<GitHub />
<Api />
<Tpl />
<Donate />
</Footer>
</Layout>
</Router>
);
const Logo = () => (
<Link to="/">
<img
src={`${process.env.PUBLIC_URL}/logo_filterlists.png`}
alt="FilterLists logo"
height="44px"
/>
</Link>
);
const NotFound = (props: RouteComponentProps) => (
<h2>
404 Not Found: <code>{props.location.pathname}</code>
</h2>
);
const CopyrightAuthor = () => (
<Tag>
©{new Date().getFullYear()}&nbsp;
<a
href="https://collinmbarrett.com"
title="Collin M. Barrett's Homepage"
target="_blank"
rel="noopener noreferrer"
>
Collin M. Barrett
</a>
</Tag>
);
const Twitter = () => (
<Tag>
<a
href="https://twitter.com/FilterLists"
title="FilterLists on Twitter"
target="_blank"
rel="noopener noreferrer"
>
<TwitterOutlined /> Twitter
</a>
</Tag>
);
const GitHub = () => (
<Tag>
<a
href="https://github.com/collinbarrett/FilterLists"
title="FilterLists git repository on GitHub"
target="_blank"
rel="noopener noreferrer"
>
<GithubOutlined /> GitHub
</a>
</Tag>
);
const Api = () => (
<Tag>
<a
href="https://api.filterlists.com"
title="FilterLists API"
target="_blank"
rel="noopener noreferrer"
>
<ApiOutlined /> API
</a>
</Tag>
);
const Tpl = () => (
<Tag>
<a
href="/tpl.html"
title="FilterLists Tracking Protection Lists (TPL) for Internet Explorer"
>
<IeOutlined /> TPL (IE)
</a>
</Tag>
);
const Donate = () => (
<Tag>
<a
href="https://github.com/sponsors/collinbarrett"
title="Sponsor Collin Barrett on GitHub"
target="_blank"
rel="noopener noreferrer"
>
<DollarOutlined /> Donate
</a>
</Tag>
);

View file

@ -1,5 +0,0 @@
interface Props {
description?: string;
}
export const Description = (props: Props) => <p>{props.description}</p>;

View file

@ -1,31 +0,0 @@
import { Tag } from "antd";
interface Props {
name: string;
url?: string;
showLabel?: boolean;
}
export const LicenseTag = (props: Props) =>
props.name ? (
<span>
{props.showLabel && <h3>License:</h3>}
<Tag>
<TagContents name={props.name} url={props.url} />
</Tag>
</span>
) : null;
const TagContents = (props: Props) =>
props.url ? (
<a
href={props.url}
title={`View ${props.name}'s homepage.`}
target="_blank"
rel="noopener noreferrer"
>
{props.name}
</a>
) : (
<>{props.name}</>
);

View file

@ -1,25 +0,0 @@
import { Button } from "antd";
import { ButtonType } from "antd/lib/button";
interface Props {
url?: string;
text: string;
title?: string;
type?: ButtonType;
icon?: React.ReactNode;
}
export const LinkButton = (props: Props) =>
props.url && props.text ? (
<Button
href={props.url}
title={props.title}
type={props.type || "default"}
block
icon={props.icon}
target="_blank"
rel="noopener noreferrer"
>
{props.text}
</Button>
) : null;

View file

@ -1,27 +0,0 @@
import { InfoCircleOutlined } from "@ant-design/icons";
import { Button } from "antd";
import { RouteComponentProps } from "react-router-dom";
import slugify from "slugify";
import { SlugifyOptions } from "../constants";
interface Props {
listName: string;
}
export const ListInfoButton = (props: RouteComponentProps & Props) => {
const listPath = `/lists/${slugify(props.listName, SlugifyOptions)}`;
return (
<Button
style={{ marginLeft: "10px" }}
type="primary"
title={`View more information about ${props.listName}.`}
onClick={() =>
props.location.pathname === listPath
? props.history.push("/")
: props.history.push(listPath)
}
>
<InfoCircleOutlined />
</Button>
);
};

View file

@ -1,126 +0,0 @@
import { ImportOutlined } from "@ant-design/icons";
import { Button } from "antd";
import { ButtonType } from "antd/lib/button";
interface Props {
name: string;
viewUrls: string[];
}
export const SubscribeButtons = (props: Props) =>
props.viewUrls.length ? (
<>
<SubscribeButton
name={props.name}
viewUrl={props.viewUrls[0]}
text="Subscribe"
isPrimary={true}
/>
<MirrorButtons
name={props.name}
viewUrlMirrors={props.viewUrls.slice(1)}
/>
</>
) : null;
interface MirrorButtonsProps {
name: string;
viewUrlMirrors: string[] | undefined;
}
const MirrorButtons = (props: MirrorButtonsProps) => (
<>
{props.viewUrlMirrors && props.viewUrlMirrors.length
? props.viewUrlMirrors.map((viewUrlMirror: string, i: number) => (
<SubscribeButton
key={i}
name={props.name}
viewUrl={viewUrlMirror}
text={`Subscribe (Mirror ${i + 1})`}
isPrimary={false}
/>
))
: null}
</>
);
interface SubscribeButtonProps {
name: string;
viewUrl: string;
text: string;
isPrimary: boolean;
}
const SubscribeButton = (props: SubscribeButtonProps) => {
const buttonProps = buildButtonProps(
props.name,
props.viewUrl,
props.isPrimary,
);
return (
<Button
hidden={buttonProps.disabled}
block
icon={<ImportOutlined />}
type={buttonProps.type}
href={buttonProps.href}
title={buttonProps.title}
>
{props.text}
</Button>
);
};
const buildButtonProps = (
name: string,
viewUrl: string,
isPrimary: boolean,
) => {
let type: ButtonType = isPrimary ? "primary" : "default";
let hidden: boolean = false;
const hrefLocation = `${encodeURIComponent(viewUrl)}`;
const hrefTitle = `${encodeURIComponent(name)}`;
let href = `abp:subscribe?location=${hrefLocation}&title=${hrefTitle}`;
let prefixes: string[] = [];
let message = `Subscribe to ${name} with a browser extension supporting the "abp:" protocol (e.g. uBlock Origin, Adblock Plus).`;
// HTTP protocols
if (viewUrl.includes(".onion/")) {
type = "dashed";
prefixes.push("TOR");
}
if (viewUrl.includes("http://")) {
type = "dashed";
prefixes.push("INSECURE");
}
// Software protocols
if (viewUrl.includes(".tpl")) {
href = `https://filterlists.com/tpl.html`;
message = `Subscribe via FilterList's TPL page.`;
}
if (
viewUrl.includes(".lsrules") ||
viewUrl.includes("?hostformat=littlesnitch")
) {
href = `x-littlesnitch:subscribe-rules?url=${hrefLocation}`;
message = `Subscribe to ${name} with Little Snitch's rule group subscription feature.`;
}
// Formats
if (
viewUrl.includes(".zip") ||
viewUrl.includes(".7z") ||
viewUrl.includes(".tar.gz")
) {
hidden = true; // no known software supports subscribing to compressed lists
}
const title = `${
prefixes.length ? prefixes.join(" | ") + " | " : ""
}${message}`;
return { disabled: hidden, type, href, title };
};

View file

@ -1,31 +0,0 @@
import { Tag } from "antd";
interface Props {
name: string;
definitionUrl?: string;
showLabel?: boolean;
}
export const SyntaxTag = (props: Props) =>
props.name ? (
<span>
{props.showLabel && <h3>Syntax:</h3>}
<Tag>
<TagContents name={props.name} definitionUrl={props.definitionUrl} />
</Tag>
</span>
) : null;
const TagContents = (props: Props) =>
props.definitionUrl ? (
<a
href={props.definitionUrl}
title={`View ${props.name}'s homepage.`}
target="_blank"
rel="noopener noreferrer"
>
{props.name}
</a>
) : (
<>{props.name}</>
);

View file

@ -1,55 +0,0 @@
import { LinkButton } from "./LinkButton";
import { SearchOutlined } from "@ant-design/icons";
interface Props {
name: string;
viewUrls: string[];
}
export const ViewButtons = (props: Props) =>
props.viewUrls.length ? (
<>
<ViewButton name={props.name} viewUrl={props.viewUrls[0]} text="View" />
<MirrorButtons
name={props.name}
viewUrlMirrors={props.viewUrls.slice(1)}
/>
</>
) : null;
interface MirrorButtonsProps {
name: string;
viewUrlMirrors: string[] | undefined;
}
const MirrorButtons = (props: MirrorButtonsProps) => (
<>
{props.viewUrlMirrors && props.viewUrlMirrors.length
? props.viewUrlMirrors.map((viewUrlMirror: string, i: number) => (
<ViewButton
key={i}
name={props.name}
viewUrl={viewUrlMirror}
text={`View (Mirror ${i + 1})`}
/>
))
: null}
</>
);
interface ViewButtonProps {
name: string;
viewUrl: string;
text: string;
}
const ViewButton = (props: ViewButtonProps) => {
return (
<LinkButton
url={props.viewUrl}
text={props.text}
title={`View ${props.name} in its raw format`}
icon={<SearchOutlined />}
/>
);
};

View file

@ -1,3 +0,0 @@
import { ListsTable } from "./listsTable";
export { ListsTable };

View file

@ -1,21 +0,0 @@
import { Tag } from "antd";
import { Language } from "../../interfaces/Language";
interface Props {
languages: Language[];
showLabel?: boolean;
}
export const LanguageCloud = (props: Props) =>
props.languages && props.languages.length ? (
<div>
{props.showLabel && (
<h3>{`Language${props.languages.length > 1 ? "s" : ""}:`}</h3>
)}
{props.languages.map((l: Language, i: number) => (
<Tag key={i} title={l.name}>
{l.iso6391}
</Tag>
))}
</div>
) : null;

View file

@ -1,3 +0,0 @@
import { LanguageCloud } from "./LanguageCloud";
export { LanguageCloud };

View file

@ -1,165 +0,0 @@
import "./listInfoDrawer.css";
import { Divider, Drawer } from "antd";
import {
DollarOutlined,
FileExclamationOutlined,
FormOutlined,
GithubOutlined,
GlobalOutlined,
HomeOutlined,
MailOutlined,
MessageOutlined,
TeamOutlined,
} from "@ant-design/icons";
import { useEffect, useState } from "react";
import ButtonGroup from "antd/lib/button/button-group";
import { Description } from "../Description";
import { LanguageCloud } from "../languageCloud";
import { LicenseTag } from "../LicenseTag";
import { LinkButton } from "../LinkButton";
import { ViewButtons } from "../ViewButtons";
import { Maintainers } from "../maintainers";
import { RouteComponentProps } from "react-router-dom";
import { SoftwareCloud } from "../softwareCloud";
import { SubscribeButtons } from "../SubscribeButtons";
import { TagCloud } from "../tagCloud";
import { useListDetails } from "../../hooks";
import { SyntaxCloud } from "../syntaxCloud";
import { Tag } from "../../interfaces/Tag";
import { License } from "../../interfaces/License";
import { Maintainer } from "../../interfaces/Maintainer";
import { Software } from "../../interfaces/Software";
import { Syntax } from "../../interfaces/Syntax";
import { Language } from "../../interfaces/Language";
interface Props {
listId: number;
languages: Language[];
licenses: License[];
maintainers: Maintainer[];
software: Software[];
syntaxes: Syntax[];
tags: Tag[];
}
export const ListInfoDrawer = (props: RouteComponentProps & Props) => {
const list = useListDetails(props.listId);
const listLanguage = props.languages.filter((l) =>
list?.languageIds.includes(l.id),
);
const listTags = props.tags.filter((t) => list?.tagIds.includes(t.id));
const listLicense = props.licenses.find((l) => l.id === list?.licenseId);
const listSyntaxes = props.syntaxes.filter((s) =>
list?.syntaxIds.includes(s.id),
);
const listSoftware = props.software.filter((s) =>
s.syntaxIds.some((sid) => list?.syntaxIds.includes(sid)),
);
const listMaintainers = props.maintainers.filter((m) =>
list?.maintainerIds.includes(m.id),
);
const [originalTitle] = useState<string>(document.title);
const listName = list?.name;
useEffect(() => {
const updateTitle = () =>
(document.title = list?.name + " | " + originalTitle);
updateTitle();
return () => {
document.title = originalTitle;
};
}, [list, originalTitle, listName]);
const viewUrlModels = list?.viewUrls.filter((u) => u.segmentNumber === 1);
const viewUrls = viewUrlModels == null ? [] : viewUrlModels.map((u) => u.url);
return list ? (
<Drawer
open={true}
width={350}
placement={"right"}
mask={false}
title={list.name}
destroyOnClose={true}
onClose={() => props.history.push("/")}
>
<Description description={list.description} />
<LanguageCloud languages={listLanguage} showLabel={true} />
<TagCloud tags={listTags} showLabel={true} />
{listLicense && (
<LicenseTag
name={listLicense.name}
url={listLicense.url}
showLabel={true}
/>
)}
{listSyntaxes && <SyntaxCloud syntaxes={listSyntaxes} showLabel={true} />}
<SoftwareCloud software={listSoftware} showLabel={true} />
<Maintainers maintainers={listMaintainers} />
<Divider />
<ButtonGroup style={{ display: "inherit" }}>
{viewUrls.length && (
<SubscribeButtons name={list.name} viewUrls={viewUrls} />
)}
{viewUrls.length && (
<ViewButtons name={list.name} viewUrls={viewUrls} />
)}
<LinkButton
url={list.homeUrl}
text="Home"
title={`View ${list.name}'s homepage.`}
icon={<HomeOutlined />}
/>
<LinkButton
url={list.onionUrl}
text="Onion (Tor)"
title={`View ${list.name}'s onion/tor homepage.`}
icon={<GlobalOutlined />}
/>
<LinkButton
url={list.policyUrl}
text="Policy"
title={`View the types of rules that ${list.name} includes.`}
icon={<FileExclamationOutlined />}
/>
{list.emailAddress && (
<LinkButton
url={`mailto:${list.emailAddress}`}
text="Email"
title={`Email ${list.name}.`}
icon={<MailOutlined />}
/>
)}
<LinkButton
url={list.issuesUrl}
text="GitHub Issues"
title={`View the GitHub Issues for ${list.name}.`}
icon={<GithubOutlined />}
/>
<LinkButton
url={list.submissionUrl}
text="Submit a Rule"
title={`Submit a new rule to be included in ${list.name}.`}
icon={<FormOutlined />}
/>
<LinkButton
url={list.forumUrl}
text="Forum"
title={`View the forum for ${list.name}.`}
icon={<TeamOutlined />}
/>
<LinkButton
url={list.chatUrl}
text="Chat"
title={`Enter the chat room for ${list.name}.`}
icon={<MessageOutlined />}
/>
<LinkButton
url={list.donateUrl}
text="Donate"
title={`Donate to the maintainer of ${list.name}.`}
icon={<DollarOutlined />}
/>
</ButtonGroup>
</Drawer>
) : null;
};

View file

@ -1,3 +0,0 @@
import { ListInfoDrawer } from "./ListInfoDrawer";
export { ListInfoDrawer };

View file

@ -1,10 +0,0 @@
h3 {
margin-top: 1em;
margin-bottom: 0.2em;
}
.ant-btn-group
.ant-btn-primary
+ .ant-btn:not(.ant-btn-primary):not([disabled]) {
border-left-color: rgb(67, 67, 67);
}

View file

@ -1,45 +0,0 @@
import {
Redirect,
Route,
RouteComponentProps,
StaticContext,
} from "react-router";
import { List } from "../../interfaces/List";
import { ListInfoDrawer } from "../listInfoDrawer";
import { Language } from "../../interfaces/Language";
import { License } from "../../interfaces/License";
import { Maintainer } from "../../interfaces/Maintainer";
import { Software } from "../../interfaces/Software";
import { Syntax } from "../../interfaces/Syntax";
import { Tag } from "../../interfaces/Tag";
interface Props {
lists: List[];
languages: Language[];
licenses: License[];
maintainers: Maintainer[];
software: Software[];
syntaxes: Syntax[];
tags: Tag[];
}
export const ListDrawer = (props: Props) => {
const renderDrawer = (rp: RouteComponentProps<any, StaticContext, any>) => {
const list = props.lists.find((l) => l.slug === rp.match.params.listSlug);
return list ? (
<ListInfoDrawer
listId={list.id}
languages={props.languages}
licenses={props.licenses}
maintainers={props.maintainers}
software={props.software}
syntaxes={props.syntaxes}
tags={props.tags}
{...rp}
/>
) : props.lists && props.lists.length ? (
<Redirect to={{ pathname: "/" }} />
) : null;
};
return <Route path="/lists/:listSlug" render={renderDrawer} />;
};

View file

@ -1,382 +0,0 @@
import {
Key,
SorterResult,
TableCurrentDataSource,
} from "antd/lib/table/interface";
import { useEffect, useState } from "react";
import { SoftwareCloud, SoftwareIcon } from "../softwareCloud";
import { Table, Tag } from "antd";
import { useSearchColumnFilter, useTablePageSizer } from "../../hooks";
import { Description } from "../Description";
import { Language } from "../../interfaces/Language";
import { LanguageCloud } from "../languageCloud";
import { SyntaxCloud } from "../syntaxCloud";
import { License } from "../../interfaces/License";
import { LicenseTag } from "../LicenseTag";
import { List } from "../../interfaces/List";
import { ListInfoButton } from "../ListInfoButton";
import { Maintainer } from "../../interfaces/Maintainer";
import { MaintainerCloud } from "../maintainerCloud";
import { RouteComponentProps } from "react-router";
import { Software } from "../../interfaces/Software";
import { Syntax } from "../../interfaces/Syntax";
import { TagCloud } from "../tagCloud";
import { Tag as TagInterface } from "../../interfaces/Tag";
import { arraySorter } from "./arraySorter";
import { nameof } from "../../utils";
import { TablePaginationConfig } from "antd/lib/table";
import { SyntaxTag } from "../SyntaxTag";
interface Props {
lists: List[];
languages: Language[];
licenses: License[];
maintainers: Maintainer[];
software: Software[];
syntaxes: Syntax[];
tags: TagInterface[];
}
export const ListsTable = (props: RouteComponentProps & Props) => {
const {
lists,
languages,
licenses,
maintainers,
software,
syntaxes,
tags,
...routeComponentProps
} = props;
const tablePageSize = useTablePageSizer();
const searchNameColumn = useSearchColumnFilter<List>(nameof<List>("name"));
const searchDescriptionColumn = useSearchColumnFilter<List>(
nameof<List>("description"),
);
const [visibleLists, setVisibleLists] = useState<List[]>(lists);
useEffect(() => {
setVisibleLists(lists);
}, [lists]);
return (
<Table<List>
dataSource={lists}
rowKey={(record) => record.id.toString()}
loading={lists.length ? false : true}
size="small"
pagination={{
simple: true,
pageSize: tablePageSize.pageSize,
position: ["topRight"],
}}
scroll={{
x:
tablePageSize.isNarrowWindow || tablePageSize.isWideWindow
? undefined
: 1892,
}}
onChange={(
_pagination: TablePaginationConfig,
_filters: Record<string, (Key | boolean)[] | null>,
_sorter: SorterResult<List> | SorterResult<List>[],
extra: TableCurrentDataSource<List>,
) => setVisibleLists(extra.currentDataSource)}
>
<Table.Column<List>
title="Info"
key="Info"
dataIndex={nameof<List>("id")}
width={62}
fixed={tablePageSize.isNarrowWindow ? undefined : "left"}
render={(_id: number, list: List) => (
<ListInfoButton listName={list.name} {...routeComponentProps} />
)}
/>
<Table.Column<List>
title="Name"
key="Name"
dataIndex={nameof<List>("name")}
sorter={(a, b) => a.name.localeCompare(b.name)}
defaultSortOrder={"ascend"}
width={tablePageSize.isNarrowWindow ? undefined : 200}
fixed={tablePageSize.isNarrowWindow ? undefined : "left"}
filterDropdown={searchNameColumn.filterDropdown}
filterIcon={searchNameColumn.filterIcon}
onFilter={searchNameColumn.onFilter}
render={(name: string) => <div>{name}</div>}
/>
{tablePageSize.isNarrowWindow ? null : (
<Table.Column<List>
title="Description"
key="Description"
dataIndex={nameof<List>("description")}
sorter={(a, b) =>
a.description
? b.description
? a.description.localeCompare(b.description)
: -1
: 1
}
width={
!tablePageSize.isNarrowWindow && !tablePageSize.isWideWindow
? 423
: undefined
}
filterDropdown={searchDescriptionColumn.filterDropdown}
filterIcon={searchDescriptionColumn.filterIcon}
onFilter={searchDescriptionColumn.onFilter}
render={(description: string) => (
<Description description={description} />
)}
/>
)}
{tablePageSize.isNarrowWindow ? null : (
<Table.Column<List>
title="Software"
key="Software"
dataIndex={nameof<List>("syntaxIds")}
sorter={(a, b) => {
const getSoftwareIds = (l: List) =>
software
.filter(
(s: Software) =>
s.syntaxIds &&
s.syntaxIds.some((i) => l.syntaxIds.includes(i)),
)
.map((s) => s.id);
return arraySorter(getSoftwareIds(a), getSoftwareIds(b), software);
}}
width={170}
filters={software.map((s) => ({
text: (
<>
<SoftwareIcon id={s.id} />
&nbsp;
{s.name}&nbsp; (
{
visibleLists.filter(
(l) =>
s.syntaxIds &&
s.syntaxIds.some((i) => l.syntaxIds.includes(i)),
).length
}
)
</>
),
value: s.name,
}))}
onFilter={(value, record) =>
software
.filter((s: Software) => s.name === value)
.flatMap((s) => s.syntaxIds)
.some((i) => record.syntaxIds.includes(i))
}
render={(syntaxIds: number[]) =>
syntaxIds ? (
<SoftwareCloud
software={software.filter(
(s: Software) =>
s.syntaxIds &&
s.syntaxIds.some((i) => syntaxIds.includes(i)),
)}
/>
) : null
}
/>
)}
{tablePageSize.isNarrowWindow ? null : (
<Table.Column<List>
title="Syntaxes"
key="Syntaxes"
dataIndex={nameof<List>("syntaxIds")}
sorter={(a, b) => arraySorter(a.syntaxIds, b.syntaxIds, syntaxes)}
width={254}
filters={syntaxes.map((s) => ({
text: (
<>
<SyntaxTag name={s.name} showLabel={false} />
&nbsp;(
{
visibleLists.filter(
(li) => li.syntaxIds && li.syntaxIds.includes(s.id),
).length
}
)
</>
),
value: s.id,
}))}
onFilter={(value, record) =>
record.syntaxIds
? record.syntaxIds.includes(value as number)
: false
}
render={(syntaxIds: number[]) =>
syntaxIds ? (
<SyntaxCloud
syntaxes={syntaxes.filter((s: Syntax) =>
syntaxIds.includes(s.id),
)}
/>
) : null
}
/>
)}
{tablePageSize.isNarrowWindow ? null : (
<Table.Column<List>
title="Languages"
key="Languages"
dataIndex={nameof<List>("languageIds")}
sorter={(a, b) =>
arraySorter(a.languageIds, b.languageIds, languages)
}
width={129}
filters={languages.map((l) => ({
text: (
<>
<Tag title={l.name}>{l.iso6391}</Tag>&nbsp;
{l.name}&nbsp; (
{
visibleLists.filter(
(li) => li.languageIds && li.languageIds.includes(l.id),
).length
}
)
</>
),
value: l.id,
}))}
onFilter={(value, record) =>
record.languageIds
? record.languageIds.includes(value as number)
: false
}
render={(languageIds: number[]) =>
languageIds ? (
<LanguageCloud
languages={languages.filter((l: Language) =>
languageIds.includes(l.id),
)}
/>
) : null
}
/>
)}
{tablePageSize.isNarrowWindow ? null : (
<Table.Column<List>
title="Tags"
key="Tags"
dataIndex={nameof<List>("tagIds")}
sorter={(a, b) => arraySorter(a.tagIds, b.tagIds, tags)}
width={275}
filters={tags.map((t) => ({
text: (
<>
<Tag title={t.description}>{t.name}</Tag>(
{
visibleLists.filter(
(l) => l.tagIds && l.tagIds.includes(t.id),
).length
}
)
</>
),
value: t.id.toString(),
}))}
onFilter={(value, record) =>
record.tagIds ? record.tagIds.includes(Number(value)) : false
}
render={(tagIds: number[]) =>
tagIds ? (
<TagCloud
tags={tags.filter((t: TagInterface) => tagIds.includes(t.id))}
/>
) : null
}
/>
)}
{tablePageSize.isNarrowWindow ? null : (
<Table.Column<List>
title="Maintainers"
key="Maintainers"
dataIndex={nameof<List>("maintainerIds")}
sorter={(a, b) =>
arraySorter(a.maintainerIds, b.maintainerIds, maintainers)
}
width={191}
filters={maintainers.map((t) => ({
text: (
<>
<Tag title={t.name}>{t.name}</Tag>(
{
visibleLists.filter(
(l) => l.maintainerIds && l.maintainerIds.includes(t.id),
).length
}
)
</>
),
value: t.id.toString(),
}))}
onFilter={(value, record) =>
record.maintainerIds
? record.maintainerIds.includes(Number(value))
: false
}
render={(maintainerIds: number[]) =>
maintainerIds ? (
<MaintainerCloud
maintainers={maintainers.filter((t: Maintainer) =>
maintainerIds.includes(t.id),
)}
/>
) : null
}
/>
)}
{tablePageSize.isNarrowWindow ? null : (
<Table.Column<List>
title="License"
key="License"
dataIndex={nameof<List>("licenseId")}
sorter={(a, b) => {
const licenseA = licenses.find((s) => s.id === a.licenseId);
const licenseB = licenses.find((s) => s.id === b.licenseId);
return licenseA
? licenseB
? licenseA.name.localeCompare(licenseB.name)
: -1
: 1;
}}
width={215}
filters={licenses.map((l) => ({
text: (
<>
<LicenseTag name={l.name} showLabel={false} />(
{
visibleLists.filter(
(li) => li.licenseId && li.licenseId === l.id,
).length
}
)
</>
),
value: l.id.toString(),
}))}
onFilter={(value, record) =>
record.licenseId ? record.licenseId.toString() === value : false
}
render={(licenseId: number) => {
const license = licenses.find((l) => l.id === licenseId);
return license ? (
<LicenseTag
name={license.name}
url={license.url}
showLabel={false}
/>
) : null;
}}
/>
)}
</Table>
);
};

View file

@ -1,45 +0,0 @@
import { RouteComponentProps } from "react-router-dom";
import {
useLanguages,
useLicenses,
useLists,
useMaintainers,
useSoftware,
useSyntaxes,
useTags,
} from "../../hooks";
import { ListDrawer } from "./ListDrawer";
import { ListsTable } from "./ListsTable";
export const ListsTableHoc = (props: RouteComponentProps) => {
const lists = useLists();
const languages = useLanguages();
const licenses = useLicenses();
const maintainers = useMaintainers();
const software = useSoftware();
const syntaxes = useSyntaxes();
const tags = useTags();
return (
<>
<ListsTable
lists={lists}
languages={languages}
licenses={licenses}
maintainers={maintainers}
software={software}
syntaxes={syntaxes}
tags={tags}
{...props}
/>
<ListDrawer
lists={lists}
languages={languages}
licenses={licenses}
maintainers={maintainers}
software={software}
syntaxes={syntaxes}
tags={tags}
/>
</>
);
};

View file

@ -1,30 +0,0 @@
interface ArraySortableEntity {
id: number;
name: string;
}
export const arraySorter = (
a: number[],
b: number[],
entities: ArraySortableEntity[],
) =>
a && a.length
? b && b.length
? a.length === b.length
? entities
.filter((e: ArraySortableEntity) => a.includes(e.id))
.map((e: ArraySortableEntity) => e.name)
.join()
.toLowerCase() >
entities
.filter((e: ArraySortableEntity) => b.includes(e.id))
.map((e: ArraySortableEntity) => e.name)
.join()
.toLowerCase()
? 1
: -1
: a.length > b.length
? -1
: 1
: -1
: 1;

View file

@ -1,3 +0,0 @@
import { ListsTableHoc } from "./ListsTableHoc";
export { ListsTableHoc as ListsTable };

View file

@ -1,28 +0,0 @@
import { Tag } from "antd";
import { Maintainer } from "../../interfaces/Maintainer";
interface Props {
maintainers: Maintainer[];
}
export const MaintainerCloud = (props: Props) =>
props.maintainers && props.maintainers.length ? (
<div>
{props.maintainers.map((m: Maintainer, i: number) =>
m.url ? (
<Tag key={i}>
<a
href={m.url}
title={`View ${m.name}'s homepage.`}
target="_blank"
rel="noopener noreferrer"
>
{m.name}
</a>
</Tag>
) : (
<Tag key={i}>{m.name}</Tag>
),
)}
</div>
) : null;

View file

@ -1,3 +0,0 @@
import { MaintainerCloud } from "./MaintainerCloud";
export { MaintainerCloud };

View file

@ -1,63 +0,0 @@
import "./maintainers.css";
import { HomeOutlined, MailOutlined, TwitterOutlined } from "@ant-design/icons";
import { Card } from "antd";
import { Maintainer } from "../../interfaces/Maintainer";
interface Props {
maintainers: Maintainer[];
}
export const Maintainers = (props: Props) =>
props.maintainers && props.maintainers.length ? (
<>
<h3>Maintainer{props.maintainers.length > 1 ? "s" : ""}:</h3>
{props.maintainers.map((m: Maintainer, index: number) => (
<MaintainerComponent key={index} maintainer={m} />
))}
</>
) : null;
interface MaintainerComponentProps {
maintainer: Maintainer;
}
const MaintainerComponent = (props: MaintainerComponentProps) => {
let actions = [];
if (props.maintainer.url) {
actions.push(
<a
href={props.maintainer.url}
title={`View ${props.maintainer.name}'s homepage.`}
target="_blank"
rel="noopener noreferrer"
>
<HomeOutlined key="home" />
</a>,
);
}
if (props.maintainer.emailAddress) {
actions.push(
<a
href={`mailto:${props.maintainer.emailAddress}`}
title={`Email ${props.maintainer.name}.`}
target="_blank"
rel="noopener noreferrer"
>
<MailOutlined key="mail" />
</a>,
);
}
if (props.maintainer.twitterHandle) {
actions.push(
<a
href={`https://twitter.com/${props.maintainer.twitterHandle}`}
title={`${props.maintainer.twitterHandle} on Twitter`}
target="_blank"
rel="noopener noreferrer"
>
<TwitterOutlined key="twitter" />
</a>,
);
}
return <Card title={props.maintainer.name} actions={actions} />;
};

View file

@ -1,3 +0,0 @@
import { Maintainers } from "./Maintainers";
export { Maintainers };

View file

@ -1,3 +0,0 @@
.ant-card-body {
display: none;
}

View file

@ -1,32 +0,0 @@
import { Software } from "../../interfaces/Software";
import { SoftwareIcon } from "./SoftwareIcon";
interface Props {
software: Software[];
showLabel?: boolean;
}
export const SoftwareCloud = (props: Props) =>
props.software && props.software.length ? (
<div>
{props.showLabel && <h3>{`Software:`}</h3>}
{props.software.map((s: Software, i: number) =>
s.homeUrl ? (
<a
key={i}
href={s.homeUrl}
target="_blank"
rel="noopener noreferrer"
style={{
display: "inline-block",
height: "20px",
}}
>
<SoftwareIcon id={s.id} />
</a>
) : (
<SoftwareIcon key={i} id={s.id} />
),
)}
</div>
) : null;

View file

@ -1,116 +0,0 @@
import {
img01,
img02,
img03,
img04,
img05,
img06,
img07,
img08,
img10,
img11,
img12,
img13,
img14,
img15,
img16,
img17,
img18,
img19,
img20,
img21,
img22,
img23,
img24,
img25,
img26,
img27,
img28,
img29,
img30,
img31,
img32,
img33,
img34,
img35,
img36,
img37,
img38,
img39,
img40,
img41,
img42,
img43,
img44,
img45,
img46,
img47,
} from "./imgs";
interface Props {
id: number;
}
export const SoftwareIcon = (props: Props) =>
icons[props.id] ? (
<img
src={icons[props.id].image}
height="20"
alt={icons[props.id].imageTitle}
title={icons[props.id].imageTitle}
/>
) : null;
interface Icon {
image: any;
imageTitle: string;
}
const icons: { [id: number]: Icon } = {
1: { image: img01, imageTitle: "uBlock Origin" },
2: { image: img02, imageTitle: "Adblock Plus" },
3: { image: img03, imageTitle: "AdGuard (free versions)" },
4: { image: img04, imageTitle: "DNS66" },
5: { image: img05, imageTitle: "Nano Adblocker" },
6: { image: img06, imageTitle: "AdBlock" },
7: { image: img07, imageTitle: "AdAway" },
8: { image: img08, imageTitle: "Personal Blocklist" },
10: { image: img10, imageTitle: "Redirector" },
11: { image: img11, imageTitle: "Hosts File Editor" },
12: { image: img12, imageTitle: "Gas Mask" },
13: { image: img13, imageTitle: "MinerBlock" },
14: { image: img14, imageTitle: "Pi-hole" },
15: { image: img15, imageTitle: "uBlock" },
16: { image: img16, imageTitle: "Internet Explorer (TPL)" },
17: { image: img17, imageTitle: "Google Hit Hider by Domain" },
18: { image: img18, imageTitle: "FireHOL" },
19: { image: img19, imageTitle: "Samsung Knox" },
20: { image: img20, imageTitle: "Little Snitch" },
21: { image: img21, imageTitle: "Privoxy" },
22: { image: img22, imageTitle: "Diversion" },
23: { image: img23, imageTitle: "dnsmasq" },
24: { image: img24, imageTitle: "Slimjet" },
25: { image: img25, imageTitle: "uMatrix" },
26: { image: img26, imageTitle: "Blokada" },
27: { image: img27, imageTitle: "hostsmgr" },
28: { image: img28, imageTitle: "personalDNSfilter" },
29: { image: img29, imageTitle: "Unbound" },
30: { image: img30, imageTitle: "BIND" },
31: { image: img31, imageTitle: "AdGuard Home" },
32: { image: img32, imageTitle: "AdNauseam" },
33: { image: img33, imageTitle: "Legacy Unix derivatives" },
34: { image: img34, imageTitle: "Windows command line" },
35: { image: img35, imageTitle: "Shadowsocks" },
36: { image: img36, imageTitle: "ShadowsocksR" },
37: { image: img37, imageTitle: "Shadowrocket" },
38: { image: img38, imageTitle: "DNSRedirector" },
39: { image: img39, imageTitle: "pfBlockerNG" },
40: { image: img40, imageTitle: "Opera's built-in adblocker" },
41: { image: img41, imageTitle: "Surge" },
42: { image: img42, imageTitle: "dnscrypt-proxy" },
43: { image: img43, imageTitle: "SmartDNS" },
44: { image: img44, imageTitle: "AdGuard for Windows/macOS" },
45: { image: img45, imageTitle: "AdGuard for Android" },
46: { image: img46, imageTitle: "Vivaldi's Privacy settings" },
47: { image: img47, imageTitle: "Polish Cookie Consent" },
};

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="8.5 1 111.5 127" version="1"><path stroke-linejoin="round" d="M448 669c-81-57-81-57-81-200 35 0 46 0 81-28m0 228c80-57 80-57 80-200-34 0-46 0-80-28" transform="matrix(-.69452 0 0 .5611 375 -247)" fill="maroon" stroke="#fff" stroke-linecap="round" stroke-width="2"/><g stroke="#fff" transform="translate(-18 -17)"><circle cx="102" cy="81" fill="none" stroke-width="6" transform="translate(-42 -31) scale(1.33333)" r="12"/><path fill="#fff" d="M82 81c0 11-5 16-16 16s-16-5-16-16V57h8v24c0 7 1 8 8 8s8-1 8-8V57h8z" stroke="none"/></g></svg>

Before

Width:  |  Height:  |  Size: 586 B

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="619.25" height="620.5"><path fill="#fff" d="M44.45 196.24h525.28V422.5H44.45z"/><path fill="#fff" stroke="#dadbdb" stroke-width="3" d="m91.8 528.68-90.3-90.3V182.1l90.32-90.3 90.3-90.32h255l90.32 90.32 90.3 90.3v256.3l-90.3 90.3L437.1 619h-255l-90.3-90.32zm416.26-20.6 82.2-82.2V194.62l-82.2-82.2-82.2-82.17H194.6l-82.18 82.2-82.16 82.17v231.25l82.17 82.2 82.2 82.18h231.24l82.2-82.18z"/><path fill="#e00000" stroke="#cb0000" stroke-width="3.004" d="m111.94 508.64-81.77-81.56V193.33l81.77-81.56 81.78-81.56h231.82l82.4 82.2 82.4 82.18v231.26l-82.4 82.18-82.4 82.2H193.7l-81.76-81.58zm231.4-94.2c31.23-6.7 48.93-26.18 51.1-56.18 1.5-20.3-4.52-37.73-16.16-46.9-5.57-4.4-17.6-9.9-21.63-9.9-3.28 0-3.16-2.23.18-3.06 10.03-2.5 21.35-14.97 25.48-28 3.1-9.74 3.4-28 .67-37.2-2.66-8.93-10.25-19.1-18.23-24.46-14.4-9.64-31.54-12.17-83-12.24l-32.26-.04v220.62l42.3-.3c33.1-.26 44.3-.77 51.57-2.33zm-50-64.74v-28.24h16.7c18.67 0 27.14 1.8 33.4 7.05 6.02 5.06 7.95 9.92 7.96 20.07 0 13-3.66 19.7-13.55 24.76-7.03 3.6-8.16 3.77-25.93 4.18l-18.58.44V349.7zm0-88.86V236.2l16.6.46c18.4.5 24.16 2.27 29.06 8.96 3.94 5.38 3.73 22.13-.36 28.7-4.98 8-10.8 10.1-29.32 10.66l-15.98.48v-24.62zm-192.5 134.68c2.58-11.5 5.24-23.05 5.9-25.62l1.22-4.7h57.35l2.74 12.2c1.5 6.7 4.14 18.23 5.85 25.62l3.1 13.44h23.22c18.02 0 23.1-.35 22.67-1.56-.3-.86-13.72-50.08-29.84-109.38l-29.3-107.8h-52.8l-3.4 12.8c-4.82 18.05-54.73 201.1-55.57 203.75-.64 2.03.95 2.2 21.72 2.2h22.4l4.7-20.95zm16.3-72.5c1.8-5.94 8.9-37.52 13.74-60.94 3.24-15.7 5.72-25.24 6.2-23.75.42 1.38 3.04 13.2 5.8 26.25 2.78 13.07 6.96 32.05 9.3 42.2l4.24 18.43h-19.97c-18.44 0-19.93-.16-19.32-2.18zm350.4 56.56V342.7h17.43c21.16 0 33.8-2.2 46.23-8.1 17.52-8.3 31.24-26.2 35.42-46.27 2.25-10.78 1.95-33.3-.57-43.12-6.4-24.85-22.82-40.23-48.65-45.5-7.68-1.58-18.28-2-51.7-2h-42.03v218.76h43.86v-36.88zm0-109.37v-32.5h16.68c19.82 0 27.7 1.87 33.87 8.02 5.55 5.55 7.54 13.1 6.83 26.04-1.3 23.42-11.5 30.95-41.96 30.95h-15.44v-32.5z"/></svg>

Before

Width:  |  Height:  |  Size: 2 KiB

View file

@ -1 +0,0 @@
<svg viewBox="0 0 25.3 25.3" xmlns="http://www.w3.org/2000/svg"><path fill="#68bc71" d="M12.651 0C8.697 0 3.927.93 0 2.977c0 4.42-.054 15.433 12.651 22.958C25.357 18.41 25.303 7.397 25.303 2.977 21.376.93 16.606 0 12.651 0Z"/><path fill="#67b279" d="M12.638 25.927C-.054 18.403 0 7.396 0 2.977 3.923.932 8.687.002 12.638 0v25.927Z"/><path fill="#fff" d="m12.19 17.305 7.65-10.311c-.56-.45-1.052-.133-1.323.113h-.01l-6.379 6.636-2.403-2.892c-1.147-1.325-2.705-.314-3.07-.047l5.535 6.5"/></svg>

Before

Width:  |  Height:  |  Size: 492 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 851 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 698 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 658 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 547 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 424 B

View file

@ -1 +0,0 @@
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="170.667" height="170.667" viewBox="0 0 128 128"><g fill="#bf3d27"><path d="M50 7.6C17.9 16.2-.7 48.9 8.7 80.3c4.3 14.6 16.5 29.2 29.5 35.5 32.7 15.9 71.2-.7 81.7-35.2 2.5-8.2 2.8-23.3.6-31.6-5.3-19.9-22-36.4-42-41.5-7.4-1.9-21.3-1.8-28.5.1zm24.2 8.5C96.4 20.7 113 41 113 63.4c0 13.8-4.6 25.1-14 34.6-24.2 24.3-64 17.5-78.6-13.5C3.3 48.4 35.1 7.9 74.2 16.1z"/><path d="M50.7 22c-15.7 5-27 18.3-29.9 35-4.3 25 14.6 49 40 50.7 16.6 1.2 30.9-5.7 40.3-19.4 13.6-19.7 7.5-48.8-12.9-61.7C77.8 20 62.6 18.2 50.7 22zM64 41" fill="#fff"/><path d="M51 20.8c-7.8 2.6-11.6 4.8-16.7 9.5C22.6 41 17.2 56.6 19.9 71.5c4.2 23 24.6 39 47.5 37.2 18.8-1.4 34.5-13.6 39.7-30.7 2.7-9.1 2.4-22.8-.9-31-4.4-11.1-14.3-20.9-25.2-25.1-7.8-3.1-22.6-3.6-30-1.1zm8.6 26.4c-2 2.9-3.6 6-3.6 6.8 0 .9 1.9 3.5 4.3 5.8l4.4 4.3 4.6-5c2.6-2.8 4.7-5.3 4.7-5.6 0-.3-1.8-3.3-4-6.6-2.3-3.2-3.7-5.9-3.3-5.9.5 0 3.2 1.6 6.1 3.6 4.2 2.7 5.9 3.4 8.1 2.9 3.1-.7 4.3.8 3.4 4.3-.3 1.3.8 3.9 3.1 7.3 2 3 3.6 5.7 3.6 6.2 0 .4-2.7-1-5.9-3.3-3.3-2.2-6.3-4-6.6-4-1.1 0-9.5 8.3-9.5 9.4 0 .6 3.4 4.5 7.6 8.7 6.7 6.7 7.3 7.7 5.9 8.9-1.4 1.2-2.6.3-9.6-6.6L65 70.5l-7.8 7.8c-7.9 7.9-9.8 8.9-10.9 6.1-.4-1.1 1.9-4 7.3-9.5l7.8-7.9-3.8-3.9c-2.1-2.2-4.7-4.1-5.7-4.4-1.1-.3-4 1-7.4 3.5-3.1 2.2-5.8 3.8-6 3.6-.2-.2 1.3-3 3.5-6.2 3-4.7 3.7-6.4 3-8.1-1.1-3 .5-4.5 4-3.8 2.1.4 4.1-.4 8.1-3.1 2.9-1.9 5.5-3.4 5.7-3.2.2.3-1.2 2.8-3.2 5.8z"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 88.32 129.93" preserveAspectRatio="xMinYMid"><defs><linearGradient id="New_Gradient_Swatch_1" x1="2.71" y1="20.04" x2="69.77" y2="20.04" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#12b212"/><stop offset="1" stop-color="#0f0"/></linearGradient><style>.cls-2{fill:#980200}.cls-3{fill:red}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="RedBerry"><path id="Leaf_Path" data-name="Leaf Path" d="M36.56 39.93C20.34 38.2 4 25.94 2.71 0c25.17 0 38.63 14.9 39.93 38.51 4.76-28.32 27.07-25 27.07-25 1.06 16.05-12.12 25.78-27.07 26.59-4.2-8.85-29.36-30.56-29.36-30.56a.07.07 0 0 0-.11.08s24.28 21.15 23.39 30.31" style="fill:url(#New_Gradient_Swatch_1)"/><path id="LeftBerry" class="cls-2" d="M44.16 129.93c-1.57-.09-16.22-.65-17.11-17.11-.72-10 7.18-17.37 7.18-27.08C32.44 61.53 0 64.53 0 85.74a19.94 19.94 0 0 0 5.83 14.14L30 124.06a19.94 19.94 0 0 0 14.14 5.83"/><path id="BottomBerry" class="cls-3" d="M88.32 85.75c-.09 1.57-.65 16.22-17.11 17.11-10 .72-17.38-7.18-27.08-7.18-24.21 1.79-21.21 34.22 0 34.22a19.94 19.94 0 0 0 14.14-5.83L82.46 99.9a19.94 19.94 0 0 0 5.83-14.14"/><path id="RightBerry" class="cls-2" d="M44.16 41.59c1.57.09 16.22.65 17.11 17.11.72 10-7.18 17.37-7.18 27.08 1.79 24.21 34.22 21.21 34.22 0a19.94 19.94 0 0 0-5.83-14.14L58.3 47.45a19.94 19.94 0 0 0-14.14-5.83"/><path id="TopBerry" class="cls-3" d="M.08 85.75c.09-1.57.65-16.22 17.11-17.11 10-.72 17.38 7.18 27.08 7.18 24.21-1.82 21.21-34.22 0-34.22a19.94 19.94 0 0 0-14.14 5.83L5.94 71.61A19.94 19.94 0 0 0 .11 85.75"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><linearGradient id="a"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient></defs><g stroke="#fff"><path fill="maroon" stroke-width="3" d="M1.5 36.78v54.44l35.28 35.28h54.44l35.28-35.28V36.78L91.22 1.5H36.78z"/><g style="text-align:center;line-height:125%;-inkscape-font-specification:Ubuntu" font-size="100.219" letter-spacing="0" word-spacing="0" text-anchor="middle" font-family="Ubuntu"><path d="M83.97 90.23c-2.03.56-4.7 1.16-8.05 1.8-3.33.62-7.2.94-11.57.94-3.8 0-7-.62-9.6-1.85-2.6-1.23-4.7-2.97-6.3-5.22-1.58-2.25-2.72-4.9-3.42-7.96-.7-3.05-1.05-6.44-1.05-10.17V37h8.85v28.66c0 6.68.96 11.46 2.86 14.34 1.9 2.88 5.1 4.32 9.6 4.32.96 0 1.94-.03 2.96-.1 1-.07 1.97-.16 2.85-.27.9-.1 1.7-.2 2.44-.3.73-.12 1.26-.24 1.57-.38V37h8.87z" style="-inkscape-font-specification:Ubuntu" fill="#fff" stroke-width="2"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 916 B

View file

@ -1 +0,0 @@
<svg viewBox="0 0 256 252" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid"><path d="M256 131.593c0-20.238-5.232-39.25-14.408-55.772 39.11-88.514-41.906-75.55-46.417-74.667-17.164 3.359-33.044 8.751-47.691 15.587-2.16-.122-4.334-.189-6.523-.189-54.665 0-100.423 38.128-112.134 89.241C57.639 73.47 77.802 60.428 89.877 55.21a274.318 274.318 0 0 0-5.67 5.218c-.618.583-1.213 1.175-1.822 1.761a284.903 284.903 0 0 0-3.638 3.545c-.71.707-1.4 1.42-2.1 2.133a307.038 307.038 0 0 0-3.145 3.235c-.734.77-1.45 1.541-2.17 2.312a286.466 286.466 0 0 0-2.865 3.104c-.73.807-1.45 1.613-2.168 2.422a319.307 319.307 0 0 0-4.796 5.52 331.84 331.84 0 0 0-2.45 2.927c-.714.864-1.426 1.726-2.125 2.589a341.74 341.74 0 0 0-2.234 2.794c-.716.902-1.431 1.802-2.13 2.703-.666.857-1.312 1.711-1.963 2.566-.735.967-1.476 1.933-2.191 2.894-.512.688-1.003 1.37-1.506 2.055a356.843 356.843 0 0 0-12.449 18.128c-.01.014-.02.028-.027.043a367.82 367.82 0 0 0-2.875 4.557c-.05.081-.102.163-.152.246a361.864 361.864 0 0 0-2.719 4.458l-.094.155a369.532 369.532 0 0 0-6.537 11.338C11.69 160.689 6.646 173.807 6.428 174.586c-32.718 116.97 69.396 67.575 83.645 60.201 15.343 7.58 32.615 11.846 50.888 11.846 50.021 0 92.58-31.93 108.422-76.519h-60.446c-8.944 15.11-26.163 25.345-45.945 25.345-28.984 0-52.479-21.96-52.479-49.05h164.54c.624-4.851.947-9.796.947-14.816zM234.51 18.386c9.907 6.687 17.852 17.187 4.207 52.55-13.088-21.048-32.778-37.559-56.181-46.634 10.646-5.141 37.01-16.016 51.974-5.916zM23.98 234.552c-8.07-8.275-9.496-28.429 8.31-65.154 8.985 25.835 26.916 47.482 50.092 61.22-11.526 6.345-42.126 20.629-58.402 3.934zm66.279-119.601c.92-26.329 23.834-47.41 51.987-47.41 28.153 0 51.068 21.081 51.988 47.41H90.259z" fill="#1EBBEE"/></svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 636 B

View file

@ -1 +0,0 @@
<svg width="470.52" height="475.29" viewBox="0 0 124.49 125.75" xmlns="http://www.w3.org/2000/svg"><g stroke="#000" stroke-width=".265"><path d="M.132 99.163h27.97L27.346.133h26.458v107.35l-15.119 18.142H.131z" fill="red"/><path d="M1.644 125.623z" fill="none"/><path d="m83.287 101.433 5.291 6.047h9.072l3.78-6.047V90.849L60.609 58.345V17.523L77.996.892h26.458l19.655 14.363 1 20.057-15.363-.403-12.852-9.071H88.58l-4.536 6.048v10.583l39.31 37.798.756 26.458-15.875 18.899H74.216L59.097 107.48l.498-13.278 15.377-.33z" fill="red"/></g></svg>

Before

Width:  |  Height:  |  Size: 542 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 617 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 476 B

View file

@ -1 +0,0 @@
<svg width="44.002" height="49.7" xmlns="http://www.w3.org/2000/svg"><path d="M44.002 15.1V7l-9.8-3.8v6.3l-4.5-1.8V2.8l-7.5-2.8-7.5 2.7v5.1l-5.5 1.6V3.7l-9.2 3.7v.5c0 .1-.1 8.4 1.1 15l.2.8 20.8-6.7 19.1 6.2c-.5 1.5-1.6 5-2.9 7.3l-16.1-5.7-18.4 6.1.3.8c.1.2 2.4 5.3 5.8 7.8l.3.2 12-3.6 10.4 3.6c-1.8 1.7-6.1 5.7-10.5 8.2l-2.5-1.8-2.6-.1 5 3.7.4-.2c6.1-3.4 11.8-9.3 12.1-9.6l.8-.9-13.3-4.4-11.7 3.5c-2.2-1.8-3.9-4.9-4.6-6.3l16.3-5.4 16.8 5.9.3-.5c1.9-2.9 3.6-8.6 3.6-8.8l.2-.7-20.9-6.8-19.5 6.2c-.9-5.4-1-11.6-1-13.4l6.2-2.5v5.4l8.5-2.4V3.7l6-2.2 6.1 2.3v4.9l7.5 3.1V5.5l6.8 2.6v6.5z"/></svg>

Before

Width:  |  Height:  |  Size: 590 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 403 B

View file

@ -1 +0,0 @@
<svg width="328.25" height="437.14" viewBox="0 0 86.85 115.66" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#d45500"><g stroke-width="3"><path d="M1.5 115.658V89.956M1.5 86.178V60.476M1.5 55.94V30.238M1.5 25.702V0"/></g><path d="M7.548 113.388h65.768M6.792 2.268H72.56" stroke-width="2.784"/><g stroke-width="3"><path d="M30.982 55.94V30.238M30.982 86.178V60.476M34.384 84.56l25.701.213M34.762 32.434l25.702.143M64.244 55.94V30.238M64.244 86.178V60.476M77.851 113.388l7.56-25.702M75.583 2.268 83.9 27.214"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 789 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 917 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 998 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 750 B

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" style="enable-background:new 0 0 56 56" xml:space="preserve" width="688" height="880"><rect id="backgroundrect" width="100%" height="100%" x="0" y="0" fill="none" stroke="none"/><style>.st1{fill:#fff}.st2{fill:#00bcd4}</style><g class="currentLayer"><g id="Ebene_2"><g id="Ebene_3"><path id="XMLID_16_" d="M344.118 799.57V87.968s162.091 10.996 282.455 50.268c0 0-1.605 127.24-1.605 252.91 0 175.936-138.017 364.44-280.85 398.999M687.558 92.68c-146.042-48.697-332.206-62.835-343.44-62.835-11.234 0-194.187 14.138-343.44 62.835V399c0 213.637 171.72 439.842 343.44 480.684 171.72-42.413 343.44-267.047 343.44-479.114V92.681" style="fill:#0097a7"/><path id="XMLID_15_" class="st1" d="M623.364 600.07 334.489 843.554l4.815-797.999 292.084 64.406z"/></g><g id="Ebene_2_1_"><path id="XMLID_12_" class="st2" d="M344.118 783.861V53.41s157.276 21.993 280.85 62.835c0 0 1.605 130.382 1.605 259.193 0 175.937-138.017 388.003-280.85 422.562M687.558 75.402C539.91 26.705 355.352 0 344.118 0S149.931 25.134.678 75.402V381.72c0 212.067 170.116 438.271 343.44 479.114 171.72-42.413 343.44-267.047 343.44-479.114V75.402"/></g><g id="Ebene_1_2_"><path id="XMLID_7_" class="st2" d="M559.17 400.57c0-114.673-94.687-210.495-215.052-210.495v42.413c17.654 25.134 30.493 51.839 40.122 83.256h-40.122v40.842h49.751c1.605 14.138 3.21 26.705 3.21 40.843s-1.605 28.275-3.21 40.842h-49.75v40.843h40.12c-9.628 29.846-24.072 58.122-40.12 83.256v42.413c117.154 3.142 215.05-89.54 215.05-204.213zm-49.751-43.984c3.21 14.138 4.814 26.705 4.814 40.843s-1.605 28.275-4.814 40.842h-73.824c1.605-14.138 3.21-26.704 3.21-40.842s-1.605-28.276-3.21-40.843h73.824zm-16.049-40.842h-62.59c-8.024-26.705-16.048-51.839-28.887-73.83 36.912 12.566 69.01 39.27 91.477 73.83zm-94.686 241.913c12.838-23.563 22.468-48.697 28.887-75.402h62.59c-19.259 36.13-51.356 62.835-91.477 75.402z"/><path id="XMLID_2_" class="st1" d="M344.118 607.925V565.51c-17.653-25.134-30.492-51.838-40.121-83.256h40.121v-40.842h-49.75c-1.605-14.138-3.21-26.705-3.21-40.843s1.605-28.275 3.21-40.842h49.75v-40.842h-40.121c9.63-29.847 24.073-58.122 40.121-83.256v-42.414c-117.154 0-215.05 92.681-215.05 210.496 0 111.532 97.896 204.213 215.05 204.213zm-93.081-251.339c-1.605 14.138-3.21 26.705-3.21 40.843s1.605 28.275 3.21 40.842h-72.219c-3.21-14.138-4.814-26.704-4.814-40.842s1.604-28.276 4.814-40.843h72.219zm38.516-114.673c-12.839 23.563-22.468 48.697-28.887 73.83h-62.59c19.259-34.558 51.356-61.263 91.477-73.83zm-94.686 240.342h62.59c8.023 26.705 16.048 51.839 28.887 75.402-36.912-12.567-69.01-39.272-91.477-75.402z"/></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 565 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 878 B

View file

@ -1 +0,0 @@
<svg viewBox="120 0 284 313" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient x1="4.234%" y1="71.381%" x2="100%" y2="71.381%" id="a"><stop stop-color="#878787" offset="0%"/><stop stop-color="#ACACAC" offset="27.284%"/><stop stop-color="#E7E7E7" offset="100%"/></linearGradient><linearGradient x1="0%" y1="50%" x2="98.418%" y2="63.304%" id="b"><stop stop-color="#A4A4A4" offset="0%"/><stop stop-color="#D5D5D5" offset="34.908%"/><stop stop-color="#E2E2E2" offset="64.127%"/><stop stop-color="#F6F6F6" offset="100%"/></linearGradient><linearGradient x1="100%" y1="50%" x2="0%" y2="50%" id="c"><stop stop-color="#999" offset="0%"/><stop stop-color="#636363" offset="100%"/></linearGradient></defs><g fill="none" fill-rule="evenodd"><g transform="translate(4 106)"><ellipse fill="url(#a)" cx="257.723" cy="179.693" rx="116.446" ry="27.876"/><path d="M116.47 168.114h-.024l.01-.157a4.027 4.027 0 0 1 .06-1.015L125.864 7.72h263.717l9.35 159.222a4.07 4.07 0 0 1 .059 1.015l.009.157h-.023c-1.37 12.829-64.087 23.158-141.254 23.158-77.167 0-139.884-10.33-141.254-23.158Z" fill="url(#b)"/><ellipse fill="#EDEDED" cx="257.723" cy="7.72" rx="131.858" ry="7.72"/></g><g opacity=".433" transform="translate(243 250)" fill="url(#c)" fill-rule="nonzero"><path d="M18.499 0C11.957 0 5.416 2.736.437 8.207a1.75 1.75 0 0 0 0 2.313c.29.32.672.48 1.053.48.381 0 .762-.16 1.053-.48 8.795-9.661 23.114-9.663 31.914 0 .582.64 1.524.64 2.106 0a1.75 1.75 0 0 0 0-2.313C31.583 2.736 25.04 0 18.5 0Z"/><path d="M18.998 9c-4.384.001-8.51 1.934-11.61 5.444-.517.586-.517 1.532 0 2.117.258.292.597.439.936.439.339 0 .678-.147.937-.439 2.6-2.943 6.06-4.565 9.74-4.566h.004c3.678 0 7.134 1.62 9.735 4.562.518.585 1.354.585 1.872 0 .517-.586.517-1.532 0-2.117C27.512 10.93 23.389 9 19.003 9h-.005Z"/><path d="M19 17c-2.057 0-4.114.746-5.682 2.237a.997.997 0 0 0 0 1.46c.212.202.49.303.767.303.276 0 .554-.101.768-.303 2.287-2.174 6.008-2.176 8.296 0 .424.404 1.109.404 1.533 0a.997.997 0 0 0 0-1.46C23.115 17.746 21.058 17 19.001 17Z"/></g><path d="M262.322 0C254.407 0 244.86 1.86 237 5.953c0 8.842-.108 30.867 25.322 45.917 25.432-15.05 25.324-37.075 25.324-45.917C279.786 1.86 270.238 0 262.322 0Z" fill="#68BC71"/><path d="M262.297 51.855C236.892 36.805 237 14.792 237 5.953 244.851 1.864 254.387.004 262.297 0v51.855Z" fill="#67B279"/><path d="m261.399 34.61 15.313-20.623c-1.123-.899-2.107-.264-2.649.227l-.02.001-12.767 13.272-4.81-5.785c-2.296-2.649-5.416-.628-6.145-.094L261.4 34.609" fill="#FFF"/></g></svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 713 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 867 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 470 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 583 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 693 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 881 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 705 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 866 B

View file

@ -1 +0,0 @@
<svg viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><linearGradient id="b" x1="203.72" x2="203.72" y1="7.704" y2="402.03" gradientTransform="matrix(1 0 0 -1 0 407.21)" gradientUnits="userSpaceOnUse" xlink:href="#a"/><filter id="c" x="-.013" y="-.013" width="1.026" height="1.026" color-interpolation-filters="sRGB"><feGaussianBlur stdDeviation="2.169"/></filter></defs><path d="M128.128.349c-39.678 0-87.54 9.163-126.94 29.333 0 43.562-.544 152.081 126.94 226.235 127.492-74.152 126.95-182.679 126.95-226.235C215.674 9.512 167.812.35 128.129.35z" fill="#68bc71"/><path d="M127.998 255.841C.636 181.691 1.188 73.221 1.188 29.675 40.548 9.527 88.348.362 127.998.342v255.492z" fill="#67b279"/><path d="M123.503 170.877 200.267 69.27c-5.625-4.428-10.559-1.303-13.275 1.116l-.1.008-64.005 65.391-24.116-28.501c-11.505-13.054-27.145-3.097-30.798-.466l55.53 64.06" fill="#fff"/><path d="m12.718 172.52 35.682-4.845.016 34.312-35.665.203zm35.665 33.421.028 34.342-35.665-4.888-.002-29.684zm4.325-38.899 47.311-6.884v41.393l-47.31.375zm47.322 39.222-.01 41.207-47.312-6.657-.066-34.627z" fill="#00adef" stroke-width=".998"/><g><g transform="matrix(.2092 0 0 .2087 149.39 161.23)" fill="#4d4d4d" filter="url(#c)"><path class="st0" d="M400.9 202.3c0-110-87.1-197.2-197.2-197.2C93.7 5.2 6.6 92.3 6.6 202.3s87.1 197.2 197.2 197.2 197.1-87.1 197.1-197.2z"/></g><g fill="url(#b)" transform="matrix(.2092 0 0 .21192 149.39 159.94)"><linearGradient id="a" x1="203.72" x2="203.72" y1="7.704" y2="402.03" gradientTransform="matrix(1 0 0 -1 0 407.21)" gradientUnits="userSpaceOnUse"><stop stop-color="#F2F2F2" offset="0"/><stop stop-color="#F7F7F7" offset=".596"/><stop stop-color="#FEFEFE" offset="1"/></linearGradient><path class="st0" d="M400.9 202.3c0-110-87.1-197.2-197.2-197.2C93.7 5.2 6.6 92.3 6.6 202.3s87.1 197.2 197.2 197.2 197.1-87.1 197.1-197.2z"/></g><g fill="#515151"><path class="st1" d="M196.188 189.143h.042v1.462h1.653v-6.04c0-.445-.084-.826-.251-1.187s-.398-.657-.712-.91-.67-.446-1.109-.573-.9-.212-1.443-.212c-.481 0-.941.064-1.36.212-.418.127-.774.318-1.088.572s-.544.53-.732.869-.272.7-.293 1.08h1.632c.042-.19.105-.36.21-.508s.23-.297.376-.402.335-.191.544-.255.418-.085.648-.085c.586 0 1.025.128 1.36.403.314.254.481.657.481 1.166v.678l-2.343.127c-1.088.064-1.904.318-2.468.763s-.858 1.038-.858 1.822c0 .403.063.763.21 1.081s.355.594.606.827.565.402.92.53.753.19 1.193.19c.293 0 .585-.042.857-.106s.544-.17.774-.318c.23-.127.44-.296.649-.487.21-.254.377-.466.502-.7zm-.67-.424c-.209.17-.439.318-.71.424s-.586.148-.9.148c-.502 0-.9-.106-1.193-.34s-.439-.529-.439-.91.146-.7.46-.912c.293-.212.753-.339 1.36-.381l2.113-.148v.678c0 .296-.063.55-.167.805-.168.254-.314.466-.523.636zM207.652 208.406l-2.866-.72c-3.493-.89-4.937-2.056-4.937-4.006 0-2.48 2.28-4.196 5.586-4.196s5.543 1.696 5.795 4.45h3.744c-.146-4.577-3.975-7.777-9.456-7.777-5.606 0-9.56 3.179-9.56 7.735 0 3.709 2.217 5.976 7.134 7.205l3.41.848c3.493.89 5 2.204 5 4.366 0 2.5-2.49 4.323-5.942 4.323-3.598 0-6.234-1.823-6.527-4.599h-3.765c.272 4.832 4.225 7.905 10.02 7.905 6.213 0 10.126-3.115 10.126-8.117-.063-3.899-2.302-6.082-7.762-7.417zM188.657 190.605v-5.998c0-.445-.063-.847-.21-1.186s-.313-.657-.564-.912-.544-.445-.9-.593-.732-.212-1.171-.212c-.314 0-.607.043-.879.127s-.544.191-.774.34-.44.338-.628.53-.334.444-.439.72h-.042c-.167-.551-.48-.975-.9-1.272s-.94-.445-1.547-.445a3.59 3.59 0 0 0-.816.106 2.37 2.37 0 0 0-.712.318 2.612 2.612 0 0 0-.962 1.166h-.042v-1.484h-1.652v8.816h1.631v-5.404c0-.275.147-.55.23-.784s.21-.445.377-.636c.167-.17.356-.318.586-.424s.481-.148.732-.148.481.042.69.127.377.19.523.34.251.317.335.529.126.445.126.678v5.722h1.715v-5.468c0-.275.042-.55.147-.784.083-.233.209-.445.376-.614s.356-.297.565-.403c.23-.085.46-.148.732-.148.544 0 .962.17 1.255.466.293.318.44.763.44 1.335v5.574zM180.226 196.157c-7.594 0-12.364 5.362-12.364 13.902s4.77 13.902 12.364 13.902 12.364-5.362 12.364-13.902c-.021-8.54-4.77-13.902-12.364-13.902zm0 24.37c-5.209 0-8.473-4.047-8.473-10.468 0-6.442 3.264-10.49 8.473-10.49 5.188 0 8.473 4.048 8.473 10.49-.021 6.421-3.285 10.469-8.473 10.469zM202.13 183.993c.209-.254.439-.466.732-.615s.606-.212.962-.212a2.259 2.259 0 0 1 1.423.466c.167.149.313.319.418.53s.188.424.23.657h1.653c-.042-.423-.147-.826-.335-1.208s-.44-.699-.753-.996c-.314-.275-.712-.508-1.15-.678s-.942-.254-1.507-.254c-.607 0-1.172.106-1.674.318s-.92.508-1.276.911-.627.869-.816 1.42-.293 1.166-.293 1.865.105 1.335.293 1.886.481 1.038.837 1.42.795.678 1.297.89 1.067.318 1.674.318c.523 0 1.004-.085 1.443-.212s.816-.36 1.15-.615c.315-.275.587-.593.796-.975s.335-.805.376-1.25h-1.652c-.105.53-.335.911-.69 1.187s-.817.403-1.381.403c-.356 0-.67-.064-.963-.212a1.83 1.83 0 0 1-.732-.594c-.21-.254-.356-.572-.481-.953-.105-.382-.167-.806-.167-1.272s.062-.869.167-1.25c.063-.403.21-.72.418-.975z"/></g></g><style>.st0{fill:url(#a)}.st1{fill:#515151}</style></svg>

Before

Width:  |  Height:  |  Size: 4.8 KiB

View file

@ -1 +0,0 @@
<svg viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M128.506 1.222c-38.817 0-85.639 9.128-124.183 29.22 0 43.392-.532 151.49 124.183 225.355C253.228 181.934 252.698 73.828 252.698 30.442c-38.55-20.092-85.372-29.22-124.192-29.22z" fill="#68bc71"/><path d="M128.378 255.722C3.784 181.86 4.324 73.812 4.324 30.435c38.504-20.07 85.266-29.2 124.054-29.22v254.5z" fill="#67b279"/><path d="m123.98 171.088 75.097-101.212c-5.503-4.411-10.33-1.298-12.987 1.112l-.097.008-62.615 65.137-23.592-28.391c-11.255-13.003-26.555-3.085-30.13-.464l54.326 63.811" fill="#fff"/><g><g transform="matrix(.4625 0 0 .4625 294.995 47.268)"><path d="M-299.04 399.58c-6.886 0-13.966 5.518-13.966 15.176 0 8.83 6.225 15.066 13.966 15.066 6.39 0 9.237-4.289 9.237-4.289v1.87c0 .883.836 1.87 1.87 1.87h4.618V400.24h-6.488v3.684s-2.871-4.344-9.237-4.344zm1.156 5.936c5.668 0 8.641 4.985 8.641 9.237 0 4.736-3.53 9.234-8.63 9.234-4.262 0-8.532-3.452-8.532-9.296 0-5.275 3.675-9.175 8.52-9.175zM-274.29 429.27c-.997 0-1.87-.715-1.87-1.87v-27.162h6.489v3.593c1.47-2.21 4.342-4.261 8.75-4.261 7.207 0 11.044 5.744 11.044 11.116v18.585h-4.509c-1.182 0-1.98-.99-1.98-1.98v-15.176c0-2.977-1.823-6.593-6.042-6.593-4.553 0-7.263 4.302-7.263 8.353v15.396zM-230.97 399.58c-6.886 0-13.966 5.518-13.966 15.176 0 8.83 6.225 15.066 13.966 15.066 6.39 0 9.237-4.289 9.237-4.289v1.87c0 .883.836 1.87 1.87 1.87h4.618v-43.548h-6.488v18.2s-2.871-4.344-9.237-4.344zm1.156 5.936c5.668 0 8.641 4.985 8.641 9.237 0 4.736-3.53 9.234-8.63 9.234-4.262 0-8.532-3.452-8.532-9.296 0-5.275 3.675-9.175 8.52-9.175zM-206.22 429.27c-.997 0-1.87-.715-1.87-1.87v-27.162h6.489v4.84c1.116-2.712 3.526-5.17 7.807-5.17 1.194 0 2.31.22 2.31.22v6.709s-1.394-.55-3.08-.55c-4.552 0-7.037 4.302-7.037 8.353v14.63zM-152.12 429.27c-.997 0-1.87-.715-1.87-1.87v-27.162h6.489v29.032zM-128.48 399.58c-6.886 0-13.966 5.518-13.966 15.176 0 8.83 6.225 15.066 13.966 15.066 6.39 0 9.237-4.289 9.237-4.289v1.87c0 .883.836 1.87 1.87 1.87h4.619v-43.548h-6.489v18.2s-2.871-4.344-9.237-4.344zm1.156 5.936c5.668 0 8.641 4.985 8.641 9.237 0 4.736-3.53 9.234-8.63 9.234-4.262 0-8.532-3.452-8.532-9.296 0-5.275 3.675-9.175 8.52-9.175z"/><circle cx="-150.8" cy="389.69" r="4.291"/><path d="M-174.38 399.57c-7.211 0-15.134 5.383-15.134 15.134 0 8.886 6.748 15.118 15.118 15.118 10.315 0 15.352-8.292 15.352-15.062 0-8.307-6.486-15.19-15.336-15.19zm.024 6.059c4.986 0 8.706 4.02 8.706 9.093 0 5.162-3.949 9.145-8.692 9.145-4.402 0-8.682-3.583-8.682-9.058 0-5.567 4.07-9.18 8.667-9.18z"/></g><path d="m263.84 306.59 21.933-37.994c1.238-2.13.49-4.836-1.612-6.073-2.101-1.238-4.836-.519-6.045 1.611l-22.22 38.484c-16.955-7.742-36.038-12.06-56.56-12.06-20.524 0-39.607 4.318-56.56 12.06l-22.222-38.484a4.431 4.431 0 0 0-6.073-1.611 4.431 4.431 0 0 0-1.612 6.073l21.933 37.994c-37.822 20.494-63.439 58.776-67.67 103.59h264.41c-4.231-44.816-29.849-83.098-67.699-103.59zm-125.21 66.461c-6.13 0-11.082-4.98-11.082-11.082 0-6.13 4.98-11.082 11.082-11.082 6.13 0 11.082 4.98 11.082 11.082.029 6.102-4.95 11.082-11.082 11.082zm121.38 0c-6.13 0-11.082-4.98-11.082-11.082 0-6.13 4.98-11.082 11.082-11.082 6.13 0 11.082 4.98 11.082 11.082.029 6.102-4.95 11.082-11.082 11.082z" fill="#34de19" style="fill:#32de84" transform="matrix(.35 0 0 .35 126.81 73.532)"/></g><path d="M179.13 200a3.801 3.801 0 0 1-3.788 3.801 3.801 3.801 0 0 1-3.814-3.774 3.801 3.801 0 0 1 3.76-3.828 3.801 3.801 0 0 1 3.842 3.747l-3.801.054z" fill="#fff"/></svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="456" height="455"><defs><linearGradient id="a" x1="21.587%" x2="76.116%" y1="5.709%" y2="100.496%"><stop stop-opacity=".2" offset="0%"/><stop stop-opacity=".05" offset="79.08%"/></linearGradient></defs><g fill="none"><path fill="#EF3939" d="M228 454.3c99.7 0 155.1 0 191.4-36.1 36.2-36.1 36.2-91.3 36.2-190.7 0-99.4 0-154.6-36.2-190.7C383.1.8 327.7.8 228 .8S72.9.8 36.6 36.9C.4 73 .4 128.2.4 227.6c0 99.4 0 154.6 36.2 190.7 36.3 36 91.7 36 191.4 36z"/><path fill="url(#a)" d="M376 143.7c-21.8-38.1-58.3-67.8-104.2-80.1C180.7 39.3 87.1 93.1 62.7 183.8c-12.3 45.6-4.7 91.9 17.5 129.7.3.5.6 1.1 1 1.6l80.2 138.5c13.3.4 27.7.5 43.2.5h22.6c44.3 0 79.9 0 109-3.2 36.3-4 62.3-12.9 82.4-32.9 29.3-29.2 34.9-71 36-138.7-46.8-80.8-78.5-135.5-78.6-135.6z"/><path fill="#FFF" d="M347.8 107.6c-66.5-66.4-174.4-66.4-241 0-66.5 66.4-66.5 174 0 240.3 66.5 66.4 174.4 66.4 241 0s66.6-174 0-240.3zm-10.2 78.1c-28.1 48.7-56.2 97.4-84.3 146.2-5.2 9.1-12.8 14.5-23.2 15.3-11.6.8-20.8-4.1-26.7-14.1-17.8-30.5-35.4-61.2-53-91.8-10.7-18.6-21.5-37.2-32.2-55.9-10.8-18.8 1.4-41.7 23-42.8 11.4-.6 20.2 4.7 26 14.6 7.9 13.5 15.7 27.2 23.6 40.8 5.7 9.8 11.2 19.7 17 29.3 8.4 14.1 20.8 22 37.3 23 23.3 1.4 45-15.5 47.8-40.2.2-1.8.3-3.7.4-4.6-.1-8-1.6-14.8-4.8-21.1-8.7-17.4.6-36.9 19.5-41.1 15.4-3.4 31.4 7.9 33.4 23.5 1 6.7-.4 13-3.8 18.9z"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View file

@ -1,9 +0,0 @@
declare module "*.svg" {
const content: any;
export default content;
}
declare module "*.png" {
const content: any;
export default content;
}

View file

@ -1,95 +0,0 @@
import img01 from "./01-uBlock-Origin.svg";
import img02 from "./02-Adblock-Plus.svg";
import img03 from "./03-AdGuard.svg";
import img04 from "./04-DNS66.png";
import img05 from "./05-Nano-Adblocker.png";
import img06 from "./06-AdBlock.png";
import img07 from "./07-AdAway.png";
import img08 from "./08-Personal-Blocklist.png";
import img10 from "./10-Redirector.png";
import img11 from "./11-Hosts-File-Editor.png";
import img12 from "./12-Gas-Mask.png";
import img13 from "./13-MinerBlock.svg";
import img14 from "./14-Pi-hole.svg";
import img15 from "./15-uBlock.svg";
import img16 from "./16-Internet-Explorer-TPL.svg";
import img17 from "./17-Google-Hit-Hider-by-Domain.svg";
import img18 from "./18-FireHOL.png";
import img19 from "./19-Samsung-Knox.svg";
import img20 from "./20-Little-Snitch.png";
import img21 from "./21-Privoxy.png";
import img22 from "./22-Diversion.svg";
import img23 from "./23-dnsmasq.png";
import img24 from "./24-Slimjet.png";
import img25 from "./25-uMatrix.png";
import img26 from "./26-Blokada.png";
import img27 from "./27-hostsmgr.png";
import img28 from "./28-personalDNSfilter.svg";
import img29 from "./29-Unbound.png";
import img30 from "./30-BIND.png";
import img31 from "./31-AdGuard-Home.svg";
import img32 from "./32-AdNauseam.png";
import img33 from "./33-Legacy-Unix-Derivatives.png";
import img34 from "./34-Windows-command-line.png";
import img35 from "./35-Shadowsocks.png";
import img36 from "./36-ShadowsocksR.png";
import img37 from "./37-Shadowrocket.png";
import img38 from "./38-DNSRedirector.png";
import img39 from "./39-pfBlockerNG.png";
import img40 from "./40-Opera.png";
import img41 from "./41-Surge.png";
import img42 from "./42-dnscrypt-proxy.png";
import img43 from "./43-SmartDNS.png";
import img44 from "./44-AdGuard-for-WindowsMac.svg";
import img45 from "./45-AdGuard-for-Android.svg";
import img46 from "./46-Vivaldi.svg";
import img47 from "./47-PolishCookieConsent.png";
export {
img01,
img02,
img03,
img04,
img05,
img06,
img07,
img08,
img10,
img11,
img12,
img13,
img14,
img15,
img16,
img17,
img18,
img19,
img20,
img21,
img22,
img23,
img24,
img25,
img26,
img27,
img28,
img29,
img30,
img31,
img32,
img33,
img34,
img35,
img36,
img37,
img38,
img39,
img40,
img41,
img42,
img43,
img44,
img45,
img46,
img47,
};

View file

@ -1,4 +0,0 @@
import { SoftwareCloud } from "./SoftwareCloud";
import { SoftwareIcon } from "./SoftwareIcon";
export { SoftwareCloud, SoftwareIcon };

View file

@ -1,19 +0,0 @@
import { Syntax } from "../../interfaces/Syntax";
import { SyntaxTag } from "../SyntaxTag";
interface Props {
syntaxes: Syntax[];
showLabel?: boolean;
}
export const SyntaxCloud = (props: Props) =>
props.syntaxes && props.syntaxes.length ? (
<div>
{props.showLabel && (
<h3>{`Syntax${props.syntaxes.length > 1 ? "es" : ""}:`}</h3>
)}
{props.syntaxes.map((s: Syntax, i: number) => (
<SyntaxTag key={i} name={s.name} definitionUrl={s.url} />
))}
</div>
) : null;

View file

@ -1,3 +0,0 @@
import { SyntaxCloud } from "./SyntaxCloud";
export { SyntaxCloud };

View file

@ -1,19 +0,0 @@
import { Tag } from "antd";
import { Tag as TagInterface } from "../../interfaces/Tag";
interface Props {
tags: TagInterface[];
showLabel?: boolean;
}
export const TagCloud = (props: Props) =>
props.tags && props.tags.length ? (
<div>
{props.showLabel && <h3>{`Tag${props.tags.length > 1 ? "s" : ""}:`}</h3>}
{props.tags.map((t: TagInterface, i: number) => (
<Tag key={i} title={t.description}>
{t.name}
</Tag>
))}
</div>
) : null;

View file

@ -1,3 +0,0 @@
import { TagCloud } from "./TagCloud";
export { TagCloud };

View file

@ -1 +0,0 @@
export const SlugifyOptions = { remove: /[^a-zA-Z0-9- ]/g, lower: true };

View file

@ -1,23 +0,0 @@
import { useLanguages } from "./useLanguages";
import { useLicenses } from "./useLicenses";
import { useLists } from "./useLists";
import { useListDetails } from "./useListDetails";
import { useMaintainers } from "./useMaintainers";
import { useSearchColumnFilter } from "./useSearchColumnFilter";
import { useSoftware } from "./useSoftware";
import { useSyntaxes } from "./useSyntaxes";
import { useTablePageSizer } from "./useTablePageSizer";
import { useTags } from "./useTags";
export {
useLanguages,
useLicenses,
useLists,
useListDetails,
useMaintainers,
useSearchColumnFilter,
useSoftware,
useSyntaxes,
useTablePageSizer,
useTags,
};

View file

@ -1,11 +0,0 @@
import { useEffect, useState } from "react";
export const useApiData = <T extends {}>(url: string) => {
const [data, setData] = useState<T>();
useEffect(() => {
const fetchData = async () =>
(await fetch(url)).json().then((r) => setData(r));
fetchData();
}, [url]);
return data;
};

Some files were not shown because too many files have changed in this diff Show more