From 25c7dd82b4b70c4645e27258392cee3265c50001 Mon Sep 17 00:00:00 2001 From: 7ev3nDev Date: Mon, 16 Jun 2025 23:25:31 +0200 Subject: [PATCH 1/6] betterSummerHC --- submissions/betterSummerHC/README.md | 16 +++ submissions/betterSummerHC/assets/favicon.png | Bin 0 -> 12023 bytes .../betterSummerHC/assets/favicon128.png | Bin 0 -> 9627 bytes .../betterSummerHC/assets/favicon16.png | Bin 0 -> 864 bytes .../betterSummerHC/assets/favicon48.png | Bin 0 -> 5061 bytes submissions/betterSummerHC/manifest.json | 47 +++++++ submissions/betterSummerHC/popup.html | 32 +++++ submissions/betterSummerHC/popup.js | 65 ++++++++++ submissions/betterSummerHC/popup/popup.css | 0 submissions/betterSummerHC/popup/popup.js | 0 .../scripts/browser-polyfill.min.js | 8 ++ submissions/betterSummerHC/scripts/content.js | 0 submissions/betterSummerHC/scripts/shop.js | 93 ++++++++++++++ submissions/betterSummerHC/styles/popup.css | 117 ++++++++++++++++++ 14 files changed, 378 insertions(+) create mode 100644 submissions/betterSummerHC/README.md create mode 100644 submissions/betterSummerHC/assets/favicon.png create mode 100644 submissions/betterSummerHC/assets/favicon128.png create mode 100644 submissions/betterSummerHC/assets/favicon16.png create mode 100644 submissions/betterSummerHC/assets/favicon48.png create mode 100644 submissions/betterSummerHC/manifest.json create mode 100644 submissions/betterSummerHC/popup.html create mode 100644 submissions/betterSummerHC/popup.js create mode 100644 submissions/betterSummerHC/popup/popup.css create mode 100644 submissions/betterSummerHC/popup/popup.js create mode 100644 submissions/betterSummerHC/scripts/browser-polyfill.min.js create mode 100644 submissions/betterSummerHC/scripts/content.js create mode 100644 submissions/betterSummerHC/scripts/shop.js create mode 100644 submissions/betterSummerHC/styles/popup.css diff --git a/submissions/betterSummerHC/README.md b/submissions/betterSummerHC/README.md new file mode 100644 index 00000000..c714428f --- /dev/null +++ b/submissions/betterSummerHC/README.md @@ -0,0 +1,16 @@ +# betterSummerHC + +## Overview + +**betterSummerHC** is an extension that makes the Summer HackClub experience better with new features! + +--- + +## Features + +- **Hide Items** Hide all the items you don't want or have already buyed from the shop page. + +## Usage + +1. Open summer in a new page in the browser [https://summer.hackclub.com/](https://summer.hackclub.com/). +2. You will instantly see modified pages \ No newline at end of file diff --git a/submissions/betterSummerHC/assets/favicon.png b/submissions/betterSummerHC/assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..4140552d4dec80b431da7e07b301eef53f9a75a8 GIT binary patch literal 12023 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 Vmd|nBGmZcN002ovPDHLkV1js{C=37q literal 0 HcmV?d00001 diff --git a/submissions/betterSummerHC/assets/favicon128.png b/submissions/betterSummerHC/assets/favicon128.png new file mode 100644 index 0000000000000000000000000000000000000000..09dcf259484eb40bcf2d63f467b934e964cfa5b3 GIT binary patch literal 9627 zcmV;MC1l!(P)?ZQwa!515E2p+5|R**c?^RDS;$RVaOZ;Np5_f=Q*F>As-1bAm%&gN8X(IeCOzyC()9eLcdf(KVFTb;|ub=tcX2tx2|9trdxLUgb+iSRC&i?() z`W-dvANS>lbOhkWYVKPr0Mk?ZvolwtC;Om>-|D5N2KTG+!>gOKckj3M9pb%xOBY7~ zn&!jZ@dDsd;r2&u+@l8s_?tHu&;o5$b(LwaTtVB|rN#%EK}N>x{rejCfQ@~CMxJ-a zKcpi7jr_6=JnfDXfOL-SewMvn_ag=dp$CVB2b(ssRj6s>+D4c*Iwst-F)>&V4-Yb} zzn^Rc`2)Cq4ewV}QeoChiqT#uC^qfcGexE?C@3*)St<6HmQ^-TQenrigWD_77n%gfnbxn|ZY$}mSxs z`un2?>S*=&lP52j?MIHBHEjWVUL4O04-YZhqoUv)gtG_x`a{F`5y{hqtE-?3O3N^| z7qQ2d6hm`dyojD%bq#ny=kD!H+qH9B(+1K8F)L=l6Bk~B*RW^Lanok(%XJ;%_8;#5 z!EN>yZkq;h1i(uLV0u6Hd|LSu`j8M0w%V6PAQqp#p7jmwi9R687%THs{B*ftQigt~DP8J@oQrSpA1- z_2=XinDw^wO1k$79v>fN z+Q?{({VrU=U9-sJ_vKh!K`-LN+1t!{{rj~yZJ*Q>)5=z`;|7(L@G34{1Y&sT3p__j z5j4fXL0$M<_?=oxOJQs5-Fw2cyLTKjt!$Cor3r4C25=D`H*qfMyo;iL( zU(*H$!3Lj-KB>rHyI(_fImdyaB5V+5QnCcaCFf*X|gLr6I%svbwT% z&=23dISW?|0RB*R31j=X38{77Qkp{$vJO&@%A?J)WBXCFD=9hJv^{#^_k_|bxpoa2 zWY-QHw|gfv!IcW&8PZg@$~$Os4d4g>KAYDGfG3sTs}KC;dxl{w3<^Zgzjh5s-S%zh z@x>(=69*0IVA{w?jNz8QZs)F8T^lk?MdGt>H^$U~gYGh|E3_b4cV`Zj^1cVN(BlIF zaNmqw`%U}w_wF^VebH5_`CKk1!<|!@K}4{CQN_Z`zy*en>}6WnM7sWoV?Yjvi{`0l-vP1}OZAKl+Rc4uV*KWNvfn`t+#*>2j* z0~nKE{ON=i%>XX2L5-8`|BpXHUb{*|h!(Y#)aECL{rG z@Mo9IBCfGw={~bvHbGN+2VYwQI0E4M_U1qOiOpUB?8cs6Lpxgg6DPuY4h{yEFF$+r z%FoSu&)%@o+b5&vmy`l?FE0ZQ5KCr{dbXH6)#45ChAs^OSw2VHKun?VmWTydyc zI=EqdhS}e(8{S99PKYhYyEvGUW7bzMKY;7gYiOz{Vxu*HBLH4505cffQx9#!DBR@9 z1B|4Ggdl!iLMwX%$2{2v?NiY6H70A&7dtnQF#-Po_h_IiE-0KqgR!}sPbs5!K7Ozj z#2E4=X}8v`Fxx-R$Tn?691y<&L;INam(Tx~X@y9Rysx)eA2hftZcxvXmy4K%IF0e` z;QuQYpwrdEg$OSFWS7}B@NQ^~

