From 06efa8f911fe093d5b2b1daa22cc69dba7c266fd Mon Sep 17 00:00:00 2001 From: Rik Date: Wed, 7 Oct 2026 16:04:24 +1100 Subject: [PATCH 1/2] Edge build with a polite icon (2.0.3) Edge Add-ons certification rejected the store logo under policy 2.10 (2026-10-01). Edge now gets its own build: the Chrome build with src/icons-edge, where the hand has every finger up except the middle one. Chrome and Firefox are unchanged. - icons.mjs renders both hands (classic -> src/icons, polite -> src/icons-edge) - build/package produce dist/edge and SilentBlock--edge.zip; edge.mjs uploads it - store-art renders release/store-art/edge/ from dist/edge - release.yml load-checks the Edge build too Co-Authored-By: Claude Opus 5.5 (1M context) --- .github/copilot-instructions.md | 2 + .github/workflows/release.yml | 1 + CHANGELOG.md | 7 + README.md | 7 + assets/icons/edge/caution.svg | 1 + assets/icons/edge/danger.svg | 1 + assets/icons/edge/idle.svg | 1 + assets/icons/edge/paused.svg | 1 + assets/icons/edge/protected.svg | 1 + docs/store-listing.md | 3 +- package-lock.json | 4 +- package.json | 2 +- scripts/build.mjs | 8 +- scripts/icons.mjs | 74 +++++--- scripts/package.mjs | 4 +- scripts/publish/edge.mjs | 4 +- scripts/store-art.mjs | 280 ++++++++++++++++--------------- src/icons-edge/caution-128.png | Bin 0 -> 3554 bytes src/icons-edge/caution-16.png | Bin 0 -> 600 bytes src/icons-edge/caution-32.png | Bin 0 -> 1076 bytes src/icons-edge/caution-48.png | Bin 0 -> 1523 bytes src/icons-edge/caution-64.png | Bin 0 -> 1953 bytes src/icons-edge/danger-128.png | Bin 0 -> 3560 bytes src/icons-edge/danger-16.png | Bin 0 -> 594 bytes src/icons-edge/danger-32.png | Bin 0 -> 1049 bytes src/icons-edge/danger-48.png | Bin 0 -> 1533 bytes src/icons-edge/danger-64.png | Bin 0 -> 1975 bytes src/icons-edge/idle-128.png | Bin 0 -> 3572 bytes src/icons-edge/idle-16.png | Bin 0 -> 584 bytes src/icons-edge/idle-32.png | Bin 0 -> 1078 bytes src/icons-edge/idle-48.png | Bin 0 -> 1529 bytes src/icons-edge/idle-64.png | Bin 0 -> 1994 bytes src/icons-edge/paused-128.png | Bin 0 -> 3539 bytes src/icons-edge/paused-16.png | Bin 0 -> 596 bytes src/icons-edge/paused-32.png | Bin 0 -> 1060 bytes src/icons-edge/paused-48.png | Bin 0 -> 1514 bytes src/icons-edge/paused-64.png | Bin 0 -> 1975 bytes src/icons-edge/protected-128.png | Bin 0 -> 3524 bytes src/icons-edge/protected-16.png | Bin 0 -> 592 bytes src/icons-edge/protected-32.png | Bin 0 -> 1069 bytes src/icons-edge/protected-48.png | Bin 0 -> 1537 bytes src/icons-edge/protected-64.png | Bin 0 -> 1996 bytes 42 files changed, 230 insertions(+), 171 deletions(-) create mode 100644 assets/icons/edge/caution.svg create mode 100644 assets/icons/edge/danger.svg create mode 100644 assets/icons/edge/idle.svg create mode 100644 assets/icons/edge/paused.svg create mode 100644 assets/icons/edge/protected.svg create mode 100644 src/icons-edge/caution-128.png create mode 100644 src/icons-edge/caution-16.png create mode 100644 src/icons-edge/caution-32.png create mode 100644 src/icons-edge/caution-48.png create mode 100644 src/icons-edge/caution-64.png create mode 100644 src/icons-edge/danger-128.png create mode 100644 src/icons-edge/danger-16.png create mode 100644 src/icons-edge/danger-32.png create mode 100644 src/icons-edge/danger-48.png create mode 100644 src/icons-edge/danger-64.png create mode 100644 src/icons-edge/idle-128.png create mode 100644 src/icons-edge/idle-16.png create mode 100644 src/icons-edge/idle-32.png create mode 100644 src/icons-edge/idle-48.png create mode 100644 src/icons-edge/idle-64.png create mode 100644 src/icons-edge/paused-128.png create mode 100644 src/icons-edge/paused-16.png create mode 100644 src/icons-edge/paused-32.png create mode 100644 src/icons-edge/paused-48.png create mode 100644 src/icons-edge/paused-64.png create mode 100644 src/icons-edge/protected-128.png create mode 100644 src/icons-edge/protected-16.png create mode 100644 src/icons-edge/protected-32.png create mode 100644 src/icons-edge/protected-48.png create mode 100644 src/icons-edge/protected-64.png diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index e87195c..f391203 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -35,6 +35,8 @@ Read README.md first; this file is the short list of things that bite. - Security page URLs (~36k) live in `security/urls.json` and are checked by the worker; as DNR rules they would blow the 30k guarantee. - Icons are generated: edit `scripts/icons.mjs` and run it, never hand-edit the PNGs. +- Edge gets `dist/edge` (Chrome build + `src/icons-edge`, no middle finger). Edge rejected the + middle finger under policy 2.10; anything Edge sees, package or listing image, uses the polite set. ## Tests - `npm test` for the compiler and settings; `npm run test:e2e` for the real build in Chromium. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2629cab..87e00c7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,6 +26,7 @@ jobs: - run: npm run build - run: npm test - run: node scripts/verify-load.mjs chrome + - run: node scripts/verify-load.mjs edge - run: npm run test:e2e - name: Firefox smoke test run: npm run test:firefox diff --git a/CHANGELOG.md b/CHANGELOG.md index b5a42f8..543db9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ ## [Unreleased] +## [2.0.3] - 2026-10-07 + +### Changed +- Edge gets its own build with a different hand on the icon (every finger up except the + middle one), after Edge Add-ons certification rejected the store logo. Chrome and Firefox + are unchanged. + ## [2.0.2] - 2026-09-29 ### Changed diff --git a/README.md b/README.md index 8add66a..50a4c57 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,7 @@ src/ scriptlets/library.js MAIN-world scriptlets, embedded into each bucket by the build resources/ redirect stubs (GPT, gtag/GTM, analytics.js, noop files) icons/ toolbar icons per state, rendered by scripts/icons.mjs from assets/icons/ + icons-edge/ the same for the Edge build, without the middle finger (Edge policy 2.10) popup/, options/, warning/, shared/ test/unit, test/e2e, test/fixtures ``` @@ -153,6 +154,12 @@ The same scripts run locally: `npm run package`, then `publish:edge` with the variables above. `npm run store:status` shows what Chrome has. Listing text and images: `docs/store-listing.md` and `npm run store:art`. +Edge gets its own zip (`SilentBlock--edge.zip`, built from `dist/edge`) and its own images +(`release/store-art/edge/`). It is the Chrome build with a different hand on the icon: Edge +Add-ons rejected the middle finger under policy 2.10 on 2026-10-01. Edge also has no API for +listing images, and its publish API submits whatever listing is in the Partner Center draft, +so new Edge images go into the draft by hand BEFORE the tag is pushed. + ## Filter lists and licences | List | Licence | diff --git a/assets/icons/edge/caution.svg b/assets/icons/edge/caution.svg new file mode 100644 index 0000000..d85cf51 --- /dev/null +++ b/assets/icons/edge/caution.svg @@ -0,0 +1 @@ +SilentBlock: Pushy site: pop-under, tab-under or nag wall dealt with (amber) diff --git a/assets/icons/edge/danger.svg b/assets/icons/edge/danger.svg new file mode 100644 index 0000000..a769fd6 --- /dev/null +++ b/assets/icons/edge/danger.svg @@ -0,0 +1 @@ +SilentBlock: Known malware, phishing or scam host (garnet) diff --git a/assets/icons/edge/idle.svg b/assets/icons/edge/idle.svg new file mode 100644 index 0000000..749b6b1 --- /dev/null +++ b/assets/icons/edge/idle.svg @@ -0,0 +1 @@ +SilentBlock: Idle, or nothing on this page needed blocking (slate blue) diff --git a/assets/icons/edge/paused.svg b/assets/icons/edge/paused.svg new file mode 100644 index 0000000..aff2dd2 --- /dev/null +++ b/assets/icons/edge/paused.svg @@ -0,0 +1 @@ +SilentBlock: Paused on this site, or protection off (grey) diff --git a/assets/icons/edge/protected.svg b/assets/icons/edge/protected.svg new file mode 100644 index 0000000..1b29842 --- /dev/null +++ b/assets/icons/edge/protected.svg @@ -0,0 +1 @@ +SilentBlock: Ads or trackers blocked (jade) diff --git a/docs/store-listing.md b/docs/store-listing.md index 65cb36e..11a88cf 100644 --- a/docs/store-listing.md +++ b/docs/store-listing.md @@ -3,7 +3,8 @@ One source for all three stores. The Firefox listing text is updated automatically on release (`scripts/publish/firefox.mjs`). Chrome and Edge have no API for listing text, so paste these in by hand when they change. Store images: `npm run store:art` renders them into -`release/store-art/`. +`release/store-art/` (Chrome and Firefox) and `release/store-art/edge/` (Edge, polite icon: +never upload the middle-finger set to Edge, it fails certification under policy 2.10). Store items: - Chrome Web Store: `accdpphckockpflaggbplikpmaknioao` (publisher b7b011da-ecfd-4ec1-8d99-c600f9c31543) diff --git a/package-lock.json b/package-lock.json index a60b97a..2e5e136 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "silentblock", - "version": "2.0.2", + "version": "2.0.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "silentblock", - "version": "2.0.2", + "version": "2.0.3", "devDependencies": { "@playwright/test": "^1.63.0", "selenium-webdriver": "^4.49.0" diff --git a/package.json b/package.json index 9cdfc9c..2621f45 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "silentblock", - "version": "2.0.2", + "version": "2.0.3", "private": true, "description": "Free, silent ad blocker for Chrome (MV3). No ads, no nags.", "type": "module", diff --git a/scripts/build.mjs b/scripts/build.mjs index f206ea8..918aa84 100644 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -1,4 +1,4 @@ -// Builds dist/chrome and dist/firefox from src/ and the filter lists. +// Builds dist/chrome, dist/firefox and dist/edge from src/ and the filter lists. // // node scripts/build.mjs full build, selectors validated in headless Chromium // node scripts/build.mjs --no-validate skip browser validation (faster, CI without a browser) @@ -272,12 +272,14 @@ function manifestFor(target) { } const report = []; -for (const target of ['chrome', 'firefox']) { +// Edge is the Chrome build with the polite icons (src/icons-edge, see scripts/icons.mjs). +for (const target of ['chrome', 'firefox', 'edge']) { const dist = path.join(root, 'dist', target); await rm(dist, { recursive: true, force: true }); await mkdir(dist, { recursive: true }); for (const dir of ['background', 'popup', 'options', 'warning', 'content', 'shared', 'icons', 'resources']) { - await cp(path.join(root, 'src', dir), path.join(dist, dir), { recursive: true }); + const from = dir === 'icons' && target === 'edge' ? 'icons-edge' : dir; + await cp(path.join(root, 'src', from), path.join(dist, dir), { recursive: true }); } await rm(path.join(dist, 'shared/unwall-core.js'), { force: true }); for (const [rel, data] of Object.entries(out)) { diff --git a/scripts/icons.mjs b/scripts/icons.mjs index fb0e193..fd420da 100644 --- a/scripts/icons.mjs +++ b/scripts/icons.mjs @@ -1,10 +1,14 @@ -// Renders the toolbar icons: one shield, five states. +// Renders the toolbar icons: one shield, five states, two hands. // node scripts/icons.mjs -// Writes assets/icons/.svg (sources) and src/icons/-.png (shipped). +// Writes assets/icons/.svg + src/icons/-.png (Chrome and Firefox), and +// assets/icons/edge/.svg + src/icons-edge/-.png (Edge). // // The shield is "Tidewater": faceted, with the hand cut clean through so the toolbar itself // makes the gesture. That only reads if the shield colour is mid-tone (a white finger on a // light toolbar, a dark one on a dark toolbar), so keep new colours in that band. +// +// Edge Add-ons rejected the middle finger (policy 2.10, store logo, 2026-10-01), so the Edge +// build gets the "polite" hand: every finger up except that one. import { writeFile, mkdir } from 'node:fs/promises'; import path from 'node:path'; import { chromium } from '@playwright/test'; @@ -20,43 +24,63 @@ export const STATES = { }; const SIZES = [16, 32, 48, 64, 128]; -// Hand in local coordinates, middle finger centred on x=32. The thumb grows out of the -// palm's lower-left along the index finger so it reads as one fist at 16px. -const HAND = [ - '', - '', - '', - '', - '', - '', - '', -].join(''); +// Hands in local coordinates, middle finger centred on x=32. +export const HANDS = { + // The thumb grows out of the palm's lower-left along the index finger so it reads as one + // fist at 16px. + classic: [ + '', + '', + '', + '', + '', + '', + '', + ].join(''), + // Open hand, middle finger folded to a knuckle. Thin gaps keep the fingers apart at 128px; + // the thumb splays out of the palm so it reads as a hand, not a "W", at 16px. + polite: [ + '', + '', + '', + '', + '', + '', + ].join(''), +}; +// Which hand each icon set uses, and where it goes. +const SETS = [ + { hand: 'classic', svgDir: 'assets/icons', pngDir: 'src/icons' }, + { hand: 'polite', svgDir: 'assets/icons/edge', pngDir: 'src/icons-edge' }, +]; const SHIELD = 'M64 10 L110 22 L104 80 L64 118 L24 80 L18 22 Z'; -export function shieldSvg({ body, facet }, title) { +export function shieldSvg({ body, facet }, title, hand = 'classic') { return `${title}` + `` + `` + `` + - `${HAND}` + + `${HANDS[hand]}` + `` + `\n`; } if (import.meta.url === `file:///${process.argv[1].replace(/\\/g, '/')}` || process.argv[1].endsWith('icons.mjs')) { - await mkdir(path.join(root, 'assets/icons'), { recursive: true }); - await mkdir(path.join(root, 'src/icons'), { recursive: true }); const browser = await chromium.launch(); const page = await browser.newPage(); - for (const [state, colours] of Object.entries(STATES)) { - const svg = shieldSvg(colours, `SilentBlock: ${colours.meaning}`); - await writeFile(path.join(root, `assets/icons/${state}.svg`), svg); - for (const size of SIZES) { - await page.setViewportSize({ width: size, height: size }); - await page.setContent(``); - await page.locator('img').screenshot({ path: path.join(root, `src/icons/${state}-${size}.png`), omitBackground: true }); + for (const { hand, svgDir, pngDir } of SETS) { + await mkdir(path.join(root, svgDir), { recursive: true }); + await mkdir(path.join(root, pngDir), { recursive: true }); + for (const [state, colours] of Object.entries(STATES)) { + const svg = shieldSvg(colours, `SilentBlock: ${colours.meaning}`, hand); + await writeFile(path.join(root, svgDir, `${state}.svg`), svg); + for (const size of SIZES) { + await page.setViewportSize({ width: size, height: size }); + await page.setContent(``); + await page.locator('img').screenshot({ path: path.join(root, pngDir, `${state}-${size}.png`), omitBackground: true }); + } + console.log(`${hand.padEnd(8)} ${state.padEnd(10)} ${colours.body} ${colours.meaning}`); } - console.log(`${state.padEnd(10)} ${colours.body} ${colours.meaning}`); } await browser.close(); } diff --git a/scripts/package.mjs b/scripts/package.mjs index 2c8c946..a26484f 100644 --- a/scripts/package.mjs +++ b/scripts/package.mjs @@ -1,4 +1,4 @@ -// Zips dist/chrome and dist/firefox into release/. manifest.json sits at the zip root, +// Zips dist/chrome, dist/firefox and dist/edge into release/. manifest.json sits at the zip root, // which is what the Chrome Web Store and addons.mozilla.org expect. // node scripts/package.mjs import { readdir, readFile, writeFile, mkdir, stat } from 'node:fs/promises'; @@ -77,7 +77,7 @@ function zip(files) { const outDir = path.join(root, 'release'); await mkdir(outDir, { recursive: true }); -for (const target of ['chrome', 'firefox']) { +for (const target of ['chrome', 'firefox', 'edge']) { const dir = path.join(root, 'dist', target); try { await stat(path.join(dir, 'manifest.json')); } catch { throw new Error(`dist/${target} missing: run npm run build first`); } const manifest = JSON.parse(await readFile(path.join(dir, 'manifest.json'), 'utf8')); diff --git a/scripts/publish/edge.mjs b/scripts/publish/edge.mjs index 309e697..da36e2d 100644 --- a/scripts/publish/edge.mjs +++ b/scripts/publish/edge.mjs @@ -1,4 +1,4 @@ -// Microsoft Edge Add-ons: upload the Chrome zip (Edge runs the same build) to the draft +// Microsoft Edge Add-ons: upload the Edge zip (the Chrome build with the polite icons) to the draft // submission, then publish it for certification. // EDGE_PRODUCT_ID=... EDGE_CLIENT_ID=... EDGE_API_KEY=... node scripts/publish/edge.mjs // Credentials: Partner Center > Microsoft Edge > Publish API. The product ID is the Partner @@ -24,7 +24,7 @@ async function waitFor(url, what) { const v = await version(); console.log(`edge: uploading v${v}`); const { res: upRes } = await call(`${API}/draft/package`, { - method: 'POST', headers: { ...auth, 'content-type': 'application/zip' }, body: await readFile(await zipFor('chrome')), + method: 'POST', headers: { ...auth, 'content-type': 'application/zip' }, body: await readFile(await zipFor('edge')), }, 'upload'); await waitFor(`${API}/draft/package/operations/${upRes.headers.get('location')}`, 'upload'); diff --git a/scripts/store-art.mjs b/scripts/store-art.mjs index 2f34e86..100ee10 100644 --- a/scripts/store-art.mjs +++ b/scripts/store-art.mjs @@ -1,5 +1,6 @@ -// Renders the store images from the real extension pages in dist/chrome. -// npm run store:art -> release/store-art/*.png +// Renders the store images from the real extension pages. +// npm run store:art -> release/store-art/*.png (Chrome Web Store, Firefox; from dist/chrome) +// release/store-art/edge/*.png (Edge Add-ons; from dist/edge, polite icons) // // The popup and options pages run with a stubbed `chrome` API so each shot shows a chosen // state. Hostnames use example.com and example.net (reserved for documentation) so no real @@ -9,145 +10,154 @@ import path from 'node:path'; import { chromium } from '@playwright/test'; const root = path.resolve(import.meta.dirname, '..'); -const dist = path.join(root, 'dist/chrome'); -const out = path.join(root, 'release/store-art'); const ORIGIN = 'https://silentblock.art'; -await mkdir(out, { recursive: true }); +const SETS = [ + { dist: 'dist/chrome', icons: 'assets/icons', out: 'release/store-art' }, + { dist: 'dist/edge', icons: 'assets/icons/edge', out: 'release/store-art/edge' }, +]; +const browser = await chromium.launch(); +for (const set of SETS) { + console.log(`${set.out}/`); + await render(path.join(root, set.dist), path.join(root, set.icons), path.join(root, set.out)); +} +await browser.close(); -const meta = JSON.parse(await readFile(path.join(dist, 'meta.json'), 'utf8')); -const svg = async (state) => `data:image/svg+xml;base64,${(await readFile(path.join(root, `assets/icons/${state}.svg`))).toString('base64')}`; -const ICON = Object.fromEntries(await Promise.all(['idle', 'protected', 'caution', 'danger', 'paused'].map(async (s) => [s, await svg(s)]))); +async function render(dist, iconDir, out) { + await mkdir(out, { recursive: true }); -function popupState(status, host) { - return { enabled: true, version: meta.version, supported: true, hostname: host, pausedBy: null, unwall: false, status }; -} -const STATES = { - protected: popupState({ blocked: 47, popups: 0, walls: 0, danger: 0, dangerHosts: [], level: 'protected', icon: 'protected' }, 'news.example.com'), - caution: popupState({ blocked: 31, popups: 2, walls: 1, danger: 0, dangerHosts: [], level: 'caution', icon: 'caution' }, 'streams.example.net'), - danger: popupState({ blocked: 12, popups: 0, walls: 0, danger: 3, dangerHosts: ['cdn-payload.example.net'], level: 'danger', icon: 'danger' }, 'free-downloads.example.net'), -}; -const stub = (popupData) => ` - window.chrome = { - runtime: { - sendMessage: async (m) => m.type === 'popup:get' ? ${JSON.stringify(popupData)} - : m.type === 'settings:get' ? { state: { enabled: true, allowlist: ['intranet.example.com'], categories: { ads: true, privacy: true, annoyances: true, security: true }, unwallSites: ['recipes.example.com'], badge: false, statusIcon: true }, meta: ${JSON.stringify(meta)} } - : {}, - openOptionsPage() {}, - }, - tabs: { query: async () => [{ id: 1 }], reload: async () => {}, getCurrent: async () => ({ id: 1 }) }, - };`; + const meta = JSON.parse(await readFile(path.join(dist, 'meta.json'), 'utf8')); + const svg = async (state) => `data:image/svg+xml;base64,${(await readFile(path.join(iconDir, `${state}.svg`))).toString('base64')}`; + const ICON = Object.fromEntries(await Promise.all(['idle', 'protected', 'caution', 'danger', 'paused'].map(async (s) => [s, await svg(s)]))); -const browser = await chromium.launch(); -async function capture(pagePath, { width, height, data, scale = 2, colorScheme = 'light' }) { - const ctx = await browser.newContext({ viewport: { width, height }, deviceScaleFactor: scale, colorScheme }); - await ctx.route(`${ORIGIN}/**`, async (route) => { - const rel = new URL(route.request().url()).pathname.slice(1); - const type = rel.endsWith('.html') ? 'text/html' : rel.endsWith('.css') ? 'text/css' : rel.endsWith('.js') ? 'text/javascript' : rel.endsWith('.png') ? 'image/png' : 'application/octet-stream'; - try { await route.fulfill({ body: await readFile(path.join(dist, rel)), contentType: type }); } catch { await route.fulfill({ status: 404 }); } - }); - const page = await ctx.newPage(); - if (data !== undefined) await page.addInitScript(stub(data)); - await page.goto(`${ORIGIN}/${pagePath}`); - await page.waitForTimeout(600); - const png = await page.screenshot({ fullPage: false }); - await ctx.close(); - return `data:image/png;base64,${png.toString('base64')}`; -} + function popupState(status, host) { + return { enabled: true, version: meta.version, supported: true, hostname: host, pausedBy: null, unwall: false, status }; + } + const STATES = { + protected: popupState({ blocked: 47, popups: 0, walls: 0, danger: 0, dangerHosts: [], level: 'protected', icon: 'protected' }, 'news.example.com'), + caution: popupState({ blocked: 31, popups: 2, walls: 1, danger: 0, dangerHosts: [], level: 'caution', icon: 'caution' }, 'streams.example.net'), + danger: popupState({ blocked: 12, popups: 0, walls: 0, danger: 3, dangerHosts: ['cdn-payload.example.net'], level: 'danger', icon: 'danger' }, 'free-downloads.example.net'), + }; + const stub = (popupData) => ` + window.chrome = { + runtime: { + sendMessage: async (m) => m.type === 'popup:get' ? ${JSON.stringify(popupData)} + : m.type === 'settings:get' ? { state: { enabled: true, allowlist: ['intranet.example.com'], categories: { ads: true, privacy: true, annoyances: true, security: true }, unwallSites: ['recipes.example.com'], badge: false, statusIcon: true }, meta: ${JSON.stringify(meta)} } + : {}, + openOptionsPage() {}, + }, + tabs: { query: async () => [{ id: 1 }], reload: async () => {}, getCurrent: async () => ({ id: 1 }) }, + };`; -const shots = { - protected: await capture('popup/popup.html?tabId=1', { width: 300, height: 330, data: STATES.protected }), - caution: await capture('popup/popup.html?tabId=1', { width: 300, height: 330, data: STATES.caution }), - danger: await capture('popup/popup.html?tabId=1', { width: 300, height: 330, data: STATES.danger }), - options: await capture('options/options.html', { width: 760, height: 900, data: null, scale: 1.5 }), - warning: await capture(`warning/warning.html?u=${encodeURIComponent('https://free-prize-claim.example.net/login')}&h=example.net`, { width: 900, height: 620, scale: 1.5 }), -}; + async function capture(pagePath, { width, height, data, scale = 2, colorScheme = 'light' }) { + const ctx = await browser.newContext({ viewport: { width, height }, deviceScaleFactor: scale, colorScheme }); + await ctx.route(`${ORIGIN}/**`, async (route) => { + const rel = new URL(route.request().url()).pathname.slice(1); + const type = rel.endsWith('.html') ? 'text/html' : rel.endsWith('.css') ? 'text/css' : rel.endsWith('.js') ? 'text/javascript' : rel.endsWith('.png') ? 'image/png' : 'application/octet-stream'; + try { await route.fulfill({ body: await readFile(path.join(dist, rel)), contentType: type }); } catch { await route.fulfill({ status: 404 }); } + }); + const page = await ctx.newPage(); + if (data !== undefined) await page.addInitScript(stub(data)); + await page.goto(`${ORIGIN}/${pagePath}`); + await page.waitForTimeout(600); + const png = await page.screenshot({ fullPage: false }); + await ctx.close(); + return `data:image/png;base64,${png.toString('base64')}`; + } -const FONT = `"Segoe UI", system-ui, -apple-system, Roboto, sans-serif`; -const frame = (w, h, inner) => `${inner}`; + const shots = { + protected: await capture('popup/popup.html?tabId=1', { width: 300, height: 330, data: STATES.protected }), + caution: await capture('popup/popup.html?tabId=1', { width: 300, height: 330, data: STATES.caution }), + danger: await capture('popup/popup.html?tabId=1', { width: 300, height: 330, data: STATES.danger }), + options: await capture('options/options.html', { width: 760, height: 900, data: null, scale: 1.5 }), + warning: await capture(`warning/warning.html?u=${encodeURIComponent('https://free-prize-claim.example.net/login')}&h=example.net`, { width: 900, height: 620, scale: 1.5 }), + }; -const pages = { - 'screenshot-1-blocks': frame(1280, 800, ` -
-
- -

