├── .eslintignore
├── .eslintrc.js
├── .github
├── ISSUE_TEMPLATE
│ ├── bug-failed-test-issue-template.md
│ ├── bug_report.md
│ └── new-verified-test-issue-template.md
└── workflows
│ ├── deploy.yml
│ └── issue-checker.yml
├── .gitignore
├── .prettierrc.js
├── LICENSE
├── README.md
├── config
├── config.js
├── purgecss.mjs
├── webpack.dev.js
├── webpack.main.js
└── webpack.prod.js
├── package-lock.json
├── package.json
└── src
├── 404.ejs
├── adblock.ejs
├── assets
├── 404
│ ├── 404_dark.svg
│ └── icon.svg
├── adblock
│ ├── icon.svg
│ └── icon_filled.svg
├── fontlist
│ ├── fontlist_circle.svg
│ └── icon.svg
├── icon_.svg
├── ko-fi.svg
├── preview_toolz.png
├── toolz
│ ├── icon.png
│ ├── icon.svg
│ └── icon_filled.svg
└── units
│ └── icon.svg
├── d3host.adblock
├── d3host.txt
├── data
├── adblock_compatibility.json
├── adblock_data.json
├── font_list.js
└── icons.js
├── fontlist.ejs
├── index.ejs
├── js
├── 404.js
├── adblock.js
├── components
│ ├── alert.js
│ ├── aos.js
│ ├── carousel.js
│ ├── dialog.js
│ ├── fade.js
│ ├── fontChecker.js
│ ├── gotop.js
│ ├── localStorage.js
│ ├── navbar.js
│ ├── pagesRoute.js
│ ├── ping.js
│ ├── snackbar.js
│ ├── themeManager.js
│ └── utils.js
├── fontlist.js
├── index.js
├── pagead.js
├── units.js
└── widget
│ └── ads.js
├── partials
├── adblock
│ ├── changelog.ejs
│ ├── faq.ejs
│ ├── logs.ejs
│ ├── results.ejs
│ └── settings.ejs
├── footer.ejs
├── gotop.ejs
├── head.ejs
├── header.ejs
└── support_me.ejs
├── sass
├── 404.sass
├── _utilities.sass
├── adblock.sass
├── base
│ └── _basic.sass
├── components
│ ├── _card.sass
│ ├── _details.sass
│ ├── _dropdown.sass
│ ├── _gotop_link.sass
│ ├── _modal.sass
│ ├── _snackbar.sass
│ ├── _tabs.sass
│ └── _toast.sass
├── elements
│ ├── _button.sass
│ ├── _code.sass
│ ├── _figure.sass
│ ├── _form.sass
│ ├── _link.sass
│ ├── _table.sass
│ └── _typography.sass
├── extra
│ ├── _alert.sass
│ ├── _aos.sass
│ ├── _carousel.sass
│ ├── _loading.sass
│ ├── _pages.sass
│ ├── _tooltip.sass
│ └── _wave.sass
├── fontlist.sass
├── index.sass
├── layout
│ ├── aside.sass
│ ├── container.sass
│ ├── footer.sass
│ ├── grid.sass
│ ├── header.sass
│ └── navbar.sass
├── settings
│ ├── _colors.sass
│ └── _variables.sass
├── theme
│ ├── dark.sass
│ └── light.sass
├── units.sass
└── utilities
│ ├── _alignment.sass
│ ├── _background.sass
│ ├── _border.sass
│ ├── _display.sass
│ ├── _general.sass
│ ├── _margin.sass
│ ├── _padding.sass
│ ├── _position.sass
│ ├── _spacer.sass
│ └── _text.sass
├── script
└── build_list.js
└── units.ejs
/.eslintignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: {
3 | browser: true,
4 | es6: true
5 | },
6 | extends: ['eslint:recommended', 'prettier'],
7 | plugins: ['prettier'],
8 | globals: {
9 | Atomics: 'readonly',
10 | SharedArrayBuffer: 'readonly'
11 | },
12 | parserOptions: {
13 | ecmaVersion: 2021,
14 | sourceType: 'module'
15 | },
16 | rules: {
17 | 'prettier/prettier': 'error',
18 | 'no-unused-vars': 0,
19 | 'no-undef': 0
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug-failed-test-issue-template.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug/Failed Test Issue Template
3 | about: Use this template when reporting a bug or a failed test. Provide details about
4 | the issue, such as the browser, operating system, Adblock solution
5 | title: ''
6 | labels: failed-test
7 | assignees: d3ward
8 |
9 | ---
10 |
11 |
18 |
19 | ### Context
20 |
21 | **Browser**:
22 |
23 | **Operating System**:
24 |
25 | **Adblock Solution**:
26 |
27 | **Description of Issue**:
28 |
29 |
30 | **Screenshots:**
31 |
32 | [Attach screenshots here if applicable]
33 |
34 | ### Logs
35 |
36 |
37 | **Test Result:**
38 | [Describe the result of the test]
39 |
40 | **Test Log:**
41 | [Include the test log if available]
42 |
43 | **Dev Console:**
44 | [Copy and paste any relevant logs or error messages from the developer console]
45 |
46 | ### Confirmation
47 | - [ ] I confirm that I have filled out all the necessary fields with enough detail to allow for the proper investigation and potential resolution of the issue.
48 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: bug
6 | assignees: d3ward
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS: [e.g. iOS]
28 | - Browser [e.g. chrome, safari]
29 | - Version [e.g. 22]
30 |
31 | **Smartphone (please complete the following information):**
32 | - Device: [e.g. iPhone6]
33 | - OS: [e.g. iOS8.1]
34 | - Browser [e.g. stock browser, safari]
35 | - Version [e.g. 22]
36 |
37 | **Additional context**
38 | Add any other context about the problem here.
39 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/new-verified-test-issue-template.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: New/Verified Test Issue Template
3 | about: Use this template when documenting a successful or verified test. Provide details
4 | about the browser, operating system, Adblock solution
5 | title: ''
6 | labels: passed-test
7 | assignees: d3ward
8 |
9 | ---
10 |
11 | **Browser:**
12 | **OS:**
13 | **Adblock Solution:**
14 |
15 | **Test Passed Value ( % ):**
16 |
17 | **Description:**
18 | [Provide a detailed description of the configuration used ( DNS , VPN, Lists etc.]
19 |
20 | **Screenshots:**
21 | [Attach any relevant screenshots or examples if available]
22 |
23 | **Test Result Data:**
24 | [Provide exported test result]
25 |
26 | **Test Log:**
27 | [Include the test log if available]
28 |
29 | **Dev Console:**
30 | [Copy and paste any relevant logs from the developer console]
31 |
--------------------------------------------------------------------------------
/.github/workflows/deploy.yml:
--------------------------------------------------------------------------------
1 | name: Deploy to gh-pages
2 |
3 | on:
4 | push:
5 | branches:
6 | - master
7 | workflow_dispatch:
8 |
9 | jobs:
10 | gh-pages-deploy:
11 | name: Deploying to gh-pages
12 | runs-on: ubuntu-latest
13 | steps:
14 | - name: Checkout branch
15 | uses: actions/checkout@v4
16 |
17 | - name: Clean install dependencies
18 | run: npm install
19 |
20 | - name: Build app
21 | run: npm run build
22 |
23 | - name: Purge
24 | run: npm run purge
25 |
26 | - name: deploy
27 | uses: peaceiris/actions-gh-pages@v3.9.3
28 | with:
29 | github_token: ${{ secrets.GITHUB_TOKEN }}
30 | publish_dir: ./dist
31 | env:
32 | ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
33 |
--------------------------------------------------------------------------------
/.github/workflows/issue-checker.yml:
--------------------------------------------------------------------------------
1 | name: Issue Template Checks
2 |
3 | on:
4 | workflow_dispatch:
5 |
6 | jobs:
7 | check-required-fields:
8 | runs-on: ubuntu-latest
9 | steps:
10 | - name: Checkout repository
11 | uses: actions/checkout@v2
12 |
13 | - name: Comment on Issues Missing Required Fields
14 | uses: actions/github-script@v6
15 | with:
16 | script: |
17 | const issue = context.payload.issue;
18 | const issueLabels = issue.labels.map(label => label.name);
19 | const hasRelevantLabel = issueLabels.includes('failed-test') || issueLabels.includes('verified-test');
20 |
21 | // Proceed only if the issue has a relevant label
22 | if (!hasRelevantLabel) {
23 | console.log("Issue does not have relevant labels. Skipping.");
24 | return;
25 | }
26 |
27 | const requiredFields = [
28 | "Browser:",
29 | "OS:",
30 | "Adblock Solution",
31 | "Description of Issue:",
32 | "Test Result:",
33 | ];
34 |
35 | // Helper function to check if a required field is actually filled
36 | const isFieldMissing = (field) => {
37 | // Regex to find the field and any subsequent text
38 | const fieldRegex = new RegExp(`${field}\\s*:\\s*(.+)`);
39 | const match = issue.body.match(fieldRegex);
40 |
41 | // Check if the field is present and has content after the colon
42 | return !match || match[1].trim().length === 0;
43 | };
44 |
45 | // Find all missing fields
46 | const missingFields = requiredFields.filter(isFieldMissing);
47 |
48 | // If there are missing fields, post a comment
49 | if (missingFields.length > 0) {
50 | const commentBody = `Hello @${issue.user.login}, it looks like your issue is missing some required information: \n- ${missingFields.join("\n- ")}\nPlease update your issue to include this information.`;
51 | await github.rest.issues.createComment({
52 | issue_number: issue.number,
53 | owner: context.repo.owner,
54 | repo: context.repo.repo,
55 | body: commentBody
56 | });
57 | } else {
58 | console.log("Issue contains all required fields.");
59 | }
60 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | /dist
3 | /.vscode
4 | .DS_Store
5 |
6 | .env
7 | .env.local
8 | .env.development
--------------------------------------------------------------------------------
/.prettierrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | printWidth: 80,
3 | bracketSpacing: true,
4 | semi: false,
5 | singleQuote: true,
6 | tabWidth: 4,
7 | trailingComma: 'none',
8 | useTabs: true
9 | }
10 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ⚠️ Project Archived
2 |
3 | This project is no longer maintained and has been archived.
4 | Thank you for your support and for being part of this journey. ❤️
5 |
6 | # Toolz
7 |
8 |
9 |
11 |
12 | A set of testing and verification tools, with simple and beautiful design
13 |
14 | ## Ad Block Test [Link](https://d3ward.github.io/toolz/adblock)
15 | This tool allows you to check if your adblock solution is blocking enough hosts. With a simple UI and easy UX you can check how much you have blocked. The tool tries to connect to the most common domains for different categories (ads, analytics, bug tracking, social trackers, mix and OEMs).
16 |
17 | If you don't block all the hosts but you want to , you can use
18 | - My hosts txt list -> [d3Host.txt](https://raw.githubusercontent.com/d3ward/toolz/master/src/d3host.txt)
19 | - Compressed adblock version -> [d3Host.adblock](https://raw.githubusercontent.com/d3ward/toolz/master/src/d3host.adblock)
20 |
21 | d3Host list is also included in
22 | - [Blokada](https://blokada.org/)
23 | - [OISD List](https://oisd.nl/)
24 |
25 |
26 | ## Units Test of Viewport [Link](https://d3ward.github.io/toolz/units)
27 | This tool is useful for testing different units for expressing a length in CSS.
28 | One of them is the 'vh', where 100vh should be 100%, but on mobile browsers it isn't. Over the years, there has been a lot of talk about this problem on mobile browsers, mainly on Safari which uses WebKit, but Chromium browsers are affected as well. In addition to the test, there are in-depth studies and solutions available.
29 |
30 | ## Fontlist [Link](https://d3ward.github.io/toolz/fontlist)
31 | This tool allows you to check the list of web safe fonts supported by your browser. These are the fonts that are installed by default on virtually every computer or mobile device. This is what makes them "safe". No matter where you are in the world or what device you are using, a web safe font will always load and display correctly.
32 |
33 |
34 | ## Contributing
35 |
36 | If you have any problems with any of the tools, feel free to share them by opening an issue.
37 | You can also suggest a new test tool to be created or added. Contributions are welcome and encouraged.
38 |
39 |
40 | ## License
41 |
42 | Toolz is licensed under [(CC BY-NC-SA 4.0)](https://creativecommons.org/licenses/by-nc-sa/4.0/)
43 |
--------------------------------------------------------------------------------
/config/config.js:
--------------------------------------------------------------------------------
1 | const path = require('path')
2 | module.exports = {
3 | src: path.resolve(__dirname, '../src'),
4 | build: path.resolve(__dirname, '../dist'),
5 | public: path.resolve(__dirname, '../src'),
6 | pages: ['index', 'fontlist', 'units', 'adblock', '404']
7 | }
8 |
--------------------------------------------------------------------------------
/config/purgecss.mjs:
--------------------------------------------------------------------------------
1 | import { PurgeCSS } from 'purgecss'
2 | import path from 'path'
3 | import config from './config.js' // Make sure the config file is also compatible with ESM
4 | import fs from 'fs'
5 | import chalk from 'chalk'
6 |
7 | const pages = config.pages
8 | const options = pages.map((page) => {
9 | const css = path.join(config.build, `css/${page}.css`)
10 | const content = [
11 | path.join(config.build, `${page}.html`),
12 | path.join(config.build, `js/${page}.js`)
13 | ]
14 | return {
15 | css: [css],
16 | content: content
17 | }
18 | })
19 |
20 | Promise.all(options.map((option) => new PurgeCSS().purge(option))).then(
21 | (results) => {
22 | results.forEach((result, i) => {
23 | const css = result[0].css
24 | const cssFile = path.join(config.build, `css/${pages[i]}.css`)
25 | console.log(chalk.green(`File: ${cssFile}`))
26 | console.log(
27 | `Original size: ${(
28 | fs.statSync(path.join(config.build, `css/${pages[i]}.css`))
29 | .size / 1024
30 | ).toFixed(2)}KB`
31 | )
32 | console.log(`Optimized size: ${(css.length / 1024).toFixed(2)}KB`)
33 | fs.writeFileSync(cssFile, css)
34 | })
35 | }
36 | )
37 |
--------------------------------------------------------------------------------
/config/webpack.dev.js:
--------------------------------------------------------------------------------
1 | const main = require('./webpack.main')
2 | const { merge } = require('webpack-merge')
3 | const config = require('./config')
4 |
5 | module.exports = merge(main, {
6 | mode: 'development',
7 | devServer: {
8 | static: {
9 | directory: config.dist,
10 | publicPath: '/'
11 | },
12 | compress: true,
13 | port: 3000,
14 | hot: true,
15 | open: '/toolz/',
16 | historyApiFallback: true
17 | }
18 | })
19 |
--------------------------------------------------------------------------------
/config/webpack.main.js:
--------------------------------------------------------------------------------
1 | const HTMLWebpackPlugin = require('html-webpack-plugin')
2 | const CopyWebpackPlugin = require('copy-webpack-plugin')
3 | const MiniCssExtractPlugin = require('mini-css-extract-plugin')
4 | const config = require('./config')
5 | const pages = config.pages
6 |
7 | module.exports = {
8 | context: config.src,
9 | entry: {
10 | ...pages.reduce((acc, page) => {
11 | acc[page] = `./js/${page}.js`
12 | return acc
13 | }, {})
14 | },
15 | output: {
16 | filename: 'js/[name].js',
17 | path: config.build,
18 | clean: false,
19 | assetModuleFilename: '[path][name][ext]',
20 | publicPath: '/toolz/'
21 | },
22 | plugins: [
23 | new CopyWebpackPlugin({
24 | patterns: [
25 | {
26 | from: './assets',
27 | to: 'assets',
28 | globOptions: {
29 | ignore: [
30 | '*.DS_Store',
31 | '**/css/*.css',
32 | '**/js/*.js',
33 | '**/*.html'
34 | ]
35 | },
36 | noErrorOnMissing: true
37 | }
38 | ]
39 | }),
40 | new MiniCssExtractPlugin({
41 | filename: 'css/[name].css',
42 | chunkFilename: '[name].css'
43 | }),
44 | ...pages.map(
45 | (page) =>
46 | new HTMLWebpackPlugin({
47 | template: `./${page}.ejs`,
48 | filename: `${page}.html`,
49 | chunks: [page],
50 | minify: false,
51 | sources: false
52 | })
53 | )
54 | ],
55 | module: {
56 | rules: [
57 | {
58 | test: /\.(png|svg|jpg|jpeg|gif)$/i,
59 | type: 'asset/resource'
60 | },
61 | {
62 | test: /\.ejs$/i,
63 | use: ['html-loader', 'template-ejs-loader']
64 | },
65 | {
66 | test: /\.js$/,
67 | exclude: /node_modules/,
68 | use: 'babel-loader'
69 | },
70 | {
71 | test: /\.(sa|sc|c)ss$/,
72 | use: [
73 | MiniCssExtractPlugin.loader, // Extract CSS from commonjs
74 | 'css-loader', // Turn css into commonjs
75 | 'sass-loader' // Turn scss into css
76 | ]
77 | }
78 | ]
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/config/webpack.prod.js:
--------------------------------------------------------------------------------
1 | const main = require('./webpack.main')
2 | const { merge } = require('webpack-merge')
3 | const { CleanWebpackPlugin } = require('clean-webpack-plugin')
4 | const TerserPlugin = require('terser-webpack-plugin')
5 |
6 | module.exports = merge(main, {
7 | mode: 'production',
8 | optimization: {
9 | minimize: true,
10 | minimizer: [
11 | new TerserPlugin({
12 | test: /\.js(\?.*)?$/i
13 | })
14 | ]
15 | },
16 | plugins: [new CleanWebpackPlugin()]
17 | })
18 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "toolz",
3 | "version": "3.1.2",
4 | "description": "A set of accessible web tools",
5 | "scripts": {
6 | "dev": "webpack serve --config config/webpack.dev.js",
7 | "build": "webpack --config config/webpack.prod.js",
8 | "build-list": "node src/script/build_list.js",
9 | "purge": "node config/purgecss.mjs",
10 | "format": "prettier --write '**/*.{js,ts}'",
11 | "lint": "eslint 'src/**/*.{js,ts}' && echo 'Linting complete!'",
12 | "lint-fix": "eslint 'src/**/*.{js,ts}' --fix"
13 | },
14 | "author": "Eduard Ursu",
15 | "license": "(CC BY-NC-SA 4.0)",
16 | "bugs": {
17 | "url": "https://github.com/d3ward/toolz/issues"
18 | },
19 | "dependencies": {
20 | "@babel/core": "^7.22.5",
21 | "@babel/preset-env": "^7.22.5",
22 | "babel-loader": "^9.1.2",
23 | "clean-webpack-plugin": "^4.0.0",
24 | "copy-webpack-plugin": "^11.0.0",
25 | "css-loader": "^6.8.1",
26 | "css-minimizer-webpack-plugin": "^5.0.1",
27 | "eslint": "^8.43.0",
28 | "eslint-config-prettier": "^8.8.0",
29 | "eslint-plugin-prettier": "^4.2.1",
30 | "eslint-webpack-plugin": "^4.0.1",
31 | "file-loader": "^6.2.0",
32 | "glob": "^10.3.0",
33 | "glob-all": "^3.3.1",
34 | "html-loader": "^4.2.0",
35 | "html-webpack-plugin": "^5.5.3",
36 | "mini-css-extract-plugin": "^2.7.6",
37 | "node-sass": "^9.0.0",
38 | "postcss": "^8.4.31",
39 | "prettier": "^2.8.8",
40 | "purgecss-webpack-plugin": "^5.0.0",
41 | "reachable-url": "^1.7.1",
42 | "sass": "^1.63.6",
43 | "sass-loader": "^13.3.2",
44 | "style-loader": "^3.3.3",
45 | "webpack-dev-server": "^4.15.1",
46 | "webpack-merge": "^5.9.0"
47 | },
48 | "devDependencies": {
49 | "ejs": "^3.1.10",
50 | "template-ejs-loader": "^0.9.4",
51 | "webpack": "^5.95.0",
52 | "webpack-cli": "^5.1.4"
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/src/404.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | <%- include('partials/head.ejs',
5 | {
6 | page: '404',
7 | title:'Toolz by d3ward - 404',
8 | description:'Page not found',
9 | url: 'd3ward.github.io/toolz/',
10 | preview_thumbnail:'https://d3ward.github.io/toolz/src/preview_toolz.png',
11 | keywords:'toolz,web tools,tools,browser testing,font testing,viewport testing,adblock testing, ad blocker testing,performance,toolkit,web design,open source'
12 | }) %>
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
56 |
57 |
99 |
100 |
101 | <%- include('partials/footer.ejs') %>
102 | <%- include('partials/gotop.ejs') %>
103 |
104 |
105 |
--------------------------------------------------------------------------------
/src/adblock.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 | <%- include('partials/head.ejs',
4 | {
5 | page:'adblock',
6 | title:'Test Ad Block - Toolz',
7 | description:'Project Archived',
8 | url: 'd3ward.github.io/toolz/adblock',
9 | preview_thumbnail:'https://d3ward.github.io/toolz/src/preview_toolz.png',
10 | keywords:'adblock test,ad block test,ad blocker test,adblock,test adblock,analytics,trackers,ads,cosmetic filter,ublock, ublockorigin,adblock extension,script loading'
11 | }) %>
12 |
13 |
14 | <%- include('partials/support_me.ejs') %>
15 | <%- include('partials/header.ejs', {page:'adblock'}) %>
16 |
17 |
18 |
19 |
20 |
JavaScript is required to run this test. Please enable JavaScript in your browser settings.
21 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | This project is no longer maintained and has been archived.
34 | Thank you for being part of this journey and for your support.
35 |
36 |
37 |
38 |
39 | <%- include('partials/footer.ejs') %>
40 | <%- include('partials/gotop.ejs') %>
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/assets/404/404_dark.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/404/icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
--------------------------------------------------------------------------------
/src/assets/adblock/icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/assets/adblock/icon_filled.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/fontlist/fontlist_circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/fontlist/icon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/icon_.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/assets/ko-fi.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/preview_toolz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/d3ward/toolz/549acb67d78a940a131ab07c1ef521822a621389/src/assets/preview_toolz.png
--------------------------------------------------------------------------------
/src/assets/toolz/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/d3ward/toolz/549acb67d78a940a131ab07c1ef521822a621389/src/assets/toolz/icon.png
--------------------------------------------------------------------------------
/src/assets/toolz/icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
16 |
18 |
37 |
41 |
45 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/src/assets/toolz/icon_filled.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/src/assets/units/icon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/d3host.adblock:
--------------------------------------------------------------------------------
1 | ! Title: d3Host List by d3ward
2 | ! Expires: 1 days
3 | ! Description: Simple and small list with the most popular advertising, tracking, analytics and social advertising services
4 | ! Homepage: https://github.com/d3ward/toolz
5 | ! License: CC BY-NC-SA
6 | ! Source: https://github.com/d3ward/toolz/blob/master/src/d3host.adblock
7 |
8 | ! This list cover all the tests on https://d3ward.github.io/toolz/adblock
9 | ! Type : Stable
10 | ! Entries : 131
11 | ! Updated On: 23/5/2024
12 | ! Created by: d3ward
13 |
14 | !============ Ads =============
15 |
16 | ! --- Amazon
17 | ||adtago.s3.amazonaws.com^
18 | ||analyticsengine.s3.amazonaws.com^
19 | ||analytics.s3.amazonaws.com^
20 | ||advice-ads.s3.amazonaws.com^
21 |
22 | ! --- Google Ads
23 | ||pagead2.googlesyndication.com^
24 | ||adservice.google.com^
25 | ||pagead2.googleadservices.com^
26 | ||afs.googlesyndication.com^
27 |
28 | ! --- Doubleclick.net
29 | ||stats.g.doubleclick.net^
30 | ||ad.doubleclick.net^
31 | ||static.doubleclick.net^
32 | ||m.doubleclick.net^
33 | ||mediavisor.doubleclick.net^
34 |
35 | ! --- Adcolony
36 | ||ads30.adcolony.com^
37 | ||adc3-launch.adcolony.com^
38 | ||events3alt.adcolony.com^
39 | ||wd.adcolony.com^
40 |
41 | ! --- Media.net
42 | ||static.media.net^
43 | ||media.net^
44 | ||adservetx.media.net^
45 |
46 |
47 | !========= Analytics ==========
48 |
49 | ! --- Google Analytics
50 | ||analytics.google.com^
51 | ||click.googleanalytics.com^
52 | ||google-analytics.com^
53 | ||ssl.google-analytics.com^
54 |
55 | ! --- Hotjar
56 | ||adm.hotjar.com^
57 | ||identify.hotjar.com^
58 | ||insights.hotjar.com^
59 | ||script.hotjar.com^
60 | ||surveys.hotjar.com^
61 | ||careers.hotjar.com^
62 | ||events.hotjar.io^
63 |
64 | ! --- MouseFlow
65 | ||mouseflow.com^
66 | ||cdn.mouseflow.com^
67 | ||o2.mouseflow.com^
68 | ||gtm.mouseflow.com^
69 | ||api.mouseflow.com^
70 | ||tools.mouseflow.com^
71 | ||cdn-test.mouseflow.com^
72 |
73 | ! --- FreshWorks
74 | ||freshmarketer.com^
75 | ||claritybt.freshmarketer.com^
76 | ||fwtracks.freshmarketer.com^
77 |
78 | ! --- Luckyorange
79 | ||luckyorange.com^
80 | ||api.luckyorange.com^
81 | ||realtime.luckyorange.com^
82 | ||cdn.luckyorange.com^
83 | ||w1.luckyorange.com^
84 | ||upload.luckyorange.net^
85 | ||cs.luckyorange.net^
86 | ||settings.luckyorange.net^
87 |
88 | ! --- Stats WP Plugin
89 | ||stats.wp.com^
90 |
91 |
92 | !======= Error Trackers =======
93 |
94 | ! --- Bugsnag
95 | ||notify.bugsnag.com^
96 | ||sessions.bugsnag.com^
97 | ||api.bugsnag.com^
98 | ||app.bugsnag.com^
99 |
100 | ! --- Sentry
101 | ||browser.sentry-cdn.com^
102 | ||app.getsentry.com^
103 |
104 |
105 | !====== Social Trackers =======
106 |
107 | ! --- Facebook
108 | ||pixel.facebook.com^
109 | ||an.facebook.com^
110 |
111 | ! --- Twitter
112 | ||static.ads-twitter.com^
113 | ||ads-api.twitter.com^
114 |
115 | ! --- LinkedIn
116 | ||ads.linkedin.com^
117 | ||analytics.pointdrive.linkedin.com^
118 |
119 | ! --- Pinterest
120 | ||ads.pinterest.com^
121 | ||log.pinterest.com^
122 | ||analytics.pinterest.com^
123 | ||trk.pinterest.com^
124 |
125 | ! --- Reddit
126 | ||events.reddit.com^
127 | ||events.redditmedia.com^
128 |
129 | ! --- YouTube
130 | ||ads.youtube.com^
131 |
132 | ! --- TikTok
133 | ||ads-api.tiktok.com^
134 | ||analytics.tiktok.com^
135 | ||ads-sg.tiktok.com^
136 | ||analytics-sg.tiktok.com^
137 | ||business-api.tiktok.com^
138 | ||ads.tiktok.com^
139 | ||log.byteoversea.com^
140 |
141 |
142 | !============ Mix =============
143 |
144 | ! --- Yahoo
145 | ||ads.yahoo.com^
146 | ||analytics.yahoo.com^
147 | ||geo.yahoo.com^
148 | ||udc.yahoo.com^
149 | ||udcm.yahoo.com^
150 | ||analytics.query.yahoo.com^
151 | ||partnerads.ysm.yahoo.com^
152 | ||log.fc.yahoo.com^
153 | ||gemini.yahoo.com^
154 | ||adtech.yahooinc.com^
155 |
156 | ! --- Yandex
157 | ||extmaps-api.yandex.net^
158 | ||appmetrica.yandex.ru^
159 | ||adfstat.yandex.ru^
160 | ||metrika.yandex.ru^
161 | ||offerwall.yandex.net^
162 | ||adfox.yandex.ru^
163 |
164 | ! --- Unity
165 | ||auction.unityads.unity3d.com^
166 | ||webview.unityads.unity3d.com^
167 | ||config.unityads.unity3d.com^
168 | ||adserver.unityads.unity3d.com^
169 |
170 |
171 | !============ OEMs ============
172 |
173 | ! --- Realme
174 | ||iot-eu-logser.realme.com^
175 | ||iot-logser.realme.com^
176 | ||bdapi-ads.realmemobile.com^
177 | ||bdapi-in-ads.realmemobile.com^
178 |
179 | ! --- Xiaomi
180 | ||api.ad.xiaomi.com^
181 | ||data.mistat.xiaomi.com^
182 | ||data.mistat.india.xiaomi.com^
183 | ||data.mistat.rus.xiaomi.com^
184 | ||sdkconfig.ad.xiaomi.com^
185 | ||sdkconfig.ad.intl.xiaomi.com^
186 | ||tracking.rus.miui.com^
187 |
188 | ! --- Oppo
189 | ||adsfs.oppomobile.com^
190 | ||adx.ads.oppomobile.com^
191 | ||ck.ads.oppomobile.com^
192 | ||data.ads.oppomobile.com^
193 |
194 | ! --- Huawei
195 | ||metrics.data.hicloud.com^
196 | ||metrics2.data.hicloud.com^
197 | ||grs.hicloud.com^
198 | ||logservice.hicloud.com^
199 | ||logservice1.hicloud.com^
200 | ||logbak.hicloud.com^
201 |
202 | ! --- OnePlus
203 | ||click.oneplus.cn^
204 | ||open.oneplus.net^
205 |
206 | ! --- Samsung
207 | ||samsungads.com^
208 | ||smetrics.samsung.com^
209 | ||nmetrics.samsung.com^
210 | ||samsung-com.112.2o7.net^
211 | ||analytics-api.samsunghealthcn.com^
212 |
213 | ! --- Apple
214 | ||iadsdk.apple.com^
215 | ||metrics.icloud.com^
216 | ||metrics.mzstatic.com^
217 | ||api-adservices.apple.com^
218 | ||books-analytics-events.apple.com^
219 | ||weather-analytics-events.apple.com^
220 | ||notes-analytics-events.apple.com^
221 |
222 | *$3p,domain=d3ward.github.io
223 | /pagead.js$domain=d3ward.github.io
224 | @@*$redirect-rule,domain=d3ward.github.io
225 | d3ward.github.io##.textads
--------------------------------------------------------------------------------
/src/d3host.txt:
--------------------------------------------------------------------------------
1 | # Title: d3Host List by d3ward
2 | # Expires: 1 days
3 | # Description: Simple and small list with the most popular advertising, tracking, analytics and social advertising services
4 | # Homepage: https://github.com/d3ward/toolz
5 | # License: CC BY-NC-SA
6 | # Source: https://github.com/d3ward/toolz/blob/master/src/d3host.txt
7 |
8 | # This list cover all the tests on https://d3ward.github.io/toolz/adblock
9 | # Type : Stable
10 | # Entries : 131
11 | # Updated On: 23/5/2024
12 | # Created by: d3ward
13 |
14 | #============ Ads =============
15 |
16 | # --- Amazon
17 | 0.0.0.0 adtago.s3.amazonaws.com
18 | 0.0.0.0 analyticsengine.s3.amazonaws.com
19 | 0.0.0.0 analytics.s3.amazonaws.com
20 | 0.0.0.0 advice-ads.s3.amazonaws.com
21 |
22 | # --- Google Ads
23 | 0.0.0.0 pagead2.googlesyndication.com
24 | 0.0.0.0 adservice.google.com
25 | 0.0.0.0 pagead2.googleadservices.com
26 | 0.0.0.0 afs.googlesyndication.com
27 |
28 | # --- Doubleclick.net
29 | 0.0.0.0 stats.g.doubleclick.net
30 | 0.0.0.0 ad.doubleclick.net
31 | 0.0.0.0 static.doubleclick.net
32 | 0.0.0.0 m.doubleclick.net
33 | 0.0.0.0 mediavisor.doubleclick.net
34 |
35 | # --- Adcolony
36 | 0.0.0.0 ads30.adcolony.com
37 | 0.0.0.0 adc3-launch.adcolony.com
38 | 0.0.0.0 events3alt.adcolony.com
39 | 0.0.0.0 wd.adcolony.com
40 |
41 | # --- Media.net
42 | 0.0.0.0 static.media.net
43 | 0.0.0.0 media.net
44 | 0.0.0.0 adservetx.media.net
45 |
46 |
47 | #========= Analytics ==========
48 |
49 | # --- Google Analytics
50 | 0.0.0.0 analytics.google.com
51 | 0.0.0.0 click.googleanalytics.com
52 | 0.0.0.0 google-analytics.com
53 | 0.0.0.0 ssl.google-analytics.com
54 |
55 | # --- Hotjar
56 | 0.0.0.0 adm.hotjar.com
57 | 0.0.0.0 identify.hotjar.com
58 | 0.0.0.0 insights.hotjar.com
59 | 0.0.0.0 script.hotjar.com
60 | 0.0.0.0 surveys.hotjar.com
61 | 0.0.0.0 careers.hotjar.com
62 | 0.0.0.0 events.hotjar.io
63 |
64 | # --- MouseFlow
65 | 0.0.0.0 mouseflow.com
66 | 0.0.0.0 cdn.mouseflow.com
67 | 0.0.0.0 o2.mouseflow.com
68 | 0.0.0.0 gtm.mouseflow.com
69 | 0.0.0.0 api.mouseflow.com
70 | 0.0.0.0 tools.mouseflow.com
71 | 0.0.0.0 cdn-test.mouseflow.com
72 |
73 | # --- FreshWorks
74 | 0.0.0.0 freshmarketer.com
75 | 0.0.0.0 claritybt.freshmarketer.com
76 | 0.0.0.0 fwtracks.freshmarketer.com
77 |
78 | # --- Luckyorange
79 | 0.0.0.0 luckyorange.com
80 | 0.0.0.0 api.luckyorange.com
81 | 0.0.0.0 realtime.luckyorange.com
82 | 0.0.0.0 cdn.luckyorange.com
83 | 0.0.0.0 w1.luckyorange.com
84 | 0.0.0.0 upload.luckyorange.net
85 | 0.0.0.0 cs.luckyorange.net
86 | 0.0.0.0 settings.luckyorange.net
87 |
88 | # --- Stats WP Plugin
89 | 0.0.0.0 stats.wp.com
90 |
91 |
92 | #======= Error Trackers =======
93 |
94 | # --- Bugsnag
95 | 0.0.0.0 notify.bugsnag.com
96 | 0.0.0.0 sessions.bugsnag.com
97 | 0.0.0.0 api.bugsnag.com
98 | 0.0.0.0 app.bugsnag.com
99 |
100 | # --- Sentry
101 | 0.0.0.0 browser.sentry-cdn.com
102 | 0.0.0.0 app.getsentry.com
103 |
104 |
105 | #====== Social Trackers =======
106 |
107 | # --- Facebook
108 | 0.0.0.0 pixel.facebook.com
109 | 0.0.0.0 an.facebook.com
110 |
111 | # --- Twitter
112 | 0.0.0.0 static.ads-twitter.com
113 | 0.0.0.0 ads-api.twitter.com
114 |
115 | # --- LinkedIn
116 | 0.0.0.0 ads.linkedin.com
117 | 0.0.0.0 analytics.pointdrive.linkedin.com
118 |
119 | # --- Pinterest
120 | 0.0.0.0 ads.pinterest.com
121 | 0.0.0.0 log.pinterest.com
122 | 0.0.0.0 analytics.pinterest.com
123 | 0.0.0.0 trk.pinterest.com
124 |
125 | # --- Reddit
126 | 0.0.0.0 events.reddit.com
127 | 0.0.0.0 events.redditmedia.com
128 |
129 | # --- YouTube
130 | 0.0.0.0 ads.youtube.com
131 |
132 | # --- TikTok
133 | 0.0.0.0 ads-api.tiktok.com
134 | 0.0.0.0 analytics.tiktok.com
135 | 0.0.0.0 ads-sg.tiktok.com
136 | 0.0.0.0 analytics-sg.tiktok.com
137 | 0.0.0.0 business-api.tiktok.com
138 | 0.0.0.0 ads.tiktok.com
139 | 0.0.0.0 log.byteoversea.com
140 |
141 |
142 | #============ Mix =============
143 |
144 | # --- Yahoo
145 | 0.0.0.0 ads.yahoo.com
146 | 0.0.0.0 analytics.yahoo.com
147 | 0.0.0.0 geo.yahoo.com
148 | 0.0.0.0 udc.yahoo.com
149 | 0.0.0.0 udcm.yahoo.com
150 | 0.0.0.0 analytics.query.yahoo.com
151 | 0.0.0.0 partnerads.ysm.yahoo.com
152 | 0.0.0.0 log.fc.yahoo.com
153 | 0.0.0.0 gemini.yahoo.com
154 | 0.0.0.0 adtech.yahooinc.com
155 |
156 | # --- Yandex
157 | 0.0.0.0 extmaps-api.yandex.net
158 | 0.0.0.0 appmetrica.yandex.ru
159 | 0.0.0.0 adfstat.yandex.ru
160 | 0.0.0.0 metrika.yandex.ru
161 | 0.0.0.0 offerwall.yandex.net
162 | 0.0.0.0 adfox.yandex.ru
163 |
164 | # --- Unity
165 | 0.0.0.0 auction.unityads.unity3d.com
166 | 0.0.0.0 webview.unityads.unity3d.com
167 | 0.0.0.0 config.unityads.unity3d.com
168 | 0.0.0.0 adserver.unityads.unity3d.com
169 |
170 |
171 | #============ OEMs ============
172 |
173 | # --- Realme
174 | 0.0.0.0 iot-eu-logser.realme.com
175 | 0.0.0.0 iot-logser.realme.com
176 | 0.0.0.0 bdapi-ads.realmemobile.com
177 | 0.0.0.0 bdapi-in-ads.realmemobile.com
178 |
179 | # --- Xiaomi
180 | 0.0.0.0 api.ad.xiaomi.com
181 | 0.0.0.0 data.mistat.xiaomi.com
182 | 0.0.0.0 data.mistat.india.xiaomi.com
183 | 0.0.0.0 data.mistat.rus.xiaomi.com
184 | 0.0.0.0 sdkconfig.ad.xiaomi.com
185 | 0.0.0.0 sdkconfig.ad.intl.xiaomi.com
186 | 0.0.0.0 tracking.rus.miui.com
187 |
188 | # --- Oppo
189 | 0.0.0.0 adsfs.oppomobile.com
190 | 0.0.0.0 adx.ads.oppomobile.com
191 | 0.0.0.0 ck.ads.oppomobile.com
192 | 0.0.0.0 data.ads.oppomobile.com
193 |
194 | # --- Huawei
195 | 0.0.0.0 metrics.data.hicloud.com
196 | 0.0.0.0 metrics2.data.hicloud.com
197 | 0.0.0.0 grs.hicloud.com
198 | 0.0.0.0 logservice.hicloud.com
199 | 0.0.0.0 logservice1.hicloud.com
200 | 0.0.0.0 logbak.hicloud.com
201 |
202 | # --- OnePlus
203 | 0.0.0.0 click.oneplus.cn
204 | 0.0.0.0 open.oneplus.net
205 |
206 | # --- Samsung
207 | 0.0.0.0 samsungads.com
208 | 0.0.0.0 smetrics.samsung.com
209 | 0.0.0.0 nmetrics.samsung.com
210 | 0.0.0.0 samsung-com.112.2o7.net
211 | 0.0.0.0 analytics-api.samsunghealthcn.com
212 |
213 | # --- Apple
214 | 0.0.0.0 iadsdk.apple.com
215 | 0.0.0.0 metrics.icloud.com
216 | 0.0.0.0 metrics.mzstatic.com
217 | 0.0.0.0 api-adservices.apple.com
218 | 0.0.0.0 books-analytics-events.apple.com
219 | 0.0.0.0 weather-analytics-events.apple.com
220 | 0.0.0.0 notes-analytics-events.apple.com
221 |
--------------------------------------------------------------------------------
/src/data/adblock_data.json:
--------------------------------------------------------------------------------
1 | {
2 | "Ads": {
3 | "Amazon": [
4 | "adtago.s3.amazonaws.com",
5 | "analyticsengine.s3.amazonaws.com",
6 | "analytics.s3.amazonaws.com",
7 | "advice-ads.s3.amazonaws.com"
8 | ],
9 | "Google Ads": [
10 | "pagead2.googlesyndication.com",
11 | "adservice.google.com",
12 | "pagead2.googleadservices.com",
13 | "afs.googlesyndication.com"
14 | ],
15 | "Doubleclick.net": [
16 | "stats.g.doubleclick.net",
17 | "ad.doubleclick.net",
18 | "static.doubleclick.net",
19 | "m.doubleclick.net",
20 | "mediavisor.doubleclick.net"
21 | ],
22 | "Adcolony":[
23 | "ads30.adcolony.com",
24 | "adc3-launch.adcolony.com",
25 | "events3alt.adcolony.com",
26 | "wd.adcolony.com"
27 | ],
28 | "Media.net": [
29 | "static.media.net",
30 | "media.net",
31 | "adservetx.media.net"
32 | ]
33 | },
34 | "Analytics": {
35 | "Google Analytics": [
36 | "analytics.google.com",
37 | "click.googleanalytics.com",
38 | "google-analytics.com",
39 | "ssl.google-analytics.com"
40 | ],
41 | "Hotjar": [
42 | "adm.hotjar.com",
43 | "identify.hotjar.com",
44 | "insights.hotjar.com",
45 | "script.hotjar.com",
46 | "surveys.hotjar.com",
47 | "careers.hotjar.com",
48 | "events.hotjar.io"
49 | ],
50 | "MouseFlow": [
51 | "mouseflow.com",
52 | "cdn.mouseflow.com",
53 | "o2.mouseflow.com",
54 | "gtm.mouseflow.com",
55 | "api.mouseflow.com",
56 | "tools.mouseflow.com",
57 | "cdn-test.mouseflow.com"
58 | ],
59 | "FreshWorks": [
60 | "freshmarketer.com",
61 | "claritybt.freshmarketer.com",
62 | "fwtracks.freshmarketer.com"
63 | ],
64 | "Luckyorange": [
65 | "luckyorange.com",
66 | "api.luckyorange.com",
67 | "realtime.luckyorange.com",
68 | "cdn.luckyorange.com",
69 | "w1.luckyorange.com",
70 | "upload.luckyorange.net",
71 | "cs.luckyorange.net",
72 | "settings.luckyorange.net"
73 | ],
74 | "Stats WP Plugin": [
75 | "stats.wp.com"
76 | ]
77 | },
78 | "Error Trackers": {
79 | "Bugsnag": [
80 | "notify.bugsnag.com",
81 | "sessions.bugsnag.com",
82 | "api.bugsnag.com",
83 | "app.bugsnag.com"
84 | ],
85 | "Sentry": [
86 | "browser.sentry-cdn.com",
87 | "app.getsentry.com"
88 | ]
89 | },
90 | "Social Trackers": {
91 | "Facebook": [
92 | "pixel.facebook.com",
93 | "an.facebook.com"
94 | ],
95 | "Twitter": [
96 | "static.ads-twitter.com",
97 | "ads-api.twitter.com"
98 | ],
99 | "LinkedIn": [
100 | "ads.linkedin.com",
101 | "analytics.pointdrive.linkedin.com"
102 | ],
103 | "Pinterest": [
104 | "ads.pinterest.com",
105 | "log.pinterest.com",
106 | "analytics.pinterest.com",
107 | "trk.pinterest.com"
108 | ],
109 | "Reddit": [
110 | "events.reddit.com",
111 | "events.redditmedia.com"
112 | ],
113 | "YouTube": [
114 | "ads.youtube.com"
115 | ],
116 | "TikTok": [
117 | "ads-api.tiktok.com",
118 | "analytics.tiktok.com",
119 | "ads-sg.tiktok.com",
120 | "analytics-sg.tiktok.com",
121 | "business-api.tiktok.com",
122 | "ads.tiktok.com",
123 | "log.byteoversea.com"
124 | ]
125 | },
126 | "Mix": {
127 | "Yahoo": [
128 | "ads.yahoo.com",
129 | "analytics.yahoo.com",
130 | "geo.yahoo.com",
131 | "udc.yahoo.com",
132 | "udcm.yahoo.com",
133 | "analytics.query.yahoo.com",
134 | "partnerads.ysm.yahoo.com",
135 | "log.fc.yahoo.com",
136 | "gemini.yahoo.com",
137 | "adtech.yahooinc.com"
138 | ],
139 | "Yandex": [
140 | "extmaps-api.yandex.net",
141 | "appmetrica.yandex.ru",
142 | "adfstat.yandex.ru",
143 | "metrika.yandex.ru",
144 | "offerwall.yandex.net",
145 | "adfox.yandex.ru"
146 | ],
147 | "Unity":[
148 | "auction.unityads.unity3d.com",
149 | "webview.unityads.unity3d.com",
150 | "config.unityads.unity3d.com",
151 | "adserver.unityads.unity3d.com"
152 | ]
153 | },
154 | "OEMs": {
155 | "Realme": [
156 | "iot-eu-logser.realme.com",
157 | "iot-logser.realme.com",
158 | "bdapi-ads.realmemobile.com",
159 | "bdapi-in-ads.realmemobile.com"
160 | ],
161 | "Xiaomi": [
162 | "api.ad.xiaomi.com",
163 | "data.mistat.xiaomi.com",
164 | "data.mistat.india.xiaomi.com",
165 | "data.mistat.rus.xiaomi.com",
166 | "sdkconfig.ad.xiaomi.com",
167 | "sdkconfig.ad.intl.xiaomi.com",
168 | "tracking.rus.miui.com"
169 | ],
170 | "Oppo": [
171 | "adsfs.oppomobile.com",
172 | "adx.ads.oppomobile.com",
173 | "ck.ads.oppomobile.com",
174 | "data.ads.oppomobile.com"
175 | ],
176 | "Huawei": [
177 | "metrics.data.hicloud.com",
178 | "metrics2.data.hicloud.com",
179 | "grs.hicloud.com",
180 | "logservice.hicloud.com",
181 | "logservice1.hicloud.com",
182 | "logbak.hicloud.com"
183 | ],
184 | "OnePlus": [
185 | "click.oneplus.cn",
186 | "open.oneplus.net"
187 | ],
188 | "Samsung": [
189 | "samsungads.com",
190 | "smetrics.samsung.com",
191 | "nmetrics.samsung.com",
192 | "samsung-com.112.2o7.net",
193 | "analytics-api.samsunghealthcn.com"
194 | ],
195 | "Apple": [
196 | "iadsdk.apple.com",
197 | "metrics.icloud.com",
198 | "metrics.mzstatic.com",
199 | "api-adservices.apple.com",
200 | "books-analytics-events.apple.com",
201 | "weather-analytics-events.apple.com",
202 | "notes-analytics-events.apple.com"
203 | ]
204 | }
205 | }
--------------------------------------------------------------------------------
/src/data/font_list.js:
--------------------------------------------------------------------------------
1 | export const font_list = [
2 | 'Abadi MT Condensed Light',
3 | 'Albertus Extra Bold',
4 | 'Albertus Medium',
5 | 'Amazone BT',
6 | 'AmerType Md BT',
7 | 'American Typewriter',
8 | 'Andale Mono',
9 | 'Antique Olive',
10 | 'Arial',
11 | 'Arial Black',
12 | 'Arial MT',
13 | 'Arial Narrow',
14 | 'Arial Rounded MT Bold',
15 | 'Arial Unicode MS',
16 | 'Arrus BT',
17 | 'Aurora Cn BT',
18 | 'AvantGarde Bk BT',
19 | 'AvantGarde Md BT',
20 | 'Avenir',
21 | 'Avenir Next',
22 | 'Avenir Next Condensed',
23 | 'Bahnschrift',
24 | 'BankGothic Md BT',
25 | 'Baskerville',
26 | 'Bazooka',
27 | 'Benguiat Bk BT',
28 | 'BernhardFashion BT',
29 | 'BernhardMod BT',
30 | 'Big Caslon',
31 | 'BinnerD',
32 | 'Bodoni 72',
33 | 'Bodoni 72 Oldstyle',
34 | 'Bodoni 72 Smallcaps',
35 | 'Book Antiqua',
36 | 'Bookman Old Style',
37 | 'Boulder',
38 | 'Bradley Hand',
39 | 'Bremen Bd BT',
40 | 'Brush Script MT',
41 | 'CG Omega',
42 | 'CG Times',
43 | 'Calibri',
44 | 'Calisto MT',
45 | 'Calligrapher',
46 | 'Cambria',
47 | 'Cambria Math',
48 | 'Candara',
49 | 'CaslonOpnface BT',
50 | 'Century Gothic',
51 | 'Century Schoolbook',
52 | 'Cezanne',
53 | 'Chalkboard',
54 | 'Chalkboard SE',
55 | 'Chalkduster',
56 | 'Charlesworth',
57 | 'Charter',
58 | 'Charter BT',
59 | 'Charter Bd BT',
60 | 'Chaucer',
61 | 'ChelthmITC Bk BT',
62 | 'Clarendon Condensed',
63 | 'CloisterBlack BT',
64 | 'Cochin',
65 | 'Comic Sans MS',
66 | 'Consolas',
67 | 'Constantia',
68 | 'CopperplGoth Bd BT',
69 | 'Copperplate',
70 | 'Copperplate Gothic Bold',
71 | 'Copperplate Gothic Light',
72 | 'Corbel',
73 | 'Cornerstone',
74 | 'Coronet',
75 | 'Courier',
76 | 'Courier New',
77 | 'Cuckoo',
78 | 'DIN Alternate',
79 | 'DIN Condensed',
80 | 'Dauphin',
81 | 'Denmark',
82 | 'Didot',
83 | 'Ebrima',
84 | 'English 111 Vivace BT',
85 | 'EngraversGothic BT',
86 | 'Exotc350 Bd BT',
87 | 'Franklin Gothic Medium',
88 | 'Fransiscan',
89 | 'Freefrm721 Blk BT',
90 | 'FrnkGothITC Bk BT',
91 | 'Futura',
92 | 'Futura Bk BT',
93 | 'Futura Lt BT',
94 | 'Futura Md BT',
95 | 'Futura ZBlk BT',
96 | 'FuturaBlack BT',
97 | 'Gabriola',
98 | 'Gadugi',
99 | 'Galliard BT',
100 | 'Garamond',
101 | 'Geneva',
102 | 'GeoSlab 703 Lt BT',
103 | 'GeoSlab 703 XBd BT',
104 | 'Geometr231 BT',
105 | 'Geometr231 Hv BT',
106 | 'Geometr231 Lt BT',
107 | 'Georgia',
108 | 'Gill Sans',
109 | 'GoudyHandtooled BT',
110 | 'GoudyOLSt BT',
111 | 'Haettenschweiler',
112 | 'Heather',
113 | 'Helvetica',
114 | 'Helvetica Neue',
115 | 'Herald',
116 | 'Herculanum',
117 | 'Hoefler Text',
118 | 'HoloLens MDL2 Assets',
119 | 'Humanst 521 Cn BT',
120 | 'Humanst521 BT',
121 | 'Humanst521 Lt BT',
122 | 'Impact',
123 | 'Incised901 BT',
124 | 'Incised901 Bd BT',
125 | 'Incised901 Lt BT',
126 | 'Informal011 BT',
127 | 'Ink Free',
128 | 'Javanese Text',
129 | 'Jester',
130 | 'Kabel Bk BT',
131 | 'Kabel Ult BT',
132 | 'Kaufmann BT',
133 | 'Kaufmann Bd BT',
134 | 'Korinna BT',
135 | 'Leelawadee UI',
136 | 'Letter Gothic',
137 | 'Lithograph',
138 | 'Lithograph Light',
139 | 'Long Island',
140 | 'Lucida Console',
141 | 'Lucida Grande',
142 | 'Lucida Handwriting',
143 | 'Lucida Sans',
144 | 'Lucida Sans Unicode',
145 | 'Luminari',
146 | 'Lydian BT',
147 | 'MS Gothic',
148 | 'MS LineDraw',
149 | 'MV Boli',
150 | 'Malgun Gothic',
151 | 'Marigold',
152 | 'Marker Felt',
153 | 'Market',
154 | 'Marlett',
155 | 'Matisse ITC',
156 | 'Menlo',
157 | 'Microsoft Himalaya',
158 | 'Microsoft JhengHei',
159 | 'Microsoft New Tai Lue',
160 | 'Microsoft PhagsPa',
161 | 'Microsoft Sans Serif',
162 | 'Microsoft Tai Le',
163 | 'Microsoft YaHei',
164 | 'Microsoft Yi Baiti',
165 | 'MingLiU-ExtB',
166 | 'Monaco',
167 | 'Mongolian Baiti',
168 | 'Monotype Corsiva',
169 | 'Myanmar Text',
170 | 'News GothicMT',
171 | 'NewsGoth BT',
172 | 'Nirmala UI',
173 | 'Noteworthy',
174 | 'OCR A Extended',
175 | 'Old Century',
176 | 'Onyx BT',
177 | 'Optima',
178 | 'OzHandicraft BT',
179 | 'PTBarnum BT',
180 | 'Palatino',
181 | 'Palatino Linotype',
182 | 'Papyrus',
183 | 'Pegasus',
184 | 'Phosphate',
185 | 'Pickwick',
186 | 'Poster',
187 | 'PosterBodoni BT',
188 | 'Pythagoras',
189 | 'Ribbon131 Bd BT',
190 | 'Rockwell',
191 | 'Savoye LET',
192 | 'Sceptre',
193 | 'Segoe MDL2 Assets',
194 | 'Segoe Print',
195 | 'Segoe Script',
196 | 'Segoe UI',
197 | 'Segoe UI Emoji',
198 | 'Segoe UI Historic',
199 | 'Segoe UI Symbol',
200 | 'Serifa BT',
201 | 'Serifa Th BT',
202 | 'ShelleyVolante BT',
203 | 'Sherwood',
204 | 'SignPainter',
205 | 'Signboard',
206 | 'SimSun',
207 | 'Sitka',
208 | 'Skia',
209 | 'Snell Roundhand',
210 | 'Socket',
211 | 'Souvenir Lt BT',
212 | 'Staccato222 BT',
213 | 'Steamer',
214 | 'Storybook',
215 | 'Subway',
216 | 'Swis721 BlkEx BT',
217 | 'Swiss911 XCm BT',
218 | 'Sylfaen',
219 | 'Symbol',
220 | 'Tahoma',
221 | 'Technical',
222 | 'Teletype',
223 | 'Tempus Sans ITC',
224 | 'Times',
225 | 'Times New Roman',
226 | 'Times New Roman PS',
227 | 'Trattatello',
228 | 'Trebuchet MS',
229 | 'Tristan',
230 | 'Tubular',
231 | 'TypoUpright BT',
232 | 'Unicorn',
233 | 'Univers',
234 | 'Univers Condensed',
235 | 'Vagabond',
236 | 'Verdana',
237 | 'Webdings',
238 | 'Westminster\tAllegro',
239 | 'Wingdings',
240 | 'Yu Gothic',
241 | 'ZapfEllipt BT',
242 | 'ZapfHumnst BT',
243 | 'ZapfHumnst Dm BT',
244 | 'Zapfino',
245 | 'Zurich BlkEx BT',
246 | 'Zurich Ex BT'
247 | ]
248 |
--------------------------------------------------------------------------------
/src/fontlist.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | <%- include('partials/head.ejs',
5 | {
6 | page:'fontlist',
7 | title:'Fontlist - Toolz',
8 | description:'Discover the full list of fonts available on your browser with this comprehensive font testing page.',
9 | url: 'd3ward.github.io/toolz/fontlist',
10 | preview_thumbnail:'https://d3ward.github.io/toolz/src/preview_toolz.png',
11 | keywords:'fonts, available, browser, test, list, web design, typography, font styles, font families, system fonts, custom fonts'
12 | }) %>
13 |
14 |
15 | <%- include('partials/adblock/changelog.ejs') %>
16 | <%- include('partials/support_me.ejs') %>
17 | <%- include('partials/header.ejs', {page:'fontlist'}) %>
18 |
19 |
20 |
21 |
22 |
23 | This project is no longer maintained and has been archived.
24 | Thank you for being part of this journey and for your support.
25 |
26 |
27 |
33 |
37 |
38 |
39 |
40 | Font Test
41 |
42 |
43 |
Click on below text to edit
44 |
45 | abcde
46 | 12345
47 |
48 |
49 |
50 |
.custom-font {
51 | font-family: Arial;
52 | font-weight: 500;
53 | font-size: 48px;
54 | letter-spacing: 0px;
55 | line-height: 1.4;
56 | }
57 |
58 |
92 |
93 |
94 |
95 |
96 |
97 |
98 | FontList
99 |
100 |
101 | Standard fonts may appear differently on different devices or operating systems, causing
102 | inconsistency in the appearance of text on a webpage.
103 | This testing tool allows you to check over 200+ standard fonts and see which ones are supported
104 | by your browser.
105 | The page displays a list of each supported font.
106 | Users can also customize the sample text and adjust font size and style options to see how the
107 | different fonts look in various settings. This tool is useful for designers, developers, and
108 | anyone looking to experiment with different fonts on their website.
109 |
110 |
111 |
112 |
113 |
114 |
115 |
119 |
120 |
121 | <%- include('partials/footer.ejs') %>
122 | <%- include('partials/gotop.ejs') %>
123 |
124 |
125 |
--------------------------------------------------------------------------------
/src/index.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 | <%- include('partials/head.ejs',
4 | {
5 | page: 'toolz',
6 | title:'Toolz by d3ward - Home',
7 | description:'Are you looking for a reliable and comprehensive toolkit for testing browser features? Look no further!'+
8 | ' Toolz is an open source project that offers a range of tools for testing everything from fonts and'+
9 | ' viewport units to the efficiency of ad blockers. With this easy-to-use interface and extensive collection of testing tools,'+
10 | ' you\'ll have everything you need to ensure that your websites, browser and applications are optimized for the best performance and user experience.',
11 | url: 'd3ward.github.io/toolz/',
12 | preview_thumbnail:'https://d3ward.github.io/toolz/src/preview_toolz.png',
13 | keywords:'toolz,web tools,tools,browser testing,font testing,viewport testing,adblock testing, ad blocker testing,performance,toolkit,web design,open source'
14 | }) %>
15 |
16 |
17 | <%- include('partials/support_me.ejs') %>
18 | <%- include('partials/adblock/changelog.ejs') %>
19 | <%- include('partials/header.ejs', {page:'index'}) %>
20 |
21 |
22 |
23 |
24 | This project is no longer maintained and has been archived.
25 | Thank you for being part of this journey and for your support.
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
Toolz
39 |
Collection of browser testing tools.
40 |
41 |
81 |
82 | <%- include('partials/footer.ejs') %>
83 | <%- include('partials/gotop.ejs') %>
84 |
85 |
86 |
87 |
--------------------------------------------------------------------------------
/src/js/404.js:
--------------------------------------------------------------------------------
1 | import '../sass/404.sass'
2 | import { themeManager } from './components/themeManager'
3 | import { gotop } from './components/gotop'
4 | import { aos } from './components/aos'
5 |
6 | // Call the function when the DOM is loaded
7 | document.addEventListener('DOMContentLoaded', () => {
8 | new themeManager()
9 | new gotop()
10 | new aos()
11 | })
12 |
--------------------------------------------------------------------------------
/src/js/adblock.js:
--------------------------------------------------------------------------------
1 | import '../sass/adblock.sass'
2 | import packageJSON from '../../package.json'
3 | import { icons } from '../data/icons'
4 | import { navbar } from './components/navbar'
5 | import A11yDialog from './components/dialog'
6 | import { themeManager } from './components/themeManager'
7 | import { gotop } from './components/gotop'
8 | import { aos } from './components/aos'
9 |
10 | import { LocalStorageManager } from './components/localStorage'
11 |
12 | var TZ = new LocalStorageManager('toolz')
13 | const version = packageJSON.version
14 | const tzversion = TZ.get('version')
15 | if (tzversion !== version) {
16 | console.log(version, tzversion)
17 | //Show changelog
18 | //ch_dialog.show()
19 | //Set version
20 | TZ.set('version', version)
21 | }
22 |
23 | document.addEventListener('DOMContentLoaded', function () {
24 | new navbar()
25 | new themeManager()
26 | new gotop()
27 | new aos()
28 | })
29 |
--------------------------------------------------------------------------------
/src/js/components/alert.js:
--------------------------------------------------------------------------------
1 | export function alert(options) {
2 | var t = this
3 | if (!options) options = []
4 | t.count = 0
5 | t.timeout = options.timeout ? options.timeout : 3000
6 | t.autoClose = options.autoClose ? options.autoClose : true
7 | const close =
8 | ' '
9 | t.container = document.querySelector('#nt1')
10 | t.close = ($el) => {
11 | $el.classList.add('animate-out')
12 | setTimeout(() => {
13 | $el.remove()
14 | t.count--
15 | }, 300)
16 | }
17 | t.setCloseOnClick = ($el) => {
18 | $el.addEventListener('click', function () {
19 | t.close($el)
20 | })
21 | }
22 | t.setAutocloseTimeout = ($el, timeout) => {
23 | setTimeout(() => {
24 | t.close($el)
25 | }, timeout)
26 | }
27 | t.createItem = (message, type) => {
28 | var $item = document.createElement('div')
29 | $item.classList.add('alert-item')
30 | $item.classList.add(type)
31 | $item.innerHTML = '' + message + ' ' + close
32 | t.count++
33 | return $item
34 | }
35 |
36 | t.error = (txt) => {
37 | t.showA(t.createItem(txt, 'error'))
38 | }
39 | t.warn = (txt) => {
40 | t.showA(t.createItem(txt, 'warn'))
41 | }
42 | t.info = (txt) => {
43 | var l = t.createItem(txt, 'info')
44 | t.showA(l)
45 | }
46 | t.success = (txt) => {
47 | var l = t.createItem(txt, 'success')
48 | t.showA(l)
49 | }
50 | t.show = (txt) => {
51 | var l = t.createItem(txt, '')
52 | t.showA(l)
53 | }
54 | t.showA = (l) => {
55 | if (t.autoClose) t.setAutocloseTimeout(l, t.timeout)
56 | t.setCloseOnClick(l)
57 | t.container.append(l)
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/src/js/components/aos.js:
--------------------------------------------------------------------------------
1 | export function aos() {
2 | let items = document.querySelectorAll('[class*=_aos]')
3 | if (IntersectionObserver && items) {
4 | let callback = function (entries) {
5 | entries.forEach((entry) => {
6 | if (
7 | entry.isIntersecting &&
8 | !entry.target.classList.contains('_aos-done')
9 | ) {
10 | entry.target.classList.add('_aos-done')
11 | } else {
12 | entry.target.classList.remove('_aos-done')
13 | }
14 | })
15 | }
16 | let observer = new IntersectionObserver(callback, {
17 | root: null,
18 | threshold: 0
19 | })
20 | items.forEach((item) => {
21 | observer.observe(item)
22 | })
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/js/components/carousel.js:
--------------------------------------------------------------------------------
1 | export function carousel() {
2 | var t = this
3 | t.slides = document.querySelectorAll('.slide')
4 | t.next = document.querySelector('.next-btn')
5 | t.prev = document.querySelector('.prev-btn')
6 | t.dots = document.querySelectorAll('.dot')
7 | t.index = 1
8 | t.next.addEventListener('click', () => {
9 | t.showSlides((t.index += 1))
10 | })
11 | t.prev.addEventListener('click', () => {
12 | t.showSlides((t.index += -1))
13 | })
14 | t.dots.forEach((element, index) => {
15 | element.addEventListener('click', (index) => {
16 | t.showSlides(index)
17 | })
18 | })
19 | t.showSlides = (n) => {
20 | var i
21 | if (n > t.slides.length) t.index = 1
22 | if (n < 1) t.index = slides.length
23 | for (i = 0; i < t.slides.length; i++) {
24 | t.slides[i].style.display = 'none'
25 | }
26 | for (i = 0; i < t.dots.length; i++) {
27 | t.dots[i].className = t.dots[i].className.replace(' active', '')
28 | }
29 | t.slides[t.index - 1].style.display = 'block'
30 | t.dots[t.index - 1].className += ' active'
31 | }
32 | t.showSlides(t.index)
33 | }
34 |
--------------------------------------------------------------------------------
/src/js/components/dialog.js:
--------------------------------------------------------------------------------
1 | !(function (t, e) {
2 | 'object' == typeof exports && 'undefined' != typeof module
3 | ? (module.exports = e())
4 | : 'function' == typeof define && define.amd
5 | ? define(e)
6 | : ((t =
7 | 'undefined' != typeof globalThis
8 | ? globalThis
9 | : t || self).A11yDialog = e())
10 | })(this, function () {
11 | 'use strict'
12 | var t = [
13 | 'a[href]:not([tabindex^="-"])',
14 | 'area[href]:not([tabindex^="-"])',
15 | 'input:not([type="hidden"]):not([type="radio"]):not([disabled]):not([tabindex^="-"])',
16 | 'input[type="radio"]:not([disabled]):not([tabindex^="-"])',
17 | 'select:not([disabled]):not([tabindex^="-"])',
18 | 'textarea:not([disabled]):not([tabindex^="-"])',
19 | 'button:not([disabled]):not([tabindex^="-"])',
20 | 'iframe:not([tabindex^="-"])',
21 | 'audio[controls]:not([tabindex^="-"])',
22 | 'video[controls]:not([tabindex^="-"])',
23 | '[contenteditable]:not([tabindex^="-"])',
24 | '[tabindex]:not([tabindex^="-"])'
25 | ]
26 |
27 | function e(t) {
28 | ;(this._show = this.show.bind(this)),
29 | (this._hide = this.hide.bind(this)),
30 | (this._maintainFocus = this._maintainFocus.bind(this)),
31 | (this._bindKeypress = this._bindKeypress.bind(this)),
32 | (this.$el = t),
33 | (this.shown = !1),
34 | (this._id =
35 | this.$el.getAttribute('data-a11y-dialog') || this.$el.id),
36 | (this._previouslyFocused = null),
37 | (this._listeners = {}),
38 | this.create()
39 | }
40 |
41 | function i(t, e) {
42 | return (
43 | (i = (e || document).querySelectorAll(t)),
44 | Array.prototype.slice.call(i)
45 | )
46 | var i
47 | }
48 |
49 | function n(t) {
50 | ;(t.querySelector('[autofocus]') || t).focus()
51 | }
52 |
53 | function s() {
54 | i('[data-a11y-dialog]').forEach(function (t) {
55 | new e(t)
56 | })
57 | }
58 | return (
59 | (e.prototype.create = function () {
60 | this.$el.setAttribute('aria-hidden', !0),
61 | this.$el.setAttribute('aria-modal', !0),
62 | this.$el.setAttribute('tabindex', -1),
63 | this.$el.hasAttribute('role') ||
64 | this.$el.setAttribute('role', 'dialog'),
65 | (this._openers = i(
66 | '[data-a11y-dialog-show="' + this._id + '"]'
67 | )),
68 | this._openers.forEach(
69 | function (t) {
70 | t.addEventListener('click', this._show)
71 | }.bind(this)
72 | )
73 | const t = this.$el
74 | return (
75 | (this._closers = i('[data-a11y-dialog-hide]', this.$el)
76 | .filter(function (e) {
77 | return (
78 | e.closest(
79 | '[aria-modal="true"], [data-a11y-dialog]'
80 | ) === t
81 | )
82 | })
83 | .concat(i('[data-a11y-dialog-hide="' + this._id + '"]'))),
84 | this._closers.forEach(
85 | function (t) {
86 | t.addEventListener('click', this._hide)
87 | }.bind(this)
88 | ),
89 | this._fire('create'),
90 | this
91 | )
92 | }),
93 | (e.prototype.show = function (t) {
94 | return (
95 | this.shown ||
96 | ((document.documentElement.style.overflowY = 'hidden'),
97 | (this._previouslyFocused = document.activeElement),
98 | this.$el.removeAttribute('aria-hidden'),
99 | (this.shown = !0),
100 | n(this.$el),
101 | document.body.addEventListener(
102 | 'focus',
103 | this._maintainFocus,
104 | !0
105 | ),
106 | document.addEventListener('keydown', this._bindKeypress),
107 | this._fire('show', t)),
108 | this
109 | )
110 | }),
111 | (e.prototype.hide = function (t) {
112 | return this.shown
113 | ? ((document.documentElement.style.overflowY = ''),
114 | (this.shown = !1),
115 | this.$el.setAttribute('aria-hidden', 'true'),
116 | this._previouslyFocused &&
117 | this._previouslyFocused.focus &&
118 | this._previouslyFocused.focus(),
119 | document.body.removeEventListener(
120 | 'focus',
121 | this._maintainFocus,
122 | !0
123 | ),
124 | document.removeEventListener('keydown', this._bindKeypress),
125 | this._fire('hide', t),
126 | this)
127 | : this
128 | }),
129 | (e.prototype.destroy = function () {
130 | return (
131 | this.hide(),
132 | this._openers.forEach(
133 | function (t) {
134 | t.removeEventListener('click', this._show)
135 | }.bind(this)
136 | ),
137 | this._closers.forEach(
138 | function (t) {
139 | t.removeEventListener('click', this._hide)
140 | }.bind(this)
141 | ),
142 | this._fire('destroy'),
143 | (this._listeners = {}),
144 | this
145 | )
146 | }),
147 | (e.prototype.on = function (t, e) {
148 | return (
149 | void 0 === this._listeners[t] && (this._listeners[t] = []),
150 | this._listeners[t].push(e),
151 | this
152 | )
153 | }),
154 | (e.prototype.off = function (t, e) {
155 | var i = (this._listeners[t] || []).indexOf(e)
156 | return i > -1 && this._listeners[t].splice(i, 1), this
157 | }),
158 | (e.prototype._fire = function (t, e) {
159 | var i = this._listeners[t] || [],
160 | n = new CustomEvent(t, {
161 | detail: e
162 | })
163 | this.$el.dispatchEvent(n),
164 | i.forEach(
165 | function (t) {
166 | t(this.$el, e)
167 | }.bind(this)
168 | )
169 | }),
170 | (e.prototype._bindKeypress = function (e) {
171 | const n = document.activeElement
172 | ;(n && n.closest('[aria-modal="true"]') !== this.$el) ||
173 | (this.shown &&
174 | 'Escape' === e.key &&
175 | 'alertdialog' !== this.$el.getAttribute('role') &&
176 | (e.preventDefault(), this.hide(e)),
177 | this.shown &&
178 | 'Tab' === e.key &&
179 | (function (e, n) {
180 | var s = (function (e) {
181 | return i(t.join(','), e).filter(function (t) {
182 | return !!(
183 | t.offsetWidth ||
184 | t.offsetHeight ||
185 | t.getClientRects().length
186 | )
187 | })
188 | })(e),
189 | o = s.indexOf(document.activeElement)
190 | n.shiftKey && 0 === o
191 | ? (s[s.length - 1].focus(), n.preventDefault())
192 | : n.shiftKey ||
193 | o !== s.length - 1 ||
194 | (s[0].focus(), n.preventDefault())
195 | })(this.$el, e))
196 | }),
197 | (e.prototype._maintainFocus = function (t) {
198 | !this.shown ||
199 | t.target.closest('[aria-modal="true"]') ||
200 | t.target.closest('[data-a11y-dialog-ignore-focus-trap]') ||
201 | n(this.$el)
202 | }),
203 | 'undefined' != typeof document &&
204 | ('loading' === document.readyState
205 | ? document.addEventListener('DOMContentLoaded', s)
206 | : window.requestAnimationFrame
207 | ? window.requestAnimationFrame(s)
208 | : window.setTimeout(s, 16)),
209 | e
210 | )
211 | })
212 |
--------------------------------------------------------------------------------
/src/js/components/fade.js:
--------------------------------------------------------------------------------
1 | // ** FADE OUT FUNCTION **
2 | export function fadeOut(el, callback) {
3 | el.style.opacity = 1
4 | ;(function fade() {
5 | if ((el.style.opacity -= 0.1) < 0) {
6 | el.style.display = 'none'
7 | if (callback) callback()
8 | } else {
9 | requestAnimationFrame(fade)
10 | }
11 | })()
12 | }
13 |
14 | // ** FADE IN FUNCTION **
15 | export function fadeIn(el, display) {
16 | el.style.opacity = 0
17 | el.style.display = display || 'block'
18 | ;(function fade() {
19 | var val = parseFloat(el.style.opacity)
20 | if (!((val += 0.1) > 1)) {
21 | el.style.opacity = val
22 | requestAnimationFrame(fade)
23 | }
24 | })()
25 | }
26 |
--------------------------------------------------------------------------------
/src/js/components/fontChecker.js:
--------------------------------------------------------------------------------
1 | export function fontChecker() {
2 | var baseFonts = ['monospace', 'sans-serif', 'serif']
3 | var testString = 'abcdefghilmnopqrstuvz'
4 | var testSize = '72px'
5 | var h = document.getElementsByTagName('body')[0]
6 | var s = document.createElement('span')
7 | s.style.fontSize = testSize
8 | s.innerHTML = testString
9 | var defaultWidth = {}
10 | var defaultHeight = {}
11 | for (var index in baseFonts) {
12 | s.style.fontFamily = baseFonts[index]
13 | h.appendChild(s)
14 | defaultWidth[baseFonts[index]] = s.offsetWidth //width for the default font
15 | defaultHeight[baseFonts[index]] = s.offsetHeight //height for the defualt font
16 | h.removeChild(s)
17 | }
18 |
19 | this.detect = function (font) {
20 | var detected = false
21 | for (var index in baseFonts) {
22 | s.style.fontFamily = font + ',' + baseFonts[index] // name of the font along with the base font for fallback.
23 | h.appendChild(s)
24 | var matched =
25 | s.offsetWidth != defaultWidth[baseFonts[index]] ||
26 | s.offsetHeight != defaultHeight[baseFonts[index]]
27 | h.removeChild(s)
28 | detected = detected || matched
29 | }
30 | return detected
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/js/components/gotop.js:
--------------------------------------------------------------------------------
1 | export function gotop() {
2 | var el = this
3 | el.gt = document.getElementById('gt-link')
4 | el.scrollToTop = function () {
5 | window.scroll({
6 | top: 0,
7 | left: 0,
8 | behavior: 'smooth'
9 | })
10 | }
11 | el.listeners = function () {
12 | window.addEventListener('scroll', () => {
13 | let y = window.scrollY
14 | if (y > 0) {
15 | el.gt.classList.remove('hidden')
16 | } else {
17 | el.gt.classList.add('hidden')
18 | }
19 | })
20 | el.gt.onclick = function (e) {
21 | e.preventDefault()
22 | if (
23 | document.documentElement.scrollTop ||
24 | document.body.scrollTop > 0
25 | ) {
26 | el.scrollToTop()
27 | }
28 | }
29 | }
30 | if (el.gt) {
31 | el.listeners()
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/src/js/components/localStorage.js:
--------------------------------------------------------------------------------
1 | export class LocalStorageManager {
2 | constructor(name) {
3 | this.LS = null
4 | this.name = name
5 | this.checkLS()
6 | this.init(name)
7 | }
8 | clearAll() {
9 | this.LS.clear()
10 | }
11 | checkLS() {
12 | if (window && window.localStorage) {
13 | this.LS = window.localStorage
14 | // console.log('localStorage is there?')
15 | } else {
16 | console.log('localStorage is there?')
17 | }
18 | }
19 | init(name) {
20 | if (this.LS) {
21 | if (this.LS[name]) {
22 | this.data = JSON.parse(this.LS[name])
23 | } else {
24 | this.data = {}
25 | }
26 | }
27 | }
28 |
29 | set(uri, data) {
30 | this.data[uri] = data
31 | if (this.LS) {
32 | this.LS[this.name] = JSON.stringify(this.data)
33 | }
34 | }
35 |
36 | get(uri) {
37 | if (this.data[uri]) {
38 | return this.data[uri]
39 | }
40 | return false
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/js/components/navbar.js:
--------------------------------------------------------------------------------
1 | export function navbar() {
2 | var t = this
3 | t.n = document.querySelector('nav')
4 | t.close = function () {
5 | document.body.style.overflow = 'auto'
6 | t.n.classList.remove('active')
7 | }
8 | t.open = function () {
9 | document.body.style.overflow = 'hidden'
10 | t.n.classList.add('active')
11 | }
12 | if (t.n) {
13 | document.querySelector('nav>button').addEventListener('click', () => {
14 | console.log('toggleNav')
15 | if (t.n.classList.contains('active')) t.close()
16 | else t.open()
17 | })
18 | document
19 | .querySelector('nav>.nav-overlay')
20 | .addEventListener('click', () => {
21 | t.close()
22 | })
23 | document.querySelectorAll('nav ul > a').forEach((n) =>
24 | n.addEventListener('click', () => {
25 | t.close()
26 | })
27 | )
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/js/components/pagesRoute.js:
--------------------------------------------------------------------------------
1 | export function pagesRoute() {
2 | var t = this
3 | const notFoundPage = document.querySelector('#notFound')
4 | t.links = Array.from(document.querySelectorAll('[topage]'))
5 | t.scrollTop = () => {
6 | document.querySelector('html').scrollTop = 0
7 | document.querySelector('body').scrollTop = 0
8 | }
9 | t.navigate = (id) => {
10 | //Hide current active page
11 | var activePage = document.querySelector('section.page-active')
12 | if (activePage) activePage.classList.remove('page-active')
13 | var activeLink = document.querySelector('[topage].active')
14 | if (activeLink) activeLink.classList.remove('active')
15 | //Show the next page
16 | var nextPage = document.querySelector(id)
17 | if (nextPage) nextPage.classList.add('page-active')
18 | var nextLink = document.querySelector("[topage='" + id + "']")
19 | if (nextLink) nextLink.classList.add('active')
20 | //Scroll to top
21 | t.scrollTop()
22 | //Set history state
23 | if (history.pushState) history.pushState(null, null, id)
24 | else location.hash = id
25 | }
26 | t.listeners = () => {
27 | t.links.forEach((page) => {
28 | var id = page.getAttribute('topage')
29 | page.addEventListener('click', () => {
30 | t.navigate(id)
31 | })
32 | })
33 | }
34 | if (t.links) {
35 | if (window.location.hash) t.navigate(window.location.hash)
36 | t.listeners()
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/js/components/ping.js:
--------------------------------------------------------------------------------
1 | // See LICENSE for usage information
2 |
3 | // The following lines allow the ping function to be loaded via commonjs, AMD,
4 | // and script tags, directly into window globals.
5 | // Thanks to https://github.com/umdjs/umd/blob/master/templates/returnExports.js
6 | ;(function (root, factory) {
7 | if (typeof define === 'function' && define.amd) {
8 | define([], factory)
9 | } else if (typeof module === 'object' && module.exports) {
10 | module.exports = factory()
11 | } else {
12 | root.ping = factory()
13 | }
14 | })(this, function () {
15 | /**
16 | * Creates and loads an image element by url.
17 | * @param {String} url
18 | * @return {Promise} promise that resolves to an image element or
19 | * fails to an Error.
20 | */
21 | function request_image(url) {
22 | return new Promise(function (resolve, reject) {
23 | var img = new Image()
24 | img.onload = function () {
25 | resolve(img)
26 | }
27 | img.onerror = function () {
28 | reject(url)
29 | }
30 | img.src =
31 | url +
32 | '?random-no-cache=' +
33 | Math.floor((1 + Math.random()) * 0x10000).toString(16)
34 | })
35 | }
36 |
37 | /**
38 | * Pings a url.
39 | * @param {String} url
40 | * @param {Number} multiplier - optional, factor to adjust the ping by. 0.3 works well for HTTP servers.
41 | * @return {Promise} promise that resolves to a ping (ms, float).
42 | */
43 | function ping(url, multiplier) {
44 | return new Promise(function (resolve, reject) {
45 | var start = new Date().getTime()
46 | var response = function () {
47 | var delta = new Date().getTime() - start
48 | delta *= multiplier || 1
49 | resolve(delta)
50 | }
51 | request_image(url).then(response).catch(console.log(response))
52 |
53 | // Set a timeout for max-pings, 5s.
54 | setTimeout(function () {
55 | reject(Error('Timeout'))
56 | }, 5000)
57 | })
58 | }
59 |
60 | return ping
61 | })
62 |
--------------------------------------------------------------------------------
/src/js/components/snackbar.js:
--------------------------------------------------------------------------------
1 | export function Snackbar(option) {
2 | const t = this
3 | t.snack = document.createElement('div')
4 | t.snack.className = 'snackbar'
5 | t.message = document.createElement('div')
6 | t.snack.appendChild(t.message)
7 | document.body.appendChild(t.snack)
8 |
9 | t.top = option.topPos
10 | t.classNames = option.classNames
11 | t.autoClose =
12 | typeof option.autoClose === 'boolean' ? option.autoClose : false
13 | t.autoCloseTimeout =
14 | option.autoClose && typeof option.autoCloseTimeout === 'number'
15 | ? option.autoCloseTimeout
16 | : 3000
17 |
18 | //Methods
19 | t.reset = function () {
20 | t.message.innerHTML = ''
21 | t.snack.classList.remove(t.classNames)
22 | }
23 | t.show = function (msg, type) {
24 | t.hide()
25 | t.message.innerHTML = msg
26 | t.snack.style.top = t.top
27 | t.snack.classList.add(type || t.classNames)
28 |
29 | if (t.autoClose) {
30 | setTimeout(function () {
31 | t.hide()
32 | }, t.autoCloseTimeout)
33 | }
34 | }
35 | t.hide = function () {
36 | t.snack.style.top = '-100%'
37 | t.reset()
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/js/components/themeManager.js:
--------------------------------------------------------------------------------
1 | export function themeManager() {
2 | //Theme Switcher
3 | var toggles = document.getElementsByClassName('theme-toggle')
4 |
5 | if (window.CSS && CSS.supports('color', 'var(--bg)') && toggles) {
6 | var storedTheme =
7 | localStorage.getItem('theme') ||
8 | (window.matchMedia('(prefers-color-scheme: dark)').matches
9 | ? 'dark'
10 | : 'light')
11 | if (storedTheme)
12 | document.documentElement.setAttribute('data-theme', storedTheme)
13 | for (var i = 0; i < toggles.length; i++) {
14 | toggles[i].onclick = function () {
15 | var currentTheme =
16 | document.documentElement.getAttribute('data-theme')
17 | var targetTheme = 'light'
18 |
19 | if (currentTheme === 'light') {
20 | targetTheme = 'dark'
21 | }
22 |
23 | document.documentElement.setAttribute('data-theme', targetTheme)
24 | localStorage.setItem('theme', targetTheme)
25 | }
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/js/components/utils.js:
--------------------------------------------------------------------------------
1 | //Copy to clipboard the str value
2 |
--------------------------------------------------------------------------------
/src/js/fontlist.js:
--------------------------------------------------------------------------------
1 | import '../sass/fontlist.sass'
2 | import packageJSON from '../../package.json'
3 | import { font_list } from '../data/font_list'
4 | import { navbar } from './components/navbar'
5 | import A11yDialog from './components/dialog'
6 | import { themeManager } from './components/themeManager'
7 | import { gotop } from './components/gotop'
8 | import { aos } from './components/aos'
9 | import { Snackbar } from './components/snackbar'
10 | import { fontChecker } from './components/fontChecker'
11 | import { icons } from '../data/icons'
12 | import { LocalStorageManager } from './components/localStorage'
13 | const cd = document.querySelector('#dlg_changelog')
14 | const ch_dialog = new A11yDialog(cd)
15 | var TZ = new LocalStorageManager('toolz')
16 | const version = packageJSON.version
17 | const tzversion = TZ.get('version')
18 | if (tzversion !== version) {
19 | //Show changelog
20 | //ch_dialog.show()
21 | //Set version
22 | //TZ.set('version', version)
23 | }
24 | var snackbar = new Snackbar({
25 | topPos: '10px',
26 | classNames: 'success',
27 | autoClose: true,
28 | autoCloseTimeout: 2000
29 | })
30 | const fo = document.getElementById('f_options')
31 | const ft = document.getElementById('font_test')
32 | const r_fw = document.getElementById('r_fw')
33 | const r_fwv = document.getElementById('r_fw_value')
34 | const r_fs = document.getElementById('r_fs')
35 | const r_fsv = document.getElementById('r_fs_value')
36 | const r_ls = document.getElementById('r_ls')
37 | const r_lsv = document.getElementById('r_ls_value')
38 | const r_lh = document.getElementById('r_lh')
39 | const r_lhv = document.getElementById('r_lh_value')
40 | function copyToClip() {
41 | var cssCode = document.getElementById('css-code')
42 | var range = document.createRange()
43 | range.selectNode(cssCode)
44 | window.getSelection().removeAllRanges()
45 | window.getSelection().addRange(range)
46 | document.execCommand('copy')
47 | window.getSelection().removeAllRanges()
48 | snackbar.show('CSS copied to clipboard !')
49 | }
50 | function generateCSS() {
51 | var css =
52 | '.custom-font {\n' +
53 | ' font-family: ' +
54 | fo.value +
55 | ';\n' +
56 | ' font-weight: ' +
57 | r_fwv.innerText +
58 | ';\n' +
59 | ' font-size: ' +
60 | r_fsv.innerText +
61 | ';\n' +
62 | ' letter-spacing: ' +
63 | r_lsv.innerText +
64 | ';\n' +
65 | ' line-height: ' +
66 | r_lhv.innerText +
67 | ';\n' +
68 | '}'
69 | document.getElementById('css-code').innerText = css
70 | }
71 | // Call the function when the DOM is loaded
72 | document.addEventListener('DOMContentLoaded', () => {
73 | new themeManager()
74 | new navbar()
75 | new gotop()
76 |
77 | var total = 0,
78 | available = 0,
79 | notAvalaible = 0
80 | var fc = new fontChecker()
81 | const flist = document.querySelector('#flist')
82 | font_list.forEach((element) => {
83 | total++
84 | var a = fc.detect(element)
85 | if (a) {
86 | var el = document.createElement('div')
87 | el.innerText = element
88 | el.className = 'card _aos'
89 | var op = document.createElement('option')
90 | op.value = element
91 | op.innerText = element
92 | fo.appendChild(op)
93 | el.style.fontFamily = element
94 | flist.appendChild(el)
95 | available++
96 | } else {
97 | notAvalaible++
98 | }
99 | console.log(a)
100 | })
101 | const r = document.querySelector('#results')
102 |
103 | r.innerHTML =
104 | '' +
105 | total +
106 | ' Tested Fonts ' +
107 | icons['v'] +
108 | ' ' +
109 | available +
110 | ' Detected fonts ' +
111 | icons['cdot'] +
112 | ' ' +
113 | notAvalaible +
114 | ' Not available '
115 | new aos()
116 |
117 | fo.onchange = function () {
118 | ft.style['fontFamily'] = this.value
119 | generateCSS()
120 | }
121 | r_fw.oninput = function () {
122 | ft.style['font-weight'] = this.value
123 | r_fwv.innerText = this.value
124 | generateCSS()
125 | }
126 |
127 | r_fs.oninput = function () {
128 | ft.style['font-size'] = this.value + 'px'
129 | r_fsv.innerText = this.value + 'px'
130 | generateCSS()
131 | }
132 |
133 | r_ls.oninput = function () {
134 | ft.style['letter-spacing'] = this.value + 'px'
135 | r_lsv.innerText = this.value + 'px'
136 | generateCSS()
137 | }
138 |
139 | r_lh.oninput = function () {
140 | ft.style['line-height'] = this.value
141 | r_lhv.innerText = this.value
142 | generateCSS()
143 | }
144 | document
145 | .querySelector('#css_code_copy')
146 | .addEventListener('click', copyToClip)
147 | })
148 |
--------------------------------------------------------------------------------
/src/js/index.js:
--------------------------------------------------------------------------------
1 | import '../sass/index.sass'
2 | import packageJSON from '../../package.json'
3 | import { navbar } from './components/navbar'
4 | import A11yDialog from './components/dialog'
5 | import { themeManager } from './components/themeManager'
6 | import { gotop } from './components/gotop'
7 | import { aos } from './components/aos'
8 | import { LocalStorageManager } from './components/localStorage'
9 | const cd = document.querySelector('#dlg_changelog')
10 | const ch_dialog = new A11yDialog(cd)
11 | var TZ = new LocalStorageManager('toolz')
12 | const version = packageJSON.version
13 | var tzversion = TZ.get('version')
14 | console.log(tzversion, version)
15 | if (tzversion !== version) {
16 | //Show changelog
17 | //ch_dialog.show()
18 | //Set version
19 | //TZ.set('version', version)
20 | }
21 | // Call the function when the DOM is loaded
22 | document.addEventListener('DOMContentLoaded', () => {
23 | new themeManager()
24 | new navbar()
25 | new gotop()
26 | new aos()
27 | })
28 |
--------------------------------------------------------------------------------
/src/js/pagead.js:
--------------------------------------------------------------------------------
1 | const s_test_pagead = true
2 | console.log('s_test_pageads : ', s_test_pagead)
3 |
--------------------------------------------------------------------------------
/src/js/units.js:
--------------------------------------------------------------------------------
1 | import '../sass/units.sass'
2 | import packageJSON from '../../package.json'
3 | import { navbar } from './components/navbar'
4 | import A11yDialog from './components/dialog'
5 | import { themeManager } from './components/themeManager'
6 | import { gotop } from './components/gotop'
7 | import { aos } from './components/aos'
8 | import { LocalStorageManager } from './components/localStorage'
9 | const cd = document.querySelector('#dlg_changelog')
10 | const ch_dialog = new A11yDialog(cd)
11 | var TZ = new LocalStorageManager('toolz')
12 | const version = packageJSON.version
13 | const tzversion = TZ.get('version')
14 | if (tzversion !== version) {
15 | //Show changelog
16 | //ch_dialog.show()
17 | //Set version
18 | //TZ.set('version', version)
19 | }
20 |
21 | // Call the function when the DOM is loaded
22 | document.addEventListener('DOMContentLoaded', () => {
23 | new themeManager()
24 | new navbar()
25 | new gotop()
26 | new aos()
27 | })
28 |
29 | function el(name) {
30 | return document.querySelector(name)
31 | }
32 |
33 | let bars = []
34 |
35 | function getBars() {
36 | var b = document.querySelectorAll('.bar')
37 | b.forEach((el) => {
38 | bars.push(el)
39 | })
40 | console.log(bars)
41 | }
42 |
43 | function updateTest() {
44 | let i = window.innerHeight
45 | el('.innerHeightLog>span').innerText = 'innerHeight: ' + i + 'px '
46 | let vh, svh, dvh, lvh, p
47 | vh = el('.bar.b-vh').clientHeight
48 | svh = el('.bar.b-svh').clientHeight
49 | dvh = el('.bar.b-dvh').clientHeight
50 | lvh = el('.bar.b-lvh').clientHeight
51 | p = el('.bar.b-p').clientHeight
52 |
53 | document.body.style.setProperty('--100vh', vh + 'px')
54 | document.body.style.setProperty('--100svh', svh + 'px')
55 | document.body.style.setProperty('--100dvh', dvh + 'px')
56 | document.body.style.setProperty('--100lvh', lvh + 'px')
57 | document.body.style.setProperty('--100p', p + 'px')
58 |
59 | el('.t-vh>span').innerText = '100vh (' + vh + 'px)'
60 | el('.t-dvh>span').innerText = '100dvh (' + dvh + 'px)'
61 | el('.t-svh>span').innerText = '100svh (' + svh + 'px)'
62 | el('.t-lvh>span').innerText = '100lvh (' + lvh + 'px)'
63 | el('.t-p>span').innerText = '100% (' + p + 'px)'
64 | el('.t-vh').style.background =
65 | vh == i ? 'var(--green)' : vh > i ? 'var(--blue)' : 'var(--orange)'
66 | el('.t-dvh').style.background =
67 | dvh == i ? 'var(--green)' : dvh > i ? 'var(--blue)' : 'var(--orange)'
68 | el('.t-svh').style.background =
69 | svh == i ? 'var(--green)' : svh > i ? 'var(--blue)' : 'var(--orange)'
70 | el('.t-lvh').style.background =
71 | lvh == i ? 'var(--green)' : lvh > i ? 'var(--blue)' : 'var(--orange)'
72 | el('.t-p').style.background =
73 | p == i ? 'var(--green)' : p > i ? 'var(--blue)' : 'var(--orange)'
74 | }
75 |
76 | addEventListener('load', function () {
77 | getBars()
78 | updateTest()
79 | visualViewport.addEventListener('resize', () => {
80 | updateTest()
81 | })
82 | document.body.addEventListener('resize', updateTest())
83 | })
84 |
--------------------------------------------------------------------------------
/src/js/widget/ads.js:
--------------------------------------------------------------------------------
1 | var s_test_ads = 's_test_ads'
2 | console.log('Hey there ..... check out ', 'https://youtu.be/dQw4w9WgXcQ')
3 |
4 | var e = document.createElement('div')
5 | e.id = 'ECKckuBYwZaP'
6 | e.style.display = 'none'
7 | document.body.appendChild(e)
8 |
--------------------------------------------------------------------------------
/src/partials/adblock/changelog.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Toolz 3.1.2
6 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
#Changelog 8/05/2024
18 |
19 | Updated hosts list
20 | Removed some advertising hosts that were used for administration and not to serve ads.
21 | Added details for cosmetic and script tests
22 | Moved warning card for better UX
23 |
24 |
25 |
26 |
#Changelog 10/02/2024
27 |
28 | Updated hosts list
29 | Added rules to .adblock file
30 | Removed partner.ads script
31 | Cosmetic and script tests set to 1 point each
32 | Improved hosts test with fake 404 page
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | Close
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/src/partials/adblock/faq.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | FAQ
6 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
How does it work?
15 |
You will not see any ads and no trackers will be activated
16 |
17 |
18 |
19 |
20 |
23 |
24 |
25 |
26 |
27 |
28 |
Blocked
29 |
30 | If the connection to a host/script fails or a box is removed means the latter has been
31 | blocked by your
32 | ad-blocker
33 |
34 |
35 |
36 |
37 |
38 |
41 |
42 |
43 |
44 |
45 |
Not Blocked
46 |
47 | Connection to a host did not fail or box is not removed, means that your ad-blocker did not
48 | block it or doesn't work
49 |
50 |
51 |
52 |
After tests are completed , you get a liquid color ball with points.
53 | Points are calculated based on your tests for each category and type
54 | The color fits your points range
55 | Here a preview of 3 scenarios :
56 |
79 |
80 |
81 |
82 | Cmon , use an adblock or smth
83 |
84 |
85 |
86 |
87 | Ok, but you can do better
88 |
89 |
90 |
91 |
92 | Great, you're ready to surf
93 |
94 |
95 |
96 |
97 | The tests consist of 3 types
98 |
99 | Cosmetic Filter : Check if you are hiding/removing the empy boxes of ads, cookie policy etc.
100 |
101 | Script Loading : Check if you are blocking a possible ad script loading or trackers
102 | Host : Check if you block domains that provide trackers, analytics or ads
103 |
104 |
105 |
106 |
I'm sure my ad-block solution is configured correctly, but the test does not work.
107 |
108 | It would appear that your current configuration is not compatible with the type of checks carried out by this tool.
109 | However, please note that this does not mean that there is a lack of protection provided by the solution you have configured, such as an ad blocking extension, a VPN or a DNS.
110 | The limitations of JavaScript or the absence of certain features may prevent the test from being able to accurately determine the number of connections that are blocked.
111 | You will still receive an estimate of the percentage of connections that have been blocked/detected by this tool
112 |
113 |
114 |
117 |
118 |
119 |
120 |
121 | Check Compatibility
122 |
123 |
124 |
How I can have 100%
125 |
126 | A green score indicates a satisfactory level of protection.
127 | There is no need to aim for a perfect score.
128 | However, if you are interested in achieving full 100% protection, you can use my d3Host List, which covers most of the tests on the site (excluding cosmetic filters and script loading).
129 | This should help to improve your score.
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 | d3Host List (TXT)
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 | d3Host List (ADBLOCK)
149 |
150 |
151 |
152 |
153 |
My ad-blocking solutions
154 |
155 | I use DNSFilter as main DNS resolver
156 | Great alternative for home consumer users NextDNS
157 | Plus these combo on each platform :
158 |
159 |
160 |
161 | Windows : Brave + ublock-Origin
162 | MacOS : Brave + ublock-Origin
163 | Android : Kiwi Browser + ublock-Origin
164 | iOS : Brave with built-in adblock enabled OR Safari + Adguard Extension
165 |
166 |
170 | Lists I recommend :
171 |
176 |
Others test tools for your adblock
177 |
178 | I created this project to quickly test my small list of most common hosts.
179 | I wanted to build something with a great design and user experience that was pretty straightforward for any type of user.
180 | There are other great tools that I use and would like to recommend
181 |
182 |
192 |
193 |
194 |
195 |
196 | Close
197 |
198 |
199 |
200 |
--------------------------------------------------------------------------------
/src/partials/adblock/logs.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
11 |
12 |
13 |
14 |
15 |
16 | Logs
17 |
19 |
20 |
21 |
22 |
23 |
28 |
29 |
30 | Cancel
31 |
32 |
33 | Ok
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/src/partials/adblock/results.ejs:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 | Latest Test Results
8 |
9 |
10 |
11 | Below is a preview of your last 10 test results.
12 | You can download the full report for sharing
13 |
14 |
15 |
16 |
17 |
18 |
19 | Close
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/partials/adblock/settings.ejs:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 | Settings
7 |
9 |
10 |
11 |
12 |
13 |
33 |
34 |
35 | Close
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/src/partials/footer.ejs:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/partials/gotop.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/src/partials/head.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | <% if (page == 'toolz') { %>
9 |
10 | <% } %>
11 | <% if (page != 'toolz') { %>
12 |
13 | <% } %>
14 | <%= title %>
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/partials/header.ejs:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/partials/support_me.ejs:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
9 |
10 |
12 |
13 |
14 |
15 |
16 |
17 | Support me
18 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
Thank you!
28 |
29 |
30 |
31 |
32 | Until now, the number of people who got interested in my projects went way beyond
33 | my expectations, I'm so happy to see it grow daily!
34 |
35 | If you use any of them or find them valuable, I'll be grateful for your support!
36 |
37 |
38 |
39 |
40 |
41 |
44 |
45 |
46 |
48 |
49 |
50 |
51 |
52 |
53 | Free
54 |
55 |
56 |
You can support me for free in these ways :
57 |
58 |
59 |
63 |
64 |
65 |
66 |
67 |
68 |
69 | Share the projects with others (friends, family or community)
70 |
74 |
75 |
77 |
78 | Star and follow my projects
79 |
83 |
84 |
86 |
87 | Contribute by opening issues or making PRs
88 |
89 |
90 |
91 |
92 |
93 |
94 |
97 |
98 |
99 |
100 |
102 |
103 |
104 |
105 | Donations
106 |
107 |
108 |
126 |
127 |
128 |
129 |
130 |
131 | Close
132 |
133 |
134 |
135 |
--------------------------------------------------------------------------------
/src/sass/404.sass:
--------------------------------------------------------------------------------
1 | @charset "utf-8"
2 |
3 | @import "./settings/variables"
4 |
5 | @import "./theme/light"
6 | @import "./theme/dark"
7 | $or-50: '#ffffff'
8 | $or-100: '#fdddde'
9 | $or-200: '#fababd'
10 | $or-300: '#f8989d'
11 | $or-400: '#f5757c'
12 | $or-500: '#f3535b'
13 | $or-600: '#d94148'
14 | $or-700: '#bf2f36'
15 | $or-800: '#a41c23'
16 | $or-900: '#8a0a10'
17 | html
18 | --primary: #{$or-500}!important
19 | --primary-h: #{$or-100}!important
20 | --primary-l: #{$or-400}!important
21 | --primary-d: #{$or-800}!important
22 |
23 | [data-theme="dark"]
24 | --primary: #{$or-500} !important
25 | --primary-h: #{$or-800}!important
26 | --primary-l: #{$or-400}!important
27 | --primary-d: #{$or-600}!important
28 |
29 | body
30 | background-color: #f7b42c
31 | background-image: linear-gradient(315deg, #f7b42c 0%, #fc575e 74%)
32 | background-size: 400% 100%
33 | height: auto
34 |
35 | @import "./base/basic"
36 | @import "./extra/aos"
37 | @import "./elements/typography"
38 |
39 | @import "./layout/navbar"
40 | @import "./layout/aside"
41 | @import "./layout/header"
42 | @import "./layout/container"
43 | @import "./layout/grid"
44 | @import "./layout/footer"
45 |
46 | @import "./elements/button"
47 | @import "./components/card"
48 | @import "./elements/form"
49 | @import "./components/dropdown"
50 | @import "./components/modal"
51 | @import "./components/gotop_link"
52 | @import "./elements/code"
53 | @import "./elements/figure"
54 | @import "./components/details"
55 | @import "./elements/table"
56 | @import "./components/tabs"
57 | @import "./extra/tooltip"
58 | @import "./extra/wave"
59 | @import "./extra/pages"
60 | @import "./extra/alert"
61 |
62 | @import "./utilities/alignment"
63 | @import "./utilities/background"
64 | @import "./utilities/border"
65 | @import "./utilities/display"
66 | @import "./utilities/margin"
67 | @import "./utilities/general"
68 | @import "./utilities/padding"
69 | @import "./utilities/spacer"
70 | @import "./utilities/text"
--------------------------------------------------------------------------------
/src/sass/_utilities.sass:
--------------------------------------------------------------------------------
1 | // --------------------------------------------------
2 | // Utilities
3 | // --------------------------------------------------
4 |
5 | .clearfix {
6 | @include clearfix;
7 | }
8 |
--------------------------------------------------------------------------------
/src/sass/adblock.sass:
--------------------------------------------------------------------------------
1 | @charset "utf-8"
2 |
3 | @import "./settings/variables"
4 | @import "./theme/light"
5 | @import "./theme/dark"
6 |
7 | @import "./base/basic"
8 | @import "./extra/aos"
9 | @import "./elements/typography"
10 |
11 | @import "./layout/navbar"
12 | @import "./layout/aside"
13 | @import "./layout/header"
14 | @import "./layout/container"
15 | @import "./layout/grid"
16 | @import "./layout/footer"
17 |
18 | @import "./elements/button"
19 | @import "./components/snackbar"
20 | @import "./components/card"
21 | @import "./elements/form"
22 | @import "./elements/code"
23 | @import "./components/dropdown"
24 | @import "./components/modal"
25 | @import "./components/gotop_link"
26 | @import "./components/details"
27 | @import "./elements/table"
28 | @import "./components/tabs"
29 | @import "./extra/tooltip"
30 | @import "./extra/pages"
31 | @import "./extra/alert"
32 |
33 | @import "./utilities/alignment"
34 | @import "./utilities/background"
35 | @import "./utilities/position"
36 | @import "./utilities/border"
37 | @import "./utilities/display"
38 | @import "./utilities/margin"
39 | @import "./utilities/general"
40 | @import "./utilities/padding"
41 | @import "./utilities/spacer"
42 | @import "./utilities/text"
43 |
44 | main
45 | --bg-details: var(--bg3)
46 | #dlg_compatibility
47 | z-index: 52!important
48 | #adb_test
49 | display: none
50 |
51 | footer>div
52 | background: var(--bg2)
53 | .card
54 | border-radius: 12px
55 | box-shadow: none
56 | background: var(--bg2)
57 | .test_block,.test>span
58 | border-radius: var(--radius)
59 | position: relative
60 | min-height: 45px
61 | width: 100%
62 | .test_block
63 | text-align: center
64 | margin: 0
65 | display: flex
66 | align-items: center
67 | justify-content: center
68 | color: #000
69 | #test_log
70 | height: 200px
71 | overflow-y: auto
72 | flex-wrap: nowrap
73 | .test_wrapper
74 | display: flex
75 | flex-direction: column
76 | gap: .5rem
77 | .test_wrapper .col-6
78 | gap: 1rem
79 | display: flex
80 | flex-direction: column
81 | .test_wrapper>div,.test_card
82 | padding: .5rem
83 | border-radius: 12px
84 | background: var(--bg2)
85 | .rwd-table-t
86 | display: flex
87 | gap: .5rem
88 | align-items: center
89 | .badges
90 | display: flex
91 | flex-wrap: wrap
92 | gap: .5rem
93 | >*
94 | padding: 5px
95 | display: flex
96 | align-items: center
97 | gap: 5px
98 | background: var(--bg2)
99 | border-radius: var(--radius)
100 | &.light-green
101 | background: var(--green-h)
102 | color: var(--green-d)
103 | &.light-red
104 | background: var(--red-h)
105 | color: var(--red-d)
106 | &.light-orange
107 | background: var(--orange-h)
108 | color: var(--orange-d)
109 |
110 | .test_wrapper svg,.test_card svg
111 | height: 1.5rem
112 | .test_wrapper>div>div>h5,.test_card>h5,.test>span
113 | text-align: center
114 | margin: 0
115 | display: flex
116 | align-items: center
117 | justify-content: center
118 | .test
119 | background-color: var(--red)
120 | color: #000
121 | border-radius: 8px
122 | display: flex
123 | flex-direction: column
124 | align-items: center
125 | justify-content: center
126 | text-align: center
127 | margin: 10px
128 | min-height: 45px
129 | transition: all 1s
130 |
131 | .test>div>div
132 | height: 45px
133 | width: 100%
134 | border-radius: 8px
135 | background: var(--bg2)
136 | color: var(--txt)
137 | padding: 0.5rem
138 | display: flex
139 | align-items: center
140 | gap: 0.5rem
141 | .test>div>div>span
142 | white-space: nowrap
143 | overflow: hidden
144 | text-overflow: ellipsis
145 | width: 100%
146 | text-align: left
147 | .test>div
148 | position: relative
149 | user-select: none
150 | display: none
151 | flex-direction: column
152 | overflow-x: auto
153 | gap: 0.5rem
154 | padding: 0.5rem
155 | width: 100%
156 | white-space: nowrap
157 | color: #000
158 | .test.show>div
159 | display: flex
160 |
161 | #results
162 | background-color: white
163 | border: 1px solid #ddd
164 | bottom: 1em
165 | font-size: 24px
166 | left: 1em
167 | padding: 4px 8px
168 | position: fixed
169 | .epic_path1, .epic_path
170 | fill: var(--primary)
171 | .epic
172 | width: 250px
173 | height: 250px
174 |
175 | .lt_wrap
176 | display: flex
177 | flex-direction: column
178 | justify-content: center
179 | align-items: center
180 | .lt_particles
181 | width: 15rem
182 | height: 7.5rem
183 | display: flex
184 | justify-content: center
185 | align-items: center
186 | flex-direction: row
187 | grid-gap: 16px
188 | .start .p1
189 | animation: p1 1.6s cubic-bezier(.2, .4, .35, 1) .2s infinite backwards
190 | .start .p2
191 | animation: p2 1.5s cubic-bezier(.2, .4, .35, 1) .2s infinite backwards
192 | .start .p3
193 | animation: p3 1.6s cubic-bezier(.2, .4, .35, 1) .2s infinite backwards
194 | .start .p4
195 | animation: p4 1.4s cubic-bezier(.2, .4, .35, 1) .2s infinite backwards
196 | .start .p5
197 | animation: p5 1.2s cubic-bezier(.2, .4, .35, 1) .2s infinite backwards
198 | .p1,.p2,.p3,.p4,.p5
199 | padding: 4px
200 | height: 32px
201 | width: 32px
202 | border-radius: 50%
203 | .p1
204 | background: var(--blue-h)
205 | color: var(--blue)
206 | .p2
207 | background: var(--green-h)
208 | color: var(--green)
209 | .p3
210 | background: var(--orange-h)
211 | color: var(--orange)
212 | .p5
213 | background: var(--purple-h)
214 | color: var(--purple)
215 | .p4
216 | background: var(--red-h)
217 | color: var(--red)
218 | @keyframes p1
219 | 0%
220 | transform: translateY(0px) translateX(-20px) scale(.8)
221 | opacity: 0
222 | 50%
223 | transform: translateY(40px) translateX(0px) scale(1)
224 | opacity: 1
225 | animation-timing-function: cubic-bezier(1, .4, .35, 1)
226 | 75%
227 | transform: translateY(100px) translateX(10px) scale(1)
228 | opacity: 0
229 | 100%
230 | transform: translateY(0px) translateX(-10px) scale(.8)
231 | opacity: 0
232 |
233 | @keyframes p2
234 | 0%
235 | transform: translateY(0px) translateX(-10px) scale(.8)
236 | opacity: 0
237 | 50%
238 | transform: translateY(50px) translateX(0px) scale(1)
239 | opacity: 1
240 | animation-timing-function: cubic-bezier(1, .4, .35, 1)
241 | 75%
242 | transform: translateY(80px) translateX(5px) scale(1)
243 | opacity: 0
244 | 100%
245 | transform: translateY(0px) translateX(5px) scale(.8)
246 | opacity: 0
247 |
248 | @keyframes p3
249 | 0%
250 | transform: translateY(0px) scale(.8) rotate(45deg)
251 | opacity: 0
252 | 50%
253 | transform: translateY(40px) scale(1) rotate(0deg)
254 | opacity: 1
255 | animation-timing-function: cubic-bezier(1, .4, .35, 1)
256 | 75%
257 | transform: translateY(100px) scale(1) rotate(0deg)
258 | opacity: 0
259 | 100%
260 | transform: translateY(0px) scale(.8) rotate(0deg)
261 | opacity: 0
262 |
263 | @keyframes p4
264 | 0%
265 | transform: translateY(0px) translateX(10px) scale(.8)
266 | opacity: 0
267 | 50%
268 | transform: translateY(60px) translateX(0px) scale(1)
269 | opacity: 1
270 | animation-timing-function: cubic-bezier(1, .4, .35, 1)
271 | 75%
272 | transform: translateY(100px) translateX(0px) scale(1)
273 | opacity: 0
274 | 100%
275 | transform: translateY(0px) translateX(10px) scale(.8)
276 | opacity: 0
277 |
278 | @keyframes p5
279 | 0%
280 | transform: translateY(0px) translateX(20px) scale(.8)
281 | opacity: 0
282 | 50%
283 | transform: translateY(50px) translateX(0px) scale(1)
284 | opacity: 1
285 | animation-timing-function: cubic-bezier(1, .4, .35, 1)
286 | 75%
287 | transform: translateY(90px) translateX(0px) scale(1)
288 | opacity: 0
289 | 100%
290 | transform: translateY(0px) translateX(20px) scale(.8)
291 | opacity: 0
292 | :root
293 | --liquid-percentage: 50%
294 | --liquid-title: "BAD"
295 | --liquid-color: var(--red)
296 |
297 | .r_wrap span
298 | display: flex
299 | align-items: center
300 | gap: 0.5rem
301 |
302 | .lt_template .lt_circle
303 | width: 60px
304 | height: 60px
305 | .template_wrap.row>div
306 | justify-content: center
307 | gap: .5rem
308 | align-items: center
309 | display: flex
310 | flex-direction: column
311 | .lt_value_2
312 | border-radius: 8px
313 | color: var(--white)
314 | padding: .4rem
315 |
316 | .lt_cwrap
317 | position: relative
318 | border-radius: 50rem
319 | background-color: var(--bg2)
320 |
321 | .lt_circle
322 | width: 200px
323 | height: 200px
324 | background: var(--liquid-color)
325 | border: 3px solid var(--black-h)
326 | border-radius: 50%
327 | overflow: hidden
328 | clip-path: border-box
329 | z-index: 5
330 |
331 | .lt_wave
332 | position: relative
333 | top: var(--liquid-percentage)
334 | width: 100%
335 | height: 100%
336 | background: var(--liquid-color)
337 | border-radius: 50%
338 | transition: 3s
339 |
340 | .lt_wave:before,
341 | .lt_wave:after
342 | content: ''
343 | position: absolute
344 | width: 200%
345 | height: 200%
346 | left: 50%
347 | -webkit-transform: translate(-50%, -75%)
348 | transform: translate(-50%, -75%)
349 | background: #000
350 |
351 | .lt_wave:before
352 | border-radius: 45%
353 | background: var(--bg2)
354 | animation: animate_lt_wave 6s linear infinite
355 |
356 | .lt_wave:after
357 | border-radius: 40%
358 | opacity: .5
359 | background: var(--bg2)
360 | animation: animate_lt_wave 10s linear infinite
361 |
362 | @keyframes animate_lt_wave
363 | 0%
364 | transform: translate(-50%, -75%) rotate(0deg)
365 | 100%
366 | transform: translate(-50%, -75%) rotate(360deg)
367 |
368 | .lt_cwrap .lt_value
369 | position: absolute
370 | height: 100%
371 | right: 0
372 | bottom: 0
373 | width: 100%
374 |
375 | .lt_cwrap .lt_value::after,
376 | .lt_cwrap .lt_value::before
377 | content: var(--liquid-title)
378 | position: inherit
379 | left: 100%
380 | margin-left: 10px
381 | bottom: calc(45% - var(--liquid-percentage))
382 | transform: translateY(50%)
383 | background: var(--liquid-color)
384 | color: var(--white)
385 | padding: 10px
386 | font-size: 20px
387 | font-weight: bold
388 | border-radius: 8px
389 | transition: 3s
390 |
391 | .lt_cwrap .lt_value::after
392 | content: ''
393 | border: 12px solid transparent
394 | border-right-color: var(--liquid-color)
395 | padding: 0
396 | border-radius: 0
397 | background: transparent
398 | transform: translate(-78%, 50%)
399 |
400 | #dlg_faq p
401 | -moz-osx-font-smoothing: grayscale
402 | -webkit-font-smoothing: antialiased!important
403 | margin-top: 1rem
404 | #adb_test_r>span
405 | display: flex
406 | align-items: center
407 | gap: .5rem
408 |
--------------------------------------------------------------------------------
/src/sass/base/_basic.sass:
--------------------------------------------------------------------------------
1 | /* ---------------- Basic resets and improvements --------------- */
2 | *,
3 | *::before,
4 | *::after
5 | box-sizing: border-box
6 | *:focus:not(:focus-visible)
7 | outline: 0
8 | *:focus-visible
9 | outline: .1rem solid var(--focus)
10 | outline-offset: .1rem
11 | html
12 | text-rendering: optimizeLegibility
13 | font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif
14 | font-size: 12pt
15 | color: var(--txt)
16 | background: var(--bg)
17 | body
18 | min-height: 100vh
19 | display: flex
20 | flex-flow: wrap column
21 | gap: .5rem
22 | align-items: center
23 | justify-content: center
24 |
25 | @media (prefers-reduced-motion: no-preference)
26 | scroll-behavior: smooth
27 | body,html
28 | margin: 0
29 | padding: 0
30 | header>*,main>*,footer>*
31 | max-width: 60rem
32 |
33 | ol, ul
34 | list-style: none
35 | display: flex
36 | flex-direction: column
37 | gap: .3rem
38 | .keep-ls
39 | list-style: unset
40 | img
41 | max-width: 100%
42 |
43 | table
44 | border-collapse: collapse
45 |
46 | textarea
47 | white-space: revert
48 |
49 | hr
50 | border: 0
51 | border-top: .1rem solid var(--brd)
52 |
53 | section
54 | overflow-x: hidden
55 | display: flex
56 | flex-direction: column
57 |
58 | .better_r
59 | -webkit-font-smoothing: antialiased!important
60 | -moz-font-smoothing: antialiased!important
61 | font-size: 16px
62 | letter-spacing: .7px
63 | line-height: 1.5
64 | text-align: justify
65 | text-rendering: optimizelegibility!important
66 |
--------------------------------------------------------------------------------
/src/sass/components/_card.sass:
--------------------------------------------------------------------------------
1 | /* ------------------- Card ------------------- */
2 | .card
3 | display: flex
4 | flex-wrap: wrap
5 | flex-direction: column
6 | gap: 1rem
7 | padding: 1rem
8 | background: var(--bg-card)
9 | border-radius: var(--radius)
10 | box-shadow: var(--shadow)
11 | &> *
12 | width: 100%
13 | margin: 0
14 | &> img
15 | height: auto
16 | border-radius: var(--radius)
17 | width: 100%
18 | &.full
19 | width: calc( 100% + 2rem )
20 | max-width: unset
21 | &.full:first-child
22 | border-radius: var(--radius) var(--radius) 0 0
23 | margin: -1rem -1rem 0 -1rem
24 | &.full:last-child
25 | border-radius: 0 0 var(--radius) var(--radius)
26 | margin: 0 -1rem -1rem -1rem
27 | &>.img-w
28 | padding: 1rem
29 | box-shadow: 0 8px 20px -4px var(--b-shadow)
30 | max-width: 100px
31 | border-radius: 50%
32 | margin: 15px auto 15px
33 | width: 100px
34 | height: 100px
35 | &> img
36 | height: auto
37 | border-radius: 50%
38 | width: 100%
39 | .img-w200
40 | padding: 40px
41 | border-radius: 50%
42 | width: 200px
43 | height: 200px
44 | &> img
45 | height: auto
46 | border-radius: 50%
47 | width: 100%
48 |
--------------------------------------------------------------------------------
/src/sass/components/_details.sass:
--------------------------------------------------------------------------------
1 |
2 | /* ------------------ Details ----------------- */
3 | details
4 | width: 100%
5 | overflow-x: hidden
6 | display: flex
7 | flex-flow: wrap column
8 | border-radius: var(--radius)
9 | background: var(--bg-details)
10 | & > summary
11 | outline-color: initial
12 | padding: .6rem
13 | border-radius: var(--radius)
14 | outline: 0
15 | cursor: pointer
16 | font-weight: 500
17 | &:hover
18 | color: var(--primary)
19 | background-color: var(--bg-details)
20 | & > div
21 | padding: .5rem
22 | details[open]
23 | summary
24 | background-color: var(--bg-details-open)
25 | color: var(--txt-details-open)
26 | details+details
27 | margin-top: .5rem
28 |
--------------------------------------------------------------------------------
/src/sass/components/_dropdown.sass:
--------------------------------------------------------------------------------
1 | .dropdown
2 | display: inline-flex
3 | position: relative
4 | padding-bottom: .5rem
5 | &>a,&>button
6 | margin: 0
7 | &:after
8 | content: ""
9 | width: .5rem
10 | height: .5rem
11 | margin-left: 1rem
12 | transform-origin: color
13 | transform: rotate(45deg)
14 | display: block
15 | border: .1875rem solid currentColor
16 | border-bottom: 0
17 | border-left: 0
18 | pointer-events: none
19 | >[data-dropdown-id]
20 | display: none
21 | flex-direction: column
22 | left: 0
23 | list-style: none
24 | width: 14rem
25 | margin: 0
26 | padding: 0
27 | transform-origin: right top
28 | position: absolute
29 | border:1px solid var(--bg2)
30 | border-radius: var(--radius)
31 | background-color: var(--bg)
32 | box-shadow: var(--shadow)
33 | top: 100%
34 | z-index: 20
35 | &>a:hover,&>a.link-active
36 | padding: .3rem
37 | border: 0
38 | background: var(--bg2)
39 | color: var(--primary)
40 | >*
41 | width: 100%
42 | display: flex
43 | margin: 0
44 | border-radius: var(--radius)
45 | padding: .3rem
46 | &.dropdown-active
47 | &>a:after,&>button:after
48 | border-top: 0
49 | border-bottom: .1875rem solid currentColor
50 | &>[data-dropdown-id]
51 | display: flex
52 |
--------------------------------------------------------------------------------
/src/sass/components/_gotop_link.sass:
--------------------------------------------------------------------------------
1 | /* ---------------- Go Top Link --------------- */
2 | .gt-link
3 | transition: all .25s ease-in-out
4 | position: fixed
5 | bottom: 0
6 | right: 0
7 | z-index: 1
8 | min-width: 2.6rem
9 | padding: .4rem
10 | cursor: pointer
11 | visibility: visible
12 | opacity: 1
13 | &.hidden
14 | visibility: hidden
15 | opacity: 0
--------------------------------------------------------------------------------
/src/sass/components/_modal.sass:
--------------------------------------------------------------------------------
1 |
2 | .dialog,.dialog-overlay
3 | position: fixed
4 | top: 0
5 | right: 0
6 | bottom: 0
7 | left: 0
8 | .dialog
9 | display: flex
10 | z-index: 50
11 | padding: .5rem
12 | .dialog[aria-hidden='true']
13 | display: none
14 | .dialog-overlay
15 | background: rgba(43, 46, 56, 0.9)
16 |
17 | .dialog-content
18 | z-index: 50
19 | margin: auto
20 | display: flex
21 | flex-direction: column
22 | align-items: start
23 | max-block-size: 80vh
24 | max-block-size: 80dvb
25 | border-radius: 0.5em
26 | width: 100%
27 | max-width: 42rem
28 | overflow: hidden
29 | background: var(--bg)
30 | *
31 | margin: 0
32 | >*
33 | padding: 1rem
34 | >footer
35 | border-top: 1px solid var(--brd)
36 | display: flex
37 | gap: .5rem
38 | >header
39 | border-bottom: 1px solid var(--brd)
40 | display: flex
41 | align-items: center
42 | justify-content: space-between
43 | >section
44 | width: 100%
45 | @keyframes dialog-fade-in
46 | from
47 | opacity: 0
48 |
49 | @keyframes dialog-slide-up
50 | from
51 | transform: translateY(10%)
52 | .dialog-sm .dialog-content
53 | max-width: 320px
54 | .dialog-lg .dialog-content
55 | max-width: unset
56 | .dialog-overlay
57 | animation: dialog-fade-in 200ms both
58 | .dialog-content
59 | animation: dialog-fade-in 400ms 200ms both, dialog-slide-up 400ms 200ms both
60 |
61 | @media (prefers-reduced-motion: reduce)
62 | .dialog-close
63 | transition: none
64 | .dialog-content
65 | animation: none
66 |
--------------------------------------------------------------------------------
/src/sass/components/_snackbar.sass:
--------------------------------------------------------------------------------
1 | .snackbar
2 | position: fixed
3 | top: -100%
4 | left: 50%
5 | transform: translateX(-50%)
6 | background-color: var(--blue)
7 | border-radius: 10px
8 | width: 400px
9 | font-size: 16px
10 | transition: all .5s
11 | z-index: 9999
12 | box-shadow: var(--shadow)
13 |
14 | @media (max-width: 424px)
15 | .snackbar
16 | width: calc(100% - 20px)
17 |
18 | .snackbar.success
19 | background: var(--blue)
20 |
21 | .snackbar div
22 | color: var(--txt-on-blue)
23 | padding: 20px 30px
24 | text-align: center
25 |
--------------------------------------------------------------------------------
/src/sass/components/_tabs.sass:
--------------------------------------------------------------------------------
1 | /* ------------------- Tabs ------------------- */
2 | .tabs
3 | display: flex
4 | flex-wrap: wrap
5 | background: var(--bg-tabs)
6 | box-shadow: var(--shadow)
7 | border: 2px solid var(--brd-tabs)
8 | border-radius: var(--radius)
9 | margin-bottom: .5rem
10 | > label
11 | order: 1
12 | display: flex
13 | justify-content: center
14 | align-items: center
15 | padding: 0.7rem 1rem
16 | margin-right: 0.2rem
17 | cursor: pointer
18 | border-bottom: 0.2rem solid transparent
19 | font-weight: bold
20 | transition: background ease 0.2s
21 | > div
22 | width: 100%
23 | display: none
24 | padding: 1rem
25 | order: 99
26 | border-radius: var(--radius)
27 | flex-grow: 1
28 | & > *
29 | margin: .4rem
30 | & > input
31 | display: none
32 | &:checked
33 | & + label.ghost
34 | background: var(--bg-btn)!important
35 | color: var(--txt-btn)!important
36 | border-color: var(--bg-btn)!important
37 | & + label
38 | border-color: var(--brd-tabs-l)
39 | & + div
40 | display: block
41 |
42 |
--------------------------------------------------------------------------------
/src/sass/components/_toast.sass:
--------------------------------------------------------------------------------
1 | .toast
2 | position: fixed
3 | z-index: 20
4 | bottom: 0
5 | padding: .5rem
6 | display: flex
7 | flex-direction: column
8 | justify-items: center
9 | justify-content: center
10 | gap: .5rem
11 | &[toast-pos^="top"]
12 | bottom: unset
13 | top: 0
14 | flex-direction: column-reverse
15 | .toast-item
16 | --_travel-distance: -5vh
17 | &[toast-pos^="bottom"]
18 | bottom: 0
19 | &[toast-pos$="left"]
20 | left: 0
21 | &[toast-pos$="right"]
22 | right: 0
23 | .toast-item
24 | max-inline-size: min(25ch, 90vw)
25 | border-radius: var(--radius)
26 | color: var(--txt)
27 | background: var(--toast-bg)
28 | --toast-bg: var(--bg2)
29 | --_duration: 3s
30 | --_travel-distance: 5vh
31 | will-change: transform
32 | display: flex
33 | gap: 0.5rem
34 | justify-content: center
35 | align-items: center
36 | flex: 1
37 | padding: 1rem
38 | box-shadow: var(--shadow)
39 | animation: toast-in 500ms ease forwards 1
40 |
41 | &.success
42 | --toast-bg: var(--green-l)
43 | --toast-bg2: var(--green-d)
44 | &.error
45 | --toast-bg: var(--red-l)
46 | --toast-bg2: var(--red-d)
47 | &.warn
48 | --toast-bg: var(--orange-l)
49 | --toast-bg2: var(--orange-d)
50 | &.info
51 | --toast-bg: var(--blue-l)
52 | --toast-bg2: var(--blue-d)
53 | &.toast-out
54 | animation: toast-out .3s ease
55 | &>svg
56 | height: 20px
57 | width: 20px
58 | fill: var(--toast-bg2)
59 | &._closeIcon
60 | border-radius: 3px
61 | margin-left: 2rem
62 | @keyframes toast-out
63 | to
64 | transform: translateY(--_travel-distance)
65 | opacity: 0
66 |
67 | @keyframes toast-in
68 | from
69 | transform: translateY(var(--_travel-distance))
70 | opacity: 0
71 |
--------------------------------------------------------------------------------
/src/sass/elements/_button.sass:
--------------------------------------------------------------------------------
1 | /* ------------------ Buttons ----------------- */
2 | button,
3 | input[type="button"],
4 | input[type="submit"],
5 | input[type="reset"],
6 | input[type="file"],
7 | input[type="file"]::file-selector-button,
8 | .btn
9 | display: inline-flex
10 | align-items: center
11 | text-align: center
12 | justify-content: center
13 | cursor: pointer
14 | gap: .4rem
15 | line-height: 1.5
16 | font-size: 1rem
17 | border: 0.1rem solid var(--btn-brd)
18 | border-radius: var(--btn-radius)
19 | color: var(--btn-txt)
20 | background-color: var(--btn-bg)
21 | min-width: 100px
22 | cursor: pointer
23 | padding: .4rem .7rem
24 | margin: .4rem
25 | outline-color: var(--primary)
26 | box-shadow: 0 0 0 var(--btn-hs) var(--btn-f)
27 | transition: all 145ms ease
28 | user-select: none
29 | -webkit-touch-callout: none
30 | touch-action: manipulation
31 | -webkit-tap-highlight-color: transparent
32 | input[type="file"]::file-selector-button
33 | margin: 0 .4rem 0 0
34 | input[type="file"]
35 | inline-size: 100%
36 | padding: 0
37 | max-inline-size: max-content
38 | background-color: var(--btn-brd)
39 | border: 0
40 | input[type="file"]::file-selector-button
41 | height: 2.6rem
42 | border-radius: var(--btn-radius) 0 0 var(--btn-radius)
43 |
44 | button,
45 | input[type="button"],
46 | input[type="submit"],
47 | input[type="reset"],
48 | .btn
49 | height: 2.6rem
50 | &:active,&:focus
51 | --btn-hs: .3rem
52 | &:focus-visible
53 | outline: .1rem solid var(--btn-brd)
54 | outline-offset: .1rem
55 | &:not(active):hover
56 | --btn-bg: var(--btn-bg-h)
57 | --btn-brd: var(--btn-bg-h)
58 |
59 | &.mw-auto
60 | min-width: unset
61 | &[disabled]
62 | opacity: .5
63 | pointer-events: none
64 | cursor: not-allowed
65 | &.pill
66 | --btn-radius: 2rem
67 | &.outline
68 | --btn-bg: transparent
69 | color: var(--btn-brd)
70 | border: 2px solid var(--focus)
71 | &.outline:hover
72 | color: var(--btn-txt)
73 | &.fill:hover
74 | background: var(--btn-bg)
75 | color: var(--btn-txt)!important
76 | &>svg
77 | display: block
78 | height: 1.5rem
79 | width: 1.5rem
80 | max-height: 1.7rem
81 |
82 | .group-btn
83 | position: relative
84 | display: flex
85 | margin: .5rem
86 | >*
87 | margin: 0
88 | border-radius: 0
89 | &:first-child
90 | border-top-left-radius: var(--btn-radius)
91 | border-bottom-left-radius: var(--btn-radius)
92 | border-right: 1px
93 | &:last-child
94 | border-top-right-radius: var(--btn-radius)
95 | border-bottom-right-radius: var(--btn-radius)
96 | border-left: 1px
97 | .btn-transparent,._btn_t
98 | --btn-f: var(--primary-l)
99 | --btn-bg-h: transparent
100 | --btn-bg: transparent
101 | .btn-inverted
102 | --btn-f: var(--txt-h)
103 | --btn-brd: var(--txt)
104 | --btn-bg-h: var(--txt-l)
105 | --btn-bg: var(--txt)
106 | --btn-txt: var(--bg)
107 | .btn-black
108 | --btn-f: var(--black-h)
109 | --btn-brd: var(--black)
110 | --btn-bg-h: var(--black-l)
111 | --btn-bg: var(--black-l)
112 | --btn-txt: var(--white)
113 | .btn-white
114 | --btn-f: var(--white-h)
115 | --btn-brd: var(--white-l)
116 | --btn-bg-h: var(--white-l)
117 | --btn-bg: var(--white-l)
118 | --btn-txt: var(--black)
119 | .btn-p
120 | --btn-f: var(--primary-h)
121 | --btn-brd: var(--primary)
122 | --btn-bg: var(--primary)
123 | --btn-bg-h: var(--primary-l)
124 | --btn-txt: var(--txt-on-p)
125 | .btn-blue
126 | --btn-f: var(--blue-h)
127 | --btn-brd: var(--blue)
128 | --btn-bg: var(--blue)
129 | --btn-bg-h: var(--blue-l)
130 | --btn-txt: var(--txt-on-blue)
131 | .btn-red,[type="reset"]
132 | --btn-f: var(--red-h)
133 | --btn-txt: var(--txt-on-red)
134 | --btn-brd: var(--red)
135 | --btn-bg-h: var(--red-l)
136 | --btn-bg: var(--red)
137 | .btn-green
138 | --btn-f: var(--green-h)
139 | --btn-brd: var(--green)
140 | --btn-bg-h: var(--green-l)
141 | --btn-bg: var(--green)
142 | --btn-txt: var(--txt-on-green)
143 | .btn-orange
144 | --btn-f: var(--orange-h)
145 | --btn-brd: var(--orange)
146 | --btn-bg-h: var(--orange-l)
147 | --btn-bg: var(--orange)
148 | --btn-txt: var(--txt-on-orange)
149 |
--------------------------------------------------------------------------------
/src/sass/elements/_code.sass:
--------------------------------------------------------------------------------
1 | /* ------------------- Code ------------------- */
2 | code
3 | color: var(--primary)
4 | background: var(--bg2)
5 | pre
6 | display: flex
7 | box-shadow: var(--shadow)
8 | border-radius: var(--radius)!important
9 | border-left: var(--radius) solid var(--primary)
10 | background-color: var(--bg)
11 | & > code
12 | margin: 0
13 | padding: 1.5rem 1.0rem
14 | background-color: transparent
15 | code,
16 | kbd,
17 | samp
18 | padding: .1rem .3rem
19 | background: var(--bg2)
20 | white-space: pre
21 | font-size: 90%
22 | border-radius: 6px
23 | kbd
24 | border: 1px solid var(--txt)
25 | border-bottom: 3px solid var(--txt)
26 |
--------------------------------------------------------------------------------
/src/sass/elements/_figure.sass:
--------------------------------------------------------------------------------
1 | /* ------------- Image and Figure ------------- */
2 | img
3 | max-width: 100%
4 | border-radius: var(--radius)
5 | &.circle
6 | border-radius: 50%
7 | &.square
8 | border-radius: 0
9 | figure
10 | text-align: center
11 | & > img
12 | display: block
13 | margin: 0.5em auto
14 | figcaption
15 | color: var(--brd)
16 | margin-bottom: 1rem
--------------------------------------------------------------------------------
/src/sass/elements/_form.sass:
--------------------------------------------------------------------------------
1 | .field
2 | display: flex
3 | justify-content: center
4 | gap: .5rem
5 | flex-direction: column
6 | [class^="with-icon"]
7 | position: relative
8 | [class^="with-icon"]>svg
9 | position: absolute
10 | top: 50%
11 | transform: translateY(-50%)
12 | .with-icon-left>svg
13 | left: 1rem
14 | .with-icon-right>svg
15 | left: 1rem
16 | .with-icon-left>input
17 | padding-left: 3rem!important
18 | .with-icon-right>input
19 | padding-right: 3rem!important
20 |
21 | input[type="color"]
22 | -webkit-appearance: none
23 | border: none
24 | border-radius: var(--radius)
25 | width: 32px
26 | height: 32px
27 | input[type="color"]::-webkit-color-swatch-wrapper
28 | padding: 0
29 | input[type="color"]::-webkit-color-swatch
30 | border: none
31 | border-radius: var(--radius)
32 | textarea,
33 | input:not([type=color]):not([type=file]):not([type=button]):not([type=range]):not([type=radio]):not([type=checkbox]),
34 | select
35 | display: block
36 | width: 100%
37 | font-size: .875rem
38 | line-height: 1.25rem
39 | height: 2.6rem
40 | padding: .6rem
41 | border: .1rem solid var(--input-brd)
42 | border-radius: var(--radius)
43 | background-color: var(--input-bg)
44 | background-clip: padding-box
45 | color: var(--input-txt)
46 | &:focus
47 | outline: 0
48 | border-color: var(--primary)
49 | box-shadow: 0 0 0 5px var(--primary-h)
50 | &[disabled]
51 | cursor: not-allowed
52 | &:disabled,
53 | &[readonly]
54 | background-color: var(--input-brd)
55 | opacity: 1
56 | select
57 | -webkit-appearance: none
58 | -moz-appearance: none
59 | color: var(--txt)
60 | background-image: url('data:image/svg+xml;utf8, ')
61 | background-position: right center
62 | background-size: 18px 18px, 18px 18px, 2px 1.6rem
63 | background-repeat: no-repeat
64 |
65 | fieldset
66 | margin-top: 1rem
67 | border-radius: var(--radius)
68 | border: .1rem solid var(--input-brd)
69 |
70 | @supports (-webkit-appearance: none) or (-moz-appearance: none)
71 | input[type="checkbox"],
72 | input[type="radio"]
73 | --active: var(--primary)
74 | --active-inner: #fff
75 | --focus: 3px var(--primary-h)
76 | --border: var(--input-brd)
77 | --border-hover: var(--primary)
78 | --background: var(--bg)
79 | -webkit-appearance: none
80 | -moz-appearance: none
81 | height: 1.3rem
82 | outline: none
83 | display: inline-block
84 | vertical-align: top
85 | position: relative
86 | margin: 0
87 | cursor: pointer
88 | border: .1rem solid var(--bc, var(--border))
89 | background: var(--b, var(--background))
90 | transition: background 0.3s, border-color 0.3s, box-shadow 0.2s
91 |
92 | input[type="checkbox"]:after,
93 | input[type="radio"]:after
94 | content: ""
95 | display: block
96 | left: .1rem
97 | top: .1rem
98 | position: absolute
99 | transition: transform var(--d-t, 0.3s) var(--d-t-e, ease),opacity var(--d-o, 0.2s)
100 |
101 | input[type="checkbox"]:checked,
102 | input[type="radio"]:checked
103 | --b: var(--active)
104 | --bc: var(--active)
105 | --d-o: 0.3s
106 | --d-t: 0.6s
107 | --d-t-e: cubic-bezier(0.2, 0.85, 0.32, 1.2)
108 |
109 | input[type="checkbox"]:disabled,
110 | input[type="radio"]:disabled
111 | --b: var(--disabled)
112 | cursor: not-allowed
113 | opacity: 0.9
114 |
115 | input[type="checkbox"]:disabled:checked,
116 | input[type="radio"]:disabled:checked
117 | --b: var(--disabled-inner)
118 | --bc: var(--border)
119 |
120 | input[type="checkbox"]:disabled + label,
121 | input[type="radio"]:disabled + label
122 | cursor: not-allowed
123 |
124 | input[type="checkbox"]:hover:not(:checked):not(:disabled),
125 | input[type="radio"]:hover:not(:checked):not(:disabled)
126 | --bc: var(--border-hover)
127 |
128 | input[type="checkbox"]:focus,
129 | input[type="radio"]:focus
130 | --bc: var(--active)
131 | box-shadow: 0 0 0 var(--focus)
132 |
133 | input[type="checkbox"]:not(.toggle),
134 | input[type="radio"]:not(.toggle)
135 | width: 1.3rem
136 |
137 | input[type="checkbox"]:not(.toggle):after,
138 | input[type="radio"]:not(.toggle):after
139 | opacity: var(--o, 0)
140 |
141 | input[type="checkbox"]:not(.toggle):checked,
142 | input[type="radio"]:not(.toggle):checked
143 | --o: 1
144 |
145 | input[type="checkbox"] + label,
146 | input[type="radio"] + label
147 | line-height: 1.3rem
148 | display: inline-block
149 | vertical-align: top
150 | cursor: pointer
151 | margin-left: .3rem
152 |
153 | input[type="checkbox"]:not(.toggle)
154 | border-radius: .4rem
155 |
156 | input[type="checkbox"]:not(.toggle):after
157 | width: .4rem
158 | height: .6rem
159 | border: .2rem solid var(--active-inner)
160 | border-top: 0
161 | border-left: 0
162 | left: .4rem
163 | top: .2rem
164 | transform: rotate(var(--r, 20deg))
165 |
166 | input[type="checkbox"]:not(.toggle):checked
167 | --r: 43deg
168 |
169 | input[type="checkbox"].toggle
170 | width: 38px
171 | border-radius: 11px
172 |
173 | input[type="checkbox"].toggle:after
174 | left: .1rem
175 | top: .1rem
176 | border-radius: 50%
177 | width: .9rem
178 | height: .9rem
179 | background: var(--ab, var(--border))
180 | transform: translateX(var(--x, 0))
181 |
182 | input[type="checkbox"].toggle:checked
183 | --ab: var(--active-inner)
184 | --x: 1.1rem
185 |
186 | input[type="checkbox"].toggle:disabled:not(:checked):after
187 | opacity: 0.6
188 |
189 | input[type="radio"]
190 | border-radius: 50%
191 |
192 | input[type="radio"]:after
193 | width: .9rem
194 | height: .9rem
195 | border-radius: 50%
196 | background: var(--active-inner)
197 | opacity: 0
198 | transform: scale(var(--s, 0.7))
199 |
200 | input[type="radio"]:checked
201 | --s: 0.8
202 |
--------------------------------------------------------------------------------
/src/sass/elements/_link.sass:
--------------------------------------------------------------------------------
1 | .link
2 | color: var(--primary)
3 | background-color: transparent
4 | border-color: transparent
5 | &:hover
6 | color: var(--primary-l)
7 | text-decoration: underline
8 | background-color: transparent
9 | &:focus
10 | color: var(--primary-d)
11 | text-decoration: underline
12 | background-color: transparent
13 | box-shadow: 0 0 0 .25rem var(--primary-h)
14 | &:active
15 | color: var(--primary-d)
16 | text-decoration: underline
17 | background-color: transparent
18 |
--------------------------------------------------------------------------------
/src/sass/elements/_table.sass:
--------------------------------------------------------------------------------
1 | /* ------------------- Table ------------------ */
2 | table
3 | width: 100%
4 | padding: 0
5 | border-collapse: collapse
6 | overflow: hidden
7 | border-radius: var(--radius)
8 | box-shadow: var(--fake-brd-table)
9 | caption
10 | padding: 0.5rem 1.5rem
11 | thead
12 | background: var(--primary)
13 | color: var(--txt-r)
14 | th:first-child
15 | border-top-left-radius: var(--radius)
16 | th:last-child
17 | border-top-right-radius: var(--radius)
18 | td,th
19 | padding: 0.5rem 1.5rem
20 | tr
21 | text-align: left
22 | padding: .3rem
23 | border-bottom: 1px solid var(--brd-table)
24 | &:hover
25 | background-color: var(--bbg-table-hover)
26 | &:last-child
27 | border-bottom: none
28 | &:first-child
29 | & > th
30 | border-bottom: 1px solid var(--primary)
31 | tfoot
32 | border-top: 1px solid var(--brd-table)
33 | @media (max-width: 500px)
34 | table, thead, tbody, th, td, tr
35 | display: block
36 | table
37 | border: 0
38 | thead
39 | display: none
40 | caption
41 | display: block
42 | font-size: 1.3em
43 | tr
44 | border-bottom: 2px solid var(--brd-table)
45 | display: block
46 | td
47 | border-bottom: 1px solid var(--brd-table)
48 | font-size: .8em
49 | display: flex
50 | align-items: center
51 | td::before
52 | content: attr(data-column)
53 | text-align: left
54 | width: 45%
55 | font-weight: bold
56 | text-transform: uppercase
57 | td:last-child
58 | border-bottom: 0
59 |
60 |
--------------------------------------------------------------------------------
/src/sass/elements/_typography.sass:
--------------------------------------------------------------------------------
1 | /* ------------------ Heading ----------------- */
2 |
3 | h1, h2, h3, h4, h5, h6
4 | margin-top: 1.5rem
5 | h1
6 | font-size: 2.6em
7 | h2
8 | font-size: 2.0em
9 | h3
10 | font-size: 1.7em
11 | h4
12 | font-size: 1.5em
13 | h5
14 | font-size: 1.2em
15 | h6
16 | font-size: 1em
17 | p
18 | margin-bottom: 1.5rem
19 | p strong, p b
20 | color: var(--txt)
21 | h1 + h2,
22 | h2 + h3,
23 | h3 + h4,
24 | h4 + h5,
25 | h5 + h6
26 | margin: 0
27 | blockquote
28 | border-left: var(--radius) solid var(--primary)
29 | padding: 1rem 1.5rem
30 | q
31 | &:before
32 | content: "\201C"
33 | q
34 | &:before
35 | content: "\2018"
36 | &:after
37 | content: "\2019"
38 | &:after
39 | content: "\201D"
40 | summary
41 | font-weight: bold
42 | cursor: pointer
43 | time
44 | color: var(--txt)
45 | opacity: .7
46 | mark
47 | background-color: var(--primary)
48 | color: var(--txt-r)
49 | padding: .1rem .2rem
50 | font-size: 90%
51 | small,
52 | sub,
53 | sup
54 | font-size: 75%
55 | var
56 | color: var(--yellow)
57 | ins
58 | color: var(--green)
59 | del
60 | color: var(--red)
61 | /* ------------------- Links ------------------ */
62 | a
63 | color: var(--primary)
64 | text-decoration: none
65 | cursor: pointer
--------------------------------------------------------------------------------
/src/sass/extra/_alert.sass:
--------------------------------------------------------------------------------
1 | /* --------------- Toast Message -------------- */
2 | .alert-item
3 | transition: all .3s
4 | max-width: 200px
5 | padding: .8rem
6 | margin-bottom: .3rem
7 | display: flex
8 | background: var(--primary)
9 | border-radius: var(--radius)
10 | box-shadow: var(--shadow)
11 | animation: fade-in .3s
12 | animation-timing-function: cubic-bezier(.6,.04,.98,.34)
13 | &.animate-out
14 | animation: fade-out .3s
15 | animation-timing-function: cubic-bezier(.6,.04,.98,.34)
16 | &.success
17 | background: var(--green)
18 | &.error
19 | background: var(--red)
20 | &.warn
21 | background: var(--yellow)
22 | &.info
23 | background: var(--blue)
24 |
25 | .alert-container
26 | position: fixed
27 | padding: .3rem
28 | display: flex
29 | align-items: center
30 | flex-direction: column
31 | z-index: 9999
32 | &._top
33 | flex-direction: column-reverse
34 | &._bottom
35 | bottom:0
36 | &._left
37 | left: 0
38 | &._right
39 | right: 0
40 | &._center
41 | left: 50%
42 | transform: translateX(-50%)
43 |
44 |
45 | @keyframes fade-out
46 | from
47 | opacity: 1
48 | transform: scaleY(1)
49 | to
50 | opacity: 0
51 | transform: scaleY(0)
52 | @keyframes fade-in
53 | from
54 | opacity: 0
55 | transform: scaleY(0)
56 | to
57 | opacity: 1
58 | transform: scaleY(1)
59 |
60 |
--------------------------------------------------------------------------------
/src/sass/extra/_aos.sass:
--------------------------------------------------------------------------------
1 | /* ------------ Animation On Scroll ----------- */
2 | [class*=_aos],._aos
3 | opacity: 0
4 | transition: opacity 1s, transform 1.3s
5 | ._aos-zoom
6 | transform: scale(.4)
7 | ._aos-left
8 | transform: translate3d(-100px,0,0)
9 | ._aos-right
10 | transform: translate3d(100px,0,0)
11 | ._aos-top
12 | transform: translate3d(0,-100px, 0)
13 | ._aos-bottom
14 | transform: translate3d(0,100px, 0)
15 | ._aos-done
16 | opacity: 1
17 | transform: translateZ(0) scale(1)
18 |
--------------------------------------------------------------------------------
/src/sass/extra/_carousel.sass:
--------------------------------------------------------------------------------
1 | .carousel
2 | position: relative
3 | .slide
4 | display: none
5 | .prev-btn,.next-btn
6 | position: absolute
7 | top: 50%
8 | transform: translateY(-50%)
9 | .prev-btn
10 | left: 0
11 | .next-btn
12 | right: 0
13 | .numbertext
14 | color: #f2f2f2
15 | font-size: 12px
16 | padding: 8px 12px
17 | position: absolute
18 | top: 0
19 | right: 0
20 | .dot
21 | cursor: pointer
22 | height: 15px
23 | width: 15px
24 | margin: 0 2px
25 | background-color: var(--bg2)
26 | border-radius: 50%
27 | display: inline-block
28 | transition: background-color 0.6s ease
29 | .active,.dot:hover
30 | background-color: var(--primary)
31 |
--------------------------------------------------------------------------------
/src/sass/extra/_loading.sass:
--------------------------------------------------------------------------------
1 | // Loading ([aria-busy=true])
2 |
3 | // Cursor
4 | [aria-busy="true"]
5 | cursor: progress
6 |
7 | // Everyting except form elements
8 | [aria-busy="true"]:not(input):not(select):not(textarea)
9 | &::before
10 | display: inline-block
11 | width: 1em
12 | height: 1em
13 | border: 0.1875em solid currentColor
14 | border-radius: 1em
15 | border-right-color: transparent
16 | vertical-align: text-bottom
17 | vertical-align: -.125em // Visual alignment
18 | animation: spinner 0.75s linear infinite
19 | content: ''
20 | opacity: .5
21 |
22 | &:not(:empty)
23 | &::before
24 | margin-right: calc(var(--spacing) * 0.5)
25 | margin-left: 0
26 | margin-inline-end: calc(var(--spacing) * 0.5)
27 | margin-inline-start: 0
28 | &:empty
29 | text-align: center
30 |
31 | // Buttons and links
32 | button,
33 | input[type="submit"],
34 | input[type="button"],
35 | input[type="reset"],
36 | a
37 | &[aria-busy="true"]
38 | pointer-events: none
39 |
40 | // Animation: rotate
41 | @keyframes spinner
42 | to
43 | transform: rotate(360deg)
44 |
45 |
--------------------------------------------------------------------------------
/src/sass/extra/_pages.sass:
--------------------------------------------------------------------------------
1 | .pages
2 | > *
3 | display: none
4 | >.page-active
5 | display: flex
--------------------------------------------------------------------------------
/src/sass/extra/_tooltip.sass:
--------------------------------------------------------------------------------
1 | /* ------------------ Tooltip ----------------- */
2 | [data-tooltip]
3 | cursor: pointer
4 | position: relative
5 | text-decoration: none
6 | [data-tooltip]::after
7 | background-color: var(--primary)
8 | color: var(--txt-r)
9 | font-size: 14px
10 | padding: 8px 12px
11 | height: fit-content
12 | width: fit-content
13 | border-radius: 6px
14 | position: absolute
15 | text-align: center
16 | bottom: 0px
17 | left: 50%
18 | content: attr(data-tooltip)
19 | transform: translate(-50%, 110%) scale(0)
20 | transform-origin: top
21 | transition: 0.14s
22 | box-shadow: var(--shadow)
23 | [data-tooltip]:hover
24 | &:after
25 | display: block
26 | transform: translate(-50%, 110%) scale(1)
27 |
--------------------------------------------------------------------------------
/src/sass/extra/_wave.sass:
--------------------------------------------------------------------------------
1 | svg.wave
2 | display: block
3 | width: 100%
4 | height: 15em
5 | max-height: 100vh
6 | margin: 0
7 |
8 | > path
9 | fill: var(--primary)
10 | animation: wave 10s linear infinite
11 |
12 | @keyframes wave
13 | 0%
14 | transform: translateX(0)
15 | 100%
16 | transform: translateX(-100%)
17 |
--------------------------------------------------------------------------------
/src/sass/fontlist.sass:
--------------------------------------------------------------------------------
1 | @charset "utf-8"
2 |
3 | @import "./settings/variables"
4 | @import "./theme/light"
5 | @import "./theme/dark"
6 | html
7 | --primary: var(--orange) !important
8 | --primary-h: var(--orange-h)!important
9 | --primary-l: var(--orange-l)!important
10 | --primary-d: var(--orange-d)!important
11 | --slider-color: var(--primary-l)
12 | --slider-thumb-color: #fff
13 |
14 | body
15 | background-color: var(--primary)
16 | background-image: linear-gradient(315deg, var(--primary)0%, var(--primary-l)74%)
17 | background-size: 200% 100%
18 | height: auto
19 | #flist
20 | display: grid
21 | grid-gap: .5rem
22 | grid-template-columns: repeat(auto-fill, minmax(200px, 1fr))
23 |
24 | @import "./base/basic"
25 | @import "./extra/aos"
26 | @import "./elements/typography"
27 | @import "./elements/form"
28 |
29 | @import "./layout/navbar"
30 | @import "./layout/header"
31 | @import "./layout/container"
32 | @import "./layout/grid"
33 | @import "./layout/footer"
34 | @import "./elements/code"
35 | @import "./elements/button"
36 | @import "./components/card"
37 | @import "./components/modal"
38 | @import "./components/snackbar"
39 | @import "./components/gotop_link"
40 | @import "./extra/tooltip"
41 | @import "./extra/alert"
42 |
43 | @import "./utilities/alignment"
44 | @import "./utilities/position"
45 | @import "./utilities/background"
46 | @import "./utilities/border"
47 | @import "./utilities/display"
48 | @import "./utilities/margin"
49 | @import "./utilities/general"
50 | @import "./utilities/padding"
51 | @import "./utilities/spacer"
52 | @import "./utilities/text"
53 |
54 | #results>span
55 | display: flex
56 | align-items: center
57 | gap: .5rem
58 | pre
59 | max-width: calc(100vw - 8rem)
60 | overflow: scroll
61 | input[type=range]
62 | -webkit-appearance: none
63 | margin: 10px 0
64 | width: 100%
65 |
66 | input[type=range]:focus
67 | outline: none
68 |
69 | input[type=range]::-webkit-slider-runnable-track
70 | height: 6px
71 | background: #ddd
72 | border-radius: 3px
73 |
74 | input[type=range]::-webkit-slider-thumb
75 | -webkit-appearance: none
76 | height: 20px
77 | width: 20px
78 | background: #fff
79 | border-radius: 50%
80 | border: 1px solid #ccc
81 | margin-top: -8px
82 |
83 | input[type=range]::-webkit-slider-runnable-track
84 | background: var(--slider-color)
85 |
86 | input[type=range]::-webkit-slider-thumb
87 | background: var(--slider-thumb-color)
88 |
--------------------------------------------------------------------------------
/src/sass/index.sass:
--------------------------------------------------------------------------------
1 | @charset "utf-8"
2 |
3 | @import "./settings/variables"
4 |
5 | @import "./theme/light"
6 | @import "./theme/dark"
7 | $or-50: '#ffffff'
8 | $or-100: '#fdddde'
9 | $or-200: '#fababd'
10 | $or-300: '#f8989d'
11 | $or-400: '#f5757c'
12 | $or-500: '#f3535b'
13 | $or-600: '#d94148'
14 | $or-700: '#bf2f36'
15 | $or-800: '#a41c23'
16 | $or-900: '#8a0a10'
17 | html
18 | --primary: #{$or-500}!important
19 | --primary-h: #{$or-100}!important
20 | --primary-l: #{$or-400}!important
21 | --primary-d: #{$or-800}!important
22 |
23 | [data-theme="dark"]
24 | --primary: #{$or-500} !important
25 | --primary-h: #{$or-800}!important
26 | --primary-l: #{$or-400}!important
27 | --primary-d: #{$or-600}!important
28 |
29 | body
30 | background-color: #f7b42c
31 | background-image: linear-gradient(315deg, #f7b42c 0%, #fc575e 74%)
32 | background-size: 400% 100%
33 | height: auto
34 |
35 | @import "./base/basic"
36 | @import "./extra/aos"
37 | @import "./elements/typography"
38 |
39 | @import "./layout/navbar"
40 | @import "./layout/header"
41 | @import "./layout/container"
42 | @import "./layout/grid"
43 | @import "./layout/footer"
44 |
45 | @import "./elements/button"
46 | @import "./components/card"
47 | @import "./elements/form"
48 | @import "./components/modal"
49 | @import "./components/gotop_link"
50 | @import "./extra/tooltip"
51 | @import "./extra/alert"
52 |
53 | @import "./utilities/alignment"
54 | @import "./utilities/background"
55 | @import "./utilities/position"
56 | @import "./utilities/border"
57 | @import "./utilities/display"
58 | @import "./utilities/margin"
59 | @import "./utilities/general"
60 | @import "./utilities/padding"
61 | @import "./utilities/spacer"
62 | @import "./utilities/text"
63 |
--------------------------------------------------------------------------------
/src/sass/layout/aside.sass:
--------------------------------------------------------------------------------
1 | /* ------------ Aside menu on right ----------- */
2 | aside
3 | position: sticky
4 | top: 6rem
5 | width: 100%
6 | font-size: smaller
7 | background: var(--aside-bg)
8 | padding: .5rem
9 | border-radius: var(--radius)
10 | box-shadow: var(--aside-bs)
11 | ul
12 | padding: .5rem
13 | margin: 0
14 | a
15 | display: flex
16 | align-items: center
17 | justify-content: flex-start
18 | width: 100%
19 | text-decoration: none
20 | padding: 0.5rem
21 | border-radius: var(--radius)
22 | border: 0!important
23 | &:hover,&.active
24 | background: var(--aside-bg-h)
25 |
--------------------------------------------------------------------------------
/src/sass/layout/container.sass:
--------------------------------------------------------------------------------
1 | /* ------- Main container and .cnt class ------ */
2 | .cnt,main
3 | margin: auto
4 | width: 100%
5 | max-width: 60rem
6 | padding: 0 .5rem
7 | &.full
8 | max-width: auto
9 | .links-cnt
10 | display: flex
11 | flex-flow: row wrap
12 | gap: 1rem
13 | ._2-col
14 | display: grid
15 | grid-template-columns: 1fr 1fr
16 | gap: .5rem
17 | margin-top: .5rem
--------------------------------------------------------------------------------
/src/sass/layout/footer.sass:
--------------------------------------------------------------------------------
1 | /* ------------------ Footer ------------------ */
2 | footer
3 | width: 100%
4 | padding: .5rem
5 | footer>div
6 | border-radius: calc(var(--radius) + 0.2rem)
7 | padding: .4rem
--------------------------------------------------------------------------------
/src/sass/layout/grid.sass:
--------------------------------------------------------------------------------
1 | /* ----------- Grid columns and row ----------- */
2 | .grid
3 | flex-wrap: wrap
4 | .row ,.grid
5 | display: flex
6 | align-items: stretch
7 | &>[class*="col"],&>div
8 | flex: 0 0 auto
9 | flex-shrink: 0
10 | width: 100%
11 | max-width: 100%
12 | padding: .5rem
13 | &>[class*="col"]>*,&>div>*
14 | margin: 0
15 | .col,&>div
16 | flex: 1 1 100%
17 | .col-2
18 | width: calc((100%) / (12/2))
19 | .col-3
20 | width: calc((100%) / (12/3))
21 | .col-4
22 | width: calc((100%) / (12/4))
23 | .col-6
24 | width: calc((100%) / (12/6))
25 | .col-8
26 | width: calc((100%) / (12/8))
27 | .col-9
28 | width: calc((100%) / (12/9))
29 | .col-10
30 | width: calc((100%) / (12/10))
31 |
32 | @media (max-width:40em)
33 | .row:not(.keep-width),.grid:not(.keep-width)
34 | flex-direction: column !important
35 | &>[class*="col"],&>div
36 | width: auto
--------------------------------------------------------------------------------
/src/sass/layout/header.sass:
--------------------------------------------------------------------------------
1 | /* ------------------ Header ------------------ */
2 | header
3 | & + .hero
4 | margin-top: 4rem
5 | .hero
6 | display: flex
7 | flex-direction: column
8 | justify-content: center
9 | align-items: center
10 | padding: 2rem 1rem
11 | text-align: center
12 | border-radius: var(--radius)
--------------------------------------------------------------------------------
/src/sass/layout/navbar.sass:
--------------------------------------------------------------------------------
1 | /* ------------------ Navbar ------------------ */
2 | header
3 | width: 100%
4 | z-index: 2
5 | padding: .5rem .5rem 0 .5rem
6 | top: 0
7 |
8 | nav
9 | display: flex
10 | justify-content: space-between
11 | align-items: center
12 | background: var(--bg-nav)
13 | border-radius: calc( var(--radius) + .2rem)
14 | box-shadow: var(--shadow)
15 | padding: .4rem
16 | width: 100%
17 | margin: auto
18 | max-width: 60rem
19 | >.nav-overlay
20 | display: none
21 | position: fixed
22 | top: 0
23 | left: 0
24 | width: 100%
25 | height: 100%
26 | background: rgba(17, 17, 17, 0.6)
27 | z-index: -1
28 | *
29 | margin: 0
30 | padding: 0
31 | display: flex
32 | align-items: center
33 | >button
34 | display: none
35 | margin: 0 !important
36 | min-width: auto
37 | font-size: 0.875em
38 | padding: .5rem
39 | >svg line
40 | stroke: currentColor
41 | stroke-width: 4
42 | stroke-linecap: round
43 | transform-origin: 12px 12px
44 | transition: all .4s
45 | >a
46 | gap: .5rem
47 | font-size: 1.6rem
48 | padding: 0.4rem
49 | >svg
50 | height: 1.6rem !important
51 | width: 1.6rem !important
52 | a:hover
53 | border: none !important
54 | >ul
55 | flex-direction: row
56 | justify-content: space-between
57 | list-style: none
58 | width: auto
59 | gap: .5rem
60 | >li
61 | gap: .5rem
62 | >li >a,>li .nav-item
63 | padding: .4rem
64 | border-radius: var(--radius)
65 | color: var(--txt)
66 | &:hover,&.active
67 | background: var(--bg-nav-h)
68 | &.active
69 | color: var(--primary)
70 |
71 | @media only screen and ( max-width: 768px )
72 | nav
73 | &>ul
74 | position: fixed
75 | top: 5rem
76 | padding: .5rem
77 | right: -100%
78 | flex-direction: column
79 | background: var(--bg-nav)
80 | width: calc(100% - 1rem)
81 | border-radius: 10px
82 | text-align: center
83 | transition: .3s
84 | box-shadow: var(--shadow)
85 | &>button
86 | display: flex
87 | cursor: pointer
88 | &.active
89 | &>.nav-overlay
90 | display: flex
91 | >ul
92 | right: .5rem
93 |
94 | >button svg line:nth-child(1)
95 | opacity: 0
96 | transform: translateY(-100%)
97 | >button svg line:nth-child(4)
98 | opacity: 0
99 | transform: translateY(100%)
100 | >button svg line:nth-child(2)
101 | transform: rotate(45deg)
102 | >button svg line:nth-child(3)
103 | transform: rotate(-45deg)
104 |
--------------------------------------------------------------------------------
/src/sass/settings/_colors.sass:
--------------------------------------------------------------------------------
1 | //Gray
2 |
3 | $gray-50:#f9fafb
4 | $gray-100:#f3f4f6
5 | $gray-200:#e5e7eb
6 | $gray-300:#d1d5db
7 | $gray-400:#9ca3af
8 | $gray-500:#6b7280
9 | $gray-600:#4b5563
10 | $gray-700:#374151
11 | $gray-800:#1f2937
12 | $gray-900:#111827
13 | //Blue
14 | $blue-50: #E0F1FF
15 | $blue-100: #C2E2FF
16 | $blue-200: #8AC8FF
17 | $blue-300: #4DACFF
18 | $blue-400: #1492FF
19 | $blue-500: #0074D8
20 | $blue-600: #005CAD
21 | $blue-700: #004480
22 | $blue-800: #002E57
23 | $blue-900: #001629
24 | //Green
25 | $green-50: #E9FBF0!default
26 | $green-100: #CFF7DE!default
27 | $green-200: #9FEFBC!default
28 | $green-300: #6FE69B!default
29 | $green-400: #40DE7A!default
30 | $green-500: #22C55E!default
31 | $green-600: #1B9D4B!default
32 | $green-700: #147538!default
33 | $green-800: #0D4E25!default
34 | $green-900: #072713!default
35 | //Red
36 | $red-50: #FFECEB
37 | $red-100: #FFD9D6
38 | $red-200: #FFB3AD
39 | $red-300: #FF8D85
40 | $red-400: #FF675C
41 | $red-500: #FF4132
42 | $red-600: #F51000
43 | $red-700: #B80C00
44 | $red-800: #7A0800
45 | $red-900: #3D0400
46 | //Orange
47 | $orange-50: #FFF4EB
48 | $orange-100: #FFE7D1
49 | $orange-200: #FFCEA3
50 | $orange-300: #FFB675
51 | $orange-400: #FF9D47
52 | $orange-500: #FF851B
53 | $orange-600: #E06900
54 | $orange-700: #A84F00
55 | $orange-800: #703400
56 | $orange-900: #381A00
57 | //Purple
58 | $purple-50: #f7f2fc
59 | $purple-100: #dfccf4
60 | $purple-200: #c7a6ec
61 | $purple-300: #b080e5
62 | $purple-400: #985add
63 | $purple-500: #8034d5
64 | $purple-600: #6b2bb2
65 | $purple-700: #55228f
66 | $purple-800: #40186b
67 | $purple-900: #2a0f48
68 |
69 | $white-0: #fff
70 | $white-50: #fafafa
71 | $white-100:#dbdbdb
72 |
73 | $black-0: #000
74 | $black-50: #101010
75 | $black-100: #4d4d4d
76 |
--------------------------------------------------------------------------------
/src/sass/settings/_variables.sass:
--------------------------------------------------------------------------------
1 | // --------------------------------------------------
2 | // Variables
3 | // --------------------------------------------------
4 | @import colors
5 | // Typography
6 | $line-height-base: 1.5 !default
7 | $font-size-base: 1rem !default
8 |
9 | // Grid
10 | $grid-columns: 12 !default
11 | $grid-gap: .5rem !default
12 | $grid-gutter: 1.5rem !default
13 |
14 | // Button
15 | $btn-border-width: 2px !default
16 | $btn-border-radius: .5rem !default
17 | $btn-font-size: $font-size-base !default
18 | $btn-line-height: $line-height-base !default
19 |
--------------------------------------------------------------------------------
/src/sass/theme/dark.sass:
--------------------------------------------------------------------------------
1 | [data-theme="dark"]
2 | //Color Palette
3 | --blue: #{$blue-500}
4 | --blue-l: #{$blue-400}
5 | --blue-h: #{$blue-800}
6 | --blue-d: #{$blue-600}
7 | --purple: #{$purple-500}
8 | --purple-l: #{$purple-400}
9 | --purple-h: #{$purple-800}
10 | --purple-d: #{$purple-600}
11 | --green: #{$green-500}
12 | --green-h: #{$green-800}
13 | --green-l: #{$green-400}
14 | --green-d: #{$green-300}
15 | --red: #{$red-500}
16 | --red-h: #{$red-800}
17 | --red-l: #{$red-400}
18 | --red-d: #{$red-300}
19 | --orange: #{$orange-500}
20 | --orange-h: #{$orange-800}
21 | --orange-l: #{$orange-400}
22 | --orange-d: #{$orange-600}
23 | --gray: #{$gray-600}
24 | --gray-l: #{$gray-500}
25 | --gray-d: #{$gray-800}
26 | --txt-l:var(--white-l)
27 | --txt-p : var(--white)
28 | --txt-red : var(--white)
29 | --txt-green : var(--white)
30 | --txt-blue : var(--white)
31 | --txt-orange : var(--white)
32 | //Text Colors
33 | --txt: var(--white)
34 | --txt-r: var(--black)
35 | //Background Colors
36 | --bg3: #{$gray-700}
37 | --bg2: #{$gray-800}
38 | --bg: #{$gray-900}
39 |
40 | //Border
41 | --brd: #{$gray-600}
42 | --aside-bg-h: #{$gray-700}
43 | --bg-card: var(--bg)
44 | --bg-details: var(--bg2)
45 | --bg-details2: var(--bg3)
46 | --txt-details-open: var(--txt)
47 | --shadow: none
48 | --b-shadow: var(--black)
49 |
50 | [data-theme="light"] .light-icon,[data-theme="dark"] .dark-icon
51 | display: block !important
52 | .theme-icon
53 | display: none
54 |
--------------------------------------------------------------------------------
/src/sass/theme/light.sass:
--------------------------------------------------------------------------------
1 | html , [data-theme='light']
2 | //Color Palette
3 | --blue: #{$blue-500}
4 | --blue-l: #{$blue-400}
5 | --blue-h: #{$blue-50}
6 | --blue-d: #{$blue-800}
7 | --purple: #{$purple-500}
8 | --purple-l: #{$purple-400}
9 | --purple-h: #{$purple-50}
10 | --purple-d: #{$purple-800}
11 | --green: #{$green-500}
12 | --green-h: #{$green-100}
13 | --green-l: #{$green-400}
14 | --green-d: #{$green-800}
15 | --red: #{$red-500}
16 | --red-h: #{$red-100}
17 | --red-l: #{$red-400}
18 | --red-d: #{$red-800}
19 | --orange: #{$orange-500}
20 | --orange-h: #{$orange-100}
21 | --orange-l: #{$orange-400}
22 | --orange-d: #{$orange-800}
23 | --white: #{$white-50}
24 | --white-h:#{$white-100}
25 | --white-l:#{$white-0}
26 |
27 | --black: #{$black-50}
28 | --black-l: #{$black-0}
29 | --black-h: #{$black-100}
30 |
31 | --txt-on-p: var(--white)
32 | --txt-on-red: var(--white)
33 | --txt-on-green: var(--white)
34 | --txt-on-purple: var(--white)
35 | --txt-on-blue: var(--white)
36 | --txt-on-orange: var(--white)
37 | --gray: #{$gray-200}
38 | --gray-l: #{$gray-100}
39 | --gray-d: #{$gray-400}
40 | //Key Colors
41 | --primary: var(--blue)
42 | --primary-h: var(--blue-h)
43 | --primary-l: var(--blue-l)
44 | --primary-d: var(--blue-d)
45 | --accent: #E3F2FD
46 | --active: #ECEFF1
47 | --focus: var(--primary)
48 | --hover: #ECF4FD
49 | //Text Color
50 | --txt: var(--black)
51 | --txt-l:var(--black-l)
52 | --txt-h:var(--black-h)
53 | --txt-r: var(--white)
54 | //Background Colors
55 | --bg: #{$gray-50}
56 | --bg2: #{$gray-100}
57 | --bg3: #{$gray-200}
58 | //Border
59 | --brd: #{$gray-300}
60 |
61 | //Navbar
62 | --bg-nav: var(--bg)
63 | --bg-nav-h: var(--bg2)
64 | --bb-nav: var(--primary)
65 | //Form
66 | --input-bg: var(--bg)
67 | --input-txt: var(--txt)
68 | --input-focus: var(--primary-t)
69 | --input-brd: var(--brd)
70 | //Buttons
71 |
72 | --btn-bg: var(--bg)
73 | --btn-ac: var(--primary)
74 | --btn-txt: var(--txt)
75 | --btn-brd: var(--brd)
76 | --btn-hs: 0
77 | --btn-f: var(--bg2)
78 | --btn-bg-h: var(--bg3)
79 | --btn-sd: 0 1px var(--btn-brd)
80 | --btn-radius: .5rem
81 |
82 | //Card
83 | --bg-card: var(--bg)
84 | //Details
85 | --bg-details: var(--bg2)
86 | --bg-details-open: var(--primary)
87 | --txt-details-open: var(--white)
88 | //Aside
89 | --aside-bg: transparent
90 | --aside-bg-h: var(--bg3)
91 | --aside-bs: none
92 |
93 | //Tabs
94 | --bg-tabs: var(--bg)
95 | --brd-tabs-l: var(--primary)
96 | --brd-tabs: var(--bg2)
97 | //table
98 | --bg-table: var(--bg)
99 | --fake-brd-table: inset 0 0px 0px 1px var(--bg3)
100 | --bg-table-hover: var(--bg3)
101 | --brd-table: var(--bg3)
102 | --shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px
103 | --b-shadow: #95abbb
104 | --radius: .5rem
105 |
--------------------------------------------------------------------------------
/src/sass/units.sass:
--------------------------------------------------------------------------------
1 | @charset "utf-8"
2 |
3 | @import "./settings/variables"
4 |
5 | html
6 | --primary: var(--green) !important
7 | --primary-h: var(--green-h)!important
8 | --primary-l: var(--green-l)!important
9 | --primary-d: var(--green-d)!important
10 |
11 | @import "./theme/light"
12 | @import "./theme/dark"
13 |
14 | @import "./base/basic"
15 | @import "./extra/aos"
16 | @import "./elements/typography"
17 |
18 | @import "./layout/navbar"
19 | @import "./layout/header"
20 | @import "./layout/container"
21 | @import "./layout/grid"
22 | @import "./layout/footer"
23 |
24 | @import "./elements/button"
25 | @import "./components/card"
26 | @import "./elements/form"
27 | @import "./components/modal"
28 | @import "./components/gotop_link"
29 | @import "./extra/tooltip"
30 | @import "./extra/alert"
31 |
32 | @import "./utilities/alignment"
33 | @import "./utilities/background"
34 | @import "./utilities/position"
35 | @import "./utilities/border"
36 | @import "./utilities/display"
37 | @import "./utilities/margin"
38 | @import "./utilities/general"
39 | @import "./utilities/padding"
40 | @import "./utilities/spacer"
41 | @import "./utilities/text"
42 |
43 |
44 | main
45 | padding-top: 6rem
46 |
47 | .test
48 | display: inline-flex
49 | position: relative
50 | align-items: center
51 | justify-content: center
52 | margin: 0
53 | font-size: 18px
54 | font-weight: bold
55 | border-radius: var(--radius)
56 | text-align: center
57 | box-sizing: border-box
58 | background-color: var(--green)
59 | width: 100%
60 | .test.t-vh
61 | height: calc( var(--100vh) / 2 )
62 | .test.t-svh
63 | height: calc( var(--100svh) / 2 )
64 | .test.t-dvh
65 | height: calc( var(--100dvh) / 2 )
66 | .test.t-lvh
67 | height: calc( var(--100lvh) / 2 )
68 | .test.t-p
69 | height: calc( var(--100p) / 2 )
70 |
71 | .vtests
72 | gap: .5rem
73 | .vtests>*
74 | padding: 0!important
75 | div.test span
76 | position: absolute
77 | top: 50%
78 | width: 30vh
79 | transform: rotate(-90deg)
80 |
81 | .template
82 | display: none
83 |
84 | div.bar
85 | width: 20px
86 | top: 0px
87 |
88 | .bar > .text
89 | box-sizing: border-box
90 | width: 65vh
91 | background-color: white
92 | opacity: 0.7
93 | height: 20px
94 | padding: 0px 80px
95 | transform: rotate(90deg)
96 | transform-origin: left bottom 0
97 |
98 | .innerHeightLog
99 | position: fixed
100 | display: flex
101 | gap: 0.5rem
102 | align-items: center
103 | top: 80px
104 | left: 0.5rem
105 | padding: 0.5rem
106 | background-color: var(--green)
107 | border-radius: var(--radius)
108 |
--------------------------------------------------------------------------------
/src/sass/utilities/_alignment.sass:
--------------------------------------------------------------------------------
1 | /* ------------ Alignement Utility ------------ */
2 | $alignments: 'center' 'left' 'right'
3 | @each $align in $alignments
4 | ._ta-#{$align}
5 | text-align: #{$align} !important
--------------------------------------------------------------------------------
/src/sass/utilities/_background.sass:
--------------------------------------------------------------------------------
1 | /* --------- Background Color Utility --------- */
2 | $bgcolors: ("primary","black","white","blue","red","green","yellow","orange","gray")!default
3 | @each $var in $bgcolors
4 | ._bg-#{$var}
5 | background-color: var(--#{$var})!important
6 | ._bg
7 | background-color: var(--bg)!important
8 | ._bg2
9 | background-color: var(--bg2)!important
10 | ._bg3
11 | background-color: var(--bg3)!important
12 |
--------------------------------------------------------------------------------
/src/sass/utilities/_border.sass:
--------------------------------------------------------------------------------
1 |
2 | /* -------------- Border Utility -------------- */
3 | ._radius
4 | border-radius: var(--radius) !important
5 | ._radiusless
6 | border-radius: 0 !important
7 | ._brd-none
8 | border: none !important
9 | /* ----------- Border Color Utility ----------- */
10 | $brdcolors: ("primary","txt-r","txt","black","white","blue","bg","bg2","bg3","red","green","yellow","orange")!default
11 | @each $var in $brdcolors
12 | ._brd-#{$var}
13 | border: 2px solid var(--#{$var})!important
--------------------------------------------------------------------------------
/src/sass/utilities/_display.sass:
--------------------------------------------------------------------------------
1 | /* -------------- Display Utility ------------- */
2 | $displays: 'block' 'flex' 'inline' 'none'
3 | @each $display in $displays
4 | ._d-#{$display}
5 | display: #{$display} !important
6 |
7 | @media only screen and (min-width: 768px)
8 | ._d-m-only
9 | display: none
10 |
--------------------------------------------------------------------------------
/src/sass/utilities/_general.sass:
--------------------------------------------------------------------------------
1 | /* ------------- General utilities ------------ */
2 | ._clearfix
3 | clear: both !important
4 |
5 | ._floatleft
6 | float: left !important
7 |
8 | ._floatright
9 | float: right !important
10 |
11 | ._shadowless
12 | box-shadow: none !important
13 |
14 | ._shadow
15 | box-shadow: var(--shadow) !important
16 |
17 | ._overflowauto
18 | overflow: auto !important
19 |
20 | ._overflowhidden
21 | overflow: hidden !important
22 |
23 | ._f-center
24 | display: flex
25 | flex-flow: wrap
26 | justify-content: center
27 | align-items: center
28 |
29 | ._f-column
30 | display: flex
31 | flex-direction: column
32 | ._f-wrap
33 | display: flex
34 | flex-wrap: wrap
35 | ._icon
36 | display: block
37 | height: 1.4rem
38 | width: 1.4rem
39 | fill: currentColor
40 | margin: 0 auto
41 |
42 | ._ratio32
43 | apsect-ratio: 3/2
44 |
45 | ._fit-cover
46 | object-fit: cover !important
47 |
48 | ._no-select
49 | -webkit-user-select: none
50 | -moz-user-select: none
51 | user-select: none
52 |
53 | ._h-100
54 | height: 100%
55 |
56 | ._cnt-grid-wrap
57 | display: flex
58 | flex-wrap: wrap
59 | gap: .5rem
60 | padding: .5rem
61 |
--------------------------------------------------------------------------------
/src/sass/utilities/_margin.sass:
--------------------------------------------------------------------------------
1 |
2 | /* -------------- Margin Utility ------------- */
3 |
4 | $sizes: ( "0": 0,"05": 0.5rem,"1": 1rem,"2": 2rem,"3": 3rem,"4": 4rem,"5": 5rem)
5 |
6 | @each $size, $value in $sizes
7 | ._m-#{$size}
8 | margin: $value
9 | ._mt-#{$size}
10 | margin-top: $value
11 | ._mr-#{$size}
12 | margin-right: $value
13 | ._mb-#{$size}
14 | margin-bottom: $value
15 | ._ml-#{$size}
16 | margin-left: $value
17 | ._mx-#{$size}
18 | margin-left: $value
19 | margin-right: $value
20 | ._my-#{$size}
21 | margin-top: $value
22 | margin-bottom: $value
23 |
--------------------------------------------------------------------------------
/src/sass/utilities/_padding.sass:
--------------------------------------------------------------------------------
1 | /* -------------- Padding Utility ------------- */
2 |
3 | $sizes: ( "0": 0,"05": 0.5rem,"1": 1rem,"2": 2rem,"3": 3rem,"4": 4rem,"5": 5rem)
4 |
5 | @each $size, $value in $sizes
6 | ._p-#{$size}
7 | padding: $value
8 | ._pt-#{$size}
9 | padding-top: $value
10 | ._pr-#{$size}
11 | padding-right: $value
12 | ._pb-#{$size}
13 | padding-bottom: $value
14 | ._pl-#{$size}
15 | padding-left: $value
16 | ._px-#{$size}
17 | padding-left: $value
18 | padding-right: $value
19 | ._py-#{$size}
20 | padding-top: $value
21 | padding-bottom: $value
--------------------------------------------------------------------------------
/src/sass/utilities/_position.sass:
--------------------------------------------------------------------------------
1 | ._sticky
2 | position: sticky !important
3 | ._fixed
4 | position: fixed !important
--------------------------------------------------------------------------------
/src/sass/utilities/_spacer.sass:
--------------------------------------------------------------------------------
1 | /* -------------- Spacer Utility -------------- */
2 | $values: ("0": 0,"1": 1rem, "2": 2rem, "3": 3rem)
3 |
4 | @each $name, $value in $values
5 | [class*="-#{$name}p"]
6 | --spacer-p: #{$value}!important
7 | @each $name, $value in $values
8 | [class*="-#{$name}m"]
9 | --spacer-m: #{$value}!important
10 |
--------------------------------------------------------------------------------
/src/sass/utilities/_text.sass:
--------------------------------------------------------------------------------
1 | /* ------------ Text Color Utility ------------ */
2 | $txtcolors: ("primary","black","white","blue","red","green","yellow","orange")!default
3 | @each $var in $txtcolors
4 | ._txt-#{$var}
5 | color: var(--#{$var})!important
6 | ._txt
7 | color: var(--txt)!important
8 | ._txt-r
9 | color: var(--txt-r)!important
10 | ._mono
11 | font-family: monospace
12 | ._txt-center
13 | text-align: center
--------------------------------------------------------------------------------
/src/script/build_list.js:
--------------------------------------------------------------------------------
1 | const https = require('https')
2 | const chalk = require('chalk')
3 | const fs = require('fs')
4 | const path = require('path')
5 | function center(s, max, c) {
6 | return s
7 | .padStart(s.length + Math.floor((max - s.length) / 2), c)
8 | .padEnd(max, c)
9 | }
10 | const header = (entries, date, comment) => {
11 | let ext = comment == '#' ? '.txt' : '.adblock'
12 | return (
13 | comment +
14 | ' Title: d3Host List by d3ward\n' +
15 | comment +
16 | ' Expires: 1 days\n' +
17 | comment +
18 | ' Description: Simple and small list with the most popular advertising, tracking, analytics and social advertising services\n' +
19 | comment +
20 | ' Homepage: https://github.com/d3ward/toolz\n' +
21 | comment +
22 | ' License: CC BY-NC-SA\n' +
23 | comment +
24 | ' Source: https://github.com/d3ward/toolz/blob/master/src/d3host' +
25 | ext +
26 | '\n\n' +
27 | comment +
28 | ' This list cover all the tests on https://d3ward.github.io/toolz/adblock\n' +
29 | comment +
30 | ' Type : Stable\n' +
31 | comment +
32 | ' Entries : ' +
33 | entries +
34 | '\n' +
35 | comment +
36 | ' Updated On: ' +
37 | date +
38 | '\n' +
39 | comment +
40 | ' Created by: d3ward'
41 | )
42 | }
43 | function test(obj, comment, pre, post) {
44 | Object.keys(obj).forEach((category) => {
45 | let value = obj[category]
46 | Object.keys(value).forEach((key) => {
47 | let value2 = value[key]
48 | if (value2)
49 | value2.forEach((v) => {
50 | https
51 | .get('https://' + v, (res) => {
52 | if (res.statusCode >= 200 && res.statusCode < 300)
53 | console.log(
54 | chalk.green(`${v}: ${res.statusCode}`)
55 | )
56 | else if (
57 | res.statusCode >= 300 &&
58 | res.statusCode < 400
59 | )
60 | console.log(
61 | chalk.blue(`${v}: ${res.statusCode}`)
62 | )
63 | else if (res.statusCode == 404)
64 | console.log(
65 | chalk.red(`${v}: ${res.statusCode}`)
66 | )
67 | else
68 | console.log(
69 | chalk.magenta(`${v}: ${res.statusCode}`)
70 | )
71 | })
72 | .on('error', (error) => {
73 | console.error(`${v}: ${error.message}`)
74 | })
75 | })
76 | })
77 | })
78 | }
79 | function build(obj, comment, pre, post) {
80 | let txt = ''
81 | let entries = 0
82 | Object.keys(obj).forEach((category) => {
83 | let value = obj[category]
84 | txt += '\n\n' + comment + center(' ' + category + ' ', 30, '=') + '\n'
85 | Object.keys(value).forEach((key) => {
86 | let value2 = value[key]
87 | txt += '\n' + comment + ' --- ' + key + '\n'
88 | if (value2)
89 | value2.forEach((v) => {
90 | entries++
91 | txt += pre + v + post + '\n'
92 | })
93 | })
94 | })
95 | if (pre == '||')
96 | txt +=
97 | '\n*$3p,domain=d3ward.github.io\n/pagead.js$domain=d3ward.github.io\n@@*$redirect-rule,domain=d3ward.github.io\nd3ward.github.io##.textads'
98 | const date = new Date()
99 | const d =
100 | date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear()
101 | return header(entries, d, comment) + txt
102 | }
103 | function write(output, input) {
104 | fs.writeFile(output, input, { encoding: 'utf8' }, function (err) {
105 | if (err) {
106 | return console.error(err)
107 | }
108 | fs.readFile(output, function (err, data) {
109 | if (err) {
110 | return console.error(err)
111 | }
112 | console.log('Created \n' + output)
113 | })
114 | })
115 | }
116 | fs.readFile(
117 | path.resolve(__dirname, '../data/adblock_data.json'),
118 | 'utf8',
119 | (err, jsonString) => {
120 | if (err) {
121 | console.log('Error reading file from disk:', err)
122 | return
123 | }
124 | try {
125 | const obj = JSON.parse(jsonString)
126 | test(obj)
127 | write(
128 | path.resolve(__dirname, '../d3host.txt'),
129 | build(obj, '#', '0.0.0.0 ', '')
130 | )
131 | write(
132 | path.resolve(__dirname, '../d3host.adblock'),
133 | build(obj, '!', '||', '^')
134 | )
135 | } catch (err) {
136 | console.log('Error parsing JSON string:', err)
137 | }
138 | }
139 | )
140 |
--------------------------------------------------------------------------------
/src/units.ejs:
--------------------------------------------------------------------------------
1 |
2 | <%- include('partials/head.ejs', {
3 | page: 'units' ,
4 | title:'Units - Toolz',
5 | description:'Test viewport units of your browser.',
6 | url: 'd3ward.github.io/toolz' ,
7 | preview_thumbnail:'https://d3ward.github.io/toolz/src/preview_toolz.png',
8 | keywords:'viewport,toolz,units,css,web tools,testing,' }) %>
9 |
10 |
11 | <%- include('partials/support_me.ejs') %>
12 | <%- include('partials/adblock/changelog.ejs') %>
13 | <%- include('partials/header.ejs', {page:'units'}) %>
14 |
15 |
16 |
17 |
18 | This project is no longer maintained and has been archived.
19 | Thank you for being part of this journey and for your support.
20 |
21 |
22 |
26 |
27 | Units
28 |
29 |
30 |
31 | innerHeight property returns the height of the content area of a window
32 | vh = 1% of the height of the viewport size
33 | 5 Units can be used with CSS to fix mobile issues; if you use a unit that does not match the innerheight, the user visiting your site may not see some absolute or fixed buttons because they are hidden by the navigation bar. One of the browsers most affected by this problem is Webkit-based, so several units have been introduced over the years to compensate for the problem.
34 | These tests can be used to check the value of each unit.
35 |
36 |
37 |
38 |
39 |
40 |
43 |
46 |
49 |
52 |
55 |
56 |
57 |
58 |
100vh position:fixed
59 |
60 |
61 |
100lvh position:fixed
62 |
63 |
64 |
100svh position:fixed
65 |
66 |
67 |
100dvh position:fixed
68 |
69 |
70 |
100% position:fixed
71 |
72 |
73 |
100vh position:absolute
74 |
75 |
76 |
100lvh position:absolute
77 |
78 |
79 |
100svh position:absolute
80 |
81 |
82 |
100dvh position:absolute
83 |
84 |
85 |
100% position:absolute
86 |
87 |
88 |
89 |
91 |
92 |
94 |
96 |
97 |
98 |
99 |
100 |
123 |
124 |
125 | <%- include('partials/footer.ejs') %>
126 | <%- include('partials/gotop.ejs') %>
127 |
128 |
129 |
130 |
131 |
132 |
133 |
--------------------------------------------------------------------------------