From e0e01856fecb0adafb9283f9aa7dbf31bc4de351 Mon Sep 17 00:00:00 2001 From: GamerCreeperNoob Date: Sun, 5 Oct 2025 10:39:55 +0200 Subject: [PATCH 01/11] Create ShareSheet.js --- extensions/GamerCreeper12/ShareSheet.js | 251 ++++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 extensions/GamerCreeper12/ShareSheet.js diff --git a/extensions/GamerCreeper12/ShareSheet.js b/extensions/GamerCreeper12/ShareSheet.js new file mode 100644 index 0000000000..2a6260960b --- /dev/null +++ b/extensions/GamerCreeper12/ShareSheet.js @@ -0,0 +1,251 @@ +// Name: ShareSheet +// ID: gamercreepernoobssharesheetextension +// Description: It allows to share things. +// By: GamerCreeper12 +// License: MPL-2.0 + +(function(Scratch) { + 'use strict'; + + if (!Scratch.extensions.unsandboxed) { + throw new Error('Share Sheet must run unsandboxed'); + } + + class GamerCreeperNoobsShareSheetExtension { + constructor() { + this.dataType = "text"; + this.title = ""; + this.data = null; + this.shareData = {}; + this.cancelled = false; + this.hasError = false; + this.errorMsg = ""; + } + getInfo() { + return { + id: 'gamercreepernoobssharesheetextension', + name: 'ShareSheet', + color1: '#742DEB', + color3: '#a176e8', + blocks: [ + { + opcode: 'issupported', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is share sheet supported?' + }, + { + opcode: 'settitleandtextto', + blockType: Scratch.BlockType.COMMAND, + text: 'set title [TITLE]', + arguments: { + TITLE: { + type: Scratch.ArgumentType.STRING, + defaultValue: "Check out this file!" + } + } + }, + { + opcode: 'setdatatotxt', + blockType: Scratch.BlockType.COMMAND, + text: 'set data to text [TXT]', + arguments: { + TXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: "Hello, World!" + } + } + }, + { + opcode: 'setdatatourl', + blockType: Scratch.BlockType.COMMAND, + text: 'set data to url [URL]', + arguments: { + URL: { + type: Scratch.ArgumentType.STRING, + defaultValue: "https://example.com" + } + } + }, + { + opcode: 'setdatatoimageurl', + blockType: Scratch.BlockType.COMMAND, + text: 'set data to image url [URL]', + arguments: { + URL: { + type: Scratch.ArgumentType.STRING, + defaultValue: "https://example.com/myimage/" + } + } + }, + { + opcode: 'setdatatocostume', + blockType: Scratch.BlockType.COMMAND, + text: 'set data to costume [COSTUME]', + arguments: { + COSTUME: { + type: Scratch.ArgumentType.COSTUME + } + } + }, + { + opcode: 'share', + blockType: Scratch.BlockType.COMMAND, + text: 'data share' + }, + { + opcode: 'isdatatosharesupported', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is last data to share supported?' + }, + { + opcode: 'iscancelled', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is sharing cancelled?' + }, + { + opcode: 'gotaerrortwhilesharing', + blockType: Scratch.BlockType.BOOLEAN, + text: 'got a error while sharing?' + }, + { + opcode: 'lasterrormsg', + blockType: Scratch.BlockType.REPORTER, + text: 'last error message' + }] + }; + } + // helpers + isShareSheetSupported() { + return !!(navigator.share && navigator.canShare); + } + + isShareSheetDataSupported(shareData) { + if (!this.isShareSheetSupported()) return false; + return !!navigator.canShare(shareData); + } + + async shareDataFunc(shareData) { + if (!this.isShareSheetDataSupported(shareData)) return; + await navigator.share(shareData); + } + + async shareDataForShareSheet() { + if (!this.isShareSheetSupported()) return; + this.shareData = {}; + this.cancelled = false; + this.hasError = false; + try { + switch (this.dataType) { + case 'text': + if (this.title) this.shareData["title"] = this.title; + if (this.data) this.shareData["text"] = this.data; + await this.shareDataFunc(this.shareData); + break; + + case 'url': + if (this.title) this.shareData["title"] = this.title; + if (this.data) this.shareData["url"] = this.data; + await this.shareDataFunc(this.shareData); + break; + + case 'image': + if (this.title) this.shareData["title"] = this.title; + if (this.data) this.shareData["files"] = [this.data]; + await this.shareDataFunc(this.shareData); + break; + + default: + return; + } + } catch (err) { + if (err.name === 'AbortError') { + this.cancelled = true; + } else { + this.hasError = true; + this.errorMsg = err; + } + } + } + + // blocks + issupported() { + return this.isShareSheetSupported(); + } + + settitleandtextto({ TITLE: title }) { + this.title = title || "Share"; + } + + setdatatotxt({ TXT: text }) { + this.dataType = "text"; + this.data = text; + } + + setdatatourl({ URL: url }) { + this.dataType = "url"; + this.data = url; + } + + async setdatatoimageurl({ URL: url }) { + this.hasError = false; + try { + const response = await Scratch.fetch(url); + const blob = await response.blob(); + + const imageFile = new File([blob], 'image.png', { + type: blob.type + }); + + this.dataType = "image"; + this.data = imageFile; + } catch (err) { + this.hasError = true; + this.errorMsg = err.message; + } + } + + async setdatatocostume({ COSTUME: costumeName }, util) { + const target = util.target; + const costumeIndex = target.getCostumeIndexByName(costumeName); + const costume = target.sprite.costumes[costumeIndex]; + const asset = costume.asset.encodeDataURI(); + + this.hasError = false; + try { + const response = await Scratch.fetch(asset); + const blob = await response.blob(); + + const imageFile = new File([blob], 'image.png', { + type: blob.type + }); + + this.dataType = "image"; + this.data = imageFile; + } catch (err) { + this.hasError = true; + this.errorMsg = err.message; + } + } + + async share() { + await this.shareDataForShareSheet(); + } + + isdatatosharesupported() { + return this.isShareSheetDataSupported(this.shareData); + } + + iscancelled() { + return this.cancelled; + } + + gotaerrortwhilesharing() { + return this.hasError; + } + + lasterrormsg() { + return this.errorMsg; + } + } + Scratch.extensions.register(new GamerCreeperNoobsShareSheetExtension()); +})(Scratch); From 294e12f3de6b4c4fadabfe7eaf7555d44391ec1f Mon Sep 17 00:00:00 2001 From: GamerCreeperNoob Date: Sun, 5 Oct 2025 10:43:08 +0200 Subject: [PATCH 02/11] Add files via upload --- images/Untitled design.png | Bin 0 -> 9155 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/Untitled design.png diff --git a/images/Untitled design.png b/images/Untitled design.png new file mode 100644 index 0000000000000000000000000000000000000000..adc7291b687c48179ebfd9874211b969c84fb74b GIT binary patch literal 9155 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 literal 0 HcmV?d00001 From 21ff49a31eb9a4fd013f38ffa143d4cdf3d519c1 Mon Sep 17 00:00:00 2001 From: GamerCreeperNoob Date: Sun, 5 Oct 2025 10:45:30 +0200 Subject: [PATCH 03/11] Rename images/Untitled design.png to images/GamerCreeper12/ShareSheet.png --- .../ShareSheet.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename images/{Untitled design.png => GamerCreeper12/ShareSheet.png} (100%) diff --git a/images/Untitled design.png b/images/GamerCreeper12/ShareSheet.png similarity index 100% rename from images/Untitled design.png rename to images/GamerCreeper12/ShareSheet.png From 7d25bd4d9e13b10798bc7c0656142f8b2f0f9fd2 Mon Sep 17 00:00:00 2001 From: PPPDUD <107440101+PPPDUD@users.noreply.github.com> Date: Thu, 16 Oct 2025 12:30:48 -0400 Subject: [PATCH 04/11] Update sharesheet.js --- extensions/GamerCreeper12/ShareSheet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/GamerCreeper12/ShareSheet.js b/extensions/GamerCreeper12/ShareSheet.js index 2a6260960b..1257e414f1 100644 --- a/extensions/GamerCreeper12/ShareSheet.js +++ b/extensions/GamerCreeper12/ShareSheet.js @@ -1,6 +1,6 @@ // Name: ShareSheet // ID: gamercreepernoobssharesheetextension -// Description: It allows to share things. +// Description: Share data from your browser. // By: GamerCreeper12 // License: MPL-2.0 From c3822bf8077541b3b559e398ac087f1cb5a97ceb Mon Sep 17 00:00:00 2001 From: "DangoCat[bot]" Date: Thu, 16 Oct 2025 18:36:09 +0000 Subject: [PATCH 05/11] [Automated] Format code --- extensions/GamerCreeper12/ShareSheet.js | 247 ++++++++++++------------ 1 file changed, 124 insertions(+), 123 deletions(-) diff --git a/extensions/GamerCreeper12/ShareSheet.js b/extensions/GamerCreeper12/ShareSheet.js index 1257e414f1..a5fe21385c 100644 --- a/extensions/GamerCreeper12/ShareSheet.js +++ b/extensions/GamerCreeper12/ShareSheet.js @@ -4,13 +4,13 @@ // By: GamerCreeper12 // License: MPL-2.0 -(function(Scratch) { - 'use strict'; - +(function (Scratch) { + "use strict"; + if (!Scratch.extensions.unsandboxed) { - throw new Error('Share Sheet must run unsandboxed'); + throw new Error("Share Sheet must run unsandboxed"); } - + class GamerCreeperNoobsShareSheetExtension { constructor() { this.dataType = "text"; @@ -23,112 +23,113 @@ } getInfo() { return { - id: 'gamercreepernoobssharesheetextension', - name: 'ShareSheet', - color1: '#742DEB', - color3: '#a176e8', + id: "gamercreepernoobssharesheetextension", + name: "ShareSheet", + color1: "#742DEB", + color3: "#a176e8", blocks: [ - { - opcode: 'issupported', - blockType: Scratch.BlockType.BOOLEAN, - text: 'is share sheet supported?' - }, - { - opcode: 'settitleandtextto', - blockType: Scratch.BlockType.COMMAND, - text: 'set title [TITLE]', - arguments: { - TITLE: { - type: Scratch.ArgumentType.STRING, - defaultValue: "Check out this file!" - } - } - }, - { - opcode: 'setdatatotxt', - blockType: Scratch.BlockType.COMMAND, - text: 'set data to text [TXT]', - arguments: { - TXT: { - type: Scratch.ArgumentType.STRING, - defaultValue: "Hello, World!" - } - } - }, - { - opcode: 'setdatatourl', - blockType: Scratch.BlockType.COMMAND, - text: 'set data to url [URL]', - arguments: { - URL: { - type: Scratch.ArgumentType.STRING, - defaultValue: "https://example.com" - } - } - }, - { - opcode: 'setdatatoimageurl', - blockType: Scratch.BlockType.COMMAND, - text: 'set data to image url [URL]', - arguments: { - URL: { - type: Scratch.ArgumentType.STRING, - defaultValue: "https://example.com/myimage/" - } - } - }, - { - opcode: 'setdatatocostume', - blockType: Scratch.BlockType.COMMAND, - text: 'set data to costume [COSTUME]', - arguments: { - COSTUME: { - type: Scratch.ArgumentType.COSTUME - } - } - }, - { - opcode: 'share', - blockType: Scratch.BlockType.COMMAND, - text: 'data share' - }, - { - opcode: 'isdatatosharesupported', - blockType: Scratch.BlockType.BOOLEAN, - text: 'is last data to share supported?' - }, - { - opcode: 'iscancelled', - blockType: Scratch.BlockType.BOOLEAN, - text: 'is sharing cancelled?' - }, - { - opcode: 'gotaerrortwhilesharing', - blockType: Scratch.BlockType.BOOLEAN, - text: 'got a error while sharing?' - }, - { - opcode: 'lasterrormsg', - blockType: Scratch.BlockType.REPORTER, - text: 'last error message' - }] + { + opcode: "issupported", + blockType: Scratch.BlockType.BOOLEAN, + text: "is share sheet supported?", + }, + { + opcode: "settitleandtextto", + blockType: Scratch.BlockType.COMMAND, + text: "set title [TITLE]", + arguments: { + TITLE: { + type: Scratch.ArgumentType.STRING, + defaultValue: "Check out this file!", + }, + }, + }, + { + opcode: "setdatatotxt", + blockType: Scratch.BlockType.COMMAND, + text: "set data to text [TXT]", + arguments: { + TXT: { + type: Scratch.ArgumentType.STRING, + defaultValue: "Hello, World!", + }, + }, + }, + { + opcode: "setdatatourl", + blockType: Scratch.BlockType.COMMAND, + text: "set data to url [URL]", + arguments: { + URL: { + type: Scratch.ArgumentType.STRING, + defaultValue: "https://example.com", + }, + }, + }, + { + opcode: "setdatatoimageurl", + blockType: Scratch.BlockType.COMMAND, + text: "set data to image url [URL]", + arguments: { + URL: { + type: Scratch.ArgumentType.STRING, + defaultValue: "https://example.com/myimage/", + }, + }, + }, + { + opcode: "setdatatocostume", + blockType: Scratch.BlockType.COMMAND, + text: "set data to costume [COSTUME]", + arguments: { + COSTUME: { + type: Scratch.ArgumentType.COSTUME, + }, + }, + }, + { + opcode: "share", + blockType: Scratch.BlockType.COMMAND, + text: "data share", + }, + { + opcode: "isdatatosharesupported", + blockType: Scratch.BlockType.BOOLEAN, + text: "is last data to share supported?", + }, + { + opcode: "iscancelled", + blockType: Scratch.BlockType.BOOLEAN, + text: "is sharing cancelled?", + }, + { + opcode: "gotaerrortwhilesharing", + blockType: Scratch.BlockType.BOOLEAN, + text: "got a error while sharing?", + }, + { + opcode: "lasterrormsg", + blockType: Scratch.BlockType.REPORTER, + text: "last error message", + }, + ], }; } // helpers isShareSheetSupported() { return !!(navigator.share && navigator.canShare); } - + isShareSheetDataSupported(shareData) { if (!this.isShareSheetSupported()) return false; return !!navigator.canShare(shareData); } - + async shareDataFunc(shareData) { if (!this.isShareSheetDataSupported(shareData)) return; await navigator.share(shareData); } - + async shareDataForShareSheet() { if (!this.isShareSheetSupported()) return; this.shareData = {}; @@ -136,29 +137,29 @@ this.hasError = false; try { switch (this.dataType) { - case 'text': + case "text": if (this.title) this.shareData["title"] = this.title; if (this.data) this.shareData["text"] = this.data; await this.shareDataFunc(this.shareData); break; - - case 'url': + + case "url": if (this.title) this.shareData["title"] = this.title; if (this.data) this.shareData["url"] = this.data; await this.shareDataFunc(this.shareData); break; - - case 'image': + + case "image": if (this.title) this.shareData["title"] = this.title; if (this.data) this.shareData["files"] = [this.data]; await this.shareDataFunc(this.shareData); break; - + default: return; } } catch (err) { - if (err.name === 'AbortError') { + if (err.name === "AbortError") { this.cancelled = true; } else { this.hasError = true; @@ -166,36 +167,36 @@ } } } - + // blocks issupported() { return this.isShareSheetSupported(); } - + settitleandtextto({ TITLE: title }) { this.title = title || "Share"; } - + setdatatotxt({ TXT: text }) { this.dataType = "text"; this.data = text; } - + setdatatourl({ URL: url }) { this.dataType = "url"; this.data = url; } - + async setdatatoimageurl({ URL: url }) { this.hasError = false; try { const response = await Scratch.fetch(url); const blob = await response.blob(); - - const imageFile = new File([blob], 'image.png', { - type: blob.type + + const imageFile = new File([blob], "image.png", { + type: blob.type, }); - + this.dataType = "image"; this.data = imageFile; } catch (err) { @@ -203,22 +204,22 @@ this.errorMsg = err.message; } } - + async setdatatocostume({ COSTUME: costumeName }, util) { const target = util.target; const costumeIndex = target.getCostumeIndexByName(costumeName); const costume = target.sprite.costumes[costumeIndex]; const asset = costume.asset.encodeDataURI(); - + this.hasError = false; try { const response = await Scratch.fetch(asset); const blob = await response.blob(); - - const imageFile = new File([blob], 'image.png', { - type: blob.type + + const imageFile = new File([blob], "image.png", { + type: blob.type, }); - + this.dataType = "image"; this.data = imageFile; } catch (err) { @@ -226,23 +227,23 @@ this.errorMsg = err.message; } } - + async share() { await this.shareDataForShareSheet(); } - + isdatatosharesupported() { return this.isShareSheetDataSupported(this.shareData); } - + iscancelled() { return this.cancelled; } - + gotaerrortwhilesharing() { return this.hasError; } - + lasterrormsg() { return this.errorMsg; } From 40806a3ccc64190d7cab2417af28294ded74a5cf Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:44:25 -0400 Subject: [PATCH 06/11] Fix lint, add translate and some casting I didn't bother to add casting past the "setdatatourl" block --- extensions/GamerCreeper12/ShareSheet.js | 42 +++++++++++++------------ 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/extensions/GamerCreeper12/ShareSheet.js b/extensions/GamerCreeper12/ShareSheet.js index a5fe21385c..4f75e2f255 100644 --- a/extensions/GamerCreeper12/ShareSheet.js +++ b/extensions/GamerCreeper12/ShareSheet.js @@ -11,6 +11,8 @@ throw new Error("Share Sheet must run unsandboxed"); } + const Cast = Scratch.Cast; + class GamerCreeperNoobsShareSheetExtension { constructor() { this.dataType = "text"; @@ -24,63 +26,63 @@ getInfo() { return { id: "gamercreepernoobssharesheetextension", - name: "ShareSheet", + name: Scratch.translate("ShareSheet"), color1: "#742DEB", color3: "#a176e8", blocks: [ { opcode: "issupported", blockType: Scratch.BlockType.BOOLEAN, - text: "is share sheet supported?", + text: Scratch.translate("is share sheet supported?"), }, { opcode: "settitleandtextto", blockType: Scratch.BlockType.COMMAND, - text: "set title [TITLE]", + text: Scratch.translate("set title [TITLE]"), arguments: { TITLE: { type: Scratch.ArgumentType.STRING, - defaultValue: "Check out this file!", + defaultValue: Scratch.translate("Check out this file!"), }, }, }, { opcode: "setdatatotxt", blockType: Scratch.BlockType.COMMAND, - text: "set data to text [TXT]", + text: Scratch.translate("set data to text [TXT]"), arguments: { TXT: { type: Scratch.ArgumentType.STRING, - defaultValue: "Hello, World!", + defaultValue: Scratch.translate("Hello, World!"), }, }, }, { opcode: "setdatatourl", blockType: Scratch.BlockType.COMMAND, - text: "set data to url [URL]", + text: Scratch.translate("set data to url [URL]"), arguments: { URL: { type: Scratch.ArgumentType.STRING, - defaultValue: "https://example.com", + defaultValue: Scratch.translate("https://example.com"), }, }, }, { opcode: "setdatatoimageurl", blockType: Scratch.BlockType.COMMAND, - text: "set data to image url [URL]", + text: Scratch.translate("set data to image url [URL]"), arguments: { URL: { type: Scratch.ArgumentType.STRING, - defaultValue: "https://example.com/myimage/", + defaultValue: Scratch.translate("https://example.com/myimage/"), }, }, }, { opcode: "setdatatocostume", blockType: Scratch.BlockType.COMMAND, - text: "set data to costume [COSTUME]", + text: Scratch.translate("set data to costume [COSTUME]"), arguments: { COSTUME: { type: Scratch.ArgumentType.COSTUME, @@ -90,27 +92,27 @@ { opcode: "share", blockType: Scratch.BlockType.COMMAND, - text: "data share", + text: Scratch.translate("share data"), }, { opcode: "isdatatosharesupported", blockType: Scratch.BlockType.BOOLEAN, - text: "is last data to share supported?", + text: Scratch.translate("is last data to share supported?"), }, { opcode: "iscancelled", blockType: Scratch.BlockType.BOOLEAN, - text: "is sharing cancelled?", + text: Scratch.translate("is sharing cancelled?"), }, { opcode: "gotaerrortwhilesharing", blockType: Scratch.BlockType.BOOLEAN, - text: "got a error while sharing?", + text: Scratch.translate("got a error while sharing?"), }, { opcode: "lasterrormsg", blockType: Scratch.BlockType.REPORTER, - text: "last error message", + text: Scratch.translate("last error message"), }, ], }; @@ -170,21 +172,21 @@ // blocks issupported() { - return this.isShareSheetSupported(); + return Cast.toBool(this.isShareSheetSupported(); } settitleandtextto({ TITLE: title }) { - this.title = title || "Share"; + this.title = Cast.toString(title) || "Share"; } setdatatotxt({ TXT: text }) { this.dataType = "text"; - this.data = text; + this.data = Cast.toString(text); } setdatatourl({ URL: url }) { this.dataType = "url"; - this.data = url; + this.data = Cast.toString(url); } async setdatatoimageurl({ URL: url }) { From 5678928b32f91228fa5a4f6ffdc9dd3b55ebf9d1 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:45:43 -0400 Subject: [PATCH 07/11] Oops --- extensions/GamerCreeper12/ShareSheet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/GamerCreeper12/ShareSheet.js b/extensions/GamerCreeper12/ShareSheet.js index 4f75e2f255..15bda6caf1 100644 --- a/extensions/GamerCreeper12/ShareSheet.js +++ b/extensions/GamerCreeper12/ShareSheet.js @@ -172,7 +172,7 @@ // blocks issupported() { - return Cast.toBool(this.isShareSheetSupported(); + return Cast.toBool(this.isShareSheetSupported()); } settitleandtextto({ TITLE: title }) { From 80cf8fb431804c8c1dd34ab86fa7eda42616214a Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Thu, 16 Oct 2025 15:32:49 -0400 Subject: [PATCH 08/11] Add GamerCreeper12/ShareSheet extension to extensions.json --- extensions/extensions.json | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/extensions.json b/extensions/extensions.json index 1c3bc949d8..1fe2e006c5 100644 --- a/extensions/extensions.json +++ b/extensions/extensions.json @@ -39,6 +39,7 @@ "XmerOriginals/closecontrol", "navigator", "battery", + "GamerCreeper12/ShareSheet", "PwLDev/vibration", "TheShovel/CustomStyles", "TheShovel/ColorPicker", From 81037d12a477ad593ef7c6d9c6a66abf7031d0b1 Mon Sep 17 00:00:00 2001 From: PPPDUD <107440101+PPPDUD@users.noreply.github.com> Date: Thu, 16 Oct 2025 16:27:50 -0400 Subject: [PATCH 09/11] Update ShareSheet.js to fix bug Cast.toBool doesn't exist; toBoolean does. --- extensions/GamerCreeper12/ShareSheet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/GamerCreeper12/ShareSheet.js b/extensions/GamerCreeper12/ShareSheet.js index 15bda6caf1..2194f338c7 100644 --- a/extensions/GamerCreeper12/ShareSheet.js +++ b/extensions/GamerCreeper12/ShareSheet.js @@ -172,7 +172,7 @@ // blocks issupported() { - return Cast.toBool(this.isShareSheetSupported()); + return Cast.toBoolean(this.isShareSheetSupported()); } settitleandtextto({ TITLE: title }) { From fd758517363879cea9ef1054ea8aea536aa8ec8f Mon Sep 17 00:00:00 2001 From: GamerCreeperNoob Date: Fri, 17 Oct 2025 07:45:51 +0200 Subject: [PATCH 10/11] Delete images/GamerCreeper12/ShareSheet.png --- images/GamerCreeper12/ShareSheet.png | Bin 9155 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 images/GamerCreeper12/ShareSheet.png diff --git a/images/GamerCreeper12/ShareSheet.png b/images/GamerCreeper12/ShareSheet.png deleted file mode 100644 index adc7291b687c48179ebfd9874211b969c84fb74b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9155 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 From 3ac2dfcf59098036059b566b92a0100a5343e5a6 Mon Sep 17 00:00:00 2001 From: GamerCreeperNoob Date: Fri, 17 Oct 2025 07:49:05 +0200 Subject: [PATCH 11/11] Added ShareSheet.svg for better thumbnail and format --- images/GamerCreeper12/ShareSheet.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 images/GamerCreeper12/ShareSheet.svg diff --git a/images/GamerCreeper12/ShareSheet.svg b/images/GamerCreeper12/ShareSheet.svg new file mode 100644 index 0000000000..9e823361b3 --- /dev/null +++ b/images/GamerCreeper12/ShareSheet.svg @@ -0,0 +1 @@ +