Ads gone.
Silently.

-

Ads, trackers, pop-ups and cookie banners are blocked before they load. No nags, no account, nothing leaves your browser.

-
- -
`), - 'screenshot-2-status': frame(1280, 800, ` -
-

One look tells you what happened

-

The icon changes colour with every page.

-
- ${[['idle', 'Nothing to block'], ['protected', 'Ads and trackers blocked'], ['caution', 'Pushy site handled'], ['danger', 'Dangerous site blocked'], ['paused', 'Paused']].map(([s, l]) => ` -
- -

${l}

`).join('')} -
`), - 'screenshot-3-malware': frame(1280, 800, ` -
-
-

Stops dangerous sites before they load

-

Known malware, phishing and scam sites are checked on your device. Your browsing is never sent anywhere to be checked.

-
- -
`), - 'screenshot-4-pushy': frame(1280, 800, ` -
- -
-

Pop-ups and nag walls, handled

-

Pop-unders get closed, tab-unders get undone, and "turn off your ad blocker" walls come down with one click, or on their own on sites you choose.

-
-
`), - 'screenshot-5-settings': frame(1280, 800, ` -
-
-

Free. Open source. No strings.

-

More than 120,000 filters from EasyList, EasyPrivacy and uBlock Origin, bundled with each release. Pause any site with one switch.