O}YPvU@)6yCH3a0I|h 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 b`~Lq03n==y2tT{900000NkvXXu0mjfESsmx literal 0 HcmV?d00001 diff --git a/submissions/betterSummerHC/manifest.json b/submissions/betterSummerHC/manifest.json new file mode 100644 index 00000000..f35a0029 --- /dev/null +++ b/submissions/betterSummerHC/manifest.json @@ -0,0 +1,47 @@ +{ + "manifest_version": 3, + "name": "betterSummerHC", + "version": "0.1.0", + "description": "An extension that makes the Summer HackClub experience better with new features!", + "permissions": [ + "activeTab", + "storage" + ], + "host_permissions": [ + "https://summer.hackclub.com/*" + ], + "action": { + "default_popup": "popup.html", + "default_icon": "assets/favicon128.png" + }, + "content_scripts": [ + { + "matches": [ + "https://summer.hackclub.com/*" + ], + "js": [ + "scripts/browser-polyfill.min.js", + "scripts/content.js" + ] + }, + { + "matches": [ + "https://summer.hackclub.com/shop" + ], + "js": [ + "scripts/browser-polyfill.min.js", + "scripts/shop.js" + ] + } + ], + "icons": { + "16": "assets/favicon16.png", + "48": "assets/favicon48.png", + "128": "assets/favicon128.png" + }, + "browser_specific_settings": { + "gecko": { + "id": "bettersummerhc@paoloo.it" + } + } +} \ No newline at end of file diff --git a/submissions/betterSummerHC/popup.html b/submissions/betterSummerHC/popup.html new file mode 100644 index 00000000..54dc9c6e --- /dev/null +++ b/submissions/betterSummerHC/popup.html @@ -0,0 +1,32 @@ + + + + + + + + + + +

+ + +
+ +
+ +
+ +
+

New Features

+

Stay tuned for more updates!

+
+ + + \ No newline at end of file diff --git a/submissions/betterSummerHC/popup.js b/submissions/betterSummerHC/popup.js new file mode 100644 index 00000000..80d00c71 --- /dev/null +++ b/submissions/betterSummerHC/popup.js @@ -0,0 +1,65 @@ +document.querySelectorAll('.tabs button').forEach(bt => { + bt.addEventListener('click', () => { + if (bt.dataset.url != undefined) { + const url = `https://summer.hackclub.com${bt.dataset.url}`; + console.log(`Opening URL: ${url}`); + + browser.tabs.query({ active: true, currentWindow: true }).then(tabs => { + const currentTab = tabs[0]; + if (currentTab.url === url) { + console.log('URL is already open in the current tab.'); + } else { + browser.tabs.update(currentTab.id, { url: url }); + } + }).catch(err => console.error('Error querying tabs:', err)); + } + + document.querySelectorAll('.tabs button').forEach(btn => btn.classList.remove('active')); + document.querySelectorAll('.content').forEach(tab => tab.classList.remove('active')); + bt.classList.add('active'); + document.querySelector(`#${bt.dataset.tab}`).classList.add('active'); + }); +}); + +(async () => { + const result = await browser.storage.sync.get(["shopHidden"]); + if (!result) { + browser.storage.sync.set({ shopHidden: [] }, () => { + console.log("No hidden items found. Creating new list."); + }); + return; + } + + const shopHidden = result.shopHidden || []; + console.log("Loaded hidden items:", shopHidden); + + const hideDiv = document.querySelector('.hidden > div'); + hideDiv.innerHTML = ''; + shopHidden.forEach(item => { + const itemElement = document.createElement('div'); + itemElement.textContent = item.split(".")[1].trim(); + + const unhideButton = document.createElement('button'); + unhideButton.textContent = 'Unhide'; + unhideButton.addEventListener('click', () => { + browser.storage.sync.get(["shopHidden"]).then(res => { + const updated = res.shopHidden.filter(i => i !== item); + browser.storage.sync.set({ shopHidden: updated }).then(() => { + itemElement.remove(); + console.log(`Item '${item}' unhidden.`); + }); + + browser.tabs.query({ active: true, currentWindow: true }).then(tabs => { + const activeTab = tabs[0]; + browser.tabs.sendMessage(activeTab.id, { action: 'unhide', id: item }) + .catch(err => console.warn('Content script may not be loaded in this tab:', err)); + }); + }); + }); + + itemElement.appendChild(unhideButton); + hideDiv.appendChild(itemElement); + }); + + document.querySelector('.hidden').style.display = shopHidden.length > 0 ? 'block' : 'none'; +})().catch(err => console.error('Error loading hidden items:', err)); \ No newline at end of file diff --git a/submissions/betterSummerHC/popup/popup.css b/submissions/betterSummerHC/popup/popup.css new file mode 100644 index 00000000..e69de29b diff --git a/submissions/betterSummerHC/popup/popup.js b/submissions/betterSummerHC/popup/popup.js new file mode 100644 index 00000000..e69de29b diff --git a/submissions/betterSummerHC/scripts/browser-polyfill.min.js b/submissions/betterSummerHC/scripts/browser-polyfill.min.js new file mode 100644 index 00000000..0758a1e9 --- /dev/null +++ b/submissions/betterSummerHC/scripts/browser-polyfill.min.js @@ -0,0 +1,8 @@ +(function(a,b){if("function"==typeof define&&define.amd)define("webextension-polyfill",["module"],b);else if("undefined"!=typeof exports)b(module);else{var c={exports:{}};b(c),a.browser=c.exports}})("undefined"==typeof globalThis?"undefined"==typeof self?this:self:globalThis,function(a){"use strict";if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(!(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)){a.exports=(a=>{const b={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(b).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class c extends WeakMap{constructor(a,b=void 0){super(b),this.createItem=a}get(a){return this.has(a)||this.set(a,this.createItem(a)),super.get(a)}}const d=a=>a&&"object"==typeof a&&"function"==typeof a.then,e=(b,c)=>(...d)=>{a.runtime.lastError?b.reject(new Error(a.runtime.lastError.message)):c.singleCallbackArg||1>=d.length&&!1!==c.singleCallbackArg?b.resolve(d[0]):b.resolve(d)},f=a=>1==a?"argument":"arguments",g=(a,b)=>function(c,...d){if(d.lengthb.maxArgs)throw new Error(`Expected at most ${b.maxArgs} ${f(b.maxArgs)} for ${a}(), got ${d.length}`);return new Promise((f,g)=>{if(b.fallbackToNoCallback)try{c[a](...d,e({resolve:f,reject:g},b))}catch(e){console.warn(`${a} API method doesn't seem to support the callback parameter, `+"falling back to call it without a callback: ",e),c[a](...d),b.fallbackToNoCallback=!1,b.noCallback=!0,f()}else b.noCallback?(c[a](...d),f()):c[a](...d,e({resolve:f,reject:g},b))})},h=(a,b,c)=>new Proxy(b,{apply(b,d,e){return c.call(d,a,...e)}});let i=Function.call.bind(Object.prototype.hasOwnProperty);const j=(a,b={},c={})=>{let d=Object.create(null),e=Object.create(a);return new Proxy(e,{has(b,c){return c in a||c in d},get(e,f){if(f in d)return d[f];if(!(f in a))return;let k=a[f];if("function"==typeof k){if("function"==typeof b[f])k=h(a,a[f],b[f]);else if(i(c,f)){let b=g(f,c[f]);k=h(a,a[f],b)}else k=k.bind(a);}else if("object"==typeof k&&null!==k&&(i(b,f)||i(c,f)))k=j(k,b[f],c[f]);else if(i(c,"*"))k=j(k,b[f],c["*"]);else return Object.defineProperty(d,f,{configurable:!0,enumerable:!0,get(){return a[f]},set(b){a[f]=b}}),k;return d[f]=k,k},set(b,c,e){return c in d?d[c]=e:a[c]=e,!0},defineProperty(a,b,c){return Reflect.defineProperty(d,b,c)},deleteProperty(a,b){return Reflect.deleteProperty(d,b)}})},k=a=>({addListener(b,c,...d){b.addListener(a.get(c),...d)},hasListener(b,c){return b.hasListener(a.get(c))},removeListener(b,c){b.removeListener(a.get(c))}}),l=new c(a=>"function"==typeof a?function(b){const c=j(b,{},{getContent:{minArgs:0,maxArgs:0}});a(c)}:a),m=new c(a=>"function"==typeof a?function(b,c,e){let f,g,h=!1,i=new Promise(a=>{f=function(b){h=!0,a(b)}});try{g=a(b,c,f)}catch(a){g=Promise.reject(a)}const j=!0!==g&&d(g);if(!0!==g&&!j&&!h)return!1;const k=a=>{a.then(a=>{e(a)},a=>{let b;b=a&&(a instanceof Error||"string"==typeof a.message)?a.message:"An unexpected error occurred",e({__mozWebExtensionPolyfillReject__:!0,message:b})}).catch(a=>{console.error("Failed to send onMessage rejected reply",a)})};return j?k(g):k(i),!0}:a),n=({reject:b,resolve:c},d)=>{a.runtime.lastError?a.runtime.lastError.message==="The message port closed before a response was received."?c():b(new Error(a.runtime.lastError.message)):d&&d.__mozWebExtensionPolyfillReject__?b(new Error(d.message)):c(d)},o=(a,b,c,...d)=>{if(d.lengthb.maxArgs)throw new Error(`Expected at most ${b.maxArgs} ${f(b.maxArgs)} for ${a}(), got ${d.length}`);return new Promise((a,b)=>{const e=n.bind(null,{resolve:a,reject:b});d.push(e),c.sendMessage(...d)})},p={devtools:{network:{onRequestFinished:k(l)}},runtime:{onMessage:k(m),onMessageExternal:k(m),sendMessage:o.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:o.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},q={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return b.privacy={network:{"*":q},services:{"*":q},websites:{"*":q}},j(a,p,b)})(chrome)}else a.exports=globalThis.browser}); +//# sourceMappingURL=browser-polyfill.min.js.map + +// webextension-polyfill v.0.12.0 (https://github.com/mozilla/webextension-polyfill) + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ diff --git a/submissions/betterSummerHC/scripts/content.js b/submissions/betterSummerHC/scripts/content.js new file mode 100644 index 00000000..e69de29b diff --git a/submissions/betterSummerHC/scripts/shop.js b/submissions/betterSummerHC/scripts/shop.js new file mode 100644 index 00000000..906393c7 --- /dev/null +++ b/submissions/betterSummerHC/scripts/shop.js @@ -0,0 +1,93 @@ +const cards = document.querySelectorAll('.card-with-gradient[data-padding="md"]'); + +function getID(card, index) { + return index + ". " + card.querySelector(".flex-grow h3.font-bold").textContent.trim(); +} + +cards.forEach((card, index) => { + const ID = getID(card, index); + const btn = document.createElement('button'); + btn.textContent = 'Hide'; + + btn.style.position = 'absolute'; + btn.style.top = '20px'; + btn.style.left = '15px'; + btn.style.backgroundColor = 'rgba(224, 73, 27, 0.8)'; + btn.style.border = '1px solid #ccc'; + btn.style.borderRadius = '24px'; + btn.style.boxShadow = '0 2px 4px rgba(0, 0, 0, 0.1)'; + btn.style.color = '#FFF'; + + + btn.style.zIndex = '1000'; + btn.style.padding = '4px 8px'; + btn.style.fontSize = '12px'; + btn.style.cursor = 'pointer'; + + card.style.position = card.style.position || 'relative'; + + btn.addEventListener('click', async () => { + const res = await browser.storage.sync.get(["shopHidden"]); + + if (!res) { + browser.storage.sync.set({ shopHidden: [ID] }, () => { + item.style.display = "none"; + }); + + return; + } + + const shopHidden = res.shopHidden || []; + + if (!shopHidden.includes(ID)) { + shopHidden.push(ID); + + await browser.storage.sync.set({ shopHidden }); + card.style.display = "none"; + console.log(`Item with ID '${ID}' hidden.`); + } + }); + + card.appendChild(btn); +}); + +(async () => { + const result = await browser.storage.sync.get(["shopHidden"]); + if (!result) { + browser.storage.sync.set({ shopHidden: [] }, () => { + console.log("No hidden items found. Creating new list."); + }); + + return; + } + + const shopHidden = result.shopHidden || []; + + cards.forEach((item, index) => { + const ID = getID(item, index); + + if (shopHidden.includes(ID)) { + item.style.display = "none"; + } + }); + console.log("Hide buttons set up for shop items."); + console.log("Shop items hidden based on stored preferences."); +})(); + +browser.runtime.onMessage.addListener((message) => { + console.log("Received message:", message); + if (message.action === 'unhide') { + const id = message.id.split(".")[0].trim(); + const item = Array.from(cards)[id]; + + if (!item) return; + + item.style.display = 'block'; + browser.storage.sync.get(["shopHidden"]).then(res => { + const updated = res.shopHidden.filter(i => i !== id); + browser.storage.sync.set({ shopHidden: updated }).then(() => { + console.log(`Item with ID '${id}' unhidden.`); + }); + }); + } +}); diff --git a/submissions/betterSummerHC/styles/popup.css b/submissions/betterSummerHC/styles/popup.css new file mode 100644 index 00000000..d32caed6 --- /dev/null +++ b/submissions/betterSummerHC/styles/popup.css @@ -0,0 +1,117 @@ +body { + font-family: Arial, sans-serif; + width: 300px; + padding: 10px; + + --main-c: #4a2d24; + --main-c-light: #d0b194; + --main-c-dark: #ca8862dc; + --main-c-text: #ffffff; + --main-c-text-light: #f0f0f0; + --main-c-text-dark: #000000; + + --background: #f1d9bb; + --background-text: #423838; + + background-color: var(--background); + color: var(--background-text); +} + +.tabs { + display: flex; + margin-bottom: 10px; +} + +.tabs>button { + flex: 1; + padding: 8px; + border: none; + background-color: var(--main-c-light); + cursor: pointer; + + transition: all .4s; + + &:first-of-type { + border-top-left-radius: 16px; + border-bottom-left-radius: 16px; + } + + &:last-of-type { + border-top-right-radius: 16px; + border-bottom-right-radius: 16px; + } + + &:hover { + background-color: var(--main-c-dark); + color: white; + } + + &.active { + background-color: var(--main-c); + color: white; + } +} + +div.title { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + + text-align: center; +} + +div.title>button { + padding: 4px 12px; + background-color: var(--main-c); + color: white; + border: none; + border-radius: 12px; + cursor: pointer; + + &:hover { + background-color: var(--main-c-dark); + transition: all .4s; + } +} + +.content { + display: none; + + &.active { + display: block; + } +} + +#shop>.hidden { + display: none; + &>div { + display: flex; + flex-direction: column; + gap: 4px; + + &>div { + display: flex; + align-items: center; + justify-content: space-between; + padding: 4px; + background-color: var(--main-c-light); + border-radius: 8px; + + & > button { + padding: 2px 8px; + background-color: var(--main-c); + color: var(--main-c-text); + border: none; + border-radius: 8px; + cursor: pointer; + font-size: .8rem; + + &:hover { + background-color: var(--main-c-dark); + transition: all .4s; + } + } + } + } +} \ No newline at end of file From 02fb7447c65865ae8382d600717e53c86799d080 Mon Sep 17 00:00:00 2001 From: 7ev3nDev Date: Fri, 20 Jun 2025 10:08:25 +0200 Subject: [PATCH 2/6] Now work when pressing on menu button! --- submissions/betterSummerHC/popup.html | 8 +- submissions/betterSummerHC/popup.js | 37 ++++- submissions/betterSummerHC/scripts/shop.js | 156 ++++++++++++--------- 3 files changed, 126 insertions(+), 75 deletions(-) diff --git a/submissions/betterSummerHC/popup.html b/submissions/betterSummerHC/popup.html index 54dc9c6e..d96d3f27 100644 --- a/submissions/betterSummerHC/popup.html +++ b/submissions/betterSummerHC/popup.html @@ -9,11 +9,11 @@
- - + +
-
+
-
+

