diff --git a/package-lock.json b/package-lock.json
index 13f5276..a1b87ee 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,9 +5,12 @@
"packages": {
"": {
"dependencies": {
+ "webext-base-css": "^1.4.3",
+ "webext-options-sync": "^4.0.1",
"webext-polyfill-kinda": "^1.0.0"
},
"devDependencies": {
+ "@rollup/plugin-commonjs": "^24.0.1",
"@rollup/plugin-node-resolve": "^15.0.1",
"eslint": "^8.35.0",
"eslint-config-prettier": "^8.6.0",
@@ -277,6 +280,12 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true
},
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -312,6 +321,71 @@
"node": ">= 8"
}
},
+ "node_modules/@rollup/plugin-commonjs": {
+ "version": "24.0.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz",
+ "integrity": "sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "commondir": "^1.0.1",
+ "estree-walker": "^2.0.2",
+ "glob": "^8.0.3",
+ "is-reference": "1.2.1",
+ "magic-string": "^0.27.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.68.0||^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-commonjs/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@rollup/plugin-commonjs/node_modules/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@rollup/plugin-node-resolve": {
"version": "15.0.1",
"resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz",
@@ -717,6 +791,12 @@
"node": ">=0.1.90"
}
},
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -937,6 +1017,11 @@
"node": ">=6.0.0"
}
},
+ "node_modules/dom-form-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-form-serializer/-/dom-form-serializer-2.0.0.tgz",
+ "integrity": "sha512-HMrrc7gJIBj6sWmnJcO9DLZj8AsdFP60+pZSu0vMJxZhEP3GPfsNE9X1GC95nXZ0SZbS8FYDb/NHW/NArSmu0Q=="
+ },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -2081,6 +2166,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-reference": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
+ "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
"node_modules/is-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -2358,6 +2452,26 @@
"node": ">=10"
}
},
+ "node_modules/lz-string": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
+ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
+ "bin": {
+ "lz-string": "bin/bin.js"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+ "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.13"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/map-obj": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
@@ -4043,6 +4157,14 @@
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
+ "node_modules/throttle-debounce": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz",
+ "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==",
+ "engines": {
+ "node": ">=12.22"
+ }
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -4148,6 +4270,34 @@
"spdx-expression-parse": "^3.0.0"
}
},
+ "node_modules/webext-base-css": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webext-base-css/-/webext-base-css-1.4.3.tgz",
+ "integrity": "sha512-LKbDiNn94MTu9Uz1MwgSLjkPIWfBAyt+xpU9Ad+6fy3A7BpxSSFVmqrvcs/6CzaTdRb+5gL1xtLVB/++DZP05g==",
+ "funding": {
+ "url": "https://github.com/sponsors/fregante"
+ }
+ },
+ "node_modules/webext-detect-page": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/webext-detect-page/-/webext-detect-page-4.0.1.tgz",
+ "integrity": "sha512-Y9Skw6/Uj0dGwOIidc1XqZ3neEbmuuT4BlkL/J4JHAo6fVznHIZq6/MWDsPGOA/jnNowiSXtHHh4S/TOxbl6bQ=="
+ },
+ "node_modules/webext-options-sync": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/webext-options-sync/-/webext-options-sync-4.0.1.tgz",
+ "integrity": "sha512-uwR/PAWuHo9DUnYZyAXgYjgUEPxo0yEBR7oNSuOvLUDgjRf5SoSTSh26E00XzbgGmA3VNXA9Uhn2XrYpPSPoEA==",
+ "dependencies": {
+ "dom-form-serializer": "^2.0.0",
+ "lz-string": "^1.4.4",
+ "throttle-debounce": "^5.0.0",
+ "webext-detect-page": "^4.0.1",
+ "webext-polyfill-kinda": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fregante"
+ }
+ },
"node_modules/webext-polyfill-kinda": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/webext-polyfill-kinda/-/webext-polyfill-kinda-1.0.0.tgz",
@@ -4373,7 +4523,8 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.0.1.tgz",
"integrity": "sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"@csstools/css-tokenizer": {
"version": "2.1.0",
@@ -4385,13 +4536,15 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.0.1.tgz",
"integrity": "sha512-X2/OuzEbjaxhzm97UJ+95GrMeT29d1Ib+Pu+paGLuRWZnWRK9sI9r3ikmKXPWGA1C4y4JEdBEFpp9jEqCvLeRA==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"@csstools/selector-specificity": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz",
"integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"@eslint-community/eslint-utils": {
"version": "4.1.2",
@@ -4448,6 +4601,12 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true
},
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
"@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -4474,6 +4633,53 @@
"fastq": "^1.6.0"
}
},
+ "@rollup/plugin-commonjs": {
+ "version": "24.0.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz",
+ "integrity": "sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==",
+ "dev": true,
+ "requires": {
+ "@rollup/pluginutils": "^5.0.1",
+ "commondir": "^1.0.1",
+ "estree-walker": "^2.0.2",
+ "glob": "^8.0.3",
+ "is-reference": "1.2.1",
+ "magic-string": "^0.27.0"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ }
+ },
+ "minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
+ }
+ },
"@rollup/plugin-node-resolve": {
"version": "15.0.1",
"resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz",
@@ -4533,7 +4739,8 @@
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"ajv": {
"version": "6.12.6",
@@ -4759,6 +4966,12 @@
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
"dev": true
},
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true
+ },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -4917,6 +5130,11 @@
"esutils": "^2.0.2"
}
},
+ "dom-form-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-form-serializer/-/dom-form-serializer-2.0.0.tgz",
+ "integrity": "sha512-HMrrc7gJIBj6sWmnJcO9DLZj8AsdFP60+pZSu0vMJxZhEP3GPfsNE9X1GC95nXZ0SZbS8FYDb/NHW/NArSmu0Q=="
+ },
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -5053,7 +5271,8 @@
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz",
"integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"eslint-config-xo": {
"version": "0.43.1",
@@ -5068,7 +5287,8 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-svelte3/-/eslint-plugin-svelte3-4.0.0.tgz",
"integrity": "sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"eslint-plugin-unicorn": {
"version": "45.0.2",
@@ -5747,6 +5967,15 @@
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"dev": true
},
+ "is-reference": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
+ "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "*"
+ }
+ },
"is-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -5957,6 +6186,20 @@
"yallist": "^4.0.0"
}
},
+ "lz-string": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
+ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="
+ },
+ "magic-string": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+ "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/sourcemap-codec": "^1.4.13"
+ }
+ },
"map-obj": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
@@ -6432,7 +6675,8 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
"integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"postcss-selector-parser": {
"version": "6.0.11",
@@ -6448,7 +6692,8 @@
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-7.0.1.tgz",
"integrity": "sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"postcss-value-parser": {
"version": "4.2.0",
@@ -6481,7 +6726,8 @@
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.9.0.tgz",
"integrity": "sha512-3doBi5NO4IVgaNPtwewvrgPpqAcvNv0NwJNflr76PIGgi9nf1oguQV1Hpdm9TI2ALIQVn/9iIwLpBO5UcD2Jiw==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"punycode": {
"version": "2.3.0",
@@ -7069,7 +7315,8 @@
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/stylelint-declaration-block-no-ignored-properties/-/stylelint-declaration-block-no-ignored-properties-2.7.0.tgz",
"integrity": "sha512-44SpI9+9Oc1ICuwwRfwS/3npQ2jPobDSTnwWdNgZGryGqQCp17CgEIWjCv1BgUOSzND3RqywNCNLKvO1AOxbfg==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"stylelint-order": {
"version": "5.0.0",
@@ -7166,6 +7413,11 @@
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
+ "throttle-debounce": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz",
+ "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg=="
+ },
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -7250,6 +7502,28 @@
"spdx-expression-parse": "^3.0.0"
}
},
+ "webext-base-css": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webext-base-css/-/webext-base-css-1.4.3.tgz",
+ "integrity": "sha512-LKbDiNn94MTu9Uz1MwgSLjkPIWfBAyt+xpU9Ad+6fy3A7BpxSSFVmqrvcs/6CzaTdRb+5gL1xtLVB/++DZP05g=="
+ },
+ "webext-detect-page": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/webext-detect-page/-/webext-detect-page-4.0.1.tgz",
+ "integrity": "sha512-Y9Skw6/Uj0dGwOIidc1XqZ3neEbmuuT4BlkL/J4JHAo6fVznHIZq6/MWDsPGOA/jnNowiSXtHHh4S/TOxbl6bQ=="
+ },
+ "webext-options-sync": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/webext-options-sync/-/webext-options-sync-4.0.1.tgz",
+ "integrity": "sha512-uwR/PAWuHo9DUnYZyAXgYjgUEPxo0yEBR7oNSuOvLUDgjRf5SoSTSh26E00XzbgGmA3VNXA9Uhn2XrYpPSPoEA==",
+ "requires": {
+ "dom-form-serializer": "^2.0.0",
+ "lz-string": "^1.4.4",
+ "throttle-debounce": "^5.0.0",
+ "webext-detect-page": "^4.0.1",
+ "webext-polyfill-kinda": "^1.0.0"
+ }
+ },
"webext-polyfill-kinda": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/webext-polyfill-kinda/-/webext-polyfill-kinda-1.0.0.tgz",
@@ -7317,7 +7591,8 @@
"version": "7.5.9",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
"integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"yallist": {
"version": "4.0.0",
diff --git a/package.json b/package.json
index c4f2b8b..9361db6 100644
--- a/package.json
+++ b/package.json
@@ -27,6 +27,7 @@
"prettier"
],
"rules": {
+ "unicorn/prefer-top-level-await": "off",
"no-new": "off",
"no-bitwise": "off"
},
@@ -49,6 +50,7 @@
"extends": "stylelint-config-xo"
},
"devDependencies": {
+ "@rollup/plugin-commonjs": "^24.0.1",
"@rollup/plugin-node-resolve": "^15.0.1",
"eslint": "^8.35.0",
"eslint-config-prettier": "^8.6.0",
@@ -77,6 +79,8 @@
}
},
"dependencies": {
+ "webext-base-css": "^1.4.3",
+ "webext-options-sync": "^4.0.1",
"webext-polyfill-kinda": "^1.0.0"
}
}
diff --git a/readme.md b/readme.md
index ac1c74c..98cf761 100644
--- a/readme.md
+++ b/readme.md
@@ -1,22 +1,26 @@
+## One Click Extension Manager
+
-##
One Click Extension Manager
+
-A simple Chrome extension to manage your Chrome extensions.
+![](https://user-images.githubusercontent.com/1402241/226161439-960aebe9-cad1-4d4d-a59a-f007db2abfa3.png)
+
+A _very simple_ Chrome extension to manage your Chrome extensions.
It only requires the `management` permission.
## Install
[link-chrome]: https://chrome.google.com/webstore/detail/one-click-extension-manag/pbgjpgbpljobkekbhnnmlikbbfhbhmem 'Version published on Chrome Web Store'
-[link-firefox]: https://addons.mozilla.org/en-US/firefox/addon/npm-hub/ 'Version published on Mozilla Add-ons'
-[link-safari]: https://apps.apple.com/app/npmhub/id1542090429 'Version published on the Mac App Store'
[link-edge]: https://microsoftedge.microsoft.com/addons/detail/one-click-extensions-mana/jdodenbllldnoogfmbmmgpieafbnaogm 'Version published on Edge Web Stroe'
-[
][link-chrome] [
][link-chrome]
+[
][link-chrome] [
][link-chrome] and other Chromium browsers
[
][link-edge] [
][link-edge]
+[
](https://github.com/sponsors/fregante) _If you like this extension, consider [sponsoring or hiring](https://github.com/sponsors/fregante) the maintainer [@fregante](https://twitter.com/fregante)_
+
## Internationalization
It's available in 12 languages:
diff --git a/rollup.config.js b/rollup.config.js
index b3c028f..4b9eb60 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -1,3 +1,4 @@
+import commonjs from '@rollup/plugin-commonjs';
import copy from 'rollup-plugin-copy-glob';
import svelte from 'rollup-plugin-svelte';
import resolve from '@rollup/plugin-node-resolve';
@@ -6,10 +7,13 @@ import livereload from 'rollup-plugin-livereload';
const production = !process.env.ROLLUP_WATCH;
const config = {
- input: 'source/main.js',
+ input: {
+ main: 'source/main.js',
+ 'options/options': 'source/options/options.js',
+ },
output: {
sourcemap: !production,
- format: 'iife',
+ format: 'es',
dir: 'distribution',
},
plugins: [
@@ -19,6 +23,7 @@ const config = {
dev: !production,
},
}),
+ commonjs(),
resolve({
browser: true,
dedupe: ['svelte'],
diff --git a/source/App.svelte b/source/App.svelte
index 38e71a6..eba0014 100644
--- a/source/App.svelte
+++ b/source/App.svelte
@@ -1,4 +1,5 @@
+
diff --git a/source/manifest.json b/source/manifest.json
index b9acd07..6778fae 100644
--- a/source/manifest.json
+++ b/source/manifest.json
@@ -5,7 +5,7 @@
"manifest_version": 3,
"homepage_url": "https://github.com/hankxdev/one-click-extensions-manager",
"default_locale": "en",
- "permissions": ["management"],
+ "permissions": ["management", "storage"],
"minimum_chrome_version": "110",
"icons": {
"16": "logo.png",
@@ -16,7 +16,7 @@
"default_popup": "index.html?type=popup"
},
"options_ui": {
- "page": "index.html"
+ "page": "options/options.html"
},
"commands": {
"_execute_action": {}
diff --git a/source/options-storage.js b/source/options-storage.js
new file mode 100644
index 0000000..5e63fe3
--- /dev/null
+++ b/source/options-storage.js
@@ -0,0 +1,10 @@
+import OptionsSync from 'webext-options-sync';
+
+const optionsStorage = new OptionsSync({
+ defaults: {
+ showButtons: 'on-demand', // Or 'always'
+ width: '',
+ },
+});
+
+export default optionsStorage;
diff --git a/source/options/options.html b/source/options/options.html
new file mode 100644
index 0000000..0ee415a
--- /dev/null
+++ b/source/options/options.html
@@ -0,0 +1,58 @@
+
+
+
+ If you find this useful, consider supporting its development by donating or + leaving a review. +
++ Made by fregante 🇮🇹 and + Hank Yang 🇨🇳 +
+ diff --git a/source/options/options.js b/source/options/options.js new file mode 100644 index 0000000..8b6e0d5 --- /dev/null +++ b/source/options/options.js @@ -0,0 +1,3 @@ +import optionsStorage from '../options-storage.js'; + +optionsStorage.syncForm(document.querySelector('form')); diff --git a/source/options/webext-base.css b/source/options/webext-base.css new file mode 100644 index 0000000..5aaa561 --- /dev/null +++ b/source/options/webext-base.css @@ -0,0 +1,137 @@ +/* Vendored until a better build is added */ + +/*! https://npm.im/webext-base-css */ + +/* Firefox only: @-moz-document */ +/* Firefox only: var(--in-content-*) */ +/* Chrome only: -webkit-hyphens */ +/* Safari only: _::-webkit-full-page-media */ + +/* webpackIgnore: true */ +@import url('chrome://global/skin/in-content/common.css') +(min--moz-device-pixel-ratio: 0); /* Firefox-only */ + +:root { + --background-color-for-chrome: #292a2d; + max-width: 700px; + margin: auto; +} + +body { + --body-margin-h: 8px; + margin-left: var(--body-margin-h); + margin-right: var(--body-margin-h); +} + +/* Selector matches Firefox’ */ +input[type='number'], +input[type='password'], +input[type='search'], +input[type='text'], +input[type='url'], +input:not([type]), +textarea { + display: block; + box-sizing: border-box; + margin-left: 0; + width: 100%; + resize: vertical; + -moz-tab-size: 4 !important; + tab-size: 4 !important; +} + +input[type='checkbox'] { + vertical-align: -0.15em; +} + +@supports (not (-webkit-hyphens: none)) and (not (-moz-appearance: none)) and + (list-style-type: '*') { + textarea:focus { + /* Inexplicably missing from Chrome’s input style https://github.com/chromium/chromium/blob/6bea0557fe/extensions/renderer/resources/extension.css#L287 */ + border-color: #4d90fe; + transition: border-color 200ms; + } +} + +hr { + margin-right: calc(-1 * var(--body-margin-h)); + margin-left: calc(-1 * var(--body-margin-h)); + border: none; + border-bottom: 1px solid #aaa4; +} + +img { + vertical-align: middle; +} + +_::-webkit-full-page-media, +_:future, +:root { + font-family: -apple-system, BlinkMacSystemFont, sans-serif, + 'Apple Color Emoji'; +} + +_::-webkit-full-page-media, +_:future, +input[type='number'], +input[type='password'], +input[type='search'], +input[type='text'], +input[type='url'], +input:not([type]), +textarea { + border: solid 1px #888; + padding: 0.4em; + font: inherit; + -webkit-appearance: none; +} + +@-moz-document url-prefix('') { + :root, /* Visible on a options_page */ + body { + --body-margin-h: 6px; /* Must be a variable so