-
- -
`), - 'promo-small-440x280': frame(440, 280, ` -
- -

SilentBlock

Ads gone. Silently.

-
`), - 'promo-marquee-1400x560': frame(1400, 560, ` -
- -

SilentBlock

-

Ads, trackers, pop-ups and malware, blocked. Silently.

- -
`), -}; + const FONT = `"Segoe UI", system-ui, -apple-system, Roboto, sans-serif`; + const frame = (w, h, inner) => `${inner}`; -const sizes = { 'promo-small-440x280': [440, 280], 'promo-marquee-1400x560': [1400, 560] }; -for (const [name, html] of Object.entries(pages)) { - const [w, h] = sizes[name] || [1280, 800]; - const page = await browser.newPage({ viewport: { width: w, height: h } }); - await page.setContent(html); - await page.waitForTimeout(200); - await page.screenshot({ path: path.join(out, `${name}.png`) }); - await page.close(); - console.log(`${name}.png ${w}x${h}`); -} -// Store icons: Edge wants 300x300, Chrome's listing icon is 128x128, Firefox asks for 32 and 64. -for (const [name, size] of [['logo-300', 300], ['icon-128', 128], ['icon-64', 64], ['icon-32', 32]]) { - const page = await browser.newPage({ viewport: { width: size, height: size } }); - await page.setContent(``); - await page.locator('img').screenshot({ path: path.join(out, `${name}.png`), omitBackground: true }); - await page.close(); - console.log(`${name}.png ${size}x${size}`); + const pages = { + 'screenshot-1-blocks': frame(1280, 800, ` +
+
+ +

