From a8c58ff584431a4b5a68e1ba65d9e2e172e77522 Mon Sep 17 00:00:00 2001 From: mirivlad Date: Wed, 15 Jul 2026 19:17:18 +0800 Subject: [PATCH] fix: update browser extension brand icon --- README.md | 2 +- chromium/manifest.json | 2 +- firefox/manifest.json | 2 +- package-lock.json | 4 +- package.json | 4 +- release-notes/v2.0.6.md | 13 ++++ scripts/generate-icons.sh | 18 +++++ scripts/test-firefox-github-release.js | 12 +-- scripts/test-icons.js | 102 +++++++++++++++++++++++++ shared/icons/icon128.png | Bin 16595 -> 1372 bytes shared/icons/icon16.png | Bin 765 -> 642 bytes shared/icons/icon48.png | Bin 3475 -> 1206 bytes shared/icons/verstak.svg | 5 ++ 13 files changed, 151 insertions(+), 13 deletions(-) create mode 100644 release-notes/v2.0.6.md create mode 100755 scripts/generate-icons.sh create mode 100644 scripts/test-icons.js create mode 100644 shared/icons/verstak.svg diff --git a/README.md b/README.md index 3563808..57203d5 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ for the same Firefox publishing flow. For an explicit version check, pass the current tag after `--`: ```bash -VERSTAK_BROWSER_ENV=/path/to/.env npm run publish:github -- v2.0.5 +VERSTAK_BROWSER_ENV=/path/to/.env npm run publish:github -- v2.0.6 ``` Release output: diff --git a/chromium/manifest.json b/chromium/manifest.json index a2188af..82687c8 100644 --- a/chromium/manifest.json +++ b/chromium/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Verstak Bridge", - "version": "2.0.5", + "version": "2.0.6", "description": "Send pages, selections, links, and files to the local Verstak browser inbox.", "author": "Verstak", "homepage_url": "https://github.com/mirivlad/verstak-browser-extension", diff --git a/firefox/manifest.json b/firefox/manifest.json index d53e31f..cad128a 100644 --- a/firefox/manifest.json +++ b/firefox/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 2, "name": "Verstak Bridge", - "version": "2.0.5", + "version": "2.0.6", "description": "Send pages, selections, links, and files to the local Verstak browser inbox.", "author": "Verstak", "homepage_url": "https://github.com/mirivlad/verstak-browser-extension", diff --git a/package-lock.json b/package-lock.json index c337c38..53fba3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "verstak-browser-extension", - "version": "2.0.5", + "version": "2.0.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "verstak-browser-extension", - "version": "2.0.5", + "version": "2.0.6", "devDependencies": { "web-ext": "^8.3.0" } diff --git a/package.json b/package.json index b6f6660..8fe72d4 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "verstak-browser-extension", - "version": "2.0.5", + "version": "2.0.6", "private": true, "description": "Verstak browser capture extension for Chromium and Firefox", "license": "AGPL-3.0-or-later", "scripts": { "build": "node scripts/build-extension.js", - "test": "node scripts/test-manifests.js && node scripts/test-hostname.js && node scripts/test-activity-tracker.js && node scripts/test-protocol.js && node scripts/test-i18n.js && node scripts/test-popup-settings.js && node scripts/test-popup-select-style.js && node scripts/test-popup-catalog-fallback.js && node scripts/test-background-i18n.js && node scripts/test-firefox-github-release.js", + "test": "node scripts/test-manifests.js && node scripts/test-icons.js && node scripts/test-hostname.js && node scripts/test-activity-tracker.js && node scripts/test-protocol.js && node scripts/test-i18n.js && node scripts/test-popup-settings.js && node scripts/test-popup-select-style.js && node scripts/test-popup-catalog-fallback.js && node scripts/test-background-i18n.js && node scripts/test-firefox-github-release.js", "sign:firefox": "./scripts/sign-firefox-xpi.sh", "release:firefox": "./scripts/release-firefox-xpi.sh", "publish:firefox": "./scripts/publish-firefox-github-release.sh", diff --git a/release-notes/v2.0.6.md b/release-notes/v2.0.6.md new file mode 100644 index 0000000..89c28a4 --- /dev/null +++ b/release-notes/v2.0.6.md @@ -0,0 +1,13 @@ +## Highlights + +- Replaced the legacy orange extension symbol with the current Verstak workbench + icon in every browser size: 16, 48, and 128 pixels. +- Chromium and Firefox packages now use the same icon source as the Verstak + desktop application. + +## Главное + +- Старый оранжевый знак расширения заменён на актуальный фирменный значок + Верстака во всех размерах: 16, 48 и 128 пикселей. +- Пакеты Chromium и Firefox теперь используют тот же исходный знак, что и + приложение Верстак. diff --git a/scripts/generate-icons.sh b/scripts/generate-icons.sh new file mode 100755 index 0000000..558c59a --- /dev/null +++ b/scripts/generate-icons.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +MAGICK="${MAGICK_BIN:-magick}" +SOURCE="$ROOT/shared/icons/verstak.svg" + +if ! command -v "$MAGICK" >/dev/null; then + echo "ImageMagick is required to generate browser extension icons: $MAGICK not found" >&2 + exit 1 +fi + +for size in 16 48 128; do + "$MAGICK" -background none "$SOURCE" -resize "${size}x${size}" \ + "PNG32:$ROOT/shared/icons/icon${size}.png" +done + +echo "generated browser extension icons from $SOURCE" diff --git a/scripts/test-firefox-github-release.js b/scripts/test-firefox-github-release.js index e1dea25..f787f9b 100644 --- a/scripts/test-firefox-github-release.js +++ b/scripts/test-firefox-github-release.js @@ -6,23 +6,23 @@ const packageManifest = require('../package.json'); const chromiumManifest = require('../chromium/manifest.json'); const firefoxManifest = require('../firefox/manifest.json'); -const version = '2.0.5'; -const asset = 'verstak-firefox-2.0.5.xpi'; +const version = '2.0.6'; +const asset = 'verstak-firefox-2.0.6.xpi'; assert.equal(packageManifest.version, version); assert.equal(chromiumManifest.version, version); assert.equal(firefoxManifest.version, version); -assert.equal(release.releaseTag(version), 'v2.0.5'); +assert.equal(release.releaseTag(version), 'v2.0.6'); assert.equal( release.releaseAssetURL(version, asset), - 'https://github.com/mirivlad/verstak-browser-extension/releases/download/v2.0.5/verstak-firefox-2.0.5.xpi', + 'https://github.com/mirivlad/verstak-browser-extension/releases/download/v2.0.6/verstak-firefox-2.0.6.xpi', ); assert.deepEqual(release.updateManifest('verstak-bridge@verstak.app', version, asset), { addons: { 'verstak-bridge@verstak.app': { updates: [{ - version: '2.0.5', - update_link: 'https://github.com/mirivlad/verstak-browser-extension/releases/download/v2.0.5/verstak-firefox-2.0.5.xpi', + version: '2.0.6', + update_link: 'https://github.com/mirivlad/verstak-browser-extension/releases/download/v2.0.6/verstak-firefox-2.0.6.xpi', }], }, }, diff --git a/scripts/test-icons.js b/scripts/test-icons.js new file mode 100644 index 0000000..a618b86 --- /dev/null +++ b/scripts/test-icons.js @@ -0,0 +1,102 @@ +#!/usr/bin/env node +const assert = require('assert'); +const fs = require('fs'); +const path = require('path'); +const zlib = require('zlib'); + +const root = path.resolve(__dirname, '..'); +const source = fs.readFileSync(path.join(root, 'shared', 'icons', 'verstak.svg'), 'utf8'); + +assert.match(source, /fill="#1c2f4a"/i, 'icon source must define the Verstak navy'); +assert.match(source, /fill="#72d2b3"/i, 'icon source must define the Verstak mint'); + +function paeth(left, up, upperLeft) { + const estimate = left + up - upperLeft; + const leftDistance = Math.abs(estimate - left); + const upDistance = Math.abs(estimate - up); + const upperLeftDistance = Math.abs(estimate - upperLeft); + if (leftDistance <= upDistance && leftDistance <= upperLeftDistance) return left; + if (upDistance <= upperLeftDistance) return up; + return upperLeft; +} + +function pngColors(file) { + const png = fs.readFileSync(file); + assert.deepStrictEqual(png.subarray(0, 8), Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]), `${file} must be PNG`); + + let offset = 8; + let width; + let height; + let bitDepth; + let colorType; + let palette; + const idat = []; + while (offset < png.length) { + const length = png.readUInt32BE(offset); + const type = png.toString('ascii', offset + 4, offset + 8); + const data = png.subarray(offset + 8, offset + 8 + length); + offset += length + 12; + if (type === 'IHDR') { + width = data.readUInt32BE(0); + height = data.readUInt32BE(4); + bitDepth = data[8]; + colorType = data[9]; + } else if (type === 'PLTE') { + palette = data; + } else if (type === 'IDAT') { + idat.push(data); + } + } + + assert.equal(bitDepth, 8, `${file} must use 8-bit samples`); + assert.ok([2, 3, 6].includes(colorType), `${file} must use RGB, palette, or RGBA pixels`); + const bytesPerPixel = colorType === 6 ? 4 : colorType === 2 ? 3 : 1; + const rowSize = width * bytesPerPixel; + const decoded = zlib.inflateSync(Buffer.concat(idat)); + const colors = new Set(); + let readOffset = 0; + let previous = Buffer.alloc(rowSize); + + for (let y = 0; y < height; y += 1) { + const filter = decoded[readOffset++]; + const encoded = decoded.subarray(readOffset, readOffset + rowSize); + readOffset += rowSize; + const row = Buffer.alloc(rowSize); + for (let x = 0; x < rowSize; x += 1) { + const left = x >= bytesPerPixel ? row[x - bytesPerPixel] : 0; + const up = previous[x]; + const upperLeft = x >= bytesPerPixel ? previous[x - bytesPerPixel] : 0; + if (filter === 0) row[x] = encoded[x]; + else if (filter === 1) row[x] = (encoded[x] + left) & 255; + else if (filter === 2) row[x] = (encoded[x] + up) & 255; + else if (filter === 3) row[x] = (encoded[x] + Math.floor((left + up) / 2)) & 255; + else if (filter === 4) row[x] = (encoded[x] + paeth(left, up, upperLeft)) & 255; + else assert.fail(`${file} has unsupported PNG filter ${filter}`); + } + for (let x = 0; x < width; x += 1) { + if (colorType === 3) { + const paletteOffset = row[x] * 3; + colors.add(palette.subarray(paletteOffset, paletteOffset + 3).toString('hex')); + } else { + const pixelOffset = x * bytesPerPixel; + colors.add(row.subarray(pixelOffset, pixelOffset + 3).toString('hex')); + } + } + previous = row; + } + return { width, height, colors }; +} + +for (const [name, size, needsMint] of [ + ['icon16.png', 16, false], + ['icon48.png', 48, true], + ['icon128.png', 128, true], +]) { + const icon = pngColors(path.join(root, 'shared', 'icons', name)); + assert.equal(icon.width, size, `${name} width`); + assert.equal(icon.height, size, `${name} height`); + assert.ok(icon.colors.has('1c2f4a'), `${name} must contain the Verstak navy`); + if (needsMint) assert.ok(icon.colors.has('72d2b3'), `${name} must contain the Verstak mint`); +} + +console.log('browser extension icon tests passed'); diff --git a/shared/icons/icon128.png b/shared/icons/icon128.png index 89d1388537d625ec6d0261da81df83d988aca113..6c073630fea30740f2b79ffacf9a78864cbccd61 100644 GIT binary patch literal 1372 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRS3dtTpz6=aiYC!Q828LfC`4R+Uop&GlJTrt*D_XMe+dcy~+U zJBA~kzXV<|uwT31a)I?%rP#UjzYoqZYScfrJ|KTBS~q!{W|P6!4ufEZM=G^UED5Kp zyi*rBE1cb2V08A-#Vu=(dHxczaGP6yKbP@%YW>|;*8~;(E^*v&X0PzQ!d&)QC&nl0 z!7-2>3@@1V*KBurX2xJuDP|Y{{n-(QDf@rcFFY5|%KTvYYqzG^eT?4%p0Do`7x`DE8{YgbQRs+pSpaE}#J$+JAKSu2>Ias<2+)_Zql zj!B@26yvRHQ#(4pX)suW=(*F{>hCLcS=KxXaWQNRp3|j~_P#4v@aUD?LajwJw(I-3 zity)l1PfLr9pAb#o%M895W}2cR8+m;jp)Cc58YqQ?pN2B-Pg&Dm10C!gQf+Oo9)8z z?Uwzjx3ji9Qi(lbFTW~y9_u5O(A%aNM>rI|2BO-Crak+}F618yfj{k}2RR<7>o zyASzWV<)?@IJ{cSV6mL4=z7O~5v{KmIUdYmLPs$yHJkLD-ncmA#kSn&Y~a7<+A)`- zA|1@x4&mg3IsG8c*3FldubG?eXPXx-uIznXI+o+s_H`~kZ~B=Gwg71!=?>R- zNky*8o7Z~!)!v4ErLLPoYFFIhIkmZfFDE)&)q7*?x9>OZ9|4ov=<1cVWp)Q{m3q&eE5}<}nDO+>C!IfKUysgC zV|mNO{CZWYA{!_TCNX@{iD8fxX<8=DFn5#v@ilk9oZNhQarf8WvvwaO-tx^_!M^9z z<`1ctnAT=ScTN7HT9B~U)o3fwiTCrPGhQ(qs9)Z}cw^H&tC=qZJl4y-^*6e_<-?|n z=`Xq-)^6psnZ50E;xWMmT7H+>Mc6xU>E3wF^!MV^yOC#P8zx$KMmtE~V2q2d7w-F_ z@vM;N^zNO-KgC6=9;r{L`mzLA!l;(GMwFx^mZVxG7o`Fz1|tI_GhG97T|?6lLqjV= z6DuQQZ36=<0|TSEzmKA5$jwj5OsmAL!TEr5B~XI~+=i0O+|=Td#M}bhdPJ@!Ed%Od N@O1TaS?83{1OV_dO;P{= literal 16595 zcmV)LK)Jt(P)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy32;bRa{vGf6951U69E94oEQKA00(qQO+^Rl1_c5I70|m=761Ss z07*naRCwC0eR*}D6jJCdnP)kyQb@4fr(J*Q7Ezy5VM;m`5sB`c*KiO06YMs>n)g>h-k^ofr$3wuiyx9>0XJM_X!jL z9vE0UqFoRT%nSfb05RZ02oB5xky|j>Q@j>4uqFZ#xxKU=8vqsnduAR8#2nWs5Ws=? z0Du9^KHdYs3?ia6fJF$w#bp2}Uig6!_#6m-Mxc8+gpb~R&)s)_xqC@p&YSPJJyW$?vy+ zm>J9gL=Mh5fPuiF+yc4uIVNy^Jw1TDUI+osxpbf9;p%(RO)!8ExZWeU{2%G=SuQrk zXP5tu@2U3_f6rh}ze(SjKNr_5E*uddFJ!vkhdA&rPV4o*yZ6(7bn5?`0NioM9WN%( zzXIV+c~KYu2acP{_0j9YrF%0AAlAIx0u>RduW@jc{N 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 delta 3423 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 Blvn@& diff --git a/shared/icons/verstak.svg b/shared/icons/verstak.svg new file mode 100644 index 0000000..23a9fe8 --- /dev/null +++ b/shared/icons/verstak.svg @@ -0,0 +1,5 @@ + + + + +