chore(web): reset web dir
25
web/.gitignore
vendored
|
|
@ -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*
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"endOfLine": "auto"
|
||||
}
|
||||
|
|
@ -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
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
|
@ -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>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
# https://www.robotstxt.org/robotstxt.html
|
||||
User-agent: *
|
||||
Disallow:
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
if (window.navigator.msPointerEnabled) {
|
||||
window.location = "https://filterlists.com/tpl.html";
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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();
|
||||
});
|
||||
150
web/src/App.tsx
|
|
@ -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()}
|
||||
<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>
|
||||
);
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
interface Props {
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export const Description = (props: Props) => <p>{props.description}</p>;
|
||||
|
|
@ -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}</>
|
||||
);
|
||||
|
|
@ -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;
|
||||
|
|
@ -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>
|
||||
);
|
||||
};
|
||||
|
|
@ -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 };
|
||||
};
|
||||
|
|
@ -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}</>
|
||||
);
|
||||
|
|
@ -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 />}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
import { ListsTable } from "./listsTable";
|
||||
|
||||
export { ListsTable };
|
||||
|
|
@ -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;
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
import { LanguageCloud } from "./LanguageCloud";
|
||||
|
||||
export { LanguageCloud };
|
||||
|
|
@ -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;
|
||||
};
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
import { ListInfoDrawer } from "./ListInfoDrawer";
|
||||
|
||||
export { ListInfoDrawer };
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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} />;
|
||||
};
|
||||
|
|
@ -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} />
|
||||
|
||||
{s.name} (
|
||||
{
|
||||
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} />
|
||||
(
|
||||
{
|
||||
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>
|
||||
{l.name} (
|
||||
{
|
||||
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>
|
||||
);
|
||||
};
|
||||
|
|
@ -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}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
|
@ -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;
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
import { ListsTableHoc } from "./ListsTableHoc";
|
||||
|
||||
export { ListsTableHoc as ListsTable };
|
||||
|
|
@ -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;
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
import { MaintainerCloud } from "./MaintainerCloud";
|
||||
|
||||
export { MaintainerCloud };
|
||||
|
|
@ -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} />;
|
||||
};
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
import { Maintainers } from "./Maintainers";
|
||||
|
||||
export { Maintainers };
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
.ant-card-body {
|
||||
display: none;
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
@ -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" },
|
||||
};
|
||||
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
Before Width: | Height: | Size: 851 B |
|
Before Width: | Height: | Size: 698 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 658 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 547 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 424 B |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
Before Width: | Height: | Size: 636 B |
|
|
@ -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 |
|
Before Width: | Height: | Size: 617 B |
|
Before Width: | Height: | Size: 476 B |
|
|
@ -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 |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 403 B |
|
|
@ -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 |
|
Before Width: | Height: | Size: 789 B |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 917 B |
|
Before Width: | Height: | Size: 998 B |
|
Before Width: | Height: | Size: 750 B |
|
|
@ -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 |
|
Before Width: | Height: | Size: 565 B |
|
Before Width: | Height: | Size: 520 B |
|
Before Width: | Height: | Size: 878 B |
|
|
@ -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 |
|
Before Width: | Height: | Size: 713 B |
|
Before Width: | Height: | Size: 867 B |
|
Before Width: | Height: | Size: 470 B |
|
Before Width: | Height: | Size: 583 B |
|
Before Width: | Height: | Size: 693 B |
|
Before Width: | Height: | Size: 633 B |
|
Before Width: | Height: | Size: 442 B |
|
Before Width: | Height: | Size: 521 B |
|
Before Width: | Height: | Size: 881 B |
|
Before Width: | Height: | Size: 705 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 866 B |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
Before Width: | Height: | Size: 12 KiB |
|
|
@ -1,9 +0,0 @@
|
|||
declare module "*.svg" {
|
||||
const content: any;
|
||||
export default content;
|
||||
}
|
||||
|
||||
declare module "*.png" {
|
||||
const content: any;
|
||||
export default content;
|
||||
}
|
||||
|
|
@ -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,
|
||||
};
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
import { SoftwareCloud } from "./SoftwareCloud";
|
||||
import { SoftwareIcon } from "./SoftwareIcon";
|
||||
|
||||
export { SoftwareCloud, SoftwareIcon };
|
||||
|
|
@ -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;
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
import { SyntaxCloud } from "./SyntaxCloud";
|
||||
|
||||
export { SyntaxCloud };
|
||||
|
|
@ -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;
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
import { TagCloud } from "./TagCloud";
|
||||
|
||||
export { TagCloud };
|
||||
|
|
@ -1 +0,0 @@
|
|||
export const SlugifyOptions = { remove: /[^a-zA-Z0-9- ]/g, lower: true };
|
||||
|
|
@ -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,
|
||||
};
|
||||
|
|
@ -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;
|
||||
};
|
||||