Ads gone.
Silently.

+

Ads, trackers, pop-ups and cookie banners are blocked before they load. No nags, no account, nothing leaves your browser.

+
+ +
`), + 'screenshot-2-status': frame(1280, 800, ` +
+

One look tells you what happened

+

The icon changes colour with every page.

+
+ ${[['idle', 'Nothing to block'], ['protected', 'Ads and trackers blocked'], ['caution', 'Pushy site handled'], ['danger', 'Dangerous site blocked'], ['paused', 'Paused']].map(([s, l]) => ` +
+ +

${l}

`).join('')} +
`), + 'screenshot-3-malware': frame(1280, 800, ` +
+
+

Stops dangerous sites before they load

+

Known malware, phishing and scam sites are checked on your device. Your browsing is never sent anywhere to be checked.

+
+ +
`), + 'screenshot-4-pushy': frame(1280, 800, ` +
+ +
+

Pop-ups and nag walls, handled

+

Pop-unders get closed, tab-unders get undone, and "turn off your ad blocker" walls come down with one click, or on their own on sites you choose.

+
+
`), + 'screenshot-5-settings': frame(1280, 800, ` +
+
+

Free. Open source. No strings.

+

More than 120,000 filters from EasyList, EasyPrivacy and uBlock Origin, bundled with each release. Pause any site with one switch.

