This commit is contained in:
Eduard Ursu 2023-01-29 11:38:29 +01:00
parent e4d834f4ae
commit bc0d2a2192
145 changed files with 25244 additions and 6261 deletions

1
.eslintignore Normal file
View file

@ -0,0 +1 @@
node_modules/

21
.eslintrc.js Normal file
View file

@ -0,0 +1,21 @@
module.exports = {
env: {
browser: true,
es6: true
},
extends: ['eslint:recommended', 'prettier'],
plugins: ['prettier'],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly'
},
parserOptions: {
ecmaVersion: 2021,
sourceType: 'module'
},
rules: {
'prettier/prettier': 'error',
'no-unused-vars': 0,
'no-undef': 0,
}
}

41
.github/workflows/deploy.yml vendored Normal file
View file

@ -0,0 +1,41 @@
name: Deploy to gh-pages
on:
push:
branches:
- main
workflow_dispatch:
jobs:
gh-pages-deploy:
name: Deploying to gh-pages
runs-on: ubuntu-latest
steps:
- name: Setup Node.js for use with actions
uses: actions/setup-node@v3
with:
version: 16.x
env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
- name: Checkout branch
uses: actions/checkout@v2
env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
- name: Clean install dependencies
run: npm install
env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
- name: Build app
run: npm run build
env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
- name: deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./dist
env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'

8
.gitignore vendored Normal file
View file

@ -0,0 +1,8 @@
/node_modules
/dist
/.vscode
.DS_Store
.env
.env.local
.env.development

8
.prettierrc.js Normal file
View file

@ -0,0 +1,8 @@
module.exports = {
printWidth: 80,
semi: false,
singleQuote: true,
tabWidth: 4,
trailingComma: 'none',
useTabs: true
}

613
404.html
View file

@ -1,613 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title> 404 - Not Found</title>
<link rel="shortcut icon" href="./src/svg/toolz.svg" type="image/svg+xml">
<title>Ad Blocker Test</title>
<style>
/* ---------------- Basic resets and improvements --------------- */
*,
*:after,
*:before {
box-sizing: border-box;
border-spacing: 0;
}
html,
[data-theme=light] {
--black: #000;
--white: #fff;
--green: #2ECC40;
--blue: #0074D8;
--red: #FF4132;
--orange: #FF851A;
--yellow: #ffcd36;
--primary: #f3535b;
--accent: #E3F2FD;
--active: #ECEFF1;
--txt: #14191f;
--txt-r: var(--white);
--bg: #ffffff;
--bg2: #f9fafb;
--bg3: #edf0f2;
--brd: #C4CDD5;
--brd2: #a8afb6;
--bg-nav: var(--bg);
--bg-nav-hover: var(--bg2);
--bb-nav: var(--primary);
--bg-input: var(--bg2);
--brd-input: var(--bg2);
--bg-btn: var(--primary);
--bg-btn-hover: inset 0 0 100px 100px #ffffff20;
--txt-btn: var(--white);
--brd-btn: var(--primary);
--bg-card: var(--bg);
--b-shadow: #95abbb;
--bg-details: var(--bg2);
--bg-details-open: var(--primary);
--txt-details-open: var(--txt-r);
--bg-aside: transparent;
--shadow-aside: none;
--bg-tabs: var(--bg);
--brd-tabs-l: var(--primary);
--brd-tabs: var(--bg2);
--bg-table: var(--bg);
--fake-brd-table: inset 0 0px 0px 1px rgb(0 0 0 / 16%);
--bg-table-hover: var(--bg3);
--brd-table: var(--bg3);
--shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22);
--radius: .4rem;
--bg-square: #ffffff70;
}
[data-theme=dark] {
--black: #060609;
--white: #f2f4f7;
--blue: #4dacff;
--green: #67e5a8;
--red: #ff564d;
--orange: #ff9f4d;
--yellow: #ffd24d;
--primary: var(--white);
--txt: #f2f4f7;
--txt-r: #14191f;
--bg3: #2c3844;
--bg2: #242e37;
--bg: #14191f;
--bg-nav: var(--bg);
--bg-nav-hover: var(--bg2);
--bg-form: var(--bg2);
--bg-btn: var(--primary);
--bg-btn-hover: inset 0 0 100px 100px #00000033;
--brd-btn: var(--primary);
--txt-btn: var(--black);
--bg-card: var(--bg);
--bg-details: var(--bg2);
--bg-details2: var(--bg3);
--b-shadow: var(--black);
--bg-square: #00000070;
}
[data-theme=light] .light-icon,
[data-theme=dark] .dark-icon {
display: block !important;
}
.theme-icon {
display: none;
}
html {
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
font-size: 13pt;
scroll-behavior: smooth;
color: var(--txt);
background: var(--bg);
}
body,
html {
margin: 0;
padding: 0;
height: 100%;
}
body {
background-color: #f7b42c;
background-image: linear-gradient(315deg, #f7b42c 0%, #fc575e 74%);
}
hr {
border: 0;
border-top: 2px solid var(--brd);
}
section {
overflow-x: hidden;
padding: 0 1rem 6rem;
}
li,
dd {
margin-bottom: 0.4rem;
}
/* ------------------ Heading ----------------- */
h1,
h2,
h3,
h4,
h5,
h6 {
margin-top: 1.5rem;
}
h1 {
font-size: 2.6em;
}
h2 {
font-size: 2em;
}
h3 {
font-size: 1.7em;
}
h4 {
font-size: 1.5em;
}
h5 {
font-size: 1.2em;
}
h6 {
font-size: 1em;
}
p {
margin-bottom: 1.5rem;
}
p strong,
p b {
color: var(--txt);
}
h1+h2,
h2+h3,
h3+h4,
h4+h5,
h5+h6 {
margin: 0;
}
/* ------------------- Links ------------------ */
a {
color: var(--primary);
text-decoration: none;
cursor: pointer;
}
a:not([class*=btn]) {
border-bottom: 2px solid transparent;
}
a:not([class*=btn]):hover {
border-bottom: 2px solid currentColor;
}
/* ------------------ Header ------------------ */
header+.hero {
padding-top: 4rem;
}
.hero {
padding: 2rem 1rem;
text-align: center;
border-radius: var(--radius);
}
/* ------------ Animation On Scroll ----------- */
[class*=_aos],
._aos {
opacity: 0;
transition: opacity 1s, transform 1.3s;
}
._aos-zoom {
transform: scale(0.4);
}
._aos-left {
transform: translate3d(-100px, 0, 0);
}
._aos-right {
transform: translate3d(100px, 0, 0);
}
._aos-top {
transform: translate3d(0, -100px, 0);
}
._aos-bottom {
transform: translate3d(0, 100px, 0);
}
._aos-done {
opacity: 1;
transform: translateZ(0) scale(1);
}
@keyframes rotate-fade {
0% {
transform: translateY(0) rotate(0deg);
opacity: 1;
}
100% {
transform: translateY(-1000px) rotate(720deg) scale(0);
opacity: 0;
}
}
.squares {
position: fixed;
width: 100vw;
height: 100vh;
top: 0;
left: 0;
margin: 0;
padding: 0;
background: transparent;
overflow: hidden;
}
.squares li {
position: absolute;
display: block;
list-style: none;
width: 300px;
height: 150px;
bottom: -200px;
background-image: url('data:image/svg+xml,<svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg"><path d="M150.717 23.77c-20.252 0-36.667 16.415-36.667 36.667v29.127c0 20.251 16.415 36.667 36.667 36.667 20.251 0 36.666-16.416 36.666-36.667v-29.13c0-20.258-16.408-36.664-36.666-36.664zm22 65.998c0 12.13-9.868 22-22 22-12.13 0-22-9.87-22-22V60.434c0-12.132 9.87-22 22-22 12.132 0 22 9.868 22 22zm117.676 3.154a7.334 7.334 0 01-7.333 7.333h-7.334v18.741a7.334 7.334 0 01-14.666 0v-18.741h-51.334a7.344 7.344 0 01-6.199-3.412 7.342 7.342 0 01-.43-7.061l29.334-61.921c1.724-3.66 6.124-5.211 9.768-3.486a7.338 7.338 0 013.488 9.77l-24.374 51.443h39.747V53.001a7.334 7.334 0 0114.666 0v32.587h7.334c4.056 0 7.333 3.3 7.333 7.334zm-192.785 0a7.334 7.334 0 01-7.334 7.333h-7.333v18.74a7.334 7.334 0 01-14.667 0v-18.74H16.941a7.344 7.344 0 01-6.2-3.413 7.342 7.342 0 01-.43-7.06L39.646 27.86c1.725-3.66 6.125-5.21 9.769-3.485a7.338 7.338 0 013.488 9.77L28.527 85.587h39.747V53a7.334 7.334 0 0114.667 0v32.588h7.333c4.057 0 7.334 3.3 7.334 7.333z"/></svg>');
animation: rotate-fade 5s linear infinite;
}
.squares li:nth-child(0) {
left: 80%;
animation-delay: 1s;
}
.squares li:nth-child(1) {
left: 60%;
animation-delay: 4s;
}
.squares li:nth-child(2) {
left: 45%;
animation-delay: 8s;
}
.squares li:nth-child(3) {
left: 5%;
animation-delay: 12s;
}
.squares li:nth-child(4) {
left: 5%;
animation-delay: 16s;
}
.squares li:nth-child(5) {
left: 60%;
animation-delay: 20s;
}
.squares li:nth-child(6) {
left: 15%;
animation-delay: 24s;
}
main {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
margin: auto;
width: 100%;
max-width: 60rem;
padding: 0.5rem;
}
/* ---------------- Go Top Link --------------- */
.gt-link {
transition: all 0.25s ease-in-out;
position: fixed;
bottom: 0;
right: 0;
z-index: 1;
min-width: unset;
cursor: pointer;
visibility: visible;
opacity: 1;
}
.gt-link.hidden {
visibility: hidden;
opacity: 0;
}
/* ------------------ Buttons ----------------- */
button,
[class^=btn] {
display: inline-flex;
align-items: center;
text-align: center;
justify-content: center;
border: 0px;
color: var(--txt-btn);
background-color: var(--bg-btn);
outline: none;
padding: 0.6rem;
font-size: inherit;
cursor: pointer;
border-radius: var(--radius);
margin: 0.5rem;
height: 2.6rem;
min-width: 100px;
transition: all 0.2s ease-in-out;
-webkit-tap-highlight-color: transparent;
}
button:focus,
[class^=btn]:focus {
outline: none;
}
button.mw-auto,
[class^=btn].mw-auto {
min-width: unset;
}
button[disabled],
[class^=btn][disabled] {
opacity: 0.5;
pointer-events: none;
cursor: not-allowed;
}
button:not([disabled]):hover,
[class^=btn]:not([disabled]):hover {
box-shadow: var(--bg-btn-hover);
}
button.ghost,
[class^=btn].ghost {
background: transparent;
color: var(--txt);
border: 2px solid var(--bg-btn);
}
button.ghost:hover,
[class^=btn].ghost:hover {
background: var(--bg-btn);
color: var(--txt-btn) !important;
box-shadow: none;
}
button>svg,
[class^=btn]>svg {
display: block;
height: 1.3rem;
width: 1.3rem;
fill: currentColor;
max-height: 1.7rem;
}
/* ------------------- Card ------------------- */
.card {
display: flex;
flex-wrap: wrap;
flex-direction: column;
padding: 1rem;
background: var(--bg-card);
border-radius: var(--radius);
box-shadow: var(--shadow);
}
.card>* {
width: 100%;
margin: 0;
margin-top: .5rem;
}
.card>.img-w {
padding: 1rem;
box-shadow: 0 8px 20px -4px var(--b-shadow);
max-width: 100px;
border-radius: 50%;
margin: 15px auto 15px;
width: 100px;
height: 100px;
}
.card>p {
margin-bottom: 1rem;
}
._2-col {
display: grid;
grid-template-columns: 1fr 1fr;
gap: .5rem;
}
@media only screen and (min-width: 564px) {
._2-col {
grid-template-columns: 1fr 1fr 1fr;
}
}
</style>
</head>
<body>
<ul class="squares">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<main>
<div class="hero">
<div class="_aos-top">
<svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
<path
d="M150.717 23.77c-20.252 0-36.667 16.415-36.667 36.667v29.127c0 20.251 16.415 36.667 36.667 36.667 20.251 0 36.666-16.416 36.666-36.667v-29.13c0-20.258-16.408-36.664-36.666-36.664zm22 65.998c0 12.13-9.868 22-22 22-12.13 0-22-9.87-22-22V60.434c0-12.132 9.87-22 22-22 12.132 0 22 9.868 22 22zm117.676 3.154a7.334 7.334 0 01-7.333 7.333h-7.334v18.741a7.334 7.334 0 01-14.666 0v-18.741h-51.334a7.344 7.344 0 01-6.199-3.412 7.342 7.342 0 01-.43-7.061l29.334-61.921c1.724-3.66 6.124-5.211 9.768-3.486a7.338 7.338 0 013.488 9.77l-24.374 51.443h39.747V53.001a7.334 7.334 0 0114.666 0v32.587h7.334c4.056 0 7.333 3.3 7.333 7.334zm-192.785 0a7.334 7.334 0 01-7.334 7.333h-7.333v18.74a7.334 7.334 0 01-14.667 0v-18.74H16.941a7.344 7.344 0 01-6.2-3.413 7.342 7.342 0 01-.43-7.06L39.646 27.86c1.725-3.66 6.125-5.21 9.769-3.485a7.338 7.338 0 013.488 9.77L28.527 85.587h39.747V53a7.334 7.334 0 0114.667 0v32.588h7.333c4.057 0 7.334 3.3 7.334 7.333z" />
</svg>
</div>
<div class="_aos-bottom _txt-black">
<h2><strong>Not Found</strong></h2>
<h5>But maybe you are looking for one of these toolz !</h5>
</div>
</div>
<section>
<div class="_2-col" id="ext-grid">
<a href="https://d3ward.github.io/toolz/adblock.html">
<div class="card _aos-bottom _txt">
<div class="img-w"><svg version="1.0" fill="currentColor" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 106 106">
<path
d="M35 1.5c-9.1 2-22.1 6.3-25.9 8.6-4.3 2.6-4.9 4.8-4.6 16.6.8 25.7 13 51.2 32.8 68.7 8.2 7.2 13.1 10.6 15.5 10.6 4.9 0 20.6-13.4 29.6-25.4 12.6-16.7 18.8-35 19-55.9.1-10.6 0-10.9-2.6-13.2C95.7 8.8 87.9 5.7 77 2.8 67.2.2 44.4-.5 35 1.5zm36 6.6c7.5 1.4 22.7 6.6 23.7 8.2 1.1 1.8.5 14.1-1.1 22.2-2.3 11.6-8 25.8-14.1 35-4.6 7-18.5 21.4-23.4 24.4l-3.4 2-3.1-2.2C40 91.1 28.7 77.9 22.2 66c-3.6-6.6-8.7-20.7-9.7-27-.4-2.5-.9-5.2-1-6.1-.4-2-.7-10.2-.6-14.2.1-2.3.9-3.1 4.9-4.8 15.7-6.8 36.9-9 55.2-5.8z" />
<path
d="M44.7 13.6c-.1.1-2.4.4-5.2.8-5.8.7-14.8 3.2-18.9 5.3-2.9 1.5-2.9 1.5-2.3 9.1.6 9.1 3.3 21.2 5.1 23.8 1.3 1.7 1.5 1.7 6 0 2.5-1 4.6-2.2 4.6-2.7s.1-1.1.1-1.4c.1-.2.6-2.8 1-5.6C36.9 31.3 48.6 24 59.6 27.7 63.4 29 71 35.2 71 37.1c0 2.5 14.5-.3 16-3.1.5-1 1-4.1 1.1-7 .2-4.2-.2-5.6-1.7-6.7-2.3-1.7-13.6-5.2-18.9-5.9-4.2-.6-22.3-1.2-22.8-.8zM76.5 46.9c-2.3.5-3.3 1.5-4.5 4.7-5 13.2-19.1 17.9-29.7 9.8-3.1-2.3-3.6-2.4-6.9-1.2-5 1.8-5.9 3.9-3.7 8.6 2.5 5.3 18.2 21.2 21 21.2 2.9 0 14.1-10.5 19.9-18.6C79.4 61.9 85.8 47 83.1 47c-.5 0-1.5-.2-2.3-.4-.7-.2-2.6-.1-4.3.3z" />
</svg></div>
<h5 class="_txt-center">Adblock Test</h5>
</div>
</a>
<a href="https://d3ward.github.io/toolz/fontlist.html" >
<div class="card _aos-bottom _txt">
<div class="img-w"><svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor"
d="M216 120h272c13.3 0 24-10.7 24-24s-10.75-24-24-24H216c-13.3 0-24 10.75-24 24s10.7 24 24 24zm272 272H216c-13.3 0-24 10.7-24 24s10.75 24 24 24h272c13.25 0 24-10.75 24-24s-10.7-24-24-24zm0-160H216c-13.3 0-24 10.7-24 24s10.75 24 24 24h272c13.3 0 24-10.7 24-24s-10.7-24-24-24zM191.384 208.425L116.16 29.321c-3.344-7.975-16.469-7.975-19.813 0L21.123 208.425c-2.302 5.472.273 11.776 5.744 14.069a10.73 10.73 0 0014.07-5.745l15.129-36.022h100.388l15.13 36.022c1.71 4.124 5.695 6.587 9.904 6.587 1.386 0 2.799-.266 4.156-.84 5.471-2.295 8.068-8.608 5.74-14.07zM65.115 159.216l41.15-98.373 41.158 98.015H65.115zM153.843 356.303c10.402-10.045 16.92-24.107 16.92-39.687 0-30.523-24.822-55.358-55.358-55.358h-62.5c-5.915 0-10.714 4.8-10.714 10.715v178.571c0 5.938 4.8 10.714 10.714 10.714h76.786c30.536 0 55.357-24.821 55.357-55.357 0-21.83-12.812-40.58-31.205-49.598zM63.62 282.687h51.785c18.71 0 33.929 15.219 33.929 33.929s-15.223 33.928-33.929 33.928H63.62zM129.69 439.83H63.62v-67.857h66.071c18.71 0 33.929 15.218 33.929 33.928 0 18.71-15.224 33.929-33.929 33.929z" />
</svg></div>
<h5 class="_txt-center">FontList</h5>
</div>
</a>
<a href="https://d3ward.github.io/toolz/units.html" >
<div class="card _aos-bottom _txt">
<div class="img-w">
<svg fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor"
d="M464 272h-224v-224C240 21.6 218.4 0 192 0H48C21.6 0 0 21.6 0 48v416C0 490.4 21.6 512 48 512h416c26.4 0 48-21.6 48-48V320C512 293.6 490.4 272 464 272zM464 464h-416v-416H192v47.1H112c-8.836 0-16 7.162-16 16c0 8.836 7.164 16 16 16L192 128v64H112C103.2 192 96 199.2 96 208C96 216.8 103.2 224 112 224H192v64H112C103.2 288 96 295.2 96 304C96 312.8 103.2 320 112 320H192v80C192 408.8 199.2 416 208 416C216.8 416 224 408.8 224 400V320h64v80c0 8.836 7.164 16 16 16c8.838 0 16-7.164 16-16V320h64v80c0 8.836 7.164 16 16 16c8.838 0 16-7.164 16-16V320h48V464z">
</path>
</svg>
</div>
<h5 class="_txt-center">Units</h5>
</div>
</a>
</div>
</section>
<footer class="_bg _radius _aos">
<div class="cnt ">
<div class="grid">
<div>Icons by <b><a href="https://heroicons.dev/">Heroicons</a> (<a
href="https://github.com/tailwindlabs/heroicons/blob/master/LICENSE"
class="_txt-cl">MIT</a>)</b>
</div>
<div>
Designed by Eduard Ursu(<b><a href="https://d3ward.github.io">d3ward</a></b>) © 2021
</div>
<div>
Licensed under <b><a
href="https://creativecommons.org/licenses/by-nc-sa/4.0/">[NC-SA-4.0]</a></b>
</div>
</div>
</div>
</footer>
</main>
<button class="gt-link hide" id="gt-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6">
<path d="M12 6H0l6-6z" /></svg>
</button>
</body>
<script>
function aos() {
const t = this;
t.items = document.querySelectorAll("[class*=_aos]");
if (IntersectionObserver && t.items) {
let callback = function (entries) {
entries.forEach(entry => {
if (entry.isIntersecting && !entry.target.classList.contains('_aos-done')) {
entry.target.classList.add('_aos-done');
} else {
entry.target.classList.remove('_aos-done');
}
});
}
let observer = new IntersectionObserver(callback, {
root: null,
threshold: 0
});
t.items.forEach((item) => {
observer.observe(item);
});
}
}
function gotop() {
var t = this;
t.gt = document.getElementById('gt-link');
t.scrollToTop = function () {
window.scroll({
top: 0,
left: 0,
behavior: 'smooth'
});
}
t.listeners = function () {
window.addEventListener("scroll", () => {
let y = window.scrollY;
if (y > 0) {
t.gt.classList.remove("hidden");
} else {
t.gt.classList.add("hidden");
}
});
t.gt.onclick = function (e) {
e.preventDefault();
if (document.documentElement.scrollTop || document.body.scrollTop > 0) {
t.scrollToTop();
}
}
}
if (t.gt) {
t.listeners();
}
}
// Call the function when the DOM is loaded
document.addEventListener("DOMContentLoaded", () => {
new gotop();
new aos();
});
</script>
</html>

View file

@ -1,650 +0,0 @@
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="theme-color" content="#161625">
<link rel="apple-touch-icon" sizes="76x76" href="./resources/adblock/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="./resources/adblock/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="./resources/adblock/favicon-16x16.png">
<link rel="manifest" href="./resources/adblock/site.webmanifest">
<link rel="mask-icon" href="./resources/adblock/safari-pinned-tab.svg" color="#161625">
<link rel="shortcut icon" href="./resources/adblock/favicon.ico">
<meta name="msapplication-TileColor" content="#161625">
<meta name="msapplication-config" content="./resources/adblock/browserconfig.xml">
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
<title>Ad Blocker Test</title>
<link rel="stylesheet" href="./src/css/style.css">
<style>
body {
background-color: var(--bg);
background-image: none;
}
main {
padding-top: 6rem;
}
[data-theme=dark],
html,
[data-theme=light] {
--primary: var(--blue);
}
/*------------- Tests section -------------*/
.test {
background-color: var(--bg3);
color: var(--black);
padding: .4rem;
font-weight: bold;
box-shadow: var(--shadow);
border-radius: var(--radius);
text-align: center;
line-height: 60px;
transition: all 1s;
s
}
.testWrap h3,
.testWrap h5,
.test span {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 0;
}
.testWrap>div,
.test>div {
display: flex;
flex-direction: column;
gap: .5rem;
}
.testWrap svg {
height: 25px;
fill: var(--txt);
}
.test>div {
display: none;
}
.test>div>div {
user-select: none;
overflow-x: auto;
border-radius: var(--radius);
white-space: nowrap;
color: var(--black);
box-shadow: rgba(0, 0, 0, 0.02) 0px 1px 3px 0px, rgba(27, 31, 35, 0.15) 0px 0px 0px 1px;
}
.test>span svg {
fill: var(--black);
}
.test.show>div {
display: flex;
}
#bar {
width: 10em;
margin: auto;
}
.rp_text {
color: var(--txt) !important;
}
.cnt2 {
margin: auto;
max-width: 700px;
overflow-y: auto;
}
.cl_info {
margin: auto;
margin-top: 5px;
font-weight: bold;
width: 150px;
padding: 5px;
border-radius: .3rem;
text-align: center;
color: var(--black);
}
/* Toast message */
.toast-message {
position: fixed;
top: -100%;
left: 50%;
transform: translateX(-50%);
background-color: var(--blue);
border-radius: 10px;
width: 400px;
font-size: 16px;
transition: all .5s;
z-index: 9999;
box-shadow: var(--shadow);
}
@media (max-width: 424px) {
.toast-message {
width: calc(100% - 20px);
}
}
.toast-message.success {
background: var(--blue);
}
.toast-message .message {
color: var(--black);
padding: 20px 30px;
text-align: center;
}
/* Loading Wrapper */
.loadingWrap {
height: 100%;
width: 100%;
position: fixed;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background: var(--bg);
z-index: 5;
}
.loadingWrap svg {
max-width: 150px;
fill: var(--txt);
}
.loading {
display: flex;
width: 10em;
height: 10em;
margin-top: 3rem;
border: 10px solid transparent;
border-top-color: var(--green);
border-bottom-color: var(--green);
border-radius: 50%;
animation: spin 1.5s linear infinite;
}
#testingInfo {
width: 90%;
background: var(--bg2);
padding: .5rem;
margin: .5rem;
border-radius: .3rem;
}
.loading:before {
content: '';
display: block;
margin: auto;
width: 4em;
height: 4em;
border: 10px solid var(--red);
border-radius: 50%;
animation: pulse 1s alternate ease-in-out infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
._icon {
display: block;
height: 1.6rem;
fill: currentColor;
margin: 0 auto;
}
@keyframes pulse {
from {
transform: scale(0.5);
}
to {
transform: scale(1);
}
}
._notif {
background: var(--primary);
border-radius: var(--radius);
color: var(--txt-r);
margin: 1rem 0;
}
._notif svg {
height: 26px;
fill: currentColor;
}
._notif>span {
display: flex;
align-items: center;
justify-content: flex-end;
}
._notif>div {
padding: 0 1rem;
padding-bottom: 1.5rem;
}
</style>
</head>
<body class="_overflowhidden">
<div class="loadingWrap">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30">
<path
d="M12.787 29.698c-2.052-1.173-5.508-4.364-7.216-6.664C1.848 18.021-.01 12.477 0 6.418c.005-2.713.165-3.071 1.69-3.776C4.147 1.507 6.935.68 9.827.23c1.967-.307 5.99-.307 7.956 0 3.814.594 8.5 2.205 9.35 3.213.455.542.53 1.201.442 3.903-.077 2.353-.264 3.7-.815 5.891-1.476 5.862-4.997 11.208-9.906 15.04-2.287 1.786-2.996 2.034-4.067 1.421zm1.748-1.842c1.52-1.031 3.765-3.136 5.155-4.832 3.852-4.703 6.089-10.982 6.098-17.124.002-1.364-.046-1.426-1.584-2.038-3.637-1.449-6.481-2.001-10.334-2.007-3.798-.005-6.664.524-10.19 1.88-1.704.655-1.86.837-1.86 2.174.001 6.13 2.232 12.383 6.111 17.13 1.785 2.184 5.173 5.16 5.874 5.16.123 0 .452-.154.73-.343zm-1.928-2.936c-1.83-1.503-4.388-4.402-5.077-5.754-.297-.58-.245-1.232.123-1.542.124-.105.656-.38 1.182-.61l.957-.418.583.537c1.743 1.606 4.489 1.874 6.446.63 1.317-.839 2.356-2.353 2.541-3.704.077-.558.086-.567.745-.712 2.384-.524 2.799-.212 2.118 1.595-1.327 3.523-3.821 7.049-6.765 9.563-1.57 1.34-1.703 1.36-2.853.415zm-6.975-9.816c-.599-.42-1.502-4.042-1.737-6.962-.174-2.17-.108-2.314 1.31-2.86 2.765-1.063 5.24-1.492 8.6-1.492 3.368 0 5.835.429 8.617 1.5 1.382.53 1.489.761 1.306 2.829-.18 2.044-.21 2.07-2.734 2.486-1.02.168-1.872.282-1.892.254a49.76 49.76 0 01-.46-.724c-2.405-3.834-7.973-3.35-9.713.846-.166.403-.277 1.065-.326 1.95l-.074 1.34-1.166.516c-1.321.585-1.342.589-1.73.317z" />
</svg>
<h5>Testing..</h5>
<div id="testingInfo"></div>
<span class="loading"></span>
</div>
<div class="toast-message">
<div class="message">This is an Alert!</div>
</div>
<!-- Modal Box -->
<div class="modal" id="info-modal">
<div>
<header>
<h3></h3>
<button class="close-modal">Close</button>
</header>
<hr>
<div>
<h2>How does it work?</h2>
<b class="_txt-red"><i>You will not see any ads and no trackers will be activated </i></b><br><br>
When you load this website, it will try to establishes connections in pure
Javascript with different urls (advertising, analytics, and social ads services) from a list.<br>
For each host , if the connection fails
it means that the latter has been blocked by your ad-blocker (e.g. uBlock Origin , Blokada , AdGuard ,
in-built adblocker) or DNS provider
<h3>How do I know if my ad blocker is working?</h3>
<p>
You will receive a percentage of how many connections you have blocked
Basically if you get a value <b class="_bg-green _radius _px"> > 40% </b> you are ok as long as you
block ads and analytics category<br>
If you get <b class="_bg-red _radius _px">
< 40%</b> , you're probably not using an <i>effective</i> adblock or
you're not making the most of its potential
</p>
<h2>How i can have 100%</h2>
<p>
You can reach 100 % using a small list that I created to cover all the tests in this website
<button
onclick="copyToClip('https://raw.githubusercontent.com/d3ward/toolz/master/src/d3host.txt')">Copy
d3Host list to clipboard</button>
<br><br>
<b class="_txt-green"><i>This list and this test is a beta project
I do not take any responsibility if something stops working , example Social apps or your
favorite blog
</i></b>
</p>
<h3>Suggested solutions for ad-blocking</h3>
<div>
<a href="https://adguard.com/" class="btn">Adguard</a>
<a href="https://blokada.org/" class="btn">Blokada </a>
<a href="https://ublockorigin.com/" class="btn">uBlock Origin </a>
<a href="https://nextdns.io/" class="btn">Next DNS</a>
</div>
<p>
<h3>Other tools to test your adblock </h3>
<div class="cnt2">
<a href="https://ipleak.net/" class="btn">IP Leak </a>
<a href="https://blockads.fivefilters.org/" class="btn">Block Ads Test </a>
<a href="https://panopticlick.eff.org/" class="btn">Browser Fingerprint by EEF</a>
<a href="http://raymondhill.net/ublock/tiles1.html" class="btn">Adblock Testing by
raymondhill</a>
<a href="http://raymondhill.net/ublock/popup.html" class="btn">Popup Blocker by
raymondhill</a>
</div>
</p>
</div>
<hr>
<footer>
<button class="close-modal mw-100">
Ok
</button>
</footer>
</div>
</div>
<header class="fixed">
<nav>
<a href="adblock.html">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" fill="currentColor">
<path
d="M12.787 29.698c-2.052-1.173-5.508-4.364-7.216-6.664C1.848 18.021-.01 12.477 0 6.418c.005-2.713.165-3.071 1.69-3.776C4.147 1.507 6.935.68 9.827.23c1.967-.307 5.99-.307 7.956 0 3.814.594 8.5 2.205 9.35 3.213.455.542.53 1.201.442 3.903-.077 2.353-.264 3.7-.815 5.891-1.476 5.862-4.997 11.208-9.906 15.04-2.287 1.786-2.996 2.034-4.067 1.421zm1.748-1.842c1.52-1.031 3.765-3.136 5.155-4.832 3.852-4.703 6.089-10.982 6.098-17.124.002-1.364-.046-1.426-1.584-2.038-3.637-1.449-6.481-2.001-10.334-2.007-3.798-.005-6.664.524-10.19 1.88-1.704.655-1.86.837-1.86 2.174.001 6.13 2.232 12.383 6.111 17.13 1.785 2.184 5.173 5.16 5.874 5.16.123 0 .452-.154.73-.343zm-1.928-2.936c-1.83-1.503-4.388-4.402-5.077-5.754-.297-.58-.245-1.232.123-1.542.124-.105.656-.38 1.182-.61l.957-.418.583.537c1.743 1.606 4.489 1.874 6.446.63 1.317-.839 2.356-2.353 2.541-3.704.077-.558.086-.567.745-.712 2.384-.524 2.799-.212 2.118 1.595-1.327 3.523-3.821 7.049-6.765 9.563-1.57 1.34-1.703 1.36-2.853.415zm-6.975-9.816c-.599-.42-1.502-4.042-1.737-6.962-.174-2.17-.108-2.314 1.31-2.86 2.765-1.063 5.24-1.492 8.6-1.492 3.368 0 5.835.429 8.617 1.5 1.382.53 1.489.761 1.306 2.829-.18 2.044-.21 2.07-2.734 2.486-1.02.168-1.872.282-1.892.254a49.76 49.76 0 01-.46-.724c-2.405-3.834-7.973-3.35-9.713.846-.166.403-.277 1.065-.326 1.95l-.074 1.34-1.166.516c-1.321.585-1.342.589-1.73.317z" />
</svg>
</a>
<ul>
<li>
<a href="https://d3ward.github.io/toolz/">
<svg viewBox="0 0 12.002 12.7" class="_icon" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="prefix__a">
<stop offset="0" stop-color="#fc575e" />
<stop offset="1" stop-color="#f7b42c" />
</linearGradient>
</defs>
<g paint-order="stroke markers fill" stroke-width="10.32">
<path d="M8 4.22c.581-.065 3.977.236 3.961.314L5.19 8.361.034 8.214z"
fill-opacity=".831" />
<path
d="M3.579 4.385C1.42 4.27.047 2.012 0 0h3.982c3.437 0 4.025.013 4.24.044 2.282-.027 3.674 2.286 3.74 4.49M7.38 8.204c2.537.053 4.463 2.109 4.622 4.496l-7.9-.016c-1.18-.019-4.052-1.81-4.068-4.47" />
</g>
</svg> &nbsp;
Toolz - Home
</a>
</li>
<li>
<a class="bmc" target="_blank" href="https://www.buymeacoffee.com/dOWS9cU">
<svg role="img" class="_icon" id="bmac-icon" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24">
<title>Buy Me A Coffee icon</title>
<path
d="M20.216 6.415l-.132-.666c-.119-.598-.388-1.163-1.001-1.379-.197-.069-.42-.098-.57-.241-.152-.143-.196-.366-.231-.572-.065-.378-.125-.756-.192-1.133-.057-.325-.102-.69-.25-.987-.195-.4-.597-.634-.996-.788a5.723 5.723 0 00-.626-.194c-1-.263-2.05-.36-3.077-.416a25.834 25.834 0 00-3.7.062c-.915.083-1.88.184-2.75.5-.318.116-.646.256-.888.501-.297.302-.393.77-.177 1.146.154.267.415.456.692.58.36.162.737.284 1.123.366 1.075.238 2.189.331 3.287.37 1.218.05 2.437.01 3.65-.118.299-.033.598-.073.896-.119.352-.054.578-.513.474-.834-.124-.383-.457-.531-.834-.473-.466.074-.96.108-1.382.146-1.177.08-2.358.082-3.536.006a22.228 22.228 0 01-1.157-.107c-.086-.01-.18-.025-.258-.036-.243-.036-.484-.08-.724-.13-.111-.027-.111-.185 0-.212h.005c.277-.06.557-.108.838-.147h.002c.131-.009.263-.032.394-.048a25.076 25.076 0 013.426-.12c.674.019 1.347.067 2.017.144l.228.031c.267.04.533.088.798.145.392.085.895.113 1.07.542.055.137.08.288.111.431l.319 1.484a.237.237 0 01-.199.284h-.003c-.037.006-.075.01-.112.015a36.704 36.704 0 01-4.743.295 37.059 37.059 0 01-4.699-.304c-.14-.017-.293-.042-.417-.06-.326-.048-.649-.108-.973-.161-.393-.065-.768-.032-1.123.161-.29.16-.527.404-.675.701-.154.316-.199.66-.267 1-.069.34-.176.707-.135 1.056.087.753.613 1.365 1.37 1.502a39.69 39.69 0 0011.343.376.483.483 0 01.535.53l-.071.697-1.018 9.907c-.041.41-.047.832-.125 1.237-.122.637-.553 1.028-1.182 1.171-.577.131-1.165.2-1.756.205-.656.004-1.31-.025-1.966-.022-.699.004-1.556-.06-2.095-.58-.475-.458-.54-1.174-.605-1.793l-.731-7.013-.322-3.094c-.037-.351-.286-.695-.678-.678-.336.015-.718.3-.678.679l.228 2.185.949 9.112c.147 1.344 1.174 2.068 2.446 2.272.742.12 1.503.144 2.257.156.966.016 1.942.053 2.892-.122 1.408-.258 2.465-1.198 2.616-2.657.34-3.332.683-6.663 1.024-9.995l.215-2.087a.484.484 0 01.39-.426c.402-.078.787-.212 1.074-.518.455-.488.546-1.124.385-1.766zm-1.478.772c-.145.137-.363.201-.578.233-2.416.359-4.866.54-7.308.46-1.748-.06-3.477-.254-5.207-.498-.17-.024-.353-.055-.47-.18-.22-.236-.111-.71-.054-.995.052-.26.152-.609.463-.646.484-.057 1.046.148 1.526.22.577.088 1.156.159 1.737.212 2.48.226 5.002.19 7.472-.14.45-.06.899-.13 1.345-.21.399-.072.84-.206 1.08.206.166.281.188.657.162.974a.544.544 0 01-.169.364zm-6.159 3.9c-.862.37-1.84.788-3.109.788a5.884 5.884 0 01-1.569-.217l.877 9.004c.065.78.717 1.38 1.5 1.38 0 0 1.243.065 1.658.065.447 0 1.786-.065 1.786-.065.783 0 1.434-.6 1.499-1.38l.94-9.95a3.996 3.996 0 00-1.322-.238c-.826 0-1.491.284-2.26.613z" />
</svg></a>
<a href="https://github.com/d3ward">
<svg class="_icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<title>Github</title>
<path
d="M256,32C132.3,32,32,134.9,32,261.7c0,101.5,64.2,187.5,153.2,217.9a17.56,17.56,0,0,0,3.8.4c8.3,0,11.5-6.1,11.5-11.4,0-5.5-.2-19.9-.3-39.1a102.4,102.4,0,0,1-22.6,2.7c-43.1,0-52.9-33.5-52.9-33.5-10.2-26.5-24.9-33.6-24.9-33.6-19.5-13.7-.1-14.1,1.4-14.1h.1c22.5,2,34.3,23.8,34.3,23.8,11.2,19.6,26.2,25.1,39.6,25.1a63,63,0,0,0,25.6-6c2-14.8,7.8-24.9,14.2-30.7-49.7-5.8-102-25.5-102-113.5,0-25.1,8.7-45.6,23-61.6-2.3-5.8-10-29.2,2.2-60.8a18.64,18.64,0,0,1,5-.5c8.1,0,26.4,3.1,56.6,24.1a208.21,208.21,0,0,1,112.2,0c30.2-21,48.5-24.1,56.6-24.1a18.64,18.64,0,0,1,5,.5c12.2,31.6,4.5,55,2.2,60.8,14.3,16.1,23,36.6,23,61.6,0,88.2-52.4,107.6-102.3,113.3,8,7.1,15.2,21.1,15.2,42.5,0,30.7-.3,55.5-.3,63,0,5.4,3.1,11.5,11.4,11.5a19.35,19.35,0,0,0,4-.4C415.9,449.2,480,363.1,480,261.7,480,134.9,379.7,32,256,32Z" />
</svg>
</a>
<div id="info" data-toggle="info-modal" class="nav-item">
<svg class="_icon" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z"
clip-rule="evenodd"></path>
</svg>
</div>
<div class="nav-item theme-toggle">
<span class="light-icon theme-icon">
<svg class="_icon" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"></path>
</svg>
</span>
<span class="dark-icon theme-icon">
<svg class="_icon" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"
clip-rule="evenodd"></path>
</svg>
</span>
</div>
</li>
</ul>
<button>
<svg aria-hidden="true" version="1.1" viewBox="0 0 24 24">
<line x1="2" y1="4" x2="22" y2="4" id="top" />
<line x1="2" y1="12" x2="22" y2="12" id="middle-down" />
<line x1="2" y1="12" x2="22" y2="12" id="middle-up" />
<line x1="2" y1="20" x2="22" y2="20" id="bottom" />
</svg>
</button>
</nav>
</header>
<main>
<div class="_notif">
<span> <button onclick="closeNotif()">Close <svg fill="currentColor" viewBox="0 0 20 20"
xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
clip-rule="evenodd"></path>
</svg></button> </span>
<div>
Thank you all for the support and feedback!<br>
Recently I started to make some changes to the project structure, creating a homepage with all the
tools and soon will be available new test tools and if someone wants, can suggest a new test of any kind
on Github.<br><br>
For newcomers, this is not a test to compete for the most points, it is a tool to use as a reference to
see
how efficient your blocking system is (consider that with some DNS and browsers there may be problems).
</div>
</div>
<div class="card">
<div id="bar"></div>
<div class="cl_info _bg-green">Blocked Hosts</div>
<div class="cl_info _bg-red">Not Blocked</div>
<!-- Trigger/Open The Modal -->
<p>
Click on a test below to see details about urls <br>
Click on a url to copy to clipboard <br>
</p>
</div>
<div id="test" class="testWrap"></div>
<div id="test1" class="testWrap"></div>
<footer class="_bg _radius _aos">
<div class="cnt ">
<div class="grid">
<div>Icons by <b><a href="https://heroicons.dev/">Heroicons</a> (<a
href="https://github.com/tailwindlabs/heroicons/blob/master/LICENSE"
class="_txt-cl">MIT</a>)</b>
</div>
<div>
Designed by Eduard Ursu(<b><a href="https://d3ward.github.io">d3ward</a></b>) © 2021
</div>
<div>
Licensed under <b><a
href="https://creativecommons.org/licenses/by-nc-sa/4.0/">[NC-SA-4.0]</a></b>
</div>
</div>
</div>
</footer>
</main>
<button class="gt-link hide" id="gt-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6">
<path d="M12 6H0l6-6z" /></svg>
</button>
</body>
<script src="./resources/adblock/data.js"></script>
<script src="./src/js/colla.js"></script>
<script src="./src/js/radialprogress.js"></script>
<script src="./src/js/d3Notif.js"></script>
<script src="./src/js/script.js"></script>
<script>
function closeNotif() {
var n = document.querySelector("._notif");
n.remove();
}
//--------------------------------------------------
//Notification toast
var notification = new Notif({
topPos: 10,
classNames: 'success',
autoClose: true,
autoCloseTimeout: 2000
});
//Radial points
var bar = new RadialProgress(document.getElementById('bar'), {
colorBg: "#ff3b3f",
colorFg: "#3cc47c",
colorText: "#202020",
thick: 12
});
var nTest = 0; //Number of url to be tested
const testWrapper = document.getElementById("test"); //Tests wrapper
var points = 0; //Points of blocked urls
//--------------------------------------------------
//Copy to clipboard the str value
function copyToClip(str) {
const el = document.createElement('textarea');
el.value = str;
el.setAttribute('readonly', '');
el.style.position = 'absolute';
el.style.left = '-9999px';
document.body.appendChild(el);
const selected =
document.getSelection().rangeCount > 0 ? document.getSelection().getRangeAt(0) : false;
el.select();
document.execCommand('copy');
$(el).remove();
if (selected) {
document.getSelection().removeAllRanges();
document.getSelection().addRange(selected);
}
notification.showN('URL copied to clipboard !', 'success');
}
//Function to check an url and set red/green result
async function check_url(url, div, parent, np) {
// Lets set up our `AbortController`, and create a request options object
// that includes the controller's `signal` to pass to `fetch`.
const controller = new AbortController()
const config = {
...{
method: 'HEAD',
mode: 'no-cors'
},
signal: controller.signal
}
// Set a timeout limit for the request using `setTimeout`. If the body
// of this timeout is reached before the request is completed, it will
// be cancelled.
const timeout = setTimeout(() => {
controller.abort()
}, 8000);
var hostDiv = document.createElement("div");
if (!np)
nTest += 1;
hostDiv.innerHTML = url;
hostDiv.onclick = () => {
copyToClip(url);
};
div.appendChild(hostDiv);
await fetch(url, config, timeout, parent, div).then(response => {
console.log(response);
$(parent).css("background", "var(--red)");
$(hostDiv).css("background", "var(--red)");
}) //Response was received --> ads are NOT blocked
.catch(error => {
console.log(error.message);
$(hostDiv).css("background", "var(--green)");
if (!np) {
points += 100 / nTest;
bar.setValue(points / 100);
} //No response --> ads are blocked
});
}
//Function to collapse a test
function show_info(t) {
t = t.parentElement;
var others = document.querySelectorAll(".test");;
others.forEach(element => {
if (element != t) $(element).removeClass("show");
});
$(t).toggle("show");
}
// Function to fetch all the tests
async function fetchTests() {
const testingInfoLoading = document.getElementById("testingInfo");
let fetches = [];
for (element in data) {
var catEl = document.createElement("div");
catEl.id = element;
catEl.innerHTML = "<h3>" + icons[element] + "&nbsp;&nbsp;" + element + "</h3>";
testWrapper.appendChild(catEl);
var category = data[element];
var testInfo = document.createElement("div");
var countTests = 0;
for (key in category) {
//Set log test
var div = document.createElement('div');
const dw = document.createElement('div');
div.classList.add("test");
div.id = key;
div.style.background = "var(--green)";
div.innerHTML = "<span onclick='show_info(this)'>" + key + "</span>";
div.appendChild(dw);
catEl.appendChild(div);
if (category.hasOwnProperty(key)) {
var value = category[key];
if (Array.isArray(value)) {
for (let i = 0; i < value.length; i++) {
fetches.push(check_url(value[i], dw, div));
countTests++;
}
} else fetches.push(check_url(value, dw, div));
}
testInfo.innerHTML = "Testing urls => " + element + " | Number of tests => " + countTests;
testingInfoLoading.appendChild(testInfo);
}
}
//Test fetch for the OEMs
var oemTest = document.createElement("div");
oemTest.id = "OEM";
oemTest.innerHTML = "<h3>" + icons["OEM"] +
"&nbsp;&nbsp; OEM </h3><h5> Optional test separated from final points</h5>";
testWrapper.appendChild(oemTest);
for (key in dataOEM) {
var div = document.createElement('div');
const dw = document.createElement('div');
div.classList.add("test");
div.id = key;
div.style.background = "var(--green)";
div.innerHTML = "<span onclick='show_info(this)'>" + icons[key] + "&nbsp;&nbsp;" + key + "</span>";
div.appendChild(dw);
oemTest.appendChild(div);
var value = dataOEM[key];
if (Array.isArray(value)) {
for (let i = 0; i < value.length; i++)
fetches.push(check_url(value[i], dw, div, "np"));
} else fetches.push(check_url(value, dw, div, "np"));
}
let results = await Promise.all(fetches);
return results; //do whatever you want with your results like converting them to json.
}
window.onload = function () {
new navbar();
new themeManager();
new gotop();
new aos();
new modal();
fetchTests().then((result) => {
$(".loadingWrap").fade("out", () => {
console.log("All tests completed");
$("body").removeClass("_overflowhidden");
});
});
}
</script>
</html>

11
config/paths.js Normal file
View file

@ -0,0 +1,11 @@
const path = require("path");
module.exports = {
// Source files path
src: path.resolve(__dirname, "../src"),
// Production build files path
build: path.resolve(__dirname, "../dist"),
// Static files. It will be copied in build process
public: path.resolve(__dirname, "../src"),
// Static files. It will be copied in build process
pages: path.resolve(__dirname, "../src/pages"),
};

77
config/webpack.config.js Normal file
View file

@ -0,0 +1,77 @@
const HTMLWebpackPlugin = require("html-webpack-plugin");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const paths = require("./paths");
module.exports = {
context: paths.src,
entry: {
"index": './js/index.js',
"fontlist": './js/fontlist.js',
"404": './js/404.js',
"adblock": './js/adblock.js',
"units": './js/units.js'
},
output: {
filename: './js/[name].js',
path: paths.build,
clean: false,
assetModuleFilename: '[path][name][ext]'
},
plugins: [
// Copies all the files from public to assets except css, html and js
new CopyWebpackPlugin({
patterns: [
{
from: "./assets",
to: "assets",
globOptions: {
ignore: [ "*.DS_Store","**/css/*.css", "**/js/*.js", "**/*.html"],
//ignore: [],
},
noErrorOnMissing: true,
},
],
}),
new MiniCssExtractPlugin({
filename: "./css/[name].css",
chunkFilename: "[name].css",
}),
new HTMLWebpackPlugin({
template: './index.ejs',
filename: 'index.html',
sources: false,
minify: false,
chunks: ["index"]
}),
new HTMLWebpackPlugin({
template: './404.ejs',
filename: '404.html',
sources: false,
minify: false,
chunks: ["404"]
}),
new HTMLWebpackPlugin({
template: './units.ejs',
filename: 'units.html',
sources: false,
minify: false,
chunks: ["units"]
}),
new HTMLWebpackPlugin({
template: './fontlist.ejs',
filename: 'fontlist.html',
sources: false,
minify: false,
chunks: ["fontlist"]
}),
new HTMLWebpackPlugin({
template: './adblock.ejs',
filename: 'adblock.html',
sources: false,
minify: false,
chunks: ["adblock"]
}),
]
};

42
config/webpack.dev.js Normal file
View file

@ -0,0 +1,42 @@
const config = require("./webpack.config");
const {merge} = require("webpack-merge");
const paths = require("./paths");
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = merge(config, {
mode: "development",
module: {
rules: [
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource'
},
{
test: /\.ejs$/i,
use: ['html-loader', 'template-ejs-loader'],
},
{
test: /\.js$/,
exclude: /node_modules/,
use: "babel-loader",
},
{
test: /\.(sa|sc|c)ss$/,
use: [
MiniCssExtractPlugin.loader, // extract css from commonjs
"css-loader", // turn css into commonjs
"sass-loader", // turn scss into css
],
},
],
},
devServer: {static: {
directory: paths.dist,
},
compress: true,
port: 3000,
hot: true,
open: true
}
});

49
config/webpack.prod.js Normal file
View file

@ -0,0 +1,49 @@
const config = require("./webpack.config");
const {
merge
} = require("webpack-merge");
const paths = require("./paths");
const glob = require("glob-all");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const {CleanWebpackPlugin} = require("clean-webpack-plugin");
const TerserPlugin = require("terser-webpack-plugin");
const PurgeCSSPlugin = require("purgecss-webpack-plugin");
module.exports = merge(config, {
mode: "production",
optimization: {
minimizer: [new CssMinimizerPlugin(), new TerserPlugin()],
},
module: {
rules: [
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource'
},
{
test: /\.ejs$/i,
use: ['html-loader', 'template-ejs-loader'],
},
{
test: /\.js$/,
exclude: /node_modules/,
use: "babel-loader",
},
{
test: /\.(sa|sc|c)ss$/,
use: [
MiniCssExtractPlugin.loader, // extract css from commonjs
"css-loader", // turn css into commonjs
"sass-loader", // turn scss into css
],
},
],
},
plugins: [
new CleanWebpackPlugin(),
new PurgeCSSPlugin({
paths: glob.sync(`${paths.src}/**/*`, { nodir: true }),
}),
]
});

View file

@ -1,278 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Font list</title>
<meta name="description" content="List fonts available in the browser ">
<!-- Google / Search Engine Tags -->
<meta itemprop="name" content="Toolz by d3ward - Home">
<meta itemprop="description" content="List fonts available in the browser ">
<meta itemprop="image" content="https://d3ward.github.io/toolz/src/preview_toolz.png">
<!-- Facebook Meta Tags -->
<meta property="og:url" content="https://d3ward.github.io/toolz/fontlist">
<meta property="og:type" content="website">
<meta property="og:title" content="Toolz by d3ward - Fontlist">
<meta property="og:description" content="List fonts available in the browser ">
<meta property="og:image" content="https://d3ward.github.io/toolz/src/preview_toolz.png">
<!-- Twitter Meta Tags -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Toolz by d3ward - Fontlist">
<meta name="twitter:description" content="List fonts available in the browser ">
<meta name="twitter:image" content="https://d3ward.github.io/toolz/src/preview_toolz.png">
<link rel="shortcut icon" href="./src/svg/toolz.svg" type="image/svg+xml">
<link href="src/css/style.css" rel="stylesheet">
<style>
body {
background-color: #baf72c;
background-image: linear-gradient(315deg, #baf72c 0%, #04a72d 74%);
background-size: 400% 100%;
height: auto;
}
[data-theme=dark],
html,
[data-theme=light] {
--primary: var(--green);
}
main {
padding-top: 6rem;
}
#flist {
display: grid;
grid-template-columns: 1fr 1fr;
gap: .5rem;
}
</style>
</head>
<body>
<header class="fixed">
<nav>
<a href="fontlist.html">
<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor"
d="M216 120h272c13.3 0 24-10.7 24-24s-10.75-24-24-24H216c-13.3 0-24 10.75-24 24s10.7 24 24 24zm272 272H216c-13.3 0-24 10.7-24 24s10.75 24 24 24h272c13.25 0 24-10.75 24-24s-10.7-24-24-24zm0-160H216c-13.3 0-24 10.7-24 24s10.75 24 24 24h272c13.3 0 24-10.7 24-24s-10.7-24-24-24zM191.384 208.425L116.16 29.321c-3.344-7.975-16.469-7.975-19.813 0L21.123 208.425c-2.302 5.472.273 11.776 5.744 14.069a10.73 10.73 0 0014.07-5.745l15.129-36.022h100.388l15.13 36.022c1.71 4.124 5.695 6.587 9.904 6.587 1.386 0 2.799-.266 4.156-.84 5.471-2.295 8.068-8.608 5.74-14.07zM65.115 159.216l41.15-98.373 41.158 98.015H65.115zM153.843 356.303c10.402-10.045 16.92-24.107 16.92-39.687 0-30.523-24.822-55.358-55.358-55.358h-62.5c-5.915 0-10.714 4.8-10.714 10.715v178.571c0 5.938 4.8 10.714 10.714 10.714h76.786c30.536 0 55.357-24.821 55.357-55.357 0-21.83-12.812-40.58-31.205-49.598zM63.62 282.687h51.785c18.71 0 33.929 15.219 33.929 33.929s-15.223 33.928-33.929 33.928H63.62zM129.69 439.83H63.62v-67.857h66.071c18.71 0 33.929 15.218 33.929 33.928 0 18.71-15.224 33.929-33.929 33.929z" />
</svg>
</a>
<ul>
<li>
<a href="https://d3ward.github.io/toolz/">
<svg viewBox="0 0 12.002 12.7" class="_icon" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="prefix__a">
<stop offset="0" stop-color="#fc575e" />
<stop offset="1" stop-color="#f7b42c" />
</linearGradient>
</defs>
<g paint-order="stroke markers fill" stroke-width="10.32">
<path d="M8 4.22c.581-.065 3.977.236 3.961.314L5.19 8.361.034 8.214z"
fill-opacity=".831" />
<path
d="M3.579 4.385C1.42 4.27.047 2.012 0 0h3.982c3.437 0 4.025.013 4.24.044 2.282-.027 3.674 2.286 3.74 4.49M7.38 8.204c2.537.053 4.463 2.109 4.622 4.496l-7.9-.016c-1.18-.019-4.052-1.81-4.068-4.47" />
</g>
</svg> &nbsp;
Toolz - Home
</a>
</li>
<li>
<a class="bmc" target="_blank" href="https://www.buymeacoffee.com/dOWS9cU">
<svg role="img" class="_icon" id="bmac-icon" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24">
<title>Buy Me A Coffee icon</title>
<path
d="M20.216 6.415l-.132-.666c-.119-.598-.388-1.163-1.001-1.379-.197-.069-.42-.098-.57-.241-.152-.143-.196-.366-.231-.572-.065-.378-.125-.756-.192-1.133-.057-.325-.102-.69-.25-.987-.195-.4-.597-.634-.996-.788a5.723 5.723 0 00-.626-.194c-1-.263-2.05-.36-3.077-.416a25.834 25.834 0 00-3.7.062c-.915.083-1.88.184-2.75.5-.318.116-.646.256-.888.501-.297.302-.393.77-.177 1.146.154.267.415.456.692.58.36.162.737.284 1.123.366 1.075.238 2.189.331 3.287.37 1.218.05 2.437.01 3.65-.118.299-.033.598-.073.896-.119.352-.054.578-.513.474-.834-.124-.383-.457-.531-.834-.473-.466.074-.96.108-1.382.146-1.177.08-2.358.082-3.536.006a22.228 22.228 0 01-1.157-.107c-.086-.01-.18-.025-.258-.036-.243-.036-.484-.08-.724-.13-.111-.027-.111-.185 0-.212h.005c.277-.06.557-.108.838-.147h.002c.131-.009.263-.032.394-.048a25.076 25.076 0 013.426-.12c.674.019 1.347.067 2.017.144l.228.031c.267.04.533.088.798.145.392.085.895.113 1.07.542.055.137.08.288.111.431l.319 1.484a.237.237 0 01-.199.284h-.003c-.037.006-.075.01-.112.015a36.704 36.704 0 01-4.743.295 37.059 37.059 0 01-4.699-.304c-.14-.017-.293-.042-.417-.06-.326-.048-.649-.108-.973-.161-.393-.065-.768-.032-1.123.161-.29.16-.527.404-.675.701-.154.316-.199.66-.267 1-.069.34-.176.707-.135 1.056.087.753.613 1.365 1.37 1.502a39.69 39.69 0 0011.343.376.483.483 0 01.535.53l-.071.697-1.018 9.907c-.041.41-.047.832-.125 1.237-.122.637-.553 1.028-1.182 1.171-.577.131-1.165.2-1.756.205-.656.004-1.31-.025-1.966-.022-.699.004-1.556-.06-2.095-.58-.475-.458-.54-1.174-.605-1.793l-.731-7.013-.322-3.094c-.037-.351-.286-.695-.678-.678-.336.015-.718.3-.678.679l.228 2.185.949 9.112c.147 1.344 1.174 2.068 2.446 2.272.742.12 1.503.144 2.257.156.966.016 1.942.053 2.892-.122 1.408-.258 2.465-1.198 2.616-2.657.34-3.332.683-6.663 1.024-9.995l.215-2.087a.484.484 0 01.39-.426c.402-.078.787-.212 1.074-.518.455-.488.546-1.124.385-1.766zm-1.478.772c-.145.137-.363.201-.578.233-2.416.359-4.866.54-7.308.46-1.748-.06-3.477-.254-5.207-.498-.17-.024-.353-.055-.47-.18-.22-.236-.111-.71-.054-.995.052-.26.152-.609.463-.646.484-.057 1.046.148 1.526.22.577.088 1.156.159 1.737.212 2.48.226 5.002.19 7.472-.14.45-.06.899-.13 1.345-.21.399-.072.84-.206 1.08.206.166.281.188.657.162.974a.544.544 0 01-.169.364zm-6.159 3.9c-.862.37-1.84.788-3.109.788a5.884 5.884 0 01-1.569-.217l.877 9.004c.065.78.717 1.38 1.5 1.38 0 0 1.243.065 1.658.065.447 0 1.786-.065 1.786-.065.783 0 1.434-.6 1.499-1.38l.94-9.95a3.996 3.996 0 00-1.322-.238c-.826 0-1.491.284-2.26.613z" />
</svg></a>
<a href="https://github.com/d3ward">
<svg class="_icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<title>Github</title>
<path
d="M256,32C132.3,32,32,134.9,32,261.7c0,101.5,64.2,187.5,153.2,217.9a17.56,17.56,0,0,0,3.8.4c8.3,0,11.5-6.1,11.5-11.4,0-5.5-.2-19.9-.3-39.1a102.4,102.4,0,0,1-22.6,2.7c-43.1,0-52.9-33.5-52.9-33.5-10.2-26.5-24.9-33.6-24.9-33.6-19.5-13.7-.1-14.1,1.4-14.1h.1c22.5,2,34.3,23.8,34.3,23.8,11.2,19.6,26.2,25.1,39.6,25.1a63,63,0,0,0,25.6-6c2-14.8,7.8-24.9,14.2-30.7-49.7-5.8-102-25.5-102-113.5,0-25.1,8.7-45.6,23-61.6-2.3-5.8-10-29.2,2.2-60.8a18.64,18.64,0,0,1,5-.5c8.1,0,26.4,3.1,56.6,24.1a208.21,208.21,0,0,1,112.2,0c30.2-21,48.5-24.1,56.6-24.1a18.64,18.64,0,0,1,5,.5c12.2,31.6,4.5,55,2.2,60.8,14.3,16.1,23,36.6,23,61.6,0,88.2-52.4,107.6-102.3,113.3,8,7.1,15.2,21.1,15.2,42.5,0,30.7-.3,55.5-.3,63,0,5.4,3.1,11.5,11.4,11.5a19.35,19.35,0,0,0,4-.4C415.9,449.2,480,363.1,480,261.7,480,134.9,379.7,32,256,32Z" />
</svg>
</a>
<div class="nav-item theme-toggle">
<span class="light-icon theme-icon">
<svg class="_icon" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"></path>
</svg>
</span>
<span class="dark-icon theme-icon">
<svg class="_icon" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"
clip-rule="evenodd"></path>
</svg>
</span>
</div>
</li>
</ul>
<button>
<svg aria-hidden="true" version="1.1" viewBox="0 0 24 24">
<line x1="2" y1="4" x2="22" y2="4" id="top" />
<line x1="2" y1="12" x2="22" y2="12" id="middle-down" />
<line x1="2" y1="12" x2="22" y2="12" id="middle-up" />
<line x1="2" y1="20" x2="22" y2="20" id="bottom" />
</svg>
</button>
</nav>
</header>
<main>
<div class="hero ">
<p>Show a list of available fonts in your browser</p>
</div>
<div id="flist" class="_mt-1">
</div>
<footer class="_bg _radius _aos _mt-1">
<div class="cnt ">
<div class="grid">
<div>Icons by <b><a href="https://heroicons.dev/">Heroicons</a> (<a
href="https://github.com/tailwindlabs/heroicons/blob/master/LICENSE"
class="_txt-cl">MIT</a>)</b>
</div>
<div>
Designed by Eduard Ursu(<b><a href="https://d3ward.github.io">d3ward</a></b>) © 2021
</div>
<div>
Licensed under <b><a
href="https://creativecommons.org/licenses/by-nc-sa/4.0/">[NC-SA-4.0]</a></b>
</div>
</div>
</div>
</footer>
</main>
<button class="gt-link hide" id="gt-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6">
<path d="M12 6H0l6-6z" /></svg>
</button>
</body>
<script src="./src/js/script.js"></script>
<script>
/**
* JavaScript code to detect available availability of a
* particular font in a browser using JavaScript and CSS.
*
* Author : Lalit Patel
* Website: http://www.lalit.org/lab/javascript-css-font-detect/
* License: Apache Software License 2.0
* http://www.apache.org/licenses/LICENSE-2.0
* Version: 0.15 (21 Sep 2009)
* Changed comparision font to default from sans-default-default,
* as in FF3.0 font of child element didn't fallback
* to parent element if the font is missing.
* Version: 0.2 (04 Mar 2012)
* Comparing font against all the 3 generic font families ie,
* 'monospace', 'sans-serif' and 'sans'. If it doesn't match all 3
* then that font is 100% not available in the system
* Version: 0.3 (24 Mar 2012)
* Replaced sans with serif in the list of baseFonts
*/
/**
* Usage: d = new Detector();
* d.detect('font name');
*/
var Detector = function () {
// a font will be compared against all the three default fonts.
// and if it doesn't match all 3 then that font is not available.
var baseFonts = ['monospace', 'sans-serif', 'serif'];
//we use m or w because these two characters take up the maximum width.
// And we use a LLi so that the same matching fonts can get separated
var testString = "mmmmmmmmmmlli";
//we test using 72px font size, we may use any size. I guess larger the better.
var testSize = '72px';
var h = document.getElementsByTagName("body")[0];
// create a SPAN in the document to get the width of the text we use to test
var s = document.createElement("span");
s.style.fontSize = testSize;
s.innerHTML = testString;
var defaultWidth = {};
var defaultHeight = {};
for (var index in baseFonts) {
//get the default width for the three base fonts
s.style.fontFamily = baseFonts[index];
h.appendChild(s);
defaultWidth[baseFonts[index]] = s.offsetWidth; //width for the default font
defaultHeight[baseFonts[index]] = s.offsetHeight; //height for the defualt font
h.removeChild(s);
}
function detect(font) {
var detected = false;
for (var index in baseFonts) {
s.style.fontFamily = font + ',' + baseFonts[
index]; // name of the font along with the base font for fallback.
h.appendChild(s);
var matched = (s.offsetWidth != defaultWidth[baseFonts[index]] || s.offsetHeight != defaultHeight[
baseFonts[index]]);
h.removeChild(s);
detected = detected || matched;
}
return detected;
}
this.detect = detect;
};
var d = new Detector();
var list = ["Abadi MT Condensed Light", "Albertus Extra Bold", "Albertus Medium", "Antique Olive", "Arial",
"Arial Black", "Arial MT", "Arial Narrow", "Bazooka", "Book Antiqua", "Bookman Old Style", "Boulder",
"Calisto MT", "Calligrapher", "Century Gothic", "Century Schoolbook", "Cezanne", "CG Omega", "CG Times",
"Charlesworth", "Chaucer", "Clarendon Condensed", "Comic Sans MS", "Copperplate Gothic Bold",
"Copperplate Gothic Light", "Cornerstone", "Coronet", "Courier", "Courier New", "Cuckoo", "Dauphin",
"Denmark", "Fransiscan", "Garamond", "Geneva", "Haettenschweiler", "Heather", "Helvetica", "Herald",
"Impact", "Jester", "Letter Gothic", "Lithograph", "Lithograph Light", "Long Island", "Lucida Console",
"Lucida Handwriting", "Lucida Sans", "Lucida Sans Unicode", "Marigold", "Market", "Matisse ITC",
"MS LineDraw", "News GothicMT", "OCR A Extended", "Old Century", "Pegasus", "Pickwick", "Poster",
"Pythagoras", "Sceptre", "Sherwood", "Signboard", "Socket", "Steamer", "Storybook", "Subway", "Tahoma",
"Technical", "Teletype", "Tempus Sans ITC", "Times", "Times New Roman", "Times New Roman PS",
"Trebuchet MS", "Tristan", "Tubular", "Unicorn", "Univers", "Univers Condensed", "Vagabond", "Verdana",
"Westminster Allegro", "Amazone BT", "AmerType Md BT", "Arrus BT", "Aurora Cn BT", "AvantGarde Bk BT",
"AvantGarde Md BT", "BankGothic Md BT", "Benguiat Bk BT", "BernhardFashion BT", "BernhardMod BT", "BinnerD",
"Bremen Bd BT", "CaslonOpnface BT", "Charter Bd BT", "Charter BT", "ChelthmITC Bk BT", "CloisterBlack BT",
"CopperplGoth Bd BT", "English 111 Vivace BT", "EngraversGothic BT", "Exotc350 Bd BT", "Freefrm721 Blk BT",
"FrnkGothITC Bk BT", "Futura Bk BT", "Futura Lt BT", "Futura Md BT", "Futura ZBlk BT", "FuturaBlack BT",
"Galliard BT", "Geometr231 BT", "Geometr231 Hv BT", "Geometr231 Lt BT", "GeoSlab 703 Lt BT",
"GeoSlab 703 XBd BT", "GoudyHandtooled BT", "GoudyOLSt BT", "Humanst521 BT", "Humanst 521 Cn BT",
"Humanst521 Lt BT", "Incised901 Bd BT", "Incised901 BT", "Incised901 Lt BT", "Informal011 BT",
"Kabel Bk BT", "Kabel Ult BT", "Kaufmann Bd BT", "Kaufmann BT", "Korinna BT", "Lydian BT",
"Monotype Corsiva", "NewsGoth BT", "Onyx BT", "OzHandicraft BT", "PosterBodoni BT", "PTBarnum BT",
"Ribbon131 Bd BT", "Serifa BT", "Serifa Th BT", "ShelleyVolante BT", "Souvenir Lt BT", "Staccato222 BT",
"Swis721 BlkEx BT", "Swiss911 XCm BT", "TypoUpright BT", "ZapfEllipt BT", "ZapfHumnst BT",
"ZapfHumnst Dm BT", "Zurich BlkEx BT", "Zurich Ex BT"
]
const ul = document.querySelector("#flist");
list.forEach(element => {
var a = d.detect(element);
if (a) {
var li = document.createElement("div");
li.innerText = element;
li.className = "card";
li.style.fontFamily = element;
ul.appendChild(li);
}
console.log(a);
});
// Call the function when the DOM is loaded
document.addEventListener("DOMContentLoaded", () => {
new navbar();
new themeManager();
new gotop();
new aos();
});
</script>
</html>

View file

@ -1,203 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- HTML Meta Tags -->
<title>Toolz by d3ward - Home</title>
<meta name="description" content="List of testing and verification tools, easy to use and with beautiful design">
<!-- Google / Search Engine Tags -->
<meta itemprop="name" content="Toolz by d3ward - Home">
<meta itemprop="description" content="List of testing and verification tools, easy to use and with beautiful design">
<meta itemprop="image" content="https://d3ward.github.io/toolz/src/preview_toolz.png">
<!-- Facebook Meta Tags -->
<meta property="og:url" content="https://d3ward.github.io/toolz">
<meta property="og:type" content="website">
<meta property="og:title" content="Toolz by d3ward - Home">
<meta property="og:description" content="List of testing and verification tools, easy to use and with beautiful design">
<meta property="og:image" content="https://d3ward.github.io/toolz/src/preview_toolz.png">
<!-- Twitter Meta Tags -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Toolz by d3ward - Home">
<meta name="twitter:description"
content="List of testing and verification tools, easy to use and with beautiful design">
<meta name="twitter:image" content="https://d3ward.github.io/toolz/src/preview_toolz.png">
<link rel="shortcut icon" href="./src/svg/toolz.svg" type="image/svg+xml">
<link href="src/css/style.css" rel="stylesheet">
<style>
body {
background-size: 400% 100%;
height: auto;
}
</style>
</head>
<body>
<header class="fixed">
<nav>
<a href="index.html">
<svg viewBox="0 0 12.002 12.7" fill="var(--primary)" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="prefix__a">
<stop offset="0" stop-color="#fc575e" />
<stop offset="1" stop-color="#f7b42c" />
</linearGradient>
</defs>
<g paint-order="stroke markers fill" stroke-width="10.32">
<path d="M8 4.22c.581-.065 3.977.236 3.961.314L5.19 8.361.034 8.214z" fill-opacity=".831" />
<path
d="M3.579 4.385C1.42 4.27.047 2.012 0 0h3.982c3.437 0 4.025.013 4.24.044 2.282-.027 3.674 2.286 3.74 4.49M7.38 8.204c2.537.053 4.463 2.109 4.622 4.496l-7.9-.016c-1.18-.019-4.052-1.81-4.068-4.47" />
</g>
</svg>
</a>
<ul>
<li>
<a class="bmc" target="_blank" href="https://www.buymeacoffee.com/dOWS9cU">
<svg role="img" class="_icon" id="bmac-icon" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24">
<title>Buy Me A Coffee icon</title>
<path
d="M20.216 6.415l-.132-.666c-.119-.598-.388-1.163-1.001-1.379-.197-.069-.42-.098-.57-.241-.152-.143-.196-.366-.231-.572-.065-.378-.125-.756-.192-1.133-.057-.325-.102-.69-.25-.987-.195-.4-.597-.634-.996-.788a5.723 5.723 0 00-.626-.194c-1-.263-2.05-.36-3.077-.416a25.834 25.834 0 00-3.7.062c-.915.083-1.88.184-2.75.5-.318.116-.646.256-.888.501-.297.302-.393.77-.177 1.146.154.267.415.456.692.58.36.162.737.284 1.123.366 1.075.238 2.189.331 3.287.37 1.218.05 2.437.01 3.65-.118.299-.033.598-.073.896-.119.352-.054.578-.513.474-.834-.124-.383-.457-.531-.834-.473-.466.074-.96.108-1.382.146-1.177.08-2.358.082-3.536.006a22.228 22.228 0 01-1.157-.107c-.086-.01-.18-.025-.258-.036-.243-.036-.484-.08-.724-.13-.111-.027-.111-.185 0-.212h.005c.277-.06.557-.108.838-.147h.002c.131-.009.263-.032.394-.048a25.076 25.076 0 013.426-.12c.674.019 1.347.067 2.017.144l.228.031c.267.04.533.088.798.145.392.085.895.113 1.07.542.055.137.08.288.111.431l.319 1.484a.237.237 0 01-.199.284h-.003c-.037.006-.075.01-.112.015a36.704 36.704 0 01-4.743.295 37.059 37.059 0 01-4.699-.304c-.14-.017-.293-.042-.417-.06-.326-.048-.649-.108-.973-.161-.393-.065-.768-.032-1.123.161-.29.16-.527.404-.675.701-.154.316-.199.66-.267 1-.069.34-.176.707-.135 1.056.087.753.613 1.365 1.37 1.502a39.69 39.69 0 0011.343.376.483.483 0 01.535.53l-.071.697-1.018 9.907c-.041.41-.047.832-.125 1.237-.122.637-.553 1.028-1.182 1.171-.577.131-1.165.2-1.756.205-.656.004-1.31-.025-1.966-.022-.699.004-1.556-.06-2.095-.58-.475-.458-.54-1.174-.605-1.793l-.731-7.013-.322-3.094c-.037-.351-.286-.695-.678-.678-.336.015-.718.3-.678.679l.228 2.185.949 9.112c.147 1.344 1.174 2.068 2.446 2.272.742.12 1.503.144 2.257.156.966.016 1.942.053 2.892-.122 1.408-.258 2.465-1.198 2.616-2.657.34-3.332.683-6.663 1.024-9.995l.215-2.087a.484.484 0 01.39-.426c.402-.078.787-.212 1.074-.518.455-.488.546-1.124.385-1.766zm-1.478.772c-.145.137-.363.201-.578.233-2.416.359-4.866.54-7.308.46-1.748-.06-3.477-.254-5.207-.498-.17-.024-.353-.055-.47-.18-.22-.236-.111-.71-.054-.995.052-.26.152-.609.463-.646.484-.057 1.046.148 1.526.22.577.088 1.156.159 1.737.212 2.48.226 5.002.19 7.472-.14.45-.06.899-.13 1.345-.21.399-.072.84-.206 1.08.206.166.281.188.657.162.974a.544.544 0 01-.169.364zm-6.159 3.9c-.862.37-1.84.788-3.109.788a5.884 5.884 0 01-1.569-.217l.877 9.004c.065.78.717 1.38 1.5 1.38 0 0 1.243.065 1.658.065.447 0 1.786-.065 1.786-.065.783 0 1.434-.6 1.499-1.38l.94-9.95a3.996 3.996 0 00-1.322-.238c-.826 0-1.491.284-2.26.613z" />
</svg></a>
<a href="https://github.com/d3ward">
<svg class="_icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<title>Github</title>
<path
d="M256,32C132.3,32,32,134.9,32,261.7c0,101.5,64.2,187.5,153.2,217.9a17.56,17.56,0,0,0,3.8.4c8.3,0,11.5-6.1,11.5-11.4,0-5.5-.2-19.9-.3-39.1a102.4,102.4,0,0,1-22.6,2.7c-43.1,0-52.9-33.5-52.9-33.5-10.2-26.5-24.9-33.6-24.9-33.6-19.5-13.7-.1-14.1,1.4-14.1h.1c22.5,2,34.3,23.8,34.3,23.8,11.2,19.6,26.2,25.1,39.6,25.1a63,63,0,0,0,25.6-6c2-14.8,7.8-24.9,14.2-30.7-49.7-5.8-102-25.5-102-113.5,0-25.1,8.7-45.6,23-61.6-2.3-5.8-10-29.2,2.2-60.8a18.64,18.64,0,0,1,5-.5c8.1,0,26.4,3.1,56.6,24.1a208.21,208.21,0,0,1,112.2,0c30.2-21,48.5-24.1,56.6-24.1a18.64,18.64,0,0,1,5,.5c12.2,31.6,4.5,55,2.2,60.8,14.3,16.1,23,36.6,23,61.6,0,88.2-52.4,107.6-102.3,113.3,8,7.1,15.2,21.1,15.2,42.5,0,30.7-.3,55.5-.3,63,0,5.4,3.1,11.5,11.4,11.5a19.35,19.35,0,0,0,4-.4C415.9,449.2,480,363.1,480,261.7,480,134.9,379.7,32,256,32Z" />
</svg>
</a>
<div class="nav-item theme-toggle">
<span class="light-icon theme-icon">
<svg class="_icon" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"></path>
</svg>
</span>
<span class="dark-icon theme-icon">
<svg class="_icon" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"
clip-rule="evenodd"></path>
</svg>
</span>
</div>
</li>
</ul>
<button>
<svg aria-hidden="true" version="1.1" viewBox="0 0 24 24">
<line x1="2" y1="4" x2="22" y2="4" id="top" />
<line x1="2" y1="12" x2="22" y2="12" id="middle-down" />
<line x1="2" y1="12" x2="22" y2="12" id="middle-up" />
<line x1="2" y1="20" x2="22" y2="20" id="bottom" />
</svg>
</button>
</nav>
</header>
<main class="_pt-3">
<!-- Header -->
<div class="hero">
<div class="_aos-top card">
<div class="img-w">
<svg fill="currentColor" viewBox="0 0 123.861 131.067" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="prefix__a">
<stop offset="0" stop-color="#fc575e" />
<stop offset="1" stop-color="#f7b42c" />
</linearGradient>
<linearGradient xlink:href="#prefix__a" id="prefix__b" x1="43.078" y1="111.56" x2="774.291"
y2="715.75" gradientUnits="userSpaceOnUse"
gradientTransform="translate(128.24 161.152)" />
</defs>
<g paint-order="stroke markers fill">
<path d="M82.57 43.56c5.988-.68 41.036 2.433 40.872 3.236l-69.89 39.492L.353 84.773z"
fill="#9c2a24" />
<path
d="M267.83 332.194c-84.193-4.441-137.743-92.535-139.59-171.042h155.33c134.049 0 157.001.529 165.408 1.731 88.985-1.066 143.267 89.144 145.815 175.135M416.12 481.196c98.948 2.03 174.07 82.23 180.256 175.329l-308.118-.623c-46.077-.727-158.063-70.57-158.683-174.35"
transform="matrix(.26458 0 0 .26458 -33.93 -42.638)" fill="url(#prefix__b)" />
</g>
</svg>
</div>
<h1 class="_txt-primary">Toolz</h1>
<p>A list of testing and verification tools, easy to use and with beautiful design</p>
</div>
</div>
<section>
<div class="_2-col" id="ext-grid">
<a href="./adblock.html">
<div class="card _aos-bottom _txt">
<div class="img-w"><svg version="1.0" fill="currentColor" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 106 106">
<path
d="M35 1.5c-9.1 2-22.1 6.3-25.9 8.6-4.3 2.6-4.9 4.8-4.6 16.6.8 25.7 13 51.2 32.8 68.7 8.2 7.2 13.1 10.6 15.5 10.6 4.9 0 20.6-13.4 29.6-25.4 12.6-16.7 18.8-35 19-55.9.1-10.6 0-10.9-2.6-13.2C95.7 8.8 87.9 5.7 77 2.8 67.2.2 44.4-.5 35 1.5zm36 6.6c7.5 1.4 22.7 6.6 23.7 8.2 1.1 1.8.5 14.1-1.1 22.2-2.3 11.6-8 25.8-14.1 35-4.6 7-18.5 21.4-23.4 24.4l-3.4 2-3.1-2.2C40 91.1 28.7 77.9 22.2 66c-3.6-6.6-8.7-20.7-9.7-27-.4-2.5-.9-5.2-1-6.1-.4-2-.7-10.2-.6-14.2.1-2.3.9-3.1 4.9-4.8 15.7-6.8 36.9-9 55.2-5.8z" />
<path
d="M44.7 13.6c-.1.1-2.4.4-5.2.8-5.8.7-14.8 3.2-18.9 5.3-2.9 1.5-2.9 1.5-2.3 9.1.6 9.1 3.3 21.2 5.1 23.8 1.3 1.7 1.5 1.7 6 0 2.5-1 4.6-2.2 4.6-2.7s.1-1.1.1-1.4c.1-.2.6-2.8 1-5.6C36.9 31.3 48.6 24 59.6 27.7 63.4 29 71 35.2 71 37.1c0 2.5 14.5-.3 16-3.1.5-1 1-4.1 1.1-7 .2-4.2-.2-5.6-1.7-6.7-2.3-1.7-13.6-5.2-18.9-5.9-4.2-.6-22.3-1.2-22.8-.8zM76.5 46.9c-2.3.5-3.3 1.5-4.5 4.7-5 13.2-19.1 17.9-29.7 9.8-3.1-2.3-3.6-2.4-6.9-1.2-5 1.8-5.9 3.9-3.7 8.6 2.5 5.3 18.2 21.2 21 21.2 2.9 0 14.1-10.5 19.9-18.6C79.4 61.9 85.8 47 83.1 47c-.5 0-1.5-.2-2.3-.4-.7-.2-2.6-.1-4.3.3z" />
</svg></div>
<h6 class="_txt-center">Adblock Test</h6>
</div>
</a>
<a href="./fontlist.html">
<div class="card _aos-bottom _txt">
<div class="img-w"><svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor"
d="M216 120h272c13.3 0 24-10.7 24-24s-10.75-24-24-24H216c-13.3 0-24 10.75-24 24s10.7 24 24 24zm272 272H216c-13.3 0-24 10.7-24 24s10.75 24 24 24h272c13.25 0 24-10.75 24-24s-10.7-24-24-24zm0-160H216c-13.3 0-24 10.7-24 24s10.75 24 24 24h272c13.3 0 24-10.7 24-24s-10.7-24-24-24zM191.384 208.425L116.16 29.321c-3.344-7.975-16.469-7.975-19.813 0L21.123 208.425c-2.302 5.472.273 11.776 5.744 14.069a10.73 10.73 0 0014.07-5.745l15.129-36.022h100.388l15.13 36.022c1.71 4.124 5.695 6.587 9.904 6.587 1.386 0 2.799-.266 4.156-.84 5.471-2.295 8.068-8.608 5.74-14.07zM65.115 159.216l41.15-98.373 41.158 98.015H65.115zM153.843 356.303c10.402-10.045 16.92-24.107 16.92-39.687 0-30.523-24.822-55.358-55.358-55.358h-62.5c-5.915 0-10.714 4.8-10.714 10.715v178.571c0 5.938 4.8 10.714 10.714 10.714h76.786c30.536 0 55.357-24.821 55.357-55.357 0-21.83-12.812-40.58-31.205-49.598zM63.62 282.687h51.785c18.71 0 33.929 15.219 33.929 33.929s-15.223 33.928-33.929 33.928H63.62zM129.69 439.83H63.62v-67.857h66.071c18.71 0 33.929 15.218 33.929 33.928 0 18.71-15.224 33.929-33.929 33.929z" />
</svg></div>
<h6 class="_txt-center">FontList</h6>
</div>
</a>
<a href="./units.html">
<div class="card _aos-bottom _txt">
<div class="img-w">
<svg fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor"
d="M464 272h-224v-224C240 21.6 218.4 0 192 0H48C21.6 0 0 21.6 0 48v416C0 490.4 21.6 512 48 512h416c26.4 0 48-21.6 48-48V320C512 293.6 490.4 272 464 272zM464 464h-416v-416H192v47.1H112c-8.836 0-16 7.162-16 16c0 8.836 7.164 16 16 16L192 128v64H112C103.2 192 96 199.2 96 208C96 216.8 103.2 224 112 224H192v64H112C103.2 288 96 295.2 96 304C96 312.8 103.2 320 112 320H192v80C192 408.8 199.2 416 208 416C216.8 416 224 408.8 224 400V320h64v80c0 8.836 7.164 16 16 16c8.838 0 16-7.164 16-16V320h64v80c0 8.836 7.164 16 16 16c8.838 0 16-7.164 16-16V320h48V464z">
</path>
</svg>
</div>
<h6 class="_txt-center">Units</h6>
</div>
</a>
</div>
</section>
<footer class="_bg _radius _aos">
<div class="cnt ">
<div class="grid">
<div>Icons by <b><a href="https://heroicons.dev/">Heroicons</a> (<a
href="https://github.com/tailwindlabs/heroicons/blob/master/LICENSE"
class="_txt-cl">MIT</a>)</b>
</div>
<div>
Designed by Eduard Ursu(<b><a href="https://d3ward.github.io">d3ward</a></b>) © 2021
</div>
<div>
Licensed under <b><a
href="https://creativecommons.org/licenses/by-nc-sa/4.0/">[NC-SA-4.0]</a></b>
</div>
</div>
</div>
</footer>
</main>
<button class="gt-link hide" id="gt-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6">
<path d="M12 6H0l6-6z" /></svg>
</button>
</body>
<script src="./src/js/script.js"></script>
<script>
// Call the function when the DOM is loaded
document.addEventListener("DOMContentLoaded", () => {
new navbar();
new themeManager();
new gotop();
new aos();
});
</script>
</html>

View file

@ -1,710 +0,0 @@
/**
* @fileOverview CollaJS - the lightweight modern DOM manipulation and events library
* @author Eduard Ursu
* @version 1.0.0
*/
(function (window, document) {
'use strict';
/** @constructor Colla */
function Colla(selector, context) {
return Object.create(collaProto, {
s: {
get: function () {
if(typeof selector === 'string') {
var startAt = ((context === 'string') ? document.querySelectorAll(selector) : context) || document; // tidy up
var nl = startAt.querySelectorAll(selector);
var arr = [];
for (var i = 0, len = arr.length = nl.length; i < len; i++) {
arr[i] = nl[i];
}
return arr;
} else {
return [selector]; // could be an object, dom node or a function but always kept in an array
}
},
set: function(value) {
selector = value;
}
}
});
}
var collaProto = {
/**
* Fade in/out
* @memberOf Colla
* @param {string} string Type of fading "in" or "out"
* @param {function} callback Function to be run after fading
* @returns Colla
* @example
* $('#first-box').fade("out", () => { });
* $('#second-box').fade("in", () => { });
*/
fade: function (status,callback) {
return this.each((function (el) {
if(status=="out"){
var opacity = 1;
var timer = setInterval(function(){
if(opacity < 0.1){
clearInterval(timer);
el.style.display = "none";
callback(); //this executes the callback function!
}
el.style.opacity = opacity;
opacity -= 0.1;
}, 50);
}else{
var opacity = 0;
el.style.opacity = opacity;
el.style.display = "block";
var timer = setInterval(function(){
if(opacity > 1){
clearInterval(timer);
if(callback)callback();
}
el.style.opacity = opacity;
opacity += 0.1;
}, 50);
}
}))
},
/**
* Each loop
* @memberOf Colla
* @param {function} callback Function to be run on each selector
* @returns Colla
* @example
* $('.each').each(function() { });
*/
each: function(callback) {
for (var i = 0, len = this.s.length; i < len; i++) {
callback(this.s[i]);
}
return this;
},
/**
* Find a new selector within a parent selector
* @memberOf Colla
* @param {string} selector Find a new selector within a parent selector
* @returns Colla
* @example
* $('.parent').find('.child');
*/
find: function(selector) {
return new Colla(selector, this.s[0]);
},
/**
* Set the CSS for an element
* @memberOf Colla
* @param {string} property Property of element to set
* @param {string} value Value of property to set
* @returns Colla
* @example
* $('.color').css('color', 'red');
*/
css: function(property, value) {
if(value) {
return this.each(function(el) {
el.style[property] = value;
});
} else {
return getComputedStyle(this.s[0])[property];
}
},
/**
* Sets selector to display none
* @memberOf Colla
* @returns Colla
* @example
* $('.hide').hide();
*/
hide: function() {
return this.each(function(el) {
el.style.display = 'none';
});
},
/**
* Sets selector to display block
* @memberOf Colla
* @returns Colla
* @example
* $('.show').show();
*/
show: function() {
return this.each(function(el) {
el.style.display = 'block';
});
},
/**
* Checks whether the selector is visible
* @memberOf Colla
* @returns Boolean
* @example
* $('.visible').visible();
*/
visible: function() {
if(this.s.length > 0) {
return this.s[0].offsetWidth > 0 || this.s[0].offsetHeight > 0;
} else {
return false;
}
},
/**
* Toggles the display property of the selector or a class from selecetor
* @memberOf Colla
* @param {string} className Name of class to toggle
* @returns Colla
* @example
* $('.class-box').toggle();
* $('.class').toggle('toggle-class');
*/
toggle: function(className) {
if(!className){
return this.each(function(el) {
if(el.style.display === '' || el.style.display === 'block') {
el.style.display = 'none';
}
else {
el.style.display = 'block';
}
});
}
return this.each(function(el) {
el.classList.toggle(className);
});
},
/**
* Adds a class to the selector
* @memberOf Colla
* @param {string} className Name of class to add
* @returns Colla
* @example
* $('.class').addClass('another-class');
*/
addClass: function(className) {
return this.each(function(el) {
el.classList.add(className);
});
},
/**
* Removes a class from the selector
* @memberOf Colla
* @param {string} className Name of class to remove
* @returns Colla
* @example
* $('.class remove-class').removeClass('remove-class');
*/
removeClass: function(className) {
return this.each(function(el) {
el.classList.remove(className);
});
},
/**
* Checks whether the selector has a specific class
* @memberOf Colla
* @returns Boolean
* @example
* $('.class').hasClass('another-class');
*/
hasClass: function(className) {
if(this.s.length > 0) {
return this.s[0].classList.contains(className);
} else {
return false;
}
},
/**
* Attaches an event to the selector
* @memberOf Colla
* @param {string} name Name of event e.g. click or names of events separated by spaces e.g. 'keyup keydown'
* @param {function} callback Callback to run when event is triggered
* @returns Colla
* @example
* $('.click-me').on('click', function() { alert('Clicked!'); });
*/
on: function(name, callback) {
return this.each(function(el) {
name.split(' ').forEach(function(ev){
el.addEventListener(ev, callback);
});
});
},
/**
* Attaches an event to the selector and removes after callback
* @memberOf Colla
* @param {string} name Name of event e.g. 'click' or names of events separated by spaces e.g. 'keyup keydown'
* @param {function} callback Callback to run when event is triggered
* @returns Colla
* @example
* $('.click-me').one('click', function() { alert('Clicked!'); });
*/
one: function(name, callback) {
return this.each(function(el) {
name.split(' ').forEach(function(ev){
var callbackWithRemove = function() {
callback();
el.removeEventListener(ev, callbackWithRemove); // remove event
};
el.addEventListener(ev, callbackWithRemove);
});
});
},
/**
* Removes an event from the selector
* @memberOf Colla
* @param {string} name Name of event e.g. click or names of events separated by spaces e.g. 'keyup keydown'
* @param {function} callback Callback to run when event is triggered
* @returns Colla
* @example
* $('.click-me').off('click', function() { alert('Clicked!'); });
*/
off: function(name, callback) {
return this.each(function(el) {
name.split(' ').forEach(function(ev){
el.removeEventListener(ev, callback);
});
});
},
/**
* Sets the first selector to be focussed
* @memberOf Colla
* @returns Colla
* @example
* $('.focus').focus();
*/
focus: function() {
if(this.s.length > 0) {
this.s[0].focus();
}
return this;
},
/**
* Removes keyboard focus from first selector
* @memberOf Colla
* @returns Colla
* @example
* $('.blur').blur();
*/
blur: function() {
if(this.s.length > 0) {
this.s[0].blur();
}
return this;
},
/**
* Trigger an event from the selector
* @memberOf Colla
* @param {string} name Name of event e.g. click
* @param {object} detail The data passed when initializing the event
* @returns Colla
* @example
* $('.click-me').trigger('click');
*/
trigger: function(name, detail) {
return this.each(function(el) {
var triggerEvent = ((detail) ? new CustomEvent(name, detail) : document.createEvent('HTMLEvents'));
if(!detail) {
triggerEvent.initEvent(name, true, false);
}
el.dispatchEvent(triggerEvent);
});
},
/**
* Find the previous sibling to the current selector
* @memberOf Colla
* @returns Colla
* @example
* $('.selector').prev();
*/
prev: function() {
if(this.s.length > 0) {
this.s = this.s[0].previousElementSibling;
} else {
this.s = [];
}
return this;
},
/**
* Find the next sibling to the current selector
* @memberOf Colla
* @returns Colla
* @example
* $('.selector').next();
*/
next: function() {
if(this.s.length > 0) {
this.s = this.s[0].nextElementSibling;
} else {
this.s = [];
}
return this;
},
/**
* Find the first element of the selector
* @memberOf Colla
* @returns Colla
* @example
* $('.selector').first();
*/
first: function() {
if(this.s.length > 0) {
this.s = this.s[0];
}
return this;
},
/**
* Find the last element of the selector
* @memberOf Colla
* @returns Colla
* @example
* $('.selector').last();
*/
last: function() {
if(this.s.length > 0) {
var arrayLength = this.s.length;
this.s = this.s.slice(arrayLength-1,arrayLength);
}
return this;
},
/**
* Find the parent of the selector
* @memberOf Colla
* @returns Colla
* @example
* $('.selector').parent();
*/
parent: function() {
if(this.s.length > 0) {
this.s = this.s[0].parentNode;
}
return this;
},
/**
* Find the children of the selector
* @memberOf Colla
* @returns Colla
* @example
* $('.selector').children();
*/
children: function() {
if(this.s.length > 0) {
this.s.slice.call(this.s[0].children);
} else {
this.s = [];
}
return this;
},
/**
* Add HTML to the page in relation to the current selector
* @memberOf Colla
* @param {string} position The position to add the html - before, after, atstart, atend
* @param {string} html The HTML to add
* @returns Colla
* @example
* $('.html').append('before','<p>I am before</p>');
*/
append: function(position, html) {
return this.each(function(el) {
switch(position.toLowerCase()){
case 'before': return el.insertAdjacentHTML('beforebegin', html);
case 'after': return el.insertAdjacentHTML('afterend', html);
case 'atstart': return el.insertAdjacentHTML('afterbegin', html);
case 'atend': return el.insertAdjacentHTML('beforeend', html);
}
});
},
/**
* Set the text of a selector
* @memberOf Colla
* @param {string} text Text to set
* @returns Colla or text
* @example
* $('.text').text('Some text.');
*/
text: function(text) {
if(text) {
return this.each(function(el) {
el.textContent = text;
});
} else {
return this.s[0].textContent.trim();
}
},
/**
* Set the HTML of a selector
* @memberOf Colla
* @param {string} html HTML to set
* @returns Colla or HTML
* @example
* $('.text').html('<span>A span.</span>');
*/
html: function(html) {
if(html) {
return this.each(function(el) {
el.innerHTML = html;
});
} else {
return this.s[0].innerHTML;
}
},
/**
* Set the outerHTML of a selector
* @memberOf Colla
* @param {string} html HTML to set
* @returns Colla or HTML
* @example
* $('.text').outerHTML('<span>A span.</span>');
*/
outerHTML: function(html) {
if(html) {
return this.each(function(el) {
el.outerHTML = html;
});
} else {
return this.s[0].outerHTML;
}
},
/**
* Empty the HTML of a selector
* @memberOf Colla
* @returns Colla
* @example
* $('.empty-me').empty();
*/
empty: function() {
return this.each(function(el) {
el.innerHTML = '';
});
},
/**
* Clone a selector
* @memberOf Colla
* @returns Colla
* @example
* $('.empty-me').clone();
*/
clone: function() {
return this.each(function(el) {
el.clodeNode(true);
});
},
/**
* Removes a selector
* @memberOf Colla
* @returns Colla
* @example
* $('.remove-me').remove();
*/
remove: function() {
return this.each(function(el) {
el.parentNode.removeChild(el);
});
},
/**
* Get or set the attribute of a selector
* @memberOf Colla
* @param {string} name Attr to get or set
* @param {string} value Value to set
* @returns Colla
* @example
* $('.get-attr').attr('data-attr');
* $('.set-attr').attr('data-attr','Value');
*/
attr: function(name, value) {
if(!value) {
return this.s[0].getAttribute(name);
} else {
return this.each(function(el) {
el.setAttribute(name, value);
});
}
},
/**
* Remove an attribute from a selector
* @memberOf Colla
* @param {string} name Attr to remove
* @returns Colla
* @example
* $('.attr').removeAttr('data-attr');
*/
removeAttr: function(name) {
return this.each(function(el) {
el.removeAttribute(name);
});
},
/**
* Get the value of a selector
* @memberOf Colla
* @param {string} value Value to set
* @returns value
* @example
* $('.input').val();
*/
val: function(value) {
if(value) {
return this.each(function(el) {
el.value = value;
});
} else {
if(this.s.length > 0) {
return this.s[0].value;
} else {
return undefined;
}
}
},
/**
* Get the number of matched elements in the selector
* @memberOf Colla
* @returns length
* @example
* $('.length').length();
*/
length: function() {
return this.s.length;
},
/**
* Get the height of the first element in the selector
* @memberOf Colla
* @returns number height
* @example
* $('.height').height();
*/
height: function() {
if(this.s.length > 0) {
return this.s[0].offsetHeight;
} else {
return null;
}
},
/**
* Get the width of the first element in the selector
* @memberOf Colla
* @returns number width
* @example
* $('.width').width();
*/
width: function() {
if(this.s.length > 0) {
return this.s[0].offsetWidth;
} else {
return null;
}
},
/**
* Returns the position of the first element in the selector relative to the viewport
* @memberOf Colla
* @returns TextRectangle object
* @example
* $('.position').position();
*/
position: function() {
if(this.s.length > 0) {
return this.s[0].getBoundingClientRect();
} else {
return null;
}
},
/**
* Returns true if the element matches the selector string
* @memberOf Colla
* @param {string} selector Selector to match
* @returns boolean
* @example
* $('.paragraph').matches('p');
*/
matches: function(selector) {
return this.s[0].matches(selector);
},
/**
* Returns closest element to selector
* @memberOf Colla
* @param {string} selector Selector to match
* @returns Colla
* @example
* $('.logo').closest('.header');
*/
closest: function(selector) {
return new Colla(this.s[0].closest(selector));
}
};
// Asynchronous Module Definition support
if (typeof define === "function" && define.amd) {
define(function() {
return Colla;
});
}
// Expose colla to the world:-)
window.$ = window.Colla = Colla;
// Expose functions to the world
window.$.fn = collaProto;
}(window, document));
// Polyfills
// Matches - prefixed in IE, IOS7 Safari and older Android browser versions
if(!Element.prototype.matches) {
Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
}
// Closest - not yet supported by IE and Safari
if(!Element.prototype.closest) {
Element.prototype.closest = function closest(selector) {
var node = this;
while (node) {
if (node.matches(selector)) {
return node;
}
else {
node = node.parentElement;
}
}
return null;
};
}

33
lib/d3Notif.js vendored
View file

@ -1,33 +0,0 @@
function Notif(option){
//Configuration
var el = this;
el.self = document.querySelector('.toast-message');
el.message = document.querySelector('.message');
el.top = option.topPos;
el.classNames = option.classNames;
el.autoClose = (typeof option.autoClose === "boolean")? option.autoClose: false;
el.autoCloseTimeout = (option.autoClose && typeof option.autoCloseTimeout === "number")? option.autoCloseTimeout: 3000;
//Methods
el.reset = function(){
(el.message).innerHTML="";
el.self.classList.remove(el.classNames);
}
el.showN = function(msg,type){
el.reset();
el.message.innerHTML=msg;
el.self.style.top= el.top;
el.self.classList.add(type);
if(el.autoClose){
setTimeout(function(){
el.hideN();
}, el.autoCloseTimeout);
}
}
el.hideN = function(){
el.self.style.top='-100%';
el.reset();
};
}

View file

@ -1,76 +0,0 @@
window.rp_requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame||(function(callback,element){setTimeout(callback,1000/60);});
function RadialProgress(container,cfg){
container.innerHTML="";
var nc=document.createElement("div");
nc.style.width="10em"; nc.style.height="10em";
nc.style.position="relative";
container.appendChild(nc);
container=nc;
if(!cfg) cfg={};
this.colorBg=cfg.colorBg==undefined?"#404040":cfg.colorBg;
this.colorFg=cfg.colorFg==undefined?"#007FFF":cfg.colorFg;
this.colorText=cfg.colorText==undefined?"#FFFFFF":cfg.colorText;
this.indeterminate=cfg.indeterminate==undefined?false:cfg.indeterminate;
this.round=cfg.round==undefined?false:cfg.round;
this.thick=cfg.thick==undefined?2:cfg.thick;
this.progress=cfg.progress==undefined?0:cfg.progress;
this.noAnimations=cfg.noAnimations==undefined?0:cfg.noAnimations;
this.fixedTextSize=cfg.fixedTextSize==undefined?false:cfg.fixedTextSize;
this.animationSpeed=cfg.animationSpeed==undefined?1:cfg.animationSpeed>0?cfg.animationSpeed:1;
this.noPercentage=cfg.noPercentage==undefined?false:cfg.noPercentage;
this.spin=cfg.spin==undefined?false:cfg.spin;
if(cfg.noInitAnimation) this.aniP=this.progress; else this.aniP=0;
var c=document.createElement("canvas");
c.style.position="absolute";c.style.top="0";c.style.left="0";c.style.width="100%";c.style.height="100%";c.className="rp_canvas";
container.appendChild(c);
this.canvas=c;
var tcc=document.createElement("div");
tcc.style.position="absolute";tcc.style.display="table";tcc.style.width="100%";tcc.style.height="100%";
var tc=document.createElement("div");
tc.style.display="table-cell";tc.style.verticalAlign="middle";
var t=document.createElement("div");
t.style.color=this.colorText;t.style.textAlign="center";t.style.overflow="visible";t.style.whiteSpace="nowrap";t.className="rp_text";
tc.appendChild(t);
tcc.appendChild(tc);
container.appendChild(tcc);
this.text=t;
this.prevW=0; this.prevH=0; this.prevP=0; this.indetA=0; this.indetB=0.2; this.rot=0;
this.draw=function(f){
if(!(f==true))rp_requestAnimationFrame(this.draw);
var c=this.canvas;
var dp=window.devicePixelRatio||1;
c.width=c.clientWidth*dp; c.height=c.clientHeight*dp;
if(!(f==true)&&!this.spin&&!this.indeterminate&&(Math.abs(this.prevP-this.progress)<1&&this.prevW==c.width&&this.prevH==c.height)) return;
var centerX=c.width/2, centerY=c.height/2, bw=(c.clientWidth/100.0), radius=c.height/2-(this.thick*bw*dp)/2, bw=(c.clientWidth/100.0);
this.text.style.fontSize=(this.fixedTextSize?(c.clientWidth*this.fixedTextSize):(c.clientWidth*0.26-this.thick))+"px";
if(this.noAnimations) this.aniP=this.progress; else{var aniF=Math.pow(0.93,this.animationSpeed);this.aniP=this.aniP*aniF+this.progress*(1-aniF);}
c=c.getContext("2d");
c.beginPath();
c.strokeStyle=this.colorBg;
c.lineWidth=this.thick*bw*dp;
c.arc(centerX,centerY,radius,-Math.PI/2, 2*Math.PI);
c.stroke();
c.beginPath();
c.strokeStyle=this.colorFg;
c.lineWidth=this.thick*bw*dp;
if(this.round) c.lineCap="round";
if(this.indeterminate){
this.indetA=(this.indetA+0.07*this.animationSpeed)%(2*Math.PI);this.indetB=(this.indetB+0.14*this.animationSpeed)%(2*Math.PI);
c.arc(centerX,centerY,radius,this.indetA, this.indetB);
if(!this.noPercentage)this.text.innerHTML="";
}else{
if(this.spin&&!this.noAnimations)this.rot=(this.rot+0.07*this.animationSpeed)%(2*Math.PI)
c.arc(centerX,centerY,radius,this.rot-Math.PI/2, this.rot+this.aniP*(2*Math.PI)-Math.PI/2);
if(!this.noPercentage)this.text.innerHTML=Math.round(100*this.aniP)+" %";
}
c.stroke();
this.prevW=c.width; this.prevH=c.height; this.prevP=this.aniP;
}.bind(this);
this.draw();
}
RadialProgress.prototype={
constructor:RadialProgress,
setValue:function(p){this.progress=p<0?0:p>1?1:p;},
setIndeterminate:function(i){this.indeterminate=i;},
setText:function(t){this.text.innerHTML=t;}
}

19027
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

56
package.json Normal file
View file

@ -0,0 +1,56 @@
{
"name": "toolz",
"version": "3.0.0",
"description": "A set of accessible web tools",
"scripts": {
"dev": "webpack serve --config config/webpack.dev.js",
"build": "webpack --config config/webpack.prod.js",
"build-list": "node src/build_list.js",
"format": "prettier --write '**/*.{js,ts}'",
"lint": "eslint 'src/**/*.{js,ts}' && echo 'Linting complete!'",
"lint-fix": "eslint 'src/**/*.{js,ts}' --fix"
},
"author": "Eduard Ursu",
"license": "(CC BY-NC-SA 4.0)",
"bugs": {
"url": "https://github.com/d3ward/toolz/issues"
},
"dependencies": {
"@babel/core": "^7.18.2",
"@babel/preset-env": "^7.18.2",
"babel-loader": "^8.2.5",
"clean-webpack-plugin": "^4.0.0",
"copy-webpack-plugin": "^11.0.0",
"css-loader": "^6.7.1",
"css-minimizer-webpack-plugin": "^4.0.0",
"eslint": "^8.17.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-webpack-plugin": "^3.1.1",
"file-loader": "^6.2.0",
"glob": "^8.0.3",
"glob-all": "^3.3.0",
"html-loader": "^3.1.0",
"html-webpack-plugin": "^5.5.0",
"mini-css-extract-plugin": "^2.6.0",
"node-sass": "^7.0.1",
"ping-url": "^1.0.3",
"postcss": "^8.4.14",
"postcss-loader": "^7.0.0",
"postcss-preset-env": "^7.7.1",
"prettier": "^2.6.2",
"purgecss-webpack-plugin": "^4.1.3",
"reachable-url": "^1.7.1",
"sass": "^1.52.2",
"sass-loader": "^13.0.0",
"style-loader": "^3.3.1",
"webpack-dev-server": "^4.9.2",
"webpack-merge": "^5.8.0"
},
"devDependencies": {
"ejs": "^3.1.8",
"template-ejs-loader": "^0.9.3",
"webpack": "^5.74.0",
"webpack-cli": "^4.10.0"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="./resources/adblock/mstile-150x150.png"/>
<TileColor>#161625</TileColor>
</tile>
</msapplication>
</browserconfig>

View file

@ -1,130 +0,0 @@
const icons = {
"Ads": "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'><title>ionicons-v5-j</title><path d='M48,176v.66a17.38,17.38,0,0,1-4.2,11.23l0,.05C38.4,194.32,32,205.74,32,224c0,16.55,5.3,28.23,11.68,35.91A19,19,0,0,1,48,272h0a32,32,0,0,0,32,32h8a8,8,0,0,0,8-8V152a8,8,0,0,0-8-8H80A32,32,0,0,0,48,176Z'/><path d='M452.18,186.55l-.93-.17a4,4,0,0,1-3.25-3.93V62c0-12.64-8.39-24-20.89-28.32-11.92-4.11-24.34-.76-31.68,8.53A431.18,431.18,0,0,1,344.12,93.9c-23.63,20-46.24,34.25-67,42.31a8,8,0,0,0-5.15,7.47V299a16,16,0,0,0,9.69,14.69c19.34,8.29,40.24,21.83,62,40.28a433.74,433.74,0,0,1,51.68,52.16A26.22,26.22,0,0,0,416.44,416a33.07,33.07,0,0,0,10.44-1.74C439.71,410,448,399.05,448,386.4V265.53a4,4,0,0,1,3.33-3.94l.85-.14C461.8,258.84,480,247.67,480,224S461.8,189.16,452.18,186.55Z'/><path d='M240,320V152a8,8,0,0,0-8-8H136a8,8,0,0,0-8,8V456a24,24,0,0,0,24,24h52.45a32.66,32.66,0,0,0,25.93-12.45,31.65,31.65,0,0,0,5.21-29.05c-1.62-5.18-3.63-11-5.77-17.19-7.91-22.9-18.34-37.07-21.12-69.32A32,32,0,0,0,240,320Z'/></svg>",
"Analytics": '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><title>ionicons-v5-a</title><path d="M456,128a40,40,0,0,0-37.23,54.6L334.6,266.77a39.86,39.86,0,0,0-29.2,0L245.23,206.6a40,40,0,1,0-74.46,0L70.6,306.77A40,40,0,1,0,93.23,329.4L193.4,229.23a39.86,39.86,0,0,0,29.2,0l60.17,60.17a40,40,0,1,0,74.46,0l84.17-84.17A40,40,0,1,0,456,128Z"/></svg>',
"Error Trackers": '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><title>ionicons-v5-h</title><path d="M480,304.13v-32H400V215.2c29.42-27.95,32-64.76,32-103.2V96H400v16c0,28-1.86,48.15-9.9,63.84C368,128,324.32,112,256,112c-39.8,0-75.19,7.06-100.43,24.32-14.9,10.19-25.2,24.91-32.7,39.72C114,160.57,112,140.82,112,112V96H80v16c0,37.44,2.59,73.36,32,101.2v58.93H32v32l80-.13c0,19,3.7,53.09,10.39,69.69C96.6,396.76,80,422.31,80,464v16h32V464c0-27.66,9.1-44.71,26.17-61.32C160,448,177,464,240,464V176h32V464c65,0,80-16,101.83-61.32C390.9,419.29,400,436.35,400,464v16h32V464c0-41.68-16.6-67.23-42.39-90.31C396.3,357.09,400,323,400,304Z"/><path d="M256,32c-48.06,0-96,0-96,84,26.12-14,59.35-20,96-20,24.09,0,46.09,2.65,65.39,8,10.75,3,24.66,8.71,30.61,12C352,32,304.06,32,256,32Z"/></svg>',
"Mix": '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><title>ionicons-v5-i</title><path d="M479.66,268.7l-32-151.81C441.48,83.77,417.68,64,384,64H128c-16.8,0-31,4.69-42.1,13.94s-18.37,22.31-21.58,38.89l-32,151.87A16.65,16.65,0,0,0,32,272V384a64,64,0,0,0,64,64H416a64,64,0,0,0,64-64V272A16.65,16.65,0,0,0,479.66,268.7Zm-384-145.4c0-.1,0-.19,0-.28,3.55-18.43,13.81-27,32.29-27H384c18.61,0,28.87,8.55,32.27,26.91,0,.13.05.26.07.39l26.93,127.88a4,4,0,0,1-3.92,4.82H320a15.92,15.92,0,0,0-16,15.82,48,48,0,1,1-96,0A15.92,15.92,0,0,0,192,256H72.65a4,4,0,0,1-3.92-4.82Z"/><path d="M368,160H144a16,16,0,0,1,0-32H368a16,16,0,0,1,0,32Z"/><path d="M384,224H128a16,16,0,0,1,0-32H384a16,16,0,0,1,0,32Z"/></svg>',
"OEM": '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><title>ionicons-v5-k</title><path d="M336,0H176a64,64,0,0,0-64,64V448a64,64,0,0,0,64,64H336a64,64,0,0,0,64-64V64A64,64,0,0,0,336,0Zm32,448a32,32,0,0,1-32,32H176a32,32,0,0,1-32-32V64a32,32,0,0,1,32-32h11.35a7.94,7.94,0,0,1,7.3,4.75A32,32,0,0,0,224,56h64a32,32,0,0,0,29.35-19.25,7.94,7.94,0,0,1,7.3-4.75H336a32,32,0,0,1,32,32Z"/><path d="M336,48h0a11.88,11.88,0,0,0-9.53,4.69A48,48,0,0,1,288,72H224a48,48,0,0,1-38.47-19.31A11.88,11.88,0,0,0,176,48h0a16,16,0,0,0-16,16V448a16,16,0,0,0,16,16H336a16,16,0,0,0,16-16V64A16,16,0,0,0,336,48Z"/><path d="M336,0H176a64,64,0,0,0-64,64V448a64,64,0,0,0,64,64H336a64,64,0,0,0,64-64V64A64,64,0,0,0,336,0Zm32,448a32,32,0,0,1-32,32H176a32,32,0,0,1-32-32V64a32,32,0,0,1,32-32h11.35a7.94,7.94,0,0,1,7.3,4.75A32,32,0,0,0,224,56h64a32,32,0,0,0,29.35-19.25,7.94,7.94,0,0,1,7.3-4.75H336a32,32,0,0,1,32,32Z"/></svg>',
"Social Trackers": '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><title>ionicons-v5-j</title><path d="M336,256c-20.56,0-40.44-9.18-56-25.84-15.13-16.25-24.37-37.92-26-61-1.74-24.62,5.77-47.26,21.14-63.76S312,80,336,80c23.83,0,45.38,9.06,60.7,25.52,15.47,16.62,23,39.22,21.26,63.63h0c-1.67,23.11-10.9,44.77-26,61C376.44,246.82,356.57,256,336,256Zm66-88h0Z"/><path d="M467.83,432H204.18a27.71,27.71,0,0,1-22-10.67,30.22,30.22,0,0,1-5.26-25.79c8.42-33.81,29.28-61.85,60.32-81.08C264.79,297.4,299.86,288,336,288c36.85,0,71,9,98.71,26.05,31.11,19.13,52,47.33,60.38,81.55a30.27,30.27,0,0,1-5.32,25.78A27.68,27.68,0,0,1,467.83,432Z"/><path d="M147,260c-35.19,0-66.13-32.72-69-72.93C76.58,166.47,83,147.42,96,133.45,108.86,119.62,127,112,147,112s38,7.66,50.93,21.57c13.1,14.08,19.5,33.09,18,53.52C213.06,227.29,182.13,260,147,260Z"/><path d="M212.66,291.45c-17.59-8.6-40.42-12.9-65.65-12.9-29.46,0-58.07,7.68-80.57,21.62C40.93,316,23.77,339.05,16.84,366.88a27.39,27.39,0,0,0,4.79,23.36A25.32,25.32,0,0,0,41.72,400h111a8,8,0,0,0,7.87-6.57c.11-.63.25-1.26.41-1.88,8.48-34.06,28.35-62.84,57.71-83.82a8,8,0,0,0-.63-13.39C216.51,293.42,214.71,292.45,212.66,291.45Z"/></svg>',
"OnePlus": '<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>OnePlus icon</title><path d="M0 3.74V24h20.26V12.428h-2.256v9.317H2.254V5.995h9.318V3.742zM18.004 0v3.74h-3.758v2.256h3.758v3.758h2.255V5.996H24V3.74h-3.758V0zm-6.45 18.756V8.862H9.562c0 .682-.228 1.189-.577 1.504-.367.297-.91.437-1.556.437h-.245v1.625h2.133v6.31h2.237z"></path></svg>',
"Xiaomi": '<svg id="xiaomi-svg" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Xiaomi icon</title><path d="M19.96 20a.32.32 0 0 1-.32-.32V4.32a.32.32 0 0 1 .32-.32h3.71a.32.32 0 0 1 .33.32v15.36a.32.32 0 0 1-.33.32zm-6.22 0s-.3-.09-.3-.32v-9.43A2.18 2.18 0 0 0 11.24 8H4.3c-.4 0-.3.3-.3.3v11.38c0 .27-.3.32-.3.32H.33a.32.32 0 0 1-.33-.32V4.32A.32.32 0 0 1 .33 4h12.86a4.28 4.28 0 0 1 4.25 4.27l.01 11.41a.32.32 0 0 1-.32.32zm-6.9 0a.3.3 0 0 1-.3-.3v-9a.3.3 0 0 1 .3-.3h3.77a.3.3 0 0 1 .29.3v9a.3.3 0 0 1-.3.3z"></path></svg>',
"Huawei": '<svg id="huawei-svg" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Huawei icon</title><path d="M3.67 6.14S1.82 7.91 1.72 9.78v.35c.08 1.51 1.22 2.4 1.22 2.4 1.83 1.79 6.26 4.04 7.3 4.55 0 0 .06.03.1-.01l.02-.04v-.04C7.52 10.8 3.67 6.14 3.67 6.14zM9.65 18.6c-.02-.08-.1-.08-.1-.08l-7.38.26c.8 1.43 2.15 2.53 3.56 2.2.96-.25 3.16-1.78 3.88-2.3.06-.05.04-.09.04-.09zm.08-.78C6.49 15.63.21 12.28.21 12.28c-.15.46-.2.9-.21 1.3v.07c0 1.07.4 1.82.4 1.82.8 1.69 2.34 2.2 2.34 2.2.7.3 1.4.31 1.4.31.12.02 4.4 0 5.54 0 .05 0 .08-.05.08-.05v-.06c0-.03-.03-.05-.03-.05zM9.06 3.19a3.42 3.42 0 00-2.57 3.15v.41c.03.6.16 1.05.16 1.05.66 2.9 3.86 7.65 4.55 8.65.05.05.1.03.1.03a.1.1 0 00.06-.1c1.06-10.6-1.11-13.42-1.11-13.42-.32.02-1.19.23-1.19.23zm8.299 2.27s-.49-1.8-2.44-2.28c0 0-.57-.14-1.17-.22 0 0-2.18 2.81-1.12 13.43.01.07.06.08.06.08.07.03.1-.03.1-.03.72-1.03 3.9-5.76 4.55-8.64 0 0 .36-1.4.02-2.34zm-2.92 13.07s-.07 0-.09.05c0 0-.01.07.03.1.7.51 2.85 2 3.88 2.3 0 0 .16.05.43.06h.14c.69-.02 1.9-.37 3-2.26l-7.4-.25zm7.83-8.41c.14-2.06-1.94-3.97-1.94-3.98 0 0-3.85 4.66-6.67 10.8 0 0-.03.08.02.13l.04.01h.06c1.06-.53 5.46-2.77 7.28-4.54 0 0 1.15-.93 1.21-2.42zm1.52 2.14s-6.28 3.37-9.52 5.55c0 0-.05.04-.03.11 0 0 .03.06.07.06 1.16 0 5.56 0 5.67-.02 0 0 .57-.02 1.27-.29 0 0 1.56-.5 2.37-2.27 0 0 .73-1.45.17-3.14z"></path></svg>',
"Samsung": '<svg id="samsung-svg" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Samsung icon</title><path d="M19.8166 10.2808l.0459 2.6934h-.023l-.7793-2.6934h-1.2837v3.3925h.8481l-.0458-2.785h.023l.8366 2.785h1.2264v-3.3925zm-16.149 0l-.6418 3.427h.9284l.4699-3.1175h.0229l.4585 3.1174h.9169l-.6304-3.4269zm5.1805 0l-.424 2.6132h-.023l-.424-2.6132H6.5788l-.0688 3.427h.8596l.023-3.0832h.0114l.573 3.0831h.8711l.5731-3.083h.023l.0228 3.083h.8596l-.0802-3.4269zm-7.2664 2.4527c.0343.0802.0229.1949.0114.2522-.0229.1146-.1031.2292-.3324.2292-.2177 0-.3438-.126-.3438-.3095v-.3323H0v.2636c0 .7679.6074.9971 1.2493.9971.6189 0 1.1346-.2178 1.2149-.7794.0458-.298.0114-.4928 0-.5616-.1605-.722-1.467-.9283-1.5588-1.3295-.0114-.0688-.0114-.1375 0-.1834.023-.1146.1032-.2292.3095-.2292.2063 0 .321.126.321.3095v.2063h.8595v-.2407c0-.745-.6762-.8596-1.1576-.8596-.6074 0-1.1117.2063-1.2034.7564-.023.149-.0344.2866.0114.4585.1376.7106 1.364.9169 1.5358 1.3524m11.152 0c.0343.0803.0228.1834.0114.2522-.023.1146-.1032.2292-.3324.2292-.2178 0-.3438-.126-.3438-.3095v-.3323h-.917v.2636c0 .7564.596.9857 1.2379.9857.6189 0 1.1232-.2063 1.2034-.7794.0459-.298.0115-.4814 0-.5616-.1375-.7106-1.4327-.9284-1.5243-1.318-.0115-.0688-.0115-.1376 0-.1835.0229-.1146.1031-.2292.3094-.2292.1948 0 .321.126.321.3095v.2063h.848v-.2407c0-.745-.6647-.8596-1.146-.8596-.6075 0-1.1004.1948-1.192.7564-.023.149-.023.2866.0114.4585.1376.7106 1.341.9054 1.513 1.3524m2.8882.4585c.2407 0 .3094-.1605.3323-.2522.0115-.0343.0115-.0917.0115-.126v-2.533h.871v2.4642c0 .0688 0 .1948-.0114.2292-.0573.6419-.5616.8482-1.192.8482-.6303 0-1.1346-.2063-1.192-.8482 0-.0344-.0114-.1604-.0114-.2292v-2.4642h.871v2.533c0 .0458 0 .0916.0115.126 0 .0917.0688.2522.3095.2522m7.1518-.0344c.2522 0 .3324-.1605.3553-.2522.0115-.0343.0115-.0917.0115-.126v-.4929h-.3553v-.5043H24v.917c0 .0687 0 .1145-.0115.2292-.0573.6303-.596.8481-1.2034.8481-.6075 0-1.1461-.2178-1.2034-.8481-.0115-.1147-.0115-.1605-.0115-.2293v-1.444c0-.0574.0115-.172.0115-.2293.0802-.6419.596-.8482 1.2034-.8482s1.1347.2063 1.2034.8482c.0115.1031.0115.2292.0115.2292v.1146h-.8596v-.1948s0-.0803-.0115-.1261c-.0114-.0802-.0802-.2521-.3438-.2521-.2521 0-.321.1604-.3438.2521-.0115.0458-.0115.1032-.0115.1605v1.5702c0 .0458 0 .0916.0115.126 0 .0917.0917.2522.3323.2522"></path></svg>',
"Apple": '<svg id="apple-svg" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Apple icon</title><path d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701"></path></svg>'
};
const dataOEM = {
"Xiaomi": [
"https://api.ad.xiaomi.com",
"https://app.chat.xiaomi.net",
"https://data.mistat.xiaomi.com",
"https://data.mistat.intl.xiaomi.com",
"https://data.mistat.india.xiaomi.com",
"https://data.mistat.rus.xiaomi.com",
"https://sdkconfig.ad.xiaomi.com",
"https://sdkconfig.ad.intl.xiaomi.com",
"https://globalapi.ad.xiaomi.com",
"https://www.cdn.ad.xiaomi.com",
"https://tracking.miui.com",
"https://sa.api.intl.miui.com",
"https://tracking.miui.com",
"https://tracking.intl.miui.com",
"https://tracking.india.miui.com",
"https://tracking.rus.miui.com"
],
"Huawei": [
"https://metrics.data.hicloud.com",
"https://metrics1.data.hicloud.com",
"https://metrics2.data.hicloud.com",
"https://metrics3.data.hicloud.com",
"https://metrics4.data.hicloud.com",
"https://metrics5.data.hicloud.com ",
"https://logservice.hicloud.com",
"https://logservice1.hicloud.com",
"https://metrics-dra.dt.hicloud.com",
"https://logbak.hicloud.com"
],
"OnePlus": [
"https://analytics.oneplus.cn",
"https://click.oneplus.cn",
"https://click.oneplus.com",
"https://open.oneplus.net"
],
"Samsung": [
"https://ad.samsungadhub.com",
"https://samsungadhub.com",
"https://samsungads.com",
"https://smetrics.samsung.com",
"https://nmetrics.samsung.com",
"https://samsung-com.112.2o7.net",
"https://business.samsungusa.com",
"https://analytics.samsungknox.com",
"https://bigdata.ssp.samsung.com",
"https://analytics-api.samsunghealthcn.com",
"https://config.samsungads.com"
],
"Apple": [
"https://metrics.apple.com",
"https://securemetrics.apple.com",
"https://supportmetrics.apple.com",
"https://metrics.icloud.com",
"https://metrics.mzstatic.com"
]
}
const data = {
"Ads": { //Ads
"Google Ads": [
"https://pagead2.googlesyndication.com","https://ads.google.com","https://adservice.google.com",
"https://pagead2.googleadservices.com","https://googleadservices.com"
],
"Media.net": ["https://static.media.net", "https://media.net", "https://adservetx.media.net"],
"Doubleclick.net": ["https://doubleclick.net/", "https://ad.doubleclick.net/","https://static.doubleclick.net","https://m.doubleclick.net",
"https://mediavisor.doubleclick.net"],
"FastClick": ["https://fastclick.com","https://fastclick.net","https://media.fastclick.net/", "https://cdn.fastclick.net/"],
"Amazon": ["https://adtago.s3.amazonaws.com","https://analyticsengine.s3.amazonaws.com",
"https://advice-ads.s3.amazonaws.com","https://affiliationjs.s3.amazonaws.com","https://advertising-api-eu.amazon.com",
"https://amazonaax.com","https://amazonclix.com",
"https://assoc-amazon.com"
]
},
"Analytics": { //Analytics
"Google Analytics": ["https://google-analytics.com","https://ssl.google-analytics.com"],
"Hotjar": ["https://hotjar.com", "https://static.hotjar.com","https://api-hotjar.com","https://hotjar-analytics.com"],
"MouseFlow": ["https://mouseflow.com/", "https://a.mouseflow.com"],
"FreshMarketer": "https://freshmarketer.com/",
"Luckyorange": ["https://luckyorange.com","https://cdn.luckyorange.com", "https://w1.luckyorange.com",
"https://upload.luckyorange.net", "https://cs.luckyorange.net",
"https://settings.luckyorange.net"
],
"Stats WP Plugin": "https://stats.wp.com"
},
"Error Trackers": { //Error tracker
"Bugsnag": ["https://notify.bugsnag.com", "https://sessions.bugsnag.com","https://api.bugsnag.com","https://app.bugsnag.com"],
"Sentry": ["https://browser.sentry-cdn.com","https://app.getsentry.com"]
},
"Social Trackers": {
"Facebook": ["https://pixel.facebook.com",
"https://analytics.facebook.com", "https://ads.facebook.com","https://an.facebook.com"
],
"Twitter": ["https://ads-twitter.com", "https://static.ads-twitter.com","https://ads-api.twitter.com","https://advertising.twitter.com"
],
"LinkedIn": ["https://ads.linkedin.com", "https://analytics.pointdrive.linkedin.com"],
"Pinterest": ["https://ads.pinterest.com", "https://log.pinterest.com", "https://ads-dev.pinterest.com",
"https://analytics.pinterest.com", "https://trk.pinterest.com","https://widgets.pinterest.com"
],
"Reddit": ["https://ads.reddit.com", "https://d.reddit.com", "https://rereddit.com",
"https://events.redditmedia.com"
],
"YouTube": ["https://ads.youtube.com", "https://youtube.cleverads.vn"]
,
"TikTok": ["https://analytics.tiktok.com", "https://ads.tiktok.com", "https://analytics-sg.tiktok.com","https://ads-sg.tiktok.com"]
},
"Mix": {
"Yahoo": ["https://ads.yahoo.com", "https://global.adserver.yahoo.com", "https://analytics.yahoo.com",
"https://ads.yap.yahoo.com"
],
"Yandex": ["https://appmetrica.yandex.com", "https://yandexadexchange.net",
"https://analytics.mobile.yandex.net", "https://extmaps-api.yandex.net",
"https://adsdk.yandex.ru"
]
}
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View file

@ -1 +0,0 @@
<svg version="1.0" fill="currentColor" xmlns="http://www.w3.org/2000/svg" width="141.333" height="141.333" viewBox="0 0 106 106"><path d="M35 1.5c-9.1 2-22.1 6.3-25.9 8.6-4.3 2.6-4.9 4.8-4.6 16.6.8 25.7 13 51.2 32.8 68.7 8.2 7.2 13.1 10.6 15.5 10.6 4.9 0 20.6-13.4 29.6-25.4 12.6-16.7 18.8-35 19-55.9.1-10.6 0-10.9-2.6-13.2C95.7 8.8 87.9 5.7 77 2.8 67.2.2 44.4-.5 35 1.5zm36 6.6c7.5 1.4 22.7 6.6 23.7 8.2 1.1 1.8.5 14.1-1.1 22.2-2.3 11.6-8 25.8-14.1 35-4.6 7-18.5 21.4-23.4 24.4l-3.4 2-3.1-2.2C40 91.1 28.7 77.9 22.2 66c-3.6-6.6-8.7-20.7-9.7-27-.4-2.5-.9-5.2-1-6.1-.4-2-.7-10.2-.6-14.2.1-2.3.9-3.1 4.9-4.8 15.7-6.8 36.9-9 55.2-5.8z"/><path d="M44.7 13.6c-.1.1-2.4.4-5.2.8-5.8.7-14.8 3.2-18.9 5.3-2.9 1.5-2.9 1.5-2.3 9.1.6 9.1 3.3 21.2 5.1 23.8 1.3 1.7 1.5 1.7 6 0 2.5-1 4.6-2.2 4.6-2.7s.1-1.1.1-1.4c.1-.2.6-2.8 1-5.6C36.9 31.3 48.6 24 59.6 27.7 63.4 29 71 35.2 71 37.1c0 2.5 14.5-.3 16-3.1.5-1 1-4.1 1.1-7 .2-4.2-.2-5.6-1.7-6.7-2.3-1.7-13.6-5.2-18.9-5.9-4.2-.6-22.3-1.2-22.8-.8zM76.5 46.9c-2.3.5-3.3 1.5-4.5 4.7-5 13.2-19.1 17.9-29.7 9.8-3.1-2.3-3.6-2.4-6.9-1.2-5 1.8-5.9 3.9-3.7 8.6 2.5 5.3 18.2 21.2 21 21.2 2.9 0 14.1-10.5 19.9-18.6C79.4 61.9 85.8 47 83.1 47c-.5 0-1.5-.2-2.3-.4-.7-.2-2.6-.1-4.3.3z"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -1 +0,0 @@
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="141.333" height="141.333" viewBox="0 0 106 106"><path d="M35 1.5c-9.1 2-22.1 6.3-25.9 8.6-4.3 2.6-4.9 4.8-4.6 16.6.8 25.7 13 51.2 32.8 68.7 8.2 7.2 13.1 10.6 15.5 10.6 4.9 0 20.6-13.4 29.6-25.4 12.6-16.7 18.8-35 19-55.9.1-10.6 0-10.9-2.6-13.2C95.7 8.8 87.9 5.7 77 2.8 67.2.2 44.4-.5 35 1.5zm36 6.6c7.5 1.4 22.7 6.6 23.7 8.2 1.1 1.8.5 14.1-1.1 22.2-2.3 11.6-8 25.8-14.1 35-4.6 7-18.5 21.4-23.4 24.4l-3.4 2-3.1-2.2C40 91.1 28.7 77.9 22.2 66c-3.6-6.6-8.7-20.7-9.7-27-.4-2.5-.9-5.2-1-6.1-.4-2-.7-10.2-.6-14.2.1-2.3.9-3.1 4.9-4.8 15.7-6.8 36.9-9 55.2-5.8z"/><path d="M44.7 13.6c-.1.1-2.4.4-5.2.8-5.8.7-14.8 3.2-18.9 5.3-2.9 1.5-2.9 1.5-2.3 9.1.6 9.1 3.3 21.2 5.1 23.8 1.3 1.7 1.5 1.7 6 0 2.5-1 4.6-2.2 4.6-2.7s.1-1.1.1-1.4c.1-.2.6-2.8 1-5.6C36.9 31.3 48.6 24 59.6 27.7 63.4 29 71 35.2 71 37.1c0 2.5 14.5-.3 16-3.1.5-1 1-4.1 1.1-7 .2-4.2-.2-5.6-1.7-6.7-2.3-1.7-13.6-5.2-18.9-5.9-4.2-.6-22.3-1.2-22.8-.8zM76.5 46.9c-2.3.5-3.3 1.5-4.5 4.7-5 13.2-19.1 17.9-29.7 9.8-3.1-2.3-3.6-2.4-6.9-1.2-5 1.8-5.9 3.9-3.7 8.6 2.5 5.3 18.2 21.2 21 21.2 2.9 0 14.1-10.5 19.9-18.6C79.4 61.9 85.8 47 83.1 47c-.5 0-1.5-.2-2.3-.4-.7-.2-2.6-.1-4.3.3z"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -1,14 +0,0 @@
{
"name": "Ad Blocker Test",
"short_name": "Ad Blocker Test",
"icons": [
{
"src": "android-chrome-96x96.png",
"sizes": "96x96",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

View file

@ -1 +0,0 @@
<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M216 120h272c13.3 0 24-10.7 24-24s-10.75-24-24-24H216c-13.3 0-24 10.75-24 24s10.7 24 24 24zm272 272H216c-13.3 0-24 10.7-24 24s10.75 24 24 24h272c13.25 0 24-10.75 24-24s-10.7-24-24-24zm0-160H216c-13.3 0-24 10.7-24 24s10.75 24 24 24h272c13.3 0 24-10.7 24-24s-10.7-24-24-24zM191.384 208.425L116.16 29.321c-3.344-7.975-16.469-7.975-19.813 0L21.123 208.425c-2.302 5.472.273 11.776 5.744 14.069a10.73 10.73 0 0014.07-5.745l15.129-36.022h100.388l15.13 36.022c1.71 4.124 5.695 6.587 9.904 6.587 1.386 0 2.799-.266 4.156-.84 5.471-2.295 8.068-8.608 5.74-14.07zM65.115 159.216l41.15-98.373 41.158 98.015H65.115zM153.843 356.303c10.402-10.045 16.92-24.107 16.92-39.687 0-30.523-24.822-55.358-55.358-55.358h-62.5c-5.915 0-10.714 4.8-10.714 10.715v178.571c0 5.938 4.8 10.714 10.714 10.714h76.786c30.536 0 55.357-24.821 55.357-55.357 0-21.83-12.812-40.58-31.205-49.598zM63.62 282.687h51.785c18.71 0 33.929 15.219 33.929 33.929s-15.223 33.928-33.929 33.928H63.62zM129.69 439.83H63.62v-67.857h66.071c18.71 0 33.929 15.218 33.929 33.928 0 18.71-15.224 33.929-33.929 33.929z"/></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -1 +0,0 @@
<svg viewBox="0 0 12.002 12.7" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="prefix__a"><stop offset="0" stop-color="#fc575e"/><stop offset="1" stop-color="#f7b42c"/></linearGradient></defs><g paint-order="stroke markers fill" stroke-width="10.32"><path d="M8 4.22c.581-.065 3.977.236 3.961.314L5.19 8.361.034 8.214z" fill-opacity=".831"/><path d="M3.579 4.385C1.42 4.27.047 2.012 0 0h3.982c3.437 0 4.025.013 4.24.044 2.282-.027 3.674 2.286 3.74 4.49M7.38 8.204c2.537.053 4.463 2.109 4.622 4.496l-7.9-.016c-1.18-.019-4.052-1.81-4.068-4.47"/></g></svg>

Before

Width:  |  Height:  |  Size: 567 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6 KiB

View file

@ -1,35 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
<loc>https://d3ward.github.io/toolz/</loc>
<lastmod>2021-08-25T00:05:37+00:00</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://d3ward.github.io/toolz/index.html</loc>
<lastmod>2021-08-25T00:05:37+00:00</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://d3ward.github.io/toolz/adblock.html</loc>
<lastmod>2021-08-25T00:05:37+00:00</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://d3ward.github.io/toolz/fontlist.html</loc>
<lastmod>2021-08-25T00:05:37+00:00</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://d3ward.github.io/toolz/units.html</loc>
<lastmod>2021-08-25T00:05:37+00:00</lastmod>
<priority>0.80</priority>
</url>
</urlset>

110
src/404.ejs Normal file
View file

@ -0,0 +1,110 @@
<!DOCTYPE html>
<html lang="en">
<%- include('partials/head.ejs',
{
page: '404',
title:'Toolz by d3ward - 404',
description:'Are you looking for a reliable and comprehensive toolkit for testing browser features? Look no further!'+
' Toolz is an open source project that offers a range of tools for testing everything from fonts and'+
' viewport units to the efficiency of ad blockers. With this easy-to-use interface and extensive collection of testing tools,'+
' you\'ll have everything you need to ensure that your websites, browser and applications are optimized for the best performance and user experience.',
url: 'd3ard.github.io/toolz/',
preview_thumbnail:'https://d3ward.github.io/toolz/src/preview_toolz.png',
keywords:'toolz,web tools,tools,browser testing,font testing,viewport testing,adblock testing, ad blocker testing,performance,toolkit,web design,open source'
}) %>
<body>
<ul class="squares">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<main>
<div class="hero">
<div class="_aos-top">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-error-404" width="180" height="180" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M3 7v4a1 1 0 0 0 1 1h3"></path>
<path d="M7 7v10"></path>
<path d="M10 8v8a1 1 0 0 0 1 1h2a1 1 0 0 0 1 -1v-8a1 1 0 0 0 -1 -1h-2a1 1 0 0 0 -1 1z"></path>
<path d="M17 7v4a1 1 0 0 0 1 1h3"></path>
<path d="M21 7v10"></path>
</svg>
</div>
<div class="_aos-bottom _txt">
<h2><strong>Not Found</strong></h2>
<h5>Maybe you are looking for one of these toolz !</h5>
<a href="/" class="btn">
<svg viewBox="0 0 12.002 12.7" fill="var(--primary)" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient>
<stop offset="0" stop-color="#fc575e"></stop>
<stop offset="1" stop-color="#f7b42c"></stop>
</linearGradient>
</defs>
<g paint-order="stroke markers fill" stroke-width="10.32">
<path d="M8 4.22c.581-.065 3.977.236 3.961.314L5.19 8.361.034 8.214z" fill-opacity=".831">
</path>
<path
d="M3.579 4.385C1.42 4.27.047 2.012 0 0h3.982c3.437 0 4.025.013 4.24.044 2.282-.027 3.674 2.286 3.74 4.49M7.38 8.204c2.537.053 4.463 2.109 4.622 4.496l-7.9-.016c-1.18-.019-4.052-1.81-4.068-4.47">
</path>
</g>
</svg>
Toolz - Home
</a>
</div>
</div>
<section>
<div class="_2-col">
<div>
<a href="./adblock.html">
<div class="card _aos-bottom _txt">
<div class="img-w">
<svg fill="var(--blue)" viewbox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
<path
d="M63.98 27.685c-11.2 0-19.45 1.43-28.666 4.974-4.726 1.82-4.948 2.305-4.368 9.538.783 9.734 3.79 21.804 5.788 23.204h.006c1.294.906 1.359.895 5.762-1.055l3.887-1.719.247-4.466c.164-2.95.534-5.16 1.088-6.504 5.8-13.987 24.36-15.6 32.377-2.819a165.87 165.87 0 001.536 2.415c.067.094 2.902-.286 6.302-.846 8.414-1.387 8.515-1.474 9.115-8.288.61-6.893.258-7.667-4.35-9.434-9.273-3.57-17.497-5-28.724-5zm25.782 31.108c-1.212.054-2.792.318-4.78.755-2.195.483-2.222.51-2.48 2.37-.616 4.503-4.08 9.553-8.47 12.35-6.523 4.147-15.674 3.25-21.484-2.103l-1.947-1.79-3.19 1.393c-1.753.767-3.526 1.681-3.94 2.031-1.226 1.034-1.4 3.21-.41 5.144 2.298 4.507 10.82 14.17 16.92 19.18 3.835 3.15 4.28 3.086 9.514-1.38 9.813-8.38 18.129-20.139 22.552-31.883 1.703-4.517 1.35-6.23-2.285-6.067z" />
<path
d="M64.005 14c-4.992 0-9.984.257-13.262.768-9.64 1.5-18.933 4.257-27.123 8.04-5.084 2.35-5.615 3.542-5.632 12.586-.033 20.197 6.158 38.675 18.568 55.385 5.694 7.667 17.217 18.304 24.057 22.214 3.57 2.043 5.931 1.22 13.555-4.733 16.362-12.774 28.101-30.598 33.021-50.138 1.837-7.303 2.46-11.792 2.715-19.636.294-9.007.046-11.2-1.47-13.008-2.835-3.36-18.461-8.73-31.174-10.71-3.276-.51-8.264-.768-13.255-.768zm.215 6.185c12.843.02 22.323 1.856 34.447 6.686 5.127 2.04 5.287 2.25 5.28 6.797-.03 20.474-7.486 41.401-20.326 57.078-4.633 5.654-12.121 12.67-17.188 16.108-.926.63-2.018 1.145-2.428 1.145-2.337 0-13.634-9.92-19.584-17.2-12.93-15.824-20.368-36.67-20.371-57.105 0-4.456.524-5.062 6.204-7.246 11.754-4.52 21.305-6.28 33.966-6.263z" />
</svg>
</div>
<h6 class="_txt-center">Adblock Test</h6>
</div>
</a>
</div>
<div>
<a href="./fontlist.html">
<div class="card _aos-bottom _txt">
<div class="img-w"><svg fill="var(--orange)" viewbox="0 0 128 128"
xmlns="http://www.w3.org/2000/svg">
<path
d="M50.336 22.85c-1.471 0-2.942.712-3.54 2.137L19.911 89a3.84 3.84 0 002.052 5.029 3.835 3.835 0 005.029-2.054l5.407-12.874h35.88l5.408 12.874a3.82 3.82 0 003.539 2.354c.07 0 .139-.017.208-.02.063.004.122.019.186.019h18.893c7.513 0 13.619-6.108 13.619-13.62 0-5.372-3.152-9.985-7.677-12.204 2.559-2.472 4.162-5.932 4.162-9.765 0-7.51-6.107-13.62-13.62-13.62H77.62a2.637 2.637 0 00-2.636 2.636V75.24L53.877 24.987c-.597-1.425-2.07-2.138-3.54-2.138zM18.991 97.655c-4.372 0-4.991 1.67-4.991 3.747s.636 3.748 4.99 3.748H108.4c4.355 0 5.601-1.679 5.601-3.748s-1.23-3.747-5.601-3.747z" />
</svg></div>
<h6 class="_txt-center">FontList</h6>
</div>
</a></div>
<div>
<a href="./units.html">
<div class="card _aos-bottom _txt">
<div class="img-w"><svg fill="var(--green)" viewbox="0 0 128 128"
xmlns="http://www.w3.org/2000/svg">
<path
d="M104.625 67.125h-43.75v-43.75c0-5.156-4.219-9.375-9.375-9.375H23.375C18.219 14 14 18.219 14 23.375v81.25c0 5.156 4.219 9.375 9.375 9.375h81.25c5.156 0 9.375-4.219 9.375-9.375V76.5c0-5.156-4.219-9.375-9.375-9.375zm-3.568 37.5H26.158c-2.758-.237-2.783-.235-2.783-3.16V27.18c.136-3.817-.293-3.805 3.703-3.805h21.254c3.256.106 3.168.005 3.168 2.579v5.808c.02.556-.196.812-.728.812H35.875c-4.447.492-3.296 6.15 0 6.25l14.88.168c.45.003.7.148.745.661v11.048c.052.523-.249.781-.745.799h-14.88c-4.442.492-3.297 6.149 0 6.25h14.773c.53.033.838.186.852.701V69.5c-.013.573-.295.751-.852.751H35.875c-4.442.492-3.297 6.149 0 6.25h14.844c.562-.004.781.255.781.767v14.858c.492 4.442 6.149 3.297 6.25 0V77.231c-.012-.617.265-.713.79-.731h10.8c.716.016.91.308.91.927v14.698c.491 4.447 6.15 3.296 6.25 0V77.409c.004-.732.216-.909.891-.909h10.73c.778.046.879.522.879 1.175v14.45c.491 4.447 6.15 3.296 6.25 0V77.888c-.01-.987.267-1.388 1.453-1.388h5.376c1.816-.048 2.51.929 2.546 2.486v22.582c-.194 2.912-.327 3.057-3.568 3.057z" />
</svg></div>
<h6 class="_txt-center">Units</h6>
</div>
</a>
</div>
</div>
</section>
</main>
<%- include('partials/footer.ejs') %>
<%- include('partials/gotop.ejs') %>
</body>
</html>

225
src/adblock.ejs Normal file
View file

@ -0,0 +1,225 @@
<!DOCTYPE html>
<html lang="en">
<%- include('partials/head.ejs',
{
page:'adblock',
title:'Test Ad Block - Toolz',
description:'Looking for an easy way to check the efficiency of your ad blocker?'+
'Toolz offers a simple and beautiful design test that allows you to quickly and easily test the performance of'+
'current ad/content blocker solution. Intuitive interface makes it easy to navigate and use,and the beautiful design ensures that the experience is visually appealing. '+
'With just a click, you can see how well the ad blocker is working and make any necessary adjustments.',
url: 'd3ard.github.io/toolz/adblock',
preview_thumbnail:'https://d3ward.github.io/toolz/src/preview_toolz.png',
keywords:'adblock,test adblock,analytics,trackers,ads,cosmetic filter,ublock, ublockorigin,adblock extension,script loading'
}) %>
<body class="_overflowhidden">
<%- include('partials/adblock/report.ejs') %>
<%- include('partials/support_me.ejs') %>
<%- include('partials/adblock/faq.ejs') %>
<%- include('partials/adblock/logs.ejs') %>
<%- include('partials/header.ejs', {page:'adblock'}) %>
<main>
<button data-a11y-dialog-show="dlg_reports"> <svg xmlns="http://www.w3.org/2000/svg"
class="icon icon-tabler icon-tabler-list-details" width="24" height="24" viewBox="0 0 24 24"
stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M13 5h8"></path>
<path d="M13 9h5"></path>
<path d="M13 15h8"></path>
<path d="M13 19h5"></path>
<rect x="3" y="4" width="6" height="6" rx="1"></rect>
<rect x="3" y="14" width="6" height="6" rx="1"></rect>
</svg> Reports</button>
<button data-a11y-dialog-show="dlg_faq">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-info-square" width="24" height="24"
viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round"
stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<line x1="12" y1="8" x2="12.01" y2="8"></line>
<rect x="4" y="4" width="16" height="16" rx="2"></rect>
<polyline points="11 12 12 12 12 16 13 16"></polyline>
</svg> Open FAQ</button>
<button data-a11y-dialog-show="dlg_logs">
<svg xmlns="http://www.w3.org/2000/svg"
class="icon icon-tabler icon-tabler-message-2-code" width="24" height="24" viewBox="0 0 24 24"
stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path
d="M12 20l-3 -3h-2a3 3 0 0 1 -3 -3v-6a3 3 0 0 1 3 -3h10a3 3 0 0 1 3 3v6a3 3 0 0 1 -3 3h-2l-3 3">
</path>
<path d="M10 9l-2 2l2 2"></path>
<path d="M14 9l2 2l-2 2"></path>
</svg> Logs</button>
<section>
<div class="grid">
<div>
<div class="lt_wrap">
<div class="lt_particles">
<div class="p1">
<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2'
stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'>
<path d='M0 0h24v24H0z' stroke='none' />
<path d='M18 8a3 3 0 010 6M10 8v11a1 1 0 01-1 1H8a1 1 0 01-1-1v-5' />
<path
d='M12 8h0l4.524-3.77A.9.9 0 0118 4.922v12.156a.9.9 0 01-1.476.692L12 14H4a1 1 0 01-1-1V9a1 1 0 011-1h8' />
</svg>
</div>
<div class="p2">
<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2'
stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'>
<path d='M0 0h24v24H0z' stroke='none' />
<path d='M4 18V6a2 2 0 012-2h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2z' />
<path d='M7 14l3-3 2 2 3-3 2 2' />
</svg>
</div>
<div class="p3">
<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2'
stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'>
<path d='M0 0h24v24H0z' stroke='none' />
<circle cx='12' cy='5' r='2' />
<circle cx='5' cy='19' r='2' />
<circle cx='19' cy='19' r='2' />
<circle cx='12' cy='14' r='3' />
<path d='M12 7v4M6.7 17.8l2.8-2M17.3 17.8l-2.8-2' />
</svg>
</div>
<div class="p4">
<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2'
stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'>
<path d='M0 0h24v24H0z' stroke='none' />
<path
d='M9 9V8a3 3 0 016 0v1M8 9h8a6 6 0 011 3v3a5 5 0 01-10 0v-3a6 6 0 011-3M3 13h4M17 13h4M12 20v-6M4 19l3.35-2M20 19l-3.35-2M4 7l3.75 2.4M20 7l-3.75 2.4' />
</svg>
</div>
<div class="p5">
<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2'
stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'>
<path d='M0 0h24v24H0z' stroke='none' />
<path d='M12 4L4 8l8 4 8-4-8-4M4 12l8 4 8-4M4 16l8 4 8-4' />
</svg>
</div>
</div>
<div class="lt_cwrap">
<div class="lt_circle">
<div class="lt_wave"></div>
</div>
<div class="lt_value">
</div>
</div>
</div>
</div>
<div class="_f-center">
<button id="start_test"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-refresh-dot" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4"></path>
<path d="M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4"></path>
<circle cx="12" cy="12" r="1"></circle>
</svg> &nbsp; Re-test</button>
</div>
</div>
</section>
<section class="page-active">
<div class="grid">
<div>
<hr>
</div>
<div>
<div class="test_card">
<h5>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" stroke-width="2"
stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path d="M0 0h24v24H0z" stroke="none" />
<circle cx="12" cy="12" r="2" />
<path
d="M22 12c-2.667 4.667-6 7-10 7s-7.333-2.333-10-7c2.667-4.667 6-7 10-7s7.333 2.333 10 7" />
</svg>
&nbsp; Cosmetic Filter
</h5>
<div class="row keep-width">
<div>
<div id="ct_static" class="test_block _aos">
<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2'
stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'>
<path d='M0 0h24v24H0z' stroke='none' />
<rect x='3' y='5' width='18' height='14' rx='2' />
<path d='M7 15v-4a2 2 0 014 0v4m-4-2h4m6-4v6h-1.5a1.5 1.5 0 111.5-1.5' />
</svg>
&nbsp;
Static Ad
<div id="cts_test" class="adsbox banner_ads"></div>
</div>
</div>
<div>
<div id="ct_dynamic" class="test_block _aos">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round"
stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M11.933 5h-6.933v16h13v-8"></path>
<path d="M14 17h-5"></path>
<path d="M9 13h5v-4h-5z"></path>
<path d="M15 5v-2"></path>
<path d="M18 6l2 -2"></path>
<path d="M19 9h2"></path>
</svg>
&nbsp;
Dynamic Ad
<div id="ctd_test"></div>
</div>
</div>
</div>
</div>
</div>
<div>
<div class="test_card">
<h5>
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-script" width="24"
height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path
d="M17 20h-11a3 3 0 0 1 0 -6h11a3 3 0 0 0 0 6h1a3 3 0 0 0 3 -3v-11a2 2 0 0 0 -2 -2h-10a2 2 0 0 0 -2 2v8">
</path>
</svg>
&nbsp; Ad Scripts Loading
</h5>
<div class="grid">
<div>
<div id="sfa_1" class="test_block _aos">
ads.js
<script src="./js/widget/ads.js"></script>
</div>
</div>
<div>
<div id="sfa_2" class="test_block _aos">
pagead.js
<script src="./js/pagead.js"></script>
</div>
</div>
<div>
<div id="sfa_3" class="test_block _aos">
partner.ads.js
<script src="./js/partner.ads.js"></script>
</div>
</div>
</div>
</div>
</div>
<div>
<hr>
</div>
<div>
<div id="test" class="test_wrapper"></div>
</div>
</div>
</section>
</div>
</main>
<%- include('partials/footer.ejs') %>
<%- include('partials/gotop.ejs') %>
</body>
</html>

226
src/adblock_data.json Normal file
View file

@ -0,0 +1,226 @@
{
"Ads": {
"Google Ads": [
"pagead2.googlesyndication.com",
"ads.google.com",
"adservice.google.com",
"pagead2.googleadservices.com",
"googleadservices.com"
],
"Media.net": [
"static.media.net",
"media.net",
"adservetx.media.net"
],
"Doubleclick.net": [
"doubleclick.net",
"ad.doubleclick.net",
"static.doubleclick.net",
"m.doubleclick.net",
"mediavisor.doubleclick.net"
],
"Amazon": [
"adtago.s3.amazonaws.com",
"analyticsengine.s3.amazonaws.com",
"analytics.s3.amazonaws.com",
"advice-ads.s3.amazonaws.com",
"affiliationjs.s3.amazonaws.com",
"advertising-api-eu.amazon.com",
"amazonclix.com"
]
},
"Analytics": {
"Google Analytics": [
"google-analytics.com",
"ssl.google-analytics.com"
],
"Hotjar": [
"hotjar.com",
"adm.hotjar.com",
"identify.hotjar.com",
"insights.hotjar.com",
"script.hotjar.com",
"surveys.hotjar.com",
"careers.hotjar.com",
"events.hotjar.io"
],
"MouseFlow": [
"mouseflow.com",
"api.mouseflow.com",
"tools.mouseflow.com",
"cdn-test.mouseflow.com",
"a.mouseflow.com"
],
"FreshWorks": [
"freshmarketer.com",
"claritybt.freshmarketer.com",
"fwtracks.freshmarketer.com"
],
"Luckyorange": [
"luckyorange.com",
"api.luckyorange.com",
"realtime.luckyorange.com",
"cdn.luckyorange.com",
"w1.luckyorange.com",
"upload.luckyorange.net",
"cs.luckyorange.net",
"settings.luckyorange.net"
],
"Stats WP Plugin": [
"stats.wp.com"
]
},
"Error Trackers": {
"Bugsnag": [
"notify.bugsnag.com",
"sessions.bugsnag.com",
"api.bugsnag.com",
"app.bugsnag.com"
],
"Sentry": [
"browser.sentry-cdn.com",
"app.getsentry.com"
]
},
"Social Trackers": {
"Facebook": [
"pixel.facebook.com",
"ads.facebook.com",
"an.facebook.com"
],
"Twitter": [
"ads-twitter.com",
"static.ads-twitter.com",
"ads-api.twitter.com",
"advertising.twitter.com"
],
"LinkedIn": [
"ads.linkedin.com",
"analytics.pointdrive.linkedin.com"
],
"Pinterest": [
"ads.pinterest.com",
"log.pinterest.com",
"ads-dev.pinterest.com",
"analytics.pinterest.com",
"trk.pinterest.com",
"widgets.pinterest.com"
],
"Reddit": [
"ads.reddit.com",
"events.reddit.com",
"d.reddit.com",
"rereddit.com",
"events.redditmedia.com"
],
"YouTube": [
"ads.youtube.com"
],
"TikTok": [
"ads-api.tiktok.com",
"analytics.tiktok.com",
"ads-sg.tiktok.com",
"analytics-sg.tiktok.com",
"analytics.tiktok.com",
"business-api.tiktok.com",
"ads.tiktok.com"
]
},
"Mix": {
"Yahoo": [
"ads.yahoo.com",
"analytics.yahoo.com",
"ads.yap.yahoo.com",
"advertising.yahoo.com",
"analytics.query.yahoo.com",
"partnerads.ysm.yahoo.com",
"log.fc.yahoo.com",
"ganon.yahoo.com",
"gemini.yahoo.com",
"marketingsolutions.yahoo.com",
"pclick.yahoo.com"
],
"Yandex": [
"yandexadexchange.net",
"analytics.mobile.yandex.net",
"extmaps-api.yandex.net",
"redirect.appmetrica.yandex.com",
"appmetrica.yandex.ru",
"adfstat.yandex.ru",
"an.yandex.ru",
"metrika.yandex.ru",
"share.yandex.ru",
"advertising.yandex.ru",
"offerwall.yandex.net",
"adfox.yandex.ru",
"bs.yandex.ru",
"bs-meta.yandex.ru",
"share.yandex.ru"
]
},
"OEMs": {
"Realme": [
"iot-eu-logser.realme.com",
"iot-logser.realme.com",
"data-cl-id-ads.realmemobile.com",
"data-sg-ads.realmemobile.com",
"bdapi-ads.realmemobile.com",
"adx-id-ads.realmemobile.com",
"bdapi-in-ads.realmemobile.com"
],
"Xiaomi": [
"api.ad.xiaomi.com",
"data.mistat.xiaomi.com",
"data.mistat.intl.xiaomi.com",
"data.mistat.india.xiaomi.com",
"data.mistat.rus.xiaomi.com",
"sdkconfig.ad.xiaomi.com",
"sdkconfig.ad.intl.xiaomi.com",
"globalapi.ad.xiaomi.com",
"tracking.miui.com",
"tracking.intl.miui.com",
"tracking.india.miui.com",
"tracking.rus.miui.com"
],
"Oppo": [
"adsfs.oppomobile.com",
"adx.ads.oppomobile.com",
"bdapi.ads.oppomobile.com",
"ck.ads.oppomobile.com",
"data.ads.oppomobile.com",
"g1.ads.oppomobile.com"
],
"Huawei": [
"data.hicloud.com",
"metrics.data.hicloud.com",
"metrics1.data.hicloud.com",
"metrics2.data.hicloud.com",
"metrics5.data.hicloud.com ",
"grs.hicloud.com",
"logservice.hicloud.com",
"logservice1.hicloud.com",
"metrics-dra.dt.hicloud.com",
"logbak.hicloud.com"
],
"OnePlus": [
"click.oneplus.cn",
"click.oneplus.com",
"open.oneplus.net"
],
"Samsung": [
"samsungads.com",
"smetrics.samsung.com",
"samsung-com.112.2o7.net",
"business.samsungusa.com",
"analytics-api.samsunghealthcn.com",
"config.samsungads.com"
],
"Apple": [
"iad.apple.com",
"advertising.apple.com",
"tr.iadsdk.apple.com",
"supportmetrics.apple.com",
"metrics.icloud.com"
]
}
}

View file

@ -0,0 +1 @@
<svg aria-hidden="true" width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path fill="#fff" d="M64.255 45.77c-7.212 0-13.058 5.846-13.058 13.059v10.373c0 7.212 5.846 13.059 13.058 13.059 7.213 0 13.059-5.847 13.059-13.059V58.828c0-7.215-5.844-13.058-13.059-13.058zm7.836 23.505c0 4.32-3.515 7.835-7.836 7.835-4.32 0-7.835-3.515-7.835-7.835V58.828c0-4.321 3.515-7.835 7.835-7.835 4.321 0 7.836 3.514 7.836 7.835zM114 70.398a2.612 2.612 0 01-2.612 2.612h-2.612v6.674a2.612 2.612 0 01-5.223 0V73.01H85.271a2.616 2.616 0 01-2.208-1.215 2.615 2.615 0 01-.153-2.515l10.447-22.053a2.615 2.615 0 013.48-1.241 2.613 2.613 0 011.241 3.48l-8.68 18.32h14.155V56.181a2.612 2.612 0 015.223 0v11.605h2.612A2.614 2.614 0 01114 70.398zm-68.659 0a2.612 2.612 0 01-2.612 2.612h-2.611v6.674a2.612 2.612 0 01-5.224 0V73.01H16.612a2.616 2.616 0 01-2.208-1.216 2.615 2.615 0 01-.153-2.514l10.447-22.053a2.616 2.616 0 013.48-1.241 2.613 2.613 0 011.242 3.48l-8.682 18.32h14.156V56.18a2.612 2.612 0 015.224 0v11.606h2.611a2.614 2.614 0 012.612 2.612z"/></svg>

After

Width:  |  Height:  |  Size: 1 KiB

4
src/assets/404/icon.svg Normal file
View file

@ -0,0 +1,4 @@
<svg aria-hidden="true" width="128" height="128" xmlns="http://www.w3.org/2000/svg">
<style>@media (prefers-color-scheme: dark) {#path404{fill:#fff}}
</style>
<path id="path404" d="M64.255 45.77c-7.212 0-13.058 5.846-13.058 13.059v10.373c0 7.212 5.846 13.059 13.058 13.059 7.213 0 13.059-5.847 13.059-13.059V58.828c0-7.215-5.844-13.058-13.059-13.058zm7.836 23.505c0 4.32-3.515 7.835-7.836 7.835-4.32 0-7.835-3.515-7.835-7.835V58.828c0-4.321 3.515-7.835 7.835-7.835 4.321 0 7.836 3.514 7.836 7.835zM114 70.398a2.612 2.612 0 01-2.612 2.612h-2.612v6.674a2.612 2.612 0 01-5.223 0V73.01H85.271a2.616 2.616 0 01-2.208-1.215 2.615 2.615 0 01-.153-2.515l10.447-22.053a2.615 2.615 0 013.48-1.241 2.613 2.613 0 011.241 3.48l-8.68 18.32h14.155V56.181a2.612 2.612 0 015.223 0v11.605h2.612A2.614 2.614 0 01114 70.398zm-68.659 0a2.612 2.612 0 01-2.612 2.612h-2.611v6.674a2.612 2.612 0 01-5.224 0V73.01H16.612a2.616 2.616 0 01-2.208-1.216 2.615 2.615 0 01-.153-2.514l10.447-22.053a2.616 2.616 0 013.48-1.241 2.613 2.613 0 011.242 3.48l-8.682 18.32h14.156V56.18a2.612 2.612 0 015.224 0v11.606h2.611a2.614 2.614 0 012.612 2.612z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" fill="currentColor" version="1.1"><style>@media (prefers-color-scheme: dark) { :root { fill: #ffffff; } }</style><path d="M63.98 27.685c-11.2 0-19.45 1.43-28.666 4.974-4.726 1.82-4.948 2.305-4.368 9.538.783 9.734 3.79 21.804 5.788 23.204h.006c1.294.906 1.359.895 5.762-1.055l3.887-1.719.247-4.466c.164-2.95.534-5.16 1.088-6.504 5.8-13.987 24.36-15.6 32.377-2.819a165.87 165.87 0 0 0 1.536 2.415c.067.094 2.902-.286 6.302-.846 8.414-1.387 8.515-1.474 9.115-8.288.61-6.893.258-7.667-4.35-9.434-9.273-3.57-17.497-5-28.724-5zm25.782 31.108c-1.212.054-2.792.318-4.78.755-2.195.483-2.222.51-2.48 2.37-.616 4.503-4.08 9.553-8.47 12.35-6.523 4.147-15.674 3.25-21.484-2.103l-1.947-1.79-3.19 1.393c-1.753.767-3.526 1.681-3.94 2.031-1.226 1.034-1.4 3.21-.41 5.144 2.298 4.507 10.82 14.17 16.92 19.18 3.835 3.15 4.28 3.086 9.514-1.38 9.813-8.38 18.129-20.139 22.552-31.883 1.703-4.517 1.35-6.23-2.285-6.067z"/><path d="M64.005 14c-4.992 0-9.984.257-13.262.768-9.64 1.5-18.933 4.257-27.123 8.04-5.084 2.35-5.615 3.542-5.632 12.586-.033 20.197 6.158 38.675 18.568 55.385 5.694 7.667 17.217 18.304 24.057 22.214 3.57 2.043 5.931 1.22 13.555-4.733 16.362-12.774 28.101-30.598 33.021-50.138 1.837-7.303 2.46-11.792 2.715-19.636.294-9.007.046-11.2-1.47-13.008-2.835-3.36-18.461-8.73-31.174-10.71-3.276-.51-8.264-.768-13.255-.768Zm.215 6.185c12.843.02 22.323 1.856 34.447 6.686 5.127 2.04 5.287 2.25 5.28 6.797-.03 20.474-7.486 41.401-20.326 57.078-4.633 5.654-12.121 12.67-17.188 16.108-.926.63-2.018 1.145-2.428 1.145-2.337 0-13.634-9.92-19.584-17.2-12.93-15.824-20.368-36.67-20.371-57.105 0-4.456.524-5.062 6.204-7.246 11.754-4.52 21.305-6.28 33.966-6.263z"/></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,29 @@
export const icons = {
download: "<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'><path d='M0 0h24v24H0z' stroke='none'/><path d='M4 17v2a2 2 0 002 2h12a2 2 0 002-2v-2M7 11l5 5 5-5M12 4v12'/></svg>",
delete: "<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'><path d='M0 0h24v24H0z' stroke='none'/><path d='M4 7h16M10 11v6M14 11v6M5 7l1 12a2 2 0 002 2h8a2 2 0 002-2l1-12M9 7V4a1 1 0 011-1h4a1 1 0 011 1v3'/></svg>",
v: "<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2' stroke='var(--green)' fill='none' stroke-linecap='round' stroke-linejoin='round'><path d='M0 0h24v24H0z' stroke='none'/><circle cx='12' cy='12' r='9'/><path d='M9 12l2 2 4-4'/></svg>",
x: "<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2' stroke='var(--red)' fill='none' stroke-linecap='round' stroke-linejoin='round'><path d='M0 0h24v24H0z' stroke='none'/><circle cx='12' cy='12' r='9'/><path d='M10 10l4 4m0-4l-4 4'/></svg>",
Ads: "<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'><path d='M0 0h24v24H0z' stroke='none'/><path d='M18 8a3 3 0 010 6M10 8v11a1 1 0 01-1 1H8a1 1 0 01-1-1v-5'/><path d='M12 8h0l4.524-3.77A.9.9 0 0118 4.922v12.156a.9.9 0 01-1.476.692L12 14H4a1 1 0 01-1-1V9a1 1 0 011-1h8'/></svg>",
'Analytics':
"<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'><path d='M0 0h24v24H0z' stroke='none'/><path d='M4 18V6a2 2 0 012-2h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2z'/><path d='M7 14l3-3 2 2 3-3 2 2'/></svg>",
'Error Trackers':
"<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'><path d='M0 0h24v24H0z' stroke='none'/><path d='M9 9V8a3 3 0 016 0v1M8 9h8a6 6 0 011 3v3a5 5 0 01-10 0v-3a6 6 0 011-3M3 13h4M17 13h4M12 20v-6M4 19l3.35-2M20 19l-3.35-2M4 7l3.75 2.4M20 7l-3.75 2.4'/></svg>",
'Mix': "<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'><path d='M0 0h24v24H0z' stroke='none'/><path d='M12 4L4 8l8 4 8-4-8-4M4 12l8 4 8-4M4 16l8 4 8-4'/></svg>",
'OEMs': "<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'><path d='M0 0h24v24H0z' stroke='none'/><rect x='6' y='3' width='12' height='18' rx='2'/><path d='M11 4h2M12 17v.01'/></svg>",
'Social Trackers':"<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'><path d='M0 0h24v24H0z' stroke='none'/><circle cx='12' cy='5' r='2'/><circle cx='5' cy='19' r='2'/><circle cx='19' cy='19' r='2'/><circle cx='12' cy='14' r='3'/><path d='M12 7v4M6.7 17.8l2.8-2M17.3 17.8l-2.8-2'/></svg>",
'OnePlus':"<svg fill='currentColor' width='18' height='18' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M0 3.74V24h20.26V12.428h-2.256v9.317H2.254V5.995h9.318V3.742zM18.004 0v3.74h-3.758v2.256h3.758v3.758h2.255V5.996H24V3.74h-3.758V0zm-6.45 18.756V8.862H9.562c0 .682-.228 1.189-.577 1.504-.367.297-.91.437-1.556.437h-.245v1.625h2.133v6.31h2.237z'></path></svg>",
Xiaomi: "<svg fill='currentColor' width='18' height='18' role='img' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M19.96 20a.32.32 0 0 1-.32-.32V4.32a.32.32 0 0 1 .32-.32h3.71a.32.32 0 0 1 .33.32v15.36a.32.32 0 0 1-.33.32zm-6.22 0s-.3-.09-.3-.32v-9.43A2.18 2.18 0 0 0 11.24 8H4.3c-.4 0-.3.3-.3.3v11.38c0 .27-.3.32-.3.32H.33a.32.32 0 0 1-.33-.32V4.32A.32.32 0 0 1 .33 4h12.86a4.28 4.28 0 0 1 4.25 4.27l.01 11.41a.32.32 0 0 1-.32.32zm-6.9 0a.3.3 0 0 1-.3-.3v-9a.3.3 0 0 1 .3-.3h3.77a.3.3 0 0 1 .29.3v9a.3.3 0 0 1-.3.3z'></path></svg>",
Huawei: "<svg fill='currentColor' width='18' height='18' role='img' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M3.67 6.14S1.82 7.91 1.72 9.78v.35c.08 1.51 1.22 2.4 1.22 2.4 1.83 1.79 6.26 4.04 7.3 4.55 0 0 .06.03.1-.01l.02-.04v-.04C7.52 10.8 3.67 6.14 3.67 6.14zM9.65 18.6c-.02-.08-.1-.08-.1-.08l-7.38.26c.8 1.43 2.15 2.53 3.56 2.2.96-.25 3.16-1.78 3.88-2.3.06-.05.04-.09.04-.09zm.08-.78C6.49 15.63.21 12.28.21 12.28c-.15.46-.2.9-.21 1.3v.07c0 1.07.4 1.82.4 1.82.8 1.69 2.34 2.2 2.34 2.2.7.3 1.4.31 1.4.31.12.02 4.4 0 5.54 0 .05 0 .08-.05.08-.05v-.06c0-.03-.03-.05-.03-.05zM9.06 3.19a3.42 3.42 0 00-2.57 3.15v.41c.03.6.16 1.05.16 1.05.66 2.9 3.86 7.65 4.55 8.65.05.05.1.03.1.03a.1.1 0 00.06-.1c1.06-10.6-1.11-13.42-1.11-13.42-.32.02-1.19.23-1.19.23zm8.299 2.27s-.49-1.8-2.44-2.28c0 0-.57-.14-1.17-.22 0 0-2.18 2.81-1.12 13.43.01.07.06.08.06.08.07.03.1-.03.1-.03.72-1.03 3.9-5.76 4.55-8.64 0 0 .36-1.4.02-2.34zm-2.92 13.07s-.07 0-.09.05c0 0-.01.07.03.1.7.51 2.85 2 3.88 2.3 0 0 .16.05.43.06h.14c.69-.02 1.9-.37 3-2.26l-7.4-.25zm7.83-8.41c.14-2.06-1.94-3.97-1.94-3.98 0 0-3.85 4.66-6.67 10.8 0 0-.03.08.02.13l.04.01h.06c1.06-.53 5.46-2.77 7.28-4.54 0 0 1.15-.93 1.21-2.42zm1.52 2.14s-6.28 3.37-9.52 5.55c0 0-.05.04-.03.11 0 0 .03.06.07.06 1.16 0 5.56 0 5.67-.02 0 0 .57-.02 1.27-.29 0 0 1.56-.5 2.37-2.27 0 0 .73-1.45.17-3.14z'></path></svg>",
Samsung:"<svg fill='currentColor' width='18' height='18' role='img' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M19.8166 10.2808l.0459 2.6934h-.023l-.7793-2.6934h-1.2837v3.3925h.8481l-.0458-2.785h.023l.8366 2.785h1.2264v-3.3925zm-16.149 0l-.6418 3.427h.9284l.4699-3.1175h.0229l.4585 3.1174h.9169l-.6304-3.4269zm5.1805 0l-.424 2.6132h-.023l-.424-2.6132H6.5788l-.0688 3.427h.8596l.023-3.0832h.0114l.573 3.0831h.8711l.5731-3.083h.023l.0228 3.083h.8596l-.0802-3.4269zm-7.2664 2.4527c.0343.0802.0229.1949.0114.2522-.0229.1146-.1031.2292-.3324.2292-.2177 0-.3438-.126-.3438-.3095v-.3323H0v.2636c0 .7679.6074.9971 1.2493.9971.6189 0 1.1346-.2178 1.2149-.7794.0458-.298.0114-.4928 0-.5616-.1605-.722-1.467-.9283-1.5588-1.3295-.0114-.0688-.0114-.1375 0-.1834.023-.1146.1032-.2292.3095-.2292.2063 0 .321.126.321.3095v.2063h.8595v-.2407c0-.745-.6762-.8596-1.1576-.8596-.6074 0-1.1117.2063-1.2034.7564-.023.149-.0344.2866.0114.4585.1376.7106 1.364.9169 1.5358 1.3524m11.152 0c.0343.0803.0228.1834.0114.2522-.023.1146-.1032.2292-.3324.2292-.2178 0-.3438-.126-.3438-.3095v-.3323h-.917v.2636c0 .7564.596.9857 1.2379.9857.6189 0 1.1232-.2063 1.2034-.7794.0459-.298.0115-.4814 0-.5616-.1375-.7106-1.4327-.9284-1.5243-1.318-.0115-.0688-.0115-.1376 0-.1835.0229-.1146.1031-.2292.3094-.2292.1948 0 .321.126.321.3095v.2063h.848v-.2407c0-.745-.6647-.8596-1.146-.8596-.6075 0-1.1004.1948-1.192.7564-.023.149-.023.2866.0114.4585.1376.7106 1.341.9054 1.513 1.3524m2.8882.4585c.2407 0 .3094-.1605.3323-.2522.0115-.0343.0115-.0917.0115-.126v-2.533h.871v2.4642c0 .0688 0 .1948-.0114.2292-.0573.6419-.5616.8482-1.192.8482-.6303 0-1.1346-.2063-1.192-.8482 0-.0344-.0114-.1604-.0114-.2292v-2.4642h.871v2.533c0 .0458 0 .0916.0115.126 0 .0917.0688.2522.3095.2522m7.1518-.0344c.2522 0 .3324-.1605.3553-.2522.0115-.0343.0115-.0917.0115-.126v-.4929h-.3553v-.5043H24v.917c0 .0687 0 .1145-.0115.2292-.0573.6303-.596.8481-1.2034.8481-.6075 0-1.1461-.2178-1.2034-.8481-.0115-.1147-.0115-.1605-.0115-.2293v-1.444c0-.0574.0115-.172.0115-.2293.0802-.6419.596-.8482 1.2034-.8482s1.1347.2063 1.2034.8482c.0115.1031.0115.2292.0115.2292v.1146h-.8596v-.1948s0-.0803-.0115-.1261c-.0114-.0802-.0802-.2521-.3438-.2521-.2521 0-.321.1604-.3438.2521-.0115.0458-.0115.1032-.0115.1605v1.5702c0 .0458 0 .0916.0115.126 0 .0917.0917.2522.3323.2522'></path></svg>",
Apple: "<svg fill='currentColor' width='18' height='18' role='img' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701'></path></svg>",
Facebook:"<svg fill='currentColor' width='18' height='18' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z'/></svg>",
Twitter: "<svg fill='currentColor' width='18' height='18' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z'/></svg>",
Sentry: "<svg fill='currentColor' viewBox='0 0 24 24' width='18' height='18' xmlns='http://www.w3.org/2000/svg'><path d='M13.91 2.505c-.873-1.448-2.972-1.448-3.844 0L6.904 7.92a15.478 15.478 0 018.53 12.811h-2.221A13.301 13.301 0 005.784 9.814l-2.926 5.06a7.65 7.65 0 014.435 5.848H2.194a.365.365 0 01-.298-.534l1.413-2.402a5.16 5.16 0 00-1.614-.913L.296 19.275a2.182 2.182 0 00.812 2.999 2.24 2.24 0 001.086.288h6.983a9.322 9.322 0 00-3.845-8.318l1.11-1.922a11.47 11.47 0 014.95 10.24h5.915a17.242 17.242 0 00-7.885-15.28l2.244-3.845a.37.37 0 01.504-.13c.255.14 9.75 16.708 9.928 16.9a.365.365 0 01-.327.543h-2.287c.029.612.029 1.223 0 1.831h2.297a2.206 2.206 0 001.922-3.31z'/></svg>",
Bugsnag: "<svg fill='currentColor' viewBox='0 0 24 24' width='18' height='18' xmlns='http://www.w3.org/2000/svg'><path d='M12 24c-4.596 0-8.336-3.74-8.336-8.336v-4.135a.62.62 0 01.62-.62h2.957L7.23 1.337 4.903 2.77v5.45a.62.62 0 01-1.24 0V2.7c0-.384.204-.749.53-.95L6.773.166a1.114 1.114 0 011.699.949l.01 9.796h3.52a4.759 4.759 0 014.753 4.754 4.759 4.759 0 01-4.753 4.753 4.759 4.759 0 01-4.754-4.753l-.003-3.515H4.903v3.515c0 3.912 3.183 7.097 7.097 7.097a7.104 7.104 0 007.097-7.097A7.105 7.105 0 0012 8.567h-1.076a.62.62 0 010-1.24H12c4.596 0 8.336 3.74 8.336 8.336S16.596 24 12 24zM8.482 12.15l.004 3.514A3.518 3.518 0 0012 19.178a3.518 3.518 0 003.514-3.514A3.518 3.518 0 0012 12.149zm4.513 3.514a.995.995 0 01-.995.994.995.995 0 01-.995-.994.995.995 0 01.995-.995.995.995 0 01.995.995z'/></svg>",
LinkedIn: "<svg fill='currentColor' width='18' height='18' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/></svg>",
Pinterest: "<svg fill='currentColor' width='18' height='18' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.162-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.085.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.401.165-1.495-.69-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.758-1.379l-.749 2.848c-.269 1.045-1.004 2.352-1.498 3.146 1.123.345 2.306.535 3.55.535 6.607 0 11.985-5.365 11.985-11.987C23.97 5.39 18.592.026 11.985.026L12.017 0z'/></svg>",
Reddit: "<svg fill='currentColor' width='18' height='18' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M12 0A12 12 0 000 12a12 12 0 0012 12 12 12 0 0012-12A12 12 0 0012 0zm5.01 4.744c.688 0 1.25.561 1.25 1.249a1.25 1.25 0 01-2.498.056l-2.597-.547-.8 3.747c1.824.07 3.48.632 4.674 1.488.308-.309.73-.491 1.207-.491.968 0 1.754.786 1.754 1.754 0 .716-.435 1.333-1.01 1.614a3.111 3.111 0 01.042.52c0 2.694-3.13 4.87-7.004 4.87-3.874 0-7.004-2.176-7.004-4.87 0-.183.015-.366.043-.534A1.748 1.748 0 014.028 12c0-.968.786-1.754 1.754-1.754.463 0 .898.196 1.207.49 1.207-.883 2.878-1.43 4.744-1.487l.885-4.182a.342.342 0 01.14-.197.35.35 0 01.238-.042l2.906.617a1.214 1.214 0 011.108-.701zM9.25 12C8.561 12 8 12.562 8 13.25c0 .687.561 1.248 1.25 1.248.687 0 1.248-.561 1.248-1.249 0-.688-.561-1.249-1.249-1.249zm5.5 0c-.687 0-1.248.561-1.248 1.25 0 .687.561 1.248 1.249 1.248.688 0 1.249-.561 1.249-1.249 0-.687-.562-1.249-1.25-1.249zm-5.466 3.99a.327.327 0 00-.231.094.33.33 0 000 .463c.842.842 2.484.913 2.961.913.477 0 2.105-.056 2.961-.913a.361.361 0 00.029-.463.33.33 0 00-.464 0c-.547.533-1.684.73-2.512.73-.828 0-1.979-.196-2.512-.73a.326.326 0 00-.232-.095z'/></svg>",
TikTok: "<svg fill='currentColor' width='18' height='18' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z'/></svg>",
Yahoo: "<svg fill='currentColor' width='18' height='18' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M18.86 1.56l-4.59 10.31h5.13L24 1.56h-5.14M0 6.71l5.15 11.56-1.85 4.17h4.53l6.86-15.73h-4.5l-2.8 6.73-2.77-6.73H0m15.62 6.16c-1.67 0-2.91 1.25-2.91 2.71 0 1.42 1.2 2.61 2.79 2.61 1.68 0 2.93-1.23 2.93-2.69 0-1.47-1.2-2.63-2.81-2.63z'/></svg>",
YouTube: "<svg fill='currentColor' width='18' height='18' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M23.498 6.186a3.016 3.016 0 00-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 00.502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 002.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 002.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'/></svg>"
}

View file

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M50.336 22.85c-1.471 0-2.942.712-3.54 2.137L19.911 89a3.84 3.84 0 002.052 5.029 3.835 3.835 0 005.029-2.054l5.407-12.874h35.88l5.408 12.874a3.82 3.82 0 003.539 2.354c.07 0 .139-.017.208-.02.063.004.122.019.186.019h18.893c7.513 0 13.619-6.108 13.619-13.62 0-5.372-3.152-9.985-7.677-12.204 2.559-2.472 4.162-5.932 4.162-9.765 0-7.51-6.107-13.62-13.62-13.62H77.62a2.637 2.637 0 00-2.636 2.636V75.24L53.877 24.987c-.597-1.425-2.07-2.138-3.54-2.138zM18.991 97.655c-4.372 0-4.991 1.67-4.991 3.747s.636 3.748 4.99 3.748H108.4c4.355 0 5.601-1.679 5.601-3.748s-1.23-3.747-5.601-3.747z"/></svg>

After

Width:  |  Height:  |  Size: 659 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><style>@media (prefers-color-scheme:dark){#fontlist_logo{fill:#fff}}</style><path id="fontlist_logo" d="M50.336 22.85c-1.471 0-2.942.712-3.54 2.137L19.911 89a3.84 3.84 0 0 0 2.052 5.029 3.835 3.835 0 0 0 5.029-2.054l5.407-12.874h35.88l5.408 12.874a3.82 3.82 0 0 0 3.539 2.354c.07 0 .139-.017.208-.02.063.004.122.019.186.019h18.893c7.513 0 13.619-6.108 13.619-13.62 0-5.372-3.152-9.985-7.677-12.204 2.559-2.472 4.162-5.932 4.162-9.765 0-7.51-6.107-13.62-13.62-13.62H77.62a2.637 2.637 0 0 0-2.636 2.636V75.24L53.877 24.987c-.597-1.425-2.07-2.138-3.54-2.138zM18.991 97.655c-4.372 0-4.991 1.67-4.991 3.747s.636 3.748 4.99 3.748h89.41c4.355 0 5.601-1.679 5.601-3.748s-1.23-3.747-5.601-3.747z"/></svg>

After

Width:  |  Height:  |  Size: 760 B

37
src/assets/icon_.svg Normal file
View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="eQxukRF4Xbv1"
viewBox="0 0 106 106"
shape-rendering="geometricPrecision"
text-rendering="geometricPrecision"
version="1.1"
sodipodi:docname="icon_.svg"
inkscape:version="1.1 (c4e8f9e, 2021-05-24)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs829" />
<sodipodi:namedview
id="namedview827"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="5.7438122"
inkscape:cx="24.199955"
inkscape:cy="39.08554"
inkscape:window-width="1792"
inkscape:window-height="993"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="eQxukRF4Xbv1" />
<path
d="M35,1.5c-9.1,2-22.1,6.3-25.9,8.6-4.3,2.6-4.9,4.8-4.6,16.6.8,25.7,13,51.2,32.8,68.7c8.2,7.2,13.1,10.6,15.5,10.6c4.9,0,20.6-13.4,29.6-25.4c12.6-16.7,18.8-35,19-55.9.1-10.6,0-10.9-2.6-13.2C95.7,8.8,87.9,5.7,77,2.8c-9.8-2.6-32.6-3.3-42-1.3ZM71,8.1c7.5,1.4,22.7,6.6,23.7,8.2c1.1,1.8.5,14.1-1.1,22.2-2.3,11.6-8,25.8-14.1,35-4.6,7-18.5,21.4-23.4,24.4l-3.4,2-3.1-2.2C40,91.1,28.7,77.9,22.2,66c-3.6-6.6-8.7-20.7-9.7-27-.4-2.5-.9-5.2-1-6.1-.4-2-.7-10.2-.6-14.2.1-2.3.9-3.1,4.9-4.8C31.5,7.1,52.7,4.9,71,8.1Z"
id="path824" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

1
src/assets/ko-fi.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 24 24"><path fill="#fff" fill-opacity="1" stroke="#030303" stroke-opacity="1" stroke-width="1" d="M21.407 9.597c-.612-3.214-3.847-3.614-3.847-3.614H3.072c-.478 0-.537.628-.537.628s-.065 5.764-.018 9.303c.13 1.908 2.048 2.103 2.048 2.103s6.545-.018 9.474-.038c1.93-.336 2.124-2.02 2.104-2.939 3.446.189 5.876-2.228 5.264-5.443zM12.65 12.36c-.986 1.144-3.175 3.13-3.175 3.13s-.096.093-.246.017c-.06-.044-.085-.07-.085-.07-.351-.347-2.667-2.4-3.194-3.112-.562-.76-.824-2.125-.072-2.92.753-.794 2.379-.854 3.454.32 0 0 1.24-1.402 2.746-.757 1.507.645 1.45 2.37.572 3.392zm4.887.377c-.734.09-1.331.022-1.331.022V8.288h1.401s1.56.433 1.56 2.076c0 1.505-.78 2.099-1.63 2.373z"/><path fill="#ff2858" fill-opacity="1" fill-rule="evenodd" stroke="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" stroke-width="7.559" d="M8.158 14.456c-2.353-2.2-2.67-2.643-2.675-3.737-.002-.653.098-.92.49-1.31.405-.402.655-.49 1.398-.49.752.001 1.1.129 1.645.605l.28.245.432-.324c.537-.403.996-.568 1.578-.565.862.003 1.598.542 1.832 1.34.153.523.105.93-.179 1.54-.158.34-.527.763-1.628 1.866-.783.785-1.559 1.535-1.724 1.666l-.3.239Z" paint-order="stroke markers fill"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128" version="1.1" viewBox="0 0 33.867 33.867"><defs><linearGradient id="a"><stop offset="0" stop-color="#fc575e"/><stop offset="1" stop-color="#f7b42c"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="43.078" x2="774.291" y1="111.56" y2="715.75" gradientTransform="translate(-11.029 35.502) scale(1.54339)" gradientUnits="userSpaceOnUse"/></defs><circle cx="16.933" cy="16.933" r="16.933" fill="#fff" fill-opacity=".951" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".983" stroke-width="2" paint-order="stroke markers fill"/><g stroke-width="23.398" paint-order="stroke markers fill"><path fill="#9c2a24" d="M77.374 49.763c3.88-.44 26.588 1.577 26.481 2.097L58.572 77.448l-34.469-.982Z" transform="matrix(.24925 0 0 .24925 .981 .981)"/><path fill="url(#b)" d="M267.83 332.194c-84.193-4.441-137.743-92.535-139.59-171.042h155.33c134.049 0 157.001.529 165.408 1.731 88.985-1.066 143.267 89.144 145.815 175.135M416.12 481.196c98.948 2.03 174.07 82.23 180.256 175.329l-308.118-.623c-46.077-.727-158.063-70.57-158.683-174.35" transform="matrix(.24925 0 0 .24925 .981 .981) translate(1.89 -6.086) scale(.17143)"/></g></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 33.867 33.867"><style>@media (prefers-color-scheme:dark){#prefix__toolz_logo{fill:#fff}}</style><g stroke-width="23.398" paint-order="stroke markers fill"><path d="M20.266 13.384c.968-.11 6.628.393 6.6.523L15.58 20.285l-8.59-.245Z"/><path d="M12.896 13.659C9.3 13.469 7.011 9.705 6.932 6.35h6.637c5.728 0 6.709.023 7.068.074 3.802-.046 6.122 3.81 6.23 7.484m-7.634 6.118c4.228.086 7.438 3.513 7.702 7.491l-13.166-.026c-1.969-.031-6.754-3.016-6.78-7.45"/></g></svg>

After

Width:  |  Height:  |  Size: 542 B

View file

@ -0,0 +1 @@
<svg fill="#f3535b" width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M104.625 67.125h-43.75v-43.75c0-5.156-4.219-9.375-9.375-9.375H23.375C18.219 14 14 18.219 14 23.375v81.25c0 5.156 4.219 9.375 9.375 9.375h81.25c5.156 0 9.375-4.219 9.375-9.375V76.5c0-5.156-4.219-9.375-9.375-9.375zm-3.568 37.5H26.158c-2.758-.237-2.783-.235-2.783-3.16V27.18c.136-3.817-.293-3.805 3.703-3.805h21.254c3.256.106 3.168.005 3.168 2.579v5.808c.02.556-.196.812-.728.812H35.875c-4.447.492-3.296 6.15 0 6.25l14.88.168c.45.003.7.148.745.661v11.048c.052.523-.249.781-.745.799h-14.88c-4.442.492-3.297 6.149 0 6.25h14.773c.53.033.838.186.852.701V69.5c-.013.573-.295.751-.852.751H35.875c-4.442.492-3.297 6.149 0 6.25h14.844c.562-.004.781.255.781.767v14.858c.492 4.442 6.149 3.297 6.25 0V77.231c-.012-.617.265-.713.79-.731h10.8c.716.016.91.308.91.927v14.698c.491 4.447 6.15 3.296 6.25 0V77.409c.004-.732.216-.909.891-.909h10.73c.778.046.879.522.879 1.175v14.45c.491 4.447 6.15 3.296 6.25 0V77.888c-.01-.987.267-1.388 1.453-1.388h5.376c1.816-.048 2.51.929 2.546 2.486v22.582c-.194 2.912-.327 3.057-3.568 3.057z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

94
src/build_list.js Normal file
View file

@ -0,0 +1,94 @@
const fs = require('fs')
const path = require('path')
function center(s, max, c) {
return s
.padStart(s.length + Math.floor((max - s.length) / 2), c)
.padEnd(max, c)
}
const header = (entries, date, comment) => {
return (
comment +
' Title: d3Host List by d3ward\n' +
comment +
' Expires: 1 days\n' +
comment +
' Description: Simple and small list with the most popular advertising, tracking, analytics and social advertising services\n' +
comment +
' Homepage: https://github.com/d3ward/toolz\n' +
comment +
' License: CC BY-NC-SA\n' +
comment +
' Source: https://github.com/d3ward/toolz/blob/master/src/d3host.txt\n\n' +
comment +
' This list cover all the tests on https://d3ward.github.io/toolz/adblock' +
comment +
' Type : Stable\n' +
comment +
' Entries : ' +
entries +
'\n' +
comment +
' Updated On: ' +
date +
'\n' +
comment +
' Created by: d3ward'
)
}
function build(obj, comment, pre, post) {
let txt = ''
let entries = 0
Object.keys(obj).forEach((category) => {
let value = obj[category]
txt += '\n\n' + comment + center(' ' + category + ' ', 30, '=') + '\n'
Object.keys(value).forEach((key) => {
let value2 = value[key]
txt += '\n' + comment + ' --- ' + key + '\n'
if (value2)
value2.forEach((v) => {
entries++
txt += pre + v + post + '\n'
})
})
})
const date = new Date()
const d =
date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear()
return header(entries, d, comment) + txt
}
function write(output, input) {
fs.writeFile(output, input, { encoding: 'utf8' }, function (err) {
if (err) {
return console.error(err)
}
fs.readFile(output, function (err, data) {
if (err) {
return console.error(err)
}
console.log('Created \n' + output)
})
})
}
fs.readFile(
path.resolve(__dirname, './adblock_data.json'),
'utf8',
(err, jsonString) => {
if (err) {
console.log('Error reading file from disk:', err)
return
}
try {
const obj = JSON.parse(jsonString)
write(
path.resolve(__dirname, 'd3host.txt'),
build(obj, '#', '0.0.0.0 ', '')
)
write(
path.resolve(__dirname, 'd3host.adblock'),
build(obj, '!', '||', '^')
)
} catch (err) {
console.log('Error parsing JSON string:', err)
}
}
)

File diff suppressed because it is too large Load diff

View file

@ -1,185 +1,206 @@
! Title: d3Host List by d3ward
! Expires: 1 days
! Description: Simple and small list with the most popular advertising, analytics and social advertising services
! Description: Simple and small list with the most popular advertising, tracking, analytics and social advertising services
! Homepage: https://github.com/d3ward/toolz
! License: CC BY-NC-SA
! Source: https://github.com/d3ward/toolz/blob/master/src/d3host.txt
! This list cover all the tests on https://d3ward.github.io/toolz/adblock
!
! Type : Stable
! Updated On: 14-02-2022
! This list cover all the tests on https://d3ward.github.io/toolz/adblock! Type : Stable
! Entries : 157
! Updated On: 21/12/2022
! Created by: d3ward
! Start Local Hosts
! End Local Hosts
!============ Ads =============
! Start
!Ads ====================
! Google Ads
! --- Google Ads
||pagead2.googlesyndication.com^
||ads.google.com^
||adservice.google.com^
||pagead2.googleadservices.com^
||googleadservices.com^
!Media.net
! --- Media.net
||static.media.net^
||media.net^
||adservetx.media.net^
!Doubleclick.net
! --- Doubleclick.net
||doubleclick.net^
||ad.doubleclick.net^
||static.doubleclick.net^
||m.doubleclick.net^
||mediavisor.doubleclick.net^
!FastClick
||fastclick.com^
||fastclick.net^
!Amazon
! --- Amazon
||adtago.s3.amazonaws.com^
||analyticsengine.s3.amazonaws.com^
||analytics.s3.amazonaws.com^
||advice-ads.s3.amazonaws.com^
||affiliationjs.s3.amazonaws.com^
||advertising-api-eu.amazon.com^
||amazonaax.com^
||amazonclix.com^
||assoc-amazon.com^
!#Analytics ====================
! Yahoo
!========= Analytics ==========
! --- Google Analytics
||google-analytics.com^
||ssl.google-analytics.com^
! --- Hotjar
||hotjar.com^
||adm.hotjar.com^
||identify.hotjar.com^
||insights.hotjar.com^
||script.hotjar.com^
||surveys.hotjar.com^
||careers.hotjar.com^
||events.hotjar.io^
! --- MouseFlow
||mouseflow.com^
||api.mouseflow.com^
||tools.mouseflow.com^
||cdn-test.mouseflow.com^
||a.mouseflow.com^
! --- FreshWorks
||freshmarketer.com^
||claritybt.freshmarketer.com^
||fwtracks.freshmarketer.com^
! --- Luckyorange
||luckyorange.com^
||api.luckyorange.com^
||realtime.luckyorange.com^
||cdn.luckyorange.com^
||w1.luckyorange.com^
||upload.luckyorange.net^
||cs.luckyorange.net^
||settings.luckyorange.net^
! --- Stats WP Plugin
||stats.wp.com^
!======= Error Trackers =======
! --- Bugsnag
||notify.bugsnag.com^
||sessions.bugsnag.com^
||api.bugsnag.com^
||app.bugsnag.com^
! --- Sentry
||browser.sentry-cdn.com^
||app.getsentry.com^
!====== Social Trackers =======
! --- Facebook
||pixel.facebook.com^
||ads.facebook.com^
||an.facebook.com^
! --- Twitter
||ads-twitter.com^
||static.ads-twitter.com^
||ads-api.twitter.com^
||advertising.twitter.com^
! --- LinkedIn
||ads.linkedin.com^
||analytics.pointdrive.linkedin.com^
! --- Pinterest
||ads.pinterest.com^
||log.pinterest.com^
||ads-dev.pinterest.com^
||analytics.pinterest.com^
||trk.pinterest.com^
||widgets.pinterest.com^
! --- Reddit
||ads.reddit.com^
||events.reddit.com^
||d.reddit.com^
||rereddit.com^
||events.redditmedia.com^
! --- YouTube
||ads.youtube.com^
! --- TikTok
||ads-api.tiktok.com^
||analytics.tiktok.com^
||ads-sg.tiktok.com^
||analytics-sg.tiktok.com^
||analytics.tiktok.com^
||business-api.tiktok.com^
||ads.tiktok.com^
!============ Mix =============
! --- Yahoo
||ads.yahoo.com^
||adserver.yahoo.com^
||adspecs.yahoo.com^
||advertising.yahoo.com^
||analytics.yahoo.com^
||comet.yahoo.com^
||ads.yap.yahoo.com^
||advertising.yahoo.com^
||analytics.query.yahoo.com^
||partnerads.ysm.yahoo.com^
||log.fc.yahoo.com^
||ganon.yahoo.com^
||gemini.yahoo.com^
||geo.yahoo.com^
||marketingsolutions.yahoo.com^
||pclick.yahoo.com^
||analytics.query.yahoo.com^
||geo.query.yahoo.com^
||onepush.query.yahoo.com^
||bats.video.yahoo.com^
||visit.webhosting.yahoo.com^
||ads.yap.yahoo.com^
||m.yap.yahoo.com^
||partnerads.ysm.yahoo.com^
! Yandex
||appmetrica.yandex.com^
||report.appmetrica.yandex.net^
||extmaps-api.yandex.net^
! --- Yandex
||yandexadexchange.net^
||analytics.mobile.yandex.net^
||banners.mobile.yandex.net^
||banners-slb.mobile.yandex.net^
||startup.mobile.yandex.net^
||extmaps-api.yandex.net^
||redirect.appmetrica.yandex.com^
||appmetrica.yandex.ru^
||adfstat.yandex.ru^
||an.yandex.ru^
||metrika.yandex.ru^
||share.yandex.ru^
||advertising.yandex.ru^
||offerwall.yandex.net^
||adfox.yandex.ru^
||adsdk.yandex.ru^
||an.yandex.ru^
||redirect.appmetrica.yandex.ru^
||awaps.yandex.ru^
||awsync.yandex.ru^
||bs.yandex.ru^
||bs-meta.yandex.ru^
||clck.yandex.ru^
||informer.yandex.ru^
||kiks.yandex.ru^
||grade.market.yandex.ru^
||mc.yandex.ru^
||metrika.yandex.ru^
||click.sender.yandex.ru^
||share.yandex.ru^
||yandexadexchange.net^
!Google Analytics
||google-analytics.com^
!Hotjar
||api-hotjar.com^
||hotjar-analytics.com^
||hotjar.com^
!============ OEMs ============
!MouseFlow
||mouseflow.com^
!FreshMarketer
||freshmarketer.com^
!Luckyorange
||luckyorange.com^
||luckyorange.net^
!Stats WP Plugin
||stats.wp.com^
!#Error Trackers ====================
!Bugsnag
||notify.bugsnag.com^
||sessions.bugsnag.com^
||api.bugsnag.com^
||app.bugsnag.com^
!Sentry
||browser.sentry-cdn.com^
||app.getsentry.com^
!#Social ====================
!Facebook
||pixel.facebook.com^
||analytics.facebook.com^
||ads.facebook.com^
||an.facebook.com^
!Twitter
||ads-api.twitter.com^
||advertising.twitter.com^
||ads-twitter.com^
!LinkedIn
||ads.linkedin.com^
||analytics.pointdrive.linkedin.com^
!Pinterest
||ads.pinterest.com^
||log.pinterest.com^
||ads-dev.pinterest.com^
||analytics.pinterest.com^
||trk.pinterest.com^
||trk2.pinterest.com^
||widgets.pinterest.com^
!Reddit
||ads.reddit.com^
||rereddit.com^
||events.redditmedia.com^
||d.reddit.com^
! TikTok
||ads-sg.tiktok.com^
||analytics-sg.tiktok.com^
||ads.tiktok.com^
||analytics.tiktok.com^
!YouTube
||ads.youtube.com^
||youtube.cleverads.vn^
!#Mix ====================
! Yahoo
! Yandex
!#OEM ====================
!Realme
! --- Realme
||iot-eu-logser.realme.com^
||iot-logser.realme.com^
||data-cl-id-ads.realmemobile.com^
||data-sg-ads.realmemobile.com^
||bdapi-ads.realmemobile.com^
||adx-id-ads.realmemobile.com^
||bdapi-in-ads.realmemobile.com^
!OPPO
! --- Xiaomi
||api.ad.xiaomi.com^
||data.mistat.xiaomi.com^
||data.mistat.intl.xiaomi.com^
||data.mistat.india.xiaomi.com^
||data.mistat.rus.xiaomi.com^
||sdkconfig.ad.xiaomi.com^
||sdkconfig.ad.intl.xiaomi.com^
||globalapi.ad.xiaomi.com^
||tracking.miui.com^
||tracking.intl.miui.com^
||tracking.india.miui.com^
||tracking.rus.miui.com^
! --- Oppo
||adsfs.oppomobile.com^
||adx.ads.oppomobile.com^
||bdapi.ads.oppomobile.com^
@ -187,60 +208,34 @@
||data.ads.oppomobile.com^
||g1.ads.oppomobile.com^
!Xiaomi
||api.ad.xiaomi.com^
||app.chat.xiaomi.net^
||data.mistat.xiaomi.com^
||data.mistat.india.xiaomi.com^
||data.mistat.rus.xiaomi.com^
||sdkconfig.ad.xiaomi.com^
||sdkconfig.ad.intl.xiaomi.com^
||globalapi.ad.xiaomi.com^
||www.cdn.ad.xiaomi.com^
||tracking.miui.com^
||sa.api.intl.miui.com^
||tracking.intl.miui.com^
||tracking.india.miui.com^
||tracking.rus.miui.com^
!OnePlus
||analytics.oneplus.cn^
||click.oneplus.cn^
||click.oneplus.com^
||open.oneplus.net^
!Huawei
! --- Huawei
||data.hicloud.com^
||metrics.data.hicloud.com^
||metrics1.data.hicloud.com^
||metrics2.data.hicloud.com^
||metrics3.data.hicloud.com^
||metrics4.data.hicloud.com^
||metrics5.data.hicloud.com^
||metrics5.data.hicloud.com ^
||grs.hicloud.com^
||logservice.hicloud.com^
||logservice1.hicloud.com^
||metrics-dra.dt.hicloud.com^
||logbak.hicloud.com^
!Samsung
||samsungadhub.com^
! --- OnePlus
||click.oneplus.cn^
||click.oneplus.com^
||open.oneplus.net^
! --- Samsung
||samsungads.com^
||smetrics.samsung.com^
||nmetrics.samsung.com^
||samsung-com.112.2o7.net^
||business.samsungusa.com^
||analytics.samsungknox.com^
||bigdata.ssp.samsung.com^
||analytics-api.samsunghealthcn.com^
||config.samsungads.com^
!Apple
||metrics.apple.com^
||securemetrics.apple.com^
! --- Apple
||iad.apple.com^
||advertising.apple.com^
||tr.iadsdk.apple.com^
||supportmetrics.apple.com^
||metrics.icloud.com^
||metrics.mzstatic.com^
||dzc-metrics.mzstatic.com^
||books-analytics-events.news.apple-dns.net^
||books-analytics-events.apple.com^
||stocks-analytics-events.apple.com^
||stocks-analytics-events.news.apple-dns.net^
! End

View file

@ -1,293 +1,193 @@
! Title: d3Host List by d3ward
! Expires: 1 days
! Description: Simple and small list with the most popular advertising, analytics and social advertising services
! Homepage: https://github.com/d3ward/toolz
! License: CC BY-NC-SA
! Source: https://github.com/d3ward/toolz/blob/master/src/d3host.txt
# Title: d3Host List by d3ward
# Expires: 1 days
# Description: Simple and small list with the most popular advertising, tracking, analytics and social advertising services
# Homepage: https://github.com/d3ward/toolz
# License: CC BY-NC-SA
# Source: https://github.com/d3ward/toolz/blob/master/src/d3host.txt
# This list cover all the tests on https://d3ward.github.io/toolz/adblock
#
# Type : Stable
# Updated On: 20-10-2021
# This list cover all the tests on https://d3ward.github.io/toolz/adblock# Type : Stable
# Entries : 157
# Updated On: 21/12/2022
# Created by: d3ward
# Start Local Hosts
127.0.0.1 localhost
127.0.0.1 localhost.localdomain
127.0.0.1 local
255.255.255.255 broadcasthost
::1 localhost
::1 ip6-localhost
::1 ip6-loopback
fe80::1%lo0 localhost
ff00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
0.0.0.0 0.0.0.0
# End Local Hosts
#============ Ads =============
# Start
#Ads ====================
# Google Ads
# --- Google Ads
0.0.0.0 pagead2.googlesyndication.com
0.0.0.0 pagead2.googleadservices.com
0.0.0.0 ads.google.com
0.0.0.0 adservice.google.com
0.0.0.0 pagead2.googleadservices.com
0.0.0.0 googleadservices.com
#Media.net
# --- Media.net
0.0.0.0 static.media.net
0.0.0.0 media.net
0.0.0.0 adservetx.media.net
#Doubleclick.net
0.0.0.0 mediavisor.doubleclick.net
0.0.0.0 m.doubleclick.net
0.0.0.0 static.doubleclick.net
# --- Doubleclick.net
0.0.0.0 doubleclick.net
0.0.0.0 ad.doubleclick.net
0.0.0.0 static.doubleclick.net
0.0.0.0 m.doubleclick.net
0.0.0.0 mediavisor.doubleclick.net
#FastClick
0.0.0.0 fastclick.com
0.0.0.0 fastclick.net
0.0.0.0 media.fastclick.net
0.0.0.0 cdn.fastclick.net
#Amazon
# --- Amazon
0.0.0.0 adtago.s3.amazonaws.com
0.0.0.0 analyticsengine.s3.amazonaws.com
0.0.0.0 analytics.s3.amazonaws.com
0.0.0.0 advice-ads.s3.amazonaws.com
0.0.0.0 affiliationjs.s3.amazonaws.com
0.0.0.0 advertising-api-eu.amazon.com
0.0.0.0 amazonaax.com
0.0.0.0 amazonclix.com
0.0.0.0 assoc-amazon.com
##Analytics ====================
# Yahoo
0.0.0.0 ads.yahoo.com
0.0.0.0 adserver.yahoo.com
0.0.0.0 global.adserver.yahoo.com
0.0.0.0 us.adserver.yahoo.com
0.0.0.0 adspecs.yahoo.com
0.0.0.0 br.adspecs.yahoo.com
0.0.0.0 latam.adspecs.yahoo.com
0.0.0.0 ush.adspecs.yahoo.com
0.0.0.0 advertising.yahoo.com
0.0.0.0 de.advertising.yahoo.com
0.0.0.0 es.advertising.yahoo.com
0.0.0.0 fr.advertising.yahoo.com
0.0.0.0 in.advertising.yahoo.com
0.0.0.0 it.advertising.yahoo.com
0.0.0.0 sea.advertising.yahoo.com
0.0.0.0 uk.advertising.yahoo.com
0.0.0.0 analytics.yahoo.com
0.0.0.0 cms.analytics.yahoo.com
0.0.0.0 opus.analytics.yahoo.com
0.0.0.0 sp.analytics.yahoo.com
0.0.0.0 comet.yahoo.com
0.0.0.0 log.fc.yahoo.com
0.0.0.0 ganon.yahoo.com
0.0.0.0 gemini.yahoo.com
0.0.0.0 beap.gemini.yahoo.com
0.0.0.0 geo.yahoo.com
0.0.0.0 marketingsolutions.yahoo.com
0.0.0.0 pclick.yahoo.com
0.0.0.0 analytics.query.yahoo.com
0.0.0.0 geo.query.yahoo.com
0.0.0.0 onepush.query.yahoo.com
0.0.0.0 bats.video.yahoo.com
0.0.0.0 visit.webhosting.yahoo.com
0.0.0.0 ads.yap.yahoo.com
0.0.0.0 m.yap.yahoo.com
0.0.0.0 partnerads.ysm.yahoo.com
# Yandex
0.0.0.0 appmetrica.yandex.com
0.0.0.0 redirect.appmetrica.yandex.com
0.0.0.0 19534.redirect.appmetrica.yandex.com
0.0.0.0 3.redirect.appmetrica.yandex.com
0.0.0.0 30488.redirect.appmetrica.yandex.com
0.0.0.0 4.redirect.appmetrica.yandex.com
0.0.0.0 report.appmetrica.yandex.net
0.0.0.0 extmaps-api.yandex.net
0.0.0.0 analytics.mobile.yandex.net
0.0.0.0 banners.mobile.yandex.net
0.0.0.0 banners-slb.mobile.yandex.net
0.0.0.0 startup.mobile.yandex.net
0.0.0.0 offerwall.yandex.net
0.0.0.0 adfox.yandex.ru
0.0.0.0 matchid.adfox.yandex.ru
0.0.0.0 adsdk.yandex.ru
0.0.0.0 an.yandex.ru
0.0.0.0 redirect.appmetrica.yandex.ru
0.0.0.0 awaps.yandex.ru
0.0.0.0 awsync.yandex.ru
0.0.0.0 bs.yandex.ru
0.0.0.0 bs-meta.yandex.ru
0.0.0.0 clck.yandex.ru
0.0.0.0 informer.yandex.ru
0.0.0.0 kiks.yandex.ru
0.0.0.0 grade.market.yandex.ru
0.0.0.0 mc.yandex.ru
0.0.0.0 metrika.yandex.ru
0.0.0.0 click.sender.yandex.ru
0.0.0.0 share.yandex.ru
0.0.0.0 yandexadexchange.net
0.0.0.0 mobile.yandexadexchange.net
#========= Analytics ==========
#Google Analytics
# --- Google Analytics
0.0.0.0 google-analytics.com
0.0.0.0 ssl.google-analytics.com
#Hotjar
0.0.0.0 api-hotjar.com
0.0.0.0 hotjar-analytics.com
# --- Hotjar
0.0.0.0 hotjar.com
0.0.0.0 static.hotjar.com
0.0.0.0 adm.hotjar.com
0.0.0.0 identify.hotjar.com
0.0.0.0 insights.hotjar.com
0.0.0.0 script.hotjar.com
0.0.0.0 surveys.hotjar.com
0.0.0.0 careers.hotjar.com
0.0.0.0 events.hotjar.io
#MouseFlow
# --- MouseFlow
0.0.0.0 mouseflow.com
0.0.0.0 api.mouseflow.com
0.0.0.0 tools.mouseflow.com
0.0.0.0 cdn-test.mouseflow.com
0.0.0.0 a.mouseflow.com
#FreshMarketer
# --- FreshWorks
0.0.0.0 freshmarketer.com
0.0.0.0 claritybt.freshmarketer.com
0.0.0.0 fwtracks.freshmarketer.com
#Luckyorange
# --- Luckyorange
0.0.0.0 luckyorange.com
0.0.0.0 luckyorange.net
0.0.0.0 api.luckyorange.com
0.0.0.0 realtime.luckyorange.com
0.0.0.0 cdn.luckyorange.com
0.0.0.0 w1.luckyorange.com
0.0.0.0 upload.luckyorange.net
0.0.0.0 cs.luckyorange.net
0.0.0.0 settings.luckyorange.net
#Stats WP Plugin
# --- Stats WP Plugin
0.0.0.0 stats.wp.com
##Error Trackers ====================
#Bugsnag
#======= Error Trackers =======
# --- Bugsnag
0.0.0.0 notify.bugsnag.com
0.0.0.0 sessions.bugsnag.com
0.0.0.0 api.bugsnag.com
0.0.0.0 app.bugsnag.com
#Sentry
# --- Sentry
0.0.0.0 browser.sentry-cdn.com
0.0.0.0 app.getsentry.com
##Social ====================
#Facebook
#====== Social Trackers =======
# --- Facebook
0.0.0.0 pixel.facebook.com
0.0.0.0 analytics.facebook.com
0.0.0.0 ads.facebook.com
0.0.0.0 an.facebook.com
#Twitter
0.0.0.0 ads-api.twitter.com
0.0.0.0 advertising.twitter.com
# --- Twitter
0.0.0.0 ads-twitter.com
0.0.0.0 static.ads-twitter.com
0.0.0.0 ads-api.twitter.com
0.0.0.0 advertising.twitter.com
#LinkedIn
# --- LinkedIn
0.0.0.0 ads.linkedin.com
0.0.0.0 analytics.pointdrive.linkedin.com
#Pinterest
# --- Pinterest
0.0.0.0 ads.pinterest.com
0.0.0.0 log.pinterest.com
0.0.0.0 ads-dev.pinterest.com
0.0.0.0 analytics.pinterest.com
0.0.0.0 trk.pinterest.com
0.0.0.0 trk2.pinterest.com
0.0.0.0 widgets.pinterest.com
#Reddit
# --- Reddit
0.0.0.0 ads.reddit.com
0.0.0.0 events.reddit.com
0.0.0.0 d.reddit.com
0.0.0.0 rereddit.com
0.0.0.0 events.redditmedia.com
0.0.0.0 d.reddit.com
# TikTok
# --- YouTube
0.0.0.0 ads.youtube.com
# --- TikTok
0.0.0.0 ads-api.tiktok.com
0.0.0.0 analytics.tiktok.com
0.0.0.0 ads-sg.tiktok.com
0.0.0.0 analytics-sg.tiktok.com
0.0.0.0 ads.tiktok.com
0.0.0.0 analytics.tiktok.com
0.0.0.0 business-api.tiktok.com
0.0.0.0 ads.tiktok.com
#YouTube
0.0.0.0 ads.youtube.com
0.0.0.0 youtube.cleverads.vn
##Mix ====================
# Yahoo
#============ Mix =============
# --- Yahoo
0.0.0.0 ads.yahoo.com
0.0.0.0 adserver.yahoo.com
0.0.0.0 global.adserver.yahoo.com
0.0.0.0 us.adserver.yahoo.com
0.0.0.0 adspecs.yahoo.com
0.0.0.0 advertising.yahoo.com
0.0.0.0 analytics.yahoo.com
0.0.0.0 analytics.query.yahoo.com
0.0.0.0 ads.yap.yahoo.com
0.0.0.0 m.yap.yahoo.com
0.0.0.0 advertising.yahoo.com
0.0.0.0 analytics.query.yahoo.com
0.0.0.0 partnerads.ysm.yahoo.com
0.0.0.0 log.fc.yahoo.com
0.0.0.0 ganon.yahoo.com
0.0.0.0 gemini.yahoo.com
0.0.0.0 geo.yahoo.com
0.0.0.0 marketingsolutions.yahoo.com
0.0.0.0 pclick.yahoo.com
# Yandex
0.0.0.0 appmetrica.yandex.com
0.0.0.0 redirect.appmetrica.yandex.com
0.0.0.0 19534.redirect.appmetrica.yandex.com
0.0.0.0 3.redirect.appmetrica.yandex.com
0.0.0.0 30488.redirect.appmetrica.yandex.com
0.0.0.0 4.redirect.appmetrica.yandex.com
0.0.0.0 report.appmetrica.yandex.net
0.0.0.0 extmaps-api.yandex.net
# --- Yandex
0.0.0.0 yandexadexchange.net
0.0.0.0 analytics.mobile.yandex.net
0.0.0.0 banners.mobile.yandex.net
0.0.0.0 banners-slb.mobile.yandex.net
0.0.0.0 startup.mobile.yandex.net
0.0.0.0 extmaps-api.yandex.net
0.0.0.0 redirect.appmetrica.yandex.com
0.0.0.0 appmetrica.yandex.ru
0.0.0.0 adfstat.yandex.ru
0.0.0.0 an.yandex.ru
0.0.0.0 metrika.yandex.ru
0.0.0.0 share.yandex.ru
0.0.0.0 advertising.yandex.ru
0.0.0.0 offerwall.yandex.net
0.0.0.0 adfox.yandex.ru
0.0.0.0 matchid.adfox.yandex.ru
0.0.0.0 adsdk.yandex.ru
0.0.0.0 an.yandex.ru
0.0.0.0 redirect.appmetrica.yandex.ru
0.0.0.0 awaps.yandex.ru
0.0.0.0 awsync.yandex.ru
0.0.0.0 bs.yandex.ru
0.0.0.0 bs-meta.yandex.ru
0.0.0.0 clck.yandex.ru
0.0.0.0 informer.yandex.ru
0.0.0.0 kiks.yandex.ru
0.0.0.0 grade.market.yandex.ru
0.0.0.0 mc.yandex.ru
0.0.0.0 metrika.yandex.ru
0.0.0.0 click.sender.yandex.ru
0.0.0.0 share.yandex.ru
0.0.0.0 yandexadexchange.net
0.0.0.0 mobile.yandexadexchange.net
##OEM ====================
#Realme
#============ OEMs ============
# --- Realme
0.0.0.0 iot-eu-logser.realme.com
0.0.0.0 iot-logser.realme.com
0.0.0.0 data-cl-id-ads.realmemobile.com
0.0.0.0 data-sg-ads.realmemobile.com
0.0.0.0 bdapi-ads.realmemobile.com
0.0.0.0 adx-id-ads.realmemobile.com
0.0.0.0 bdapi-in-ads.realmemobile.com
#OPPO
0.0.0.0 adsfs.oppomobile.com
0.0.0.0 adx.ads.oppomobile.com
0.0.0.0 bdapi.ads.oppomobile.com
0.0.0.0 ck.ads.oppomobile.com
0.0.0.0 data.ads.oppomobile.com
0.0.0.0 g1.ads.oppomobile.com
#Xiaomi
# --- Xiaomi
0.0.0.0 api.ad.xiaomi.com
0.0.0.0 app.chat.xiaomi.net
0.0.0.0 data.mistat.xiaomi.com
0.0.0.0 data.mistat.intl.xiaomi.com
0.0.0.0 data.mistat.india.xiaomi.com
@ -295,54 +195,47 @@ ff02::3 ip6-allhosts
0.0.0.0 sdkconfig.ad.xiaomi.com
0.0.0.0 sdkconfig.ad.intl.xiaomi.com
0.0.0.0 globalapi.ad.xiaomi.com
0.0.0.0 www.cdn.ad.xiaomi.com
0.0.0.0 tracking.miui.com
0.0.0.0 sa.api.intl.miui.com
0.0.0.0 tracking.miui.com
0.0.0.0 tracking.intl.miui.com
0.0.0.0 tracking.india.miui.com
0.0.0.0 tracking.rus.miui.com
#OnePlus
0.0.0.0 analytics.oneplus.cn
0.0.0.0 click.oneplus.cn
0.0.0.0 click.oneplus.com
0.0.0.0 open.oneplus.net
# --- Oppo
0.0.0.0 adsfs.oppomobile.com
0.0.0.0 adx.ads.oppomobile.com
0.0.0.0 bdapi.ads.oppomobile.com
0.0.0.0 ck.ads.oppomobile.com
0.0.0.0 data.ads.oppomobile.com
0.0.0.0 g1.ads.oppomobile.com
#Huawei
# --- Huawei
0.0.0.0 data.hicloud.com
0.0.0.0 metrics.data.hicloud.com
0.0.0.0 metrics1.data.hicloud.com
0.0.0.0 metrics2.data.hicloud.com
0.0.0.0 metrics3.data.hicloud.com
0.0.0.0 metrics4.data.hicloud.com
0.0.0.0 metrics5.data.hicloud.com
0.0.0.0 metrics5.data.hicloud.com
0.0.0.0 grs.hicloud.com
0.0.0.0 logservice.hicloud.com
0.0.0.0 logservice1.hicloud.com
0.0.0.0 metrics-dra.dt.hicloud.com
0.0.0.0 logbak.hicloud.com
#Samsung
0.0.0.0 ad.samsungadhub.com
0.0.0.0 samsungadhub.com
# --- OnePlus
0.0.0.0 click.oneplus.cn
0.0.0.0 click.oneplus.com
0.0.0.0 open.oneplus.net
# --- Samsung
0.0.0.0 samsungads.com
0.0.0.0 smetrics.samsung.com
0.0.0.0 nmetrics.samsung.com
0.0.0.0 samsung-com.112.2o7.net
0.0.0.0 business.samsungusa.com
0.0.0.0 analytics.samsungknox.com
0.0.0.0 bigdata.ssp.samsung.com
0.0.0.0 analytics-api.samsunghealthcn.com
0.0.0.0 config.samsungads.com
#Apple
0.0.0.0 metrics.apple.com
0.0.0.0 securemetrics.apple.com
# --- Apple
0.0.0.0 iad.apple.com
0.0.0.0 advertising.apple.com
0.0.0.0 tr.iadsdk.apple.com
0.0.0.0 supportmetrics.apple.com
0.0.0.0 metrics.icloud.com
0.0.0.0 metrics.mzstatic.com
0.0.0.0 dzc-metrics.mzstatic.com
0.0.0.0 books-analytics-events.news.apple-dns.net
0.0.0.0 books-analytics-events.apple.com
0.0.0.0 stocks-analytics-events.apple.com
0.0.0.0 stocks-analytics-events.news.apple-dns.net
# End

28
src/fontlist.ejs Normal file
View file

@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Font list</title>
<meta name="description" content="List fonts available in the browser ">
</head>
<body>
<%- include('partials/header.ejs', {page:'fontlist'}) %>
<main>
<div class="hero ">
<p>Show a list of available fonts in your browser</p>
</div>
<div id="flist">
</div>
</main>
<%- include('partials/footer.ejs') %>
<%- include('partials/gotop.ejs') %>
</body>
</html>

86
src/index.ejs Normal file
View file

@ -0,0 +1,86 @@
<!DOCTYPE html>
<html lang="en">
<%- include('partials/head.ejs',
{
page: 'toolz',
title:'Toolz by d3ward - Home',
description:'Are you looking for a reliable and comprehensive toolkit for testing browser features? Look no further!'+
' Toolz is an open source project that offers a range of tools for testing everything from fonts and'+
' viewport units to the efficiency of ad blockers. With this easy-to-use interface and extensive collection of testing tools,'+
' you\'ll have everything you need to ensure that your websites, browser and applications are optimized for the best performance and user experience.',
url: 'd3ard.github.io/toolz/',
preview_thumbnail:'https://d3ward.github.io/toolz/src/preview_toolz.png',
keywords:'toolz,web tools,tools,browser testing,font testing,viewport testing,adblock testing, ad blocker testing,performance,toolkit,web design,open source'
}) %>
<body>
<%- include('partials/support_me.ejs') %>
<%- include('partials/header.ejs', {page:'index'}) %>
<main class="_ta-center">
<div class="_aos-top card">
<div class="img-w _bg">
<svg viewBox="0 0 12.002 12.7" fill="var(--primary)" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient>
<stop offset="0" stop-color="#fc575e"></stop>
<stop offset="1" stop-color="#f7b42c"></stop>
</linearGradient>
</defs>
<g paint-order="stroke markers fill" stroke-width="10.32">
<path d="M8 4.22c.581-.065 3.977.236 3.961.314L5.19 8.361.034 8.214z" fill-opacity=".831">
</path>
<path
d="M3.579 4.385C1.42 4.27.047 2.012 0 0h3.982c3.437 0 4.025.013 4.24.044 2.282-.027 3.674 2.286 3.74 4.49M7.38 8.204c2.537.053 4.463 2.109 4.622 4.496l-7.9-.016c-1.18-.019-4.052-1.81-4.068-4.47">
</path>
</g>
</svg>
</div>
<h1 class="_mono">Toolz</h1>
<p>Collection of browser testing tools.</p>
</div>
<div class="_2-col">
<div>
<a href="./adblock.html">
<div class="card _aos-bottom _txt">
<div class="img-w">
<svg fill="var(--blue)" viewbox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
<path
d="M63.98 27.685c-11.2 0-19.45 1.43-28.666 4.974-4.726 1.82-4.948 2.305-4.368 9.538.783 9.734 3.79 21.804 5.788 23.204h.006c1.294.906 1.359.895 5.762-1.055l3.887-1.719.247-4.466c.164-2.95.534-5.16 1.088-6.504 5.8-13.987 24.36-15.6 32.377-2.819a165.87 165.87 0 001.536 2.415c.067.094 2.902-.286 6.302-.846 8.414-1.387 8.515-1.474 9.115-8.288.61-6.893.258-7.667-4.35-9.434-9.273-3.57-17.497-5-28.724-5zm25.782 31.108c-1.212.054-2.792.318-4.78.755-2.195.483-2.222.51-2.48 2.37-.616 4.503-4.08 9.553-8.47 12.35-6.523 4.147-15.674 3.25-21.484-2.103l-1.947-1.79-3.19 1.393c-1.753.767-3.526 1.681-3.94 2.031-1.226 1.034-1.4 3.21-.41 5.144 2.298 4.507 10.82 14.17 16.92 19.18 3.835 3.15 4.28 3.086 9.514-1.38 9.813-8.38 18.129-20.139 22.552-31.883 1.703-4.517 1.35-6.23-2.285-6.067z" />
<path
d="M64.005 14c-4.992 0-9.984.257-13.262.768-9.64 1.5-18.933 4.257-27.123 8.04-5.084 2.35-5.615 3.542-5.632 12.586-.033 20.197 6.158 38.675 18.568 55.385 5.694 7.667 17.217 18.304 24.057 22.214 3.57 2.043 5.931 1.22 13.555-4.733 16.362-12.774 28.101-30.598 33.021-50.138 1.837-7.303 2.46-11.792 2.715-19.636.294-9.007.046-11.2-1.47-13.008-2.835-3.36-18.461-8.73-31.174-10.71-3.276-.51-8.264-.768-13.255-.768zm.215 6.185c12.843.02 22.323 1.856 34.447 6.686 5.127 2.04 5.287 2.25 5.28 6.797-.03 20.474-7.486 41.401-20.326 57.078-4.633 5.654-12.121 12.67-17.188 16.108-.926.63-2.018 1.145-2.428 1.145-2.337 0-13.634-9.92-19.584-17.2-12.93-15.824-20.368-36.67-20.371-57.105 0-4.456.524-5.062 6.204-7.246 11.754-4.52 21.305-6.28 33.966-6.263z" />
</svg>
</div>
<h6 class="_txt-center">Adblock Test</h6>
</div>
</a>
</div>
<div>
<a href="./fontlist.html">
<div class="card _aos-bottom _txt">
<div class="img-w"><svg fill="var(--orange)" viewbox="0 0 128 128"
xmlns="http://www.w3.org/2000/svg">
<path
d="M50.336 22.85c-1.471 0-2.942.712-3.54 2.137L19.911 89a3.84 3.84 0 002.052 5.029 3.835 3.835 0 005.029-2.054l5.407-12.874h35.88l5.408 12.874a3.82 3.82 0 003.539 2.354c.07 0 .139-.017.208-.02.063.004.122.019.186.019h18.893c7.513 0 13.619-6.108 13.619-13.62 0-5.372-3.152-9.985-7.677-12.204 2.559-2.472 4.162-5.932 4.162-9.765 0-7.51-6.107-13.62-13.62-13.62H77.62a2.637 2.637 0 00-2.636 2.636V75.24L53.877 24.987c-.597-1.425-2.07-2.138-3.54-2.138zM18.991 97.655c-4.372 0-4.991 1.67-4.991 3.747s.636 3.748 4.99 3.748H108.4c4.355 0 5.601-1.679 5.601-3.748s-1.23-3.747-5.601-3.747z" />
</svg></div>
<h6 class="_txt-center">FontList</h6>
</div>
</a></div>
<div>
<a href="./units.html">
<div class="card _aos-bottom _txt">
<div class="img-w"><svg fill="var(--green)" viewbox="0 0 128 128"
xmlns="http://www.w3.org/2000/svg">
<path
d="M104.625 67.125h-43.75v-43.75c0-5.156-4.219-9.375-9.375-9.375H23.375C18.219 14 14 18.219 14 23.375v81.25c0 5.156 4.219 9.375 9.375 9.375h81.25c5.156 0 9.375-4.219 9.375-9.375V76.5c0-5.156-4.219-9.375-9.375-9.375zm-3.568 37.5H26.158c-2.758-.237-2.783-.235-2.783-3.16V27.18c.136-3.817-.293-3.805 3.703-3.805h21.254c3.256.106 3.168.005 3.168 2.579v5.808c.02.556-.196.812-.728.812H35.875c-4.447.492-3.296 6.15 0 6.25l14.88.168c.45.003.7.148.745.661v11.048c.052.523-.249.781-.745.799h-14.88c-4.442.492-3.297 6.149 0 6.25h14.773c.53.033.838.186.852.701V69.5c-.013.573-.295.751-.852.751H35.875c-4.442.492-3.297 6.149 0 6.25h14.844c.562-.004.781.255.781.767v14.858c.492 4.442 6.149 3.297 6.25 0V77.231c-.012-.617.265-.713.79-.731h10.8c.716.016.91.308.91.927v14.698c.491 4.447 6.15 3.296 6.25 0V77.409c.004-.732.216-.909.891-.909h10.73c.778.046.879.522.879 1.175v14.45c.491 4.447 6.15 3.296 6.25 0V77.888c-.01-.987.267-1.388 1.453-1.388h5.376c1.816-.048 2.51.929 2.546 2.486v22.582c-.194 2.912-.327 3.057-3.568 3.057z" />
</svg></div>
<h6 class="_txt-center">Units</h6>
</div>
</a>
</div>
</div>
</main>
<%- include('partials/footer.ejs') %>
<%- include('partials/gotop.ejs') %>
</body>
</html>

11
src/js/404.js Normal file
View file

@ -0,0 +1,11 @@
import '../sass/404.sass'
import { themeManager } from './components/themeManager'
import { gotop } from './components/gotop'
import { aos } from './components/aos'
// Call the function when the DOM is loaded
document.addEventListener('DOMContentLoaded', () => {
new themeManager()
new gotop()
new aos()
})

333
src/js/adblock.js Normal file
View file

@ -0,0 +1,333 @@
import '../sass/adblock.sass'
import * as data from '../adblock_data.json'
import { icons } from '../assets/adblock/icons'
import { navbar } from './components/navbar'
import { dialog } from './components/dialog'
import { themeManager } from './components/themeManager'
import { gotop } from './components/gotop'
import { aos } from './components/aos'
import { fadeIn, fadeOut } from './components/fade'
import { Snackbar } from './components/snackbar'
import { LocalStorageManager } from './components/localStorage'
async function getStatus(url) {
return new Promise(function (resolve, reject) {
var link = document.createElement('link')
link.rel = 'stylesheet'
link.type = 'text/css'
link.href = url
link.onload = function () {
resolve(true)
}
link.onerror = function () {
resolve(false)
}
document.body.appendChild(link)
})
}
var LS = new LocalStorageManager('adb_tool')
var reports = LS.get('reports')
if (!reports) reports = []
var test_log = document.getElementById('test_log')
var snackbar = new Snackbar({
topPos: "10px",
classNames: 'success',
autoClose: true,
autoCloseTimeout: 2000
})
async function copyToClip(str) {
try {
await navigator.clipboard.writeText(str).then(()=>{snackbar.showN('URL copied to clipboard !')})
} catch (err) {
const txt = document.createElement('textarea')
txt.value = str
txt.setAttribute('readonly', '')
txt.style.position = 'absolute'
txt.style.left = '-9999px'
document.body.appendChild(txt)
txt.select();
txt.setSelectionRange(0, 99999);
document.execCommand('copy');
txt.remove()
snackbar.showN('URL copied to clipboard !')
}
}
var abt = {
total: 10,
points_block: 0,
cosmetic_test: {
static: false,
dynamic: false
},
script: {
ads: false,
pagead: false,
partnerads: false
},
hosts: {},
logs: {}
}
const testWrapper = document.getElementById('test') //Tests wrapper
//--------------------------------------------------
//Function to check a host blocking status
async function check_url(url, div, parent, k1, k2) {
const controller = new AbortController()
const config = {
...{
method: 'HEAD',
mode: 'no-cors'
},
signal: controller.signal
}
const timeout = setTimeout(() => {
controller.abort()
}, 8000)
abt.total += 1
var hostDiv = document.createElement('div')
hostDiv.onclick = () => {
copyToClip(url)
}
div.appendChild(hostDiv)
try {
await fetch('https://' + url, config, timeout, parent, div)
.then((response) => {
console.log(response)
parent.style.background = 'var(--red)'
hostDiv.innerHTML = icons['x'] + '<span>' + url + '</span>'
Object.assign(abt.hosts[k1][k2], { [url]: false })
//Response was received --> ads are NOT blocked
})
.catch((error) => {
console.log(error.message)
hostDiv.innerHTML = icons['v'] + '<span>' + url + '</span>'
abt.points_block += 1
Object.assign(abt.hosts[k1][k2], { [url]: true })
//No response / error --> ads are blocked
})
} catch (error) {
console.log(error)
}
}
//Function to collapse a test
function collapse_category() {
var others = document.querySelectorAll('.test_collapse')
others.forEach((element) => {
element.addEventListener('click', () => {
element.parentElement.classList.toggle('show')
})
})
}
// Function to fetch all the tests
async function fetchTests() {
let fetches = []
Object.keys(data).forEach((key) => {
if (key == 'default') return
var catEl = document.createElement('div')
catEl.id = key
catEl.innerHTML = '<h5>' + icons[key] + '&nbsp;&nbsp;' + key + '</h5>'
testWrapper.appendChild(catEl)
var category = data[key]
var total_hosts = 0
abt.hosts[key] = {}
Object.keys(category).forEach((keyC) => {
var testInfo = document.createElement('div')
var tests_count = 0
var div = document.createElement('div')
const dw = document.createElement('div')
div.classList.add('test')
div.id = keyC
div.style.background = 'var(--green)'
let tc = icons[keyC]!=undefined?(icons[keyC]+"&nbsp") :""
div.innerHTML = "<span class='test_collapse'>" +tc+keyC + '</span>'
div.appendChild(dw)
catEl.appendChild(div)
Object.assign(abt.hosts[key], { [keyC]: {} })
if (Object.prototype.hasOwnProperty.call(category, keyC)) {
var value = category[keyC]
for (let i = 0; i < value.length; i++) {
fetches.push(
check_url(value[i], dw, div, key, keyC).then(() => {
set_liquid()
})
)
tests_count++
}
}
testInfo.innerHTML = keyC + ' => n° tests => ' + tests_count
test_log.appendChild(testInfo)
total_hosts += tests_count
})
var total_tests = document.createElement('div')
total_tests.innerHTML =
key +
' => Total n° tests => ' +
total_hosts +
'<br> ------------------------- '
test_log.appendChild(total_tests)
})
let results = await Promise.all(fetches)
return results
}
function ad_script_test() {
let log = document.createElement('div')
const sfa1 = document.querySelector('#sfa_1')
const sfa2 = document.querySelector('#sfa_2')
const sfa3 = document.querySelector('#sfa_3')
abt.script.ads = typeof s_test_ads == 'undefined'
abt.script.pagead = typeof s_test_pagead == 'undefined'
abt.script.partnerads = typeof s_test_partnerads == 'undefined'
sfa1.classList.add(abt.script.ads ? '_bg-green' : '_bg-red')
sfa2.classList.add(abt.script.pagead ? '_bg-green' : '_bg-red')
sfa3.classList.add(abt.script.partnerads ? '_bg-green' : '_bg-red')
test_log.appendChild(log)
log.innerHTML =
'<div>script_ads : ' +
abt.script.ads +
'</div><div>script_pagead : ' +
abt.script.pagead +
'</div><div>script_partenrads : ' +
abt.script.partnerads +
'</div><br> ------------------------- '
}
const ctd = document.querySelector('#ctd_test')
const cts = document.querySelector('#cts_test')
//Static
function cosmetic_test_static() {
abt.cosmetic_test.static =
cts.offsetHeight || cts.clientHeight ? false : true
abt.points_block += abt.cosmetic_test.static && 2
document
.querySelector('#ct_static')
.classList.add(abt.cosmetic_test.static ? '_bg-green' : '_bg-red')
let log = document.createElement('div')
test_log.appendChild(log)
log.innerHTML =
' cosmetic_static_ad : ' +
abt.cosmetic_test.static +
'<br><br> ------------------------- '
}
//Dynamic
function cosmetic_test_dynamic() {
let log = document.createElement('div')
let ad = document.createElement('div')
ad.className =
'textads banner-ads banner_ads ad-unit afs_ads ad-zone ad-space adsbox'
ctd.appendChild(ad)
setTimeout(function () {
abt.cosmetic_test.dynamic =
ad.offsetHeight || ad.clientHeight ? false : true
abt.points_block += abt.cosmetic_test.dynamic && 2
test_log.appendChild(log)
log.innerHTML =
' cosmetic_dynamic_ad : ' +
abt.cosmetic_test.dynamic +
'<br><br> ------------------------- '
document
.querySelector('#ct_dynamic')
.classList.add(abt.cosmetic_test.dynamic ? '_bg-green' : '_bg-red')
}, 500)
}
const lt_particles = document.querySelector('.lt_particles')
const lt_cwrap = document.querySelector('.lt_cwrap')
async function startAdBlockTesting() {
document.querySelector('.lt_wrap').classList.add('start')
lt_cwrap.classList.add('start')
let tests = []
tests.push(cosmetic_test_static())
tests.push(cosmetic_test_dynamic())
tests.push(ad_script_test())
tests.push(fetchTests())
let results = await Promise.all(tests)
return results
}
function set_liquid() {
var p = (100 / abt.total) * abt.points_block
var c = p > 30 ? (p > 60 ? 'var(--green)' : 'var(--orange)') : 'var(--red)'
document.body.style.setProperty('--liquid-percentage', 45 - p + '%')
document.body.style.setProperty('--liquid-color', c)
document.body.style.setProperty(
'--liquid-title',
"'" + abt.points_block + "'"
)
}
function stopAdBlockTesting() {
fadeOut(lt_particles, () => {
document.querySelector('.lt_wrap').classList.remove('start')
fadeIn(lt_particles, 'flex')
document.body.classList.remove("_overflowhidden")
})
lt_cwrap.classList.remove('start')
console.log(abt)
}
function saveNote(t,i){
console.log(i,t.value)
}
function render_tests() {
console.log(reports)
var r_wrap = document.querySelector('.r_wrap')
r_wrap.innerHTML= ''
reports.forEach( (r,index) => {
var div = document.createElement('div')
div.className= "row"
var date = new Date(r["time"]);
let d = date.getDate()+"/"+(date.getMonth()+1)+"/"+date.getFullYear()+
" "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();
div.innerHTML = "<div><h5>"+d+"</h5> <textarea>"+r.note+"</textarea></div><div><button class='btn-blue'>"+icons["download"]+"</button> <button class='btn-red'>"+icons["delete"]+index+"</button></div>"
div.querySelector("textarea").addEventListener("blur", (e)=>{reports[index].note = e.target.value;LS.set("reports",reports)})
r_wrap.appendChild(div)
})
}
function add_report(){
let ms = Date.now();
if(reports.length < 5){
reports.push({"time" : ms ,"note": "Browser : \nOS : \nAd-block : \nDNS : \nVPN :","abt": abt})
}else{
reports.splice(0, 1)
reports.push({"time" : ms ,"note": "Browser : \nOS : \nAd-block : \nDNS : \nVPN :","abt": abt})
}
LS.set("reports",reports)
render_tests()
console.log(abt)
}
window.onbeforeunload = function () {
window.scrollTo(0, 0);
};
const el =(l)=>{return document.querySelector(l)}
document.addEventListener('DOMContentLoaded', function () {
new navbar()
new themeManager()
new gotop()
new aos()
render_tests()
startAdBlockTesting().then(() => {
collapse_category()
//Add a delay in order to show properly the animation
setTimeout(() => {
stopAdBlockTesting()
add_report()
}, 2000)
})
document.querySelector("#start_test").addEventListener("click",()=>{
location.reload(true)
})
const stxt = "https://raw.githubusercontent.com/d3ward/toolz/master/src/d3host.txt"
const sadblock ='https://raw.githubusercontent.com/d3ward/toolz/master/src/d3host.adblock'
document.querySelector("#d3H_txt").addEventListener("click",function(){copyToClip(stxt)})
el("#d3H_adblock").addEventListener("click",function(){copyToClip(sadblock)})
})

View file

@ -1,710 +0,0 @@
/**
* @fileOverview CollaJS - the lightweight modern DOM manipulation and events library
* @author Eduard Ursu
* @version 1.0.0
*/
(function (window, document) {
'use strict';
/** @constructor Colla */
function Colla(selector, context) {
return Object.create(collaProto, {
s: {
get: function () {
if(typeof selector === 'string') {
var startAt = ((context === 'string') ? document.querySelectorAll(selector) : context) || document; // tidy up
var nl = startAt.querySelectorAll(selector);
var arr = [];
for (var i = 0, len = arr.length = nl.length; i < len; i++) {
arr[i] = nl[i];
}
return arr;
} else {
return [selector]; // could be an object, dom node or a function but always kept in an array
}
},
set: function(value) {
selector = value;
}
}
});
}
var collaProto = {
/**
* Fade in/out
* @memberOf Colla
* @param {string} string Type of fading "in" or "out"
* @param {function} callback Function to be run after fading
* @returns Colla
* @example
* $('#first-box').fade("out", () => { });
* $('#second-box').fade("in", () => { });
*/
fade: function (status,callback) {
return this.each((function (el) {
if(status=="out"){
var opacity = 1;
var timer = setInterval(function(){
if(opacity < 0.1){
clearInterval(timer);
el.style.display = "none";
callback(); //this executes the callback function!
}
el.style.opacity = opacity;
opacity -= 0.1;
}, 50);
}else{
var opacity = 0;
el.style.opacity = opacity;
el.style.display = "block";
var timer = setInterval(function(){
if(opacity > 1){
clearInterval(timer);
if(callback)callback();
}
el.style.opacity = opacity;
opacity += 0.1;
}, 50);
}
}))
},
/**
* Each loop
* @memberOf Colla
* @param {function} callback Function to be run on each selector
* @returns Colla
* @example
* $('.each').each(function() { });
*/
each: function(callback) {
for (var i = 0, len = this.s.length; i < len; i++) {
callback(this.s[i]);
}
return this;
},
/**
* Find a new selector within a parent selector
* @memberOf Colla
* @param {string} selector Find a new selector within a parent selector
* @returns Colla
* @example
* $('.parent').find('.child');
*/
find: function(selector) {
return new Colla(selector, this.s[0]);
},
/**
* Set the CSS for an element
* @memberOf Colla
* @param {string} property Property of element to set
* @param {string} value Value of property to set
* @returns Colla
* @example
* $('.color').css('color', 'red');
*/
css: function(property, value) {
if(value) {
return this.each(function(el) {
el.style[property] = value;
});
} else {
return getComputedStyle(this.s[0])[property];
}
},
/**
* Sets selector to display none
* @memberOf Colla
* @returns Colla
* @example
* $('.hide').hide();
*/
hide: function() {
return this.each(function(el) {
el.style.display = 'none';
});
},
/**
* Sets selector to display block
* @memberOf Colla
* @returns Colla
* @example
* $('.show').show();
*/
show: function() {
return this.each(function(el) {
el.style.display = 'block';
});
},
/**
* Checks whether the selector is visible
* @memberOf Colla
* @returns Boolean
* @example
* $('.visible').visible();
*/
visible: function() {
if(this.s.length > 0) {
return this.s[0].offsetWidth > 0 || this.s[0].offsetHeight > 0;
} else {
return false;
}
},
/**
* Toggles the display property of the selector or a class from selecetor
* @memberOf Colla
* @param {string} className Name of class to toggle
* @returns Colla
* @example
* $('.class-box').toggle();
* $('.class').toggle('toggle-class');
*/
toggle: function(className) {
if(!className){
return this.each(function(el) {
if(el.style.display === '' || el.style.display === 'block') {
el.style.display = 'none';
}
else {
el.style.display = 'block';
}
});
}
return this.each(function(el) {
el.classList.toggle(className);
});
},
/**
* Adds a class to the selector
* @memberOf Colla
* @param {string} className Name of class to add
* @returns Colla
* @example
* $('.class').addClass('another-class');
*/
addClass: function(className) {
return this.each(function(el) {
el.classList.add(className);
});
},
/**
* Removes a class from the selector
* @memberOf Colla
* @param {string} className Name of class to remove
* @returns Colla
* @example
* $('.class remove-class').removeClass('remove-class');
*/
removeClass: function(className) {
return this.each(function(el) {
el.classList.remove(className);
});
},
/**
* Checks whether the selector has a specific class
* @memberOf Colla
* @returns Boolean
* @example
* $('.class').hasClass('another-class');
*/
hasClass: function(className) {
if(this.s.length > 0) {
return this.s[0].classList.contains(className);
} else {
return false;
}
},
/**
* Attaches an event to the selector
* @memberOf Colla
* @param {string} name Name of event e.g. click or names of events separated by spaces e.g. 'keyup keydown'
* @param {function} callback Callback to run when event is triggered
* @returns Colla
* @example
* $('.click-me').on('click', function() { alert('Clicked!'); });
*/
on: function(name, callback) {
return this.each(function(el) {
name.split(' ').forEach(function(ev){
el.addEventListener(ev, callback);
});
});
},
/**
* Attaches an event to the selector and removes after callback
* @memberOf Colla
* @param {string} name Name of event e.g. 'click' or names of events separated by spaces e.g. 'keyup keydown'
* @param {function} callback Callback to run when event is triggered
* @returns Colla
* @example
* $('.click-me').one('click', function() { alert('Clicked!'); });
*/
one: function(name, callback) {
return this.each(function(el) {
name.split(' ').forEach(function(ev){
var callbackWithRemove = function() {
callback();
el.removeEventListener(ev, callbackWithRemove); // remove event
};
el.addEventListener(ev, callbackWithRemove);
});
});
},
/**
* Removes an event from the selector
* @memberOf Colla
* @param {string} name Name of event e.g. click or names of events separated by spaces e.g. 'keyup keydown'
* @param {function} callback Callback to run when event is triggered
* @returns Colla
* @example
* $('.click-me').off('click', function() { alert('Clicked!'); });
*/
off: function(name, callback) {
return this.each(function(el) {
name.split(' ').forEach(function(ev){
el.removeEventListener(ev, callback);
});
});
},
/**
* Sets the first selector to be focussed
* @memberOf Colla
* @returns Colla
* @example
* $('.focus').focus();
*/
focus: function() {
if(this.s.length > 0) {
this.s[0].focus();
}
return this;
},
/**
* Removes keyboard focus from first selector
* @memberOf Colla
* @returns Colla
* @example
* $('.blur').blur();
*/
blur: function() {
if(this.s.length > 0) {
this.s[0].blur();
}
return this;
},
/**
* Trigger an event from the selector
* @memberOf Colla
* @param {string} name Name of event e.g. click
* @param {object} detail The data passed when initializing the event
* @returns Colla
* @example
* $('.click-me').trigger('click');
*/
trigger: function(name, detail) {
return this.each(function(el) {
var triggerEvent = ((detail) ? new CustomEvent(name, detail) : document.createEvent('HTMLEvents'));
if(!detail) {
triggerEvent.initEvent(name, true, false);
}
el.dispatchEvent(triggerEvent);
});
},
/**
* Find the previous sibling to the current selector
* @memberOf Colla
* @returns Colla
* @example
* $('.selector').prev();
*/
prev: function() {
if(this.s.length > 0) {
this.s = this.s[0].previousElementSibling;
} else {
this.s = [];
}
return this;
},
/**
* Find the next sibling to the current selector
* @memberOf Colla
* @returns Colla
* @example
* $('.selector').next();
*/
next: function() {
if(this.s.length > 0) {
this.s = this.s[0].nextElementSibling;
} else {
this.s = [];
}
return this;
},
/**
* Find the first element of the selector
* @memberOf Colla
* @returns Colla
* @example
* $('.selector').first();
*/
first: function() {
if(this.s.length > 0) {
this.s = this.s[0];
}
return this;
},
/**
* Find the last element of the selector
* @memberOf Colla
* @returns Colla
* @example
* $('.selector').last();
*/
last: function() {
if(this.s.length > 0) {
var arrayLength = this.s.length;
this.s = this.s.slice(arrayLength-1,arrayLength);
}
return this;
},
/**
* Find the parent of the selector
* @memberOf Colla
* @returns Colla
* @example
* $('.selector').parent();
*/
parent: function() {
if(this.s.length > 0) {
this.s = this.s[0].parentNode;
}
return this;
},
/**
* Find the children of the selector
* @memberOf Colla
* @returns Colla
* @example
* $('.selector').children();
*/
children: function() {
if(this.s.length > 0) {
this.s.slice.call(this.s[0].children);
} else {
this.s = [];
}
return this;
},
/**
* Add HTML to the page in relation to the current selector
* @memberOf Colla
* @param {string} position The position to add the html - before, after, atstart, atend
* @param {string} html The HTML to add
* @returns Colla
* @example
* $('.html').append('before','<p>I am before</p>');
*/
append: function(position, html) {
return this.each(function(el) {
switch(position.toLowerCase()){
case 'before': return el.insertAdjacentHTML('beforebegin', html);
case 'after': return el.insertAdjacentHTML('afterend', html);
case 'atstart': return el.insertAdjacentHTML('afterbegin', html);
case 'atend': return el.insertAdjacentHTML('beforeend', html);
}
});
},
/**
* Set the text of a selector
* @memberOf Colla
* @param {string} text Text to set
* @returns Colla or text
* @example
* $('.text').text('Some text.');
*/
text: function(text) {
if(text) {
return this.each(function(el) {
el.textContent = text;
});
} else {
return this.s[0].textContent.trim();
}
},
/**
* Set the HTML of a selector
* @memberOf Colla
* @param {string} html HTML to set
* @returns Colla or HTML
* @example
* $('.text').html('<span>A span.</span>');
*/
html: function(html) {
if(html) {
return this.each(function(el) {
el.innerHTML = html;
});
} else {
return this.s[0].innerHTML;
}
},
/**
* Set the outerHTML of a selector
* @memberOf Colla
* @param {string} html HTML to set
* @returns Colla or HTML
* @example
* $('.text').outerHTML('<span>A span.</span>');
*/
outerHTML: function(html) {
if(html) {
return this.each(function(el) {
el.outerHTML = html;
});
} else {
return this.s[0].outerHTML;
}
},
/**
* Empty the HTML of a selector
* @memberOf Colla
* @returns Colla
* @example
* $('.empty-me').empty();
*/
empty: function() {
return this.each(function(el) {
el.innerHTML = '';
});
},
/**
* Clone a selector
* @memberOf Colla
* @returns Colla
* @example
* $('.empty-me').clone();
*/
clone: function() {
return this.each(function(el) {
el.clodeNode(true);
});
},
/**
* Removes a selector
* @memberOf Colla
* @returns Colla
* @example
* $('.remove-me').remove();
*/
remove: function() {
return this.each(function(el) {
el.parentNode.removeChild(el);
});
},
/**
* Get or set the attribute of a selector
* @memberOf Colla
* @param {string} name Attr to get or set
* @param {string} value Value to set
* @returns Colla
* @example
* $('.get-attr').attr('data-attr');
* $('.set-attr').attr('data-attr','Value');
*/
attr: function(name, value) {
if(!value) {
return this.s[0].getAttribute(name);
} else {
return this.each(function(el) {
el.setAttribute(name, value);
});
}
},
/**
* Remove an attribute from a selector
* @memberOf Colla
* @param {string} name Attr to remove
* @returns Colla
* @example
* $('.attr').removeAttr('data-attr');
*/
removeAttr: function(name) {
return this.each(function(el) {
el.removeAttribute(name);
});
},
/**
* Get the value of a selector
* @memberOf Colla
* @param {string} value Value to set
* @returns value
* @example
* $('.input').val();
*/
val: function(value) {
if(value) {
return this.each(function(el) {
el.value = value;
});
} else {
if(this.s.length > 0) {
return this.s[0].value;
} else {
return undefined;
}
}
},
/**
* Get the number of matched elements in the selector
* @memberOf Colla
* @returns length
* @example
* $('.length').length();
*/
length: function() {
return this.s.length;
},
/**
* Get the height of the first element in the selector
* @memberOf Colla
* @returns number height
* @example
* $('.height').height();
*/
height: function() {
if(this.s.length > 0) {
return this.s[0].offsetHeight;
} else {
return null;
}
},
/**
* Get the width of the first element in the selector
* @memberOf Colla
* @returns number width
* @example
* $('.width').width();
*/
width: function() {
if(this.s.length > 0) {
return this.s[0].offsetWidth;
} else {
return null;
}
},
/**
* Returns the position of the first element in the selector relative to the viewport
* @memberOf Colla
* @returns TextRectangle object
* @example
* $('.position').position();
*/
position: function() {
if(this.s.length > 0) {
return this.s[0].getBoundingClientRect();
} else {
return null;
}
},
/**
* Returns true if the element matches the selector string
* @memberOf Colla
* @param {string} selector Selector to match
* @returns boolean
* @example
* $('.paragraph').matches('p');
*/
matches: function(selector) {
return this.s[0].matches(selector);
},
/**
* Returns closest element to selector
* @memberOf Colla
* @param {string} selector Selector to match
* @returns Colla
* @example
* $('.logo').closest('.header');
*/
closest: function(selector) {
return new Colla(this.s[0].closest(selector));
}
};
// Asynchronous Module Definition support
if (typeof define === "function" && define.amd) {
define(function() {
return Colla;
});
}
// Expose colla to the world:-)
window.$ = window.Colla = Colla;
// Expose functions to the world
window.$.fn = collaProto;
}(window, document));
// Polyfills
// Matches - prefixed in IE, IOS7 Safari and older Android browser versions
if(!Element.prototype.matches) {
Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
}
// Closest - not yet supported by IE and Safari
if(!Element.prototype.closest) {
Element.prototype.closest = function closest(selector) {
var node = this;
while (node) {
if (node.matches(selector)) {
return node;
}
else {
node = node.parentElement;
}
}
return null;
};
}

View file

@ -0,0 +1,59 @@
export function alert(options) {
var t = this
if (!options) options = []
t.count = 0
t.timeout = options.timeout ? options.timeout : 3000
t.autoClose = options.autoClose ? options.autoClose : true
const close =
'<svg class="_icon" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path></svg>'
t.container = document.querySelector('#nt1')
t.close = ($el) => {
$el.classList.add('animate-out')
setTimeout(() => {
$el.remove()
t.count--
}, 300)
}
t.setCloseOnClick = ($el) => {
$el.addEventListener('click', function () {
t.close($el)
})
}
t.setAutocloseTimeout = ($el, timeout) => {
setTimeout(() => {
t.close($el)
}, timeout)
}
t.createItem = (message, type) => {
var $item = document.createElement('div')
$item.classList.add('alert-item')
$item.classList.add(type)
$item.innerHTML = '<span>' + message + '</span>' + close
t.count++
return $item
}
t.error = (txt) => {
t.showA(t.createItem(txt, 'error'))
}
t.warn = (txt) => {
t.showA(t.createItem(txt, 'warn'))
}
t.info = (txt) => {
var l = t.createItem(txt, 'info')
t.showA(l)
}
t.success = (txt) => {
var l = t.createItem(txt, 'success')
t.showA(l)
}
t.show = (txt) => {
var l = t.createItem(txt, '')
t.showA(l)
}
t.showA = (l) => {
if (t.autoClose) t.setAutocloseTimeout(l, t.timeout)
t.setCloseOnClick(l)
t.container.append(l)
}
}

32
src/js/components/aos.js Normal file
View file

@ -0,0 +1,32 @@
export function aos() {
//Get and observe all the items with the item class
let items = document.querySelectorAll('[class*=_aos]')
//Only Use the IntersectionObserver if it is supported and _aos elements exist
if (IntersectionObserver && items) {
//When the element is visible on the viewport,
//add the _aos-done class so it creates the _aos animation.
let callback = function (entries) {
entries.forEach((entry) => {
//if the element is visible, add the _aos-done class
if (
entry.isIntersecting &&
!entry.target.classList.contains('_aos-done')
) {
entry.target.classList.add('_aos-done')
} else {
//else the element do reverse animation
entry.target.classList.remove('_aos-done')
}
})
}
//Create the observer
let observer = new IntersectionObserver(callback, {
root: null,
threshold: 0
})
//Add each _aos element to the observer
items.forEach((item) => {
observer.observe(item)
})
}
}

View file

@ -0,0 +1,33 @@
export function carousel() {
var t = this
t.slides = document.querySelectorAll('.slide')
t.next = document.querySelector('.next-btn')
t.prev = document.querySelector('.prev-btn')
t.dots = document.querySelectorAll('.dot')
t.index = 1
t.next.addEventListener('click', () => {
t.showSlides((t.index += 1))
})
t.prev.addEventListener('click', () => {
t.showSlides((t.index += -1))
})
t.dots.forEach((element, index) => {
element.addEventListener('click', (index) => {
t.showSlides(index)
})
})
t.showSlides = (n) => {
var i
if (n > t.slides.length) t.index = 1
if (n < 1) t.index = slides.length
for (i = 0; i < t.slides.length; i++) {
t.slides[i].style.display = 'none'
}
for (i = 0; i < t.dots.length; i++) {
t.dots[i].className = t.dots[i].className.replace(' active', '')
}
t.slides[t.index - 1].style.display = 'block'
t.dots[t.index - 1].className += ' active'
}
t.showSlides(t.index)
}

211
src/js/components/dialog.js Normal file
View file

@ -0,0 +1,211 @@
!(function (t, e) {
'object' == typeof exports && 'undefined' != typeof module
? (module.exports = e())
: 'function' == typeof define && define.amd
? define(e)
: ((t =
'undefined' != typeof globalThis
? globalThis
: t || self).A11yDialog = e())
})(this, function () {
'use strict'
var t = [
'a[href]:not([tabindex^="-"])',
'area[href]:not([tabindex^="-"])',
'input:not([type="hidden"]):not([type="radio"]):not([disabled]):not([tabindex^="-"])',
'input[type="radio"]:not([disabled]):not([tabindex^="-"])',
'select:not([disabled]):not([tabindex^="-"])',
'textarea:not([disabled]):not([tabindex^="-"])',
'button:not([disabled]):not([tabindex^="-"])',
'iframe:not([tabindex^="-"])',
'audio[controls]:not([tabindex^="-"])',
'video[controls]:not([tabindex^="-"])',
'[contenteditable]:not([tabindex^="-"])',
'[tabindex]:not([tabindex^="-"])'
]
function e(t) {
;(this._show = this.show.bind(this)),
(this._hide = this.hide.bind(this)),
(this._maintainFocus = this._maintainFocus.bind(this)),
(this._bindKeypress = this._bindKeypress.bind(this)),
(this.$el = t),
(this.shown = !1),
(this._id =
this.$el.getAttribute('data-a11y-dialog') || this.$el.id),
(this._previouslyFocused = null),
(this._listeners = {}),
this.create()
}
function i(t, e) {
return (
(i = (e || document).querySelectorAll(t)),
Array.prototype.slice.call(i)
)
var i
}
function n(t) {
;(t.querySelector('[autofocus]') || t).focus()
}
function s() {
i('[data-a11y-dialog]').forEach(function (t) {
new e(t)
})
}
return (
(e.prototype.create = function () {
this.$el.setAttribute('aria-hidden', !0),
this.$el.setAttribute('aria-modal', !0),
this.$el.setAttribute('tabindex', -1),
this.$el.hasAttribute('role') ||
this.$el.setAttribute('role', 'dialog'),
(this._openers = i(
'[data-a11y-dialog-show="' + this._id + '"]'
)),
this._openers.forEach(
function (t) {
t.addEventListener('click', this._show)
}.bind(this)
)
const t = this.$el
return (
(this._closers = i('[data-a11y-dialog-hide]', this.$el)
.filter(function (e) {
return (
e.closest(
'[aria-modal="true"], [data-a11y-dialog]'
) === t
)
})
.concat(i('[data-a11y-dialog-hide="' + this._id + '"]'))),
this._closers.forEach(
function (t) {
t.addEventListener('click', this._hide)
}.bind(this)
),
this._fire('create'),
this
)
}),
(e.prototype.show = function (t) {
return (
this.shown ||
((document.documentElement.style.overflowY = 'hidden'),
(this._previouslyFocused = document.activeElement),
this.$el.removeAttribute('aria-hidden'),
(this.shown = !0),
n(this.$el),
document.body.addEventListener(
'focus',
this._maintainFocus,
!0
),
document.addEventListener('keydown', this._bindKeypress),
this._fire('show', t)),
this
)
}),
(e.prototype.hide = function (t) {
return this.shown
? ((document.documentElement.style.overflowY = ''),
(this.shown = !1),
this.$el.setAttribute('aria-hidden', 'true'),
this._previouslyFocused &&
this._previouslyFocused.focus &&
this._previouslyFocused.focus(),
document.body.removeEventListener(
'focus',
this._maintainFocus,
!0
),
document.removeEventListener('keydown', this._bindKeypress),
this._fire('hide', t),
this)
: this
}),
(e.prototype.destroy = function () {
return (
this.hide(),
this._openers.forEach(
function (t) {
t.removeEventListener('click', this._show)
}.bind(this)
),
this._closers.forEach(
function (t) {
t.removeEventListener('click', this._hide)
}.bind(this)
),
this._fire('destroy'),
(this._listeners = {}),
this
)
}),
(e.prototype.on = function (t, e) {
return (
void 0 === this._listeners[t] && (this._listeners[t] = []),
this._listeners[t].push(e),
this
)
}),
(e.prototype.off = function (t, e) {
var i = (this._listeners[t] || []).indexOf(e)
return i > -1 && this._listeners[t].splice(i, 1), this
}),
(e.prototype._fire = function (t, e) {
var i = this._listeners[t] || [],
n = new CustomEvent(t, {
detail: e
})
this.$el.dispatchEvent(n),
i.forEach(
function (t) {
t(this.$el, e)
}.bind(this)
)
}),
(e.prototype._bindKeypress = function (e) {
const n = document.activeElement
;(n && n.closest('[aria-modal="true"]') !== this.$el) ||
(this.shown &&
'Escape' === e.key &&
'alertdialog' !== this.$el.getAttribute('role') &&
(e.preventDefault(), this.hide(e)),
this.shown &&
'Tab' === e.key &&
(function (e, n) {
var s = (function (e) {
return i(t.join(','), e).filter(function (t) {
return !!(
t.offsetWidth ||
t.offsetHeight ||
t.getClientRects().length
)
})
})(e),
o = s.indexOf(document.activeElement)
n.shiftKey && 0 === o
? (s[s.length - 1].focus(), n.preventDefault())
: n.shiftKey ||
o !== s.length - 1 ||
(s[0].focus(), n.preventDefault())
})(this.$el, e))
}),
(e.prototype._maintainFocus = function (t) {
!this.shown ||
t.target.closest('[aria-modal="true"]') ||
t.target.closest('[data-a11y-dialog-ignore-focus-trap]') ||
n(this.$el)
}),
'undefined' != typeof document &&
('loading' === document.readyState
? document.addEventListener('DOMContentLoaded', s)
: window.requestAnimationFrame
? window.requestAnimationFrame(s)
: window.setTimeout(s, 16)),
e
)
})

25
src/js/components/fade.js Normal file
View file

@ -0,0 +1,25 @@
// ** FADE OUT FUNCTION **
export function fadeOut(el, callback) {
el.style.opacity = 1
;(function fade() {
if ((el.style.opacity -= 0.1) < 0) {
el.style.display = 'none'
if (callback) callback()
} else {
requestAnimationFrame(fade)
}
})()
}
// ** FADE IN FUNCTION **
export function fadeIn(el, display) {
el.style.opacity = 0
el.style.display = display || 'block'
;(function fade() {
var val = parseFloat(el.style.opacity)
if (!((val += 0.1) > 1)) {
el.style.opacity = val
requestAnimationFrame(fade)
}
})()
}

View file

@ -0,0 +1,33 @@
export function gotop() {
var el = this
el.gt = document.getElementById('gt-link')
el.scrollToTop = function () {
window.scroll({
top: 0,
left: 0,
behavior: 'smooth'
})
}
el.listeners = function () {
window.addEventListener('scroll', () => {
let y = window.scrollY
if (y > 0) {
el.gt.classList.remove('hidden')
} else {
el.gt.classList.add('hidden')
}
})
el.gt.onclick = function (e) {
e.preventDefault()
if (
document.documentElement.scrollTop ||
document.body.scrollTop > 0
) {
el.scrollToTop()
}
}
}
if (el.gt) {
el.listeners()
}
}

View file

@ -0,0 +1,42 @@
export class LocalStorageManager {
constructor(name) {
this.LS = null
this.name = name
this.checkLS()
this.init(name)
}
clearAll() {
this.LS.clear()
}
checkLS() {
if (window && window.localStorage) {
this.LS = window.localStorage
// console.log('localStorage is there?')
} else {
console.log('localStorage is there?')
}
}
init(name) {
if (this.LS) {
if (this.LS[name]) {
this.data = JSON.parse(this.LS[name])
} else {
this.data = {}
}
}
}
set(uri, data) {
this.data[uri] = data
if (this.LS) {
this.LS[this.name] = JSON.stringify(this.data)
}
}
get(uri) {
if (this.data[uri]) {
return this.data[uri]
}
return false
}
}

View file

@ -0,0 +1,25 @@
export function navbar() {
var t = this
t.n = document.querySelector('nav')
t.close = function () {
document.body.style.overflow = 'auto'
t.n.classList.remove('active')
}
t.open = function () {
document.body.style.overflow = 'hidden'
t.n.classList.add('active')
}
if (t.n) {
document
.querySelector('nav>button')
.addEventListener('click', ()=>{
console.log('toggleNav')
if (t.n.classList.contains('active')) t.close()
else t.open()
})
document.querySelector('nav>.nav-overlay').addEventListener('click',()=>{t.close()})
document
.querySelectorAll('nav ul > a')
.forEach((n) => n.addEventListener('click', ()=>{t.close()}))
}
}

View file

@ -0,0 +1,38 @@
export function pagesRoute() {
var t = this
const notFoundPage = document.querySelector('#notFound')
t.links = Array.from(document.querySelectorAll('[topage]'))
t.scrollTop = () => {
document.querySelector('html').scrollTop = 0
document.querySelector('body').scrollTop = 0
}
t.navigate = (id) => {
//Hide current active page
var activePage = document.querySelector('section.page-active')
if (activePage) activePage.classList.remove('page-active')
var activeLink = document.querySelector('[topage].active')
if (activeLink) activeLink.classList.remove('active')
//Show the next page
var nextPage = document.querySelector(id)
if (nextPage) nextPage.classList.add('page-active')
var nextLink = document.querySelector("[topage='" + id + "']")
if (nextLink) nextLink.classList.add('active')
//Scroll to top
t.scrollTop()
//Set history state
if (history.pushState) history.pushState(null, null, id)
else location.hash = id
}
t.listeners = () => {
t.links.forEach((page) => {
var id = page.getAttribute('topage')
page.addEventListener('click', () => {
t.navigate(id)
})
})
}
if (t.links) {
if (window.location.hash) t.navigate(window.location.hash)
t.listeners()
}
}

61
src/js/components/ping.js Normal file
View file

@ -0,0 +1,61 @@
// See LICENSE for usage information
// The following lines allow the ping function to be loaded via commonjs, AMD,
// and script tags, directly into window globals.
// Thanks to https://github.com/umdjs/umd/blob/master/templates/returnExports.js
;(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define([], factory)
} else if (typeof module === 'object' && module.exports) {
module.exports = factory()
} else {
root.ping = factory()
}
})(this, function () {
/**
* Creates and loads an image element by url.
* @param {String} url
* @return {Promise} promise that resolves to an image element or
* fails to an Error.
*/
function request_image(url) {
return new Promise(function (resolve, reject) {
var img = new Image()
img.onload = function () {
resolve(img)
}
img.onerror = function () {
reject(url)
}
img.src =
url +
'?random-no-cache=' +
Math.floor((1 + Math.random()) * 0x10000).toString(16)
})
}
/**
* Pings a url.
* @param {String} url
* @param {Number} multiplier - optional, factor to adjust the ping by. 0.3 works well for HTTP servers.
* @return {Promise} promise that resolves to a ping (ms, float).
*/
function ping(url, multiplier) {
return new Promise(function (resolve, reject) {
var start = new Date().getTime()
var response = function () {
var delta = new Date().getTime() - start
delta *= multiplier || 1
resolve(delta)
}
request_image(url).then(response).catch(console.log(response))
// Set a timeout for max-pings, 5s.
setTimeout(function () {
reject(Error('Timeout'))
}, 5000)
})
}
return ping
})

View file

@ -0,0 +1,39 @@
export function Snackbar(option) {
const t = this
t.snack = document.createElement('div')
t.snack.className = 'snackbar'
t.message = document.createElement('div')
t.snack.appendChild(t.message)
document.body.appendChild(t.snack)
t.top = option.topPos
t.classNames = option.classNames
t.autoClose =
typeof option.autoClose === 'boolean' ? option.autoClose : false
t.autoCloseTimeout =
option.autoClose && typeof option.autoCloseTimeout === 'number'
? option.autoCloseTimeout
: 3000
//Methods
t.reset = function () {
t.message.innerHTML = ''
t.snack.classList.remove(t.classNames)
}
t.showN = function (msg, type) {
t.hideN()
t.message.innerHTML = msg
t.snack.style.top = t.top
t.snack.classList.add(type || t.classNames)
if (t.autoClose) {
setTimeout(function () {
t.hideN()
}, t.autoCloseTimeout)
}
}
t.hideN = function () {
t.snack.style.top = '-100%'
t.reset()
}
}

View file

@ -0,0 +1,28 @@
export function themeManager() {
//Theme Switcher
var toggles = document.getElementsByClassName('theme-toggle')
if (window.CSS && CSS.supports('color', 'var(--bg)') && toggles) {
var storedTheme =
localStorage.getItem('theme') ||
(window.matchMedia('(prefers-color-scheme: dark)').matches
? 'dark'
: 'light')
if (storedTheme)
document.documentElement.setAttribute('data-theme', storedTheme)
for (var i = 0; i < toggles.length; i++) {
toggles[i].onclick = function () {
var currentTheme =
document.documentElement.getAttribute('data-theme')
var targetTheme = 'light'
if (currentTheme === 'light') {
targetTheme = 'dark'
}
document.documentElement.setAttribute('data-theme', targetTheme)
localStorage.setItem('theme', targetTheme)
}
}
}
}

View file

@ -0,0 +1 @@
//Copy to clipboard the str value

33
src/js/d3Notif.js vendored
View file

@ -1,33 +0,0 @@
function Notif(option){
//Configuration
var el = this;
el.self = document.querySelector('.toast-message');
el.message = document.querySelector('.message');
el.top = option.topPos;
el.classNames = option.classNames;
el.autoClose = (typeof option.autoClose === "boolean")? option.autoClose: false;
el.autoCloseTimeout = (option.autoClose && typeof option.autoCloseTimeout === "number")? option.autoCloseTimeout: 3000;
//Methods
el.reset = function(){
(el.message).innerHTML="";
el.self.classList.remove(el.classNames);
}
el.showN = function(msg,type){
el.reset();
el.message.innerHTML=msg;
el.self.style.top= el.top;
el.self.classList.add(type);
if(el.autoClose){
setTimeout(function(){
el.hideN();
}, el.autoCloseTimeout);
}
}
el.hideN = function(){
el.self.style.top='-100%';
el.reset();
};
}

220
src/js/fontlist.js Normal file
View file

@ -0,0 +1,220 @@
import '../sass/fontlist.sass'
import { navbar } from './components/navbar'
import { dialog } from './components/dialog'
import { themeManager } from './components/themeManager'
import { gotop } from './components/gotop'
import { aos } from './components/aos'
// Call the function when the DOM is loaded
document.addEventListener('DOMContentLoaded', () => {
new themeManager()
new navbar()
new gotop()
new aos()
new modal()
})
var Detector = function () {
var baseFonts = ['monospace', 'sans-serif', 'serif']
var testString = 'abcdefghilmnopqrstuvz'
var testSize = '72px'
var h = document.getElementsByTagName('body')[0]
// create a SPAN in the document to get the width of the text we use to test
var s = document.createElement('span')
s.style.fontSize = testSize
s.innerHTML = testString
var defaultWidth = {}
var defaultHeight = {}
for (var index in baseFonts) {
//get the default width for the three base fonts
s.style.fontFamily = baseFonts[index]
h.appendChild(s)
defaultWidth[baseFonts[index]] = s.offsetWidth //width for the default font
defaultHeight[baseFonts[index]] = s.offsetHeight //height for the defualt font
h.removeChild(s)
}
function detect(font) {
var detected = false
for (var index in baseFonts) {
s.style.fontFamily = font + ',' + baseFonts[index] // name of the font along with the base font for fallback.
h.appendChild(s)
var matched =
s.offsetWidth != defaultWidth[baseFonts[index]] ||
s.offsetHeight != defaultHeight[baseFonts[index]]
h.removeChild(s)
detected = detected || matched
}
return detected
}
this.detect = detect
}
var d = new Detector()
var list = [
'Abadi MT Condensed Light',
'Albertus Extra Bold',
'Albertus Medium',
'Antique Olive',
'Arial',
'Arial Black',
'Arial MT',
'Arial Narrow',
'Bazooka',
'Book Antiqua',
'Bookman Old Style',
'Boulder',
'Calisto MT',
'Calligrapher',
'Century Gothic',
'Century Schoolbook',
'Cezanne',
'CG Omega',
'CG Times',
'Charlesworth',
'Chaucer',
'Clarendon Condensed',
'Comic Sans MS',
'Copperplate Gothic Bold',
'Copperplate Gothic Light',
'Cornerstone',
'Coronet',
'Courier',
'Courier New',
'Cuckoo',
'Dauphin',
'Denmark',
'Fransiscan',
'Garamond',
'Geneva',
'Haettenschweiler',
'Heather',
'Helvetica',
'Herald',
'Impact',
'Jester',
'Letter Gothic',
'Lithograph',
'Lithograph Light',
'Long Island',
'Lucida Console',
'Lucida Handwriting',
'Lucida Sans',
'Lucida Sans Unicode',
'Marigold',
'Market',
'Matisse ITC',
'MS LineDraw',
'News GothicMT',
'OCR A Extended',
'Old Century',
'Pegasus',
'Pickwick',
'Poster',
'Pythagoras',
'Sceptre',
'Sherwood',
'Signboard',
'Socket',
'Steamer',
'Storybook',
'Subway',
'Tahoma',
'Technical',
'Teletype',
'Tempus Sans ITC',
'Times',
'Times New Roman',
'Times New Roman PS',
'Trebuchet MS',
'Tristan',
'Tubular',
'Unicorn',
'Univers',
'Univers Condensed',
'Vagabond',
'Verdana',
'Westminster Allegro',
'Amazone BT',
'AmerType Md BT',
'Arrus BT',
'Aurora Cn BT',
'AvantGarde Bk BT',
'AvantGarde Md BT',
'BankGothic Md BT',
'Benguiat Bk BT',
'BernhardFashion BT',
'BernhardMod BT',
'BinnerD',
'Bremen Bd BT',
'CaslonOpnface BT',
'Charter Bd BT',
'Charter BT',
'ChelthmITC Bk BT',
'CloisterBlack BT',
'CopperplGoth Bd BT',
'English 111 Vivace BT',
'EngraversGothic BT',
'Exotc350 Bd BT',
'Freefrm721 Blk BT',
'FrnkGothITC Bk BT',
'Futura Bk BT',
'Futura Lt BT',
'Futura Md BT',
'Futura ZBlk BT',
'FuturaBlack BT',
'Galliard BT',
'Geometr231 BT',
'Geometr231 Hv BT',
'Geometr231 Lt BT',
'GeoSlab 703 Lt BT',
'GeoSlab 703 XBd BT',
'GoudyHandtooled BT',
'GoudyOLSt BT',
'Humanst521 BT',
'Humanst 521 Cn BT',
'Humanst521 Lt BT',
'Incised901 Bd BT',
'Incised901 BT',
'Incised901 Lt BT',
'Informal011 BT',
'Kabel Bk BT',
'Kabel Ult BT',
'Kaufmann Bd BT',
'Kaufmann BT',
'Korinna BT',
'Lydian BT',
'Monotype Corsiva',
'NewsGoth BT',
'Onyx BT',
'OzHandicraft BT',
'PosterBodoni BT',
'PTBarnum BT',
'Ribbon131 Bd BT',
'Serifa BT',
'Serifa Th BT',
'ShelleyVolante BT',
'Souvenir Lt BT',
'Staccato222 BT',
'Swis721 BlkEx BT',
'Swiss911 XCm BT',
'TypoUpright BT',
'ZapfEllipt BT',
'ZapfHumnst BT',
'ZapfHumnst Dm BT',
'Zurich BlkEx BT',
'Zurich Ex BT'
]
const flist = document.querySelector('#flist')
list.forEach((element) => {
var a = d.detect(element)
if (a) {
var el = document.createElement('div')
el.innerText = element
el.className = 'card _aos'
el.style.fontFamily = element
flist.appendChild(el)
}
console.log(a)
})

15
src/js/index.js Normal file
View file

@ -0,0 +1,15 @@
import '../sass/index.sass'
import { navbar } from './components/navbar'
import { dialog } from './components/dialog'
import { themeManager } from './components/themeManager'
import { gotop } from './components/gotop'
import { aos } from './components/aos'
// Call the function when the DOM is loaded
document.addEventListener('DOMContentLoaded', () => {
new themeManager()
new navbar()
new gotop()
new aos()
new modal()
})

2
src/js/pagead.js Normal file
View file

@ -0,0 +1,2 @@
const s_test_pagead = true
console.log('s_test_pageads : ', s_test_pagead)

2
src/js/partner.ads.js Normal file
View file

@ -0,0 +1,2 @@
var s_test_partnerads = 'https://youtu.be/dQw4w9WgXcQ'
console.log('s_test_partnerads : ', s_test_partnerads)

View file

@ -1,76 +0,0 @@
window.rp_requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame||(function(callback,element){setTimeout(callback,1000/60);});
function RadialProgress(container,cfg){
container.innerHTML="";
var nc=document.createElement("div");
nc.style.width="10em"; nc.style.height="10em";
nc.style.position="relative";
container.appendChild(nc);
container=nc;
if(!cfg) cfg={};
this.colorBg=cfg.colorBg==undefined?"#404040":cfg.colorBg;
this.colorFg=cfg.colorFg==undefined?"#007FFF":cfg.colorFg;
this.colorText=cfg.colorText==undefined?"#FFFFFF":cfg.colorText;
this.indeterminate=cfg.indeterminate==undefined?false:cfg.indeterminate;
this.round=cfg.round==undefined?false:cfg.round;
this.thick=cfg.thick==undefined?2:cfg.thick;
this.progress=cfg.progress==undefined?0:cfg.progress;
this.noAnimations=cfg.noAnimations==undefined?0:cfg.noAnimations;
this.fixedTextSize=cfg.fixedTextSize==undefined?false:cfg.fixedTextSize;
this.animationSpeed=cfg.animationSpeed==undefined?1:cfg.animationSpeed>0?cfg.animationSpeed:1;
this.noPercentage=cfg.noPercentage==undefined?false:cfg.noPercentage;
this.spin=cfg.spin==undefined?false:cfg.spin;
if(cfg.noInitAnimation) this.aniP=this.progress; else this.aniP=0;
var c=document.createElement("canvas");
c.style.position="absolute";c.style.top="0";c.style.left="0";c.style.width="100%";c.style.height="100%";c.className="rp_canvas";
container.appendChild(c);
this.canvas=c;
var tcc=document.createElement("div");
tcc.style.position="absolute";tcc.style.display="table";tcc.style.width="100%";tcc.style.height="100%";
var tc=document.createElement("div");
tc.style.display="table-cell";tc.style.verticalAlign="middle";
var t=document.createElement("div");
t.style.color=this.colorText;t.style.textAlign="center";t.style.overflow="visible";t.style.whiteSpace="nowrap";t.className="rp_text";
tc.appendChild(t);
tcc.appendChild(tc);
container.appendChild(tcc);
this.text=t;
this.prevW=0; this.prevH=0; this.prevP=0; this.indetA=0; this.indetB=0.2; this.rot=0;
this.draw=function(f){
if(!(f==true))rp_requestAnimationFrame(this.draw);
var c=this.canvas;
var dp=window.devicePixelRatio||1;
c.width=c.clientWidth*dp; c.height=c.clientHeight*dp;
if(!(f==true)&&!this.spin&&!this.indeterminate&&(Math.abs(this.prevP-this.progress)<1&&this.prevW==c.width&&this.prevH==c.height)) return;
var centerX=c.width/2, centerY=c.height/2, bw=(c.clientWidth/100.0), radius=c.height/2-(this.thick*bw*dp)/2, bw=(c.clientWidth/100.0);
this.text.style.fontSize=(this.fixedTextSize?(c.clientWidth*this.fixedTextSize):(c.clientWidth*0.26-this.thick))+"px";
if(this.noAnimations) this.aniP=this.progress; else{var aniF=Math.pow(0.93,this.animationSpeed);this.aniP=this.aniP*aniF+this.progress*(1-aniF);}
c=c.getContext("2d");
c.beginPath();
c.strokeStyle=this.colorBg;
c.lineWidth=this.thick*bw*dp;
c.arc(centerX,centerY,radius,-Math.PI/2, 2*Math.PI);
c.stroke();
c.beginPath();
c.strokeStyle=this.colorFg;
c.lineWidth=this.thick*bw*dp;
if(this.round) c.lineCap="round";
if(this.indeterminate){
this.indetA=(this.indetA+0.07*this.animationSpeed)%(2*Math.PI);this.indetB=(this.indetB+0.14*this.animationSpeed)%(2*Math.PI);
c.arc(centerX,centerY,radius,this.indetA, this.indetB);
if(!this.noPercentage)this.text.innerHTML="";
}else{
if(this.spin&&!this.noAnimations)this.rot=(this.rot+0.07*this.animationSpeed)%(2*Math.PI)
c.arc(centerX,centerY,radius,this.rot-Math.PI/2, this.rot+this.aniP*(2*Math.PI)-Math.PI/2);
if(!this.noPercentage)this.text.innerHTML=Math.round(100*this.aniP)+" %";
}
c.stroke();
this.prevW=c.width; this.prevH=c.height; this.prevP=this.aniP;
}.bind(this);
this.draw();
}
RadialProgress.prototype={
constructor:RadialProgress,
setValue:function(p){this.progress=p<0?0:p>1?1:p;},
setIndeterminate:function(i){this.indeterminate=i;},
setText:function(t){this.text.innerHTML=t;}
}

View file

@ -1,140 +0,0 @@
function navbar() {
var t = this;
t.n = document.querySelector("nav");
t.bo = document.body.style.overflow;
t.close = function () {
t.bo = "auto";
t.n.classList.remove("active");
}
t.open = function () {
t.bo = "hidden";
t.n.classList.add("active");
}
if (t.n) {
document.querySelector("nav>button").addEventListener("click", function () {
console.log("toggleNav");
if (t.n.classList.contains("active"))
t.close();
else
t.open();
});
document.querySelectorAll("nav ul > a").forEach(n => n.addEventListener("click", t.close()));
}
}
function themeManager() {
const t = this;
t.toggles = document.getElementsByClassName("theme-toggle");
t.activeTheme = "light";
t.setTheme = (theme) => {
t.activeTheme = theme;
document.documentElement.setAttribute('data-theme', theme)
localStorage.setItem('theme', theme);
}
t.dark = () => {
t.setTheme("dark");
}
t.light = () => {
t.setTheme("light");
}
if (window.CSS && CSS.supports("color", "var(--bg)") && t.toggles) {
var storedTheme = localStorage.getItem('theme') || (window.matchMedia("(prefers-color-scheme: dark)").matches ?
"dark" : "light");
if (storedTheme)
document.documentElement.setAttribute('data-theme', storedTheme)
for (var i = 0; i < t.toggles.length; i++) {
t.toggles[i].onclick = function () {
if (document.documentElement.getAttribute("data-theme") === "light") t.dark();
else t.light();
};
}
}
}
function aos() {
const t = this;
t.items = document.querySelectorAll("[class*=_aos]");
if (IntersectionObserver && t.items) {
let callback = function (entries) {
entries.forEach(entry => {
if (entry.isIntersecting && !entry.target.classList.contains('_aos-done')) {
entry.target.classList.add('_aos-done');
} else {
entry.target.classList.remove('_aos-done');
}
});
}
let observer = new IntersectionObserver(callback, {
root: null,
threshold: 0
});
t.items.forEach((item) => {
observer.observe(item);
});
}
}
function gotop() {
var t = this;
t.gt = document.getElementById('gt-link');
t.scrollToTop = function () {
window.scroll({
top: 0,
left: 0,
behavior: 'smooth'
});
}
t.listeners = function () {
window.addEventListener("scroll", () => {
let y = window.scrollY;
if (y > 0) {
t.gt.classList.remove("hidden");
} else {
t.gt.classList.add("hidden");
}
});
t.gt.onclick = function (e) {
e.preventDefault();
if (document.documentElement.scrollTop || document.body.scrollTop > 0) {
t.scrollToTop();
}
}
}
if (t.gt) {
t.listeners();
}
}
function modal(id) {
var t = this;
t.m = document.querySelector((id) ? id : '.modal');
if (t.m) {
t.bdy = document.body.classList;
t.targets = document.querySelectorAll('[data-toggle="' + t.m.id + '"]');
t.closebtns = t.m.querySelectorAll('.close-modal');
}
t.show = function () {
t.bdy.add('_overflowhidden');
t.m.classList.add('_show-modal');
}
t.hide = function () {
t.m.classList.remove('_show-modal');
t.bdy.remove('_overflowhidden');
}
t.listeners = function () {
t.targets.forEach(el => {
el.addEventListener('click', function (e) {
t.show();
});
});
t.closebtns.forEach(function (item) {
item.addEventListener('click', function (e) {
t.hide();
});
});
}
if (t.m)
t.listeners();
}

74
src/js/units.js Normal file
View file

@ -0,0 +1,74 @@
import '../sass/units.sass'
import { navbar } from './components/navbar'
import { dialog } from './components/dialog'
import { themeManager } from './components/themeManager'
import { gotop } from './components/gotop'
import { aos } from './components/aos'
// Call the function when the DOM is loaded
document.addEventListener('DOMContentLoaded', () => {
new themeManager()
new navbar()
new gotop()
new aos()
})
const spinner = ['/', '-', '\\', '|']
let spinnerIx = 0
function el(name) {
return document.querySelector(name)
}
let bars = []
function getBars() {
var b = document.querySelectorAll('.bar')
b.forEach((el) => {
bars.push(el)
})
console.log(bars)
}
function updateTest() {
let i = window.innerHeight
el('.innerHeightLog>span').innerText = 'innerHeight: ' + i + 'px '
let vh, svh, dvh, lvh, p
vh = el('.bar.b-vh').clientHeight
svh = el('.bar.b-svh').clientHeight
dvh = el('.bar.b-dvh').clientHeight
lvh = el('.bar.b-lvh').clientHeight
p = el('.bar.b-p').clientHeight
document.body.style.setProperty('--100vh', vh + 'px')
document.body.style.setProperty('--100svh', svh + 'px')
document.body.style.setProperty('--100dvh', dvh + 'px')
document.body.style.setProperty('--100lvh', lvh + 'px')
document.body.style.setProperty('--100p', p + 'px')
el('.t-vh>span').innerText = '100vh (' + vh + 'px)'
el('.t-dvh>span').innerText = '100dvh (' + dvh + 'px)'
el('.t-svh>span').innerText = '100svh (' + svh + 'px)'
el('.t-lvh>span').innerText = '100lvh (' + lvh + 'px)'
el('.t-p>span').innerText = '100% (' + p + 'px)'
el('.t-vh').style.background =
vh == i ? 'var(--green)' : vh > i ? 'var(--blue)' : 'var(--orange)'
el('.t-dvh').style.background =
dvh == i ? 'var(--green)' : dvh > i ? 'var(--blue)' : 'var(--orange)'
el('.t-svh').style.background =
svh == i ? 'var(--green)' : svh > i ? 'var(--blue)' : 'var(--orange)'
el('.t-lvh').style.background =
lvh == i ? 'var(--green)' : lvh > i ? 'var(--blue)' : 'var(--orange)'
el('.t-p').style.background =
p == i ? 'var(--green)' : p > i ? 'var(--blue)' : 'var(--orange)'
}
var fullscreen = false
addEventListener('load', function () {
getBars()
updateTest()
visualViewport.addEventListener('resize', () => {
updateTest()
})
document.body.addEventListener('resize', updateTest())
})

7
src/js/widget/ads.js Normal file
View file

@ -0,0 +1,7 @@
var s_test_ads = 's_test_ads'
console.log('Hey there ..... check out ', 'https://youtu.be/dQw4w9WgXcQ')
var e = document.createElement('div')
e.id = 'ECKckuBYwZaP'
e.style.display = 'none'
document.body.appendChild(e)

View file

@ -0,0 +1,189 @@
<div class="dialog" id="dlg_faq" data-a11y-dialog="dlg_faq" aria-labelledby="dlg_faq-title" aria-hidden="true">
<div class="dialog-overlay" data-a11y-dialog-hide></div>
<div class="dialog-content">
<header>
<h3 id="dlg_faq-title">FAQ</h3>
<button data-a11y-dialog-hide><svg class="w-6 h-6" id="close-icon" fill="none" stroke="currentColor"
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12">
</path>
</svg></button>
</header>
<section>
<div>
<h2>How does it work?</h2>
<b class="_txt-red"><i>You will not see any ads and no trackers will be activated </i></b><br><br>
<div class="row keep-width">
<div>
<div class="card">
<div class="_f-center">
<svg xmlns="http://www.w3.org/2000/svg" fill="var(--green)" width="24" height="24"
viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 3c7.2 0 9 1.8 9 9s-1.8 9 -9 9s-9 -1.8 -9 -9s1.8 -9 9 -9z"></path>
</svg>
&nbsp; Blocked
</div>
If the connection to a host/script fails or a box is removed means the latter has been
blocked by your
ad-blocker
</div>
</div>
<div>
<div class="card">
<div class="_f-center">
<svg xmlns="http://www.w3.org/2000/svg" fill="var(--red)" width="24" height="24"
viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 3c7.2 0 9 1.8 9 9s-1.8 9 -9 9s-9 -1.8 -9 -9s1.8 -9 9 -9z"></path>
</svg>
&nbsp; Not Blocked
</div>
Connection to a host did not fail or box is not removed, means that your ad-blocker did not
block it or doesn't work
</div>
</div>
</div>
<p>After tests are completed , you get a liquid color ball with points.<br>
Points are calculated based on your tests for each category and type <br>
The color fits your points range <br>
Here a preview of 3 scenarios :</p>
<div class="template_wrap row keep-width ">
<div>
<div class="lt_cwrap lt_template" style="--liquid-color:var(--red);--liquid-percentage:10%">
<div class="lt_circle">
<div class="lt_wave"></div>
</div>
</div>
</div>
<div>
<div class="lt_cwrap lt_template" style="--liquid-color:var(--orange);--liquid-percentage:0%">
<div class="lt_circle">
<div class="lt_wave"></div>
</div>
</div>
</div>
<div>
<div class="lt_cwrap lt_template" style="--liquid-color:var(--green);--liquid-percentage:-30%">
<div class="lt_circle">
<div class="lt_wave"></div>
</div>
</div>
</div>
</div>
<div class="row keep-width">
<div>
<div class="lt_value_2 _bg-red">
Cmon , use an adblock or smth
</div>
</div>
<div>
<div class="lt_value_2 _bg-orange">
Ok, but you can do better
</div>
</div>
<div>
<div class="lt_value_2 _bg-green">
Great, you're ready to surf
</div>
</div>
</div>
<br>
The tests consist of 3 types
<ul style="list-style: disc;">
<li>Cosmetic Filter : Check if you are hiding/removing the empy boxes of ads, cookie policy etc.
</li>
<li>Script Loading : Check if you are blocking a possible ad script loading or trackers</li>
<li>Host : Check if you block domains that provide trackers, analytics or ads</li>
</ul>
<br>
<hr><br>
<h3>The test is not working, I'm sure my adblock method is properly configured</h3>
<p>
In that case probably you have a setup that is not compatible for the checks of this tool.
This doesn't mean you are not protected by your configured solution that can be adblock extension ,
vpn or dns
It's because due to some JS limitation or lack of implementation feature the test is not able to
figure out
You will receive a percentage of how many connections you have blocked
</p>
<br>
<hr><br>
<h2>How I can have 100%</h2>
<p>
It's not needed . If you got a green result , you are pretty good. Don't be too competitive with
that number
In case you want to have a full 100% ,
consider using my small list that I created to cover most of the tests in this website (cosmetic
filter,script loading excluded)
</p>
<div class="grid keep-width">
<div>
<button class="btn-blue" id="d3H_txt">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-copy" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<rect x="8" y="8" width="12" height="12" rx="2"></rect>
<path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path>
</svg>
d3Host List (TXT)</button>
</div>
<div>
<button class="btn-blue" id="d3H_adblock">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-copy" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<rect x="8" y="8" width="12" height="12" rx="2"></rect>
<path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path>
</svg>
d3Host List (ADBLOCK)</button>
</div>
</div>
<br>
<hr><br>
<h2>Adblock solutions</h2>
On any device where possible the first thing I install on the browser is <a
href="https://ublockorigin.com/" class="btn">uBlock Origin </a>
Second, I go with a DNS solution like <a href="https://nextdns.io/" class="btn">Next DNS</a> for
blocking on any installed app
<h3>Other suggested solutions for ad-blocking</h3>
<div>
<a href="https://adguard.com/" class="btn">Adguard Extension or DNS </a>
<a href="https://blokada.org/" class="btn">Blokada </a>
</div>
<h2>Test tools for your adblock </h2>
<p>
I created this website to quickly test my small list of most common hosts.
I wanted to build something with a great design and user experience that is pretty straigthforward
for
any user.
There are other great tools that I use and I want to recommend
</p>
<div class="cnt2">
<a href="https://canyoublockit.com/" class="btn">CanYouBlockIt</a>
<a href="https://ipleak.net/" class="btn">IP Leak </a>
<a href="https://blockads.fivefilters.org/" class="btn">Block Ads Test </a>
<a href="https://panopticlick.eff.org/" class="btn">Browser Fingerprint by EEF</a>
<a href="http://raymondhill.net/ublock/tiles1.html" class="btn">Adblock Testing by
raymondhill</a>
<a href="http://raymondhill.net/ublock/popup.html" class="btn">Popup Blocker by
raymondhill</a>
</div>
</div>
</section>
<footer>
<button data-a11y-dialog-hide>
Cancel
</button>
<button class="btn-p" data-a11y-dialog-hide>
Ok
</button>
</footer>
</div>
</div>

View file

@ -0,0 +1,38 @@
<div class="dialog" id="dlg_logs" data-a11y-dialog="dlg_logs" aria-labelledby="dlg_logs-title" aria-hidden="true">
<div class="dialog-overlay" data-a11y-dialog-hide></div>
<div class="dialog-content">
<header>
<h3 id="dlg_logs-title"><svg xmlns="http://www.w3.org/2000/svg"
class="icon icon-tabler icon-tabler-message-2-code" width="24" height="24" viewBox="0 0 24 24"
stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path
d="M12 20l-3 -3h-2a3 3 0 0 1 -3 -3v-6a3 3 0 0 1 3 -3h10a3 3 0 0 1 3 3v6a3 3 0 0 1 -3 3h-2l-3 3">
</path>
<path d="M10 9l-2 2l2 2"></path>
<path d="M14 9l2 2l-2 2"></path>
</svg>
&nbsp;
Logs</h3>
<button data-a11y-dialog-hide><svg class="w-6 h-6" id="close-icon" fill="none" stroke="currentColor"
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12">
</path>
</svg></button>
</header>
<section>
<div class="test_card">
<div id="test_log"></div>
</div>
</section>
<footer>
<button data-a11y-dialog-hide>
Cancel
</button>
<button class="btn-p" data-a11y-dialog-hide>
Ok
</button>
</footer>
</div>
</div>

View file

@ -0,0 +1,79 @@
<div class="dialog" id="dlg_faq" data-a11y-dialog="dlg_faq"
aria-labelledby="dlg_faq-title"
aria-hidden="true">
<div class="dialog-overlay" data-a11y-dialog-hide></div>
<div class="dialog-content">
<header>
<h3 id="dlg_faq-title">FAq</h3>
<button data-a11y-dialog-hide><svg class="w-6 h-6" id="close-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg></button>
</header>
<section>
<div>
<h2>How does it work?</h2>
<b class="_txt-red"><i>You will not see any ads and no trackers will be activated </i></b><br><br>
When you load this website, it will try to establishes connections in pure
Javascript with different urls (advertising, analytics, and social ads services) from a list.<br>
For each host , if the connection fails
it means that the latter has been blocked by your ad-blocker (e.g. uBlock Origin , Blokada , AdGuard ,
in-built adblocker) or DNS provider
<h3>How do I know if my ad blocker is working?</h3>
<p>
Use uBlock Origin
Free. Open source. For users by users.
It's a fantastic blocker, not just for ads but for privacy and malware protection too. And unlike
Adblock/Adblock Plus, it comes with a filter list that doesn't make allowances for certain ads. (Note:
We are not affiliated with uBlock Origin.)
When you use this site to test your browser for ad blocking, we'll recommend uBlock Origin if it's
available for your browser. If it's not, we'll recommend another ad blocker.
</p>
<h2>How i can have 100%</h2>
<p>
You can reach 100 % using a small list that I created to cover all the tests in this website
<button
onclick="copyToClip('https://raw.githubusercontent.com/d3ward/toolz/master/src/d3host.txt')">Copy
d3Host list to clipboard</button>
<br><br>
<b class="_txt-green"><i>This list and this test is a beta project
I do not take any responsibility if something stops working , example Social apps or your
favorite blog
</i></b>
</p>
<h3>Suggested solutions for ad-blocking</h3>
<div>
<a href="https://adguard.com/" class="btn">Adguard</a>
<a href="https://blokada.org/" class="btn">Blokada </a>
<a href="https://ublockorigin.com/" class="btn">uBlock Origin </a>
<a href="https://nextdns.io/" class="btn">Next DNS</a>
</div>
<p>
<h3>Other tools to test your adblock </h3>
<div class="cnt2">
<a href="https://ipleak.net/" class="btn">IP Leak </a>
<a href="https://blockads.fivefilters.org/" class="btn">Block Ads Test </a>
<a href="https://panopticlick.eff.org/" class="btn">Browser Fingerprint by EEF</a>
<a href="http://raymondhill.net/ublock/tiles1.html" class="btn">Adblock Testing by
raymondhill</a>
<a href="http://raymondhill.net/ublock/popup.html" class="btn">Popup Blocker by
raymondhill</a>
</div>
</p>
</div>
</section>
<footer>
<button data-a11y-dialog-hide>
Cancel
</button>
<button class="btn-p" data-a11y-dialog-hide>
Ok
</button>
</footer>
</div>
</div>

View file

@ -0,0 +1,25 @@
<div class="dialog" id="dlg_reports" data-a11y-dialog="dlg_reports"
aria-labelledby="dlg_reports-title"
aria-hidden="true">
<div class="dialog-overlay" data-a11y-dialog-hide></div>
<div class="dialog-content">
<header>
<h3 id="dlg_reports-title">History </h3>
<button data-a11y-dialog-hide><svg class="w-6 h-6" id="close-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg></button>
</header>
<section style="width: 100%">
<div class="r_wrap">
</div>
</section>
<footer>
<button data-a11y-dialog-hide>
Cancel
</button>
<button class="btn-p" data-a11y-dialog-hide>
Ok
</button>
</footer>
</div>
</div>

162
src/partials/changelog.ejs Normal file
View file

@ -0,0 +1,162 @@
<div class="dialog" id="dlg_changelog" data-a11y-dialog="dlg_changelog" aria-labelledby="dlg_changelog-title" aria-hidden="true">
<div class="dialog-overlay" data-a11y-dialog-hide></div>
<div class="dialog-content">
<header>
<h3 id="dlg_changelog-title">Thank you !</h3>
<button data-a11y-dialog-hide><svg class="w-6 h-6" id="close-icon" fill="none" stroke="currentColor"
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12">
</path>
</svg></button>
</header>
<section>
<div>
<h2>More than 1 million tests so far</h2>
<b class="_txt-red"><i>You will not see any ads and no trackers will be activated </i></b><br><br>
<div class="row keep-width">
<div>
<div class="card">
<div class="_f-center">
<svg xmlns="http://www.w3.org/2000/svg" fill="var(--green)" width="24" height="24"
viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 3c7.2 0 9 1.8 9 9s-1.8 9 -9 9s-9 -1.8 -9 -9s1.8 -9 9 -9z"></path>
</svg>
&nbsp; Blocked
</div>
If the connection to a host/script fails or a box is removed means the latter has been blocked by your
ad-blocker
</div>
</div>
<div>
<div class="card">
<div class="_f-center">
<svg xmlns="http://www.w3.org/2000/svg" fill="var(--red)" width="24" height="24"
viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 3c7.2 0 9 1.8 9 9s-1.8 9 -9 9s-9 -1.8 -9 -9s1.8 -9 9 -9z"></path>
</svg>
&nbsp; Not Blocked
</div>
Connection to a host did not fail or box is not removed, means that your ad-blocker did not block it or doesn't work
</div>
</div>
</div>
<p>After tests are completed , you get a liquid color ball with points.<br>
Points are caculated based on your tests for each category and type <br>
The color is calculated based on you points range <br>
Here a preview of 3 scenarios :</p>
<div class="template_wrap row keep-width ">
<div>
<div class="lt_cwrap lt_template" style="--liquid-color:var(--red);--liquid-percentage:10%">
<div class="lt_circle">
<div class="lt_wave"></div>
</div>
</div>
<div class="lt_value_2 _bg-red">
Cmon , use an adblock or smth
</div>
</div>
<div>
<div class="lt_cwrap lt_template" style="--liquid-color:var(--orange);--liquid-percentage:0%">
<div class="lt_circle">
<div class="lt_wave"></div>
</div>
</div>
<div class="lt_value_2 _bg-orange">
Ok, but you can do better
</div>
</div>
<div>
<div class="lt_cwrap lt_template" style="--liquid-color:var(--green);--liquid-percentage:-30%">
<div class="lt_circle">
<div class="lt_wave"></div>
</div>
</div>
<div class="lt_value_2 _bg-green">
Great, you're ready to surf
</div>
</div>
</div>
The tests consist of 3 types
<ul>
<li>Cosmetic Filter : Check if you are hiding/removing the empy boxes of ads, cookie policy etc.</li>
<li>Script Loading : Check if you are blocking a possible ad script loading or trackers</li>
<li>Host : Check if you block domains that provide trackers, analytics or ads</li>
</ul>
<h3>The test is not working, I'm sure my adblock method is properly configured</h3>
<p>
In that case probably you have a setup that is not compatible for the checks of this tool.
This doesn't mean you are not protected by your configured solution that can be ablock extension , vpn or dns
It's because due to some JS limitation or lack of implementation feature the test is not able to figure out
You will receive a percentage of how many connections you have blocked
</p>
<h2>How I can have 100%</h2>
<p>
It's not needed . If you got a green result , you are pretty good. Don't be too competitive with that number
In case you want to have a full 100% ,
consider using my small list that I created to cover most of the tests in this website (cosmetic filter,script loading excluded)
<button class="btn-blue"
onclick="copyToClip('https://raw.githubusercontent.com/d3ward/toolz/master/src/d3host.txt')">
d3Host List (TXT)</button>
<button class="btn-blue"
onclick="copyToClip('https://raw.githubusercontent.com/d3ward/toolz/master/src/d3host.adblock')">
d3Host List (ADBLOCK)</button>
<br><br>
</p>
<h2>Adblock solutions</h2>
On any device where possible the first thing I install on the browser is <a href="https://ublockorigin.com/" class="btn">uBlock Origin </a>
Second, I go with a DNS solution like <a href="https://nextdns.io/" class="btn">Next DNS</a> for blocking on any installed app
<h3>Other suggested solutions for ad-blocking</h3>
<div>
<a href="https://adguard.com/" class="btn">Adguard Extension or DNS </a>
<a href="https://blokada.org/" class="btn">Blokada </a>
</div>
<p>
<h2>Test tools for your adblock </h2>
I created this website to quickly test my small list of most common hosts.
I wanted to build something with a great design and user experience that is pretty straigthforward for any user.
There are other great tools that I use and I want to recommend
<div class="cnt2">
<a href="https://canyoublockit.com/" class="btn">CanYouBlockIt</a>
<a href="https://ipleak.net/" class="btn">IP Leak </a>
<a href="https://blockads.fivefilters.org/" class="btn">Block Ads Test </a>
<a href="https://panopticlick.eff.org/" class="btn">Browser Fingerprint by EEF</a>
<a href="http://raymondhill.net/ublock/tiles1.html" class="btn">Adblock Testing by
raymondhill</a>
<a href="http://raymondhill.net/ublock/popup.html" class="btn">Popup Blocker by
raymondhill</a>
</div>
</p>
</div>
</section>
<footer>
<button data-a11y-dialog-hide>
Cancel
</button>
<button class="btn-p" data-a11y-dialog-hide>
Ok
</button>
</footer>
</div>
</div>

20
src/partials/footer.ejs Normal file
View file

@ -0,0 +1,20 @@
<footer>
<div class="cnt _bg _radius _aos">
<div class="grid">
<div>Using <b><a href="https://tabler-icons.io/">Tabler Icons</a> (<a
href="https://github.com/tabler/tabler-icons/blob/master/LICENSE"
class="_txt">MIT</a>)</b> &
<b><a href="https://simpleicons.org/">simpleicons</a> (<a
href="https://github.com/simple-icons/simple-icons/blob/develop/LICENSE.md"
class="_txt">CC0-1.0</a>)</b>
</div>
<div>
Designed and built with by <b><a href="https://d3ward.github.io">Ursu Eduard (d3ward</a></b>) © 2022
</div>
<div>
Licensed under <b><a
href="https://creativecommons.org/licenses/by-nc-sa/4.0/">[NC-SA-4.0]</a></b>
</div>
</div>
</div>
</footer>

7
src/partials/gotop.ejs Normal file
View file

@ -0,0 +1,7 @@
<button class="gt-link btn-p hidden" id="gt-link">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<polyline points="7 11 12 6 17 11"></polyline>
<polyline points="7 17 12 12 17 17"></polyline>
</svg>
</button>

32
src/partials/head.ejs Normal file
View file

@ -0,0 +1,32 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="theme-color" content="#161625">
<link rel="icon" href="./assets/<%=page%>/icon.svg" type="image/svg+xml">
<link rel="icon" type="image/png" href="assets/adblock/favicon.png">
<title><%= title %></title>
<meta name="author" content="Ursu Eduard Cornelius">
<meta name="description" content="<%= description %>">
<meta name="keywords" content="<%= keywords %>,Eduard Ursu,d3ward,github">
<!-- Google / Search Engine Tags -->
<meta itemprop="name" content="<%= title %>">
<meta itemprop="description" content="<%= description %>">
<meta itemprop="image" content="https://d3ward.github.io/toolz/./assets/preview_toolz.png">
<!-- Open Graph Tags -->
<meta property="og:url" content="<%= url %>">
<meta property="og:type" content="website">
<meta property="og:title" content="<%= title %>">
<meta property="og:description" content="<%= description %>">
<meta property="og:image" content="<%= preview_thumbnail %>">
<!-- Twitter Meta Tags -->
<meta name="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="<%= url %>">
<meta name="twitter:title" content="<%= title %>">
<meta name="twitter:description" content="<%= description %>">
<meta name="twitter:image" content="<%= preview_thumbnail %>">
</head>

118
src/partials/header.ejs Normal file
View file

@ -0,0 +1,118 @@
<header class="_sticky">
<nav>
<div class="nav-overlay"></div>
<% if(page=='index' ) {%>
<a href="/">
<svg viewBox="0 0 12.002 12.7" fill="var(--primary)" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient>
<stop offset="0" stop-color="#fc575e" />
<stop offset="1" stop-color="#f7b42c" />
</linearGradient>
</defs>
<g paint-order="stroke markers fill" stroke-width="10.32">
<path d="M8 4.22c.581-.065 3.977.236 3.961.314L5.19 8.361.034 8.214z" fill-opacity=".831" />
<path
d="M3.579 4.385C1.42 4.27.047 2.012 0 0h3.982c3.437 0 4.025.013 4.24.044 2.282-.027 3.674 2.286 3.74 4.49M7.38 8.204c2.537.053 4.463 2.109 4.622 4.496l-7.9-.016c-1.18-.019-4.052-1.81-4.068-4.47" />
</g>
</svg>
</a>
<% }else if(page=='fontlist' ) {%>
<a href="fontlist.html">
<svg fill="currentColor" viewbox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
<path
d="M50.336 22.85c-1.471 0-2.942.712-3.54 2.137L19.911 89a3.84 3.84 0 002.052 5.029 3.835 3.835 0 005.029-2.054l5.407-12.874h35.88l5.408 12.874a3.82 3.82 0 003.539 2.354c.07 0 .139-.017.208-.02.063.004.122.019.186.019h18.893c7.513 0 13.619-6.108 13.619-13.62 0-5.372-3.152-9.985-7.677-12.204 2.559-2.472 4.162-5.932 4.162-9.765 0-7.51-6.107-13.62-13.62-13.62H77.62a2.637 2.637 0 00-2.636 2.636V75.24L53.877 24.987c-.597-1.425-2.07-2.138-3.54-2.138zM18.991 97.655c-4.372 0-4.991 1.67-4.991 3.747s.636 3.748 4.99 3.748H108.4c4.355 0 5.601-1.679 5.601-3.748s-1.23-3.747-5.601-3.747z" />
</svg>
</a>
<% }else if(page=='adblock' ) {%>
<a href="adblock.html">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" fill="currentColor">
<path
d="M12.787 29.698c-2.052-1.173-5.508-4.364-7.216-6.664C1.848 18.021-.01 12.477 0 6.418c.005-2.713.165-3.071 1.69-3.776C4.147 1.507 6.935.68 9.827.23c1.967-.307 5.99-.307 7.956 0 3.814.594 8.5 2.205 9.35 3.213.455.542.53 1.201.442 3.903-.077 2.353-.264 3.7-.815 5.891-1.476 5.862-4.997 11.208-9.906 15.04-2.287 1.786-2.996 2.034-4.067 1.421zm1.748-1.842c1.52-1.031 3.765-3.136 5.155-4.832 3.852-4.703 6.089-10.982 6.098-17.124.002-1.364-.046-1.426-1.584-2.038-3.637-1.449-6.481-2.001-10.334-2.007-3.798-.005-6.664.524-10.19 1.88-1.704.655-1.86.837-1.86 2.174.001 6.13 2.232 12.383 6.111 17.13 1.785 2.184 5.173 5.16 5.874 5.16.123 0 .452-.154.73-.343zm-1.928-2.936c-1.83-1.503-4.388-4.402-5.077-5.754-.297-.58-.245-1.232.123-1.542.124-.105.656-.38 1.182-.61l.957-.418.583.537c1.743 1.606 4.489 1.874 6.446.63 1.317-.839 2.356-2.353 2.541-3.704.077-.558.086-.567.745-.712 2.384-.524 2.799-.212 2.118 1.595-1.327 3.523-3.821 7.049-6.765 9.563-1.57 1.34-1.703 1.36-2.853.415zm-6.975-9.816c-.599-.42-1.502-4.042-1.737-6.962-.174-2.17-.108-2.314 1.31-2.86 2.765-1.063 5.24-1.492 8.6-1.492 3.368 0 5.835.429 8.617 1.5 1.382.53 1.489.761 1.306 2.829-.18 2.044-.21 2.07-2.734 2.486-1.02.168-1.872.282-1.892.254a49.76 49.76 0 01-.46-.724c-2.405-3.834-7.973-3.35-9.713.846-.166.403-.277 1.065-.326 1.95l-.074 1.34-1.166.516c-1.321.585-1.342.589-1.73.317z" />
</svg>
</a>
<% }else if(page=='units') { %>
<svg fill="var(--orange)" width="24" height="24" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg"><path d="M104.625 67.125h-43.75v-43.75c0-5.156-4.219-9.375-9.375-9.375H23.375C18.219 14 14 18.219 14 23.375v81.25c0 5.156 4.219 9.375 9.375 9.375h81.25c5.156 0 9.375-4.219 9.375-9.375V76.5c0-5.156-4.219-9.375-9.375-9.375zm-3.568 37.5H26.158c-2.758-.237-2.783-.235-2.783-3.16V27.18c.136-3.817-.293-3.805 3.703-3.805h21.254c3.256.106 3.168.005 3.168 2.579v5.808c.02.556-.196.812-.728.812H35.875c-4.447.492-3.296 6.15 0 6.25l14.88.168c.45.003.7.148.745.661v11.048c.052.523-.249.781-.745.799h-14.88c-4.442.492-3.297 6.149 0 6.25h14.773c.53.033.838.186.852.701V69.5c-.013.573-.295.751-.852.751H35.875c-4.442.492-3.297 6.149 0 6.25h14.844c.562-.004.781.255.781.767v14.858c.492 4.442 6.149 3.297 6.25 0V77.231c-.012-.617.265-.713.79-.731h10.8c.716.016.91.308.91.927v14.698c.491 4.447 6.15 3.296 6.25 0V77.409c.004-.732.216-.909.891-.909h10.73c.778.046.879.522.879 1.175v14.45c.491 4.447 6.15 3.296 6.25 0V77.888c-.01-.987.267-1.388 1.453-1.388h5.376c1.816-.048 2.51.929 2.546 2.486v22.582c-.194 2.912-.327 3.057-3.568 3.057z"/></svg>
<% } %>
<ul>
<% if(page!='index' ) {%>
<li>
<a href="/">
<img src="./assets/toolz/icon.svg" alt="" width="24" height="24"> &nbsp;
Toolz - Home
</a>
</li>
<% } %>
<li>
<a data-a11y-dialog-show="dlg_support">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
stroke-width="2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path d="M0 0h24v24H0z" stroke="none" />
<path
d="M3 14c.83.642 2.077 1.017 3.5 1 1.423.017 2.67-.358 3.5-1 .83-.642 2.077-1.017 3.5-1 1.423-.017 2.67.358 3.5 1M8 3a2.4 2.4 0 00-1 2 2.4 2.4 0 001 2M12 3a2.4 2.4 0 00-1 2 2.4 2.4 0 001 2" />
<path
d="M3 10h14v5a6 6 0 01-6 6H9a6 6 0 01-6-6v-5zM16.746 16.726a3 3 0 10.252-5.555" />
</svg>
&nbsp; Support
</a>
</li>
<li>
<a href="https://github.com/d3ward">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path
d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5">
</path>
</svg>
&nbsp; GitHub
</a>
<div class="nav-item theme-toggle">
<span class="light-icon theme-icon">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"
fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path
d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z">
</path>
<path
d="M17 4a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2">
</path>
<path d="M19 11h2m-1 -1v2"></path>
</svg>
</span>
<span class="dark-icon theme-icon">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"
fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path
d="M14.828 14.828a4 4 0 1 0 -5.656 -5.656a4 4 0 0 0 5.656 5.656z">
</path>
<path d="M6.343 17.657l-1.414 1.414"></path>
<path d="M6.343 6.343l-1.414 -1.414"></path>
<path d="M17.657 6.343l1.414 -1.414"></path>
<path d="M17.657 17.657l1.414 1.414"></path>
<path d="M4 12h-2"></path>
<path d="M12 4v-2"></path>
<path d="M20 12h2"></path>
<path d="M12 20v2"></path>
</svg>
</span>
</div>
</li>
</ul>
<button aria-label="Nav menu" class="btn-p">
<svg aria-hidden="true" version="1.1" viewBox="0 0 24 24">
<line x1="2" y1="4" x2="22" y2="4" id="top" />
<line x1="2" y1="12" x2="22" y2="12" id="middle-down" />
<line x1="2" y1="12" x2="22" y2="12" id="middle-up" />
<line x1="2" y1="20" x2="22" y2="20" id="bottom" />
</svg>
</button>
</nav>
</header>

114
src/partials/support_me.ejs Normal file
View file

@ -0,0 +1,114 @@
<div class="dialog" id="dlg_support" data-a11y-dialog="dlg_support" aria-labelledby="dlg_support-title"
aria-hidden="true">
<div class="dialog-overlay" data-a11y-dialog-hide></div>
<div class="dialog-content">
<header>
<h3 id="dlg_support-title"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-coffee" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M3 14c.83 .642 2.077 1.017 3.5 1c1.423 .017 2.67 -.358 3.5 -1c.83 -.642 2.077 -1.017 3.5 -1c1.423 -.017 2.67 .358 3.5 1"></path>
<path d="M8 3a2.4 2.4 0 0 0 -1 2a2.4 2.4 0 0 0 1 2"></path>
<path d="M12 3a2.4 2.4 0 0 0 -1 2a2.4 2.4 0 0 0 1 2"></path>
<path d="M3 10h14v5a6 6 0 0 1 -6 6h-2a6 6 0 0 1 -6 -6v-5z"></path>
<path d="M16.746 16.726a3 3 0 1 0 .252 -5.555"></path>
</svg> Support me </h3>
<button data-a11y-dialog-hide><svg class="w-6 h-6" id="close-icon" fill="none" stroke="currentColor"
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12">
</path>
</svg></button>
</header>
<section>
<div class="grid">
<div><h2 class="_f-center">Thank you!</h2></div>
<div>
<p>
Until now, the number of people who got interested in my projects went way beyond
my expectations, I'm so happy to see it grow daily! <br>
If you use any of them or find them valuable, I'll be grateful for your support!
</p>
</div>
<br><br>
<div>
<h3><svg xmlns="http://www.w3.org/2000/svg"
width="24" height="24" viewBox="0 0 24 24"
stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round"
stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<circle cx="12" cy="12" r="9"></circle>
<path
d="M13.867 9.75c-.246 -.48 -.708 -.769 -1.2 -.75h-1.334c-.736 0 -1.333 .67 -1.333 1.5c0 .827 .597 1.499 1.333 1.499h1.334c.736 0 1.333 .671 1.333 1.5c0 .828 -.597 1.499 -1.333 1.499h-1.334c-.492 .019 -.954 -.27 -1.2 -.75">
</path>
<path d="M12 7v2"></path>
<path d="M12 15v2"></path>
<path d="M6 6l1.5 1.5"></path>
<path d="M16.5 16.5l1.5 1.5"></path>
</svg> Free </h3>
</div>
<div>
<p>You can support me for free in these ways : </p>
<br>
<p class="_d-flex" style="align-items: center;"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-share" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<circle cx="6" cy="12" r="3"></circle>
<circle cx="18" cy="6" r="3"></circle>
<circle cx="18" cy="18" r="3"></circle>
<line x1="8.7" y1="10.7" x2="15.3" y2="7.3"></line>
<line x1="8.7" y1="13.3" x2="15.3" y2="16.7"></line>
</svg> &nbsp; Share the projects with others (friends, family or community)</p>
<p class="_d-flex" style="align-items: center;"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-star" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 17.75l-6.172 3.245l1.179 -6.873l-5 -4.867l6.9 -1l3.086 -6.253l3.086 6.253l6.9 1l-5 4.867l1.179 6.873z"></path>
</svg> &nbsp; Star and follow my projects </p>
<p class="_d-flex" style="align-items: center;"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-github" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5"></path>
</svg> &nbsp; Contribute by opening issues or making PRs</p>
</div>
<br><br>
<div>
<h3>
<svg xmlns="http://www.w3.org/2000/svg"
width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M19.5 12.572l-7.5 7.428l-7.5 -7.428a5 5 0 1 1 7.5 -6.566a5 5 0 1 1 7.5 6.572"></path>
<path
d="M12 6l-3.293 3.293a1 1 0 0 0 0 1.414l.543 .543c.69 .69 1.81 .69 2.5 0l1 -1a3.182 3.182 0 0 1 4.5 0l2.25 2.25">
</path>
<path d="M12.5 15.5l2 2"></path>
<path d="M15 13l2 2"></path>
</svg> Donations & Referrals
</h3>
</div>
<div>
<p>
Some of my projects have some costs to be kept online, which I can thankfully afford,
but if you feel you want to contribute, here are some ways to do so.
</p>
<br>
<a href="https://ko-fi.com/d3ward" class="btn btn-red" style="--red:#FF5872">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 24 24"><path fill="#fff" fill-opacity="1" stroke="#030303" stroke-opacity="1" stroke-width="1" d="M21.407 9.597c-.612-3.214-3.847-3.614-3.847-3.614H3.072c-.478 0-.537.628-.537.628s-.065 5.764-.018 9.303c.13 1.908 2.048 2.103 2.048 2.103s6.545-.018 9.474-.038c1.93-.336 2.124-2.02 2.104-2.939 3.446.189 5.876-2.228 5.264-5.443zM12.65 12.36c-.986 1.144-3.175 3.13-3.175 3.13s-.096.093-.246.017c-.06-.044-.085-.07-.085-.07-.351-.347-2.667-2.4-3.194-3.112-.562-.76-.824-2.125-.072-2.92.753-.794 2.379-.854 3.454.32 0 0 1.24-1.402 2.746-.757 1.507.645 1.45 2.37.572 3.392zm4.887.377c-.734.09-1.331.022-1.331.022V8.288h1.401s1.56.433 1.56 2.076c0 1.505-.78 2.099-1.63 2.373z"/><path fill="#ff2858" fill-opacity="1" fill-rule="evenodd" stroke="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" stroke-width="7.559" d="M8.158 14.456c-2.353-2.2-2.67-2.643-2.675-3.737-.002-.653.098-.92.49-1.31.405-.402.655-.49 1.398-.49.752.001 1.1.129 1.645.605l.28.245.432-.324c.537-.403.996-.568 1.578-.565.862.003 1.598.542 1.832 1.34.153.523.105.93-.179 1.54-.158.34-.527.763-1.628 1.866-.783.785-1.559 1.535-1.724 1.666l-.3.239Z" paint-order="stroke markers fill"/></svg>
Support me on Ko-fi
</a><br><br>
If, on the other hand, you are a developer, try out Railway with the below link. For every referral who incurs more than $10 worth of usage and pays their first bill, I get credits to use on my projects. In addition, Railway provides $5 in credit each month for free! <br>
<br><a href="https://railway.app?referralCode=d3ward" class="btn btn-black">
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><title>Railway</title><path d="M.113 10.27A13.026 13.026 0 000 11.48h18.23c-.064-.125-.15-.237-.235-.347-3.117-4.027-4.793-3.677-7.19-3.78-.8-.034-1.34-.048-4.524-.048-1.704 0-3.555.005-5.358.01-.234.63-.459 1.24-.567 1.737h9.342v1.216H.113v.002zm18.26 2.426H.009c.02.326.05.645.094.961h16.955c.754 0 1.179-.429 1.315-.96zm-17.318 4.28s2.81 6.902 10.93 7.024c4.855 0 9.027-2.883 10.92-7.024H1.056zM11.988 0C7.5 0 3.593 2.466 1.531 6.108l4.75-.005v-.002c3.71 0 3.849.016 4.573.047l.448.016c1.563.052 3.485.22 4.996 1.364.82.621 2.007 1.99 2.712 2.965.654.902.842 1.94.396 2.934-.408.914-1.289 1.458-2.353 1.458H.391s.099.42.249.886h22.748A12.026 12.026 0 0024 12.005C24 5.377 18.621 0 11.988 0z"/></svg>
Railway
</a>
</div>
</div>
</section>
<footer>
<button data-a11y-dialog-hide>
Close
</button>
</footer>
</div>
</div>

162
src/partials/thankyou.ejs Normal file
View file

@ -0,0 +1,162 @@
<div class="dialog" id="dlg_ty" data-a11y-dialog="dlg_ty" aria-labelledby="dlg_ty-title" aria-hidden="true">
<div class="dialog-overlay" data-a11y-dialog-hide></div>
<div class="dialog-content">
<header>
<h3 id="dlg_ty-title">Thank you !</h3>
<button data-a11y-dialog-hide><svg class="w-6 h-6" id="close-icon" fill="none" stroke="currentColor"
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12">
</path>
</svg></button>
</header>
<section>
<div>
<h2>More than 1 million tests so far</h2>
<b class="_txt-red"><i>You will not see any ads and no trackers will be activated </i></b><br><br>
<div class="row keep-width">
<div>
<div class="card">
<div class="_f-center">
<svg xmlns="http://www.w3.org/2000/svg" fill="var(--green)" width="24" height="24"
viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 3c7.2 0 9 1.8 9 9s-1.8 9 -9 9s-9 -1.8 -9 -9s1.8 -9 9 -9z"></path>
</svg>
&nbsp; Blocked
</div>
If the connection to a host/script fails or a box is removed means the latter has been blocked by your
ad-blocker
</div>
</div>
<div>
<div class="card">
<div class="_f-center">
<svg xmlns="http://www.w3.org/2000/svg" fill="var(--red)" width="24" height="24"
viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 3c7.2 0 9 1.8 9 9s-1.8 9 -9 9s-9 -1.8 -9 -9s1.8 -9 9 -9z"></path>
</svg>
&nbsp; Not Blocked
</div>
Connection to a host did not fail or box is not removed, means that your ad-blocker did not block it or doesn't work
</div>
</div>
</div>
<p>After tests are completed , you get a liquid color ball with points.<br>
Points are caculated based on your tests for each category and type <br>
The color is calculated based on you points range <br>
Here a preview of 3 scenarios :</p>
<div class="template_wrap row keep-width ">
<div>
<div class="lt_cwrap lt_template" style="--liquid-color:var(--red);--liquid-percentage:10%">
<div class="lt_circle">
<div class="lt_wave"></div>
</div>
</div>
<div class="lt_value_2 _bg-red">
Cmon , use an adblock or smth
</div>
</div>
<div>
<div class="lt_cwrap lt_template" style="--liquid-color:var(--orange);--liquid-percentage:0%">
<div class="lt_circle">
<div class="lt_wave"></div>
</div>
</div>
<div class="lt_value_2 _bg-orange">
Ok, but you can do better
</div>
</div>
<div>
<div class="lt_cwrap lt_template" style="--liquid-color:var(--green);--liquid-percentage:-30%">
<div class="lt_circle">
<div class="lt_wave"></div>
</div>
</div>
<div class="lt_value_2 _bg-green">
Great, you're ready to surf
</div>
</div>
</div>
The tests consist of 3 types
<ul>
<li>Cosmetic Filter : Check if you are hiding/removing the empy boxes of ads, cookie policy etc.</li>
<li>Script Loading : Check if you are blocking a possible ad script loading or trackers</li>
<li>Host : Check if you block domains that provide trackers, analytics or ads</li>
</ul>
<h3>The test is not working, I'm sure my adblock method is properly configured</h3>
<p>
In that case probably you have a setup that is not compatible for the checks of this tool.
This doesn't mean you are not protected by your configured solution that can be ablock extension , vpn or dns
It's because due to some JS limitation or lack of implementation feature the test is not able to figure out
You will receive a percentage of how many connections you have blocked
</p>
<h2>How I can have 100%</h2>
<p>
It's not needed . If you got a green result , you are pretty good. Don't be too competitive with that number
In case you want to have a full 100% ,
consider using my small list that I created to cover most of the tests in this website (cosmetic filter,script loading excluded)
<button class="btn-blue"
onclick="copyToClip('https://raw.githubusercontent.com/d3ward/toolz/master/src/d3host.txt')">
d3Host List (TXT)</button>
<button class="btn-blue"
onclick="copyToClip('https://raw.githubusercontent.com/d3ward/toolz/master/src/d3host.adblock')">
d3Host List (ADBLOCK)</button>
<br><br>
</p>
<h2>Adblock solutions</h2>
On any device where possible the first thing I install on the browser is <a href="https://ublockorigin.com/" class="btn">uBlock Origin </a>
Second, I go with a DNS solution like <a href="https://nextdns.io/" class="btn">Next DNS</a> for blocking on any installed app
<h3>Other suggested solutions for ad-blocking</h3>
<div>
<a href="https://adguard.com/" class="btn">Adguard Extension or DNS </a>
<a href="https://blokada.org/" class="btn">Blokada </a>
</div>
<p>
<h2>Test tools for your adblock </h2>
I created this website to quickly test my small list of most common hosts.
I wanted to build something with a great design and user experience that is pretty straigthforward for any user.
There are other great tools that I use and I want to recommend
<div class="cnt2">
<a href="https://canyoublockit.com/" class="btn">CanYouBlockIt</a>
<a href="https://ipleak.net/" class="btn">IP Leak </a>
<a href="https://blockads.fivefilters.org/" class="btn">Block Ads Test </a>
<a href="https://panopticlick.eff.org/" class="btn">Browser Fingerprint by EEF</a>
<a href="http://raymondhill.net/ublock/tiles1.html" class="btn">Adblock Testing by
raymondhill</a>
<a href="http://raymondhill.net/ublock/popup.html" class="btn">Popup Blocker by
raymondhill</a>
</div>
</p>
</div>
</section>
<footer>
<button data-a11y-dialog-hide>
Cancel
</button>
<button class="btn-p" data-a11y-dialog-hide>
Ok
</button>
</footer>
</div>
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

70
src/sass/404.sass Normal file
View file

@ -0,0 +1,70 @@
@charset "utf-8"
@import "./settings/variables"
@import "./theme/light"
@import "./theme/dark"
$or-50: '#ffffff'
$or-100: '#fdddde'
$or-200: '#fababd'
$or-300: '#f8989d'
$or-400: '#f5757c'
$or-500: '#f3535b'
$or-600: '#d94148'
$or-700: '#bf2f36'
$or-800: '#a41c23'
$or-900: '#8a0a10'
html
--primary: #{$or-500}!important
--primary-h: #{$or-100}!important
--primary-l: #{$or-400}!important
--primary-d: #{$or-800}!important
[data-theme="dark"]
--primary: #{$or-500} !important
--primary-h: #{$or-800}!important
--primary-l: #{$or-400}!important
--primary-d: #{$or-600}!important
body
background-color: #f7b42c
background-image: linear-gradient(315deg, #f7b42c 0%, #fc575e 74%)
background-size: 400% 100%
height: auto
@import "./base/basic"
@import "./extra/aos"
@import "./elements/typography"
@import "./layout/navbar"
@import "./layout/aside"
@import "./layout/header"
@import "./layout/container"
@import "./layout/grid"
@import "./layout/footer"
@import "./elements/button"
@import "./components/card"
@import "./elements/form"
@import "./components/dropdown"
@import "./components/modal"
@import "./components/gotop_link"
@import "./elements/code"
@import "./elements/figure"
@import "./components/details"
@import "./elements/table"
@import "./components/tabs"
@import "./extra/tooltip"
@import "./extra/wave"
@import "./extra/pages"
@import "./extra/alert"
@import "./utilities/alignment"
@import "./utilities/background"
@import "./utilities/border"
@import "./utilities/display"
@import "./utilities/margin"
@import "./utilities/general"
@import "./utilities/padding"
@import "./utilities/spacer"
@import "./utilities/text"

7
src/sass/_utilities.scss Normal file
View file

@ -0,0 +1,7 @@
// --------------------------------------------------
// Utilities
// --------------------------------------------------
.clearfix {
@include clearfix;
}

389
src/sass/adblock.sass Normal file
View file

@ -0,0 +1,389 @@
@charset "utf-8"
@import "./settings/variables"
@import "./theme/light"
@import "./theme/dark"
@import "./base/basic"
@import "./extra/aos"
@import "./elements/typography"
@import "./layout/navbar"
@import "./layout/aside"
@import "./layout/header"
@import "./layout/container"
@import "./layout/grid"
@import "./layout/footer"
@import "./elements/button"
@import "./components/snackbar"
@import "./components/card"
@import "./elements/form"
@import "./components/dropdown"
@import "./components/modal"
@import "./components/gotop_link"
@import "./components/details"
@import "./elements/table"
@import "./components/tabs"
@import "./extra/tooltip"
@import "./extra/pages"
@import "./extra/alert"
@import "./utilities/alignment"
@import "./utilities/background"
@import "./utilities/position"
@import "./utilities/border"
@import "./utilities/display"
@import "./utilities/margin"
@import "./utilities/general"
@import "./utilities/padding"
@import "./utilities/spacer"
@import "./utilities/text"
footer>div
background: var(--bg2)
.card
border-radius: 12px
box-shadow: none
background: var(--bg2)
.test_block,.test>span
border-radius: var(--radius)
position: relative
min-height: 45px
width: 100%
.test_block
text-align: center
margin: 0
display: flex
align-items: center
justify-content: center
color: #fff
#test_log
height: 200px
overflow-y: auto
flex-wrap: nowrap
.test_wrapper
display: flex
flex-direction: column
gap: .5rem
.test_wrapper>div,.test_card
padding: .5rem
border-radius: 12px
background: var(--bg2)
.test_wrapper svg,.test_card svg
height: 1.5rem
.test_wrapper>div>h5,.test_card>h5,.test>span
text-align: center
margin: 0
display: flex
align-items: center
justify-content: center
.test
background-color: var(--red)
color: #fff
border-radius: 8px
display: flex
flex-direction: column
align-items: center
justify-content: center
text-align: center
margin: 10px
height: 100%
min-height: 45px
transition: all 1s
.test>div>div
height: 45px
width: 100%
border-radius: 8px
background: var(--bg2)
color: var(--txt)
padding: 0.5rem
display: flex
align-items: center
gap: 0.5rem
.test>div>div>span
white-space: nowrap
overflow: hidden
text-overflow: ellipsis
width: 100%
text-align: left
.test>div
position: relative
user-select: none
display: none
flex-direction: column
overflow-x: auto
gap: 0.5rem
padding: 0.5rem
width: 100%
white-space: nowrap
color: #000
.test.show>div
display: flex
#test2
background-color: green
color: white
display: inline-block
height: 50px
text-align: center
vertical-align: top
width: 100%
#test2>div
height: 50px
overflow: hidden
width: 100%
#results
background-color: white
border: 1px solid #ddd
bottom: 1em
font-size: 24px
left: 1em
padding: 4px 8px
position: fixed
.epic_path1, .epic_path
fill: var(--primary)
.epic
width: 250px
height: 250px
.lt_wrap
display: flex
flex-direction: column
justify-content: center
align-items: center
.lt_particles
width: 15rem
height: 7.5rem
display: flex
justify-content: center
align-items: center
flex-direction: row
grid-gap: 16px
.start .p1
animation: p1 1.6s cubic-bezier(.2, .4, .35, 1) .2s infinite backwards
.start .p2
animation: p2 1.5s cubic-bezier(.2, .4, .35, 1) .2s infinite backwards
.start .p3
animation: p3 1.6s cubic-bezier(.2, .4, .35, 1) .2s infinite backwards
.start .p4
animation: p4 1.4s cubic-bezier(.2, .4, .35, 1) .2s infinite backwards
.start .p5
animation: p5 1.2s cubic-bezier(.2, .4, .35, 1) .2s infinite backwards
.p1,.p2,.p3,.p4,.p5
padding: 4px
height: 32px
width: 32px
border-radius: 50%
.p1
background: var(--blue-h)
color: var(--blue)
.p2
background: var(--green-h)
color: var(--green)
.p3
background: var(--orange-h)
color: var(--orange)
.p5
background: var(--purple-h)
color: var(--purple)
.p4
background: var(--red-h)
color: var(--red)
@keyframes p1
0%
transform: translateY(0px) translateX(-20px) scale(.8)
opacity: 0
50%
transform: translateY(40px) translateX(0px) scale(1)
opacity: 1
animation-timing-function: cubic-bezier(1, .4, .35, 1)
75%
transform: translateY(100px) translateX(10px) scale(1)
opacity: 0
100%
transform: translateY(0px) translateX(-10px) scale(.8)
opacity: 0
@keyframes p2
0%
transform: translateY(0px) translateX(-10px) scale(.8)
opacity: 0
50%
transform: translateY(50px) translateX(0px) scale(1)
opacity: 1
animation-timing-function: cubic-bezier(1, .4, .35, 1)
75%
transform: translateY(80px) translateX(5px) scale(1)
opacity: 0
100%
transform: translateY(0px) translateX(5px) scale(.8)
opacity: 0
@keyframes p3
0%
transform: translateY(0px) scale(.8) rotate(45deg)
opacity: 0
50%
transform: translateY(40px) scale(1) rotate(0deg)
opacity: 1
animation-timing-function: cubic-bezier(1, .4, .35, 1)
75%
transform: translateY(100px) scale(1) rotate(0deg)
opacity: 0
100%
transform: translateY(0px) scale(.8) rotate(0deg)
opacity: 0
@keyframes p4
0%
transform: translateY(0px) translateX(10px) scale(.8)
opacity: 0
50%
transform: translateY(60px) translateX(0px) scale(1)
opacity: 1
animation-timing-function: cubic-bezier(1, .4, .35, 1)
75%
transform: translateY(100px) translateX(0px) scale(1)
opacity: 0
100%
transform: translateY(0px) translateX(10px) scale(.8)
opacity: 0
@keyframes p5
0%
transform: translateY(0px) translateX(20px) scale(.8)
opacity: 0
50%
transform: translateY(50px) translateX(0px) scale(1)
opacity: 1
animation-timing-function: cubic-bezier(1, .4, .35, 1)
75%
transform: translateY(90px) translateX(0px) scale(1)
opacity: 0
100%
transform: translateY(0px) translateX(20px) scale(.8)
opacity: 0
:root
--liquid-percentage: 50%
--liquid-title: "BAD"
--liquid-color: var(--red)
.r_wrap
width: 100%
display: flex
flex-direction: column
gap: .5rem
&>div
background: var(--bg2)
border-radius: 8px
padding: .5rem
display: flex
.r_wrap textarea
min-height: 150px
margin-top: 0.5rem
.lt_template .lt_circle
width: 60px
height: 60px
.template_wrap.row>div
justify-content: center
gap: .5rem
align-items: center
display: flex
flex-direction: column
.lt_value_2
border-radius: 8px
color: var(--white)
padding: .4rem
.lt_cwrap
position: relative
border-radius: 50rem
background-color: var(--bg2)
.lt_circle
width: 200px
height: 200px
background: var(--liquid-color)
border: 3px solid var(--black-h)
border-radius: 50%
overflow: hidden
z-index: 5
.lt_wave
position: relative
top: var(--liquid-percentage)
width: 100%
height: 100%
background: var(--liquid-color)
border-radius: 50%
transition: 3s
.lt_wave:before,
.lt_wave:after
content: ''
position: absolute
width: 200%
height: 200%
left: 50%
-webkit-transform: translate(-50%, -75%)
transform: translate(-50%, -75%)
background: #000
.lt_wave:before
border-radius: 45%
background: var(--bg2)
animation: animate_lt_wave 6s linear infinite
.lt_wave:after
border-radius: 40%
opacity: .5
background: var(--bg2)
animation: animate_lt_wave 10s linear infinite
@keyframes animate_lt_wave
0%
transform: translate(-50%, -75%) rotate(0deg)
100%
transform: translate(-50%, -75%) rotate(360deg)
.lt_cwrap .lt_value
position: absolute
height: 100%
right: 0
bottom: 0
width: 100%
.lt_cwrap .lt_value::after,
.lt_cwrap .lt_value::before
content: var(--liquid-title)
position: inherit
left: 100%
margin-left: 10px
bottom: calc(45% - var(--liquid-percentage))
transform: translateY(50%)
background: var(--liquid-color)
color: var(--white)
padding: 10px
font-size: 20px
font-weight: bold
border-radius: 8px
transition: 3s
.lt_cwrap .lt_value::after
content: ''
border: 12px solid transparent
border-right-color: var(--liquid-color)
padding: 0
border-radius: 0
background: transparent
transform: translate(-78%, 50%)
#dlg_faq p
-moz-osx-font-smoothing: grayscale
-webkit-font-smoothing: antialiased!important
margin-top: 1rem

56
src/sass/base/_basic.sass Normal file
View file

@ -0,0 +1,56 @@
/* ---------------- Basic resets and improvements --------------- */
*,
*::before,
*::after
box-sizing: border-box
*:focus:not(:focus-visible)
outline: 0
*:focus-visible
outline: .1rem solid var(--focus)
outline-offset: .1rem
html
text-rendering: optimizeLegibility
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif
font-size: 12pt
color: var(--txt)
background: var(--bg)
body
min-height: 100vh
display: flex
flex-flow: wrap column
gap: .5rem
align-items: center
justify-content: center
@media (prefers-reduced-motion: no-preference)
scroll-behavior: smooth
body,html
margin: 0
padding: 0
header>*,main>*,footer>*
max-width: 60rem
ol, ul
list-style: none
display: flex
flex-direction: column
gap: .3rem
.keep-ls
list-style: unset
img
max-width: 100%
table
border-collapse: collapse
textarea
white-space: revert
hr
border: 0
border-top: .1rem solid var(--brd)
section
overflow-x: hidden
display: flex
flex-direction: column

View file

@ -0,0 +1,47 @@
/* ------------------- Card ------------------- */
.card
display: flex
flex-wrap: wrap
flex-direction: column
gap: 1rem
padding: 1rem
background: var(--bg-card)
border-radius: var(--radius)
box-shadow: var(--shadow)
&> *
width: 100%
margin: 0
&> img
height: auto
border-radius: var(--radius)
width: 100%
&.full
width: calc( 100% + 2rem )
max-width: unset
&.full:first-child
border-radius: var(--radius) var(--radius) 0 0
margin: -1rem -1rem 0 -1rem
&.full:last-child
border-radius: 0 0 var(--radius) var(--radius)
margin: 0 -1rem -1rem -1rem
&>.img-w
padding: 1rem
box-shadow: 0 8px 20px -4px var(--b-shadow)
max-width: 100px
border-radius: 50%
margin: 15px auto 15px
width: 100px
height: 100px
&> img
height: auto
border-radius: 50%
width: 100%
.img-w200
padding: 40px
border-radius: 50%
width: 200px
height: 200px
&> img
height: auto
border-radius: 50%
width: 100%

View file

@ -0,0 +1,28 @@
/* ------------------ Details ----------------- */
details
width: 100%
overflow-x: hidden
display: flex
flex-flow: wrap column
border-radius: var(--radius)
user-select: none
background: var(--bg-details)
& > summary
outline-color: initial
padding: .6rem
border-radius: var(--radius)
outline: 0
cursor: pointer
font-weight: 500
&:hover
color: var(--primary)
background-color: var(--bg-details)
& > div
padding: .5rem
details[open]
summary
background-color: var(--bg-details-open)
color: var(--txt-details-open)
details+details
margin-top: .5rem

View file

@ -0,0 +1,51 @@
.dropdown
display: inline-flex
position: relative
padding-bottom: .5rem
&>a,&>button
margin: 0
&:after
content: ""
width: .5rem
height: .5rem
margin-left: 1rem
transform-origin: color
transform: rotate(45deg)
display: block
border: .1875rem solid currentColor
border-bottom: 0
border-left: 0
pointer-events: none
>[data-dropdown-id]
display: none
flex-direction: column
left: 0
list-style: none
width: 14rem
margin: 0
padding: 0
transform-origin: right top
position: absolute
border:1px solid var(--bg2)
border-radius: var(--radius)
background-color: var(--bg)
box-shadow: var(--shadow)
top: 100%
z-index: 20
&>a:hover,&>a.link-active
padding: .3rem
border: 0
background: var(--bg2)
color: var(--primary)
>*
width: 100%
display: flex
margin: 0
border-radius: var(--radius)
padding: .3rem
&.dropdown-active
&>a:after,&>button:after
border-top: 0
border-bottom: .1875rem solid currentColor
&>[data-dropdown-id]
display: flex

View file

@ -0,0 +1,15 @@
/* ---------------- Go Top Link --------------- */
.gt-link
transition: all .25s ease-in-out
position: fixed
bottom: 0
right: 0
z-index: 1
min-width: 2.6rem
padding: .4rem
cursor: pointer
visibility: visible
opacity: 1
&.hidden
visibility: hidden
opacity: 0

View file

@ -0,0 +1,65 @@
.dialog,.dialog-overlay
position: fixed
top: 0
right: 0
bottom: 0
left: 0
.dialog
display: flex
z-index: 50
padding: .5rem
.dialog[aria-hidden='true']
display: none
.dialog-overlay
background: rgba(43, 46, 56, 0.9)
.dialog-content
z-index: 50
margin: auto
display: flex
flex-direction: column
align-items: start
max-block-size: 80vh
max-block-size: 80dvb
border-radius: 0.5em
width: 100%
max-width: 42rem
overflow: hidden
background: var(--bg)
*
margin: 0
>*
padding: 1rem
>footer
border-top: 1px solid var(--brd)
display: flex
gap: .5rem
>header
border-bottom: 1px solid var(--brd)
display: flex
align-items: center
justify-content: space-between
>section
width: 100%
@keyframes dialog-fade-in
from
opacity: 0
@keyframes dialog-slide-up
from
transform: translateY(10%)
.dialog-sm .dialog-content
max-width: 320px
.dialog-lg .dialog-content
max-width: unset
.dialog-overlay
animation: dialog-fade-in 200ms both
.dialog-content
animation: dialog-fade-in 400ms 200ms both, dialog-slide-up 400ms 200ms both
@media (prefers-reduced-motion: reduce)
.dialog-close
transition: none
.dialog-content
animation: none

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