New Features

Stay tuned for more updates!

diff --git a/submissions/betterSummerHC/popup.js b/submissions/betterSummerHC/popup.js index 80d00c71..a2f73bd9 100644 --- a/submissions/betterSummerHC/popup.js +++ b/submissions/betterSummerHC/popup.js @@ -1,4 +1,33 @@ -document.querySelectorAll('.tabs button').forEach(bt => { +const tabsBtns = document.querySelectorAll('.tabs button'); + +function toggleTab(tabName) { + tabsBtns.forEach(btn => btn.classList.remove('active')); + document.querySelectorAll('.content').forEach(tab => tab.classList.remove('active')); + + const bt = document.querySelector(`button[data-tab="${tabName}"]`); + if (!bt) { + console.error(`Button for tab '${tabName}' not found.`); + return; + } + bt.classList.add('active'); + document.querySelector(`#${bt.dataset.tab}`).classList.add('active'); +} + +tabsBtns.forEach(bt => { + if (bt.dataset.url != undefined) { + const url = `https://summer.hackclub.com${bt.dataset.url}`; + + browser.tabs.query({ active: true, currentWindow: true }).then(tabs => { + const currentTab = tabs[0]; + if (currentTab.url === url) { + console.log(`Current tab URL matches: ${url}`); + toggleTab(bt.dataset.tab); + } else { + console.log(`Current tab URL does not match: ${currentTab.url}`); + } + }).catch(err => console.error('Error querying tabs:', err)); + } + bt.addEventListener('click', () => { if (bt.dataset.url != undefined) { const url = `https://summer.hackclub.com${bt.dataset.url}`; @@ -13,11 +42,7 @@ document.querySelectorAll('.tabs button').forEach(bt => { } }).catch(err => console.error('Error querying tabs:', err)); } - - document.querySelectorAll('.tabs button').forEach(btn => btn.classList.remove('active')); - document.querySelectorAll('.content').forEach(tab => tab.classList.remove('active')); - bt.classList.add('active'); - document.querySelector(`#${bt.dataset.tab}`).classList.add('active'); + toggleTab(bt.dataset.tab); }); }); diff --git a/submissions/betterSummerHC/scripts/shop.js b/submissions/betterSummerHC/scripts/shop.js index 906393c7..a686c08b 100644 --- a/submissions/betterSummerHC/scripts/shop.js +++ b/submissions/betterSummerHC/scripts/shop.js @@ -1,64 +1,78 @@ -const cards = document.querySelectorAll('.card-with-gradient[data-padding="md"]'); - function getID(card, index) { return index + ". " + card.querySelector(".flex-grow h3.font-bold").textContent.trim(); } -cards.forEach((card, index) => { - const ID = getID(card, index); - const btn = document.createElement('button'); - btn.textContent = 'Hide'; - - btn.style.position = 'absolute'; - btn.style.top = '20px'; - btn.style.left = '15px'; - btn.style.backgroundColor = 'rgba(224, 73, 27, 0.8)'; - btn.style.border = '1px solid #ccc'; - btn.style.borderRadius = '24px'; - btn.style.boxShadow = '0 2px 4px rgba(0, 0, 0, 0.1)'; - btn.style.color = '#FFF'; - - - btn.style.zIndex = '1000'; - btn.style.padding = '4px 8px'; - btn.style.fontSize = '12px'; - btn.style.cursor = 'pointer'; - - card.style.position = card.style.position || 'relative'; - - btn.addEventListener('click', async () => { - const res = await browser.storage.sync.get(["shopHidden"]); - - if (!res) { - browser.storage.sync.set({ shopHidden: [ID] }, () => { - item.style.display = "none"; - }); - - return; - } - - const shopHidden = res.shopHidden || []; +const shopFn = async (loc = window.location) => { + if (!(loc.url || loc.href).includes("shop")) + return; - if (!shopHidden.includes(ID)) { - shopHidden.push(ID); + // made with AI because it's too hard. sorry :( + await ( + new Promise(resolve => { + console.log("Waiting for shop items to load..."); + const checkExist = setInterval(() => { + if (document.querySelector('.card-with-gradient[data-padding="md"]')) { + clearInterval(checkExist); + resolve(); + } + }, 100); + }) + ) + + const cards = document.querySelectorAll('.card-with-gradient[data-padding="md"]'); + + cards.forEach((card, index) => { + const ID = getID(card, index); + const btn = document.createElement('button'); + btn.textContent = 'Hide'; + + btn.style.position = 'absolute'; + btn.style.top = '20px'; + btn.style.left = '15px'; + btn.style.backgroundColor = 'rgba(224, 73, 27, 0.8)'; + btn.style.border = '1px solid #ccc'; + btn.style.borderRadius = '24px'; + btn.style.boxShadow = '0 2px 4px rgba(0, 0, 0, 0.1)'; + btn.style.color = '#FFF'; + + + btn.style.zIndex = '1000'; + btn.style.padding = '4px 8px'; + btn.style.fontSize = '12px'; + btn.style.cursor = 'pointer'; + + card.style.position = card.style.position || 'relative'; + + btn.addEventListener('click', async () => { + const res = await browser.storage.sync.get(["shopHidden"]); + + if (!res) { + browser.storage.sync.set({ shopHidden: [ID] }, () => { + item.style.display = "none"; + }); + + return; + } + + const shopHidden = res.shopHidden || []; + + if (!shopHidden.includes(ID)) { + shopHidden.push(ID); + + await browser.storage.sync.set({ shopHidden }); + card.style.display = "none"; + console.log(`Item with ID '${ID}' hidden.`); + } + }); - await browser.storage.sync.set({ shopHidden }); - card.style.display = "none"; - console.log(`Item with ID '${ID}' hidden.`); - } + card.appendChild(btn); }); - card.appendChild(btn); -}); - -(async () => { const result = await browser.storage.sync.get(["shopHidden"]); if (!result) { browser.storage.sync.set({ shopHidden: [] }, () => { console.log("No hidden items found. Creating new list."); }); - - return; } const shopHidden = result.shopHidden || []; @@ -72,22 +86,34 @@ cards.forEach((card, index) => { }); console.log("Hide buttons set up for shop items."); console.log("Shop items hidden based on stored preferences."); -})(); - -browser.runtime.onMessage.addListener((message) => { - console.log("Received message:", message); - if (message.action === 'unhide') { - const id = message.id.split(".")[0].trim(); - const item = Array.from(cards)[id]; - - if (!item) return; - - item.style.display = 'block'; - browser.storage.sync.get(["shopHidden"]).then(res => { - const updated = res.shopHidden.filter(i => i !== id); - browser.storage.sync.set({ shopHidden: updated }).then(() => { - console.log(`Item with ID '${id}' unhidden.`); + + browser.runtime.onMessage.addListener((message) => { + console.log("Received message:", message); + if (message.action === 'unhide') { + const id = message.id.split(".")[0].trim(); + const item = Array.from(cards)[id]; + + if (!item) return; + + item.style.display = 'block'; + browser.storage.sync.get(["shopHidden"]).then(res => { + const updated = res.shopHidden.filter(i => i !== id); + browser.storage.sync.set({ shopHidden: updated }).then(() => { + console.log(`Item with ID '${id}' unhidden.`); + }); }); - }); - } + } + }); +}; + +/** + * Me del futuro: questo controlla se l'url è cambiato e esegue il codice + * https://stackoverflow.com/a/52809105 + */ +window.navigation.addEventListener("navigate", (event) => { + console.log("Navigation event detected. Current URL:", event.destination.url); + shopFn(event.destination); }); +shopFn(); + + From 6e6defbcc719d0b29e8a89393f5dce997f40d3c6 Mon Sep 17 00:00:00 2001 From: 7ev3nDev Date: Fri, 20 Jun 2025 10:14:27 +0200 Subject: [PATCH 3/6] clean the code --- submissions/betterSummerHC/popup.js | 12 ++---------- submissions/betterSummerHC/scripts/shop.js | 16 ++++------------ 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/submissions/betterSummerHC/popup.js b/submissions/betterSummerHC/popup.js index a2f73bd9..887ea093 100644 --- a/submissions/betterSummerHC/popup.js +++ b/submissions/betterSummerHC/popup.js @@ -20,10 +20,7 @@ tabsBtns.forEach(bt => { browser.tabs.query({ active: true, currentWindow: true }).then(tabs => { const currentTab = tabs[0]; if (currentTab.url === url) { - console.log(`Current tab URL matches: ${url}`); toggleTab(bt.dataset.tab); - } else { - console.log(`Current tab URL does not match: ${currentTab.url}`); } }).catch(err => console.error('Error querying tabs:', err)); } @@ -31,13 +28,10 @@ tabsBtns.forEach(bt => { bt.addEventListener('click', () => { if (bt.dataset.url != undefined) { const url = `https://summer.hackclub.com${bt.dataset.url}`; - console.log(`Opening URL: ${url}`); browser.tabs.query({ active: true, currentWindow: true }).then(tabs => { const currentTab = tabs[0]; - if (currentTab.url === url) { - console.log('URL is already open in the current tab.'); - } else { + if (!currentTab.url === url) { browser.tabs.update(currentTab.id, { url: url }); } }).catch(err => console.error('Error querying tabs:', err)); @@ -50,13 +44,12 @@ tabsBtns.forEach(bt => { const result = await browser.storage.sync.get(["shopHidden"]); if (!result) { browser.storage.sync.set({ shopHidden: [] }, () => { - console.log("No hidden items found. Creating new list."); + console.warn("No hidden items found. Creating new list."); }); return; } const shopHidden = result.shopHidden || []; - console.log("Loaded hidden items:", shopHidden); const hideDiv = document.querySelector('.hidden > div'); hideDiv.innerHTML = ''; @@ -71,7 +64,6 @@ tabsBtns.forEach(bt => { const updated = res.shopHidden.filter(i => i !== item); browser.storage.sync.set({ shopHidden: updated }).then(() => { itemElement.remove(); - console.log(`Item '${item}' unhidden.`); }); browser.tabs.query({ active: true, currentWindow: true }).then(tabs => { diff --git a/submissions/betterSummerHC/scripts/shop.js b/submissions/betterSummerHC/scripts/shop.js index a686c08b..63fdc0a4 100644 --- a/submissions/betterSummerHC/scripts/shop.js +++ b/submissions/betterSummerHC/scripts/shop.js @@ -9,7 +9,6 @@ const shopFn = async (loc = window.location) => { // made with AI because it's too hard. sorry :( await ( new Promise(resolve => { - console.log("Waiting for shop items to load..."); const checkExist = setInterval(() => { if (document.querySelector('.card-with-gradient[data-padding="md"]')) { clearInterval(checkExist); @@ -61,7 +60,6 @@ const shopFn = async (loc = window.location) => { await browser.storage.sync.set({ shopHidden }); card.style.display = "none"; - console.log(`Item with ID '${ID}' hidden.`); } }); @@ -70,9 +68,7 @@ const shopFn = async (loc = window.location) => { const result = await browser.storage.sync.get(["shopHidden"]); if (!result) { - browser.storage.sync.set({ shopHidden: [] }, () => { - console.log("No hidden items found. Creating new list."); - }); + browser.storage.sync.set({ shopHidden: [] }, () => {}); } const shopHidden = result.shopHidden || []; @@ -84,11 +80,10 @@ const shopFn = async (loc = window.location) => { item.style.display = "none"; } }); - console.log("Hide buttons set up for shop items."); - console.log("Shop items hidden based on stored preferences."); + console.info("Hide buttons set up for shop items."); + console.info("Shop items hidden based on stored preferences."); browser.runtime.onMessage.addListener((message) => { - console.log("Received message:", message); if (message.action === 'unhide') { const id = message.id.split(".")[0].trim(); const item = Array.from(cards)[id]; @@ -98,9 +93,7 @@ const shopFn = async (loc = window.location) => { item.style.display = 'block'; browser.storage.sync.get(["shopHidden"]).then(res => { const updated = res.shopHidden.filter(i => i !== id); - browser.storage.sync.set({ shopHidden: updated }).then(() => { - console.log(`Item with ID '${id}' unhidden.`); - }); + browser.storage.sync.set({ shopHidden: updated }) }); } }); @@ -111,7 +104,6 @@ const shopFn = async (loc = window.location) => { * https://stackoverflow.com/a/52809105 */ window.navigation.addEventListener("navigate", (event) => { - console.log("Navigation event detected. Current URL:", event.destination.url); shopFn(event.destination); }); shopFn(); From 37ab1a97ea8c758b4867582a3d7675a4e722dbef Mon Sep 17 00:00:00 2001 From: 7ev3nDev Date: Fri, 20 Jun 2025 10:19:43 +0200 Subject: [PATCH 4/6] fix code not working on all page --- submissions/betterSummerHC/manifest.json | 10 +--------- submissions/betterSummerHC/styles/popup.css | 4 ++++ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/submissions/betterSummerHC/manifest.json b/submissions/betterSummerHC/manifest.json index f35a0029..beca8764 100644 --- a/submissions/betterSummerHC/manifest.json +++ b/submissions/betterSummerHC/manifest.json @@ -21,15 +21,7 @@ ], "js": [ "scripts/browser-polyfill.min.js", - "scripts/content.js" - ] - }, - { - "matches": [ - "https://summer.hackclub.com/shop" - ], - "js": [ - "scripts/browser-polyfill.min.js", + "scripts/content.js", "scripts/shop.js" ] } diff --git a/submissions/betterSummerHC/styles/popup.css b/submissions/betterSummerHC/styles/popup.css index d32caed6..8e0f762e 100644 --- a/submissions/betterSummerHC/styles/popup.css +++ b/submissions/betterSummerHC/styles/popup.css @@ -85,7 +85,11 @@ div.title>button { #shop>.hidden { display: none; + &>div { + overflow-y: auto; + max-height: 300px; + display: flex; flex-direction: column; gap: 4px; From 0bc992d1199414ac8436097dad339bc9c817910e Mon Sep 17 00:00:00 2001 From: 7ev3nDev Date: Fri, 20 Jun 2025 12:34:19 +0200 Subject: [PATCH 5/6] fix for firefox --- submissions/betterSummerHC/manifest.json | 9 ++++++++ .../betterSummerHC/scripts/firefoxfix.js | 22 +++++++++++++++++++ submissions/betterSummerHC/scripts/shop.js | 8 +++++-- 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 submissions/betterSummerHC/scripts/firefoxfix.js diff --git a/submissions/betterSummerHC/manifest.json b/submissions/betterSummerHC/manifest.json index beca8764..ab9af1f2 100644 --- a/submissions/betterSummerHC/manifest.json +++ b/submissions/betterSummerHC/manifest.json @@ -24,6 +24,15 @@ "scripts/content.js", "scripts/shop.js" ] + }, + { + "matches": [ + "https://summer.hackclub.com/*" + ], + "js": [ + "scripts/firefoxfix.js" + ], + "world": "MAIN" } ], "icons": { diff --git a/submissions/betterSummerHC/scripts/firefoxfix.js b/submissions/betterSummerHC/scripts/firefoxfix.js new file mode 100644 index 00000000..c62f59cd --- /dev/null +++ b/submissions/betterSummerHC/scripts/firefoxfix.js @@ -0,0 +1,22 @@ +(function() { + const origPush = history.pushState; + const origReplace = history.replaceState; + + function fireEvent() { + window.dispatchEvent(new CustomEvent("custom:navigation", { + detail: { url: location.href } + })); + } + + history.pushState = function(...args) { + origPush.apply(this, args); + fireEvent(); + }; + + history.replaceState = function(...args) { + origReplace.apply(this, args); + fireEvent(); + }; + + window.addEventListener("popstate", fireEvent); +})(); diff --git a/submissions/betterSummerHC/scripts/shop.js b/submissions/betterSummerHC/scripts/shop.js index 63fdc0a4..e03675f9 100644 --- a/submissions/betterSummerHC/scripts/shop.js +++ b/submissions/betterSummerHC/scripts/shop.js @@ -103,8 +103,12 @@ const shopFn = async (loc = window.location) => { * Me del futuro: questo controlla se l'url è cambiato e esegue il codice * https://stackoverflow.com/a/52809105 */ -window.navigation.addEventListener("navigate", (event) => { - shopFn(event.destination); +// window.navigation.addEventListener("navigate", (event) => { +// shopFn(event.destination); +// }); +// FIx for firefox from chatgpt +window.addEventListener("custom:navigation", (e) => { + shopFn(new URL(e.detail.url)); }); shopFn(); From aed728dfcd937bbb840593cf566a77aff620d628 Mon Sep 17 00:00:00 2001 From: 7ev3nDev Date: Fri, 20 Jun 2025 21:16:14 +0200 Subject: [PATCH 6/6] fix bug added hide info --- submissions/betterSummerHC/popup.html | 12 ++++ submissions/betterSummerHC/popup.js | 30 ++++++++- submissions/betterSummerHC/scripts/content.js | 29 +++++++++ submissions/betterSummerHC/scripts/shop.js | 35 ++++++----- submissions/betterSummerHC/styles/popup.css | 63 +++++++++++++++++++ 5 files changed, 152 insertions(+), 17 deletions(-) diff --git a/submissions/betterSummerHC/popup.html b/submissions/betterSummerHC/popup.html index d96d3f27..3ceb0cec 100644 --- a/submissions/betterSummerHC/popup.html +++ b/submissions/betterSummerHC/popup.html @@ -9,10 +9,22 @@
+
+
+

General Settings

+ +
+ +
+
+