+
+ +
`), + 'promo-small-440x280': frame(440, 280, ` +
+ +

SilentBlock

Ads gone. Silently.

+
`), + 'promo-marquee-1400x560': frame(1400, 560, ` +
+ +

SilentBlock

+

Ads, trackers, pop-ups and malware, blocked. Silently.

+ +
`), + }; + + const sizes = { 'promo-small-440x280': [440, 280], 'promo-marquee-1400x560': [1400, 560] }; + for (const [name, html] of Object.entries(pages)) { + const [w, h] = sizes[name] || [1280, 800]; + const page = await browser.newPage({ viewport: { width: w, height: h } }); + await page.setContent(html); + await page.waitForTimeout(200); + await page.screenshot({ path: path.join(out, `${name}.png`) }); + await page.close(); + console.log(`${name}.png ${w}x${h}`); + } + // Store icons: Edge wants 300x300, Chrome's listing icon is 128x128, Firefox asks for 32 and 64. + for (const [name, size] of [['logo-300', 300], ['icon-128', 128], ['icon-64', 64], ['icon-32', 32]]) { + const page = await browser.newPage({ viewport: { width: size, height: size } }); + await page.setContent(``); + await page.locator('img').screenshot({ path: path.join(out, `${name}.png`), omitBackground: true }); + await page.close(); + console.log(`${name}.png ${size}x${size}`); + } } -await browser.close(); diff --git a/src/icons-edge/caution-128.png b/src/icons-edge/caution-128.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e3f62c7047f77675af94b56e059f0c112eaa5a GIT binary patch literal 3554 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 literal 0 HcmV?d00001 diff --git a/src/icons-edge/caution-16.png b/src/icons-edge/caution-16.png new file mode 100644 index 0000000000000000000000000000000000000000..ffbdfa7803fa6a4416ca6acde3c1dbb412bae79f GIT binary patch literal 600 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 literal 0 HcmV?d00001 diff --git a/src/icons-edge/danger-128.png b/src/icons-edge/danger-128.png new file mode 100644 index 0000000000000000000000000000000000000000..f61f4446d827f5a68abdaa504110055c89f0f13d GIT binary patch literal 3560 zcmVP)-SDAfuDt(064b!@RzF%K|2>`<)Z*iNH`1P5vBsI9g$?dTwhx8kEt zb*eL+)<;L{B+&Y(7CY6dNkAY8h#?O&QgZ`=JXBDM6v;KYyI;SP5PAs^vU|?H?%m(a z&hFm3H#c|Bf4_6icfRi&4MH*+4MH-SPyiWDD1Zzn6hMX(fed4HH2)%#Xf7bmCxG1c z#6bfH-vXpc(xAF*chkF&K_H|#&rHt$s;=RD0Gh|Ab9oz|`u@(u!J!}dkhdyAsLnPb zm3Ma6?}juc?F8`5w9C%a`?BWq6F!fC=JF5B8SeVy2w(`Zq`RORxnw?2V1 zBJcuu?!v;;d;5}w)Nj^d9uiy(7Jk>s1#lExYv4AnE~+#WtNMC--;C{TvGfQ0M&JbS zO7uIUK7s${BAN5VQ_e443KDG@ivk!*k~Oh~2&)jWYRoAI>u!t3KZgL}djZ6_rxKl< zHv=>-YyvKH$mf?&1w}{-U?@Fo9cqvTVX`31j>h^JfC)avmjbAW&bkoD7<|I7;O&dx z5Q+sbl>NM|iPw5sL18(P3;_(A|DYpFYl!vYw}Ko7%&>QP9q-_h0F2_EB#00vv? zq;bQIaNfyU>Q3Ua0ERHo!{CN%6~d@0FM1fR2tc&d`x1S#+0k+(_pj&j5B@s%1aAc} z6l^9mt0SbnG3N8$^|!jv!*EOht8((^h<>>6xbf-b;8Xl1fMcj7;_8Ci5O;Jntpx{A zB7m5~Ep;dHxd2i*(!)4~dl&~5^)RFaP(C$(78-OjKjl~P>1YTb0TRGa4)FF5-NZjG z?{2ICo7fgWd9>gU+<>_m0#1Mha0CK;sI0T`S6~AjY*3z4umq9rgEU}&vKN95KgD@- z#*F*-+5;cG0~WCr55R?g8-(}@ZX4VVHn8hMp9 gQkED>b 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 iYXATM21!IgR09C&;YKHd@K*l-uN4u&s7NmM zAO#OSNc|BsMf4^q>1s&Dw4$h(q`UL_CYf!fO`8wi&b&9@_wnBB2*~roy@(SQbdEK-vvQ!hl~$i_diT+#6{?UCtiQ*PoUJ;{JY#{oD~270RR6WE-t_T g000I_L_t&o02mLvo_ACX)Bpeg07*qoM6N<$g3Ndm`v3p{ literal 0 HcmV?d00001 diff --git a/src/icons-edge/danger-32.png b/src/icons-edge/danger-32.png new file mode 100644 index 0000000000000000000000000000000000000000..82363dd095fbda727e2aa9511d498a3f56289cc7 GIT binary patch literal 1049 zcmV+!1m^pRP)bwAe=h@eFI8+U{J zn{CSCnGp*+`9vc+_c1DARnx+)(Mz#%wo4K?Sl2j57>inkB679On+vHkPWgI8QcxveP zXy@4Gr}th;#66}=)73F0N0U)O9JN_5%CX|(_)R6$jMYEd4p9ghofWZ*r%aWVeOI6H zCt~)u_uo8ewzm%CWzVLJB@3Jpd5D0eP7&me_WH(UFn!E+vh7TuaGkiC@YvDs8s@`v zAmKA>S0VHg0kW6k%v@F+?^v)v10M+0{#eEI7g@)IPN}j4bjtQYF@6{ypVe{j+h4u{ zj}VkyXSYuZ6xl9$BRW(c_zNcw9AOjX5HUm|+rGT7J5g%xuDOfm0p+%=;F~CFzm}>ST2t4{zJ{hvz`*i*kwFcFu^hMGIEUM{6*Y@jr6PlV?Rk0| zmcoJgzs^*ZiG9iR2+UPyt^O}@-cORgJ%M+H*8l(j|NkKa-T(jq00v1!K~w_(QGiP< T1+(G=00000NkvXXu0mjf^Q7#X literal 0 HcmV?d00001 diff --git a/src/icons-edge/danger-48.png b/src/icons-edge/danger-48.png new file mode 100644 index 0000000000000000000000000000000000000000..51f1fd61fe42ed73e63067cd9f628229fbd3dee6 GIT binary patch literal 1533 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 literal 0 HcmV?d00001 diff --git a/src/icons-edge/idle-48.png b/src/icons-edge/idle-48.png new file mode 100644 index 0000000000000000000000000000000000000000..a523b97b1c1adbeb8160f263eefb6842541bfae0 GIT binary patch literal 1529 zcmVFYLJ4##ss7BhYx%Jg(9V5YuWC-;~A~6-Ojyx@7}wnehKW%oHM)U z%=64l8T`*-kVdAKHD*m+`gRti5d(@W~^QB0o40rL=e4i$}zmkS3H_??_P$O6F@O%Fs4ZeH;P)pXn~9tHUc7%O)Gx0QMyeqNHY9l)f!;dqvLMsPOLK@%z+YICr5R@^TLpiuZ zYLhDeC4P#w&wIfcePmfJ(pqkEVH`e9WjDyaHD;)5jy08b3}iP})ey3W7NH3AzN5qz`s@W87*nM-$>#v|05}AZr5@2D^j)QC6Wi+7E~bEQ zxxFel?*Y@~E_%QV{M7#UR`>jqG;M=AM9p~*sN77;D&z%KcQFSH2>eGq;2es8o%cZV z>vKElBL>5VSZmF)b25ST1jHeehE_)`)iIjQfiH#R4vL*qtS$}ouM52KtCc{ttim}t zfa5Ob5vuoA7H%BKZO$(ai)FCJqINVI)b2d6VQ#m`Oqo|P!9?BwDS|eUfn^UMXM@Ka zvT%I1x$23{i>SltU z#LRJ4qAWe=-hutEKG{Q-c3a8OEsKW(jmcOmOP@knv_t!Xd5n+Yi(me1&) zn%EG>O2ofVBQCJ3pY-Z#+N%1os$qT#$*&Z}O-2Rn6<->La``}d;oJ$SvRIR;`6g1! zucGXYiE{daA61o4J`{e*rU4yZ?uubTE!|4VyTK)?TrEN6C67azp_6`lG{z=5F<#*KJS&1THPAPOl1CwJ;L&JS^r7~qHQi2YxH^!3^vaTp zz1`7V8g~)!pNJm3l-pht>UC4e^^HR7)Gg`NX`oJYAU!c#K z)2Q@}?yna~J3R+4G);$hl+P0(H>7~)7l4AIx>}BWv6bB30eq)zNBI))fahn{J=KLv zXf3aFTaQ+oO0UKXe0e8st|}~{ohRhH28NC_tStc_@a>^{Z}t3jK?_Er~ekp^H)D{QMT+X6n5mcNx~uAILe z!F-I8;*kCaLv2=D-Rd2X2GaVFN+I^O7rV~Ij?}J7+r!~-cnS8zUjP6A|Nj&wzN7#E f00v1!K~w_({IKumSOlb*00000NkvXXu0mjfpUU3I literal 0 HcmV?d00001 diff --git a/src/icons-edge/idle-64.png b/src/icons-edge/idle-64.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae19dc1d242c320831b208f6019c5a7f4211667 GIT binary patch literal 1994 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%0AXsF=Wz7S18~m5CctAn^#ExUp$G67jT_zxAhJL7 z0A8~fi@a+BmM)FSdbBizct!eFn=6Z{*e@U~6Y~z+$+@-#5EhDhitXRtwg6~K*isur z!dXY3os-t~AJbS<$!G>`Hoe*oPGt5T9D^oio`KBjoxwy!ji&t_LoCDsXiof!#@fpJ zvtMhhi*2F9mPGRQL5*vFq4QJ02^ee<0$Pg1*oKeO+o7RBKi-J&E9q3H$6*i z11RVOn(_df8mlYs_@axNW3l&XmgC3d;*>4n#TY!+R2#cxrZn%Ko3DQzM8*s3hX7!; zAT%4>0+5BGIbV!;Pp+3XR>xi?5&Qzw@NUGw@?0+L?T9}|zib?W0Q$fK$U@OvuVtJ) z4JK%)j{S)a-Cz@HD<8k;b4;ScXu=)unk}X_R+=- zIV1jexT)*C!fHWiHns&|rcjjHEOUhxkSV+rQG@*y?DTj|W)lZw-yh2bq1mX~IW)Jn zNWdalzzHU)ufJ*!#R)E_sZWz(Pi+U8{t@Z`{tHY(&Bi0-J4}5Jd1i8K#%d&-L{%wa zO6FmdfjaJ=GE%pKJoxo3Plm;9D39V2?()-or2J8ln6i;ih?zkb`7k)974=vqaZXJ zH3G0xD2n2)MDOZvLWn8s6oh7@L;!XQMd?GcG)>$uH-&}*AUaW`VmCEg1)qnVt_h2+Fdtl?i|;2ux6v zaHumm_nn!>-SqkmOSGmJrkG5jvr1O-#} zTdQjVxKN&7&p=z#+k5+0A#b488{rDDiN+0OzqK*}2%dJJL=2BkYufsJnKY_hcH>++ zd(qj~`($?U_9I-wu(0P5A=1oj!TTM(L!!eL;BN5KIoTzqv` z|KJza6Zo0h<{K{}0n7)RPz>N

533${1gTC@uvDpiW_VXaCUms0|%X1N*~uwH3<3 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 QuK)l507*qoM6N<$f}wKCT>t<8 literal 0 HcmV?d00001 diff --git a/src/icons-edge/paused-64.png b/src/icons-edge/paused-64.png new file mode 100644 index 0000000000000000000000000000000000000000..a54385d4f7b41e9e9cb3292e9f558d9027be854c GIT binary patch literal 1975 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 e21!IgR09Bv7qunYGFhSk0000 literal 0 HcmV?d00001 diff --git a/src/icons-edge/protected-32.png b/src/icons-edge/protected-32.png new file mode 100644 index 0000000000000000000000000000000000000000..5f1952941bb7cf9fbae9ab310a7e9ee40a12ef50 GIT binary patch literal 1069 zcmV+|1k(G7P)7%g5T1E&y>`+d2Z+-M5CsWNNEMu@T6(CFD&>HX5OCnF$cc-&%S6#1n*K4;`KWY8m zyqP!i?fAVnZw1_ED9|Vfurt-aUMDSzNYPR{rz@f0L0S`>%n$xJ1q}lI7)6HTPm!c3 z0=~#%l%Eb$w>mv%;RbU;RSrNQN5)+S?}8c2Ra*h>7CNU+Y$ft7$A zgm6KI0tYCh{;#%$_Rsc?WIYLVq~crnHHLWb8Sn`&0yTsLOkrzipzz7=L*|&U8VJC_ zMuImA)L}iXTpO^CRV_jyx(4?cLdfe?vQ2*pn#Tn1inq8u=4C_@Gp+=9v1Pm_^WXEK zPWod=_`6ND94v?4&VTvW7--@hPajgc6VL(D9&^uUdv<=C>m5lmi7#xr;_NrOmyM1> zXspUB{5WqxDblV4SaQz*LXaP-^fkEz9?$__EqwLo)7(8%6Q6{81_0431HOSe%|qo} zg2fu01osT6v^oR#7=f_rP9W1WdKIc!AK}w5#jRV)vmQDp6mP|FCSdX~e)!y<4wvN? zUU)GLv<-YntXPeRU?1xrSFV>HW$^^~072~<6Anh{n=OUUc3rL<8Vj-1Nv70i+60kG z0z~5Mz))%a>wlJbTYhKiO0rbaQJ7g-wmGj^W3}ZNDPvR-Mz}K<`HXX%Foe0-&i_o4 zbl-4}o5QA@-!cBL*2wNe z@odLJWPI%peNTc-jNGVbKAGQ zvJQ3SO}!cKJv*zAS z?&TX&H+NT{d8|-S?RE?9Nx;BtYZsVRyA7OJ~ruPbwqJdHr1&CWz^Dg^awB(V z++)K00v1!K~w_(d1zvcRaDr{00000NkvXXu0mjf1}F7! literal 0 HcmV?d00001 diff --git a/src/icons-edge/protected-48.png b/src/icons-edge/protected-48.png new file mode 100644 index 0000000000000000000000000000000000000000..a520742645d547a313d8ab1f523d16358eaa2a58 GIT binary patch literal 1537 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 e21!IgR09AoL!>8L^lZ=o0000 Date: Wed, 7 Oct 2026 16:30:20 +1100 Subject: [PATCH 2/2] Edge icon: rebuild the polite hand on the classic fist Same finger columns, palm and tucked thumb as the classic icon; only the finger heights change (index, ring and pinky up, middle folded). Rik picked option 1 from the comparison sheet. Co-Authored-By: Claude Opus 5.5 (1M context) --- assets/icons/edge/caution.svg | 2 +- assets/icons/edge/danger.svg | 2 +- assets/icons/edge/idle.svg | 2 +- assets/icons/edge/paused.svg | 2 +- assets/icons/edge/protected.svg | 2 +- scripts/icons.mjs | 17 +++++++++-------- src/icons-edge/caution-128.png | Bin 3554 -> 3414 bytes src/icons-edge/caution-16.png | Bin 600 -> 578 bytes src/icons-edge/caution-32.png | Bin 1076 -> 1013 bytes src/icons-edge/caution-48.png | Bin 1523 -> 1439 bytes src/icons-edge/caution-64.png | Bin 1953 -> 1894 bytes src/icons-edge/danger-128.png | Bin 3560 -> 3436 bytes src/icons-edge/danger-16.png | Bin 594 -> 579 bytes src/icons-edge/danger-32.png | Bin 1049 -> 995 bytes src/icons-edge/danger-48.png | Bin 1533 -> 1445 bytes src/icons-edge/danger-64.png | Bin 1975 -> 1907 bytes src/icons-edge/idle-128.png | Bin 3572 -> 3435 bytes src/icons-edge/idle-16.png | Bin 584 -> 575 bytes src/icons-edge/idle-32.png | Bin 1078 -> 1001 bytes src/icons-edge/idle-48.png | Bin 1529 -> 1442 bytes src/icons-edge/idle-64.png | Bin 1994 -> 1907 bytes src/icons-edge/paused-128.png | Bin 3539 -> 3401 bytes src/icons-edge/paused-16.png | Bin 596 -> 584 bytes src/icons-edge/paused-32.png | Bin 1060 -> 1021 bytes src/icons-edge/paused-48.png | Bin 1514 -> 1417 bytes src/icons-edge/paused-64.png | Bin 1975 -> 1905 bytes src/icons-edge/protected-128.png | Bin 3524 -> 3414 bytes src/icons-edge/protected-16.png | Bin 592 -> 574 bytes src/icons-edge/protected-32.png | Bin 1069 -> 998 bytes src/icons-edge/protected-48.png | Bin 1537 -> 1441 bytes src/icons-edge/protected-64.png | Bin 1996 -> 1925 bytes 31 files changed, 14 insertions(+), 13 deletions(-) diff --git a/assets/icons/edge/caution.svg b/assets/icons/edge/caution.svg index d85cf51..af2e957 100644 --- a/assets/icons/edge/caution.svg +++ b/assets/icons/edge/caution.svg @@ -1 +1 @@ -SilentBlock: Pushy site: pop-under, tab-under or nag wall dealt with (amber) +SilentBlock: Pushy site: pop-under, tab-under or nag wall dealt with (amber) diff --git a/assets/icons/edge/danger.svg b/assets/icons/edge/danger.svg index a769fd6..6a0dfae 100644 --- a/assets/icons/edge/danger.svg +++ b/assets/icons/edge/danger.svg @@ -1 +1 @@ -SilentBlock: Known malware, phishing or scam host (garnet) +SilentBlock: Known malware, phishing or scam host (garnet) diff --git a/assets/icons/edge/idle.svg b/assets/icons/edge/idle.svg index 749b6b1..8c0aeec 100644 --- a/assets/icons/edge/idle.svg +++ b/assets/icons/edge/idle.svg @@ -1 +1 @@ -SilentBlock: Idle, or nothing on this page needed blocking (slate blue) +SilentBlock: Idle, or nothing on this page needed blocking (slate blue) diff --git a/assets/icons/edge/paused.svg b/assets/icons/edge/paused.svg index aff2dd2..74eddf2 100644 --- a/assets/icons/edge/paused.svg +++ b/assets/icons/edge/paused.svg @@ -1 +1 @@ -SilentBlock: Paused on this site, or protection off (grey) +SilentBlock: Paused on this site, or protection off (grey) diff --git a/assets/icons/edge/protected.svg b/assets/icons/edge/protected.svg index 1b29842..662c590 100644 --- a/assets/icons/edge/protected.svg +++ b/assets/icons/edge/protected.svg @@ -1 +1 @@ -SilentBlock: Ads or trackers blocked (jade) +SilentBlock: Ads or trackers blocked (jade) diff --git a/scripts/icons.mjs b/scripts/icons.mjs index fd420da..ed2df87 100644 --- a/scripts/icons.mjs +++ b/scripts/icons.mjs @@ -37,15 +37,16 @@ export const HANDS = { '', '', ].join(''), - // Open hand, middle finger folded to a knuckle. Thin gaps keep the fingers apart at 128px; - // the thumb splays out of the palm so it reads as a hand, not a "W", at 16px. + // The classic fist with the fingers swapped: index, ring and pinky up, middle folded down. + // Same finger columns, palm and thumb as classic so the two read as one family. polite: [ - '', - '', - '', - '', - '', - '', + '', + '', + '', + '', + '', + '', + '', ].join(''), }; // Which hand each icon set uses, and where it goes. diff --git a/src/icons-edge/caution-128.png b/src/icons-edge/caution-128.png index c6e3f62c7047f77675af94b56e059f0c112eaa5a..c534fe84eb2102a4f1c992886b030bbf3cfda443 100644 GIT binary patch delta 3411 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 delta 576 zcmV-G0>Ayj1lRk#)5iYM&{mstcb;$3*<{kR z`QY*1?0nz1@6C*W4k+c_%#Rn&xlSB37yj5$2f!L6!0WsmC1&AdPu%*D zh+C5<@0I)(gVHPaf)p^$bIP9!Oe4 z=SRyE+c|L&I>3MJ_WxZ8W$%6e%TApC00030|F3${8~^|S21!IgR09C3L9eOX#i{oI O0000sQ7`qbLX6U&-w1XckbK~@RHFWAw+<+e}4-*xl$x9ll6Hky$&y~ zPwC~J;p!M91miR^Mzh^OqDUYPAW)G_nHAs7>SISVnqDWxg>+ggccirP8$-sesMx*& z>VI$ByeL&sAoUS|oiHC1phbW?I8voOrCn%mlV{t~>U{U$R3lVC^=Q7AEclD7+aV@l z0^CReV;yO2=zr~>>X%k*qNN4laFXOnQ5Nicyr71hwiW>v!2-NsBtjE{1R%m)h~_#M z<*_3D$rD=QVuW?pB$$B$cnr+2&V+C+RrbA){>)TD;Bg+Rj5M(8ums)2|8?Q zvx2AKwE=UEqs>Ab5YA+4lU;-}UA*wlKs+8U=Liz;G_dKP56?O86~QSSfo3lkC0czU zcw!5mMt^?m;Apl~>2n%nQ!TEFTO#Lv{K)>%A+_iZ!Y{H~v;gv|vV#t5KSB`>niAt4``Al)`y!rDfFdEFc>1iq5}n9F1`ZkyC% ztpTip56V(~kN}mU-ELb7g%K%0AzTALkk@{x{NAmsbJqh*`6++~R z2w|yB$B*ATJbl{FErR;xzMeeIXS#l_&cj+km|w5U{-ETc0&KE}?v!~4EXLlRTXMtf z#(%UdzH@l09M&#Wz_N%^ z7E7M`Qu@#z3jPP`VxhJVp|bc=C<=lP{_Beh=0!wM5!asw(I+256wzol`)9Hn!I;Ek zb?=Plu5P${ckkW1QSpPzJu~Ob%r|Gw%$Z^Eo*|${C0)LP*g!JTfi4b$E52 zM~g1omh6Wbfo_Zvhg;e~v5*4xErJSB)xx4~Fga!FO=asiyW;hVsLvy!9pS`-YJFEE zFtYE%51w;9#89nO0LFj;yADbSSUX1*Yw(CG4fXtDy;r~7-ZPqUB#=B3=u#5)lK3&W zgcAWPID>wlSAT@R_s2uKAp@Q%R|@?b{*5gx%@ zfp{7e{7P$j%gIb|NZS%1AEcccD}?Qk*IP(DX;Do*pJcyv?HoHHC0pmz2j|>@fW(wT z+adq@;obh8WQsAi)2yIbkAJ^wv=EJXF0=HTq{@n0kbg0ivL%2P_gGLzOQZ}zhx~+t z9i36^$8REI9Yo^3RVM^GctGb)9&isO$H*%N*{4<&XTshCOwA=P=>vRWK^LsIh(VVBydRtc%~Feg4O6BO!AfRiq<4nCtw1Y=X$_nbqZTImusn z1r8ll7DqVl=9TjzP2`)3lJ8Wi(I&h0km$# zCLz@6fxeGCPy^0JmNZZdd~UAuAWKvwpd;Lca(vb}KG_#L6bOP#_+)OYvYs=@%lfW( zBT61@{fV}gk#M+0rPG}-qU(4(*b|FYY8&ls3ZT$_q1#Y|mQ#B@imoyIxpPOh&lLd! ziGPEEZqlA1Q3D55y%8b2sMqj^uY0rSE2)`XJO8HP^E8WYupB@&0bzQc#=GqXcO+n- zWkWoQfFaBA>~d^)y1>grU-phho$MS56i950-2`N7NPGhB@npV_ty%HU=*?<|RS6jI zZyf5Ue6Sjf{Xl`b!KKX0p4!DGC z0tQ+)Cmtv!zoL=KZaS1`?k#R^Sovul10ggs~h0#X7-oU}>|~xom49 zU2A`?-iDPhbgZpO%gg-_>3-o~;M)@XGgeEGzBz%ng_i&T0RR6nvq8xK000I_L>NI- Z0{}^?Q_b+w6!icA002ovPDHLkV1hrm_geq} diff --git a/src/icons-edge/caution-48.png b/src/icons-edge/caution-48.png index e6b80adc5607ce7593bd5a40578cdf09c85f5eca..764f9239cc62e7940ed63fa33e43f1063c52104f 100644 GIT binary patch delta 1421 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 Hu0mjfD~;Li diff --git a/src/icons-edge/caution-64.png b/src/icons-edge/caution-64.png index 91b5ce38f031869f0cdae7756613745c86d75f94..d56fa97e927368e26c1760b46e3d5204ba262900 100644 GIT binary patch delta 1879 zcmV-d2dMa=59SV#B!3%8L_t(|oaCEZY!p=($G`8)>~60hH^ZeD@DdFQK8Qf&l5R^0 zMoHvB9}GsNH?2MpG@?dffoMWZFqj}gZa$E{@S?;>0=6}R5gG^)qo5Sp?QScyTcxzL zrQJQB-;|WJb!YeN?98^pFKu>a&SmEN&o}3MXU-V`_c#LXaes6e0|Gm8(kV+{4nR-& z+j=0|jrCJ>_levM!Cpu)2q}PkptsJ