From aa0038313f1a3d9c788d1602db05285e63846b46 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 5 Nov 2023 19:51:57 -0500 Subject: [PATCH 001/253] Consolidate Project Tags Removes duplicate project tags from the instruction and credit box. --- .../consolidate-project-tags/consolidate.js | 29 +++++++++++++++++++ features/consolidate-project-tags/data.json | 12 ++++++++ 2 files changed, 41 insertions(+) create mode 100644 features/consolidate-project-tags/consolidate.js create mode 100644 features/consolidate-project-tags/data.json diff --git a/features/consolidate-project-tags/consolidate.js b/features/consolidate-project-tags/consolidate.js new file mode 100644 index 00000000..a24ff138 --- /dev/null +++ b/features/consolidate-project-tags/consolidate.js @@ -0,0 +1,29 @@ +const updateProjectDescription = () => { + const projectDescriptions = document.querySelectorAll('.project-description'); + let found = false; + + projectDescriptions.forEach((projectDescription) => { + const descriptionText = projectDescription.innerHTML; + + if (descriptionText.trim() !== '') { + const tagRegex = /]*>[^<]*<\/a>/g; + const tags = descriptionText.match(tagRegex); + + if (tags) { + const uniqueTags = new Set(); + const updatedDescription = descriptionText.replace(tagRegex, (match) => { + if (!uniqueTags.has(match)) { + uniqueTags.add(match); + return match; + } else { + return ''; + } + }); + projectDescription.innerHTML = updatedDescription; + } + + found = true; + } + }); +}; +window.addEventListener('load', updateProjectDescription); diff --git a/features/consolidate-project-tags/data.json b/features/consolidate-project-tags/data.json new file mode 100644 index 00000000..d0ffb92c --- /dev/null +++ b/features/consolidate-project-tags/data.json @@ -0,0 +1,12 @@ +{ + "title": "Consolidate Project Tags", + "description": "Removes duplicate project tags from the instruction and credit box.", + "credits": [ + { "username": "palindromos", "url": "https://scratch.mit.edu/users/palindromos/" }, + { "username": "MaterArc", "url": "https://scratch.mit.edu/users/MaterArc/" } + ], + "type": ["Website"], + "tags": ["New", "Featured"], + "dynamic": true, + "styles": [{ "file": "consolidate.js", "runOn": "/projects/*"}] + } \ No newline at end of file From c3399c51eb9675501fb4a5d9f1843bec95cfd9c3 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 5 Nov 2023 19:52:53 -0500 Subject: [PATCH 002/253] Update features.json --- features/features.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/features/features.json b/features/features.json index 6318fc9e..c2c67e4b 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "consolidate-project-tags", + "versionAdded": "v3.5.0" + }, { "version": 2, "id": "dark-paint-editor", From 19e423c54793d65fe0219ca57d2f1ac1e699ad64 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 14 Jan 2024 10:41:48 -0500 Subject: [PATCH 003/253] Update consolidate.js --- .../consolidate-project-tags/consolidate.js | 47 ++++++++++--------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/features/consolidate-project-tags/consolidate.js b/features/consolidate-project-tags/consolidate.js index a24ff138..09c592e4 100644 --- a/features/consolidate-project-tags/consolidate.js +++ b/features/consolidate-project-tags/consolidate.js @@ -1,29 +1,30 @@ -const updateProjectDescription = () => { - const projectDescriptions = document.querySelectorAll('.project-description'); - let found = false; - projectDescriptions.forEach((projectDescription) => { - const descriptionText = projectDescription.innerHTML; +const TargetSearchProjectsLinksFeature = { + targetAndRemoveDuplicates: async () => { + const projectDescriptions = await ScratchTools.waitForElements('.project-description', function (element) { + TargetSearchProjectsLinksFeature.handleProjectDescription(element); + }); + }, - if (descriptionText.trim() !== '') { - const tagRegex = /]*>[^<]*<\/a>/g; - const tags = descriptionText.match(tagRegex); + handleProjectDescription: (projectDescription) => { + const links = Array.from(projectDescription.querySelectorAll('a[href*="/search/projects?q="]')); - if (tags) { - const uniqueTags = new Set(); - const updatedDescription = descriptionText.replace(tagRegex, (match) => { - if (!uniqueTags.has(match)) { - uniqueTags.add(match); - return match; - } else { - return ''; - } - }); - projectDescription.innerHTML = updatedDescription; - } + if (links.length > 1) { + const uniqueLinks = new Set(); - found = true; + links.forEach(link => { + const linkHref = link.getAttribute('href'); + + if (!uniqueLinks.has(linkHref)) { + uniqueLinks.add(linkHref); + } else { + + link.style.display = 'none'; + } + }); } - }); + } }; -window.addEventListener('load', updateProjectDescription); + +TargetSearchProjectsLinksFeature.targetAndRemoveDuplicates(); + From 58dc6cff5604511a61bcc3d87d51b7727d76765e Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 14 Jan 2024 10:42:42 -0500 Subject: [PATCH 004/253] Update consolidate.js --- .../consolidate-project-tags/consolidate.js | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/features/consolidate-project-tags/consolidate.js b/features/consolidate-project-tags/consolidate.js index 09c592e4..a24ff138 100644 --- a/features/consolidate-project-tags/consolidate.js +++ b/features/consolidate-project-tags/consolidate.js @@ -1,30 +1,29 @@ +const updateProjectDescription = () => { + const projectDescriptions = document.querySelectorAll('.project-description'); + let found = false; -const TargetSearchProjectsLinksFeature = { - targetAndRemoveDuplicates: async () => { - const projectDescriptions = await ScratchTools.waitForElements('.project-description', function (element) { - TargetSearchProjectsLinksFeature.handleProjectDescription(element); - }); - }, + projectDescriptions.forEach((projectDescription) => { + const descriptionText = projectDescription.innerHTML; - handleProjectDescription: (projectDescription) => { - const links = Array.from(projectDescription.querySelectorAll('a[href*="/search/projects?q="]')); + if (descriptionText.trim() !== '') { + const tagRegex = /]*>[^<]*<\/a>/g; + const tags = descriptionText.match(tagRegex); - if (links.length > 1) { - const uniqueLinks = new Set(); + if (tags) { + const uniqueTags = new Set(); + const updatedDescription = descriptionText.replace(tagRegex, (match) => { + if (!uniqueTags.has(match)) { + uniqueTags.add(match); + return match; + } else { + return ''; + } + }); + projectDescription.innerHTML = updatedDescription; + } - links.forEach(link => { - const linkHref = link.getAttribute('href'); - - if (!uniqueLinks.has(linkHref)) { - uniqueLinks.add(linkHref); - } else { - - link.style.display = 'none'; - } - }); + found = true; } - } + }); }; - -TargetSearchProjectsLinksFeature.targetAndRemoveDuplicates(); - +window.addEventListener('load', updateProjectDescription); From 742a4c91b06d0f9bd08d6241fc9013f77f9fdae9 Mon Sep 17 00:00:00 2001 From: Niko <150537842+OneShot-Niko@users.noreply.github.com> Date: Sun, 9 Jun 2024 10:29:54 +0000 Subject: [PATCH 005/253] fix up git install + pull master doesnt even exist in the repo i have no idea why i wrote master instead of main --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index daf379c9..f745820d 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ There are multiple ways of installing. > [!WARNING] > Extensions loaded this way onto Safari indeed temporary. Once you close the window, it will be gone. In addition, ScratchTools is still outdated on Firefox at the time of writing this. -- Installing with Git: Open the code dropdown on the extension's repository, copy the HTTPS url and then execute `git clone https://github.com/STForScratch/ScratchTools.git -b main` in Git, and you have installed ScratchTools! To pull changes instead of cloning the repository, enter the folder and execute `git remote add upstream https://github.com/STForScratch/ScratchTools.git -b main`. When a commit is made to the repository, you can just run `git pull upstream master` to pull the changes, note that sometimes you may need to refresh ScratchTools. +- Installing with Git: Open the code dropdown on the extension's repository, copy the HTTPS url and then execute `git clone https://github.com/STForScratch/ScratchTools.git -b main` in Git, and you have installed ScratchTools! To pull changes instead of cloning the repository, enter the folder and execute `git remote add upstream https://github.com/STForScratch/ScratchTools.git`. When a commit is made to the repository, you can just run `git pull upstream main` to pull the changes, note that sometimes you may need to refresh ScratchTools. ### Building a Feature It's not very hard to build a feature, and if you're ever having trouble, our developers are always here to help you! For ideas, code help, beta testing for your features, and more, you can [join our Discord server](https://discord.gg/5AkUsCbEsy). Now, here's how to build a feature! From 5176ae861403b1519907c1702fb1c1f27dd0640c Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:22:25 -0700 Subject: [PATCH 006/253] Snap to grid --- features/features.json | 5 +++++ features/snap-to-grid/data.json | 22 ++++++++++++++++++++++ features/snap-to-grid/script.js | 12 ++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 features/snap-to-grid/data.json create mode 100644 features/snap-to-grid/script.js diff --git a/features/features.json b/features/features.json index cb1a0966..3d9e01bb 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "snap-to-grid", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "select-self", diff --git a/features/snap-to-grid/data.json b/features/snap-to-grid/data.json new file mode 100644 index 00000000..d31111bd --- /dev/null +++ b/features/snap-to-grid/data.json @@ -0,0 +1,22 @@ +{ + "title": "Snap Scripts to Grid", + "description": "Automatically aligns scripts to the dotted grid in the editor when placed.", + "credits": [ + { + "username": "rgantzos", + "url": "https://scratch.mit.edu/users/rgantzos/" + } + ], + "type": [ + "Editor" + ], + "tags": [ + "New" + ], + "scripts": [ + { + "file": "script.js", + "runOn": "/projects/*" + } + ] +} \ No newline at end of file diff --git a/features/snap-to-grid/script.js b/features/snap-to-grid/script.js new file mode 100644 index 00000000..21816eec --- /dev/null +++ b/features/snap-to-grid/script.js @@ -0,0 +1,12 @@ +export default async function ({ feature, console }) { + await ScratchTools.waitForElement("div.gui") + update() + + feature.traps.vm.on("workspaceUpdate", function() { + update() + }) + + function update() { + Blockly.getMainWorkspace().grid_.snapToGrid_ = feature.self.enabled + } +} \ No newline at end of file From 0018fe2a68091e5867e97f4483ded0cbb6991aa2 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:40:39 -0700 Subject: [PATCH 007/253] Make necessary v3.9.0 changes --- features/features.json | 4 ++-- manifest.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/features/features.json b/features/features.json index 3d9e01bb..4f74e81d 100644 --- a/features/features.json +++ b/features/features.json @@ -2,12 +2,12 @@ { "version": 2, "id": "snap-to-grid", - "versionAdded": "v4.0.0" + "versionAdded": "v3.9.0" }, { "version": 2, "id": "select-self", - "versionAdded": "v4.0.0" + "versionAdded": "v3.9.0" }, { "version": 2, diff --git a/manifest.json b/manifest.json index cbb2c507..12564ac6 100644 --- a/manifest.json +++ b/manifest.json @@ -2,8 +2,8 @@ "name": "__MSG_extName__", "short_name": "ScratchTools", "manifest_version": 3, - "version": "4.0.0", - "version_name": "4.0.0-beta", + "version": "3.9.0", + "version_name": "3.9.0-beta", "default_locale": "en", "description": "__MSG_extDescription__", "author": "rgantzos", From d89f614def1d1cc5e707bdc63b9c41f61ab1eee0 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:24:46 -0700 Subject: [PATCH 008/253] Combine with `hide-project-tags` --- .../consolidate-project-tags/consolidate.js | 29 ----------- features/consolidate-project-tags/data.json | 12 ----- features/features.json | 14 +----- features/hide-project-tags.js | 15 ------ features/hide-project-tags/data.json | 29 +++++++++++ features/hide-project-tags/script.js | 50 +++++++++++++++++++ 6 files changed, 81 insertions(+), 68 deletions(-) delete mode 100644 features/consolidate-project-tags/consolidate.js delete mode 100644 features/consolidate-project-tags/data.json delete mode 100644 features/hide-project-tags.js create mode 100644 features/hide-project-tags/data.json create mode 100644 features/hide-project-tags/script.js diff --git a/features/consolidate-project-tags/consolidate.js b/features/consolidate-project-tags/consolidate.js deleted file mode 100644 index a24ff138..00000000 --- a/features/consolidate-project-tags/consolidate.js +++ /dev/null @@ -1,29 +0,0 @@ -const updateProjectDescription = () => { - const projectDescriptions = document.querySelectorAll('.project-description'); - let found = false; - - projectDescriptions.forEach((projectDescription) => { - const descriptionText = projectDescription.innerHTML; - - if (descriptionText.trim() !== '') { - const tagRegex = /]*>[^<]*<\/a>/g; - const tags = descriptionText.match(tagRegex); - - if (tags) { - const uniqueTags = new Set(); - const updatedDescription = descriptionText.replace(tagRegex, (match) => { - if (!uniqueTags.has(match)) { - uniqueTags.add(match); - return match; - } else { - return ''; - } - }); - projectDescription.innerHTML = updatedDescription; - } - - found = true; - } - }); -}; -window.addEventListener('load', updateProjectDescription); diff --git a/features/consolidate-project-tags/data.json b/features/consolidate-project-tags/data.json deleted file mode 100644 index d0ffb92c..00000000 --- a/features/consolidate-project-tags/data.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "title": "Consolidate Project Tags", - "description": "Removes duplicate project tags from the instruction and credit box.", - "credits": [ - { "username": "palindromos", "url": "https://scratch.mit.edu/users/palindromos/" }, - { "username": "MaterArc", "url": "https://scratch.mit.edu/users/MaterArc/" } - ], - "type": ["Website"], - "tags": ["New", "Featured"], - "dynamic": true, - "styles": [{ "file": "consolidate.js", "runOn": "/projects/*"}] - } \ No newline at end of file diff --git a/features/features.json b/features/features.json index c2c67e4b..861658bd 100644 --- a/features/features.json +++ b/features/features.json @@ -1,8 +1,8 @@ [ { "version": 2, - "id": "consolidate-project-tags", - "versionAdded": "v3.5.0" + "id": "hide-project-tags", + "versionAdded": "v3.9.0" }, { "version": 2, @@ -427,16 +427,6 @@ "tags": ["New", "Recommended"], "dynamic": true }, - { - "title": "Hide Project Tags", - "description": "Hides all linked tags in the Instructions/Notes and Credits of projects.", - "credits": ["rgantzos"], - "urls": ["https://scratch.mit.edu/users/rgantzos/"], - "file": "hide-project-tags", - "type": ["Website"], - "tags": ["New"], - "dynamic": true - }, { "title": "Search Assets", "description": "Search through costume and sound assets in the editor.", diff --git a/features/hide-project-tags.js b/features/hide-project-tags.js deleted file mode 100644 index d4bbcc3a..00000000 --- a/features/hide-project-tags.js +++ /dev/null @@ -1,15 +0,0 @@ -var style = document.createElement("style"); -style.textContent = ` -.project-description a[href*="/search/projects?q="] { - display: none !important; -} - -.project-description a.scratchtoolsTag[href*="/search/projects?q="] { - display: inline !important; -} -`; -document.body.appendChild(style); - -ScratchTools.setDisable("hide-project-tags", function () { - style.remove(); -}); diff --git a/features/hide-project-tags/data.json b/features/hide-project-tags/data.json new file mode 100644 index 00000000..30c343cb --- /dev/null +++ b/features/hide-project-tags/data.json @@ -0,0 +1,29 @@ +{ + "title": "Hide Project Tags", + "description": "Hides all linked tags in the Instructions/Notes and Credits of projects.", + "credits": [ + { + "username": "MaterArc", + "url": "https://scratch.mit.edu/users/MaterArc/" + }, + { + "username": "rgantzos", + "url": "https://scratch.mit.edu/users/rgantzos/" + } + ], + "type": [ + "Website" + ], + "tags": [ + "New", + "Featured" + ], + "scripts": [ + { + "file": "script.js", + "runOn": "/projects/*" + } + ], + "dynamic": true, + "options": [{ "id": "remove-dupes", "name": "Hide Duplicate Tags", "type": 1 }] +} \ No newline at end of file diff --git a/features/hide-project-tags/script.js b/features/hide-project-tags/script.js new file mode 100644 index 00000000..ebd6ad43 --- /dev/null +++ b/features/hide-project-tags/script.js @@ -0,0 +1,50 @@ +export default async function ({ feature, console }) { + let ALL_TAGS = [] + + ScratchTools.waitForElements('.project-description a[href*="/search/projects?q="]:not(.scratchtoolsTag)', function (tag) { + if (tag.textContent?.startsWith("#")) { + ALL_TAGS.push({ + tag, + content: tag.textContent.toLowerCase(), + }) + + update() + } + }) + + function update() { + if (feature.self.enabled) { + let dupesOnly = feature.settings.get("remove-dupes") + + if (dupesOnly) { + for (var i in ALL_TAGS) { + if (ALL_TAGS.filter((tag) => tag.content === ALL_TAGS[i].content)[0].tag === ALL_TAGS[i].tag) { + if (ALL_TAGS[i].tag?.style) { + ALL_TAGS[i].tag.style.display = null + } + } else { + if (ALL_TAGS[i].tag?.style) { + ALL_TAGS[i].tag.style.display = "none" + } + } + } + } else { + for (var i in ALL_TAGS) { + if (ALL_TAGS[i].tag?.style) { + ALL_TAGS[i].tag.style.display = "none" + } + } + } + } else { + for (var i in ALL_TAGS) { + if (ALL_TAGS[i].tag?.style) { + ALL_TAGS[i].tag.style.display = null + } + } + } + } + + feature.settings.addEventListener("changed", update) + feature.addEventListener("disabled", update) + feature.addEventListener("enabled", update) +} \ No newline at end of file From 23062c7dff05150f235c65d86a056c6767f30e94 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Fri, 21 Jun 2024 20:14:55 -0700 Subject: [PATCH 009/253] View sprite layers --- features/features.json | 5 +++ features/sprite-layers/data.json | 32 +++++++++++++++++ features/sprite-layers/script.js | 61 ++++++++++++++++++++++++++++++++ features/sprite-layers/style.css | 53 +++++++++++++++++++++++++++ 4 files changed, 151 insertions(+) create mode 100644 features/sprite-layers/data.json create mode 100644 features/sprite-layers/script.js create mode 100644 features/sprite-layers/style.css diff --git a/features/features.json b/features/features.json index e3b1f078..aa9089c7 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "sprite-layers", + "versionAdded": "v3.9.0" + }, { "version": 2, "id": "hide-project-tags", diff --git a/features/sprite-layers/data.json b/features/sprite-layers/data.json new file mode 100644 index 00000000..c0c4d920 --- /dev/null +++ b/features/sprite-layers/data.json @@ -0,0 +1,32 @@ +{ + "title": "View Sprite Layers", + "description": "Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers.", + "credits": [ + { + "username": "-Brass_Glass-", + "url": "https://scratch.mit.edu/users/-Brass_Glass-/" + }, + { + "username": "rgantzos", + "url": "https://scratch.mit.edu/users/rgantzos/" + } + ], + "type": [ + "Editor" + ], + "tags": [ + "New" + ], + "scripts": [ + { + "file": "script.js", + "runOn": "/projects/*" + } + ], + "styles": [ + { + "file": "style.css", + "runOn": "/projects/*" + } + ] +} \ No newline at end of file diff --git a/features/sprite-layers/script.js b/features/sprite-layers/script.js new file mode 100644 index 00000000..372ad934 --- /dev/null +++ b/features/sprite-layers/script.js @@ -0,0 +1,61 @@ +export default async function ({ feature, console }) { + window.feature = feature + + ScratchTools.waitForElements("div[class*='sprite-info_row_']:nth-child(2) > div[class*='sprite-info_group_']:nth-child(1)", function (button) { + button.addEventListener("mouseover", function () { + if (feature.traps.vm.editingTarget.isStage || button.querySelector(".ste-layers")) return; + + button.style.position = "relative" + + let div = document.createElement("div") + div.className = "ste-layers" + + let h3 = document.createElement("h3") + h3.textContent = "Layers" + div.appendChild(h3) + + div.appendChild(buildDiagram()) + + if (div.querySelector("div").childNodes.length > 12) { + div.classList.add("ste-long-layers") + } + + let p = document.createElement("p") + p.textContent = "Layers to the left are to the front. Bright blue indicates the current sprite, and light blue indicates any of its clones." + div.appendChild(p) + + button.appendChild(div) + }) + + button.addEventListener("mouseout", function () { + button.querySelector(".ste-layers")?.remove() + button.style.position = null + }) + }) + + function buildDiagram() { + let targets = feature.traps.vm.runtime.targets + + let div = document.createElement("div") + let elements = [] + + for (var i in targets) { + let place = document.createElement("div") + place.style.width = `calc(${(100 / targets.length).toString()}% - .1rem)` + elements.push(place) + } + + for (var i in targets) { + if (targets[i].sprite.name === feature.traps.vm.editingTarget.sprite.name) { + if (targets[i].isOriginal) { + elements[targets[i].getLayerOrder() - 1].style.backgroundColor = "#034efc" + } else { + elements[targets[i].getLayerOrder() - 1].style.backgroundColor = "#034efc70" + } + } + } + + div.append(...elements) + return div + } +} \ No newline at end of file diff --git a/features/sprite-layers/style.css b/features/sprite-layers/style.css new file mode 100644 index 00000000..178f6f77 --- /dev/null +++ b/features/sprite-layers/style.css @@ -0,0 +1,53 @@ +.ste-layers { + width: 25rem; + border-radius: .5rem; + height: 9.75rem; + background: white; + position: absolute; + border: 2px solid rgba(3, 78, 252, .5); + padding: .5rem; + text-align: left; + left: 50%; + bottom: -7rem; + transform: translate(-50%, -100%); + z-index: 999; + box-shadow: 0px 0px 10px rgb(3, 78, 252, .3); +} + +.ste-layers h3 { + font-size: 1.1rem; + margin-bottom: .5rem; + margin-left: .15rem; +} + +.ste-layers>div>div { + border-radius: .5rem; + height: 3rem; + display: inline-block; + background-color: lightgray; + margin-left: .05rem; + margin-right: .05rem; + flex-shrink: 0; +} + +.ste-layers>div { + display: flex; + flex-wrap: nowrap; + overflow-x: auto; + text-align: center; +} + +.ste-layers p { + font-size: .8rem; + opacity: .6; + font-style: italic; + line-height: .95rem; + padding-left: .05rem; + padding-right: .05rem; +} + +.ste-long-layers>div>div:nth-child(even) { + height: 2rem; + position: relative; + top: .5rem; +} \ No newline at end of file From 508e2e3338dff689409d4378a03d368510d6a560 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Fri, 21 Jun 2024 23:29:41 -0700 Subject: [PATCH 010/253] Fix `select-self` adding clones to dropdown --- features/select-self/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/select-self/script.js b/features/select-self/script.js index 1a1ed6b2..a5498d16 100644 --- a/features/select-self/script.js +++ b/features/select-self/script.js @@ -45,7 +45,7 @@ export default async function ({ feature, console }) { function updateMenu(blockId) { let SPRITES = [] - let targets = feature.traps.vm.runtime.targets.filter((target) => !target.isStage) + let targets = feature.traps.vm.runtime.targets.filter((target) => !target.isStage && target.isOriginal) for (var i in targets) { SPRITES.push(targets[i].sprite.name) From d2d44f5f38435bc1c3915fb284d2ff34365d6166 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Fri, 21 Jun 2024 23:30:34 -0700 Subject: [PATCH 011/253] Fix `project-descriptions` overlapping with Notes & Credits text --- features/project-descriptions/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/project-descriptions/style.css b/features/project-descriptions/style.css index e34d20f5..a7185e1c 100644 --- a/features/project-descriptions/style.css +++ b/features/project-descriptions/style.css @@ -1,7 +1,7 @@ .ai-star { height: 1.4rem; position: absolute; - left: 6rem; + margin-left: .5rem; cursor: pointer; transform: none; transition: transform .3s; From 3255338db8d602dfbde35fdfa3b1e3cfc580ffae Mon Sep 17 00:00:00 2001 From: Masaabu Date: Sat, 22 Jun 2024 23:00:39 +0900 Subject: [PATCH 012/253] stage-in-spritepane --- features/features.json | 5 ++++ features/stage-in-spritepane/data.json | 11 ++++++++ features/stage-in-spritepane/script.js | 5 ++++ features/stage-in-spritepane/style.css | 39 ++++++++++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 features/stage-in-spritepane/data.json create mode 100644 features/stage-in-spritepane/script.js create mode 100644 features/stage-in-spritepane/style.css diff --git a/features/features.json b/features/features.json index aa9089c7..2b6ee48a 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "stage-in-spritepane", + "versionAdded": "v3.9.0" + }, { "version": 2, "id": "sprite-layers", diff --git a/features/stage-in-spritepane/data.json b/features/stage-in-spritepane/data.json new file mode 100644 index 00000000..ab7084d1 --- /dev/null +++ b/features/stage-in-spritepane/data.json @@ -0,0 +1,11 @@ +{ + "title": "Stage In SpritePane", + "description": "Move the stage button into the sprite pane.", + "credits": [ + { "username": "Masaabu-YT", "url": "https://scratch.mit.edu/users/Masaabu-YT/" } + ], + "type": ["Editor"], + "tags": ["New", "Featured"], + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], + "styles": [{ "file": "style.css", "runOn": "/projects/*" }] +} \ No newline at end of file diff --git a/features/stage-in-spritepane/script.js b/features/stage-in-spritepane/script.js new file mode 100644 index 00000000..e4756647 --- /dev/null +++ b/features/stage-in-spritepane/script.js @@ -0,0 +1,5 @@ +export default async function ({ feature, console }) { + const stage = await ScratchTools.waitForElement("div.target-pane_stage-selector-wrapper_qekSW"); + stage.classList.add("ste-stage_in_spritepane"); + document.getElementsByClassName("sprite-info_sprite-info_3EyZh")[0].appendChild(stage); +} \ No newline at end of file diff --git a/features/stage-in-spritepane/style.css b/features/stage-in-spritepane/style.css new file mode 100644 index 00000000..ae5c219f --- /dev/null +++ b/features/stage-in-spritepane/style.css @@ -0,0 +1,39 @@ +.sprite-info_sprite-info_3EyZh { + height: auto; +} + +.ste-stage_in_spritepane .stage-selector_stage-selector_3oWOr { + margin-top: 8px; + display: flex; + flex-direction: initial; + border: 1.333px solid #00000026; + border-radius: 0.5rem; +} + +.ste-stage_in_spritepane .stage-selector_header_2GVr1 { + border: none; + background: none; + width: auto; + margin-right: 8px; +} + +.stage-selector_stage-selector_3oWOr.stage-selector_is-selected_2x2r_ .stage-selector_header_2GVr1 { + background: none; +} + +.ste-stage_in_spritepane .stage-selector_header_2GVr1 span { + color: #575e75; +} + +.ste-stage_in_spritepane .stage-selector_costume-canvas_2L_6h { + margin: 2px; +} + +.ste-stage_in_spritepane .stage-selector_label_1MCfr { + margin: 0; +} + +.ste-stage_in_spritepane .action-menu_menu-container_3a6da { + right: 0; + bottom: 7%; +} From d6d21dad4e58d0e03fac68da9df5b39e17bdfbcb Mon Sep 17 00:00:00 2001 From: Masaabu Date: Sat, 22 Jun 2024 23:02:37 +0900 Subject: [PATCH 013/253] update description --- features/stage-in-spritepane/data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/stage-in-spritepane/data.json b/features/stage-in-spritepane/data.json index ab7084d1..6d19577c 100644 --- a/features/stage-in-spritepane/data.json +++ b/features/stage-in-spritepane/data.json @@ -1,6 +1,6 @@ { "title": "Stage In SpritePane", - "description": "Move the stage button into the sprite pane.", + "description": "Move the stage button to the sprite pane to widen the sprite field.", "credits": [ { "username": "Masaabu-YT", "url": "https://scratch.mit.edu/users/Masaabu-YT/" } ], From af5bb6a9327d4a738e8c9c04c77bdddc5db342a4 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sat, 22 Jun 2024 10:33:37 -0400 Subject: [PATCH 014/253] Spritepane --> Sprite Pane --- features/stage-in-spritepane/data.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/stage-in-spritepane/data.json b/features/stage-in-spritepane/data.json index 6d19577c..1ee111b2 100644 --- a/features/stage-in-spritepane/data.json +++ b/features/stage-in-spritepane/data.json @@ -1,5 +1,5 @@ { - "title": "Stage In SpritePane", + "title": "Stage In Sprite Pane", "description": "Move the stage button to the sprite pane to widen the sprite field.", "credits": [ { "username": "Masaabu-YT", "url": "https://scratch.mit.edu/users/Masaabu-YT/" } @@ -8,4 +8,4 @@ "tags": ["New", "Featured"], "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], "styles": [{ "file": "style.css", "runOn": "/projects/*" }] -} \ No newline at end of file +} From 66bc8424e6aab1ee0ecfa46e6a55d1a070143efe Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Sun, 23 Jun 2024 00:00:12 +0000 Subject: [PATCH 015/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index 3ae9dae4..c4287245 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"relevant-forum-posts/title":{"message":"Show Relevant Forum Posts"},"relevant-forum-posts/description":{"message":"When creating a new forum topic, shows other topics that may be similar to what you are creating."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"important-messages/title":{"message":"Important Messages"},"important-messages/description":{"message":"Separate important messages on the messages page."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"user-stats/title":{"message":"Show User Statistics"},"user-stats/description":{"message":"Replaces the 'What I've been doing' section on a profile page with the user's statistics."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"relevant-forum-posts/title":{"message":"Show Relevant Forum Posts"},"relevant-forum-posts/description":{"message":"When creating a new forum topic, shows other topics that may be similar to what you are creating."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"important-messages/title":{"message":"Important Messages"},"important-messages/description":{"message":"Separate important messages on the messages page."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"user-stats/title":{"message":"Show User Statistics"},"user-stats/description":{"message":"Replaces the 'What I've been doing' section on a profile page with the user's statistics."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From 04aa37eddd7eb65504c09b9597b7d5dac5d921b9 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sat, 22 Jun 2024 23:00:25 -0700 Subject: [PATCH 016/253] Better Cloud History --- features/better-cloud-history/data.json | 33 +++++++ features/better-cloud-history/script.js | 121 ++++++++++++++++++++++++ features/better-cloud-history/style.css | 74 +++++++++++++++ features/features.json | 5 + 4 files changed, 233 insertions(+) create mode 100644 features/better-cloud-history/data.json create mode 100644 features/better-cloud-history/script.js create mode 100644 features/better-cloud-history/style.css diff --git a/features/better-cloud-history/data.json b/features/better-cloud-history/data.json new file mode 100644 index 00000000..7df6a727 --- /dev/null +++ b/features/better-cloud-history/data.json @@ -0,0 +1,33 @@ +{ + "title": "Better Cloud History", + "description": "Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable.", + "credits": [ + { + "username": "-Brass_Glass-", + "url": "https://scratch.mit.edu/users/-Brass_Glass-/" + }, + { + "username": "rgantzos", + "url": "https://scratch.mit.edu/users/rgantzos/" + } + ], + "type": [ + "Website" + ], + "tags": [ + "New" + ], + "dynamic": true, + "scripts": [ + { + "file": "script.js", + "runOn": "/cloudmonitor/*" + } + ], + "styles": [ + { + "file": "style.css", + "runOn": "/cloudmonitor/*" + } + ] +} \ No newline at end of file diff --git a/features/better-cloud-history/script.js b/features/better-cloud-history/script.js new file mode 100644 index 00000000..af173cf1 --- /dev/null +++ b/features/better-cloud-history/script.js @@ -0,0 +1,121 @@ +export default async function ({ feature, console }) { + let avatars = {} + + let projectId = window.location.pathname.split("/")[2] + + let data = await (await fetch(`https://clouddata.scratch.mit.edu/logs?projectid=${projectId}&limit=40&offset=0`)).json() + data.push(...(await (await fetch(`https://clouddata.scratch.mit.edu/logs?projectid=${projectId}&limit=40&offset=40`)).json()).filter((el) => !data.find((old) => old.timestamp === el.timestamp))) + data.push(...(await (await fetch(`https://clouddata.scratch.mit.edu/logs?projectid=${projectId}&limit=40&offset=80`)).json()).filter((el) => !data.find((old) => old.timestamp === el.timestamp))) + + let currentOffset = 0 + + let div = await ScratchTools.waitForElement("div.box-content.v-tabs-content") + + let table = makeTable() + feature.self.hideOnDisable(table) + div.appendChild(table) + + await addData(data) + + async function addData(data) { + for (var i in data) { + let tr = document.createElement("tr") + + let user = document.createElement("td") + let a = document.createElement("a") + a.href = `/users/${data[i].user}` + + let img = document.createElement("img") + if (avatars[data[i].user]) { + img.src = avatars[data[i].user] + } else { + let { images } = (await (await fetch(`https://api.scratch.mit.edu/users/${data[i].user}/`)).json()).profile + img.src = images["90x90"] + avatars[data[i].user] = images["90x90"] + } + a.appendChild(img) + + let span = document.createElement("span") + span.textContent = data[i].user + a.appendChild(span) + + user.appendChild(a) + tr.appendChild(user) + + let action = document.createElement("td") + action.textContent = data[i].verb.split("_")[0].toUpperCase() + tr.appendChild(action) + + let variable = document.createElement("td") + let varName = document.createElement("span") + varName.textContent = data[i].name + varName.className = "ste-cloud-variable" + variable.appendChild(varName) + tr.appendChild(variable) + + varName.addEventListener("click", function () { + let varId = this.textContent + + if (!table.className.includes("sort")) { + table.querySelectorAll("tr").forEach(function (tr) { + if (!tr.querySelector("th")) { + if (tr.querySelector("td:nth-child(3)")?.textContent !== varId) { + tr.style.display = "none" + tr.classList.add("ste-cloud-dontshow") + } + } + }) + table.classList.add("sort") + } else { + table.querySelectorAll("tr").forEach(function (tr) { + tr.style.display = null + tr.classList.remove("ste-cloud-dontshow") + }) + table.classList.remove("sort") + } + }) + + let content = document.createElement("td") + content.textContent = data[i].value + content.className = "ste-cloud-content" + tr.appendChild(content) + + let time = document.createElement("td") + time.textContent = new Date(data[i].timestamp).toLocaleString() + time.title = data[i].timestamp.toString() + tr.appendChild(time) + + document.querySelector(".ste-cloud-table").appendChild(tr) + } + } + + function makeTable() { + let table = document.createElement("table") + table.className = "ste-cloud-table" + + let tr = document.createElement("tr") + table.appendChild(tr) + + let user = document.createElement("th") + user.textContent = "User" + tr.appendChild(user) + + let action = document.createElement("th") + action.textContent = "Action" + tr.appendChild(action) + + let variable = document.createElement("th") + variable.textContent = "Variable" + tr.appendChild(variable) + + let content = document.createElement("th") + content.textContent = "Content" + tr.appendChild(content) + + let time = document.createElement("th") + time.textContent = "Time" + tr.appendChild(time) + + return table + } +} \ No newline at end of file diff --git a/features/better-cloud-history/style.css b/features/better-cloud-history/style.css new file mode 100644 index 00000000..db209c35 --- /dev/null +++ b/features/better-cloud-history/style.css @@ -0,0 +1,74 @@ +div#table-container { + display: none; +} + +.ste-cloud-table { + width: 100%; + margin-top: 1rem; +} + +.ste-cloud-table img { + height: 2rem; + width: 2rem; + border-radius: .25rem; +} + +.ste-cloud-table td { + padding: 1rem; +} + +.ste-cloud-table a span { + position: relative; + top: -.5rem; + margin-left: .5rem; + font-weight: 500; +} + +.ste-cloud-table a:hover { + text-decoration: none; +} + +.ste-cloud-table tr td { + text-align: center; +} + +.ste-cloud-variable { + padding: .5rem; + padding-top: .25rem; + padding-bottom: .25rem; + border-radius: 1.2rem; + background-color: rgb(255, 140, 26); + color: white; + text-shadow: none; + opacity: .7; + transition: opacity .3s, transform .3s; + transform: none; + cursor: pointer; + display: inline-block; +} + +.ste-cloud-variable:hover { + opacity: 1; + transform: scale(1.1); +} + +.ste-cloud-table.sort .ste-cloud-variable { + opacity: 1; + transform: scale(1.1); +} + +.ste-cloud-table tr td.ste-cloud-content { + width: 40%; + word-break: break-all; + text-align: left; + height: 2rem; + overflow-y: auto; +} + +th { + padding: .5rem; +} + +tr:not(.ste-cloud-dontshow):nth-child(odd) { + background-color: rgba(77,151,255,.1); +} \ No newline at end of file diff --git a/features/features.json b/features/features.json index aa9089c7..13ca3f5d 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "better-cloud-history", + "versionAdded": "v3.9.0" + }, { "version": 2, "id": "sprite-layers", From 56ac5a0163489d8f2137eed048e6175e8e43dd38 Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Sun, 23 Jun 2024 06:03:11 +0000 Subject: [PATCH 017/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index c4287245..0b067dbe 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"relevant-forum-posts/title":{"message":"Show Relevant Forum Posts"},"relevant-forum-posts/description":{"message":"When creating a new forum topic, shows other topics that may be similar to what you are creating."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"important-messages/title":{"message":"Important Messages"},"important-messages/description":{"message":"Separate important messages on the messages page."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"user-stats/title":{"message":"Show User Statistics"},"user-stats/description":{"message":"Replaces the 'What I've been doing' section on a profile page with the user's statistics."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"relevant-forum-posts/title":{"message":"Show Relevant Forum Posts"},"relevant-forum-posts/description":{"message":"When creating a new forum topic, shows other topics that may be similar to what you are creating."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"important-messages/title":{"message":"Important Messages"},"important-messages/description":{"message":"Separate important messages on the messages page."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"user-stats/title":{"message":"Show User Statistics"},"user-stats/description":{"message":"Replaces the 'What I've been doing' section on a profile page with the user's statistics."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From 0c30ffcbe4690d6395a4de56afd41c2b6f310877 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 23 Jun 2024 09:16:29 -0700 Subject: [PATCH 018/253] Fix popup search bar --- extras/popup/popup.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/extras/popup/popup.css b/extras/popup/popup.css index d71c0304..82310ca1 100644 --- a/extras/popup/popup.css +++ b/extras/popup/popup.css @@ -201,8 +201,6 @@ a { background-position: 47% 46%; background-size: 20px 20px; background-repeat: no-repeat; - position: relative; - top: -18px; } .searchbaricon { border-radius: var(--radius) 0px 0px var(--radius); @@ -217,8 +215,6 @@ a { background-position: 80% 50%; background-size: 30px 30px; background-repeat: no-repeat; - position: relative; - top: -18px; } .settingsButton { padding: 12px; From eb676c0375bea8c31912097c280ecb7658af6aec Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 23 Jun 2024 10:50:09 -0700 Subject: [PATCH 019/253] Fix block count --- features/block-count-in-mystuff.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/features/block-count-in-mystuff.js b/features/block-count-in-mystuff.js index ee7ebb72..5fb1b6c9 100644 --- a/features/block-count-in-mystuff.js +++ b/features/block-count-in-mystuff.js @@ -2,8 +2,18 @@ if (window.location.href.startsWith("https://scratch.mit.edu/mystuff")) { var stillLookingForBlockCount = true; async function getBlockCount(projectId) { + let { project_token } = await (await fetch("https://api.scratch.mit.edu/projects/" + projectId, { + "headers": { + "accept": "*/*", + "x-token": (await ScratchTools.Session()).user.token, + }, + "referrer": "https://scratch.mit.edu/", + "referrerPolicy": "strict-origin-when-cross-origin", + "body": null, + "method": "GET", + })).json() var response = await fetch( - "https://projects.scratch.mit.edu/" + projectId + "/" + "https://projects.scratch.mit.edu/" + projectId + "/?token=" + project_token ); if (response.ok) { var data = await response.json(); From 5899c314e763f5d2332cf4c53101cdec9a93bdd6 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 23 Jun 2024 10:51:15 -0700 Subject: [PATCH 020/253] Remove a few Scratch db features --- features/features.json | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/features/features.json b/features/features.json index 13ca3f5d..10686be0 100644 --- a/features/features.json +++ b/features/features.json @@ -124,11 +124,6 @@ "id": "better-trending-thumbnails", "versionAdded": "v3.4.0" }, - { - "version": 2, - "id": "relevant-forum-posts", - "versionAdded": "v3.4.0" - }, { "version": 2, "id": "anti-generic", @@ -264,11 +259,6 @@ "id": "shared-clipboard", "versionAdded": "v3.0.0" }, - { - "version": 2, - "id": "important-messages", - "versionAdded": "v3.0.0" - }, { "version": 2, "id": "hide-footer", @@ -467,15 +457,6 @@ "tags": ["New"], "type": ["Website"] }, - { - "title": "Show User Statistics", - "description": "Replaces the 'What I've been doing' section on a profile page with the user's statistics.", - "credits": ["Dr_Lego"], - "urls": ["https://scratch.mit.edu/users/Dr_Lego/"], - "file": "user-stats", - "type": ["Website"], - "tags": ["New"] - }, { "title": "Frontpage Curator Name as Link", "description": "Makes the name of the Frontpage Curator to a clickable link to his profile.", From b6149966d526991173243d2ac6055df9f712033a Mon Sep 17 00:00:00 2001 From: Masaabu Date: Mon, 24 Jun 2024 04:17:11 +0900 Subject: [PATCH 021/253] better-popup-options --- extras/popup/popup.css | 40 ++++++++++++++++++++++------------------ extras/popup/popup.js | 37 ++++++++++++++----------------------- extras/style.css | 22 +++++++++++++--------- 3 files changed, 49 insertions(+), 50 deletions(-) diff --git a/extras/popup/popup.css b/extras/popup/popup.css index d71c0304..0f1c07f7 100644 --- a/extras/popup/popup.css +++ b/extras/popup/popup.css @@ -68,15 +68,6 @@ a { .feature label { color: var(--primary-color); - position: relative; - top: -0.7rem; - margin-left: 0.5rem; -} - -.feature input[type="checkbox"] { - display: inline-block; - width: 1.25rem; - cursor: pointer; } .feature > span { @@ -108,9 +99,10 @@ a { margin-bottom: 0rem; } .feature p { - color: var(--secondary-color); + margin: 5px 0; opacity: 0.5; padding-right: 4rem; + color: var(--secondary-color); } .feature > input { @@ -121,11 +113,11 @@ a { .feature input { padding: 0.1vw; height: 2rem; - margin-left: 0.5vw; - background-color: var(--theme); + margin-left: auto; border-radius: 1rem; outline: none; border: 0px; + background-color: var(--theme); color: white; } @@ -133,7 +125,6 @@ a { color: var(--color); background-color: var(--feature-input-bg); padding-left: 1rem !important; - margin-bottom: 0.5rem; } .feature button { cursor: pointer; @@ -242,7 +233,7 @@ a { .feature input { padding: 0.1vw; height: 2rem; - margin-left: 0.5vw; + margin-left: auto; border-radius: 1rem; outline: none; border: 0px; @@ -250,6 +241,16 @@ a { background-color: var(--feature-input-bg); } +.feature input[type="checkbox"] { + display: inline-block; + width: 1.25rem; + min-width: 55px; + cursor: pointer; +} +.feature input[type="color"] { + padding-left: 0.1vw !important; +} + /*Switch*/ .switch { position: relative; @@ -435,14 +436,17 @@ span.new-feature-tag.beta { } .special-switch { - position: relative; width: 55px; height: 28px; + margin-left: auto; transform: scale(80%); - float: right; position: relative; - top: -0.25rem; - margin: 0px; +} + +.feature .option { + display: flex; + margin: 5px 0; + align-items: center; } .feature table, diff --git a/extras/popup/popup.js b/extras/popup/popup.js index 03fb7138..3a391a4a 100644 --- a/extras/popup/popup.js +++ b/extras/popup/popup.js @@ -686,42 +686,33 @@ async function getFeatures() { for (var optionPlace in feature.options) { var option = feature.options[optionPlace]; var input = document.createElement("input"); + input.type = ["text", "checkbox", "number", "color"][option.type || 0]; input.dataset.id = option.id; input.dataset.feature = feature.id; - input.placeholder = option.name; - input.type = ["text", "checkbox", "number", "color"][option.type || 0]; var optionData = (await chrome.storage.sync.get(option.id))[option.id]; input.value = optionData || ""; + input.placeholder = `Enter ${input.type}`; + var optionDiv = document.createElement("div") + optionDiv.className = "option"; + var label = document.createElement("label"); + label.textContent = option.name; + optionDiv.appendChild(label) + if (input.type === "checkbox") { + input.checked = optionData || false; var specialLabel = document.createElement("label"); specialLabel.className = "special-switch"; - input.className = "checkbox" + input.classList.add = "checkbox" var span = document.createElement("span"); span.className = "slider round"; specialLabel.appendChild(input); specialLabel.appendChild(span); + optionDiv.appendChild(specialLabel) } else { - div.appendChild(input); - } - if (input.type === "checkbox") { - let table = document.createElement("table") - let tr = document.createElement("tr") - table.appendChild(tr) - - let td1 = document.createElement("td") - tr.appendChild(td1) - let td2 = document.createElement("td") - tr.appendChild(td2) - - div.appendChild(table) - - var label = document.createElement("label"); - label.textContent = option.name; - label.style.marginLeft = "0px" - td1.appendChild(label); - td2.appendChild(specialLabel) - input.checked = optionData || false; + optionDiv.appendChild(input) } + div.appendChild(optionDiv) + input.dataset.validation = btoa( JSON.stringify(option.validation || []) ); diff --git a/extras/style.css b/extras/style.css index 7f86b845..4300a46f 100644 --- a/extras/style.css +++ b/extras/style.css @@ -122,6 +122,7 @@ a { } .feature p { + margin: 5px 0; opacity: 0.5; font-size: 0.8rem; padding-right: 4rem; @@ -131,11 +132,10 @@ a { .feature input { padding: 0.1vw; height: 2rem; - margin-left: 0.5vw; + margin-left: auto; border-radius: 1rem; outline: none; padding-left: 1rem; - margin-bottom: 0.5rem; border: 0px; color: var(--primary-color); background-color: var(--feature-input-bg); @@ -144,8 +144,12 @@ a { .feature input[type="checkbox"] { display: inline-block; width: 1.25rem; + min-width: 55px; cursor: pointer; } +.feature input[type="color"] { + padding-left: 0.1vw; +} .feature > input { display: block; @@ -188,9 +192,6 @@ a { .feature label { color: var(--primary-color); - position: relative; - top: -0.7rem; - margin-left: 0.5rem; } .feature > span { @@ -793,14 +794,17 @@ span.new-feature-tag.beta { } .special-switch { - position: relative; width: 55px; height: 28px; - margin: 0px; + margin-left: auto; transform: scale(80%); - float: right; position: relative; - top: -0.25rem; +} + +.feature .option { + display: flex; + margin: 5px 0; + align-items: center; } .feature table, From a97314e43e71e09165cb4d916e08c0623c961fc3 Mon Sep 17 00:00:00 2001 From: Masaabu Date: Mon, 24 Jun 2024 04:41:04 +0900 Subject: [PATCH 022/253] Updated color options --- extras/popup/popup.css | 3 ++- extras/style.css | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/extras/popup/popup.css b/extras/popup/popup.css index 0f1c07f7..7c51540e 100644 --- a/extras/popup/popup.css +++ b/extras/popup/popup.css @@ -248,7 +248,8 @@ a { cursor: pointer; } .feature input[type="color"] { - padding-left: 0.1vw !important; + padding: 0.1vw !important; + border-radius: 0.4rem; } /*Switch*/ diff --git a/extras/style.css b/extras/style.css index 4300a46f..5ac4ce29 100644 --- a/extras/style.css +++ b/extras/style.css @@ -148,7 +148,8 @@ a { cursor: pointer; } .feature input[type="color"] { - padding-left: 0.1vw; + padding: 0.1vw; + border-radius: 0.4rem; } .feature > input { From 5458e40b7189e622c3d9abfc220b7639dd752128 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 23 Jun 2024 13:46:25 -0700 Subject: [PATCH 023/253] Few fixes --- features/stage-in-spritepane/data.json | 3 +- features/stage-in-spritepane/script.js | 37 ++++++++++++++++++++++--- features/stage-in-spritepane/style.css | 38 ++++++++++++++++++++------ 3 files changed, 65 insertions(+), 13 deletions(-) diff --git a/features/stage-in-spritepane/data.json b/features/stage-in-spritepane/data.json index 1ee111b2..7e2de202 100644 --- a/features/stage-in-spritepane/data.json +++ b/features/stage-in-spritepane/data.json @@ -7,5 +7,6 @@ "type": ["Editor"], "tags": ["New", "Featured"], "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], - "styles": [{ "file": "style.css", "runOn": "/projects/*" }] + "styles": [{ "file": "style.css", "runOn": "/projects/*" }], + "dynamic": true } diff --git a/features/stage-in-spritepane/script.js b/features/stage-in-spritepane/script.js index e4756647..cd7f6611 100644 --- a/features/stage-in-spritepane/script.js +++ b/features/stage-in-spritepane/script.js @@ -1,5 +1,34 @@ export default async function ({ feature, console }) { - const stage = await ScratchTools.waitForElement("div.target-pane_stage-selector-wrapper_qekSW"); - stage.classList.add("ste-stage_in_spritepane"); - document.getElementsByClassName("sprite-info_sprite-info_3EyZh")[0].appendChild(stage); -} \ No newline at end of file + let activeStage; + ScratchTools.waitForElements( + "div[class*='target-pane_stage-selector-wrapper_']", + function (stage) { + activeStage = stage; + + if (!feature.self.enabled) return; + + stage.classList.add("ste-stage_in_spritepane"); + document + .querySelector("div[class^='sprite-info_sprite-info_']") + .appendChild(stage); + } + ); + + feature.addEventListener("disabled", function () { + if (activeStage) { + activeStage.classList.remove("ste-stage_in_spritepane"); + document + .querySelector("div[class^='target-pane_target-pane_']") + .appendChild(activeStage); + } + }); + + feature.addEventListener("enabled", function () { + if (activeStage) { + activeStage.classList.add("ste-stage_in_spritepane"); + document + .querySelector("div[class^='sprite-info_sprite-info_']") + .appendChild(activeStage); + } + }); +} diff --git a/features/stage-in-spritepane/style.css b/features/stage-in-spritepane/style.css index ae5c219f..f552d555 100644 --- a/features/stage-in-spritepane/style.css +++ b/features/stage-in-spritepane/style.css @@ -1,8 +1,8 @@ -.sprite-info_sprite-info_3EyZh { +[class*='sprite-info_sprite-info_'] { height: auto; } -.ste-stage_in_spritepane .stage-selector_stage-selector_3oWOr { +.ste-stage_in_spritepane [class*='stage-selector_stage-selector_'] { margin-top: 8px; display: flex; flex-direction: initial; @@ -10,30 +10,52 @@ border-radius: 0.5rem; } -.ste-stage_in_spritepane .stage-selector_header_2GVr1 { +.ste-stage_in_spritepane [class*='stage-selector_header_'] { border: none; background: none; width: auto; margin-right: 8px; } -.stage-selector_stage-selector_3oWOr.stage-selector_is-selected_2x2r_ .stage-selector_header_2GVr1 { +[class*='stage-selector_stage-selector_'][class*='stage-selector_is-selected_'] [class*='stage-selector_header_'] { background: none; } -.ste-stage_in_spritepane .stage-selector_header_2GVr1 span { +.ste-stage_in_spritepane [class*='stage-selector_header_'] span { color: #575e75; } -.ste-stage_in_spritepane .stage-selector_costume-canvas_2L_6h { +.ste-stage_in_spritepane [class*='stage-selector_costume-canvas_'] { margin: 2px; } -.ste-stage_in_spritepane .stage-selector_label_1MCfr { +.ste-stage_in_spritepane [class*='stage-selector_label_'] { margin: 0; } -.ste-stage_in_spritepane .action-menu_menu-container_3a6da { +.ste-stage_in_spritepane [class*='action-menu_menu-container_'] { right: 0; bottom: 7%; } + +div[class^='stage-selector_stage-selector_'] > div[class^='action-menu_menu-container_'] { + transform: scale(.8) rotate(-90deg); + margin-right: .3rem; +} + +div[class^='stage-selector_stage-selector_'] > div[class^='action-menu_menu-container_'] img { + transform: rotate(90deg); +} + +div[class^='stage-selector_stage-selector_'] > div[class^='action-menu_menu-container_'] div[class^='__react_component_tooltip'] { + display: none; +} + +div[class^='stage-selector_header-title_'] { + display: none; +} + +body div[class^='target-pane_stage-selector-wrapper_'] { + margin-left: 0px !important; + margin-right: 0px !important; +} \ No newline at end of file From 8a0f4179201cac6723479733bb8eaaa030d1d575 Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 00:00:12 +0000 Subject: [PATCH 024/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index 0b067dbe..f31b8eab 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"relevant-forum-posts/title":{"message":"Show Relevant Forum Posts"},"relevant-forum-posts/description":{"message":"When creating a new forum topic, shows other topics that may be similar to what you are creating."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"important-messages/title":{"message":"Important Messages"},"important-messages/description":{"message":"Separate important messages on the messages page."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"user-stats/title":{"message":"Show User Statistics"},"user-stats/description":{"message":"Replaces the 'What I've been doing' section on a profile page with the user's statistics."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From a3ca86f43f266a60f7d7617b8f29bb6761e3a687 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Mon, 24 Jun 2024 09:41:27 -0700 Subject: [PATCH 025/253] Fix `select-self` when reenabled --- features/select-self/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/select-self/script.js b/features/select-self/script.js index a5498d16..846a89d2 100644 --- a/features/select-self/script.js +++ b/features/select-self/script.js @@ -36,7 +36,7 @@ export default async function ({ feature, console }) { } }) - feature.addEventListener("reenabled", function () { + feature.addEventListener("enabled", function () { for (var i in blocks) { updateMenu(blocks[i]) } From e1b6e38c17f5a26a5b8cd4c501688dfc6465672f Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Wed, 26 Jun 2024 21:53:14 -0700 Subject: [PATCH 026/253] Selection option --- extras/popup/popup.js | 307 +++++++++++++++++++++++++++--------------- extras/style.css | 32 +++++ 2 files changed, 230 insertions(+), 109 deletions(-) diff --git a/extras/popup/popup.js b/extras/popup/popup.js index 3a391a4a..5ffd8000 100644 --- a/extras/popup/popup.js +++ b/extras/popup/popup.js @@ -161,7 +161,12 @@ if (document.querySelector(".feedback-btn")) { .querySelector(".feedback-btn") .addEventListener("click", function () { chrome.tabs.create({ - url: "https://auth.itinerary.eu.org/auth/?redirect="+ btoa("https://scratch.mit.edu/ste/dashboard/verify/?system=feedback")+"&name=ScratchTools", + url: + "https://auth.itinerary.eu.org/auth/?redirect=" + + btoa( + "https://scratch.mit.edu/ste/dashboard/verify/?system=feedback" + ) + + "&name=ScratchTools", }); }); } @@ -685,104 +690,183 @@ async function getFeatures() { if (feature.options) { for (var optionPlace in feature.options) { var option = feature.options[optionPlace]; - var input = document.createElement("input"); - input.type = ["text", "checkbox", "number", "color"][option.type || 0]; - input.dataset.id = option.id; - input.dataset.feature = feature.id; - var optionData = (await chrome.storage.sync.get(option.id))[option.id]; - input.value = optionData || ""; - input.placeholder = `Enter ${input.type}`; - var optionDiv = document.createElement("div") - optionDiv.className = "option"; - var label = document.createElement("label"); - label.textContent = option.name; - optionDiv.appendChild(label) - - if (input.type === "checkbox") { - input.checked = optionData || false; - var specialLabel = document.createElement("label"); - specialLabel.className = "special-switch"; - input.classList.add = "checkbox" - var span = document.createElement("span"); - span.className = "slider round"; - specialLabel.appendChild(input); - specialLabel.appendChild(span); - optionDiv.appendChild(specialLabel) + if (option.type === 4) { + var optionDiv = document.createElement("div"); + optionDiv.className = "option"; + var label = document.createElement("label"); + label.textContent = option.name; + optionDiv.appendChild(label); + + let options = document.createElement("div"); + options.className = "option-selection"; + options.dataset.id = option.id; + var optionData = (await chrome.storage.sync.get(option.id))[ + option.id + ]; + for (var i in option.options) { + let oData = option.options[i]; + + let span = document.createElement("span"); + span.textContent = oData.name; + span.dataset.id = oData.value; + + span.addEventListener("click", async function () { + let id = this.dataset.id; + + let feature = this.closest(".feature"); + let featureId = feature.dataset.id; + + let optionId = this.parentElement.dataset.id; + + this.parentElement + .querySelector(".option-selected") + .classList.remove("option-selected"); + this.classList.add("option-selected"); + + await chrome.storage.sync.set({ + [optionId]: id, + }); + chrome.tabs.query({}, function (tabs) { + for (var i = 0; i < tabs.length; i++) { + try { + chrome.scripting.executeScript({ + args: [featureId, optionId, id], + target: { tabId: tabs[i].id }, + func: updateSettingsFunction, + world: "MAIN", + }); + function updateSettingsFunction(feature, name, value) { + ScratchTools.Storage[name] = value; + if (allSettingChangeFunctions[feature]) { + allSettingChangeFunctions[feature]({ + key: name, + value, + }); + } + } + } catch (err) { + console.log(err); + } + } + }); + }); + if (optionData === span.dataset.id || (!optionData && i < 1)) { + span.classList.add("option-selected"); + } + options.appendChild(span); + } + optionDiv.appendChild(options); } else { - optionDiv.appendChild(input) + var input = document.createElement("input"); + input.type = ["text", "checkbox", "number", "color"][ + option.type || 0 + ]; + input.dataset.id = option.id; + input.dataset.feature = feature.id; + var optionData = (await chrome.storage.sync.get(option.id))[ + option.id + ]; + input.value = optionData || ""; + input.placeholder = `Enter ${input.type}`; + var optionDiv = document.createElement("div"); + optionDiv.className = "option"; + var label = document.createElement("label"); + label.textContent = option.name; + optionDiv.appendChild(label); + + if (input.type === "checkbox") { + input.checked = optionData || false; + var specialLabel = document.createElement("label"); + specialLabel.className = "special-switch"; + input.classList.add = "checkbox"; + var span = document.createElement("span"); + span.className = "slider round"; + specialLabel.appendChild(input); + specialLabel.appendChild(span); + optionDiv.appendChild(specialLabel); + } else { + optionDiv.appendChild(input); + } } - div.appendChild(optionDiv) + div.appendChild(optionDiv); - input.dataset.validation = btoa( - JSON.stringify(option.validation || []) - ); - input.addEventListener("input", async function () { - var validation = JSON.parse(atob(this.dataset.validation)); - var ready = true; - var input = this; - validation.forEach(function (validate) { - if (ready) { - input.style.outline = "none"; - if ( - input.nextSibling?.className?.includes("validation-explanation") - ) { - input.nextSibling.remove(); - } - if (!new RegExp(validate.regex).test(input.value)) { - ready = false; - input.style.outline = "2px solid #f72f4a"; - var explanation = document.createElement("span"); - explanation.className = "validation-explanation"; - explanation.textContent = validate.explanation; - explanation.style.color = "#f72f4a"; - explanation.style.marginBottom = "1rem"; - input.insertAdjacentElement("afterend", explanation); + if (option.type === 4) { + input.dataset.validation = btoa( + JSON.stringify(option.validation || []) + ); + input.addEventListener("input", async function () { + var validation = JSON.parse(atob(this.dataset.validation)); + var ready = true; + var input = this; + validation.forEach(function (validate) { + if (ready) { + input.style.outline = "none"; + if ( + input.nextSibling?.className?.includes( + "validation-explanation" + ) + ) { + input.nextSibling.remove(); + } + if (!new RegExp(validate.regex).test(input.value)) { + ready = false; + input.style.outline = "2px solid #f72f4a"; + var explanation = document.createElement("span"); + explanation.className = "validation-explanation"; + explanation.textContent = validate.explanation; + explanation.style.color = "#f72f4a"; + explanation.style.marginBottom = "1rem"; + input.insertAdjacentElement("afterend", explanation); + } } - } - }); - if (ready) { - if (this.type !== "checkbox") { - finalValue = this.value; - } else { - var data = await chrome.storage.sync.get(this.dataset.id); - if (data[this.dataset.id]) { - this.checked = false; - finalValue = false; + }); + if (ready) { + if (this.type !== "checkbox") { + finalValue = this.value; } else { - this.checked = true; - finalValue = true; + var data = await chrome.storage.sync.get(this.dataset.id); + if (data[this.dataset.id]) { + this.checked = false; + finalValue = false; + } else { + this.checked = true; + finalValue = true; + } } - } - var saveData = {}; - saveData[this.dataset.id] = finalValue; - await chrome.storage.sync.set(saveData); - var featureToUpdate = this; - chrome.tabs.query({}, function (tabs) { - for (var i = 0; i < tabs.length; i++) { - try { - chrome.scripting.executeScript({ - args: [ - featureToUpdate.dataset.feature, - featureToUpdate.dataset.id, - finalValue, - ], - target: { tabId: tabs[i].id }, - func: updateSettingsFunction, - world: "MAIN", - }); - function updateSettingsFunction(feature, name, value) { - ScratchTools.Storage[name] = value; - if (allSettingChangeFunctions[feature]) { - allSettingChangeFunctions[feature]({ key: name, value }); + var saveData = {}; + saveData[this.dataset.id] = finalValue; + await chrome.storage.sync.set(saveData); + var featureToUpdate = this; + chrome.tabs.query({}, function (tabs) { + for (var i = 0; i < tabs.length; i++) { + try { + chrome.scripting.executeScript({ + args: [ + featureToUpdate.dataset.feature, + featureToUpdate.dataset.id, + finalValue, + ], + target: { tabId: tabs[i].id }, + func: updateSettingsFunction, + world: "MAIN", + }); + function updateSettingsFunction(feature, name, value) { + ScratchTools.Storage[name] = value; + if (allSettingChangeFunctions[feature]) { + allSettingChangeFunctions[feature]({ + key: name, + value, + }); + } } + } catch (err) { + console.log(err); } - } catch (err) { - console.log(err); } - } - }); - } - }); + }); + } + }); + } } } @@ -859,7 +943,7 @@ async function getFeatures() { document.querySelector(".settings").appendChild(div); } } - getTrending() + getTrending(); } getFeatures(); @@ -1328,11 +1412,11 @@ function generateComponents(components) { if (el.if.type === "any") { if (!conditions.find((cond) => cond)) { - div.style.display = "none" + div.style.display = "none"; } } else if (el.if.type === "all") { if (conditions.find((cond) => !cond) !== undefined) { - div.style.display = "none" + div.style.display = "none"; } } } @@ -1343,14 +1427,17 @@ function generateComponents(components) { } async function getTrending() { - let data = await (await fetch("https://data.scratchtools.app/trending/")).json() + let data = await ( + await fetch("https://data.scratchtools.app/trending/") + ).json(); - data.forEach(function(el) { + data.forEach(function (el) { if (!document.querySelector(`div.feature[data-id='${el}']`)) return; - let icon = document.createElement("span") - icon.innerHTML = '' - icon.className = "icon" + let icon = document.createElement("span"); + icon.innerHTML = + ''; + icon.className = "icon"; icon.addEventListener("click", function () { ScratchTools.modals.create({ @@ -1360,8 +1447,8 @@ async function getTrending() { }); }); - document.querySelector(`div.feature[data-id='${el}'] > h3`).prepend(icon) - }) + document.querySelector(`div.feature[data-id='${el}'] > h3`).prepend(icon); + }); } async function getCommit() { @@ -1377,14 +1464,16 @@ async function getCommit() { } catch (err) {} } - var iconsclicks = 0; -document.querySelector(".searchbaricon")?.addEventListener("click", function () { - iconsclicks += 1; - if (iconsclicks > 9) { - chrome.tabs.create({ - url: "chrome-extension://" + chrome.runtime.id + "/extras/game/index.html", - }); - } -}) \ No newline at end of file +document + .querySelector(".searchbaricon") + ?.addEventListener("click", function () { + iconsclicks += 1; + if (iconsclicks > 9) { + chrome.tabs.create({ + url: + "chrome-extension://" + chrome.runtime.id + "/extras/game/index.html", + }); + } + }); diff --git a/extras/style.css b/extras/style.css index 5ac4ce29..ac351479 100644 --- a/extras/style.css +++ b/extras/style.css @@ -845,4 +845,36 @@ span.new-feature-tag.beta { body { overflow-y: hidden; +} + +.option-selection { + text-align: right; + width: 100%; +} + +.option-selection span { + border: 1.5px solid var(--feature-input-bg); + padding: .25rem; + padding-left: .5rem; + padding-right: .5rem; + user-select: none; + cursor: pointer; + background-color: transparent; + transition: background-color .3s, border .3s; +} + +.option-selection span.option-selected { + background-color: var(--theme); + color: white; + border: 1.5px solid var(--theme); +} + +.option-selection span:first-child { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem; +} + +.option-selection span:last-child { + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem; } \ No newline at end of file From 167cfe615566f982669e5e89354e9dead95b6d79 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Wed, 26 Jun 2024 23:36:56 -0700 Subject: [PATCH 027/253] Minor dropdown fixes --- extras/popup/popup.css | 33 +++++++++++++++++++++++++++++++++ extras/style.css | 3 ++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/extras/popup/popup.css b/extras/popup/popup.css index 794c95ff..b4874ec5 100644 --- a/extras/popup/popup.css +++ b/extras/popup/popup.css @@ -466,4 +466,37 @@ span.new-feature-tag.beta { .welcome { background-color: #fc8c4f20; border-bottom-color: #fc8c4f; +} + +.option-selection { + text-align: right; + width: 100%; +} + +.option-selection span { + border: 1.5px solid var(--feature-input-bg); + padding: .25rem; + padding-left: .5rem; + padding-right: .5rem; + user-select: none; + cursor: pointer; + background-color: transparent; + color: var(--secondary-color); + transition: background-color .3s, border .3s, color .3s; +} + +.option-selection span.option-selected { + background-color: var(--theme); + color: white; + border: 1.5px solid var(--theme); +} + +.option-selection span:first-child { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem; +} + +.option-selection span:last-child { + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem; } \ No newline at end of file diff --git a/extras/style.css b/extras/style.css index ac351479..71f829bb 100644 --- a/extras/style.css +++ b/extras/style.css @@ -860,7 +860,8 @@ body { user-select: none; cursor: pointer; background-color: transparent; - transition: background-color .3s, border .3s; + color: var(--secondary-color); + transition: background-color .3s, border .3s, color .3s; } .option-selection span.option-selected { From 030b195db7e8f1e10f16761bf1997b07f40fde01 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Fri, 28 Jun 2024 22:20:47 -0700 Subject: [PATCH 028/253] Update profile flags --- features/features.json | 3 +- features/profile-flag/data.json | 5 +- features/profile-flag/script.js | 243 +++----------------------------- features/profile-flag/style.css | 8 ++ 4 files changed, 34 insertions(+), 225 deletions(-) create mode 100644 features/profile-flag/style.css diff --git a/features/features.json b/features/features.json index 68ca9199..a716b9e3 100644 --- a/features/features.json +++ b/features/features.json @@ -107,7 +107,8 @@ { "version": 2, "id": "profile-flag", - "versionAdded": "v3.5.0" + "versionAdded": "v3.5.0", + "versionUpdated": "v3.10.0" }, { "version": 2, diff --git a/features/profile-flag/data.json b/features/profile-flag/data.json index 5f3556a6..aaf0aa66 100644 --- a/features/profile-flag/data.json +++ b/features/profile-flag/data.json @@ -7,5 +7,6 @@ "type": ["Website"], "tags": ["New"], "dynamic": true, - "scripts": [{ "file": "script.js", "runOn": "/users/*", "module": true }] -} + "styles": [{ "file": "style.css", "runOn": "/users/*" }], + "scripts": [{ "file": "script.js", "runOn": "/users/*" }] +} \ No newline at end of file diff --git a/features/profile-flag/script.js b/features/profile-flag/script.js index a0c7cfee..6edd2661 100644 --- a/features/profile-flag/script.js +++ b/features/profile-flag/script.js @@ -1,4 +1,4 @@ -export default async function ({ feature, console }) { +export default async function ({ feature }) { const locationElement = await ScratchTools.waitForElement( "p.profile-details > span.location" ); @@ -6,227 +6,26 @@ export default async function ({ feature, console }) { const locationText = locationElement.textContent.trim(); const countryFlag = getCountryFlag(locationText); if (!countryFlag) return; - const flagElement = document.createElement("span"); - flagElement.textContent = countryFlag; - flagElement.style.marginRight = "4px"; - feature.self.hideOnDisable(flagElement); - locationElement.insertBefore(flagElement, locationElement.firstChild); - function getCountryFlag(locationText) { - const flags = { - Afghanistan: "🇦🇫", - Albania: "🇦🇱", - Algeria: "🇩🇿", - "American Somoa": "🇦🇸", - Andorra: "🇦🇩", - Angola: "🇦🇴", - "Antigua and Barbuda": "🇦🇬", - Argentina: "🇦🇷", - Armenia: "🇦🇲", - Australia: "🇦🇺", - Austria: "🇦🇹", - Azerbaijan: "🇦🇿", - "Bahamas, The": "🇧🇸", - Bahrain: "🇧🇭", - Bangladesh: "🇧🇩", - Barbados: "🇧🇧", - Belarus: "🇧🇾", - Belgium: "🇧🇪", - Belize: "🇧🇿", - Benin: "🇧🇯", - Bhutan: "🇧🇹", - Bolivia: "🇧🇴", - "Bosnia and Herzegovina": "🇧🇦", - Botswana: "🇧🇼", - Brazil: "🇧🇷", - Brunei: "🇧🇳", - Bulgaria: "🇧🇬", - "Burkina Faso": "🇧🇫", - Burma: "🇲🇲", - Burundi: "🇧🇮", - "Cabo Verde": "🇨🇻", - Cambodia: "🇰🇭", - Cameroon: "🇨🇲", - Canada: "🇨🇦", - "Central African Republic": "🇨🇫", - Chad: "🇹🇩", - Chile: "🇨🇱", - China: "🇨🇳", - Colombia: "🇨🇴", - Comoros: "🇰🇲", - "Congo Free State, The": "🇨🇬", - "Costa Rica": "🇨🇷", - "Cote d’Ivoire (Ivory Coast)": "🇨🇮", - Croatia: "🇭🇷", - Cuba: "🇨🇺", - Cyprus: "🇨🇾", - Czechia: "🇨🇿", - Czechoslovakia: "🇨🇿", - "Democratic Republic of the Congo": "🇨🇩", - Denmark: "🇩🇰", - Djibouti: "🇩🇯", - Dominica: "🇩🇲", - "Dominican Republic": "🇩🇴", - "East Germany (German Democratic Republic)": "🇩🇪", - Ecuador: "🇪🇨", - Egypt: "🇪🇬", - "El Salvador": "🇸🇻", - "Equatorial Guinea": "🇬🇶", - Eritrea: "🇪🇷", - Estonia: "🇪🇪", - Eswatini: "🇸🇿", - Ethiopia: "🇪🇹", - Fiji: "🇫🇯", - Finland: "🇫🇮", - France: "🇫🇷", - Gabon: "🇬🇦", - "Gambia, The": "🇬🇲", - Georgia: "🇬🇪", - Germany: "🇩🇪", - Ghana: "🇬🇭", - Greece: "🇬🇷", - Grenada: "🇬🇩", - Guatemala: "🇬🇹", - Guinea: "🇬🇳", - "Guinea-Bissau": "🇬🇼", - Guyana: "🇬🇾", - Haiti: "🇭🇹", - Hanover: "🇩🇪", - "Hanseatic Republics": "🇩🇪", - Hawaii: "🇺🇸", - Hesse: "🇩🇪", - "Holy See": "🇻🇦", - Honduras: "🇭🇳", - Hungary: "🇭🇺", - Iceland: "🇮🇸", - India: "🇮🇳", - Indonesia: "🇮🇩", - Iran: "🇮🇷", - Iraq: "🇮🇶", - Ireland: "🇮🇪", - Israel: "🇮🇱", - Italy: "🇮🇹", - Jamaica: "🇯🇲", - Japan: "🇯🇵", - Jordan: "🇯🇴", - Kazakhstan: "🇰🇿", - Kenya: "🇰🇪", - Serbia: "🇷🇸", - Kiribati: "🇰🇮", - Korea: "🇰🇵", - Kosovo: "🇽🇰", - Kuwait: "🇰🇼", - Kyrgyzstan: "🇰🇬", - Laos: "🇱🇦", - Latvia: "🇱🇻", - Lebanon: "🇱🇧", - Lesotho: "🇱🇸", - Liberia: "🇱🇷", - Libya: "🇱🇾", - Liechtenstein: "🇱🇮", - Lithuania: "🇱🇹", - Luxembourg: "🇱🇺", - Madagascar: "🇲🇬", - Malawi: "🇲🇼", - Malaysia: "🇲🇾", - Maldives: "🇲🇻", - Mali: "🇲🇱", - Malta: "🇲🇹", - "Marshall Islands": "🇲🇭", - Mauritania: "🇲🇷", - Mauritius: "🇲🇺", - Mexico: "🇲🇽", - Micronesia: "🇫🇲", - Moldova: "🇲🇩", - Monaco: "🇲🇨", - Mongolia: "🇲🇳", - Montenegro: "🇲🇪", - Morocco: "🇲🇦", - Mozambique: "🇲🇿", - Namibia: "🇳🇦", - Nauru: "🇳🇷", - Nepal: "🇳🇵", - Netherlands: "🇳🇱", - "New Zealand": "🇳🇿", - Nicaragua: "🇳🇮", - Niger: "🇳🇪", - Nigeria: "🇳🇬", - "North Macedonia": "🇲🇰", - "Northern Mariana Islands": "🇲🇵", - Norway: "🇳🇴", - Oman: "🇴🇲", - Pakistan: "🇵🇰", - Palau: "🇵🇼", - "Palestine, State of": "🇵🇸", - Panama: "🇵🇦", - "Papua New Guinea": "🇵🇬", - Paraguay: "🇵🇾", - Peru: "🇵🇪", - Philippines: "🇵🇭", - Poland: "🇵🇱", - Portugal: "🇵🇹", - Qatar: "🇶🇦", - Romania: "🇷🇴", - Russia: "🇷🇺", - Rwanda: "🇷🇼", - "Saint Kitts and Nevis": "🇰🇳", - "Saint Lucia": "🇱🇨", - "Saint Vincent and the Grenadines": "🇻🇨", - Samoa: "🇼🇸", - "San Marino": "🇸🇲", - "Sao Tome and Principe": "🇸🇹", - "Saudi Arabia": "🇸🇦", - Senegal: "🇸🇳", - Serbia: "🇷🇸", - Seychelles: "🇸🇨", - "Sierra Leone": "🇸🇱", - Singapore: "🇸🇬", - Slovakia: "🇸🇰", - Slovenia: "🇸🇮", - "Solomon Islands": "🇸🇧", - Somalia: "🇸🇴", - "South Africa": "🇿🇦", - "South Sudan": "🇸🇸", - Spain: "🇪🇸", - "Sri Lanka": "🇱🇰", - Sudan: "🇸🇩", - Suriname: "🇸🇷", - Sweden: "🇸🇪", - Switzerland: "🇨🇭", - Syria: "🇸🇾", - Taiwan: "🇹🇼", - Tajikistan: "🇹🇯", - Tanzania: "🇹🇿", - Thailand: "🇹🇭", - "Timor-Leste": "🇹🇱", - Togo: "🇹🇬", - Tonga: "🇹🇴", - "Trinidad and Tobago": "🇹🇹", - Tunisia: "🇹🇳", - Turkey: "🇹🇷", - Turkmenistan: "🇹🇲", - Tuvalu: "🇹🇻", - Uganda: "🇺🇬", - Ukraine: "🇺🇦", - "United Arab Emirates": "🇦🇪", - "United Kingdom": "🇬🇧", - "United States": "🇺🇸", - Uruguay: "🇺🇾", - Uzbekistan: "🇺🇿", - Vanuatu: "🇻🇺", - Venezuela: "🇻🇪", - Vietnam: "🇻🇳", - Yemen: "🇾🇪", - Zambia: "🇿🇲", - Zimbabwe: "🇿🇼", - Antarctica: "🇦🇶", - "French Southern Territories": "🇹🇫", - "Bonaire, Sint Eustatius and Saba": " 🇧🇶", - "Christmas Island": "🇨🇽", - "Heard Island and McDonald Islands": "🇭🇲", - "Location not given": "❓", - }; + const imgElement = new Image(); + imgElement.src = countryFlag; + + ScratchTools.appendToSharedSpace({ + space: "afterProfileCountry", + element: imgElement, + order: -1, + }); - return flags[locationText] || ""; + feature.self.hideOnDisable(locationHolder); + + function getCountryFlag(locationText) { + const GithubUrl = "https://raw.githubusercontent.com/STForScratch/data/main/flags/"; + const countryName = locationText.toLowerCase() + .replaceAll(" ", "-") + .replaceAll("(", "") + .replaceAll(")", "") + .replaceAll(",", "") + .replaceAll(".", "") + ".svg"; + return GithubUrl + countryName; } -} +} \ No newline at end of file diff --git a/features/profile-flag/style.css b/features/profile-flag/style.css new file mode 100644 index 00000000..4eac1182 --- /dev/null +++ b/features/profile-flag/style.css @@ -0,0 +1,8 @@ +.location img { + width: 15px; + height: auto; + margin-top: -1rem; + position: relative; + bottom: -.25rem; + margin-left: .4rem; +} From 18104138d9d9c6b6f617b4c13c2f90c59edef7ea Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Fri, 28 Jun 2024 22:29:17 -0700 Subject: [PATCH 029/253] Add `feature.page` API --- api/feature/index.js | 5 +++++ features/profile-flag/script.js | 1 + 2 files changed, 6 insertions(+) diff --git a/api/feature/index.js b/api/feature/index.js index f6fbed93..703f2524 100644 --- a/api/feature/index.js +++ b/api/feature/index.js @@ -7,5 +7,10 @@ export default function (data) { feature.self = self(data.id); feature.traps = traps() feature.auth = auth() + feature.page = { + appendToSharedSpace: ScratchTools.appendToSharedSpace, + waitForElement: ScratchTools.waitForElement, + waitForElements: ScratchTools.waitForElements, + } return feature; } diff --git a/features/profile-flag/script.js b/features/profile-flag/script.js index a0c7cfee..f9b70766 100644 --- a/features/profile-flag/script.js +++ b/features/profile-flag/script.js @@ -1,4 +1,5 @@ export default async function ({ feature, console }) { + window.feature = feature const locationElement = await ScratchTools.waitForElement( "p.profile-details > span.location" ); From bab9dee033f77bb62eb52d04e45d5b252fa31307 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 30 Jun 2024 08:23:06 -0400 Subject: [PATCH 030/253] Update data.json --- features/project-miniplayer/data.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/project-miniplayer/data.json b/features/project-miniplayer/data.json index 160cffed..58ab3b80 100644 --- a/features/project-miniplayer/data.json +++ b/features/project-miniplayer/data.json @@ -8,8 +8,8 @@ "tags": ["New", "Featured"], "dynamic": true, "options": [ - { "id": "position-right", "name": "Place the player to the right.", "type": 1 }, - { "id": "position-bottom", "name": "Place the player to the bottom.", "type": 1 }, + { "id": "position-right", "name": "Move the player to the right.", "type": 1 }, + { "id": "position-bottom", "name": "Move the player to the bottom.", "type": 1 }, { "id": "opacity", "name": "Player Transparency (0% - 90%)", "type": 2 } ], "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], From 8cb45005c091d75ac660849e2d1be110a4a44b15 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 30 Jun 2024 08:50:53 -0400 Subject: [PATCH 031/253] Another fix Co-authored-by: Niko <150537842+OneShot-Niko@users.noreply.github.com> --- features/project-miniplayer/data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/project-miniplayer/data.json b/features/project-miniplayer/data.json index 58ab3b80..11c2fffb 100644 --- a/features/project-miniplayer/data.json +++ b/features/project-miniplayer/data.json @@ -9,7 +9,7 @@ "dynamic": true, "options": [ { "id": "position-right", "name": "Move the player to the right.", "type": 1 }, - { "id": "position-bottom", "name": "Move the player to the bottom.", "type": 1 }, + { "id": "position-bottom", "name": "Move the project player to the bottom.", "type": 1 }, { "id": "opacity", "name": "Player Transparency (0% - 90%)", "type": 2 } ], "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], From 8b6afaf817f8e1921673691517f693ea39da81fc Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 30 Jun 2024 08:51:41 -0400 Subject: [PATCH 032/253] Fix --- features/project-miniplayer/data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/project-miniplayer/data.json b/features/project-miniplayer/data.json index 11c2fffb..5656a1a0 100644 --- a/features/project-miniplayer/data.json +++ b/features/project-miniplayer/data.json @@ -8,7 +8,7 @@ "tags": ["New", "Featured"], "dynamic": true, "options": [ - { "id": "position-right", "name": "Move the player to the right.", "type": 1 }, + { "id": "position-right", "name": "Move the project player to the right.", "type": 1 }, { "id": "position-bottom", "name": "Move the project player to the bottom.", "type": 1 }, { "id": "opacity", "name": "Player Transparency (0% - 90%)", "type": 2 } ], From a0587548137ba9e528780ce8d5bcd20d9d51868f Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 30 Jun 2024 10:18:14 -0700 Subject: [PATCH 033/253] Update v3.9.0 translations --- extras/feature-locales/es.json | 540 +++++++++---------------------- extras/feature-locales/ja.json | 568 ++++++++++----------------------- extras/feature-locales/tr.json | 568 +++++++++------------------------ 3 files changed, 471 insertions(+), 1205 deletions(-) diff --git a/extras/feature-locales/es.json b/extras/feature-locales/es.json index 7bac9ccf..096dc77d 100644 --- a/extras/feature-locales/es.json +++ b/extras/feature-locales/es.json @@ -1,37 +1,29 @@ { - "fullscreen-explorer/title": { - "message": "Cuadrículas de proyectos de pantalla completa" - }, - "fullscreen-explorer/description": { - "message": "Encuentre proyectos en la pantalla grande eliminando los espacios en blanco izquierdo y derecho en las páginas Tendencias, Búsqueda y Remezcla." - }, - "total-stats/title": { - "message": "Estadísticas totales de usuarios" - }, - "total-stats/description": { - "message": "Junto a los proyectos compartidos en el perfil de un usuario, se muestra el total de amores, favoritos y vistas que el usuario ha recibido en todos sus proyectos compartidos." - }, - "project-miniplayer/title": { - "message": "Minijugador del proyecto" + "stage-in-spritepane/title": { "message": "Etapa en el panel de sprites" }, + "stage-in-spritepane/description": { + "message": "Mueva el botón de escenario al panel de sprites para ampliar el campo de sprites." }, - "project-miniplayer/description": { - "message": "Desplázate hacia abajo en la página del proyecto y verás automáticamente el minireproductor del proyecto." - }, - "project-descriptions/title": { - "message": "Descripciones resumidas" + "better-cloud-history/title": { "message": "Mejor historial de la nube" }, + "better-cloud-history/description": { + "message": "Actualiza la página del monitor de la nube a una versión más moderna con más detalles. Puede hacer clic en los nombres de las variables para ordenar por esa variable." }, - "project-descriptions/description": { - "message": "Utiliza inteligencia artificial para resumir las descripciones de los proyectos cuando lo desees, y acorta las descripciones largas a información importante, como las instrucciones del juego." + "sprite-layers/title": { "message": "Ver capas de sprites" }, + "sprite-layers/description": { + "message": "Le permite pasar el cursor sobre la opción mostrar/ocultar en el panel de propiedades de sprites del editor para ver las capas de sprites." }, - "pin-comments/title": { - "message": "Anclar comentarios del proyecto" + "hide-project-tags/title": { "message": "Ocultar etiquetas de proyecto" }, + "hide-project-tags/description": { + "message": "Oculta todas las etiquetas de las Instrucciones/Notas y Créditos de los proyectos." }, - "pin-comments/description": { - "message": "Le permite anclar comentarios en sus propios proyectos y ver qué comentarios están anclados en otros proyectos." + "snap-to-grid/title": { "message": "Ajustar scripts a la cuadrícula" }, + "snap-to-grid/description": { + "message": "Alinea automáticamente los guiones con la cuadrícula de puntos en el editor cuando se colocan." }, - "sidebar/title": { - "message": "Barra lateral" + "select-self/title": { "message": "Seleccione el sprite actual" }, + "select-self/description": { + "message": "Le permite seleccionar el sprite actual al abrir menús desplegables de sprites, en lugar de solo otros sprites." }, + "sidebar/title": { "message": "Barra lateral" }, "sidebar/description": { "message": "Agrega una barra lateral a la página de Scratch, en vez de sólo la barra de navegación en la parte superior de la pantalla." }, @@ -41,57 +33,61 @@ "project-version-detector/description": { "message": "Comprueba cuándo se ha compartido un proyecto y añade una etiqueta junto a la fecha de uso compartido para indicar qué versión de Scratch estaba en uso en ese momento." }, - "download-project/title": { - "message": "Descargar Proyectos" + "fullscreen-explorer/title": { + "message": "Cuadrículas de proyectos de pantalla completa" + }, + "fullscreen-explorer/description": { + "message": "Encuentre proyectos en la pantalla grande eliminando los espacios en blanco izquierdo y derecho en las páginas Tendencias, Búsqueda y Remezcla." + }, + "project-descriptions/title": { "message": "Descripciones resumidas" }, + "project-descriptions/description": { + "message": "Utiliza inteligencia artificial para resumir las descripciones de los proyectos cuando lo desees, y acorta las descripciones largas a información importante, como las instrucciones del juego." + }, + "total-stats/title": { "message": "Estadísticas totales de usuarios" }, + "total-stats/description": { + "message": "Junto a los proyectos compartidos en el perfil de un usuario, se muestra el total de amores, favoritos y vistas que el usuario ha recibido en todos sus proyectos compartidos." + }, + "project-miniplayer/title": { "message": "Minijugador del proyecto" }, + "project-miniplayer/description": { + "message": "Desplázate hacia abajo en la página del proyecto y verás automáticamente el minireproductor del proyecto." + }, + "pin-comments/title": { "message": "Anclar comentarios del proyecto" }, + "pin-comments/description": { + "message": "Le permite anclar comentarios en sus propios proyectos y ver qué comentarios están anclados en otros proyectos." }, + "download-project/title": { "message": "Descargar Proyectos" }, "download-project/description": { "message": "Agrega un botón en los proyectos que te permite descargar el proyecto como un archivo sb3." }, - "blur-modal/title": { - "message": "Borronear fondos modales" - }, + "blur-modal/title": { "message": "Borronear fondos modales" }, "blur-modal/description": { "message": "Borronea los fondos de los modales en lugar de tener una superposición de color." }, - "quick-search/title": { - "message": "Búsqueda rápida" - }, + "quick-search/title": { "message": "Búsqueda rápida" }, "quick-search/description": { "message": "Salta entre páginas fácilmente en la página web de Scratch con Control + K." }, - "favicon-messages/title": { - "message": "Contador de mensajes" - }, + "favicon-messages/title": { "message": "Contador de mensajes" }, "favicon-messages/description": { "message": "Muestra el contador de mensajes en el logo de Scratch en la esquina superior izquierda del menú principal." }, - "show-emoji-names/title": { - "message": "Mostrar los nombres de los emojis" - }, + "show-emoji-names/title": { "message": "Mostrar los nombres de los emojis" }, "show-emoji-names/description": { "message": "Te permite ver los nombres de los emojis en los comentarios cuando pases el cursor por encima de ellos." }, - "more-block-themes/title": { - "message": "Más temáticas para bloques" - }, + "more-block-themes/title": { "message": "Más temáticas para bloques" }, "more-block-themes/description": { "message": "Agrega temáticas adicionales en el editor de bloques." }, - "more-key-inputs/title": { - "message": "Más entradas de teclas" - }, + "more-key-inputs/title": { "message": "Más entradas de teclas" }, "more-key-inputs/description": { "message": "Agrega soporte para más teclas en los bloques de \"tecla presionada\"." }, - "comment-tags/title": { - "message": "Etiquetas para comentarios del editor" - }, + "comment-tags/title": { "message": "Etiquetas para comentarios del editor" }, "comment-tags/description": { "message": "Agrega etiquetas a los comentarios del editor para organizarlos fácilmente." }, - "profile-flag/title": { - "message": "Bandera en el perfil" - }, + "profile-flag/title": { "message": "Bandera en el perfil" }, "profile-flag/description": { "message": "Agrega emojis de banderas cerca de ubicaciones seleccionadas en las páginas de perfil." }, @@ -101,9 +97,7 @@ "follow-on-projects/description": { "message": "Sigue a usuarios directamente desde la página de un proyecto en vez de yendo hacia su perfil." }, - "dark-paint-editor/title": { - "message": "Cambiar tono del fondo del editor" - }, + "dark-paint-editor/title": { "message": "Cambiar tono del fondo del editor" }, "dark-paint-editor/description": { "message": "Agrega un botón al lado de los controles de zoom en el editor de sprites que te permite cambiar el tono de su fondo entre claro y oscuro." }, @@ -113,159 +107,103 @@ "specific-replies/description": { "message": "En los mensajes relacionados a comentarios, se especifica a quién un comentario estaba respondiendo." }, - "better-trending-thumbnails/title": { - "message": "Miniaturas más grandes" - }, + "better-trending-thumbnails/title": { "message": "Miniaturas más grandes" }, "better-trending-thumbnails/description": { "message": "Actualiza las miniaturas en la página de tendencias y búsqueda para que sean más grandes y encajen mejor en el cuadro del proyecto." }, - "relevant-forum-posts/title": { - "message": "Mostrar publicaciones del foro relevantes" - }, - "relevant-forum-posts/description": { - "message": "Al crear un nuevo tema en el foro, muestra otros temas que pueden ser similares al tuyo." - }, - "anti-generic/title": { - "message": "Anti-genérico" - }, + "anti-generic/title": { "message": "Anti-genérico" }, "anti-generic/description": { "message": "En las páginas de explorar y tendencia, esta función beta automácitamente esconde proyectos repetitivos, junto con proyectos que parecen genéricos. Esto incluye proyectos con muchas etiquetas, nombres comúnes, y proyectos duplicados." }, - "wrap-lists/title": { - "message": "Romper ítems en las listas" - }, + "wrap-lists/title": { "message": "Romper ítems en las listas" }, "wrap-lists/description": { "message": "Muestra el texto en los ítems de las listas normalmente sin cortarlos si son demasiado largos." }, - "live-stats/title": { - "message": "Estadísticas en tiempo real" - }, + "live-stats/title": { "message": "Estadísticas en tiempo real" }, "live-stats/description": { "message": "Actualiza en tiempo real los corazones, favoritos, remixes y vistas en un proyecto, sin tener que refrescar la página para actualizarlo." }, - "hide-scratch-news/title": { - "message": "Esconder las Noticias de Scratch" - }, + "hide-scratch-news/title": { "message": "Esconder las Noticias de Scratch" }, "hide-scratch-news/description": { "message": "Esconde la sección de \"Noticias de Scratch\" en la página principal de Scratch." }, - "watch-later/title": { - "message": "Guardar para ver más tarde" - }, + "watch-later/title": { "message": "Guardar para ver más tarde" }, "watch-later/description": { "message": "Te permite guardar proyectos que quieras ver luego, y aparecerán en una página Ver más tarde." }, - "remove-project-button/title": { - "message": "Botón para eliminar proyecto" - }, + "remove-project-button/title": { "message": "Botón para eliminar proyecto" }, "remove-project-button/description": { "message": "Agrega un botón a los proyectos en los Estudios, que te permite fácilmente eliminarlos de ellos sin tener que abrir el menú." }, - "right-side-flag/title": { - "message": "Bandera verde en la derecha" - }, + "right-side-flag/title": { "message": "Bandera verde en la derecha" }, "right-side-flag/description": { "message": "Mueve la bandera verde y el ícono de detener hacia el lado derecho del escenario." }, - "love-fave-animate/title": { - "message": "Animaciones a los corazones" - }, + "love-fave-animate/title": { "message": "Animaciones a los corazones" }, "love-fave-animate/description": { "message": "Al hacer clic en el corazón y el favorito en los proyectos, estos serán animados." }, - "default-to-local/title": { - "message": "Local por defecto" - }, + "default-to-local/title": { "message": "Local por defecto" }, "default-to-local/description": { "message": "Al crear una nueva variable, establece el modo predeterminado de ella como \"Sólo para este sprite\", en vez de \"Para todos los sprites\"." }, - "start-stop-hotkeys/title": { - "message": "Atajos para la bandera verde" - }, + "start-stop-hotkeys/title": { "message": "Atajos para la bandera verde" }, "start-stop-hotkeys/description": { "message": "Presiona Control + G para comenzar o detener un proyecto, dependiendo de si este está en curso o no." }, - "opacity-slider/title": { - "message": "Barra de opacidad" - }, + "opacity-slider/title": { "message": "Barra de opacidad" }, "opacity-slider/description": { "message": "Agrega una barra deslizante en el editor de sprites que te permite cambiar la opacidad de ellos." }, - "more-studios/title": { - "message": "Más estudios" - }, + "more-studios/title": { "message": "Más estudios" }, "more-studios/description": { "message": "Te permite agregar proyectos a más estudios en lugar de 20." }, - "localized-explore/title": { - "message": "Proyectos de tu país" - }, + "localized-explore/title": { "message": "Proyectos de tu país" }, "localized-explore/description": { "message": "En la página de Explorar, hace menos visibles a los proyectos que provienen de otros países. Esto es para sólo mostrar proyectos que tú entiendas." }, - "project-bar/title": { - "message": "Barra de proyecto" - }, + "project-bar/title": { "message": "Barra de proyecto" }, "project-bar/description": { "message": "Continúa viendo la información de un proyecto, incluso luego de que hayas deslizado tras las notas y créditos." }, - "more-news/title": { - "message": "Más Noticias de Scratch" - }, + "more-news/title": { "message": "Más Noticias de Scratch" }, "more-news/description": { "message": "En la página principal, podrás deslizar por la sección de Noticias de Scratch y cargar más resultados." }, - "dumpster-fire/title": { - "message": "Basurero en llamas" - }, + "dumpster-fire/title": { "message": "Basurero en llamas" }, "dumpster-fire/description": { "message": "La página principal de Scratch es mentirosa con su sección de \"Proyectos destacados\". Esto le cambia su nombre a uno mucho más adecuado." }, - "steal-game/title": { - "message": "Robar juego" - }, + "steal-game/title": { "message": "Robar juego" }, "steal-game/description": { "message": "Cambia el texto del botón de Remix a \"Robar juego\"." }, - "statistics/title": { - "message": "Estadísticas" - }, + "statistics/title": { "message": "Estadísticas" }, "statistics/description": { "message": "Añade un botón de estadísticas en la página de \"Mis Cosas\" que enlaza a tu perfil de ScratchStats." }, - "echo-effect/title": { - "message": "Efecto de eco" - }, + "echo-effect/title": { "message": "Efecto de eco" }, "echo-effect/description": { "message": "Añade el efecto de eco de vuelta al editor de sonido de Scratch." }, - "compact-buttons/title": { - "message": "Botones compactos" - }, + "compact-buttons/title": { "message": "Botones compactos" }, "compact-buttons/description": { "message": "El texto de los botones es eliminado y recibe un nuevo icono si no lo tiene." }, - "message-count/title": { - "message": "Contador de mensajes" - }, + "message-count/title": { "message": "Contador de mensajes" }, "message-count/description": { "message": "Muestra el contador de mensajes de el usuario al lado de su país." }, - "move-share-button/title": { - "message": "Mover botón de compartir" - }, + "move-share-button/title": { "message": "Mover botón de compartir" }, "move-share-button/description": { "message": "En la página del proyecto, mueve el botón de compartir al lado de el botón de \"Ver dentro\"" }, - "preview-textboxes/title": { - "message": "Vista previa de cuadros de texto" - }, + "preview-textboxes/title": { "message": "Vista previa de cuadros de texto" }, "preview-textboxes/description": { "message": "Tenga una vista previa de tus apartados de \"Acerca de mí\" y \"En qué estoy trabajando\" y las Instrucciones y Notas y Créditos de tus proyectos para ver como se ve para otros usuarios." }, - "more-tutorials/title": { - "message": "Más tutoriales" - }, + "more-tutorials/title": { "message": "Más tutoriales" }, "more-tutorials/description": { "message": "En la página de Ideas, añade tutoriales adicionales de otros Scratchers." }, @@ -275,33 +213,19 @@ "simplify-action-buttons/description": { "message": "Muestra los botones de acción debajo de Notas y Créditos como sus iconos." }, - "slash-to-search/title": { - "message": "Barra para buscar" - }, + "slash-to-search/title": { "message": "Barra para buscar" }, "slash-to-search/description": { "message": "Pulse la tecla de barra (/) para seleccionar la barra de búsqueda." }, - "shared-clipboard/title": { - "message": "Portapapeles compartido" - }, + "shared-clipboard/title": { "message": "Portapapeles compartido" }, "shared-clipboard/description": { "message": "Permite copiar y pegar entre editores de disfraces de distintos proyectos." }, - "important-messages/title": { - "message": "Mensajes importantes" - }, - "important-messages/description": { - "message": "Separa mensajes importantes en la página de mensajes." - }, - "hide-footer/title": { - "message": "Ocultar pie de página" - }, + "hide-footer/title": { "message": "Ocultar pie de página" }, "hide-footer/description": { "message": "El pie de página ocupa mucho espacio innecesario, !así que ocúltalo!" }, - "original-colors/title": { - "message": "Revertir a azul" - }, + "original-colors/title": { "message": "Revertir a azul" }, "original-colors/description": { "message": "Cambia todos los colores de la página web de Scratch de vuelta a el color original de 3.0, previo al morado." }, @@ -311,21 +235,15 @@ "simplify-editor-tabs/description": { "message": "Cambia las ventanas del editor a un icono en un circulo." }, - "live-character-counts/title": { - "message": "Contador de caracteres" - }, + "live-character-counts/title": { "message": "Contador de caracteres" }, "live-character-counts/description": { "message": "En foros, estudios y paginas de proyecto, muestra el contador de caracteres en los cuadros de texto." }, - "advanced-search/title": { - "message": "Buscar perfiles" - }, + "advanced-search/title": { "message": "Buscar perfiles" }, "advanced-search/description": { "message": "Cuando busques un usuario, un link a su perfil estará al principio de la página." }, - "studio-links/title": { - "message": "Enlaces de estudio como títulos" - }, + "studio-links/title": { "message": "Enlaces de estudio como títulos" }, "studio-links/description": { "message": "Reemplaza enlaces de estudio con sus títulos," }, @@ -335,51 +253,35 @@ "block-studios/description": { "message": "Desactiva los mensajes de actividad de estudios especificos." }, - "block-messages/title": { - "message": "Bloquear usuarios" - }, + "block-messages/title": { "message": "Bloquear usuarios" }, "block-messages/description": { "message": "Esconde mensajes de otros usuarios que has bloqueado. Otros usuarios no sabrán que los has bloqueado." }, - "two-colors/title": { - "message": "Colores 2.0 para bloques" - }, + "two-colors/title": { "message": "Colores 2.0 para bloques" }, "two-colors/description": { "message": "Reemplaza los colores de los bloques en el editor con los de la versión 2.0" }, - "project-links/title": { - "message": "Enlaces de proyecto como títulos" - }, + "project-links/title": { "message": "Enlaces de proyecto como títulos" }, "project-links/description": { "message": "Reemplaza enlaces de proyecto con sus títulos" }, - "emoji-status/title": { - "message": "Estados de emoji" - }, + "emoji-status/title": { "message": "Estados de emoji" }, "emoji-status/description": { "message": "Pon un emoji como estado de tu perfil. Otros usuarios de ScratchTools podrán ver este estado-" }, - "display-name/title": { - "message": "Nombres de muestra" - }, + "display-name/title": { "message": "Nombres de muestra" }, "display-name/description": { "message": "Muestra nombres de muestra para Scratchers y permite ponerte tu propio nombre de muestra. Los nombres de muestra están al lado de tu nombre de usuario y no están limitados como este." }, - "isonline/title": { - "message": "Mostrar si el usuario esta en línea" - }, + "isonline/title": { "message": "Mostrar si el usuario esta en línea" }, "isonline/description": { "message": "En las páginas de perfiles, muestra si un usuario está en línea. También mostrara a otros usuarios si tú estás en línea. " }, - "plain-background/title": { - "message": "Fondo plano" - }, + "plain-background/title": { "message": "Fondo plano" }, "plain-background/description": { "message": "Oculta los puntos del fondo de el editor de código." }, - "hide-advertisements/title": { - "message": "Ocultar anuncios en comentarios" - }, + "hide-advertisements/title": { "message": "Ocultar anuncios en comentarios" }, "hide-advertisements/description": { "message": "Esconde los anuncios en los comentarios de perfiles, proyectos y estudios. Pueden llegar a ocupar un gran espacio en los comentarios." }, @@ -389,9 +291,7 @@ "hide-block-category-names/description": { "message": "Cambia las categorías de bloques en el editor para solo mostrar los colores de las categorias." }, - "unlisted-projects/title": { - "message": "Proyectos ocultos" - }, + "unlisted-projects/title": { "message": "Proyectos ocultos" }, "unlisted-projects/description": { "message": "Le permite generar enlaces para compartir proyectos no compartidos en el editor." }, @@ -401,33 +301,23 @@ "stats-percentages/description": { "message": "En la página de \"Mis Cosas\", pon el ratón sobre el número de favoritos y número de corazones para ver el porcentaje de visitantes que hicieron la acción." }, - "clone-counter/title": { - "message": "Contador de clones" - }, + "clone-counter/title": { "message": "Contador de clones" }, "clone-counter/description": { "message": "Muestra el número total de clones encima del proyecto, en el encabezado de el escenario." }, - "colored-shadows/title": { - "message": "Sombras coloreadas" - }, + "colored-shadows/title": { "message": "Sombras coloreadas" }, "colored-shadows/description": { "message": "Reemplaza la sombra creada cuando arrastras un bloque cerca de otro bloque con el color del bloque que está siendo movido." }, - "creator-badge/title": { - "message": "Insignia de autor" - }, + "creator-badge/title": { "message": "Insignia de autor" }, "creator-badge/description": { "message": "Añade una insignia al lado de los comentarios escritos por el autor del proyecto" }, - "original-buttons/title": { - "message": "Botones originales" - }, + "original-buttons/title": { "message": "Botones originales" }, "original-buttons/description": { "message": "Trae devuelta los íconos originales de Me Gusta, Favorito, Reinventar y Vistas en las páginas de proyectos de Scratch." }, - "box-shadows/title": { - "message": "Sombras en los recuadros de contenido" - }, + "box-shadows/title": { "message": "Sombras en los recuadros de contenido" }, "box-shadows/description": { "message": "Agrega un sombreado a los contornos de todos los recuadros de contenido. El sombreado se hará más oscuro cuando pases el cursor por ellos." }, @@ -437,15 +327,11 @@ "admin-notifications/description": { "message": "Si tienes una notificación por parte del Equipo de Scratch, el indicador de mensajes será rojo en vez de naranja." }, - "nicknames/title": { - "message": "Apodos" - }, + "nicknames/title": { "message": "Apodos" }, "nicknames/description": { "message": "Ponle apodos a otros Scratchers. Solo tú puedes ver los apodos, que reemplazarán el nombre del usuario apodado." }, - "load-more-forum-posts/title": { - "message": "Cargar más entradas" - }, + "load-more-forum-posts/title": { "message": "Cargar más entradas" }, "load-more-forum-posts/description": { "message": "Cargue más publicaciones en el foro sin tener que cambiar de página." }, @@ -455,42 +341,26 @@ "scroll-project-titles/description": { "message": "Permite ver el nombre entero de los proyectos que no son tuyos." }, - "search-context-menus/title": { - "message": "Buscar en menús contextuales" - }, + "search-context-menus/title": { "message": "Buscar en menús contextuales" }, "search-context-menus/description": { "message": "Escribe y busca menus de contexto para seleccionar una opción eficientemente. También puedes pulsar \"enter\" para seleccionar la opción superior." }, - "hover-user-cards/title": { - "message": "Tarjetas de usuarios" - }, + "hover-user-cards/title": { "message": "Tarjetas de usuarios" }, "hover-user-cards/description": { "message": "Mantén el ratón sobre cualquier nombre de usuario para mostrar la foto de perfil. nombre de usuario y número de seguidores." }, - "exact-join-date/title": { - "message": "Fecha exacta de ingreso" - }, + "exact-join-date/title": { "message": "Fecha exacta de ingreso" }, "exact-join-date/description": { "message": "Muestra en su perfil el momento exacto en el que un usuario se unió." }, - "upload-img-directly/title": { - "message": "Subida de imágenes directa" - }, + "upload-img-directly/title": { "message": "Subida de imágenes directa" }, "upload-img-directly/description": { "message": "Te permite subir imagenes en los foros de Scratch para publicaciones y firmas sin tener que usar ningún servicio de subida de imágenes de terceros." }, - "leave-studio/title": { - "message": "Botón de salir de estudio" - }, + "leave-studio/title": { "message": "Botón de salir de estudio" }, "leave-studio/description": { "message": "Añade un botón en la página de curadores de cualquier estudio que estés curando o administrando que te permite salir de dicho estudio fácilmente. Primero se mostrará una confirmación." }, - "user-stats/title": { - "message": "Mostrar estadísticas de usuario" - }, - "user-stats/description": { - "message": "Reemplaza la sección de \"En qué estoy trabajando\" en una página de perfil con las estadísticas del usuario." - }, "frontpage-curator/title": { "message": "Nombre de curador de la página principal como enlace" }, @@ -503,15 +373,11 @@ "minimized-remix-credits/description": { "message": "Los cuadros de créditos de reinvención en los proyectos ocupa espacio de las Instrucciones del proyecto, entonces esto hace las cajas más pequeñas." }, - "follows-you/title": { - "message": "Mostrar si te siguen en perfil" - }, + "follows-you/title": { "message": "Mostrar si te siguen en perfil" }, "follows-you/description": { "message": "Si un usuario te sigue, se mostrará al lado de su nombre de usuario cuando visites su perfil." }, - "custom-studio/title": { - "message": "Sección de estudio personalizada" - }, + "custom-studio/title": { "message": "Sección de estudio personalizada" }, "custom-studio/description": { "message": "En la página principal, los proyectos más recientes de el estudio de tu elección se mostraran encima de Proyectos Destacados." }, @@ -521,15 +387,7 @@ "highlight-unanswered/description": { "message": "Agrega un marcador azul a los temas sin respuestas en los foros." }, - "hide-project-tags/title": { - "message": "Ocultar etiquetas de proyecto" - }, - "hide-project-tags/description": { - "message": "Oculta todas las etiquetas de las Instrucciones/Notas y Créditos de los proyectos." - }, - "search-assets/title": { - "message": "Buscar archivos" - }, + "search-assets/title": { "message": "Buscar archivos" }, "search-assets/description": { "message": "Busca disfraces y sonidos en el editor." }, @@ -539,9 +397,7 @@ "block-count-in-mystuff/description": { "message": "Muestra el número de bloques de los proyectos en la página de \"Mis Cosas\"" }, - "pause-audio/title": { - "message": "Pausar audio" - }, + "pause-audio/title": { "message": "Pausar audio" }, "pause-audio/description": { "message": "Permite pausar y reanudar audio en el editor de audio de Scratch." }, @@ -551,15 +407,11 @@ "display-message-count-in-icon/description": { "message": "Muestra tu número de mensajes en el icono de extensión de ScratchTools." }, - "colored-context-menus/title": { - "message": "Menús de contexto coloridos" - }, + "colored-context-menus/title": { "message": "Menús de contexto coloridos" }, "colored-context-menus/description": { "message": "Como en Scratch 2.0, se colorea el menú contextual (el del clic derecho) en base al color del bloque correspondiente." }, - "left-side-stage/title": { - "message": "Escenario en la izquierda" - }, + "left-side-stage/title": { "message": "Escenario en la izquierda" }, "left-side-stage/description": { "message": "Como en Scratch 2.0, mueve el escenario a el lado izquierdo del editor en vez del derecho." }, @@ -575,15 +427,11 @@ "hide-disabled-menu-options/description": { "message": "Las opciones de menús contextuales en el editor se muestran aunque estén deshabilitadas y no se puedan usar, esta función las esconderá si lo están." }, - "follower-count/title": { - "message": "Contador de seguidores en proyectos" - }, + "follower-count/title": { "message": "Contador de seguidores en proyectos" }, "follower-count/description": { "message": "Muestra el número de seguidores del creador del proyecto." }, - "hide-studio-borders/title": { - "message": "Esconder marcos de estudios" - }, + "hide-studio-borders/title": { "message": "Esconder marcos de estudios" }, "hide-studio-borders/description": { "message": "Elimina los marcos extraños alrededor de las imágenes de los estudios en las páginas 2.0." }, @@ -611,15 +459,11 @@ "hide-studio-messages/description": { "message": "Esconde los mensajes sobre la actividad de estudios en el correo – Se apilan rápido y pueden ser una molestia." }, - "special-editor-fonts/title": { - "message": "Más fuentes en el editor" - }, + "special-editor-fonts/title": { "message": "Más fuentes en el editor" }, "special-editor-fonts/description": { "message": "Agrega más fuentes de texto para escoger en el editor de sprites. Se ven más agradables y modernos." }, - "get-project-tags/title": { - "message": "Mostrar etiquetas de proyectos" - }, + "get-project-tags/title": { "message": "Mostrar etiquetas de proyectos" }, "get-project-tags/description": { "message": "Cataloga todas las etiquetas usadas en la descripción de los proyectos justo debajo de las notas y créditos." }, @@ -641,9 +485,7 @@ "cloud-scratchers/description": { "message": "En los proyectos multijugador, se mostrarán todos los usuarios que actualmente lo juegan." }, - "editor-in-two/title": { - "message": "Editor 2.0" - }, + "editor-in-two/title": { "message": "Editor 2.0" }, "editor-in-two/description": { "message": "Reemplaza el editor 3.0 de Scratch con el editor de la versión 2.0. Es nostálgico, en serio." }, @@ -659,21 +501,15 @@ "turbowarp-button-in-editor/description": { "message": "Añade un botón al editor para que puedas abrir instantáneamente un proyecto en TurboWarp." }, - "sprite-clones/title": { - "message": "Contador de clones de sprites" - }, + "sprite-clones/title": { "message": "Contador de clones de sprites" }, "sprite-clones/description": { "message": "Muestra el contador de clones por cada sprite individual." }, - "block-log/title": { - "message": "Registro de bloques" - }, + "block-log/title": { "message": "Registro de bloques" }, "block-log/description": { "message": "Registra y muestra toda la información de deshacer en el editor cuando presiones Control + Shift + L." }, - "scrollable-list-items/title": { - "message": "Lista desplazable de valores" - }, + "scrollable-list-items/title": { "message": "Lista desplazable de valores" }, "scrollable-list-items/description": { "message": "Los valores de una lista que sean más largos que ella serán parcialmente mostrados. Ahora puedes desplazarte por la lista horizontalmente." }, @@ -683,15 +519,11 @@ "custom-fonts/description": { "message": "En la web de Scratch, podrás poner la fuente que quieras, siempre y cuando esté en la pagina de Google Fonts. Esto distingue entre mayúsculas y minúsculas." }, - "project-timer/title": { - "message": "Cronómetro del proyecto" - }, + "project-timer/title": { "message": "Cronómetro del proyecto" }, "project-timer/description": { "message": "Muestra la cantidad de tiempo (en segundos) en la que el proyecto ha estado funcionando." }, - "colored-comments/title": { - "message": "Comentarios coloridos en el editor" - }, + "colored-comments/title": { "message": "Comentarios coloridos en el editor" }, "colored-comments/description": { "message": "Colorea los comentarios en el editor basado en el color del bloque que comentan." }, @@ -701,39 +533,27 @@ "recently-viewed-projects/description": { "message": "Añade una pestaña a la pagina de Mis Cosas donde puedes ver una lista de los últimos proyectos que viste." }, - "collapse-blocks/title": { - "message": "Colapsar bloques" - }, + "collapse-blocks/title": { "message": "Colapsar bloques" }, "collapse-blocks/description": { "message": "En el menú de clic derecho del editor ahora habrá un botón que te permite colapsar el bloque seleccionado." }, - "set-featured-project/title": { - "message": "Establecer proyecto destacado" - }, + "set-featured-project/title": { "message": "Establecer proyecto destacado" }, "set-featured-project/description": { "message": "En cualquier página de proyecto, podrás establecer el proyecto destacado de tu perfil con sólo presionar un botón – incluso los proyectos no compartidos." }, - "scratchformat/title": { - "message": "ScratchFormat" - }, + "scratchformat/title": { "message": "ScratchFormat" }, "scratchformat/description": { "message": "Formatea tus comentarios con negrita, itálico y más. Esto lo podrán ver todos los usuarios que usen ScratchTools." }, - "expand-editor/title": { - "message": "Expandir el editor" - }, + "expand-editor/title": { "message": "Expandir el editor" }, "expand-editor/description": { "message": "Presiona Control + E para esconder o mostrar el escenario en el editor." }, - "list-sprites/title": { - "message": "Lista de objetos" - }, + "list-sprites/title": { "message": "Lista de objetos" }, "list-sprites/description": { "message": "Reemplaza la cuadrícula de objetos en el editor por una lista que incluye un contador de bloques del objeto y su posición." }, - "check-if-trending/title": { - "message": "¿Está en tendencia?" - }, + "check-if-trending/title": { "message": "¿Está en tendencia?" }, "check-if-trending/description": { "message": "Si el proyecto que estás viendo está en la sección de tendencia, su puesto numérico en tendencia se mostrará al lado de la fecha de compartir." }, @@ -761,45 +581,31 @@ "remove-collapse-buttons/description": { "message": "Esconde los botones de colapsar en la página principal de los foros." }, - "pin-projects/title": { - "message": "Fijar proyectos a Mis Cosas" - }, + "pin-projects/title": { "message": "Fijar proyectos a Mis Cosas" }, "pin-projects/description": { "message": "Fija uno de tus proyectos a la parte de arriba de tu página de Mis Cosas con el clic de un botón. También lo podrás desfijar o intercambiar por otro." }, - "last-key-pressed/title": { - "message": "Última tecla presionada" - }, + "last-key-pressed/title": { "message": "Última tecla presionada" }, "last-key-pressed/description": { "message": "En cualquier proyecto y en el editor, podrás ver la última tecla que has presionado mientras el proyecto está en curso, según el proyecto en sí. Esto es genial para los juegos de plataformas." }, - "hide-signatures/title": { - "message": "Esconder signaturas de foros" - }, + "hide-signatures/title": { "message": "Esconder signaturas de foros" }, "hide-signatures/description": { "message": "Esconde todas las signaturas y divisores de los foros." }, - "twemoji-in-forums/title": { - "message": "Mejores emojis en los foros" - }, + "twemoji-in-forums/title": { "message": "Mejores emojis en los foros" }, "twemoji-in-forums/description": { "message": "Reemplaza los emojis de baja calidad actuales con Twemojis de alta calidad." }, - "go-to-parent/title": { - "message": "Botón de ir a original" - }, + "go-to-parent/title": { "message": "Botón de ir a original" }, "go-to-parent/description": { "message": "En el editor de cualquier proyecto que sea un remix, podrás hacer clic en un botón para ir al editor del proyecto original." }, - "most-popular-project/title": { - "message": "Proyecto más popular" - }, + "most-popular-project/title": { "message": "Proyecto más popular" }, "most-popular-project/description": { "message": "Muestra el proyecto más popular (por vistas) del usuario en los perfiles. Puedes hacer clic en el proyecto para verlo." }, - "editor-dark-mode/title": { - "message": "Tema oscuro para el editor" - }, + "editor-dark-mode/title": { "message": "Tema oscuro para el editor" }, "editor-dark-mode/description": { "message": "Intercambia el tono claro del editor por un tono más oscuro." }, @@ -809,99 +615,67 @@ "hide-studio-group-icon/description": { "message": "Esconde el ícono de grupo del estudio, y sólo muestra la miniatura del estudio." }, - "colored-messages/title": { - "message": "Mensajes coloreados" - }, + "colored-messages/title": { "message": "Mensajes coloreados" }, "colored-messages/description": { "message": "Colorea tus mensajes en base al tipo de mensaje, como los corazones, favoritos, e invitaciones a estudios." }, - "full-title/title": { - "message": "Título entero del proyecto" - }, + "full-title/title": { "message": "Título entero del proyecto" }, "full-title/description": { "message": "En las páginas de perfiles, pasa el cursor por encima de cualquier título de un proyecto para mostrar el título completo." }, - "fixed-box/title": { - "message": "Arreglas cuadros de contenido" - }, + "fixed-box/title": { "message": "Arreglas cuadros de contenido" }, "fixed-box/description": { "message": "Hace que todas las puntas de los cuadros sean circulares, en vez de solo las de arriba." }, - "user-bio/title": { - "message": "Biografía de usuarios" - }, + "user-bio/title": { "message": "Biografía de usuarios" }, "user-bio/description": { "message": "En los comentarios de perfiles, pasa el cursos por encima de cualquier nombre de usuario para mostrar su biografía." }, - "nfe-project-checker/title": { - "message": "Detectos de proyectos NFE" - }, + "nfe-project-checker/title": { "message": "Detectos de proyectos NFE" }, "nfe-project-checker/description": { "message": "En los proyectos, muestra si el proyecto es Seguro, No Revisado, o NSFE (No Seguro para Todos)" }, - "sprite-data/title": { - "message": "Mostrar información del sprite" - }, + "sprite-data/title": { "message": "Mostrar información del sprite" }, "sprite-data/description": { "message": "En las pestañas de Código, Disfraces y Sonidos de cada sprite, se mostrarán la cantidad de bloques, disfraces y sonidos respectivamente del sprite seleccionado." }, - "aviate/title": { - "message": "Estados de Aviate" - }, + "aviate/title": { "message": "Estados de Aviate" }, "aviate/description": { "message": "Muestra estados de Aviate en los perfiles. Puedes establecer tu propio estado en aviate.scratchers.tech." }, - "idea-generator/title": { - "message": "Generador de ideas para proyectos" - }, + "idea-generator/title": { "message": "Generador de ideas para proyectos" }, "idea-generator/description": { "message": "En la página de \"Ideas\" en Scratch, habrá una sección donde podrás generar ideas para tu proyecto si necesitas algunas." }, - "hide-stickies/title": { - "message": "Esconder firmas de foros" - }, + "hide-stickies/title": { "message": "Esconder firmas de foros" }, "hide-stickies/description": { "message": "Esconde las firmas básicas que se encuentran encima de cada tema de foro." }, - "nfe-search/title": { - "message": "Búsqueda NFE" - }, + "nfe-search/title": { "message": "Búsqueda NFE" }, "nfe-search/description": { "message": "Usa un botón para buscar todos los proyectos, incluidos los NFE (No Para Todos)." }, - "open-in-new-tab/title": { - "message": "Abrir en nueva pestaña" - }, + "open-in-new-tab/title": { "message": "Abrir en nueva pestaña" }, "open-in-new-tab/description": { "message": "Los enlaces en un proyecto serán abiertos en una nueva pestaña automáticamente." }, - "unbold-site-text/title": { - "message": "Texto sin negrita" - }, + "unbold-site-text/title": { "message": "Texto sin negrita" }, "unbold-site-text/description": { "message": "Hace que todo el texto en la página de Scratch no sea en negrita, y que sólo sea texto normal." }, - "compact-navbar/title": { - "message": "Barra de navegación compacta" - }, + "compact-navbar/title": { "message": "Barra de navegación compacta" }, "compact-navbar/description": { "message": "Hace mas espacio en la barra de navigación cerca de tu perfil." }, - "delete-all/title": { - "message": "Borrar todos los sprites" - }, + "delete-all/title": { "message": "Borrar todos los sprites" }, "delete-all/description": { "message": "Agrega una opción en el menú de clic derecho para borrar todos los sprites (luego de confirmación para asegurar de que no fue un accidente)." }, - "round-profile-pictures/title": { - "message": "Redondear fotos de perfil" - }, + "round-profile-pictures/title": { "message": "Redondear fotos de perfil" }, "round-profile-pictures/description": { "message": "Todas las fotos de perfil en la página de Scratch serán redondas." }, - "ocular-link/title": { - "message": "Enlaces de ocular en foros" - }, + "ocular-link/title": { "message": "Enlaces de ocular en foros" }, "ocular-link/description": { "message": "Agrega un enlace a la página Ocular de cualquier usuario justo debajo de su nombre de usuario en una publicación." }, @@ -911,21 +685,15 @@ "forum-scratch-team/description": { "message": "Al lado del nombre de usuario de cualquier miembro del Equipo de Scratch en los foros, se le pondrá un asterisco. (*)" }, - "remove-editor-icons/title": { - "message": "Eliminar íconos del editor" - }, + "remove-editor-icons/title": { "message": "Eliminar íconos del editor" }, "remove-editor-icons/description": { "message": "Elimina los íconos de cada pestaña del editor." }, - "sprite-watermark/title": { - "message": "Eliminar marca de agua del sprite" - }, + "sprite-watermark/title": { "message": "Eliminar marca de agua del sprite" }, "sprite-watermark/description": { "message": "Elimina la marca de agua que aparece en el editor de sprites." }, - "compact-editor/title": { - "message": "Editor compacto" - }, + "compact-editor/title": { "message": "Editor compacto" }, "compact-editor/description": { "message": "Hace la información de los objetos y fondo más compacta." }, @@ -935,10 +703,8 @@ "my-recent-projects/description": { "message": "Reemplaza la sección de Noticias de Scratch en la página principal con tus proyectos compartidos recientemente." }, - "focus-mode/title": { - "message": "Modo de enfoque" - }, + "focus-mode/title": { "message": "Modo de enfoque" }, "focus-mode/description": { "message": "Agrega un botón en los proyectos que elimina los comentarios, las columnas de estudios y remixes, el encabezado y el pie de la página." } -} \ No newline at end of file +} diff --git a/extras/feature-locales/ja.json b/extras/feature-locales/ja.json index 3dc93441..af0bb8b4 100644 --- a/extras/feature-locales/ja.json +++ b/extras/feature-locales/ja.json @@ -1,37 +1,29 @@ { - "fullscreen-explorer/title": { - "message": "フルスクリーン プロジェクト グリッド" - }, - "fullscreen-explorer/description": { - "message": "トレンド、検索、リミックスのページで左右の空白を削除して、大画面でプロジェクトを検索します。" + "stage-in-spritepane/title": { "message": "スプライトペイン内のステージ" }, + "stage-in-spritepane/description": { + "message": "ステージボタンをスプライトペインに移動し、スプライトの表示領域を広げます。" }, - "total-stats/title": { - "message": "ユーザー統計の合計" + "better-cloud-history/title": { "message": "クラウドデータの履歴の改善" }, + "better-cloud-history/description": { + "message": "クラウドデータの履歴をより詳細で最新なものにします。変数名をクリックすると、その変数のみで一覧表示できます。" }, - "total-stats/description": { - "message": "ユーザーのプロフィールの共有プロジェクトの横に、ユーザーが共有したすべてのプロジェクトで受け取った「いいね」、「お気に入り」、「閲覧」の合計が表示されます。" - }, - "project-miniplayer/title": { - "message": "プロジェクトミニプレイヤー" - }, - "project-miniplayer/description": { - "message": "プロジェクト ページを下にスクロールすると、プロジェクトのミニプレイヤーが自動的に表示されます。" + "sprite-layers/title": { "message": "スプライトのレイヤーを表示" }, + "sprite-layers/description": { + "message": "エディターのスプライトの表示/非表示切り替えボタンにカーソルを合わせると、スプライトのレイヤーが表示されます。" }, - "project-descriptions/title": { - "message": "要約された説明" - }, - "project-descriptions/description": { - "message": "必要に応じて人工知能を使用してプロジェクトの説明を要約し、長い説明をゲームプレイの説明などの重要な情報に短縮します。" - }, - "pin-comments/title": { - "message": "プロジェクトコメントをピン留めする" + "hide-project-tags/title": { "message": "プロジェクトのタグの非表示" }, + "hide-project-tags/description": { + "message": "プロジェクトの「使い方」と「メモとクレジット」に書かれているリンクされているタグをすべて非表示にします。" }, - "pin-comments/description": { - "message": "自分のプロジェクトにコメントを固定したり、他のプロジェクトにどのようなコメントが固定されているかを確認したりできます。" + "snap-to-grid/title": { "message": "スクリプトをグリッドに揃える" }, + "snap-to-grid/description": { + "message": "スクリプトを配置すると、エディター内の点線のグリッドに自動的に揃えられます。" }, - "sidebar/title": { - "message": "サイドバー" + "select-self/title": { "message": "編集中のスプライトを選択" }, + "select-self/description": { + "message": "スプライトのドロップダウンを開いたときに、他のスプライトだけでなく編集中のスプライトを選択できるようにします。" }, + "sidebar/title": { "message": "サイドバー" }, "sidebar/description": { "message": "Scratchの画面上部のバーの位置を横に移動します。" }, @@ -41,63 +33,65 @@ "project-version-detector/description": { "message": "プロジェクトがいつ共有されたかを確認し、その時点で使用されていた Scratch のバージョンを示すラベルを共有日の横に追加します。" }, - "download-project/title": { - "message": "プロジェクトをダウンロード" + "fullscreen-explorer/title": { + "message": "フルスクリーン プロジェクト グリッド" }, + "fullscreen-explorer/description": { + "message": "トレンド、検索、リミックスのページで左右の空白を削除して、大画面でプロジェクトを検索します。" + }, + "project-descriptions/title": { "message": "要約された説明" }, + "project-descriptions/description": { + "message": "必要に応じて人工知能を使用してプロジェクトの説明を要約し、長い説明をゲームプレイの説明などの重要な情報に短縮します。" + }, + "total-stats/title": { "message": "ユーザー統計の合計" }, + "total-stats/description": { + "message": "ユーザーのプロフィールの共有プロジェクトの横に、ユーザーが共有したすべてのプロジェクトで受け取った「いいね」、「お気に入り」、「閲覧」の合計が表示されます。" + }, + "project-miniplayer/title": { "message": "プロジェクトミニプレイヤー" }, + "project-miniplayer/description": { + "message": "プロジェクト ページを下にスクロールすると、プロジェクトのミニプレイヤーが自動的に表示されます。" + }, + "pin-comments/title": { "message": "プロジェクトコメントをピン留めする" }, + "pin-comments/description": { + "message": "自分のプロジェクトにコメントを固定したり、他のプロジェクトにどのようなコメントが固定されているかを確認したりできます。" + }, + "download-project/title": { "message": "プロジェクトをダウンロード" }, "download-project/description": { "message": "プロジェクトページに、プロジェクトを.sb3ファイルとしてダウンロードできるボタンを追加します。" }, - "blur-modal/title": { - "message": "エディターのホップアップの背景をぼかす" - }, + "blur-modal/title": { "message": "エディターのホップアップの背景をぼかす" }, "blur-modal/description": { "message": "エディターのホップアップの背景を、色付きの半透明の背景ではなく、ぼかしたものにします。" }, - "quick-search/title": { - "message": "クイック検索" - }, + "quick-search/title": { "message": "クイック検索" }, "quick-search/description": { "message": "Ctrl + Kで、Scratch上のページ間を簡単に切り替えられます。" }, - "favicon-messages/title": { - "message": "ブラウザのタブにメッセージ数を表示" - }, + "favicon-messages/title": { "message": "ブラウザのタブにメッセージ数を表示" }, "favicon-messages/description": { "message": "ファビコン(ブラウザのタブにあるScratchアイコン)にメッセージ数を表示します。" }, - "show-emoji-names/title": { - "message": "絵文字の名前を表示" - }, + "show-emoji-names/title": { "message": "絵文字の名前を表示" }, "show-emoji-names/description": { "message": "コメント内のScratch絵文字にカーソルを合わせると、その絵文字の名前が表示されます。" }, - "more-block-themes/title": { - "message": "ブロックのテーマの追加" - }, + "more-block-themes/title": { "message": "ブロックのテーマの追加" }, "more-block-themes/description": { "message": "コードエディターのブロックのテーマを追加します。" }, - "more-key-inputs/title": { - "message": "より多くのキー入力の追加" - }, + "more-key-inputs/title": { "message": "より多くのキー入力の追加" }, "more-key-inputs/description": { "message": "「○○キーが押された」ブロックに、より多くのキーを追加します。" }, - "comment-tags/title": { - "message": "エディターのコメントにタグを追加" - }, + "comment-tags/title": { "message": "エディターのコメントにタグを追加" }, "comment-tags/description": { "message": "エディターのコメントにタグを追加して、簡単に整理することができます。" }, - "profile-flag/title": { - "message": "プロフィールに国旗を表示" - }, + "profile-flag/title": { "message": "プロフィールに国旗を表示" }, "profile-flag/description": { "message": "プロフィールに設定されている国名の横に、その国の国旗の絵文字を追加します。" }, - "follow-on-projects/title": { - "message": "プロジェクトページでフォローする" - }, + "follow-on-projects/title": { "message": "プロジェクトページでフォローする" }, "follow-on-projects/description": { "message": "プロフィールにアクセスしなくても、プロジェクトページから直接プロジェクトの作者をフォローできます。" }, @@ -107,219 +101,139 @@ "dark-paint-editor/description": { "message": "ペイントエディターのズームボタンの横に、ペイントエディターの背景をライトモードとダークモードに切り替えられるボタンを追加します。" }, - "specific-replies/title": { - "message": "メッセージで返信先を表示" - }, + "specific-replies/title": { "message": "メッセージで返信先を表示" }, "specific-replies/description": { "message": "コメントに関するメッセージで、そのコメントが誰に返信したものかを表示する。" }, - "better-trending-thumbnails/title": { - "message": "より大きいサムネイル" - }, + "better-trending-thumbnails/title": { "message": "より大きいサムネイル" }, "better-trending-thumbnails/description": { "message": "傾向と検索したときに表示されるプロジェクトのサムネイルを大きくし、プロジェクトとスタジオの枠によりぴったりになるようにします。" }, - "relevant-forum-posts/title": { - "message": "似ているトピックを表示" - }, - "relevant-forum-posts/description": { - "message": "フォーラムで新しいトピックを作成したときに、そのトピックに似ている他のトピックが表示されます。" - }, - "anti-generic/title": { - "message": "一般的なものの非表示" - }, + "anti-generic/title": { "message": "一般的なものの非表示" }, "anti-generic/description": { "message": "このベータ版機能では、検索ページと傾向ページにおいて、繰り返しの多いプロジェクトや、一般的と思われるプロジェクトを自動的に非表示にします。これには、タグが多いプロジェクト、一般的な名前のプロジェクト、プロジェクトの重複が含まれます。" }, - "wrap-lists/title": { - "message": "リストの項目を省略しない" - }, + "wrap-lists/title": { "message": "リストの項目を省略しない" }, "wrap-lists/description": { "message": "リスト内のテキストが長すぎる場合でも、それを省略せずに表示します。" }, - "live-stats/title": { - "message": "ステータスをリアルタイムで更新" - }, + "live-stats/title": { "message": "ステータスをリアルタイムで更新" }, "live-stats/description": { "message": "ページを再読み込みすることなく、プロジェクトの好き、お気に入り、リミックス、参照数をリアルタイムで更新します。" }, - "hide-scratch-news/title": { - "message": "Scratchニュースの非表示" - }, + "hide-scratch-news/title": { "message": "Scratchニュースの非表示" }, "hide-scratch-news/description": { "message": "トップページにあるScratchニュースを非表示にします。" }, - "watch-later/title": { - "message": "プロジェクトを後で見る" - }, + "watch-later/title": { "message": "プロジェクトを後で見る" }, "watch-later/description": { "message": "後で見たいプロジェクトとして保存したものを、「後で見る」ページに表示します。" }, - "remove-project-button/title": { - "message": "プロジェクト削除ボタン" - }, + "remove-project-button/title": { "message": "プロジェクト削除ボタン" }, "remove-project-button/description": { "message": "スタジオ内のプロジェクトを簡単に削除するためのボタンを追加します。メニューを開かずに削除することができます。" }, - "right-side-flag/title": { - "message": "緑の旗を右に表示する" - }, + "right-side-flag/title": { "message": "緑の旗を右に表示する" }, "right-side-flag/description": { "message": "緑の旗と停止ボタンをステージの右側に移動させます。" }, - "love-fave-animate/title": { - "message": "「好き」ボタンのアニメーション" - }, + "love-fave-animate/title": { "message": "「好き」ボタンのアニメーション" }, "love-fave-animate/description": { "message": "プロジェクトページ上の「いいね」ボタンと「お気に入り」ボタンのクリックしたときの動作をアニメーション化します。" }, - "default-to-local/title": { - "message": "デフォルトでローカル変数にする" - }, + "default-to-local/title": { "message": "デフォルトでローカル変数にする" }, "default-to-local/description": { "message": "変数を作った時に、デフォルトで「すべてのスプライト」ではなく「このスプライトのみ」に設定します。" }, - "start-stop-hotkeys/title": { - "message": "緑の旗のホットキー" - }, + "start-stop-hotkeys/title": { "message": "緑の旗のホットキー" }, "start-stop-hotkeys/description": { "message": "プロジェクトが実行中かどうかに応じて、Ctrl+Gキーを押すことで、プロジェクトを実行または停止することができます。" }, - "opacity-slider/title": { - "message": "透明度スライダー" - }, + "opacity-slider/title": { "message": "透明度スライダー" }, "opacity-slider/description": { "message": "ペイントエディターでオブジェクトの透明度を変更できるようになります。" }, - "more-studios/title": { - "message": "スタジオの追加" - }, + "more-studios/title": { "message": "スタジオの追加" }, "more-studios/description": { "message": "20個よりも多くのスタジオにプロジェクトを追加できるようにします。" }, - "localized-explore/title": { - "message": "国内のプロジェクト" - }, + "localized-explore/title": { "message": "国内のプロジェクト" }, "localized-explore/description": { "message": "検索ページで、他の国のプロジェクトをあまり表示しないようにします。これは、あなたが理解できる言語のプロジェクトだけを表示するためです。" }, - "project-bar/title": { - "message": "プロジェクトバー" - }, + "project-bar/title": { "message": "プロジェクトバー" }, "project-bar/description": { "message": "メモとクレジットより下へスクロールした後も、プロジェクトの情報を表示し続けることができます。" }, - "more-news/title": { - "message": "Scratchニュースの追加" - }, + "more-news/title": { "message": "Scratchニュースの追加" }, "more-news/description": { "message": "トップページで、Scratchニュースをスクロールして、より多くのニュースを読み込むことができます。" }, - "dumpster-fire/title": { - "message": "ゴミ捨て場の火災" - }, + "dumpster-fire/title": { "message": "ゴミ捨て場の火災" }, "dumpster-fire/description": { "message": "Scratchのホームページに「注目のプロジェクト」という項目があるが、これは嘘です。なので、この名称を「Dumpster Fire(ゴミ捨て場の火災)」という正しい名称に変更します。" }, - "steal-game/title": { - "message": "ゲームを盗む" - }, + "steal-game/title": { "message": "ゲームを盗む" }, "steal-game/description": { "message": "リミックスボタンの文字を「Steal game(ゲームを盗む)」にします。" }, - "statistics/title": { - "message": "統計情報" - }, + "statistics/title": { "message": "統計情報" }, "statistics/description": { "message": "ユーザーのScratchStatsに飛ぶことができるボタンを「私の作品」ページに追加します。" }, - "echo-effect/title": { - "message": "エコー効果" - }, + "echo-effect/title": { "message": "エコー効果" }, "echo-effect/description": { "message": "Scratchの音エディターにエコー効果を戻します。" }, - "compact-buttons/title": { - "message": "コンパクトなボタン" - }, + "compact-buttons/title": { "message": "コンパクトなボタン" }, "compact-buttons/description": { "message": "ボタンのテキストは削除され、アイコンがない場合は新しいアイコンが追加されます。" }, - "message-count/title": { - "message": "メッセージカウント" - }, + "message-count/title": { "message": "メッセージカウント" }, "message-count/description": { "message": "プロフィールのユーザーのメッセージ数を国名の横に表示します。" }, - "move-share-button/title": { - "message": "「共有する」ボタンを移動" - }, + "move-share-button/title": { "message": "「共有する」ボタンを移動" }, "move-share-button/description": { "message": "プロジェクトページで、「共有する」ボタンを「中を見る」ボタンの隣に移動します。" }, - "preview-textboxes/title": { - "message": "テキストボックスのプレビュー表示" - }, + "preview-textboxes/title": { "message": "テキストボックスのプレビュー表示" }, "preview-textboxes/description": { "message": "プロフィールの「私について」と「私が取り組んでいること」、そしてプロジェクトの「使い方」と「メモとクレジット」をプレビュー表示して、他のユーザーにどのように見えるかを確認できます。\n " }, - "more-tutorials/title": { - "message": "チュートリアルの追加" - }, + "more-tutorials/title": { "message": "チュートリアルの追加" }, "more-tutorials/description": { "message": "アイデアページで、他のスクラッチャーによって作られたチュートリアルを見ることができます。" }, - "simplify-action-buttons/title": { - "message": "簡素なアクションボタン" - }, + "simplify-action-buttons/title": { "message": "簡素なアクションボタン" }, "simplify-action-buttons/description": { "message": "プロジェクトページの「使い方」と「メモとクレジット」の下にあるアクションボタンをアイコンで表示します。" }, - "slash-to-search/title": { - "message": "スラッシュキーで検索" - }, + "slash-to-search/title": { "message": "スラッシュキーで検索" }, "slash-to-search/description": { "message": "スラッシュキー(/)で、検索バーに移動し、検索を開始できます。" }, - "shared-clipboard/title": { - "message": "共有クリップボード" - }, + "shared-clipboard/title": { "message": "共有クリップボード" }, "shared-clipboard/description": { "message": "異なるプロジェクトのペイントエディター間でアイテムをコピー&ペーストできます。" }, - "important-messages/title": { - "message": "重要なメッセージ" - }, - "important-messages/description": { - "message": "メッセージページで、重要なメッセージを別に表示します。" - }, - "hide-footer/title": { - "message": "フッターを隠す" - }, + "hide-footer/title": { "message": "フッターを隠す" }, "hide-footer/description": { "message": "フッターは不要なスペースを取ります。だから隠す!" }, - "original-colors/title": { - "message": "青色に戻す" - }, + "original-colors/title": { "message": "青色に戻す" }, "original-colors/description": { "message": "Scratchのウェブサイトのテーマカラーを、3.0の紫色になる前の色に戻します。" }, - "simplify-editor-tabs/title": { - "message": "エディターのタブの単純化" - }, + "simplify-editor-tabs/title": { "message": "エディターのタブの単純化" }, "simplify-editor-tabs/description": { "message": "エディターのタブの項目をアイコンのみにし、円形で表示します。" }, - "live-character-counts/title": { - "message": "現在の文字数" - }, + "live-character-counts/title": { "message": "現在の文字数" }, "live-character-counts/description": { "message": "フォーラム、スタジオ、プロジェクトページで、テキストボックスの現在の文字数を表示します。" }, - "advanced-search/title": { - "message": "ユーザー検索" - }, + "advanced-search/title": { "message": "ユーザー検索" }, "advanced-search/description": { "message": "ユーザーを検索すると、そのプロフィールへのリンクがページの上部に表示されます。" }, @@ -329,21 +243,15 @@ "studio-links/description": { "message": "Scratchウェブサイト全体のスタジオへのリンクをスタジオの名前に置き換えます。" }, - "block-studios/title": { - "message": "選択したスタジオからの通知の無効化" - }, + "block-studios/title": { "message": "選択したスタジオからの通知の無効化" }, "block-studios/description": { "message": "選択したスタジオの活動内容のメッセージを無効化します。" }, - "block-messages/title": { - "message": "ブロック機能" - }, + "block-messages/title": { "message": "ブロック機能" }, "block-messages/description": { "message": "ブロックしたユーザーからのメッセージを非表示にします。他のユーザーにはブロックしていることは表示されません。" }, - "two-colors/title": { - "message": "2.0ブロックカラー" - }, + "two-colors/title": { "message": "2.0ブロックカラー" }, "two-colors/description": { "message": "エディターのブロックの色を、Scratch2.0で使われていた色に変更します。" }, @@ -353,33 +261,23 @@ "project-links/description": { "message": "Scratchウェブサイト全体のプロジェクトへのリンクをプロジェクトの名前に置き換えます。" }, - "emoji-status/title": { - "message": "絵文字のステータス" - }, + "emoji-status/title": { "message": "絵文字のステータス" }, "emoji-status/description": { "message": "プロフィールのステータスに絵文字を設定します。他のScratchToolsユーザーは、このステータスを見ることができます。" }, - "display-name/title": { - "message": "ディスプレイネーム" - }, + "display-name/title": { "message": "ディスプレイネーム" }, "display-name/description": { "message": "他のScratcherのディスプレイネームが表示されます。また、自分のディスプレイネームを設定することもできます。ディスプレイネームはユーザー名の横に表示され、ユーザー名のように制限されることはありません。" }, - "isonline/title": { - "message": "ユーザーがオンラインか表示" - }, + "isonline/title": { "message": "ユーザーがオンラインか表示" }, "isonline/description": { "message": "プロフィールページで、ユーザーがオンラインか表示します。この機能は他のユーザーにあなたがオンラインどうかを表示します。" }, - "plain-background/title": { - "message": "無地のコードエディターの背景" - }, + "plain-background/title": { "message": "無地のコードエディターの背景" }, "plain-background/description": { "message": "コードエディターの背景からドットを削除します。" }, - "hide-advertisements/title": { - "message": "コメント欄の広告の非表示" - }, + "hide-advertisements/title": { "message": "コメント欄の広告の非表示" }, "hide-advertisements/description": { "message": "プロフィール、プロジェクト、スタジオのコメント欄の広告コメントを非表示にします。広告コメントはコメント欄で無駄にスペースを占有します。" }, @@ -395,57 +293,39 @@ "unlisted-projects/description": { "message": "エディターで非共有のプロジェクトを共有するリンクを生成します。そのプロジェクトはリンクを知っている人しか見ることができません。" }, - "stats-percentages/title": { - "message": "プロジェクトのステータスを表示" - }, + "stats-percentages/title": { "message": "プロジェクトのステータスを表示" }, "stats-percentages/description": { "message": "「私の作品」ページで、好き、お気に入り、リミックスの数にカーソルを合わせると、参照数のうちの何パーセントの人がその反応をしたかが表示されます。" }, - "clone-counter/title": { - "message": "クローンカウンター" - }, + "clone-counter/title": { "message": "クローンカウンター" }, "clone-counter/description": { "message": "ステージの上に、総クローン数を表示します。" }, - "colored-shadows/title": { - "message": "色付きの影" - }, + "colored-shadows/title": { "message": "色付きの影" }, "colored-shadows/description": { "message": "ドラッグ中のブロックを他のブロックに近づけた時に表示される影を、移動中のブロックの色にします。" }, - "creator-badge/title": { - "message": "作者バッジ" - }, + "creator-badge/title": { "message": "作者バッジ" }, "creator-badge/description": { "message": "プロジェクトページのコメント欄で、プロジェクトの作者のコメントの隣にバッジを表示します。" }, - "original-buttons/title": { - "message": "昔のマーク" - }, + "original-buttons/title": { "message": "昔のマーク" }, "original-buttons/description": { "message": "昔のハート、お気に入り、リミックス、参照マークに戻します。" }, - "box-shadows/title": { - "message": "コンテンツボックスの影" - }, + "box-shadows/title": { "message": "コンテンツボックスの影" }, "box-shadows/description": { "message": "すべてのコンテンツボックスに影を追加します。カーソルを合わせると、影が濃くなります。" }, - "admin-notifications/title": { - "message": "STからのメッセージを赤く表示" - }, + "admin-notifications/title": { "message": "STからのメッセージを赤く表示" }, "admin-notifications/description": { "message": "Scratch Teamからの管理者通知がある場合、上のバーのメッセージボタンはオレンジ色ではなく、赤色に表示されます。" }, - "nicknames/title": { - "message": "ニックネーム" - }, + "nicknames/title": { "message": "ニックネーム" }, "nicknames/description": { "message": "他のScratcherにニックネームを設定することができます。ニックネームは自分だけが見ることができ、相手のユーザーネームを見たときにユーザー名がニックネームに置き換えられます。" }, - "load-more-forum-posts/title": { - "message": "より多くの投稿を読み込む" - }, + "load-more-forum-posts/title": { "message": "より多くの投稿を読み込む" }, "load-more-forum-posts/description": { "message": "ディスカッションフォーラムで、ページを切り替えることなく、より多くの投稿を読み込むことができます。" }, @@ -455,42 +335,26 @@ "scroll-project-titles/description": { "message": "プロジェクトのタイトルをスクロールして見ることができます。" }, - "search-context-menus/title": { - "message": "検索コンテキストメニュー" - }, + "search-context-menus/title": { "message": "検索コンテキストメニュー" }, "search-context-menus/description": { "message": "コンテキストメニューを入力・検索して、効率的にオプションを選択できます。Enterキーを押すことで一番上のオプションを選択できます。" }, - "hover-user-cards/title": { - "message": "カーソルを合わせてステータスを表示" - }, + "hover-user-cards/title": { "message": "カーソルを合わせてステータスを表示" }, "hover-user-cards/description": { "message": "青いユーザー名にマウスカーソルを合わせると、アイコンとユーザー名とフォロワー数が表示されます。" }, - "exact-join-date/title": { - "message": "詳細な参加した日時" - }, + "exact-join-date/title": { "message": "詳細な参加した日時" }, "exact-join-date/description": { "message": "プロフィールにユーザーが参加した詳細な日時を表示します。" }, - "upload-img-directly/title": { - "message": "画像を直接アップロード" - }, + "upload-img-directly/title": { "message": "画像を直接アップロード" }, "upload-img-directly/description": { "message": "サードパーティ製の画像アップロードサービスを使わなくても、フォーラムで画像を自分のパソコンのファイルから直接アップロードできるようになります。" }, - "leave-studio/title": { - "message": "「スタジオを抜ける」ボタン" - }, + "leave-studio/title": { "message": "「スタジオを抜ける」ボタン" }, "leave-studio/description": { "message": "あなたがキュレーターまたはマネージャーであるスタジオのキュレータータブにスタジオから退出することができるボタンを追加します。ボタンを押すと、確認画面が表示されます。" }, - "user-stats/title": { - "message": "ユーザーの統計情報" - }, - "user-stats/description": { - "message": "プロフィールの「私が行ったこと」にユーザーの統計情報を表示します。" - }, "frontpage-curator/title": { "message": "トップページのキュレーターの名前をリンク化" }, @@ -503,15 +367,11 @@ "minimized-remix-credits/description": { "message": "リミックスのクレジットを小さくすることができます。" }, - "follows-you/title": { - "message": "相互フォロー表示" - }, + "follows-you/title": { "message": "相互フォロー表示" }, "follows-you/description": { "message": "相互フォローしている場合、そのユーザーのプロフィールのユーザー名の隣に表示されます。" }, - "custom-studio/title": { - "message": "トップページに指定したスタジオを表示" - }, + "custom-studio/title": { "message": "トップページに指定したスタジオを表示" }, "custom-studio/description": { "message": "トップページの「注目のプロジェクト」の上に指定したスタジオの最新のプロジェクトを表示します。" }, @@ -521,15 +381,7 @@ "highlight-unanswered/description": { "message": "フォーラムの返信されていないトピックに青いハイライトを追加します。" }, - "hide-project-tags/title": { - "message": "プロジェクトのタグの非表示" - }, - "hide-project-tags/description": { - "message": "プロジェクトの「使い方」と「メモとクレジット」に書かれているリンクされているタグをすべて非表示にします。" - }, - "search-assets/title": { - "message": "アセット検索" - }, + "search-assets/title": { "message": "アセット検索" }, "search-assets/description": { "message": "エディターでコスチュームや音の資料を検索できます。" }, @@ -539,9 +391,7 @@ "block-count-in-mystuff/description": { "message": "「私の作品」でプロジェクトのブロック数を表示します。" }, - "pause-audio/title": { - "message": "音の一時停止" - }, + "pause-audio/title": { "message": "音の一時停止" }, "pause-audio/description": { "message": "エディターの音エディターで音の一時停止と再生ができます。" }, @@ -551,21 +401,15 @@ "display-message-count-in-icon/description": { "message": "ScratchToolsの拡張機能のアイコンにメッセージ数を表示します。" }, - "colored-context-menus/title": { - "message": "色付きの右クリックメニュー" - }, + "colored-context-menus/title": { "message": "色付きの右クリックメニュー" }, "colored-context-menus/description": { "message": "Scratch 2.0のように右クリックメニューにクリックしたブロックの色と同じ色をつけます。" }, - "left-side-stage/title": { - "message": "ステージを左に表示" - }, + "left-side-stage/title": { "message": "ステージを左に表示" }, "left-side-stage/description": { "message": "Scratch 2.0のようにステージをエディターの左側に表示します。" }, - "move-project-title-input/title": { - "message": "タイトルボックスの移動" - }, + "move-project-title-input/title": { "message": "タイトルボックスの移動" }, "move-project-title-input/description": { "message": "Scratch 2.0のようにプロジェクトのタイトル入力ボックスを上のバーではなく、ステージの上に移動します。これはエディターにのみ適用されます。" }, @@ -575,15 +419,11 @@ "hide-disabled-menu-options/description": { "message": "エディターに表示される右クリックメニューは無効の機能も表示されます。この機能により、無効の機能が非表示になります。" }, - "follower-count/title": { - "message": "プロジェクトでフォロワー数を表示" - }, + "follower-count/title": { "message": "プロジェクトでフォロワー数を表示" }, "follower-count/description": { "message": "プロジェクトの作者名の隣にそのユーザーのフォロワー数を表示します。" }, - "hide-studio-borders/title": { - "message": "スタジオのアイコンの枠の非表示" - }, + "hide-studio-borders/title": { "message": "スタジオのアイコンの枠の非表示" }, "hide-studio-borders/description": { "message": "2.0版のスタジオの画像の周囲の枠を非表示にします。" }, @@ -593,9 +433,7 @@ "hide-textarea-labels/description": { "message": "使い方やメモとクレジットの枠の上の文字は枠内の情報を表示するのを妨げています。この機能はそれらを非表示にします。" }, - "default-to-trending/title": { - "message": "デフォルトで傾向を検索" - }, + "default-to-trending/title": { "message": "デフォルトで傾向を検索" }, "default-to-trending/description": { "message": "現在Scratchではプロジェクトを検索すると、人気のあるプロジェクトが表示されるようになっています。この機能はデフォルトで傾向のプロジェクトが表示されるようになります。" }, @@ -617,9 +455,7 @@ "special-editor-fonts/description": { "message": "ペイントエディターのテキストで使えるより美しく現代的なフォントを追加しました。" }, - "get-project-tags/title": { - "message": "プロジェクトのタグの別表示" - }, + "get-project-tags/title": { "message": "プロジェクトのタグの別表示" }, "get-project-tags/description": { "message": "プロジェクトのメモとクレジットの下にそのプロジェクトで使われたすべてのタグを表示します。" }, @@ -629,9 +465,7 @@ "link-to-propose/description": { "message": "トップページの「注目のプロジェクト」と注目のプロジェクトを提案するスタジオをリンクさせます" }, - "add-last-option-list/title": { - "message": "リスト項目を最後に設定" - }, + "add-last-option-list/title": { "message": "リスト項目を最後に設定" }, "add-last-option-list/description": { "message": "「[リスト] の [番号] 番目」ブロックを右クリックして、選択したリストの最後の項目を選択できるように設定します。" }, @@ -641,9 +475,7 @@ "cloud-scratchers/description": { "message": "オンラインゲームのプロジェクトに参加しているユーザーの一覧を表示します。" }, - "editor-in-two/title": { - "message": "2.0エディター" - }, + "editor-in-two/title": { "message": "2.0エディター" }, "editor-in-two/description": { "message": "デフォルトの3.0オンラインエディターを2.0エディターに置き換えます。" }, @@ -659,81 +491,55 @@ "turbowarp-button-in-editor/description": { "message": "プロジェクトをすぐにTurboWarpで開くことができるように、エディターにボタンを追加します。" }, - "sprite-clones/title": { - "message": "スプライトのクローンカウンター" - }, + "sprite-clones/title": { "message": "スプライトのクローンカウンター" }, "sprite-clones/description": { "message": "それぞれのスプライトのクローン数を表示します。" }, - "block-log/title": { - "message": "ブロックの履歴" - }, + "block-log/title": { "message": "ブロックの履歴" }, "block-log/description": { "message": "ctrl+shift+lを押したときにブロックエディターのすべてのブロックを履歴を表示します。" }, - "scrollable-list-items/title": { - "message": "スクロールできるリストの項目" - }, + "scrollable-list-items/title": { "message": "スクロールできるリストの項目" }, "scrollable-list-items/description": { "message": "リスト自体の幅より長い値が書かれているリストの項目を左右にスクロールできるようになります。" }, - "custom-fonts/title": { - "message": "サイトのフォントの変更" - }, + "custom-fonts/title": { "message": "サイトのフォントの変更" }, "custom-fonts/description": { "message": "Scratch上で表示されるフォントをGoogle Fontsのサイトにある好きなフォントに設定することができます。大文字と小文字は区別されます。" }, - "project-timer/title": { - "message": "プロジェクトのタイマー" - }, + "project-timer/title": { "message": "プロジェクトのタイマー" }, "project-timer/description": { "message": "プロジェクトが実行されている時間(秒)を表示します。" }, - "colored-comments/title": { - "message": "色付けされたエディターのコメント" - }, + "colored-comments/title": { "message": "色付けされたエディターのコメント" }, "colored-comments/description": { "message": "ブロックエディターのコメントをブロックの色と同じにします。" }, - "recently-viewed-projects/title": { - "message": "最近見たプロジェクト" - }, + "recently-viewed-projects/title": { "message": "最近見たプロジェクト" }, "recently-viewed-projects/description": { "message": "私の作品のページに最近見たプロジェクトの一覧を表示するタブを追加します。" }, - "collapse-blocks/title": { - "message": "折りたためるブロック" - }, + "collapse-blocks/title": { "message": "折りたためるブロック" }, "collapse-blocks/description": { "message": "エディターの右クリックメニューに、選択したブロックを折りたたむためのボタンを追加します。" }, - "set-featured-project/title": { - "message": "注目のプロジェクトを設定" - }, + "set-featured-project/title": { "message": "注目のプロジェクトを設定" }, "set-featured-project/description": { "message": "プロジェクトページでボタンをクリックするだけで簡単に自分のプロフィールの注目のプロジェクトに設定することができます。" }, - "scratchformat/title": { - "message": "ScratchFormat" - }, + "scratchformat/title": { "message": "ScratchFormat" }, "scratchformat/description": { "message": "太字や斜体など、コメントの書式を設定できます。ScratchToolsを使用している人にのみ表示されます。" }, - "expand-editor/title": { - "message": "エディターの拡大" - }, + "expand-editor/title": { "message": "エディターの拡大" }, "expand-editor/description": { "message": "Ctrl+Eでデフォルトのブロックエディター表示と、ステージを隠してエディターを拡大する表示を切り替えられます。" }, - "list-sprites/title": { - "message": "スプライトリスト" - }, + "list-sprites/title": { "message": "スプライトリスト" }, "list-sprites/description": { "message": "エディタ内の全スプライトをスプライトのブロック数と位置を含むリストで表示します。" }, - "check-if-trending/title": { - "message": "傾向入りしているかを表示" - }, + "check-if-trending/title": { "message": "傾向入りしているかを表示" }, "check-if-trending/description": { "message": "閲覧中のプロジェクトが英語の傾向にある場合、プロジェクトページの公開日の横に英語の傾向での場所が表示されます。" }, @@ -743,9 +549,7 @@ "link-forum-activity/description": { "message": "フォーラムの最終投稿欄で、ユーザー名をユーザーのプロフィールにリンクします。" }, - "remove-topic-and-post/title": { - "message": "フォーラムのカテゴリの非表示" - }, + "remove-topic-and-post/title": { "message": "フォーラムのカテゴリの非表示" }, "remove-topic-and-post/description": { "message": "フォーラムのトップページのトピック数と投稿数を非表示にします。" }, @@ -761,99 +565,67 @@ "remove-collapse-buttons/description": { "message": "フォーラムのトップページで折りたたみボタンを非表示にします。" }, - "pin-projects/title": { - "message": "プロジェクトを「私の作品」にピン留め" - }, + "pin-projects/title": { "message": "プロジェクトを「私の作品」にピン留め" }, "pin-projects/description": { "message": "プロジェクトページで「Pin」ボタンをクリックして、プロジェクトを「私の作品」ページのトップにピン留めできます。ピン留めしたプロジェクトを解除したり、別のプロジェクトに入れ替えることもできます。" }, - "last-key-pressed/title": { - "message": "最後に押されたキー" - }, + "last-key-pressed/title": { "message": "最後に押されたキー" }, "last-key-pressed/description": { "message": "プロジェクトページとエディターで、そのプロジェクトで最後に押したキーを表示します。これはプラットフォーマーのようなゲームに適しています。" }, - "hide-signatures/title": { - "message": "フォーラムの署名の非表示" - }, + "hide-signatures/title": { "message": "フォーラムの署名の非表示" }, "hide-signatures/description": { "message": "フォーラムの署名と署名の区切り線を非表示にします。" }, - "twemoji-in-forums/title": { - "message": "フォーラムの絵文字の改善" - }, + "twemoji-in-forums/title": { "message": "フォーラムの絵文字の改善" }, "twemoji-in-forums/description": { "message": "低解像度のフォーラムの絵文字を、高画質のTwemojisに置き換えます。" }, - "go-to-parent/title": { - "message": "「リミックス元に移動」ボタン" - }, + "go-to-parent/title": { "message": "「リミックス元に移動」ボタン" }, "go-to-parent/description": { "message": "リミックスされたプロジェクトのエディターで、ボタンをクリックすると、リミックス元のプロジェクトのエディターに移動します。" }, - "most-popular-project/title": { - "message": "一番有名なプロジェクト" - }, + "most-popular-project/title": { "message": "一番有名なプロジェクト" }, "most-popular-project/description": { "message": "プロフィールページに、そのユーザーの最も人気(参照数)のあるプロジェクトを表示します。プロジェクトをクリックすると表示されます。" }, - "editor-dark-mode/title": { - "message": "エディターのダークモード" - }, + "editor-dark-mode/title": { "message": "エディターのダークモード" }, "editor-dark-mode/description": { "message": "エディターの明るい配色を暗い配色に切り替えます。" }, - "hide-studio-group-icon/title": { - "message": "スタジオのアイコンを非表示" - }, + "hide-studio-group-icon/title": { "message": "スタジオのアイコンを非表示" }, "hide-studio-group-icon/description": { "message": "スタジオのアイコンを非表示にし、スタジオ名のみ表示します。" }, - "colored-messages/title": { - "message": "色付きのメッセージ" - }, + "colored-messages/title": { "message": "色付きのメッセージ" }, "colored-messages/description": { "message": "好き、お気に入り、スタジオ招待など、メッセージの種類に応じて色を付けます。" }, - "full-title/title": { - "message": "全体のプロジェクト名" - }, + "full-title/title": { "message": "全体のプロジェクト名" }, "full-title/description": { "message": "プロフィールでプロジェクト名にカーソルを合わせると、プロジェクト名の全文が表示されます。" }, - "fixed-box/title": { - "message": "右クリックメニューの修正" - }, + "fixed-box/title": { "message": "右クリックメニューの修正" }, "fixed-box/description": { "message": "プロフィールなどのボックスの上の角だけでなく、すべての角を丸くします。" }, - "user-bio/title": { - "message": "カーソルを合わせてプロフィールの表示" - }, + "user-bio/title": { "message": "カーソルを合わせてプロフィールの表示" }, "user-bio/description": { "message": "プロフィールのコメントで、ユーザー名にカーソルを合わせると、そのユーザーのプロフィールが表示されます。" }, - "nfe-project-checker/title": { - "message": "NFEプロジェクトチェッカー" - }, + "nfe-project-checker/title": { "message": "NFEプロジェクトチェッカー" }, "nfe-project-checker/description": { "message": "プロジェクトが「Safe(安全)」「Unreviewed(未審査)」「NSFE(万人むけでない)」のどれに評価されているかを表示します。" }, - "sprite-data/title": { - "message": "スプライトの情報を表示" - }, + "sprite-data/title": { "message": "スプライトの情報を表示" }, "sprite-data/description": { "message": "各スプライトのコード、コスチューム、音タブに、スプライトのブロックの数、コスチュームの数、音の数が表示されます。" }, - "aviate/title": { - "message": "Aviateのステータス" - }, + "aviate/title": { "message": "Aviateのステータス" }, "aviate/description": { "message": "プロフィールページにAviateのステータスを表示します。ステータスはaviate.scratchers.techで設定できます。" }, - "idea-generator/title": { - "message": "プロジェクトのアイデア生成器" - }, + "idea-generator/title": { "message": "プロジェクトのアイデア生成器" }, "idea-generator/description": { "message": "Scratchのアイデアのページに、必要に応じてプロジェクトのアイデアを生成できるチュートリアルを追加します。" }, @@ -863,15 +635,11 @@ "hide-stickies/description": { "message": "フォーラムの一番上にあるピン止めされたトピックのピン止めを外します。" }, - "nfe-search/title": { - "message": "NFE検索" - }, + "nfe-search/title": { "message": "NFE検索" }, "nfe-search/description": { "message": "普段表示されないNFE(万人向けでないプロジェクト)を含む全プロジェクトを検索します。" }, - "open-in-new-tab/title": { - "message": "新しいタブで開く" - }, + "open-in-new-tab/title": { "message": "新しいタブで開く" }, "open-in-new-tab/description": { "message": "プロジェクトページ上のリンクを自動的に新しいタブで開きます。" }, @@ -881,27 +649,19 @@ "unbold-site-text/description": { "message": "Scratchのすべての太字のテキストが通常のテキストになります。" }, - "compact-navbar/title": { - "message": "コンパクトなナビゲーションバー" - }, + "compact-navbar/title": { "message": "コンパクトなナビゲーションバー" }, "compact-navbar/description": { "message": "ナビゲーションバーを縮めて、プロフィールの下のスペースを広くします。" }, - "delete-all/title": { - "message": "全てのスプライトの削除" - }, + "delete-all/title": { "message": "全てのスプライトの削除" }, "delete-all/description": { "message": "スプライトの右クリックメニューにすべてのスプライトを削除するオプションを追加しました(確認画面が表示されます)。" }, - "round-profile-pictures/title": { - "message": "丸いプロフィールアイコン" - }, + "round-profile-pictures/title": { "message": "丸いプロフィールアイコン" }, "round-profile-pictures/description": { "message": "プロフィールのアイコンが丸くなります。" }, - "ocular-link/title": { - "message": "フォーラムでのOcularへのリンク" - }, + "ocular-link/title": { "message": "フォーラムでのOcularへのリンク" }, "ocular-link/description": { "message": "投稿したユーザーのユーザー名の下にOcularページへのリンクを追加します。" }, @@ -911,21 +671,15 @@ "forum-scratch-team/description": { "message": "フォーラムに参加しているScratch Teamのメンバーのユーザー名の横には、アスタリスク(*)が付けられます。" }, - "remove-editor-icons/title": { - "message": "エディターのアイコンの非表示" - }, + "remove-editor-icons/title": { "message": "エディターのアイコンの非表示" }, "remove-editor-icons/description": { "message": "エディターの横に表示されているブロックカテゴリーのアイコンを削除します。" }, - "sprite-watermark/title": { - "message": "スプライトの透かしの非表示" - }, + "sprite-watermark/title": { "message": "スプライトの透かしの非表示" }, "sprite-watermark/description": { "message": "コードエディターの右上に表示されているスプライトの透かしを非表示にします。" }, - "compact-editor/title": { - "message": "コンパクトなエディター" - }, + "compact-editor/title": { "message": "コンパクトなエディター" }, "compact-editor/description": { "message": "スプライトや背景の情報をよりコンパクトにします。" }, @@ -935,10 +689,8 @@ "my-recent-projects/description": { "message": "トップページのScratchニュースを最近のプロジェクトに置き換えます。" }, - "focus-mode/title": { - "message": "フォーカスモード" - }, + "focus-mode/title": { "message": "フォーカスモード" }, "focus-mode/description": { "message": "ボタンをクリックすると、プロジェクトページのコメント、スタジオ、リミックス、ヘッダー、フッターを削除します。" } -} \ No newline at end of file +} diff --git a/extras/feature-locales/tr.json b/extras/feature-locales/tr.json index 44fcf47a..4dfa5982 100644 --- a/extras/feature-locales/tr.json +++ b/extras/feature-locales/tr.json @@ -1,115 +1,101 @@ { - "fullscreen-explorer/title": { - "message": "Tam Ekran Proje Izgaraları" + "stage-in-spritepane/title": { "message": "Kukla Bölmesinde Sahne" }, + "stage-in-spritepane/description": { + "message": "Sprite alanını genişletmek için sahne düğmesini kukla bölmesine taşıyın." }, - "fullscreen-explorer/description": { - "message": "Trendler, Arama, Remix sayfalarında sol ve sağdaki boşlukları kaldırarak projeleri büyük ekranda bulun." + "better-cloud-history/title": { "message": "Daha İyi Bulut Geçmişi" }, + "better-cloud-history/description": { + "message": "Bulut monitörü sayfasını daha fazla ayrıntı içeren daha modern bir sürüme günceller. Değişkene göre sıralamak için değişken adlarına tıklayabilirsiniz." }, - "total-stats/title": { - "message": "Toplam Kullanıcı İstatistikleri" + "sprite-layers/title": { "message": "Kukla Katmanlarını Görüntüle" }, + "sprite-layers/description": { + "message": "Kukla katmanlarını görüntülemek için düzenleyicinin kukla özellikleri panelindeki göster/gizle geçişinin üzerine gelmenizi sağlar." }, - "total-stats/description": { - "message": "Kullanıcının profilindeki paylaşılan projelerin yanında, kullanıcının tüm paylaşılan projelerinde aldığı toplam beğeniler, favoriler ve görüntülemeler görüntülenir." + "hide-project-tags/title": { "message": "Proje Etiketlerini Gizle" }, + "hide-project-tags/description": { + "message": "Projelerin Talimatlarında / Notlarında ve Kredilerinde bağlantılı tüm etiketleri gizler." }, - "project-miniplayer/title": { - "message": "Proje Mini Ekranı" + "snap-to-grid/title": { "message": "Komut Dosyalarını Izgaraya Yapıştırma" }, + "snap-to-grid/description": { + "message": "Kodlar yerleştirildiğinde düzenleyicideki noktalı ızgaraya otomatik olarak hizalanır." }, - "project-miniplayer/description": { - "message": "Proje sayfasını aşağı kaydırdığınızda otomatik olarak proje mini ekranını göreceksiniz." + "select-self/title": { "message": "Kendini Seç" }, + "select-self/description": { + "message": "Kukla açılır menülerini açarken yalnızca diğer kuklalar yerine geçerli kuklayı seçmenizi sağlar." + }, + "sidebar/title": { "message": "Kenar çubuğu" }, + "sidebar/description": { + "message": "Ekranın üst kısmındaki normal gezinme çubuğu yerine Scratch web sitesine bir kenar çubuğu ekler." }, - "project-descriptions/title": { - "message": "Özetlenmiş Talimatlar" + "project-version-detector/title": { "message": "Proje Sürümü Dedektörü" }, + "project-version-detector/description": { + "message": "Bir projenin ne zaman paylaşıldığını kontrol eder ve o sırada Scratch'in hangi sürümünün kullanıldığını belirtmek için paylaşım tarihinin yanına bir etiket ekler." + }, + "fullscreen-explorer/title": { "message": "Tam Ekran Proje Izgaraları" }, + "fullscreen-explorer/description": { + "message": "Trendler, Arama, Remix sayfalarında sol ve sağdaki boşlukları kaldırarak projeleri büyük ekranda bulun." }, + "project-descriptions/title": { "message": "Özetlenmiş Talimatlar" }, "project-descriptions/description": { "message": "İstediğiniz zaman proje talimatlarını özetlemek için yapay zekayı kullanır ve uzun açıklamaları oyun talimatları gibi önemli bilgilere kadar kısaltır." }, - "pin-comments/title": { - "message": "Proje Yorumlarını İğnele" + "total-stats/title": { "message": "Toplam Kullanıcı İstatistikleri" }, + "total-stats/description": { + "message": "Kullanıcının profilindeki paylaşılan projelerin yanında, kullanıcının tüm paylaşılan projelerinde aldığı toplam beğeniler, favoriler ve görüntülemeler görüntülenir." + }, + "project-miniplayer/title": { "message": "Proje Mini Ekranı" }, + "project-miniplayer/description": { + "message": "Proje sayfasını aşağı kaydırdığınızda otomatik olarak proje mini ekranını göreceksiniz." }, + "pin-comments/title": { "message": "Proje Yorumlarını İğnele" }, "pin-comments/description": { "message": "Yorumları kendi projelerinize sabitlemenize ve diğer projelere hangi yorumların sabitlendiğini görmenize olanak tanır." }, - "sidebar/title": { - "message": "Kenar çubuğu" - }, - "sidebar/description": { - "message": "Ekranın üst kısmındaki normal gezinme çubuğu yerine Scratch web sitesine bir kenar çubuğu ekler." - }, - "project-version-detector/title": { - "message": "Proje Sürümü Dedektörü" - }, - "project-version-detector/description": { - "message": "Bir projenin ne zaman paylaşıldığını kontrol eder ve o sırada Scratch'in hangi sürümünün kullanıldığını belirtmek için paylaşım tarihinin yanına bir etiket ekler." - }, - "download-project/title": { - "message": "Projeleri İndir" - }, + "download-project/title": { "message": "Projeleri İndir" }, "download-project/description": { "message": "Proje sayfalarına, projeyi .sb3 dosyası olarak indirmenize olanak tanıyan bir buton ekler." }, - "blur-modal/title": { - "message": "Modal Arka Planları Bulanıklaştır" - }, + "blur-modal/title": { "message": "Modal Arka Planları Bulanıklaştır" }, "blur-modal/description": { "message": "Modalların renkli bir örtü yerine arka planlarını bulanıklaştırır." }, - "quick-search/title": { - "message": "Hızlı Arama" - }, + "quick-search/title": { "message": "Hızlı Arama" }, "quick-search/description": { "message": "Scratch web sitesinde Control + K tuşlarına basarak sayfalar arasında kolayca geçiş yapın." }, - "favicon-messages/title": { - "message": "Sekme Mesaj Sayısı" - }, + "favicon-messages/title": { "message": "Sekme Mesaj Sayısı" }, "favicon-messages/description": { "message": "Tab favicon'da mesaj sayınızı, sekmenizin üstündeki Scratch simgesini görüntüler." }, - "show-emoji-names/title": { - "message": "Emoji İsmini Göster" - }, + "show-emoji-names/title": { "message": "Emoji İsmini Göster" }, "show-emoji-names/description": { "message": "Yorumlardaki Scratch emojilerinin üzerine gelerek isimlerini görmenizi sağlar." }, - "more-block-themes/title": { - "message": "Daha Fazla Blok Teması" - }, + "more-block-themes/title": { "message": "Daha Fazla Blok Teması" }, "more-block-themes/description": { "message": "Kod düzenleyicisindeki bloklar için ek temalar ekler." }, - "more-key-inputs/title": { - "message": "Daha Fazla Anahtar Girişi" - }, + "more-key-inputs/title": { "message": "Daha Fazla Anahtar Girişi" }, "more-key-inputs/description": { "message": "\"Tuşa basıldı\" bloklarında daha fazla tuş desteği ekler." }, - "comment-tags/title": { - "message": "Editör Yorum Etiketleri" - }, + "comment-tags/title": { "message": "Editör Yorum Etiketleri" }, "comment-tags/description": { "message": "Editör yorumlarına etiket ekleyerek onları kolayca düzenleyin." }, - "profile-flag/title": { - "message": "Profilde Bayrak" - }, + "profile-flag/title": { "message": "Profilde Bayrak" }, "profile-flag/description": { "message": "Profil sayfalarında seçilen konumların yakınına bayrak emojileri ekler." }, - "follow-on-projects/title": { - "message": "Proje Sayfasını Takip Et" - }, + "follow-on-projects/title": { "message": "Proje Sayfasını Takip Et" }, "follow-on-projects/description": { "message": "Profiline gitmek yerine, kullanıcıları doğrudan proje sayfasından takip et." }, - "dark-paint-editor/title": { - "message": "Boya Arka Planını Değiştir" - }, + "dark-paint-editor/title": { "message": "Boya Arka Planını Değiştir" }, "dark-paint-editor/description": { "message": "Boyama editöründe yakınlaştırma kontrollerinin yanına bir düğme ekler. Bu düğme, boyama editörünün arka plan rengini açık ve koyu arasında değiştirmenize olanak sağlar." }, - "specific-replies/title": { - "message": "Özel Yanıt Mesajları" - }, + "specific-replies/title": { "message": "Özel Yanıt Mesajları" }, "specific-replies/description": { "message": "Yorumlara ilişkin iletilerde, bir yorumun hangi kişiye yanıt olduğunu belirtir." }, @@ -119,81 +105,51 @@ "better-trending-thumbnails/description": { "message": "Trend ve arama sayfalarındaki küçük resimleri güncelleyerek, proje/stüdyo kutusuna daha büyük ve daha iyi uyacak şekilde düzenler." }, - "relevant-forum-posts/title": { - "message": "İlgili forum gönderilerini görüntüle." - }, - "relevant-forum-posts/description": { - "message": "Yeni bir forum konusu oluştururken, oluşturduğunuz konuyla benzer olabilecek diğer konuları gösterir." - }, - "anti-generic/title": { - "message": "Anti Jenerik" - }, + "anti-generic/title": { "message": "Anti Jenerik" }, "anti-generic/description": { "message": "Keşfet ve trend sayfalarında, bu beta özelliği, genel olmasını beklediği projelerle birlikte tekrarlayan projeleri otomatik olarak gizler. Bu, çok sayıda etiket, ortak ad ve proje kopyası içeren projeleri içerir." }, - "wrap-lists/title": { - "message": "Kaydırılabilen Liste Öğeleri" - }, + "wrap-lists/title": { "message": "Kaydırılabilen Liste Öğeleri" }, "wrap-lists/description": { "message": "Liste öğelerinde metni normal olarak görüntüler eğer çok uzunlarsa kesmeden gösterir." }, - "live-stats/title": { - "message": "Canlı istatistikler" - }, + "live-stats/title": { "message": "Canlı istatistikler" }, "live-stats/description": { "message": "Bir projedeki beğenileri, favorileri, remixleri ve görüntülemeleri yeniden yüklemeye gerek duymadan canlı olarak günceller." }, - "hide-scratch-news/title": { - "message": "Scratch Haberlerini Gizle" - }, + "hide-scratch-news/title": { "message": "Scratch Haberlerini Gizle" }, "hide-scratch-news/description": { "message": "Scratch web sitesinin ana sayfasındaki Scratch Haberler bölümünü gizler." }, - "watch-later/title": { - "message": "Kaydedip Sonra İzle" - }, + "watch-later/title": { "message": "Kaydedip Sonra İzle" }, "watch-later/description": { "message": "Sonradan tekrar izlemek istediğiniz projeleri kaydedin ve sonra ise bunları daha sonra izlemek için bir \"İzlemek İçin Kaydet\" adlı bir sayfadan tekrar izleyebilirsiniz." }, - "remove-project-button/title": { - "message": "Proje Düğmesini Kaldır" - }, + "remove-project-button/title": { "message": "Proje Düğmesini Kaldır" }, "remove-project-button/description": { "message": "Stüdyolardaki projelere kolayca erişim sağlayan ve projeyi menüyü açmadan stüdyodan çıkartmanıza izin veren bir düğme ekler." }, - "right-side-flag/title": { - "message": "Bayrak Sağ Tarafta" - }, + "right-side-flag/title": { "message": "Bayrak Sağ Tarafta" }, "right-side-flag/description": { "message": "Yeşil bayrağı ve kırmızı dur işaretini sahne'nin sağ tarafına taşır." }, - "love-fave-animate/title": { - "message": "Animasyonlu Butonlar." - }, + "love-fave-animate/title": { "message": "Animasyonlu Butonlar." }, "love-fave-animate/description": { "message": "Projelerin sayfalarındaki \"Kalp\" ve \"Yıldız\" düğmelerinin tıklanmasını animasyonlaştırır." }, - "default-to-local/title": { - "message": "Varsayılan olarak Yerel" - }, + "default-to-local/title": { "message": "Varsayılan olarak Yerel" }, "default-to-local/description": { "message": "Bir değişken oluştururken, varsayılanı Tüm Hareketli Grafikler için değil, Yalnızca Bu Hareketli Grafik için ayarlar." }, - "start-stop-hotkeys/title": { - "message": "Yeşil Bayrak Kısayolları" - }, + "start-stop-hotkeys/title": { "message": "Yeşil Bayrak Kısayolları" }, "start-stop-hotkeys/description": { "message": "Bir projeyi başlatmak veya durdurmak için Ctrl ve G Tuşlarına aynı anda basın. " }, - "opacity-slider/title": { - "message": "Düzenleyici Saydamlık Ayarı" - }, + "opacity-slider/title": { "message": "Düzenleyici Saydamlık Ayarı" }, "opacity-slider/description": { "message": "Resim düzenleyicide nesnelerin şeffaflığını değiştirmeye yarayan bir kısım ekler." }, - "more-studios/title": { - "message": "Daha Fazla Stüdyo" - }, + "more-studios/title": { "message": "Daha Fazla Stüdyo" }, "more-studios/description": { "message": "Projenizi en fazla 20 Stüdyo'ya koyabilme kapasitesini artırır." }, @@ -203,51 +159,35 @@ "localized-explore/description": { "message": "Keşfet sayfasında, diğer ülkelerden gelen projeleri %10 Şeffaf hale getirir. Bu, yalnızca kendi dilinizdeki projeleri göstermek içindir." }, - "project-bar/title": { - "message": "Proje Bilgi Çubuğu" - }, + "project-bar/title": { "message": "Proje Bilgi Çubuğu" }, "project-bar/description": { "message": "Proje bilgilerini, notlar ve kredilerin altına kaydırdıktan sonra bile görüntülemeye devam etmesini sağlar." }, - "more-news/title": { - "message": "Daha Fazla Scratch Haberi" - }, + "more-news/title": { "message": "Daha Fazla Scratch Haberi" }, "more-news/description": { "message": "Ana sayfada Scratch Haberleri kısmına aşağı kaydırıp eski haberleri görmek için bir buton ekler." }, - "dumpster-fire/title": { - "message": "Çöplük Ateşi" - }, + "dumpster-fire/title": { "message": "Çöplük Ateşi" }, "dumpster-fire/description": { "message": "Scratch ana sayfası, \"Öne Çıkan Projeler\" bölümüyle bir yanlıştır. Bu, adı \"Çöplük Ateşi\" olan uygun forma değiştirir." }, - "steal-game/title": { - "message": "Oyunları Çal." - }, + "steal-game/title": { "message": "Oyunları Çal." }, "steal-game/description": { "message": "Remix düğmesinin metnini 'Oyun Çal' olarak değiştirir." }, - "statistics/title": { - "message": "Kullanıcı istatistikleri" - }, + "statistics/title": { "message": "Kullanıcı istatistikleri" }, "statistics/description": { "message": "Scratch'te \"Kendiminkiler sayfasına ScratchStats (Scratch istatistikleri) profilinize yönlendiren bir istatistik düğmesi ekler." }, - "echo-effect/title": { - "message": "Yankı Efekti" - }, + "echo-effect/title": { "message": "Yankı Efekti" }, "echo-effect/description": { "message": "Scratch'te ses düzenleyicisi kısmına Yankı butonunu ekler." }, - "compact-buttons/title": { - "message": "Yazıları simgeye çevir." - }, + "compact-buttons/title": { "message": "Yazıları simgeye çevir." }, "compact-buttons/description": { "message": "Scratch'teki butonlardaki metin kaldırılır, sadece simgesi görünür. Eğer bir simgesi yoksa yeni bir simge eklenir" }, - "message-count/title": { - "message": "Kullanıcı Mesaj Sayısı" - }, + "message-count/title": { "message": "Kullanıcı Mesaj Sayısı" }, "message-count/description": { "message": "Kullanıcıların profil kısmında kullanıcı bilgilerindeki kişinin ülke bilgisinin yanında kullanıcının bakılmamış mesaj sayısı gözükür." }, @@ -257,15 +197,11 @@ "move-share-button/description": { "message": "Projelerin sayfasında, Paylaş düğmesini \"İçine Bak\" düğmesinin yanına taşır." }, - "preview-textboxes/title": { - "message": "Metin kutularını önizleme" - }, + "preview-textboxes/title": { "message": "Metin kutularını önizleme" }, "preview-textboxes/description": { "message": "Scratch profilinizde \"Hakkımda\" ve \"Üzerinde Çalıştığım Proje\" veya \nScratch projelerinizde \"Notlar\" ve \"Talimatları\", sanki başka bir hesaptan\nbakıyormuş gibi ön izlemenizi sağlar." }, - "more-tutorials/title": { - "message": "Daha Fazla Öğretici" - }, + "more-tutorials/title": { "message": "Daha Fazla Öğretici" }, "more-tutorials/description": { "message": "Fikirler sayfasında, diğer Scratch kullanıcılarından ekstra rehberleri görebilirsiniz." }, @@ -275,33 +211,19 @@ "simplify-action-buttons/description": { "message": "Proje eylem düğmelerini, notlar ve kredilerin altında simgeleri olarak gösterir." }, - "slash-to-search/title": { - "message": "Arama Kısayolları" - }, + "slash-to-search/title": { "message": "Arama Kısayolları" }, "slash-to-search/description": { "message": "Arama çubuğunu seçmek ve yazmaya başlamak için \" / \" tuşuna tıklayın." }, - "shared-clipboard/title": { - "message": "Paylaşılan resim panosu" - }, + "shared-clipboard/title": { "message": "Paylaşılan resim panosu" }, "shared-clipboard/description": { "message": "Farklı projelerdeki resim düzenleyicileri arasında öğeleri kopyalamanıza ve yapıştırmanıza izin verir." }, - "important-messages/title": { - "message": "Önemli Mesajlar" - }, - "important-messages/description": { - "message": "Mesajlar sayfasında önemli mesajları ayırır." - }, - "hide-footer/title": { - "message": "Alt bilgiyi Gizle" - }, + "hide-footer/title": { "message": "Alt bilgiyi Gizle" }, "hide-footer/description": { "message": "Altbilgi gereksiz fazla alan kaplıyor, bu yüzden gizleyelim!" }, - "original-colors/title": { - "message": "Mavi'ye Geri Dön" - }, + "original-colors/title": { "message": "Mavi'ye Geri Dön" }, "original-colors/description": { "message": "Scratch'in tüm web sitesini mor renkten, Scratch 3.0'daki gibi maviye çevirir." }, @@ -311,75 +233,51 @@ "simplify-editor-tabs/description": { "message": "Editör'deki butonları yalnızca simge halinde gösterir ve onları bir daire olarak gösterir." }, - "live-character-counts/title": { - "message": "Canlı Karakter Sayısı" - }, + "live-character-counts/title": { "message": "Canlı Karakter Sayısı" }, "live-character-counts/description": { "message": "Forum, stüdyo ve proje sayfalarında metin kutuları için canlı karakter sayısını gösterir." }, - "advanced-search/title": { - "message": "Profilleri Ara" - }, + "advanced-search/title": { "message": "Profilleri Ara" }, "advanced-search/description": { "message": "Scratch'te Arama bölümünde kullanıcıyı aradığınızda, aradığınız kullanıcının profilinize giden bir bağlantı butonu ekler." }, - "studio-links/title": { - "message": "İsimli stüdyo bağlantıları" - }, + "studio-links/title": { "message": "İsimli stüdyo bağlantıları" }, "studio-links/description": { "message": "Scratch web sitesindeki tüm stüdyo bağlantılarını stüdyo ismiyle değiştirir." }, - "block-studios/title": { - "message": "Bireysel Stüdyo Etkinliğini Engelle" - }, + "block-studios/title": { "message": "Bireysel Stüdyo Etkinliğini Engelle" }, "block-studios/description": { "message": "Belirli stüdyolardan stüdyo etkinliği mesajlarını devre dışı bırakın." }, - "block-messages/title": { - "message": "Kullanıcıları Engelle" - }, + "block-messages/title": { "message": "Kullanıcıları Engelle" }, "block-messages/description": { "message": "Engellediğiniz kullanıcılardan gelen mesajları gizler. \nDiğer kullanıcılar sizi engellediğinizi görmeyecek." }, - "two-colors/title": { - "message": "2.0 Blok Renkleri" - }, + "two-colors/title": { "message": "2.0 Blok Renkleri" }, "two-colors/description": { "message": "Düzenleyicideki blokların renklerini, kod düzenleyicisinin 2.0 sürümündeki bloklarla değiştirir." }, - "project-links/title": { - "message": "İsimli proje bağlantıları" - }, + "project-links/title": { "message": "İsimli proje bağlantıları" }, "project-links/description": { "message": "Scratch web sitesindeki tüm proje bağlantılarını proje ismiyle değiştirir." }, - "emoji-status/title": { - "message": "Emoji Durumu" - }, + "emoji-status/title": { "message": "Emoji Durumu" }, "emoji-status/description": { "message": "Profilinizdeki durumu bir emoji olarak ayarlar. \nDiğer ScratchTools kullanıcıları bu durumu görebilir." }, - "display-name/title": { - "message": "Görünen İsimler" - }, + "display-name/title": { "message": "Görünen İsimler" }, "display-name/description": { "message": "Scratch kullanıcıları için görünen adlarınızı gösterir ve kendi görünen adınızı ayarlamanıza olanak sağlar. Görünen adlar, kullanıcı adlarınız gibi sınırlı değildir ve kullanıcı adınızın yanında görüntülenir." }, - "isonline/title": { - "message": "Kullanıcının aktifliği" - }, + "isonline/title": { "message": "Kullanıcının aktifliği" }, "isonline/description": { "message": "Profil sayfalarında kullanıcının çevrimiçi olup olmadığını gösterir. Bu aynı zamanda diğer kullanıcıların sizi çevrimiçi olup olmadığını görmelerini sağlar." }, - "plain-background/title": { - "message": "Noktasız editör arka planı" - }, + "plain-background/title": { "message": "Noktasız editör arka planı" }, "plain-background/description": { "message": "Kod düzenleyicisinin arka planındaki noktaları kaldırır." }, - "hide-advertisements/title": { - "message": "Mesajlardaki Reklamları Kaldır" - }, + "hide-advertisements/title": { "message": "Mesajlardaki Reklamları Kaldır" }, "hide-advertisements/description": { "message": "Profillerin, projelerin ve stüdyoların yorumlarındaki reklamları gizler. Yorumlarda çok yer kaplayabilirler." }, @@ -389,9 +287,7 @@ "hide-block-category-names/description": { "message": "Düzenleyicideki blok kategorilerini yalnızca kategorilerin renklerini gösterecek şekilde değiştirir." }, - "unlisted-projects/title": { - "message": "Liste Dışı Projeler" - }, + "unlisted-projects/title": { "message": "Liste Dışı Projeler" }, "unlisted-projects/description": { "message": "Düzenleyicide paylaşılmayan projeler için paylaşım bağlantıları oluşturmanıza olanak tanır." }, @@ -401,33 +297,23 @@ "stats-percentages/description": { "message": "Kendiminkiler sayfasında, beğenilerin, favorilerin veya remixlerin üzerine gelerek, bu eylemi gerçekleştiren izleyicilerin yüzdesini görüntüleyebilirsiniz." }, - "clone-counter/title": { - "message": "Klon Sayacı" - }, + "clone-counter/title": { "message": "Klon Sayacı" }, "clone-counter/description": { "message": "Projedeki kopya sayısını sahne başlığının üzerinde görüntüler." }, - "colored-shadows/title": { - "message": "Renkli Gölgeler" - }, + "colored-shadows/title": { "message": "Renkli Gölgeler" }, "colored-shadows/description": { "message": "Bir bloğu diğer bir bloğa yaklaştırdığınızda oluşan gölgeyi taşınan bloğun rengi ile değiştirir." }, - "creator-badge/title": { - "message": "Proje Sahibi Rozeti" - }, + "creator-badge/title": { "message": "Proje Sahibi Rozeti" }, "creator-badge/description": { "message": "Projeyi oluşturan kişinin yazdığı yorumların yanına bir rozet ekler." }, - "original-buttons/title": { - "message": "Orijinal Butonlar" - }, + "original-buttons/title": { "message": "Orijinal Butonlar" }, "original-buttons/description": { "message": "Orijinal kalp, favori, remix ve görünüm düğmelerini Scratch projesi sayfalarına döndürür." }, - "box-shadows/title": { - "message": "İçerik Kutusu Gölgeleri" - }, + "box-shadows/title": { "message": "İçerik Kutusu Gölgeleri" }, "box-shadows/description": { "message": "Tüm içerik kutularına gölgeler ekler. Birinin üzerine gelindiğinde gölge koyulaşır." }, @@ -437,69 +323,45 @@ "admin-notifications/description": { "message": "Scratch Ekibinden bir yönetici bildiriminiz varsa, gezinme çubuğundaki mesaj göstergesi turuncu yerine kırmızı renkte görüntülenir." }, - "nicknames/title": { - "message": "Takma Adlar" - }, + "nicknames/title": { "message": "Takma Adlar" }, "nicknames/description": { "message": "Diğer Scratch'çiler için takma adlar belirleyin. Takma adları yalnızca siz görebilirsiniz ve adlarını gördüğünüzde kullanıcı adları takma adla değiştirilecektir." }, - "load-more-forum-posts/title": { - "message": "Daha fazla gönderi yükle" - }, + "load-more-forum-posts/title": { "message": "Daha fazla gönderi yükle" }, "load-more-forum-posts/description": { "message": "Sayfaları değiştirmek zorunda kalmadan forumda daha fazla gönderi yükleyin." }, - "scroll-project-titles/title": { - "message": "Proje Başlıklarını Kaydır" - }, + "scroll-project-titles/title": { "message": "Proje Başlıklarını Kaydır" }, "scroll-project-titles/description": { "message": "Sahip olmadığınız projelerin başlığının tamamını kaydırmanıza ve görüntülemenize olanak tanır." }, - "search-context-menus/title": { - "message": "Arama Bağlam Menüleri" - }, + "search-context-menus/title": { "message": "Arama Bağlam Menüleri" }, "search-context-menus/description": { "message": "Seçeneği hızlı bir şekilde seçmek için tür ve arama bağlam menülerini kullanabilirsiniz. Ayrıca en üst seçeneği seçmek için \"enter\" tuşunu da kullanabilirsiniz." }, - "hover-user-cards/title": { - "message": "Kullanıcı Vurgulu Kartları" - }, + "hover-user-cards/title": { "message": "Kullanıcı Vurgulu Kartları" }, "hover-user-cards/description": { "message": "Profil resmini, kullanıcı adını ve takipçi sayısını görüntülemek için web sitesindeki herhangi bir kullanıcı adının üzerine gelin." }, - "exact-join-date/title": { - "message": "Tam Katılım Tarihi" - }, + "exact-join-date/title": { "message": "Tam Katılım Tarihi" }, "exact-join-date/description": { "message": "Bir kullanıcının katıldığı tam zamanı profilinde gösterir." }, - "upload-img-directly/title": { - "message": "Doğrudan Resim Yüklemeleri" - }, + "upload-img-directly/title": { "message": "Doğrudan Resim Yüklemeleri" }, "upload-img-directly/description": { "message": "Scratch forumları için iletiler ve imzalar için resim yüklemenize olanak tanır, üçüncü taraf resim yükleme hizmetlerini kullanmanıza gerek kalmaz." }, - "leave-studio/title": { - "message": "Stüdyodan Ayrıl Düğmesi" - }, + "leave-studio/title": { "message": "Stüdyodan Ayrıl Düğmesi" }, "leave-studio/description": { "message": "Yönettiğiniz veya katkıda bulunduğunuz stüdyoların küratörler sayfasına stüdyodan ayrılmanızı sağlayan bir düğme ekler. İlk olarak bir onay gösterilir." }, - "user-stats/title": { - "message": "Kullanıcı İstatistiklerini Göster" - }, - "user-stats/description": { - "message": "Bir profil sayfasındaki 'Ne yapıyorum' bölümünü kullanıcının istatistikleriyle değiştirir." - }, "frontpage-curator/title": { "message": "Ön sayfa İdareci Adı Bağlantı olarak" }, "frontpage-curator/description": { "message": "Ön sayfa İdarecinin adını profiline tıklanabilir bir bağlantıya dönüştürür." }, - "minimized-remix-credits/title": { - "message": "Küçültülmüş Remix Kredileri" - }, + "minimized-remix-credits/title": { "message": "Küçültülmüş Remix Kredileri" }, "minimized-remix-credits/description": { "message": "Projeler için remix kredi kutuları proje Talimatlarından yer kaplar, bu nedenle bu kutuyu küçültür." }, @@ -509,9 +371,7 @@ "follows-you/description": { "message": "Bir kullanıcı sizi takip ediyorsa, profilini ziyaret ettiğinizde kullanıcı adının yanında gösterilir." }, - "custom-studio/title": { - "message": "Özel Stüdyo Bölümü" - }, + "custom-studio/title": { "message": "Özel Stüdyo Bölümü" }, "custom-studio/description": { "message": "Scratch web sitesinin ana sayfasında, seçtiğiniz stüdyodan en yeni projeler Öne Çıkan Projelerin üzerinde görüntülenir." }, @@ -521,15 +381,7 @@ "highlight-unanswered/description": { "message": "Forumlarda yanıtı olmayan konulara mavi bir vurgu ekler." }, - "hide-project-tags/title": { - "message": "Proje Etiketlerini Gizle" - }, - "hide-project-tags/description": { - "message": "Projelerin Talimatlarında / Notlarında ve Kredilerinde bağlantılı tüm etiketleri gizler." - }, - "search-assets/title": { - "message": "Aranabilir Kuklalar" - }, + "search-assets/title": { "message": "Aranabilir Kuklalar" }, "search-assets/description": { "message": "Editörde kostüm ve ses kuklalarını aramak için bir kısım ekler." }, @@ -539,33 +391,23 @@ "block-count-in-mystuff/description": { "message": "Eşyalarım sayfasında projelerin blok sayısını görüntüler." }, - "pause-audio/title": { - "message": "Sesi Duraklat" - }, + "pause-audio/title": { "message": "Sesi Duraklat" }, "pause-audio/description": { "message": "Scratch projelerinin ses düzenleyicisinde sesi duraklatmanıza ve devam ettirmenize olanak tanır." }, - "display-message-count-in-icon/title": { - "message": "Mesaj Sayısını Göster" - }, + "display-message-count-in-icon/title": { "message": "Mesaj Sayısını Göster" }, "display-message-count-in-icon/description": { "message": "Mevcut mesaj sayınızı ScratchTools için uzantı simgesinde görüntüler." }, - "colored-context-menus/title": { - "message": "Renkli İçerik Menüleri" - }, + "colored-context-menus/title": { "message": "Renkli İçerik Menüleri" }, "colored-context-menus/description": { "message": "Scratch 2.0'da olduğu gibi, bağlam menülerini, amaçlandıkları bloğun rengine göre renklendirir." }, - "left-side-stage/title": { - "message": "Sol Tarafta Sahne" - }, + "left-side-stage/title": { "message": "Sol Tarafta Sahne" }, "left-side-stage/description": { "message": "Scratch 2.0'da olduğu gibi, sahneyi sağda tutmak yerine editörün sol tarafına taşır." }, - "move-project-title-input/title": { - "message": "Aşama Üstü Proje Başlığı" - }, + "move-project-title-input/title": { "message": "Aşama Üstü Proje Başlığı" }, "move-project-title-input/description": { "message": "Scratch 2.0'da olduğu gibi, proje başlığı giriş kutusunu gezinme çubuğundan ziyade sahne alanının üzerine taşır. Bu sadece editör için geçerlidir." }, @@ -575,15 +417,11 @@ "hide-disabled-menu-options/description": { "message": "Düzenleyicideki içerik menüsü seçenekleri, devre dışı bırakılmış ve kullanılamıyor olsalar bile gösterilir, bu nedenle bu özellik, devre dışı bırakılmışlarsa bunları gizler." }, - "follower-count/title": { - "message": "Projelere Takipçi Sayısı" - }, + "follower-count/title": { "message": "Projelere Takipçi Sayısı" }, "follower-count/description": { "message": "Proje oluşturucunun takipçi sayısını projelerinde görüntüler." }, - "hide-studio-borders/title": { - "message": "Stüdyo Çerçevelerini Gizle" - }, + "hide-studio-borders/title": { "message": "Stüdyo Çerçevelerini Gizle" }, "hide-studio-borders/description": { "message": "2.0 sayfalarındaki stüdyo görüntülerinin etrafındaki tek kareleri kaldırır." }, @@ -593,9 +431,7 @@ "hide-textarea-labels/description": { "message": "Talimatlar, notlar ve kredi etiketleri, olağan bilgilerin olabileceği oldukça fazla yer kaplar. Bu onları ortadan kaldırır." }, - "default-to-trending/title": { - "message": "Varsayılan Olarak Trend Ara" - }, + "default-to-trending/title": { "message": "Varsayılan Olarak Trend Ara" }, "default-to-trending/description": { "message": "Şu anda, Scratch web sitesinde projeler aradığınızda, trend olmak yerine otomatik olarak popüler filtreyle arama yaparsınız." }, @@ -617,9 +453,7 @@ "special-editor-fonts/description": { "message": "Kostüm Editörüne Daha Fazla Yazı Tipi Ekler. Daha güzel görünüyorlar ve daha modernler." }, - "get-project-tags/title": { - "message": "Proje Etiketlerini Görüntüleme" - }, + "get-project-tags/title": { "message": "Proje Etiketlerini Görüntüleme" }, "get-project-tags/description": { "message": "Proje açıklamasında kullanılan tüm etiketleri proje notlarının ve kredilerinin hemen altında listeler." }, @@ -641,9 +475,7 @@ "cloud-scratchers/description": { "message": "Proje sayfalarında, o anda o çok oyunculu oyunda bulunan tüm Scratch'çileri görüntüler." }, - "editor-in-two/title": { - "message": "2.0 Düzenleyici" - }, + "editor-in-two/title": { "message": "2.0 Düzenleyici" }, "editor-in-two/description": { "message": "Varsayılan 3.0 çevrimiçi proje düzenleyicisini 2.0 düzenleyicisiyle değiştirir. Gerçekten nostaljik." }, @@ -659,75 +491,51 @@ "turbowarp-button-in-editor/description": { "message": "Geçerli projeyi turbowarp'ta anında açabilmeniz için editöre bir düğme ekler." }, - "sprite-clones/title": { - "message": "Hareketli Grafik Klon Sayacı" - }, + "sprite-clones/title": { "message": "Hareketli Grafik Klon Sayacı" }, "sprite-clones/description": { "message": "Her bir hareketli grafik için klon sayısını görüntüler." }, - "block-log/title": { - "message": "Günlüğü Engelle" - }, + "block-log/title": { "message": "Günlüğü Engelle" }, "block-log/description": { "message": "Ctrl+shift+l tuşlarına bastığınızda blok düzenleyicinin tüm geri alma bilgilerini günlüğe kaydeder ve görüntüler." }, - "scrollable-list-items/title": { - "message": "Kaydırılabilir Liste Öğeleri" - }, + "scrollable-list-items/title": { "message": "Kaydırılabilir Liste Öğeleri" }, "scrollable-list-items/description": { "message": "Listenin genişliğinden daha uzun bir değere sahip liste öğeleri kesilir. Artık liste öğesinde sola ve sağa kaydırabilirsiniz." }, - "custom-fonts/title": { - "message": "Özel Web Sitesi Yazı Tipi" - }, + "custom-fonts/title": { "message": "Özel Web Sitesi Yazı Tipi" }, "custom-fonts/description": { "message": "Scratch web sitesinde, yazı tipini Google Fonts web sitesinde olduğu sürece istediğiniz yazı tipine ayarlayabilirsiniz. Bu büyük / küçük harfe duyarlıdır." }, - "project-timer/title": { - "message": "Proje Zamanlayıcısı" - }, + "project-timer/title": { "message": "Proje Zamanlayıcısı" }, "project-timer/description": { "message": "Projenin çalıştığı süreyi (saniye cinsinden) görüntüler." }, - "colored-comments/title": { - "message": "Renkli Editör Yorumları" - }, + "colored-comments/title": { "message": "Renkli Editör Yorumları" }, "colored-comments/description": { "message": "Düzenleyicideki yorumları üst bloğunun rengine göre renklendirir." }, - "recently-viewed-projects/title": { - "message": "Son Görüntülenen Projeler" - }, + "recently-viewed-projects/title": { "message": "Son Görüntülenen Projeler" }, "recently-viewed-projects/description": { "message": "Son görüntülediğiniz projelerin listesini görebileceğiniz Kendiminkiler sayfasına bir sekme ekler." }, - "collapse-blocks/title": { - "message": "Blokları Daralt" - }, + "collapse-blocks/title": { "message": "Blokları Daralt" }, "collapse-blocks/description": { "message": "Düzenleyicideki blok menülerine sağ tıkla, seçilen bloğu daraltmanıza izin verecek bir düğme içerir." }, - "set-featured-project/title": { - "message": "Öne Çıkan Projeyi Ayarla" - }, + "set-featured-project/title": { "message": "Öne Çıkan Projeyi Ayarla" }, "set-featured-project/description": { "message": "Herhangi bir proje sayfasında bir düğmeye tıklayarak profilinizin öne çıkan projesini ayarlayabilirsiniz, hatta paylaşılmamış projeleri bile." }, - "scratchformat/title": { - "message": "Scratch Formatı" - }, + "scratchformat/title": { "message": "Scratch Formatı" }, "scratchformat/description": { "message": "Yorumlarınızı kalın, italik ve daha fazlası ile biçimlendirebilirsiniz. Yorumlar, ScratchTools kullanan herkes için stil kazanır." }, - "expand-editor/title": { - "message": "Düzenleyiciyi Genişlet" - }, + "expand-editor/title": { "message": "Düzenleyiciyi Genişlet" }, "expand-editor/description": { "message": "Ctrl+E tuş kombinasyonunu kullanarak varsayılan blok düzenleyici görünümü ile sahneyi gizleyerek düzenleyiciyi genişleten görünüm arasında geçiş yapabilirsiniz." }, - "list-sprites/title": { - "message": "Kukla Listesi" - }, + "list-sprites/title": { "message": "Kukla Listesi" }, "list-sprites/description": { "message": "Düzenleyicideki kukla ızgarasını, kuklanın blok sayısını ve konumunu içeren bir listeyle değiştirir." }, @@ -749,9 +557,7 @@ "remove-topic-and-post/description": { "message": "Forum ana sayfası konusunu ve gönderi kutularını gizler." }, - "forum-homepage-emojis/title": { - "message": "Forum Kategorisi Emojileri" - }, + "forum-homepage-emojis/title": { "message": "Forum Kategorisi Emojileri" }, "forum-homepage-emojis/description": { "message": "Forum ana sayfası kategorilerine konularına göre renkli emojiler ekler." }, @@ -761,171 +567,115 @@ "remove-collapse-buttons/description": { "message": "Forum ana sayfasındaki daralt düğmelerini gizler." }, - "pin-projects/title": { - "message": "Projeleri Kendiminkilere Sabitle" - }, + "pin-projects/title": { "message": "Projeleri Kendiminkilere Sabitle" }, "pin-projects/description": { "message": "Kendiminkiler sayfanızın üstüne bir projeyi bir düğmeye tıklayarak sabitleyebilirsiniz. Sabitlenmiş projenizi sabitlemeyi kaldırabilir veya başka bir projeyi sabitlenmiş projenizle değiştirebilirsiniz." }, - "last-key-pressed/title": { - "message": "Basılan Son Tuş" - }, + "last-key-pressed/title": { "message": "Basılan Son Tuş" }, "last-key-pressed/description": { "message": "Herhangi bir proje sayfasında ve editörde, projeye göre o projede son bastığınız tuşu görebilirsiniz. Bu, platform tarzı oyunlar gibi oyunlar için faydalı olabilir." }, - "hide-signatures/title": { - "message": "Forum İmzalarını Gizle" - }, + "hide-signatures/title": { "message": "Forum İmzalarını Gizle" }, "hide-signatures/description": { "message": "Tüm forum imzalarını ve imza bölücülerini gizler." }, - "twemoji-in-forums/title": { - "message": "Daha iyi Forum Emojileri" - }, + "twemoji-in-forums/title": { "message": "Daha iyi Forum Emojileri" }, "twemoji-in-forums/description": { "message": "Mevcut düşük çözünürlüklü forum emojilerini yüksek kaliteli Twemoji ile değiştirir." }, - "go-to-parent/title": { - "message": "Ana Düğmeye Git" - }, + "go-to-parent/title": { "message": "Ana Düğmeye Git" }, "go-to-parent/description": { "message": "Remix olan herhangi bir projenin düzenleyicisinde, üst projedeki düzenleyiciye gitmek için bir düğmeyi tıklatabilirsiniz." }, - "most-popular-project/title": { - "message": "En Popüler Proje" - }, + "most-popular-project/title": { "message": "En Popüler Proje" }, "most-popular-project/description": { "message": "Kullanıcının en popüler projesini (görünümlere göre) profil sayfalarında görüntüler. Görüntülemek için projeye tıklayabilirsiniz." }, - "editor-dark-mode/title": { - "message": "Editör Karanlık Modu" - }, + "editor-dark-mode/title": { "message": "Editör Karanlık Modu" }, "editor-dark-mode/description": { "message": "Editörün açık renk düzenini daha koyu bir düzene geçirir." }, - "hide-studio-group-icon/title": { - "message": "Stüdyo Grubu Simgesini Gizle" - }, + "hide-studio-group-icon/title": { "message": "Stüdyo Grubu Simgesini Gizle" }, "hide-studio-group-icon/description": { "message": "Stüdyo grubu simgesini gizler ve yalnızca stüdyo küçük resmini gösterir." }, - "colored-messages/title": { - "message": "Renkli Mesajlar" - }, + "colored-messages/title": { "message": "Renkli Mesajlar" }, "colored-messages/description": { "message": "Mesajlarınızı türüne göre renklendirir, örneğin beğeniler, favoriler ve stüdyo davetiyeleri gibi." }, - "full-title/title": { - "message": "Projenin Tam Adı" - }, + "full-title/title": { "message": "Projenin Tam Adı" }, "full-title/description": { "message": "Profil sayfalarında, başlığın tamamını göstermek için herhangi bir proje başlığının üzerine gelin." }, - "fixed-box/title": { - "message": "İçerik Kutularını Düzeltin" - }, + "fixed-box/title": { "message": "İçerik Kutularını Düzeltin" }, "fixed-box/description": { "message": "Sayfalardaki kutuların tüm kenarlarını yalnızca üst kısımlar yerine yuvarlatılmış hale getirir." }, - "user-bio/title": { - "message": "Vurgulu Kullanıcı Biyografisi" - }, + "user-bio/title": { "message": "Vurgulu Kullanıcı Biyografisi" }, "user-bio/description": { "message": "Profil yorumlarında, kullanıcının biyografisini görüntülemek için herhangi bir kullanıcı adının üzerine gelin." }, - "nfe-project-checker/title": { - "message": "NFE Proje Denetleyicisi" - }, + "nfe-project-checker/title": { "message": "NFE Proje Denetleyicisi" }, "nfe-project-checker/description": { "message": "Proje sayfalarında, projenin Güvenli, Görüntülenmemiş veya NSFE (Herkes için Güvenli Değil) olup olmadığını görüntüler." }, - "sprite-data/title": { - "message": "Hareketli Grafik Verilerini Görüntüleme" - }, + "sprite-data/title": { "message": "Hareketli Grafik Verilerini Görüntüleme" }, "sprite-data/description": { "message": "Her hareketli grafik için Kod, Kostümler ve Sesler sekmesinde geçerli hareketli grafik için blok, kostüm ve ses sayısı görüntülenir." }, - "aviate/title": { - "message": "Havacılık Durumları" - }, + "aviate/title": { "message": "Havacılık Durumları" }, "aviate/description": { "message": "Profil sayfalarında Aviate durumlarını görüntüler. Durumunuzu aviate.scratchers.tech adresinde ayarlayabilirsiniz." }, - "idea-generator/title": { - "message": "Proje Fikir Üreteci" - }, + "idea-generator/title": { "message": "Proje Fikir Üreteci" }, "idea-generator/description": { "message": "Scratch Fikirler sayfasında, ihtiyacınız varsa proje fikirleri oluşturabileceğiniz bir bölüm olacak." }, - "hide-stickies/title": { - "message": "Forum Yapışkanlarını Gizle" - }, + "hide-stickies/title": { "message": "Forum Yapışkanlarını Gizle" }, "hide-stickies/description": { "message": "Her forum konusunun üst kısmındaki temel yapışkanları gizler." }, - "nfe-search/title": { - "message": "NFE Araması" - }, + "nfe-search/title": { "message": "NFE Araması" }, "nfe-search/description": { "message": "NFE projeleri de dahil olmak üzere tüm projeleri aramak için bir düğme kullanın." }, - "open-in-new-tab/title": { - "message": "Yeni Sekmede Aç" - }, + "open-in-new-tab/title": { "message": "Yeni Sekmede Aç" }, "open-in-new-tab/description": { "message": "Proje sayfalarındaki bağlantıları otomatik olarak yeni bir sekmede açar." }, - "unbold-site-text/title": { - "message": "Site Metninin Kalınlığını Kaldır" - }, + "unbold-site-text/title": { "message": "Site Metninin Kalınlığını Kaldır" }, "unbold-site-text/description": { "message": "Tüm Scratch üzerindeki metinlerin kalın olmayan, yani normal metin olarak görüntülenmesini sağlar." }, - "compact-navbar/title": { - "message": "Kompakt Gezinme Çubuğu" - }, + "compact-navbar/title": { "message": "Kompakt Gezinme Çubuğu" }, "compact-navbar/description": { "message": "Profil açılır listenizin bulunduğu yere yakın gezinme çubuğunda daha fazla yer açar." }, - "delete-all/title": { - "message": "Tüm Kuklaları Sil" - }, + "delete-all/title": { "message": "Tüm Kuklaları Sil" }, "delete-all/description": { "message": "Kuklalar için sağ tıklama bağlam menüsüne bir seçenek ekler. Tüm kuklaları silecektir (bir kaza olmadığından emin olmak için onaylandıktan sonra)." }, - "round-profile-pictures/title": { - "message": "Yuvarlak Profil Resimleri" - }, + "round-profile-pictures/title": { "message": "Yuvarlak Profil Resimleri" }, "round-profile-pictures/description": { "message": "Scratch web sitesindeki tüm profil resimleri yuvarlatılacaktır." }, - "ocular-link/title": { - "message": "Forumlardaki Oküler Bağlantılar" - }, + "ocular-link/title": { "message": "Forumlardaki Oküler Bağlantılar" }, "ocular-link/description": { "message": "Herhangi bir kullanıcının Oküler sayfasına, bir gönderideki kullanıcı adının hemen altına bir bağlantı ekler." }, - "forum-scratch-team/title": { - "message": "Forumlarda Scratch Ekibi Sembolü" - }, + "forum-scratch-team/title": { "message": "Forumlarda Scratch Ekibi Sembolü" }, "forum-scratch-team/description": { "message": "Forumlardaki herhangi bir Scratch Ekibi üyesinin kullanıcı adının yanında, kullanıcı adının sonuna bir yıldız işareti (*) yerleştirilir." }, - "remove-editor-icons/title": { - "message": "Düzenleyici Simgelerini Kaldır" - }, + "remove-editor-icons/title": { "message": "Düzenleyici Simgelerini Kaldır" }, "remove-editor-icons/description": { "message": "Simgeleri düzenleyicideki sekmelerden kaldırır." }, - "sprite-watermark/title": { - "message": "Kukla Filigranını Kaldır" - }, + "sprite-watermark/title": { "message": "Kukla Filigranını Kaldır" }, "sprite-watermark/description": { "message": "Düzenleyicide gösterilen kukla filigranını kaldırır." }, - "compact-editor/title": { - "message": "Kompakt Düzenleyici" - }, + "compact-editor/title": { "message": "Kompakt Düzenleyici" }, "compact-editor/description": { "message": "Kukla ve arka plan bilgilerini daha kompakt hale getirir." }, @@ -935,10 +685,8 @@ "my-recent-projects/description": { "message": "Ana sayfadaki Scratch Haberleri bölümünü son paylaşılan projelerinizle değiştirir." }, - "focus-mode/title": { - "message": "Odak Modu" - }, + "focus-mode/title": { "message": "Odak Modu" }, "focus-mode/description": { "message": "Düğme tıklatıldığında proje sayfalarındaki yorumları, stüdyo ve remix sütununu, üstbilgiyi ve altbilgiyi kaldırır." } -} \ No newline at end of file +} From 9ecb6ce47ffa7caa4c010a3759fa6d8f2aebb8fd Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 30 Jun 2024 10:38:39 -0700 Subject: [PATCH 034/253] Create config.yml --- .github/ISSUE_TEMPLATE/config.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..d65a57b3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,14 @@ +blank_issues_enabled: false +contact_links: + - name: 💬 Send Feedback + url: https://scratchtools.app/feedback + about: Submit feedback for ScratchTools developers to review. + - name: 🔒 Report a Vulnerability + url: mailto:security@scratchtools.app?subject=Reporting%20a%20Security%20Vulnerability&body=(Please%20put%20the%20details%20below) + about: Please report security vulnerabilities here. + - name: 👥 Community Discord Server + url: https://discord.gg/EByJKZR2AE + about: Join the Discord server to submit suggestions/bugs and talk to other users. + - name: 🧑‍💻 Development Discord Server + url: https://discord.gg/6Ecds4pTKT + about: Join the development server to chat with other developers. From 86779d9a58ba3e31bab0e1b7829937376026e7a3 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 30 Jun 2024 10:44:25 -0700 Subject: [PATCH 035/253] Create --enhancement.yml --- .github/ISSUE_TEMPLATE/--enhancement.yml | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/--enhancement.yml diff --git a/.github/ISSUE_TEMPLATE/--enhancement.yml b/.github/ISSUE_TEMPLATE/--enhancement.yml new file mode 100644 index 00000000..81f28c15 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/--enhancement.yml @@ -0,0 +1,28 @@ +name: ✨ Enhancement +description: Report a bug for ScratchTools, or something that doesn't work properly. +labels: ["status: needs review", "type: enhancement"] +body: + + - type: textarea + id: describe + attributes: + label: Why would this be helpful? + description: We'd like to know in what cases something like this might be helpful. + placeholder: Type here + validations: + required: true + + - type: textarea + id: how + attributes: + label: How would this work? + description: We aren't asking for code specifics, but we'd like to know your vision for it. + placeholder: Type here + validations: + required: true + + - type: textarea + id: extra + attributes: + label: Anything else? + description: You can put more info here if you have any. From 76eb1ed44d05873840503035b1fa74056f74e2b4 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 30 Jun 2024 10:46:15 -0700 Subject: [PATCH 036/253] Update --enhancement.yml --- .github/ISSUE_TEMPLATE/--enhancement.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/--enhancement.yml b/.github/ISSUE_TEMPLATE/--enhancement.yml index 81f28c15..be7a1451 100644 --- a/.github/ISSUE_TEMPLATE/--enhancement.yml +++ b/.github/ISSUE_TEMPLATE/--enhancement.yml @@ -1,5 +1,5 @@ name: ✨ Enhancement -description: Report a bug for ScratchTools, or something that doesn't work properly. +description: Suggest an enhancement for ScratchTools to improve a certain feature or other part of the extension. labels: ["status: needs review", "type: enhancement"] body: From 60214cfa57b4fb4701f662b8a9657e6114e0ee41 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 30 Jun 2024 10:47:51 -0700 Subject: [PATCH 037/253] Update --feature.yml --- .github/ISSUE_TEMPLATE/--feature.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/--feature.yml b/.github/ISSUE_TEMPLATE/--feature.yml index abca8c58..30540233 100644 --- a/.github/ISSUE_TEMPLATE/--feature.yml +++ b/.github/ISSUE_TEMPLATE/--feature.yml @@ -1,22 +1,22 @@ -name: New Feature -description: Suggest a new feature for ScratchTools, or an enhancement for a feature. -labels: ["new feature"] +name: 🎉 New Feature +description: Suggest an entirely new feature for ScratchTools. +labels: ["new feature", "status: needs review"] body: - type: textarea id: describe attributes: - label: How does the feature work? - description: Describe what you're suggesting. + label: Why would this be helpful? + description: We'd like to know in what cases something like this might be helpful. placeholder: Type here validations: required: true - type: textarea - id: why + id: how attributes: - label: What situations would make this helpful? - description: Who would find this helpful, and when? + label: How would this work? + description: We aren't asking for code specifics, but we'd like to know your vision for it. placeholder: Type here validations: required: true From e37e7a7dd947b9b5dc7ebf6738a34f580e1126a4 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 30 Jun 2024 10:49:02 -0700 Subject: [PATCH 038/253] Create blank.md --- .github/ISSUE_TEMPLATE/blank.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/blank.md diff --git a/.github/ISSUE_TEMPLATE/blank.md b/.github/ISSUE_TEMPLATE/blank.md new file mode 100644 index 00000000..e4bb3a72 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/blank.md @@ -0,0 +1,7 @@ +--- +name: 'Blank issue' +about: "Don't see your issue here? Open a blank issue." +title: '' +labels: 'status: needs review' +assignees: '' +--- From 7317ae270dd360ea5c73029d6e432537116933e3 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 30 Jun 2024 10:50:59 -0700 Subject: [PATCH 039/253] Update --bug.yml --- .github/ISSUE_TEMPLATE/--bug.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/--bug.yml b/.github/ISSUE_TEMPLATE/--bug.yml index c612a5db..79f77083 100644 --- a/.github/ISSUE_TEMPLATE/--bug.yml +++ b/.github/ISSUE_TEMPLATE/--bug.yml @@ -1,6 +1,6 @@ -name: Bug Report -description: Report a bug for ScratchTools, or something that doesn't work properly. -labels: ["bug"] +name: 🐛 Bug +description: Report a bug for ScratchTool. +labels: ["type: bug", "status: needs review"] body: - type: textarea @@ -16,8 +16,8 @@ body: id: why attributes: label: What is causing the bug? - description: Are there any actions that you take that could be causing a bug? For example, does it happen when you enter the editor or share a project? - placeholder: Type here + description: We aren't asking for code, we just want to know when and where this code is happening. + placeholder: Example: when I go to my own profile and close the comments. validations: required: true From 36ee0eb99fd8eb9659bd39fbc3a52e5896063066 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 30 Jun 2024 10:54:20 -0700 Subject: [PATCH 040/253] Update --bug.yml --- .github/ISSUE_TEMPLATE/--bug.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/--bug.yml b/.github/ISSUE_TEMPLATE/--bug.yml index 79f77083..25cf7f3a 100644 --- a/.github/ISSUE_TEMPLATE/--bug.yml +++ b/.github/ISSUE_TEMPLATE/--bug.yml @@ -17,7 +17,7 @@ body: attributes: label: What is causing the bug? description: We aren't asking for code, we just want to know when and where this code is happening. - placeholder: Example: when I go to my own profile and close the comments. + placeholder: Example\: when I go to my own profile and close the comments. validations: required: true From a913738264580aaf96fb06f54abe0962f59f1f52 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 30 Jun 2024 10:54:50 -0700 Subject: [PATCH 041/253] Update --bug.yml --- .github/ISSUE_TEMPLATE/--bug.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/--bug.yml b/.github/ISSUE_TEMPLATE/--bug.yml index 25cf7f3a..72513211 100644 --- a/.github/ISSUE_TEMPLATE/--bug.yml +++ b/.github/ISSUE_TEMPLATE/--bug.yml @@ -17,7 +17,7 @@ body: attributes: label: What is causing the bug? description: We aren't asking for code, we just want to know when and where this code is happening. - placeholder: Example\: when I go to my own profile and close the comments. + placeholder: For example- "When I go to my own profile and close the comments." validations: required: true From f9ae69a40fdb3c10b64efb31cd1e2ee995be9f72 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 30 Jun 2024 11:15:31 -0700 Subject: [PATCH 042/253] Bump to `v3.9.0` --- changelog/changes.json | 23 ++++++++++++++++++----- manifest.json | 2 +- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/changelog/changes.json b/changelog/changes.json index 99424d0e..ff855a02 100644 --- a/changelog/changes.json +++ b/changelog/changes.json @@ -1,12 +1,25 @@ { "NOTE": "THERE IS NO NEED TO UPDATE THIS YOURSELF, IT WILL BE UPDATED WHEN RELEASED.", - "version": "3.8.0", + "version": "3.9.0", "enhanced": [ - "Update contributor names.", - "Add clicker game." + "Better feature options.", + "Add a selection option for feature settings.", + "Use images for Flag on Profile feature.", + "Improved wording for Summarized Descriptions comment text.", + "Improved wording for Project Miniplayer options.", + "Technical: Add manifest schema to VSCode settings.", + "Technical: update README instructions.", + "Technical: update issue templates.", + "Technical: add feature.page API." ], "fixed": [ - "Fix protect mention text.", - "Fix search bar." + "Fix Summarized Descriptions button placement.", + "Fix Select Self adding clones to dropdown.", + "Fix Summarized Descriptions overlapping with text.", + "Fix Block Count in My Stuff not working.", + "Fix popup search bar.", + "Remove a few features that reply on Scratch DB.", + "Fix Select Self when reenabled.", + "Minor selection option fixes." ] } \ No newline at end of file diff --git a/manifest.json b/manifest.json index 12564ac6..9f6ab197 100644 --- a/manifest.json +++ b/manifest.json @@ -3,7 +3,7 @@ "short_name": "ScratchTools", "manifest_version": 3, "version": "3.9.0", - "version_name": "3.9.0-beta", + "version_name": "3.9.0", "default_locale": "en", "description": "__MSG_extDescription__", "author": "rgantzos", From 2e769c1c69000b3dd2d553075123e18c24b8c2f8 Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Sun, 30 Jun 2024 18:17:28 +0000 Subject: [PATCH 043/253] Updated version number. --- manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 9f6ab197..8534f3d4 100644 --- a/manifest.json +++ b/manifest.json @@ -2,8 +2,8 @@ "name": "__MSG_extName__", "short_name": "ScratchTools", "manifest_version": 3, - "version": "3.9.0", - "version_name": "3.9.0", + "version": "3.10.0", + "version_name": "3.10.0-beta", "default_locale": "en", "description": "__MSG_extDescription__", "author": "rgantzos", From 7a3295357e7fef69b452673d53d1f301193e74b6 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Mon, 1 Jul 2024 09:29:23 -0400 Subject: [PATCH 044/253] Fix `Plain-Background` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix plain background feature interfering with the Scratch Addon's `Editor dark mode and customizable colors` Bug: Screenshot 2024-07-01 at 9 19 02 AM Fix: Screenshot 2024-07-01 at 9 23 33 AM _Resolves #756_ --- features/plain-background/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/plain-background/style.css b/features/plain-background/style.css index 05078c9a..52af47dc 100644 --- a/features/plain-background/style.css +++ b/features/plain-background/style.css @@ -1,3 +1,3 @@ .blocklyMainBackground { - fill: white !important; + fill: transparent !important; } From fd111683d60c3b1423495f02e2b6a04570c659a2 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Mon, 1 Jul 2024 09:48:54 -0400 Subject: [PATCH 045/253] Color Fixes Resolves #556 --- features/original-colors/scratch-www.css | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/features/original-colors/scratch-www.css b/features/original-colors/scratch-www.css index ec0c2c35..242e15dd 100644 --- a/features/original-colors/scratch-www.css +++ b/features/original-colors/scratch-www.css @@ -556,4 +556,12 @@ input[class^="input_input-form_"]:focus { .scratchtoolsTag { background-color: var(--ste-blue) !important; -} \ No newline at end of file +} + +.studio-info .studio-info-footer-report button:hover { + background-color: var(--ste-blue) !important; +} + +.studio-status-icon-unselected { + background-color: var(--ste-blue) !important; +} From 77db60d222cbef50800adfbc315a0169850007c6 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Mon, 1 Jul 2024 12:42:16 -0700 Subject: [PATCH 046/253] Fix options --- extras/popup/popup.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extras/popup/popup.js b/extras/popup/popup.js index 5ffd8000..74fe3de5 100644 --- a/extras/popup/popup.js +++ b/extras/popup/popup.js @@ -690,7 +690,8 @@ async function getFeatures() { if (feature.options) { for (var optionPlace in feature.options) { var option = feature.options[optionPlace]; - if (option.type === 4) { + let type = option.type + if (type === 4) { var optionDiv = document.createElement("div"); optionDiv.className = "option"; var label = document.createElement("label"); @@ -790,7 +791,7 @@ async function getFeatures() { } div.appendChild(optionDiv); - if (option.type === 4) { + if (type !== 4) { input.dataset.validation = btoa( JSON.stringify(option.validation || []) ); From 94b23b2c551f7386963075ef9e0849042135acbd Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Mon, 1 Jul 2024 12:44:02 -0700 Subject: [PATCH 047/253] Bump to `v3.9.1` --- manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 8534f3d4..af1dab89 100644 --- a/manifest.json +++ b/manifest.json @@ -2,8 +2,8 @@ "name": "__MSG_extName__", "short_name": "ScratchTools", "manifest_version": 3, - "version": "3.10.0", - "version_name": "3.10.0-beta", + "version": "3.9.1", + "version_name": "3.9.1", "default_locale": "en", "description": "__MSG_extDescription__", "author": "rgantzos", From a5ab838a9209a3c7c809e39bd9b4919f84eba79d Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 19:45:30 +0000 Subject: [PATCH 048/253] Updated version number. --- manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index af1dab89..8534f3d4 100644 --- a/manifest.json +++ b/manifest.json @@ -2,8 +2,8 @@ "name": "__MSG_extName__", "short_name": "ScratchTools", "manifest_version": 3, - "version": "3.9.1", - "version_name": "3.9.1", + "version": "3.10.0", + "version_name": "3.10.0-beta", "default_locale": "en", "description": "__MSG_extDescription__", "author": "rgantzos", From 301349bd919d44eda2ec5819e310c8b50a901253 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Mon, 1 Jul 2024 15:50:06 -0400 Subject: [PATCH 049/253] Fix Search Bar --- extras/popup/popup.css | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/extras/popup/popup.css b/extras/popup/popup.css index b4874ec5..be85c9c8 100644 --- a/extras/popup/popup.css +++ b/extras/popup/popup.css @@ -175,9 +175,7 @@ a { border: none; background: var(--searchbar-bg); outline: none; - vertical-align: middle; position: initial; - margin-bottom: 2.9em; color: var(--primary-color); } .searchbarbutton { @@ -220,7 +218,6 @@ a { background-repeat: no-repeat; cursor: pointer; float: right; - margin-top: -6.5em; margin-left: 2.3em; position: relative; right: -1rem; @@ -499,4 +496,4 @@ span.new-feature-tag.beta { .option-selection span:last-child { border-top-right-radius: .25rem; border-bottom-right-radius: .25rem; -} \ No newline at end of file +} From 4e3a01358942b711fb3c6bacf0f264c15e3b1101 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Mon, 1 Jul 2024 16:06:18 -0400 Subject: [PATCH 050/253] Edit Popup --- extras/popup/popup.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extras/popup/popup.css b/extras/popup/popup.css index be85c9c8..f22acdb9 100644 --- a/extras/popup/popup.css +++ b/extras/popup/popup.css @@ -164,6 +164,7 @@ a { .wrap { position: relative; height: 45px; + top: 15px; } .searchbar { @@ -176,6 +177,7 @@ a { background: var(--searchbar-bg); outline: none; position: initial; + margin-bottom: 2.9em; color: var(--primary-color); } .searchbarbutton { From c60a29ae5cc1e6ffdc4bf5a3352906079e012787 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Mon, 1 Jul 2024 16:14:11 -0400 Subject: [PATCH 051/253] third times the charm --- extras/popup/popup.css | 1 + 1 file changed, 1 insertion(+) diff --git a/extras/popup/popup.css b/extras/popup/popup.css index f22acdb9..7f937aa2 100644 --- a/extras/popup/popup.css +++ b/extras/popup/popup.css @@ -223,6 +223,7 @@ a { margin-left: 2.3em; position: relative; right: -1rem; + margin-top: -6.5em; } .feature input { From 5d02630967116393a66bf2821a6839ad585ca3c5 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:34:11 -0400 Subject: [PATCH 052/253] Custom Explore Redirect --- features/custom-explore/data.json | 61 +++++++++++++++++++++++++++++++ features/custom-explore/script.js | 21 +++++++++++ 2 files changed, 82 insertions(+) create mode 100644 features/custom-explore/data.json create mode 100644 features/custom-explore/script.js diff --git a/features/custom-explore/data.json b/features/custom-explore/data.json new file mode 100644 index 00000000..d7b762af --- /dev/null +++ b/features/custom-explore/data.json @@ -0,0 +1,61 @@ +{ + "title": "Custom Explore Redirect", + "description": "Automatically redirect to a specific tab on the Explore page.", + "credits": [ + { + "username": "ItsThatKittyDragon", + "url": "https://scratch.mit.edu/users/ItsThatKittyDragon/" + }, + { + "username": "MaterArc", + "url": "https://scratch.mit.edu/users/MaterArc/" + } + ], + "type": [ + "Website" + ], + "tags": [ + "New", + "Featured" + ], + "scripts": [ + { + "file": "script.js", + "runOn": "/explore/projects/*||/" + } + ], + "dynamic": true, + "options": [ + { + "id": "custom-tab", + "name": "", + "type": 4, + "options": [ + { + "name": "Animations", + "value": "animations" + }, + { + "name": "Art", + "value": "art" + }, + { + "name": "Games", + "value": "games" + }, + { + "name": "Music", + "value": "music" + }, + { + "name": "Stories", + "value": "stories" + }, + { + "name": "Tutorials", + "value": "tutorials" + } + ] + } + ] +} \ No newline at end of file diff --git a/features/custom-explore/script.js b/features/custom-explore/script.js new file mode 100644 index 00000000..dc4fbb98 --- /dev/null +++ b/features/custom-explore/script.js @@ -0,0 +1,21 @@ +export default async function({ feature, console }) { + let tabName = ScratchTools.Storage["customtab"]; + + function updateRedirect() { + const exploreLink = document.querySelector('li.link.explore > a'); + if (exploreLink && window.location.href === 'https://scratch.mit.edu/explore/projects/all') { + exploreLink.href = `https://scratch.mit.edu/explore/projects/${tabName}`; + window.location.href = exploreLink.href; + } + } + + await ScratchTools.waitForElement('li.link.explore > a'); + updateRedirect(); + + feature.options.addEventListener('changed', async ({ key, value }) => { + if (key === 'customtab') { + tabName = value; + updateRedirect(); + } + }); +} \ No newline at end of file From fdc1995c4fa179d9a2119eee2269bb912e9ee0df Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:36:15 -0400 Subject: [PATCH 053/253] Update features.json --- features/features.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/features/features.json b/features/features.json index a716b9e3..e04d7168 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "custom-explore-redirect", + "versionAdded": "v3.10.0" + }, { "version": 2, "id": "stage-in-spritepane", From eb639f42a5f3610da4dee5394a9e62e96d3b474d Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Wed, 3 Jul 2024 12:59:55 -0700 Subject: [PATCH 054/253] Fix some stuff --- extras/popup/popup.css | 14 ++++++++++++- features/custom-explore/data.json | 6 +++--- features/custom-explore/script.js | 33 +++++++++++++++++-------------- features/features.json | 2 +- 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/extras/popup/popup.css b/extras/popup/popup.css index 7f937aa2..a34cde47 100644 --- a/extras/popup/popup.css +++ b/extras/popup/popup.css @@ -470,7 +470,10 @@ span.new-feature-tag.beta { .option-selection { text-align: right; - width: 100%; + width: calc(100% - 1rem); + display: flex; + overflow-wrap: break-word; + flex-wrap: wrap; } .option-selection span { @@ -483,6 +486,15 @@ span.new-feature-tag.beta { background-color: transparent; color: var(--secondary-color); transition: background-color .3s, border .3s, color .3s; + display: inline-block; + word-break: break-word; + white-space: nowrap; + flex: 1 0 auto; + text-align: center; +} + +.option label { + margin-right: 1rem; } .option-selection span.option-selected { diff --git a/features/custom-explore/data.json b/features/custom-explore/data.json index d7b762af..23183956 100644 --- a/features/custom-explore/data.json +++ b/features/custom-explore/data.json @@ -21,14 +21,14 @@ "scripts": [ { "file": "script.js", - "runOn": "/explore/projects/*||/" + "runOn": "/*" } ], "dynamic": true, "options": [ { - "id": "custom-tab", - "name": "", + "id": "custom-explore-tab", + "name": "Tab", "type": 4, "options": [ { diff --git a/features/custom-explore/script.js b/features/custom-explore/script.js index dc4fbb98..67cc32cd 100644 --- a/features/custom-explore/script.js +++ b/features/custom-explore/script.js @@ -1,21 +1,24 @@ export default async function({ feature, console }) { - let tabName = ScratchTools.Storage["customtab"]; + let ELEMENTS = [] + let type = feature.settings.get("custom-explore-tab") || "Animations" + + ScratchTools.waitForElements("a[href='/explore/projects/'], a[href='/explore/projects'], a[href='/explore/projects/all'], a[href='/explore/projects/all/']", function(a) { + if (a.parentElement.className.includes("sub-nav categories")) return; + ELEMENTS.push(a) + + a.href = feature.self.enabled ? `/explore/projects/${type.toLowerCase()}/` : "/explore/projects/" + }) - function updateRedirect() { - const exploreLink = document.querySelector('li.link.explore > a'); - if (exploreLink && window.location.href === 'https://scratch.mit.edu/explore/projects/all') { - exploreLink.href = `https://scratch.mit.edu/explore/projects/${tabName}`; - window.location.href = exploreLink.href; + function updateRedirects() { + for (var i in ELEMENTS) { + ELEMENTS[i].href = feature.self.enabled ? `/explore/projects/${type.toLowerCase()}/` : "/explore/projects/" } } - await ScratchTools.waitForElement('li.link.explore > a'); - updateRedirect(); - - feature.options.addEventListener('changed', async ({ key, value }) => { - if (key === 'customtab') { - tabName = value; - updateRedirect(); - } - }); + feature.addEventListener("disabled", updateRedirects) + feature.addEventListener("enabled", updateRedirects) + feature.settings.addEventListener("changed", function({ value }) { + type = value + updateRedirects() + }) } \ No newline at end of file diff --git a/features/features.json b/features/features.json index e04d7168..385c5261 100644 --- a/features/features.json +++ b/features/features.json @@ -1,7 +1,7 @@ [ { "version": 2, - "id": "custom-explore-redirect", + "id": "custom-explore", "versionAdded": "v3.10.0" }, { From 3353b297b0ea3d65bf6e3262d1dbd3c6eba04fbf Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Wed, 3 Jul 2024 16:01:53 -0400 Subject: [PATCH 055/253] Add rg --- features/custom-explore/data.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/features/custom-explore/data.json b/features/custom-explore/data.json index 23183956..d3e37908 100644 --- a/features/custom-explore/data.json +++ b/features/custom-explore/data.json @@ -9,6 +9,10 @@ { "username": "MaterArc", "url": "https://scratch.mit.edu/users/MaterArc/" + }, + { + "username": "rgantzos", + "url": "https://scratch.mit.edu/users/rgantzos/" } ], "type": [ @@ -58,4 +62,4 @@ ] } ] -} \ No newline at end of file +} From 0449efd2c0cb290e70c7657986a5cf42fec83ee0 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Wed, 3 Jul 2024 13:09:47 -0700 Subject: [PATCH 056/253] Slightly better option styling --- extras/popup/popup.css | 17 +++++++---------- extras/style.css | 29 +++++++++++++++++++---------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/extras/popup/popup.css b/extras/popup/popup.css index a34cde47..1a1af983 100644 --- a/extras/popup/popup.css +++ b/extras/popup/popup.css @@ -474,10 +474,12 @@ span.new-feature-tag.beta { display: flex; overflow-wrap: break-word; flex-wrap: wrap; + border: 1.5px solid var(--feature-input-bg); + border-radius: .25rem; + overflow: hidden; } .option-selection span { - border: 1.5px solid var(--feature-input-bg); padding: .25rem; padding-left: .5rem; padding-right: .5rem; @@ -491,6 +493,7 @@ span.new-feature-tag.beta { white-space: nowrap; flex: 1 0 auto; text-align: center; + border-inline-end: 1.5px solid var(--feature-input-bg); } .option label { @@ -500,15 +503,9 @@ span.new-feature-tag.beta { .option-selection span.option-selected { background-color: var(--theme); color: white; - border: 1.5px solid var(--theme); -} - -.option-selection span:first-child { - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; + border-inline-end: 1.5px solid transparent; } .option-selection span:last-child { - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; -} + border-inline-end: none; +} \ No newline at end of file diff --git a/extras/style.css b/extras/style.css index 71f829bb..338f926f 100644 --- a/extras/style.css +++ b/extras/style.css @@ -849,11 +849,16 @@ body { .option-selection { text-align: right; - width: 100%; + width: calc(100% - 1rem); + display: flex; + overflow-wrap: break-word; + flex-wrap: wrap; + border: 1.5px solid var(--feature-input-bg); + border-radius: .25rem; + overflow: hidden; } .option-selection span { - border: 1.5px solid var(--feature-input-bg); padding: .25rem; padding-left: .5rem; padding-right: .5rem; @@ -862,20 +867,24 @@ body { background-color: transparent; color: var(--secondary-color); transition: background-color .3s, border .3s, color .3s; + display: inline-block; + word-break: break-word; + white-space: nowrap; + flex: 1 0 auto; + text-align: center; + border-inline-end: 1.5px solid var(--feature-input-bg); +} + +.option label { + margin-right: 1rem; } .option-selection span.option-selected { background-color: var(--theme); color: white; - border: 1.5px solid var(--theme); -} - -.option-selection span:first-child { - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; + border-inline-end: 1.5px solid transparent; } .option-selection span:last-child { - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; + border-inline-end: none; } \ No newline at end of file From 8e1080bde083d182827da9762f9535c7f847b3e3 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Wed, 3 Jul 2024 13:11:13 -0700 Subject: [PATCH 057/253] Update version --- features/features.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/features.json b/features/features.json index 385c5261..d0889cb5 100644 --- a/features/features.json +++ b/features/features.json @@ -2,7 +2,7 @@ { "version": 2, "id": "custom-explore", - "versionAdded": "v3.10.0" + "versionAdded": "v4.0.0" }, { "version": 2, From 41b2b2c66735c28301172b0a7b213737807fe2aa Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Wed, 3 Jul 2024 16:46:34 -0700 Subject: [PATCH 058/253] Project reactions --- api/feature/index.js | 2 + api/feature/server.js | 8 + features/features.json | 5 + features/project-reactions/data.json | 46 +++ features/project-reactions/emojis/beaming.svg | 100 +++++++ features/project-reactions/emojis/crying.svg | 75 +++++ features/project-reactions/emojis/fire.svg | 105 +++++++ features/project-reactions/emojis/hands.svg | 161 ++++++++++ .../project-reactions/emojis/heart-eyes.svg | 97 ++++++ .../project-reactions/emojis/heart-face.svg | 163 +++++++++++ features/project-reactions/emojis/hearts.svg | 140 +++++++++ .../project-reactions/emojis/laughing.svg | 154 ++++++++++ features/project-reactions/emojis/popper.svg | 276 ++++++++++++++++++ .../project-reactions/emojis/thumbsup.svg | 238 +++++++++++++++ features/project-reactions/script.js | 167 +++++++++++ features/project-reactions/style.css | 119 ++++++++ 16 files changed, 1856 insertions(+) create mode 100644 api/feature/server.js create mode 100644 features/project-reactions/data.json create mode 100644 features/project-reactions/emojis/beaming.svg create mode 100644 features/project-reactions/emojis/crying.svg create mode 100644 features/project-reactions/emojis/fire.svg create mode 100644 features/project-reactions/emojis/hands.svg create mode 100644 features/project-reactions/emojis/heart-eyes.svg create mode 100644 features/project-reactions/emojis/heart-face.svg create mode 100644 features/project-reactions/emojis/hearts.svg create mode 100644 features/project-reactions/emojis/laughing.svg create mode 100644 features/project-reactions/emojis/popper.svg create mode 100644 features/project-reactions/emojis/thumbsup.svg create mode 100644 features/project-reactions/script.js create mode 100644 features/project-reactions/style.css diff --git a/api/feature/index.js b/api/feature/index.js index 703f2524..7788522c 100644 --- a/api/feature/index.js +++ b/api/feature/index.js @@ -1,12 +1,14 @@ import { default as self } from "./self.js"; import { default as traps } from "./traps.js"; import { default as auth } from "./auth.js"; +import { default as server } from "./server.js"; export default function (data) { var feature = new Feature(data); feature.self = self(data.id); feature.traps = traps() feature.auth = auth() + feature.server = server() feature.page = { appendToSharedSpace: ScratchTools.appendToSharedSpace, waitForElement: ScratchTools.waitForElement, diff --git a/api/feature/server.js b/api/feature/server.js new file mode 100644 index 00000000..b1f4c507 --- /dev/null +++ b/api/feature/server.js @@ -0,0 +1,8 @@ +export default function (id) { + return { + url: "https://data.scratchtools.app", + endpoint: function(path) { + return "https://data.scratchtools.app" + path + }, + } +} \ No newline at end of file diff --git a/features/features.json b/features/features.json index d0889cb5..ff7a4eca 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "project-reactions", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "custom-explore", diff --git a/features/project-reactions/data.json b/features/project-reactions/data.json new file mode 100644 index 00000000..bb6a8194 --- /dev/null +++ b/features/project-reactions/data.json @@ -0,0 +1,46 @@ +{ + "title": "Project Reactions", + "description": "Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time.", + "credits": [ + { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } + ], + "type": ["Website"], + "tags": ["New"], + "dynamic": true, + "scripts": [ + { + "file": "script.js", + "runOn": "/projects/*" + } + ], + "styles": [ + { + "file": "style.css", + "runOn": "/projects/*" + } + ], + "components": [ + { + "type": "info", + "content": "Users will not receive a notification when you react to their projects." + } + ], + "resources": [ + { "name": "project-reactions-beaming", "path": "/emojis/beaming.svg" }, + { "name": "project-reactions-crying", "path": "/emojis/crying.svg" }, + { "name": "project-reactions-fire", "path": "/emojis/fire.svg" }, + { "name": "project-reactions-hands", "path": "/emojis/hands.svg" }, + { + "name": "project-reactions-heart-eyes", + "path": "/emojis/heart-eyes.svg" + }, + { + "name": "project-reactions-heart-face", + "path": "/emojis/heart-face.svg" + }, + { "name": "project-reactions-hearts", "path": "/emojis/hearts.svg" }, + { "name": "project-reactions-laughing", "path": "/emojis/laughing.svg" }, + { "name": "project-reactions-popper", "path": "/emojis/popper.svg" }, + { "name": "project-reactions-thumbsup", "path": "/emojis/thumbsup.svg" } + ] +} diff --git a/features/project-reactions/emojis/beaming.svg b/features/project-reactions/emojis/beaming.svg new file mode 100644 index 00000000..b10147ae --- /dev/null +++ b/features/project-reactions/emojis/beaming.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/project-reactions/emojis/crying.svg b/features/project-reactions/emojis/crying.svg new file mode 100644 index 00000000..a826b814 --- /dev/null +++ b/features/project-reactions/emojis/crying.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/project-reactions/emojis/fire.svg b/features/project-reactions/emojis/fire.svg new file mode 100644 index 00000000..6570b839 --- /dev/null +++ b/features/project-reactions/emojis/fire.svg @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/project-reactions/emojis/hands.svg b/features/project-reactions/emojis/hands.svg new file mode 100644 index 00000000..90475afc --- /dev/null +++ b/features/project-reactions/emojis/hands.svg @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/project-reactions/emojis/heart-eyes.svg b/features/project-reactions/emojis/heart-eyes.svg new file mode 100644 index 00000000..76badafd --- /dev/null +++ b/features/project-reactions/emojis/heart-eyes.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/project-reactions/emojis/heart-face.svg b/features/project-reactions/emojis/heart-face.svg new file mode 100644 index 00000000..b1de943d --- /dev/null +++ b/features/project-reactions/emojis/heart-face.svg @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/project-reactions/emojis/hearts.svg b/features/project-reactions/emojis/hearts.svg new file mode 100644 index 00000000..c61f8712 --- /dev/null +++ b/features/project-reactions/emojis/hearts.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/project-reactions/emojis/laughing.svg b/features/project-reactions/emojis/laughing.svg new file mode 100644 index 00000000..0a8347e3 --- /dev/null +++ b/features/project-reactions/emojis/laughing.svg @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/project-reactions/emojis/popper.svg b/features/project-reactions/emojis/popper.svg new file mode 100644 index 00000000..06dc90b3 --- /dev/null +++ b/features/project-reactions/emojis/popper.svg @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/project-reactions/emojis/thumbsup.svg b/features/project-reactions/emojis/thumbsup.svg new file mode 100644 index 00000000..cf598a30 --- /dev/null +++ b/features/project-reactions/emojis/thumbsup.svg @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/project-reactions/script.js b/features/project-reactions/script.js new file mode 100644 index 00000000..7e82632d --- /dev/null +++ b/features/project-reactions/script.js @@ -0,0 +1,167 @@ +export default async function ({ feature, console }) { + let username = feature.redux.getState().session?.session?.user?.username; + + let projectId = window.location.pathname.split("/")[2]; + let reactions = await ( + await fetch(feature.server.endpoint(`/reactions/${projectId}/`)) + ).json(); + + ScratchTools.waitForElements("div.flex-row.stats", function (req, res) { + makeReactions(reactions); + }); + + function makeReactions(data) { + let parent = document.querySelector("div.flex-row.stats"); + + let already = parent.querySelector(".ste-reactions"); + already?.remove(); + + let div = document.createElement("div"); + div.className = "ste-reactions"; + + let reactionsList = document.createElement("div"); + reactionsList.className = "ste-reactions-list"; + + let allEmojis = []; + for (var i in reactions) { + if (!allEmojis.includes(reactions[i].emoji)) { + allEmojis.push({ + emoji: reactions[i].emoji, + count: reactions.filter((el) => el.emoji === reactions[i].emoji) + .length, + }); + } + } + + if (allEmojis.length === 0) { + let span = document.createElement("span"); + + let img = document.createElement("img"); + img.src = feature.self.getResource("project-reactions-heart-eyes"); + span.appendChild(img); + + reactionsList.appendChild(span); + } + + for (var i in allEmojis) { + if (i < 3) { + let span = document.createElement("span"); + + let img = document.createElement("img"); + img.src = feature.self.getResource( + "project-reactions-" + allEmojis[i].emoji + ); + span.appendChild(img); + + reactionsList.appendChild(span); + } + } + + div.appendChild(reactionsList); + + let modal = document.createElement("div"); + modal.className = "ste-reactions-modal"; + div.appendChild(modal); + + let options = document.createElement("div"); + options.classList.add("ste-reactions-options"); + + function updateOptions() { + allEmojis = []; + for (var i in reactions) { + if (!allEmojis.includes(reactions[i].emoji)) { + allEmojis.push({ + emoji: reactions[i].emoji, + count: reactions.filter((el) => el.emoji === reactions[i].emoji) + .length, + }); + } + } + + options.innerHTML = ""; + + let emojis = [ + "beaming", + "crying", + "fire", + "hands", + "heart-eyes", + "heart-face", + "hearts", + "laughing", + "popper", + "thumbsup", + ]; + + for (var i in emojis) { + let img = document.createElement("img"); + img.src = feature.self.getResource("project-reactions-" + emojis[i]); + img.className = "ste-reactions-option"; + img.dataset.emoji = emojis[i]; + if ( + reactions.find((el) => el.emoji === emojis[i] && el.user === username) + ) { + img.classList.add("selected"); + } + + let span = document.createElement("span"); + span.textContent = allEmojis + .filter((el) => el.emoji === emojis[i]) + .length.toString(); + options.appendChild(span); + + img.addEventListener("click", async function () { + let emoji = this.dataset.emoji; + if (!img.className.includes("selected")) { + this.classList.add("selected"); + ScratchTools.verifyUser(async function (token) { + let data = await ( + await fetch("https://data.scratchtools.app/react/", { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify({ + token, + emoji, + project: projectId, + }), + }) + ).json(); + + if (data.success) { + reactions = data.data; + updateOptions(); + } + }); + } else { + this.classList.remove("selected"); + ScratchTools.verifyUser(async function (token) { + let data = await ( + await fetch("https://data.scratchtools.app/unreact/", { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify({ token, emoji, project: projectId }), + }) + ).json(); + + if (data.success) { + reactions = data.data; + updateOptions(); + } + }); + } + }); + options.appendChild(img); + } + } + updateOptions(); + modal.appendChild(options); + + parent.appendChild(div); + } +} diff --git a/features/project-reactions/style.css b/features/project-reactions/style.css new file mode 100644 index 00000000..e5aa265b --- /dev/null +++ b/features/project-reactions/style.css @@ -0,0 +1,119 @@ +.ste-reactions-list { + display: flex; + transform: scale(1.3); +} + +.ste-reactions-list img { + height: 1.25rem; + position: relative; + top: .15rem; +} + +.ste-reactions-list span { + height: 1.75rem; + width: 1.75rem; + background: rgb(226, 226, 226); + border-radius: calc(1.75rem / 2); + text-align: center; + z-index: 6; +} + +.ste-reactions-list span:not(:first-child) { + margin-left: -.5rem; + transition: margin-left .3s, opacity .3s; +} + +.ste-reactions-list span:nth-child(2) { + opacity: .6; + z-index: 5; +} + +.ste-reactions-list span:nth-child(3) { + opacity: .3; + z-index: 4; +} + +.ste-reactions-list { + cursor: pointer; + transition: transform .3s; +} + +.ste-reactions:hover .ste-reactions-list { + transform: scale(1.35); +} + +.ste-reactions:hover .ste-reactions-list span:not(:first-child) { + margin-left: .25rem; + opacity: 1; +} + +.ste-reactions-modal { + display: none; +} + +.ste-reactions { + position: relative; +} + +.ste-reactions:hover .ste-reactions-modal { + display: block; + position: absolute; + top: -100%; + left: -6rem; + transform: translateY(calc(-50% - 3rem)); + z-index: 99; + width: 15rem; + background: white; + padding: 1rem; + box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.357); + height: fit-content; + border-radius: .5rem; + padding-left: 1.5rem; + padding-top: 0px; +} + +.ste-reactions-option { + width: 100%; + height: 2rem; + opacity: .5; + object-fit: contain; + opacity: .5; + cursor: pointer; + transition: transform .3s; +} + +.ste-reactions-option:hover { + transform: scale(1.2); +} + +.ste-reactions-option.selected { + opacity: 1; +} + +.ste-reactions-options { + display: flex; + column-count: 5; + column-gap: 1rem; + display: inline-block; + vertical-align: center; +} + +.ste-reactions-options span { + position: relative; + bottom: -1rem; + left: 1rem; + background-color: #0fbd8c; + color: white; + padding: .1rem; + height: 1.8rem; + width: 1.6rem; + display: block; + margin: 0px; + text-align: center; + font-size: 1rem; + padding-top: 0px; + border-radius: .9rem; + font-weight: 600; + transform: scale(.7); + z-index: 9999; +} \ No newline at end of file From d0476323c9d51d9238122f2fddf8864ea254e2bc Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 00:00:13 +0000 Subject: [PATCH 059/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index f31b8eab..3ce4f2d7 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From 06971f9e5791e1cff6c79adf2ef129df132ee7f9 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Wed, 3 Jul 2024 17:29:17 -0700 Subject: [PATCH 060/253] Extend C Blocks --- features/chomp-blocks/data.json | 14 ++++++ features/chomp-blocks/script.js | 76 +++++++++++++++++++++++++++++++++ features/features.json | 5 +++ 3 files changed, 95 insertions(+) create mode 100644 features/chomp-blocks/data.json create mode 100644 features/chomp-blocks/script.js diff --git a/features/chomp-blocks/data.json b/features/chomp-blocks/data.json new file mode 100644 index 00000000..a138facd --- /dev/null +++ b/features/chomp-blocks/data.json @@ -0,0 +1,14 @@ +{ + "title": "Extend Wrapped C Blocks", + "description": "Automatically extends C blocks to wrap around blocks that it is being placed over when dragging.", + "credits": [ + { + "username": "CST1229", + "url": "https://github.com/CST1229/" + } + ], + "tags": [], + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], + "dynamic": true, + "type": ["Editor"] +} diff --git a/features/chomp-blocks/script.js b/features/chomp-blocks/script.js new file mode 100644 index 00000000..f58df53a --- /dev/null +++ b/features/chomp-blocks/script.js @@ -0,0 +1,76 @@ +export default async function ({ feature, console }) { + await feature.page.waitForElement(".blocklyWorkspace") + + const ScratchBlocks = feature.traps.blocks(); + + // Rerender the dragged block when updating the insertion marker + const ogConnectMarker = ScratchBlocks.InsertionMarkerManager.prototype.connectMarker_; + ScratchBlocks.InsertionMarkerManager.prototype.connectMarker_ = function () { + ogConnectMarker.call(this); + if (!feature.self.disabled && this.firstMarker_) { + const block = this?.workspace_?.currentGesture_?.blockDragger_?.draggingBlock_; + block.noMoveConnection = true; + if (block) block.render(false); + } + }; + const ogDisconnectMarker = ScratchBlocks.InsertionMarkerManager.prototype.disconnectMarker_; + ScratchBlocks.InsertionMarkerManager.prototype.disconnectMarker_ = function () { + ogDisconnectMarker.call(this); + if (!feature.self.disabled && this.firstMarker_) { + const block = this?.workspace_?.currentGesture_?.blockDragger_?.draggingBlock_; + block.noMoveConnection = true; + if (block) block.render(false); + } + }; + + const ogDraw = ScratchBlocks.BlockSvg.prototype.renderDraw_; + const ogMoveConnections = ScratchBlocks.BlockSvg.prototype.renderMoveConnections_; + ScratchBlocks.BlockSvg.prototype.renderDraw_ = function (iconWidth, inputRows) { + if (feature.self.disabled) return ogDraw.call(this, iconWidth, inputRows); + + // If the block contains a statement (C) input and has an insertion marker, + // use that to calculate the height of the statement inputs + let computeBlock = this; + if (this?.workspace?.currentGesture_?.blockDragger_?.draggedConnectionManager_) { + const dragger = this.workspace.currentGesture_.blockDragger_; + const manager = dragger.draggedConnectionManager_; + if ( + manager.markerConnection_ && + manager.firstMarker_ && + dragger.draggingBlock_ == this && + dragger.draggingBlock_.type == manager.firstMarker_.type + ) { + if (inputRows.some((row) => row.some((input) => input.type === ScratchBlocks.NEXT_STATEMENT))) { + computeBlock = manager.firstMarker_; + } + } + } + + // Change the height of substacks + // (If we set inputRows to computeBlock.renderCompute_, + // the references to the inputs would be wrong + // so they just won't update properly) + if (computeBlock !== this) { + const _inputRows = computeBlock.renderCompute_(iconWidth); + for (let i = 0; i < inputRows.length; i++) { + const row = inputRows[i]; + let update = false; + for (const input of row) { + if (input.type === ScratchBlocks.NEXT_STATEMENT) update = true; + } + if (update) row.height = Math.max(row.height, _inputRows[i].height); + } + } + + ogDraw.call(this, iconWidth, inputRows); + + // Moving the connections of a block while it's being dragged breaks it, + // so don't + if (computeBlock === this && !this.noMoveConnection) ogMoveConnections.call(this); + this.noMoveConnection = false; + }; + ScratchBlocks.BlockSvg.prototype.renderMoveConnections_ = function () { + if (feature.self.disabled) return ogMoveConnections.call(this); + // Do nothing (this function is instead called by renderDraw_) + }; +} \ No newline at end of file diff --git a/features/features.json b/features/features.json index d0889cb5..bf6c47f3 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "chomp-blocks", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "custom-explore", From 519bc8dc094616ca941ade94b616490029e91cc9 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Wed, 3 Jul 2024 17:31:35 -0700 Subject: [PATCH 061/253] Update data.json --- features/project-reactions/data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/project-reactions/data.json b/features/project-reactions/data.json index bb6a8194..c177ebac 100644 --- a/features/project-reactions/data.json +++ b/features/project-reactions/data.json @@ -1,6 +1,6 @@ { "title": "Project Reactions", - "description": "Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time.", + "description": "Allows you to react to projects with different emojis.", "credits": [ { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } ], From 571346bfb091c51528199ca6c05d3d7c3e9670e7 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Wed, 3 Jul 2024 17:56:40 -0700 Subject: [PATCH 062/253] Custom Monitor Opacity --- extras/popup/popup.css | 4 ++-- extras/popup/popup.js | 12 ++++++++++++ features/change-monitor-opacity/data.json | 22 ++++++++++++++++++++++ features/change-monitor-opacity/script.js | 19 +++++++++++++++++++ features/features.json | 5 +++++ 5 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 features/change-monitor-opacity/data.json create mode 100644 features/change-monitor-opacity/script.js diff --git a/extras/popup/popup.css b/extras/popup/popup.css index 1a1af983..dd1f85b6 100644 --- a/extras/popup/popup.css +++ b/extras/popup/popup.css @@ -122,7 +122,7 @@ a { } .feature input { - color: var(--color); + color: var(--primary-color); background-color: var(--feature-input-bg); padding-left: 1rem !important; } @@ -233,7 +233,7 @@ a { border-radius: 1rem; outline: none; border: 0px; - color: white; + color: var(--primary-color); background-color: var(--feature-input-bg); } diff --git a/extras/popup/popup.js b/extras/popup/popup.js index 74fe3de5..dc0586c9 100644 --- a/extras/popup/popup.js +++ b/extras/popup/popup.js @@ -769,6 +769,7 @@ async function getFeatures() { ]; input.value = optionData || ""; input.placeholder = `Enter ${input.type}`; + input.dataset.validators = JSON.stringify(option.validators || {}) var optionDiv = document.createElement("div"); optionDiv.className = "option"; var label = document.createElement("label"); @@ -799,6 +800,7 @@ async function getFeatures() { var validation = JSON.parse(atob(this.dataset.validation)); var ready = true; var input = this; + let validators = JSON.parse(this.dataset.validators) validation.forEach(function (validate) { if (ready) { input.style.outline = "none"; @@ -822,6 +824,16 @@ async function getFeatures() { } }); if (ready) { + if (validators.min) { + if (this.value < validators.min) { + this.value = validators.min + } + } + if (validators.max) { + if (this.value > validators.max) { + this.value = validators.max + } + } if (this.type !== "checkbox") { finalValue = this.value; } else { diff --git a/features/change-monitor-opacity/data.json b/features/change-monitor-opacity/data.json new file mode 100644 index 00000000..3138a40f --- /dev/null +++ b/features/change-monitor-opacity/data.json @@ -0,0 +1,22 @@ +{ + "title": "Custom Monitor Opacity", + "description": "Set the opacity of variables and lists on the stage to a custom number.", + "credits": [ + { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } + ], + "tags": [], + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], + "dynamic": true, + "options": [ + { + "id": "monitor-opacity", + "name": "Monitor Opacity (0% - 100%)", + "type": 2, + "validators": { + "min": 0, + "max": 100 + } + } + ], + "type": ["Website", "Editor"] +} diff --git a/features/change-monitor-opacity/script.js b/features/change-monitor-opacity/script.js new file mode 100644 index 00000000..71b5938f --- /dev/null +++ b/features/change-monitor-opacity/script.js @@ -0,0 +1,19 @@ +export default async function ({ feature, console }) { + let MONITORS = [] + + feature.page.waitForElements("div.monitor-overlay[class*='monitor-list_monitor-list_']", function(monitors) { + MONITORS.push(monitors) + + monitors.style.opacity = feature.self.enabled ? (((feature.settings.get("monitor-opacity")) || 0) / 100).toString() : "100%" + }) + + function updateMonitors(opacity) { + for (var i in MONITORS) { + MONITORS[i].style.opacity = feature.self.enabled ? (((feature.settings.get("monitor-opacity")) || 0) / 100).toString() : "100%" + } + } + + feature.addEventListener("enabled", updateMonitors) + feature.addEventListener("disabled", updateMonitors) + feature.settings.addEventListener("changed", updateMonitors) +} \ No newline at end of file diff --git a/features/features.json b/features/features.json index d0889cb5..a570a4d3 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "change-monitor-opacity", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "custom-explore", From 1b13a0b15c9fe353f76953055d3accb84e5d5e9f Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Wed, 3 Jul 2024 18:04:48 -0700 Subject: [PATCH 063/253] Allow strings for option types --- extras/popup/popup.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/extras/popup/popup.js b/extras/popup/popup.js index dc0586c9..e915c1af 100644 --- a/extras/popup/popup.js +++ b/extras/popup/popup.js @@ -690,6 +690,18 @@ async function getFeatures() { if (feature.options) { for (var optionPlace in feature.options) { var option = feature.options[optionPlace]; + + if (typeof option.type === "string") { + let OPTION_TYPES = { + "string": 0, + "boolean": 1, + "number": 2, + "color": 3, + "select": 4, + } + option.type = OPTION_TYPES[option.type] + } + let type = option.type if (type === 4) { var optionDiv = document.createElement("div"); From e8a8fa541ad03c9422da5433f579826c721659dc Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Wed, 3 Jul 2024 20:35:12 -0700 Subject: [PATCH 064/253] Rotate gradients --- features/features.json | 5 + features/rotate-gradient/data.json | 14 ++ features/rotate-gradient/script.js | 203 +++++++++++++++++++++++++++++ features/rotate-gradient/style.css | 27 ++++ 4 files changed, 249 insertions(+) create mode 100644 features/rotate-gradient/data.json create mode 100644 features/rotate-gradient/script.js create mode 100644 features/rotate-gradient/style.css diff --git a/features/features.json b/features/features.json index 4ef00ca4..32ee58e7 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "rotate-gradient", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "change-monitor-opacity", diff --git a/features/rotate-gradient/data.json b/features/rotate-gradient/data.json new file mode 100644 index 00000000..899bcaab --- /dev/null +++ b/features/rotate-gradient/data.json @@ -0,0 +1,14 @@ +{ + "title": "Rotate Gradients", + "description": "Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors.", + "credits": [ + { + "url": "https://scratch.mit.edu/users/rgantzos/", + "username": "rgantzos" + } + ], + "type": ["Editor"], + "dynamic": true, + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], + "styles": [{ "file": "style.css", "runOn": "/projects/*" }] +} diff --git a/features/rotate-gradient/script.js b/features/rotate-gradient/script.js new file mode 100644 index 00000000..71f1a01d --- /dev/null +++ b/features/rotate-gradient/script.js @@ -0,0 +1,203 @@ +export default async function ({ feature, console }) { + let lastRotation = 0 + + feature.page.waitForElements( + "div[class^='color-picker_gradient-picker-row_'][class*='color-picker_gradient-swatches-row_']", + function (row) { + let body = document.querySelector(".Popover-body"); + + if (feature.traps.paint().selectedItems.length !== 1) return; + if (feature.traps.paint().selectedItems[0].fillColor._components[0].radial) return; + if (!document.querySelector("div[class^='color-picker_gradient-picker-row_'][class*='color-picker_gradient-swatches-row_']")) return; + if (body.querySelector(".ste-direction-slider")) return; + + let div = document.createElement("div"); + div.className = "ste-direction-slider"; + feature.self.hideOnDisable(div); + + let data = document.createElement("div"); + data.className = "color-picker_row-header_173LQ"; + div.appendChild(data); + + let name = document.createElement("span"); + name.className = "color-picker_label-name_17igY"; + name.textContent = "Direction"; + + let value = document.createElement("span"); + value.className = "color-picker_label-readout_9vjb2"; + value.textContent = "0deg"; + + data.appendChild(name); + data.appendChild(value); + + let slider = document.createElement("div"); + slider.className = + "ste-direction-slider-checkered slider_container_o2aIb slider_last_10jvO"; + div.appendChild(slider); + + let sliderBg = document.createElement("div"); + sliderBg.style.background = `linear-gradient(270deg, ${ + feature.traps.paint().selectedItems[0]?.fillColor?._canvasStyle + } 0%, rgba(0, 0, 0, 0) 100%)`; + sliderBg.className = "ste-direction-background"; + slider.appendChild(sliderBg); + + let handle = document.createElement("div"); + handleSlider(handle, value); + handle.className = "ste-direction-handle slider_handle_3f0xk"; + handle.style.left = "124px"; + if (feature.traps.paint().selectedItems[0]?.opacity) { + handle.style.left = "0px"; + } + slider.appendChild(handle); + + body.firstChild.insertBefore(div, body.querySelector("div[class^='color-picker_row-header_']").parentElement); + lastRotation = 0 + } + ); + + feature.redux.subscribe(function() { + if (!document.querySelector("div[class^='paint-editor_editor-container_']")) return; + + if (!document.querySelector("div[class^='color-picker_gradient-picker-row_'][class*='color-picker_gradient-swatches-row_']") || feature.traps.paint().selectedItems[0]?.fillColor._components[0].radial || feature.traps.paint().selectedItems.length !== 1) { + document.querySelector(".ste-direction-slider")?.remove() + } +}) + + const rotateColor = function (amount) { + let data = rotatePoints( + feature.traps.paint().selectedItems[0].fillColor + ._components[1], + feature.traps.paint().selectedItems[0].fillColor + ._components[2], + amount + ); + + feature.traps.paint().selectedItems[0].fillColor._components[1].x = + data.finalP1.x; + feature.traps.paint().selectedItems[0].fillColor._components[1].y = + data.finalP1.y; + + feature.traps.paint().selectedItems[0].fillColor._components[2].x = + data.finalP2.x; + feature.traps.paint().selectedItems[0].fillColor._components[2].y = + data.finalP2.y; + }; + + function rotatePoints(p1, p2, angle) { + // Calculate the midpoint + const midpoint = { + x: (p1.x + p2.x) / 2, + y: (p1.y + p2.y) / 2, + }; + + const translatedP1 = { + x: p1.x - midpoint.x, + y: p1.y - midpoint.y, + }; + const translatedP2 = { + x: p2.x - midpoint.x, + y: p2.y - midpoint.y, + }; + + const radians = angle * (Math.PI / 180); + + const rotatedP1 = { + x: + translatedP1.x * Math.cos(radians) - translatedP1.y * Math.sin(radians), + y: + translatedP1.x * Math.sin(radians) + translatedP1.y * Math.cos(radians), + }; + const rotatedP2 = { + x: + translatedP2.x * Math.cos(radians) - translatedP2.y * Math.sin(radians), + y: + translatedP2.x * Math.sin(radians) + translatedP2.y * Math.cos(radians), + }; + + const finalP1 = { + x: rotatedP1.x + midpoint.x, + y: rotatedP1.y + midpoint.y, + }; + const finalP2 = { + x: rotatedP2.x + midpoint.x, + y: rotatedP2.y + midpoint.y, + }; + + return { finalP1, finalP2 }; + } + + function handleSlider(handle, value) { + let isDragging = false; + + handle.addEventListener("mousedown", (e) => { + isDragging = true; + const initialX = e.clientX; + const handleLeft = parseInt(handle.style.left) || 0; + + document.addEventListener("mousemove", onMouseMove); + document.addEventListener("mouseup", onMouseUp); + + function onMouseMove(e) { + if (isDragging) { + const offsetX = e.clientX - initialX; + let newLeft = handleLeft + offsetX; + + newLeft = Math.max(0, Math.min(124, newLeft)); + + rotateColor(Math.floor((newLeft / 124) * 360) - lastRotation) + update() + lastRotation = Math.floor((newLeft / 124) * 360) + + value.textContent = + Math.floor((newLeft / 124) * 360).toString() + "deg"; + + handle.style.left = newLeft + "px"; + } + } + + function onMouseUp() { + isDragging = false; + document.removeEventListener("mousemove", onMouseMove); + document.removeEventListener("mouseup", onMouseUp); + } + }); + + handle.addEventListener("touchstart", (e) => { + isDragging = true; + const initialX = e.touches[0].clientX; + const handleLeft = parseInt(handle.style.left) || 0; + + handle.addEventListener("touchmove", onTouchMove); + handle.addEventListener("touchend", onTouchEnd); + + function onTouchMove(e) { + if (isDragging) { + const offsetX = e.touches[0].clientX - initialX; + let newLeft = handleLeft + offsetX; + + newLeft = Math.max(0, Math.min(124, newLeft)); + + rotateColor(Math.floor((newLeft / 124) * 360) - lastRotation) + update() + lastRotation = Math.floor((newLeft / 124) * 360) + + value.textContent = + Math.floor((newLeft / 124) * 360).toString() + "deg"; + + handle.style.left = newLeft + "px"; + } + } + + function onTouchEnd() { + isDragging = false; + handle.removeEventListener("touchmove", onTouchMove); + handle.removeEventListener("touchend", onTouchEnd); + } + }); + } + + function update() { + feature.traps.getPaper().tool.onUpdateImage() + } +} diff --git a/features/rotate-gradient/style.css b/features/rotate-gradient/style.css new file mode 100644 index 00000000..03521129 --- /dev/null +++ b/features/rotate-gradient/style.css @@ -0,0 +1,27 @@ +.ste-direction-slider { + padding-top: 0.2rem; + margin-bottom: 20px; +} + +.ste-direction-slider-checkered { + background-color: #f6f6f6; + background-image: linear-gradient( + to right, + #c5ccd6, + #c5ccd6 1px, + transparent 1px, + transparent 1.5px + ); + background-size: 3px 100%; + background-position: 0 0, 10px 10px; +} + +.ste-direction-background { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 11px; +} From a287c31e43b7455e3313f671e126644c0998a08c Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Thu, 4 Jul 2024 10:29:43 -0700 Subject: [PATCH 065/253] Fix a few things with feature API --- features/default-to-local/script.js | 1 - features/download-project/script.js | 1 - features/pin-comments/script.js | 2 -- features/sprite-layers/script.js | 2 -- 4 files changed, 6 deletions(-) diff --git a/features/default-to-local/script.js b/features/default-to-local/script.js index 328005b9..acd3e4db 100644 --- a/features/default-to-local/script.js +++ b/features/default-to-local/script.js @@ -1,7 +1,6 @@ export default function ({ feature, console }) { ScratchTools.waitForElements(".ReactModalPortal", function (modal) { console.log(modal) - window.feature = feature if (!feature.self.enabled) return; console.log("passed enabled") if (modal.querySelector(".sa-swap-local-global-hint")) return; diff --git a/features/download-project/script.js b/features/download-project/script.js index 6d01dda3..6d15859d 100644 --- a/features/download-project/script.js +++ b/features/download-project/script.js @@ -12,7 +12,6 @@ export default async function ({ feature, console }) { }); row.appendChild(button) - window.feature = feature; var saveBlob = (function () { var a = document.createElement("a"); document.body.appendChild(a); diff --git a/features/pin-comments/script.js b/features/pin-comments/script.js index 65da3b9e..6ee80ea7 100644 --- a/features/pin-comments/script.js +++ b/features/pin-comments/script.js @@ -1,6 +1,4 @@ export default async function ({ feature, console }) { - window.feature = feature - let pinned = await (await fetch(`https://data.scratchtools.app/pinned/${feature.redux.getState().preview.projectInfo.id}/`)).json() let { username: author } = feature.redux.getState().preview.projectInfo.author let { id } = feature.redux.getState().preview.projectInfo diff --git a/features/sprite-layers/script.js b/features/sprite-layers/script.js index 372ad934..e8d638be 100644 --- a/features/sprite-layers/script.js +++ b/features/sprite-layers/script.js @@ -1,6 +1,4 @@ export default async function ({ feature, console }) { - window.feature = feature - ScratchTools.waitForElements("div[class*='sprite-info_row_']:nth-child(2) > div[class*='sprite-info_group_']:nth-child(1)", function (button) { button.addEventListener("mouseover", function () { if (feature.traps.vm.editingTarget.isStage || button.querySelector(".ste-layers")) return; From b2b2d0f6466afd026fc75d53e954bf281c97d001 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Thu, 4 Jul 2024 11:58:23 -0700 Subject: [PATCH 066/253] Fix sometimes crashing paint editor --- api/vm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/vm.js b/api/vm.js index 8bf344cc..f587e948 100644 --- a/api/vm.js +++ b/api/vm.js @@ -183,7 +183,7 @@ ScratchTools.Scratch.scratchPaint = function () { Object.keys(app).find((key) => key.startsWith("__reactInternalInstance") ) - ].child.stateNode.store.getState()?.scratchPaint || null + ].child.stateNode.store?.getState()?.scratchPaint || null ); } else { return null; From 3182a68ec13ff34535d4d5bf2261074e308c826c Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Thu, 4 Jul 2024 13:05:41 -0700 Subject: [PATCH 067/253] New feature: `paint-align` --- feature-locales/paint-align/en.json | 3 ++ features/features.json | 5 ++ features/paint-align/align.svg | 19 +++++++ features/paint-align/data.json | 13 +++++ features/paint-align/script.js | 84 +++++++++++++++++++++++++++++ features/paint-align/style.css | 4 ++ 6 files changed, 128 insertions(+) create mode 100644 feature-locales/paint-align/en.json create mode 100644 features/paint-align/align.svg create mode 100644 features/paint-align/data.json create mode 100644 features/paint-align/script.js create mode 100644 features/paint-align/style.css diff --git a/feature-locales/paint-align/en.json b/feature-locales/paint-align/en.json new file mode 100644 index 00000000..ba3fca46 --- /dev/null +++ b/feature-locales/paint-align/en.json @@ -0,0 +1,3 @@ +{ + "align": "Align" +} diff --git a/features/features.json b/features/features.json index 32ee58e7..1a6014eb 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "paint-align", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "rotate-gradient", diff --git a/features/paint-align/align.svg b/features/paint-align/align.svg new file mode 100644 index 00000000..c853f82a --- /dev/null +++ b/features/paint-align/align.svg @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/features/paint-align/data.json b/features/paint-align/data.json new file mode 100644 index 00000000..70807724 --- /dev/null +++ b/features/paint-align/data.json @@ -0,0 +1,13 @@ +{ + "title": "Align Objects in Paint Editor", + "description": "Change the opacity of objects in the paint editor.", + "credits": [ + { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } + ], + "type": ["Editor"], + "tags": ["New"], + "dynamic": true, + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], + "styles": [{ "file": "style.css", "runOn": "/projects/*" }], + "resources": [{ "name": "paint-align", "path": "/align.svg" }] +} diff --git a/features/paint-align/script.js b/features/paint-align/script.js new file mode 100644 index 00000000..7af6a455 --- /dev/null +++ b/features/paint-align/script.js @@ -0,0 +1,84 @@ +export default async function ({ feature }) { + ScratchTools.waitForElements("div[class^='mode-tools_mod-labeled-icon-height_']", function(row) { + if (row.querySelector(".ste-align-items")) return; + + let span = document.createElement("span") + span.className = "button_button_u6SE2 labeled-icon-button_mod-edit-field_1bXYC ste-align-items" + span.role = "button" + + let img = document.createElement("img") + img.src = feature.self.getResource("paint-align") + img.className = "labeled-icon-button_edit-field-icon_3j-Pf" + img.alt = feature.msg("align") + img.title = feature.msg("align") + img.draggable = false + span.appendChild(img) + + let label = document.createElement("span") + label.textContent = feature.msg("align") + label.className = "labeled-icon-button_edit-field-title_1ZoEV" + span.appendChild(label) + + span.addEventListener("click", function() { + if (span.className.includes("disabled")) return; + centerObjects() + }) + + row.appendChild(span) + }) + + feature.redux.subscribe(function() { + if (document.querySelector(".ste-align-items")) { + let span = document.querySelector(".ste-align-items") + + if (feature.traps.paint().format === "BITMAP" || feature.traps.paint().selectedItems?.length < 2) { + span.classList.add("disabled") + } else { + span.classList.remove("disabled") + } + } + }) + + function centerObjects() { + let items = feature.traps.paint().selectedItems; + + let allX = []; + let allY = []; + let average = (array) => array.reduce((a, b) => a + b) / array.length; + + for (var i in items) { + allX.push(getMidPoint(items[i].segments).x); + allY.push(getMidPoint(items[i].segments).y); + } + + let trueMidpoint = { x: average(allX), y: average(allY) }; + + for (var i in items) { + let selfMidpoint = getMidPoint(items[i].segments); + let adjustX = trueMidpoint.x - selfMidpoint.x; + let adjustY = trueMidpoint.y - selfMidpoint.y; + + for (var seg in items[i].segments) { + items[i].segments[seg]._point._x += adjustX; + items[i].segments[seg]._point._y += adjustY; + } + } + + feature.traps.getPaper().tool.onUpdateImage(); + } + + function getMidPoint(segments) { + let x = []; + let y = []; + + for (var i in segments) { + x.push(segments[i]._point._x); + y.push(segments[i]._point._y); + } + + let xAverage = (Math.min(...x) + Math.max(...x)) / 2; + let yAverage = (Math.min(...y) + Math.max(...y)) / 2; + + return { x: xAverage, y: yAverage }; + } +} diff --git a/features/paint-align/style.css b/features/paint-align/style.css new file mode 100644 index 00000000..4b091de6 --- /dev/null +++ b/features/paint-align/style.css @@ -0,0 +1,4 @@ +.ste-align-items.disabled { + cursor: auto; + opacity: .5; +} \ No newline at end of file From 239b4e1068898c2eba552de1a2e0f40fdce8f054 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Thu, 4 Jul 2024 13:07:06 -0700 Subject: [PATCH 068/253] Localize `rotate-gradient` --- feature-locales/rotate-gradient/en.json | 3 +++ features/rotate-gradient/script.js | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 feature-locales/rotate-gradient/en.json diff --git a/feature-locales/rotate-gradient/en.json b/feature-locales/rotate-gradient/en.json new file mode 100644 index 00000000..b0da93e8 --- /dev/null +++ b/feature-locales/rotate-gradient/en.json @@ -0,0 +1,3 @@ +{ + "direction": "Direction" +} diff --git a/features/rotate-gradient/script.js b/features/rotate-gradient/script.js index 71f1a01d..edd0c772 100644 --- a/features/rotate-gradient/script.js +++ b/features/rotate-gradient/script.js @@ -21,11 +21,11 @@ export default async function ({ feature, console }) { let name = document.createElement("span"); name.className = "color-picker_label-name_17igY"; - name.textContent = "Direction"; + name.textContent = feature.msg("direction"); let value = document.createElement("span"); value.className = "color-picker_label-readout_9vjb2"; - value.textContent = "0deg"; + value.textContent = "0"; data.appendChild(name); data.appendChild(value); @@ -150,7 +150,7 @@ export default async function ({ feature, console }) { lastRotation = Math.floor((newLeft / 124) * 360) value.textContent = - Math.floor((newLeft / 124) * 360).toString() + "deg"; + Math.floor((newLeft / 124) * 360).toString() handle.style.left = newLeft + "px"; } @@ -183,7 +183,7 @@ export default async function ({ feature, console }) { lastRotation = Math.floor((newLeft / 124) * 360) value.textContent = - Math.floor((newLeft / 124) * 360).toString() + "deg"; + Math.floor((newLeft / 124) * 360).toString() handle.style.left = newLeft + "px"; } From b3ed30e8d34040e61be2ef8d9e1251428a9b174f Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Thu, 4 Jul 2024 13:09:21 -0700 Subject: [PATCH 069/253] Fix description --- features/paint-align/data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/paint-align/data.json b/features/paint-align/data.json index 70807724..dcfcfeff 100644 --- a/features/paint-align/data.json +++ b/features/paint-align/data.json @@ -1,6 +1,6 @@ { "title": "Align Objects in Paint Editor", - "description": "Change the opacity of objects in the paint editor.", + "description": "Adds a button to the paint editor that allows you to align selected items.", "credits": [ { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } ], From ef6f833b9cb334c9d8decf05cce64c3326c17f70 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Thu, 4 Jul 2024 13:33:02 -0700 Subject: [PATCH 070/253] Update `paint-align` classes --- features/paint-align/script.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/paint-align/script.js b/features/paint-align/script.js index 7af6a455..b911eae7 100644 --- a/features/paint-align/script.js +++ b/features/paint-align/script.js @@ -32,9 +32,9 @@ export default async function ({ feature }) { let span = document.querySelector(".ste-align-items") if (feature.traps.paint().format === "BITMAP" || feature.traps.paint().selectedItems?.length < 2) { - span.classList.add("disabled") + span.classList.add("button_mod-disabled_1rf31") } else { - span.classList.remove("disabled") + span.classList.remove("button_mod-disabled_1rf31") } } }) From fbb04c354a698f10ea735a9e50dbdb7ae66cccb6 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Thu, 4 Jul 2024 14:15:16 -0700 Subject: [PATCH 071/253] Fix issue with `rotate-gradient` controls --- features/rotate-gradient/script.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/features/rotate-gradient/script.js b/features/rotate-gradient/script.js index edd0c772..4aa736f3 100644 --- a/features/rotate-gradient/script.js +++ b/features/rotate-gradient/script.js @@ -45,10 +45,7 @@ export default async function ({ feature, console }) { let handle = document.createElement("div"); handleSlider(handle, value); handle.className = "ste-direction-handle slider_handle_3f0xk"; - handle.style.left = "124px"; - if (feature.traps.paint().selectedItems[0]?.opacity) { - handle.style.left = "0px"; - } + handle.style.left = "0px"; slider.appendChild(handle); body.firstChild.insertBefore(div, body.querySelector("div[class^='color-picker_row-header_']").parentElement); From 0dff07579a37b8ede28debb568efbd1cb1c9cba5 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Thu, 4 Jul 2024 14:16:04 -0700 Subject: [PATCH 072/253] Add shift selection --- features/paint-align/data.json | 6 ++- features/paint-align/script.js | 89 ++++++++++++++++++++-------------- 2 files changed, 58 insertions(+), 37 deletions(-) diff --git a/features/paint-align/data.json b/features/paint-align/data.json index dcfcfeff..130a056c 100644 --- a/features/paint-align/data.json +++ b/features/paint-align/data.json @@ -9,5 +9,9 @@ "dynamic": true, "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], "styles": [{ "file": "style.css", "runOn": "/projects/*" }], - "resources": [{ "name": "paint-align", "path": "/align.svg" }] + "resources": [{ "name": "paint-align", "path": "/align.svg" }], + "components": [{ + "type": "info", + "content": "Holding the shift key while clicking the align items button will center all selected items on the item in the furthest-back layer." + }] } diff --git a/features/paint-align/script.js b/features/paint-align/script.js index b911eae7..6a11c52d 100644 --- a/features/paint-align/script.js +++ b/features/paint-align/script.js @@ -1,45 +1,52 @@ export default async function ({ feature }) { - ScratchTools.waitForElements("div[class^='mode-tools_mod-labeled-icon-height_']", function(row) { - if (row.querySelector(".ste-align-items")) return; - - let span = document.createElement("span") - span.className = "button_button_u6SE2 labeled-icon-button_mod-edit-field_1bXYC ste-align-items" - span.role = "button" - - let img = document.createElement("img") - img.src = feature.self.getResource("paint-align") - img.className = "labeled-icon-button_edit-field-icon_3j-Pf" - img.alt = feature.msg("align") - img.title = feature.msg("align") - img.draggable = false - span.appendChild(img) - - let label = document.createElement("span") - label.textContent = feature.msg("align") - label.className = "labeled-icon-button_edit-field-title_1ZoEV" - span.appendChild(label) - - span.addEventListener("click", function() { + ScratchTools.waitForElements( + "div[class^='mode-tools_mod-labeled-icon-height_']", + function (row) { + if (row.querySelector(".ste-align-items")) return; + + let span = document.createElement("span"); + span.className = + "button_button_u6SE2 labeled-icon-button_mod-edit-field_1bXYC ste-align-items"; + span.role = "button"; + + let img = document.createElement("img"); + img.src = feature.self.getResource("paint-align"); + img.className = "labeled-icon-button_edit-field-icon_3j-Pf"; + img.alt = feature.msg("align"); + img.title = feature.msg("align"); + img.draggable = false; + span.appendChild(img); + + let label = document.createElement("span"); + label.textContent = feature.msg("align"); + label.className = "labeled-icon-button_edit-field-title_1ZoEV"; + span.appendChild(label); + + span.addEventListener("click", function (e) { if (span.className.includes("disabled")) return; - centerObjects() - }) + centerObjects(e.shiftKey); + }); - row.appendChild(span) - }) + row.appendChild(span); + } + ); - feature.redux.subscribe(function() { + feature.redux.subscribe(function () { if (document.querySelector(".ste-align-items")) { - let span = document.querySelector(".ste-align-items") - - if (feature.traps.paint().format === "BITMAP" || feature.traps.paint().selectedItems?.length < 2) { - span.classList.add("button_mod-disabled_1rf31") - } else { - span.classList.remove("button_mod-disabled_1rf31") - } + let span = document.querySelector(".ste-align-items"); + + if ( + feature.traps.paint().format === "BITMAP" || + feature.traps.paint().selectedItems?.length < 2 + ) { + span.classList.add("button_mod-disabled_1rf31"); + } else { + span.classList.remove("button_mod-disabled_1rf31"); + } } - }) + }); - function centerObjects() { + function centerObjects(stay) { let items = feature.traps.paint().selectedItems; let allX = []; @@ -51,7 +58,12 @@ export default async function ({ feature }) { allY.push(getMidPoint(items[i].segments).y); } - let trueMidpoint = { x: average(allX), y: average(allY) }; + let trueMidpoint = stay + ? { + x: getMidPoint(items[0].segments).x, + y: getMidPoint(items[0].segments).y, + } + : { x: average(allX), y: average(allY) }; for (var i in items) { let selfMidpoint = getMidPoint(items[i].segments); @@ -62,6 +74,11 @@ export default async function ({ feature }) { items[i].segments[seg]._point._x += adjustX; items[i].segments[seg]._point._y += adjustY; } + + for (var comp in (items[i].fillColor?._components || [])) { + items[i].fillColor._components[comp].x += adjustX; + items[i].fillColor._components[comp].y += adjustY; + } } feature.traps.getPaper().tool.onUpdateImage(); From 754d03cb5369c328e4c167d84d6c776c1ca356e9 Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 00:00:14 +0000 Subject: [PATCH 073/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index 3ce4f2d7..1e10081a 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From e06c911803d394b595f687d493e14e650509c5c3 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Thu, 4 Jul 2024 17:31:07 -0700 Subject: [PATCH 074/253] Fix `paint-align` not working with non-gradient fills --- features/paint-align/script.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/features/paint-align/script.js b/features/paint-align/script.js index 6a11c52d..15e83ddd 100644 --- a/features/paint-align/script.js +++ b/features/paint-align/script.js @@ -75,9 +75,11 @@ export default async function ({ feature }) { items[i].segments[seg]._point._y += adjustY; } - for (var comp in (items[i].fillColor?._components || [])) { - items[i].fillColor._components[comp].x += adjustX; - items[i].fillColor._components[comp].y += adjustY; + if (items[i].fillColor._type === "gradient") { + for (var comp in items[i].fillColor?._components || []) { + items[i].fillColor._components[comp].x += adjustX; + items[i].fillColor._components[comp].y += adjustY; + } } } From ac2af72d182b1d1fcbb45bde01102bd128b1985a Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Fri, 5 Jul 2024 13:27:04 -0700 Subject: [PATCH 075/253] Thumbnail setter --- api/modals.js | 8 + features/features.json | 5 + features/upload-thumbnail/data.json | 17 +++ features/upload-thumbnail/script.js | 153 ++++++++++++++++++++ features/upload-thumbnail/style.css | 24 +++ features/upload-thumbnail/thumbnail-btn.svg | 1 + 6 files changed, 208 insertions(+) create mode 100644 features/upload-thumbnail/data.json create mode 100644 features/upload-thumbnail/script.js create mode 100644 features/upload-thumbnail/style.css create mode 100644 features/upload-thumbnail/thumbnail-btn.svg diff --git a/api/modals.js b/api/modals.js index 67ec7161..acf885d6 100644 --- a/api/modals.js +++ b/api/modals.js @@ -32,6 +32,8 @@ ScratchTools.modals = { var code = document.createElement("code"); code.textContent = component.content; modal.appendChild(code); + } else if (component.type === "html") { + modal.appendChild(component.content); } }); @@ -45,5 +47,11 @@ ScratchTools.modals = { div.appendChild(modal); modal.prepend(orangeBar); document.body.appendChild(div); + + return { + close: function () { + div.remove(); + }, + }; }, }; diff --git a/features/features.json b/features/features.json index 1a6014eb..9e7bf259 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "upload-thumbnail", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "paint-align", diff --git a/features/upload-thumbnail/data.json b/features/upload-thumbnail/data.json new file mode 100644 index 00000000..1d78f181 --- /dev/null +++ b/features/upload-thumbnail/data.json @@ -0,0 +1,17 @@ +{ + "title": "Set Thumbnail", + "description": "Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage.", + "credits": [ + { + "username": "Sanjang_Beta", + "url": "https://scratch.mit.edu/users/Sanjang_Beta/" + }, + { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } + ], + "type": ["Website"], + "tags": ["New", "Recommended"], + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], + "styles": [{ "file": "style.css", "runOn": "/projects/*" }], + "resources": [{ "name": "thumbnail-btn", "path": "/thumbnail-btn.svg" }], + "dynamic": true +} diff --git a/features/upload-thumbnail/script.js b/features/upload-thumbnail/script.js new file mode 100644 index 00000000..b8a83d89 --- /dev/null +++ b/features/upload-thumbnail/script.js @@ -0,0 +1,153 @@ +export default async function ({ feature, console }) { + ScratchTools.waitForElements( + ".preview .inner .flex-row.action-buttons", + async function (row) { + if (feature.redux.getState()?.preview.projectInfo.author.username !== feature.redux.getState()?.session?.session?.user?.username) return; + + if (row.querySelector(".ste-thumbnail")) return; + let button = document.createElement("button"); + button.className = "button action-button ste-thumbnail"; + button.textContent = "Set Thumbnail"; + feature.self.hideOnDisable(button); + + let input = document.createElement("input"); + input.className = "ste-thumbnail-input"; + input.style.display = "none"; + input.type = "file"; + input.accept = "image/*"; + input.addEventListener("input", onThumbInput); + document.body.appendChild(input); + + function onThumbInput() { + if (input.files?.[0]) { + setThumbnail(input.files[0]); + } + } + + button.addEventListener("click", async function () { + let upload = document.createElement("button"); + upload.textContent = "Upload Image or GIF"; + upload.style.marginRight = ".5rem"; + upload.addEventListener("click", function () { + input.click(); + }); + + async function getStage() { + return new Promise((resolve) => { + feature.traps.vm.postIOData("video", { + forceTransparentPreview: true, + }); + feature.traps.vm.renderer.requestSnapshot((dataURL) => { + feature.traps.vm.postIOData("video", { + forceTransparentPreview: false, + }); + resolve(dataURL); + }); + }); + } + + let useStage = document.createElement("button"); + useStage.textContent = "Use Stage"; + useStage.className = "ste-thumbnail-stage"; + useStage.addEventListener("click", async function () { + function dataURLtoBlob(dataurl) { + let arr = dataurl.split(","); + let mime = arr[0].match(/:(.*?);/)[1]; + let bstr = atob(arr[1]); + let n = bstr.length; + let u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + return new Blob([u8arr], { type: mime }); + } + + let url = await getStage() + console.log(url) + let blob = dataURLtoBlob(url); + + let file = new File([blob], "image.png", { type: "image/png" }); + + let dataTransfer = new DataTransfer(); + dataTransfer.items.add(file); + + input.files = dataTransfer.files; + + onThumbInput(); + }); + + if (!feature.traps.gui().vmStatus.started) { + useStage.setAttribute("disabled", ""); + } + + let modal = ScratchTools.modals.create({ + title: "Set Thumbnail", + description: + "You can set the thumbnail to an image you upload or you can set it to what is currently on the stage. The project needs to have been started already in order to upload from the stage.", + components: [ + { + type: "html", + content: upload, + }, + { + type: "html", + content: useStage, + }, + { + type: "html", + content: document.createElement("br"), + }, + ], + }); + + useStage.addEventListener("click", function () { + modal.close(); + }); + + upload.addEventListener("click", function () { + modal.close(); + }); + }); + row.appendChild(button); + } + ); + + async function setThumbnail(file) { + let options = { + body: file, + headers: { + accept: "*/*", + "content-type": file.type, + "x-csrftoken": feature.auth.csrf(), + "x-requested-with": "XMLHttpRequest", + }, + referrer: window.location.href, + referrerPolicy: "strict-origin-when-cross-origin", + method: "POST", + mode: "cors", + credentials: "include", + }; + + let response = await fetch( + `https://scratch.mit.edu/internalapi/project/thumbnail/${ + window.location.pathname.split("/")[2] + }/set/`, + options + ); + + if (response.ok) { + ScratchTools.modals.create({ + title: "Successfully Set Thumbnail", + description: "This project's thumbnail has been updated.", + components: [], + }); + } else { + ScratchTools.modals.create({ + title: "Failed to Set Thumbnail", + description: "This project's thumbnail was not able to be updated.", + components: [], + }); + } + } + } + \ No newline at end of file diff --git a/features/upload-thumbnail/style.css b/features/upload-thumbnail/style.css new file mode 100644 index 00000000..d3d9ce8a --- /dev/null +++ b/features/upload-thumbnail/style.css @@ -0,0 +1,24 @@ +.ste-thumbnail::before { + background-image: var(--scratchtoolsresource-thumbnail-btn); + display: inline-block; + margin-right: 0.25rem; + background-repeat: no-repeat; + background-position: center center; + background-size: contain; + width: 0.875rem; + height: 0.875rem; + vertical-align: bottom; + content: ""; + transform: scale(1.3); +} + + +.ste-thumbnail-stage:disabled { + opacity: .5; + cursor: not-allowed !important; + background: #b5b5b5 !important; +} + +.ste-thumbnail-stage:disabled:hover { + top: 0px !important; +} \ No newline at end of file diff --git a/features/upload-thumbnail/thumbnail-btn.svg b/features/upload-thumbnail/thumbnail-btn.svg new file mode 100644 index 00000000..270f1ecb --- /dev/null +++ b/features/upload-thumbnail/thumbnail-btn.svg @@ -0,0 +1 @@ + \ No newline at end of file From 7f4384c530e691e3bb7a4e69b21a9d372b93b550 Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2024 00:00:13 +0000 Subject: [PATCH 076/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index 1e10081a..76d37306 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From 1566d77b79bbf64b2c1594d45120239946ec2a1e Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sat, 6 Jul 2024 17:45:59 -0400 Subject: [PATCH 077/253] Align to Center --- features/align-to-center/data.json | 18 +++++++++ features/align-to-center/script.js | 63 ++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 features/align-to-center/data.json create mode 100644 features/align-to-center/script.js diff --git a/features/align-to-center/data.json b/features/align-to-center/data.json new file mode 100644 index 00000000..e926f233 --- /dev/null +++ b/features/align-to-center/data.json @@ -0,0 +1,18 @@ +{ + "title": "Align to Center", + "description": "Use Control + U / Command + U to center text within the instruction box on projects", + "credits": [ + { + "username": "Brass_Glass", + "url": "https://scratch.mit.edu/users/Brass_Glass/" + }, + { + "username": "MaterArc", + "url": "https://scratch.mit.edu/users/MaterArc/" + } + ], + "type": ["Website"], + "tags": ["New", "Recommended"], + "dynamic": true, + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }] +} diff --git a/features/align-to-center/script.js b/features/align-to-center/script.js new file mode 100644 index 00000000..d7181bde --- /dev/null +++ b/features/align-to-center/script.js @@ -0,0 +1,63 @@ +export default async function ({ feature, console }) { + const availableWidth = 405; + + function getSpaceWidth() { + const span = document.createElement("span"); + span.style.visibility = "hidden"; + span.style.whiteSpace = "pre"; + span.textContent = " "; + document.body.appendChild(span); + const spaceWidth = span.getBoundingClientRect().width; + document.body.removeChild(span); + return spaceWidth; + } + + function getTextWidth(text) { + const span = document.createElement("span"); + span.style.visibility = "hidden"; + span.style.whiteSpace = "pre"; + span.textContent = text; + document.body.appendChild(span); + const textWidth = span.getBoundingClientRect().width; + document.body.removeChild(span); + return textWidth; + } + + function centerAlignText() { + const form = document.querySelector(".project-description-form"); + if (form) { + const activeElement = document.activeElement; + if ( + activeElement.tagName === "TEXTAREA" && + form.contains(activeElement) + ) { + const spaceWidth = getSpaceWidth(); + const lines = activeElement.value.split("\n"); + const centeredLines = lines.map((line) => { + const textWidth = getTextWidth(line); + const totalSpaces = (availableWidth - textWidth) / spaceWidth / 2; + const spaces = " ".repeat(Math.floor(totalSpaces)); + return spaces + line; + }); + activeElement.value = centeredLines.join("\n"); + } + } + } + + window.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "u") { + centerAlignText(); + } + }); + + await ScratchTools.waitForElements( + ".project-description-form textarea", + (textareas) => { + textareas.forEach((textarea) => { + textarea.addEventListener("input", function () { + centerAlignText(); + }); + }); + } + ); +} From 6f14f05b60154e9c77e6e0e07b940099009299be Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sat, 6 Jul 2024 17:46:38 -0400 Subject: [PATCH 078/253] Update features.json --- features/features.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/features/features.json b/features/features.json index 9e7bf259..e2252726 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "align-to-center", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "upload-thumbnail", From 5028bf35b08f6e9d317b10773a56e260eeb14756 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sat, 6 Jul 2024 17:48:12 -0400 Subject: [PATCH 079/253] Prevent Shifting --- features/align-to-center/script.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/features/align-to-center/script.js b/features/align-to-center/script.js index d7181bde..ae3cd5a7 100644 --- a/features/align-to-center/script.js +++ b/features/align-to-center/script.js @@ -23,6 +23,14 @@ export default async function ({ feature, console }) { return textWidth; } + function clearCenterAlignment(textarea) { + const lines = textarea.value.split("\n"); + const uncenteredLines = lines.map((line) => { + return line.replace(/^\s+/, ""); + }); + textarea.value = uncenteredLines.join("\n"); + } + function centerAlignText() { const form = document.querySelector(".project-description-form"); if (form) { @@ -31,6 +39,8 @@ export default async function ({ feature, console }) { activeElement.tagName === "TEXTAREA" && form.contains(activeElement) ) { + clearCenterAlignment(activeElement); + const spaceWidth = getSpaceWidth(); const lines = activeElement.value.split("\n"); const centeredLines = lines.map((line) => { @@ -61,3 +71,4 @@ export default async function ({ feature, console }) { } ); } + From c96aee6a815df7d348d3b97a7ef7f3518bef2dfb Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sat, 6 Jul 2024 17:58:17 -0400 Subject: [PATCH 080/253] Rename --- features/sidebar/data.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/sidebar/data.json b/features/sidebar/data.json index b812596b..359cd5bd 100644 --- a/features/sidebar/data.json +++ b/features/sidebar/data.json @@ -4,7 +4,7 @@ "credits": [ {"username": "Scratchfangs", "url": "https://scratch.mit.edu/users/scratchfangs/"}, {"username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/"}, - {"username": "callumjt", "url": "https://scratch.mit.edu/users/callumjt/"} + {"username": "cally", "url": "https://scratch.mit.edu/users/callumjt/"} ], "type": ["Website", "Theme"], "dynamic": false, @@ -21,4 +21,4 @@ {"name": "settings", "path": "/resources/settings.svg"}, {"name": "signIn", "path": "/resources/signin.svg"} ] -} \ No newline at end of file +} From 611f8a38d6af8ec5858d0f8641aa81f6d79f5c96 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sat, 6 Jul 2024 18:02:50 -0400 Subject: [PATCH 081/253] Rename --- features/features.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/features.json b/features/features.json index 9e7bf259..8c363fcd 100644 --- a/features/features.json +++ b/features/features.json @@ -510,7 +510,7 @@ { "title": "Minimized Remix Credits", "description": "The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller.", - "credits": ["callumjt", "rgantzos"], + "credits": ["cally", "rgantzos"], "urls": [ "https://scratch.mit.edu/users/callumjt/", "https://scratch.mit.edu/users/rgantzos/" From 64cb14031d887dd2e6affa6b9953ced9284db75b Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sat, 6 Jul 2024 18:03:41 -0400 Subject: [PATCH 082/253] Rename --- features/project-bar/data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/project-bar/data.json b/features/project-bar/data.json index 57002ad2..be873ce7 100644 --- a/features/project-bar/data.json +++ b/features/project-bar/data.json @@ -3,7 +3,7 @@ "description": "Continue to view the information for a project, even after you scroll down past the notes and credits.", "credits": [ { - "username": "callumjt", + "username": "cally", "url": "https://scratch.mit.edu/users/callumjt/" }, { From bdeec70287c8be7511987aedacf0fbc80b65a6f1 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sat, 6 Jul 2024 18:04:18 -0400 Subject: [PATCH 083/253] Rename --- features/steal-game/data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/steal-game/data.json b/features/steal-game/data.json index 0b089e2c..385bd125 100644 --- a/features/steal-game/data.json +++ b/features/steal-game/data.json @@ -3,7 +3,7 @@ "description": "Changes the remix button's text to 'Steal game'.", "credits": [ { - "username": "callumjt", + "username": "cally", "url": "https://github.com/callumjt" } ], From f1a7975d7cf0d6528774eddff4e13eac2bf89736 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 7 Jul 2024 00:56:45 -0700 Subject: [PATCH 084/253] New feature: `more-editor-fonts` --- api/modal.css | 13 + api/modals.js | 3 +- features/features.json | 17 +- features/more-editor-fonts/data.json | 16 + features/more-editor-fonts/script.js | 178 + features/more-editor-fonts/style.css | 35 + features/more-editor-fonts/text.svg | 24 + features/special-editor-fonts.js | 47 - libraries/opentype.js | 10191 +++++++++++++++++++++++++ manifest.json | 1 + 10 files changed, 10465 insertions(+), 60 deletions(-) create mode 100644 features/more-editor-fonts/data.json create mode 100644 features/more-editor-fonts/script.js create mode 100644 features/more-editor-fonts/style.css create mode 100644 features/more-editor-fonts/text.svg delete mode 100644 features/special-editor-fonts.js create mode 100644 libraries/opentype.js diff --git a/api/modal.css b/api/modal.css index 4e7032cf..97e7cb6d 100644 --- a/api/modal.css +++ b/api/modal.css @@ -75,4 +75,17 @@ .st-modal button:hover { top: .4rem !important; +} + +.st-modal button.ste-modal-cancel-btn { + background-color: #c9c9c9 !important; +} + +.st-modal input { + padding: 0.5rem !important; + outline: none !important; + border-radius: 0.25rem !important; + border: 0px !important; + background-color: #e3e3e3; + margin-right: .5rem; } \ No newline at end of file diff --git a/api/modals.js b/api/modals.js index acf885d6..bd42fa17 100644 --- a/api/modals.js +++ b/api/modals.js @@ -38,7 +38,8 @@ ScratchTools.modals = { }); var closeButton = document.createElement("button"); - closeButton.textContent = "Close"; + closeButton.textContent = data.cancel ? "Cancel" : "Close"; + closeButton.className = data.cancel ? "ste-modal-cancel-btn" : "" closeButton.onclick = function () { div.remove(); }; diff --git a/features/features.json b/features/features.json index 9e7bf259..e79b7481 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "more-editor-fonts", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "upload-thumbnail", @@ -706,18 +711,6 @@ "type": ["Website"], "dynamic": true }, - { - "title": "More Editor Fonts", - "description": "Adds more fonts to choose from in the paint editor. They look nicer and are more modern.", - "credits": ["rgantzos", "Lasted10"], - "urls": [ - "https://scratch.mit.edu/users/rgantzos/", - "https://scratch.mit.edu/users/Lasted10_Forever/" - ], - "file": "special-editor-fonts", - "tags": ["Recommended", "Beta"], - "type": ["Editor"] - }, { "title": "Display Project Tags", "description": "Lists all of the tags used in the project description right below the project notes and credits.", diff --git a/features/more-editor-fonts/data.json b/features/more-editor-fonts/data.json new file mode 100644 index 00000000..86a9d203 --- /dev/null +++ b/features/more-editor-fonts/data.json @@ -0,0 +1,16 @@ +{ + "title": "More Paint Editor Fonts", + "description": "Allows you to use dozens of extra fonts in the paint editor.", + "credits": [ + { + "username": "Sanjang_Beta", + "url": "https://scratch.mit.edu/users/Sanjang_Beta/" + }, + { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } + ], + "type": ["Editor"], + "tags": ["New", "Featured"], + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], + "styles": [{ "file": "style.css", "runOn": "/projects/*" }], + "resources": [{ "name": "more-text-icon", "path": "/text.svg" }] +} diff --git a/features/more-editor-fonts/script.js b/features/more-editor-fonts/script.js new file mode 100644 index 00000000..791529dc --- /dev/null +++ b/features/more-editor-fonts/script.js @@ -0,0 +1,178 @@ +export default async function ({ feature, console }) { + let { default: openTypeDefault } = await import( + "../../libraries/opentype.js" + ); + openTypeDefault(); + + let fonts = await (await fetch(feature.server.endpoint("/fonts/"))).json(); + + feature.page.waitForElements( + "div[class^='asset-panel_wrapper_'] div[class^='action-menu_more-buttons_']", + function (menu) { + if (menu.querySelector(".ste-more-fonts")) return; + + let div = document.createElement("div"); + div.className = "ste-more-fonts"; + feature.self.hideOnDisable(div); + + let original = + menu.parentElement.previousElementSibling.previousElementSibling; + let id = original.getAttribute("aria-label").replace(/\s+/g, "_"); + + let button = document.createElement("button"); + button.dataset.tip = "Add Font"; + button.dataset.for = `ste-${id}-Add Font`; + button.currentitem = false; + button.ariaLabel = "Add Font"; + button.className = + "action-menu_button_1qbot action-menu_more-button_1fMGZ ste-more-fonts-btn"; + div.appendChild(button); + + let img = Object.assign(document.createElement("img"), { + src: feature.self.getResource("more-text-icon"), + draggable: false, + className: "action-menu_more-icon_TJUQ7", + width: 10, + }); + button.appendChild(img); + + let tooltip = Object.assign(document.createElement("div"), { + className: + "__react_component_tooltip place-right type-dark action-menu_tooltip_3Bkh5", + id: `ste-${id}-Add Font`, + textContent: "Add Font", + }); + tooltip.dataset.id = "tooltip"; + div.appendChild(tooltip); + + menu.prepend(div); + + button.addEventListener("click", function () { + let div = document.createElement("div"); + div.className = "ste-font-options"; + + let modal = ScratchTools.modals.create({ + title: "Pick Font", + description: + "You can pick a font from the list below to add to the project.", + components: [ + { + type: "html", + content: div, + }, + ], + cancel: true, + }); + + for (var i in fonts) { + let span = document.createElement("span"); + span.className = "ste-font-option"; + span.dataset.font = fonts[i]; + + let img = document.createElement("img"); + img.src = feature.server.endpoint(`/font/image/${fonts[i]}/`); + span.appendChild(img); + + span.addEventListener("click", function () { + let font = this.dataset.font; + modal.close(); + + let button = document.createElement("button"); + button.textContent = "Continue"; + + let typeModal = ScratchTools.modals.create({ + title: "Type Text", + description: "Type the text you would like to add.", + cancel: true, + components: [ + { + type: "html", + content: Object.assign(document.createElement("input"), { + className: "ste-font-input", + }), + }, + { + type: "html", + content: button, + }, + { + type: "html", + content: document.createElement("br"), + }, + ], + }); + + button.addEventListener("click", function () { + let text = document.querySelector(".ste-font-input").value; + typeModal.close(); + + setFont(font, text); + }); + }); + + div.appendChild(span); + } + }); + + let observer = new MutationObserver(doresize); + observer.observe(menu, { attributes: true, subtree: true }); + + function doresize() { + let rect = div.getBoundingClientRect(); + tooltip.style.top = rect.top + 2 + "px"; + tooltip.style.left = rect.left + rect.width + "px"; + } + } + ); + + function setFont(font, text) { + async function fetchFont(url) { + const response = await fetch(url); + if (!response.ok) throw new Error("Failed to fetch font"); + const arrayBuffer = await response.arrayBuffer(); + return arrayBuffer; + } + + function createSVGFromText(font, text) { + let width = font.getAdvanceWidth(text, 72); + const path = font.getPath(text, 0, 150, 72); + const svgPath = path.toSVG(); + const svg = ` + + ${svgPath} + + `; + return svg; + } + + async function generateSVGText(url, text) { + try { + const fontArrayBuffer = await fetchFont(url); + const font = opentype.parse(fontArrayBuffer); + const svgText = createSVGFromText(font, text); + addCostume(svgText); + } catch (error) { + console.error("Error:" + error); + } + } + + generateSVGText(feature.server.endpoint(`/font/${font}.ttf`), text); + } + + window.setFont = setFont; + + function addCostume(svg) { + let fileInput = document.querySelector("input[type=file]"); + + const blob = new Blob([svg], { type: "image/svg+xml" }); + const url = URL.createObjectURL(blob); + + const file = new File([blob], "text.svg", { type: "image/svg+xml" }); + + const dataTransfer = new DataTransfer(); + dataTransfer.items.add(file); + fileInput.files = dataTransfer.files; + + fileInput.dispatchEvent(new Event("change", { bubbles: true })); + } +} diff --git a/features/more-editor-fonts/style.css b/features/more-editor-fonts/style.css new file mode 100644 index 00000000..ad12d909 --- /dev/null +++ b/features/more-editor-fonts/style.css @@ -0,0 +1,35 @@ +[data-for*="Add Font"]:hover + .__react_component_tooltip { + visibility: visible; +} + +.ste-more-fonts-btn + .__react_component_tooltip { + left: auto; +} + +span.ste-font-option:nth-child(even) { + background-color: #e9e9e9; +} + +span.ste-font-option { + display: block; + padding-left: .5rem; + border-radius: .5rem; + cursor: pointer; +} + +span.ste-font-option:hover { + background-color: #ff9f00; +} + +span.ste-font-option:hover img { + filter: invert(1); +} + +span.ste-font-option img { + height: 3rem; +} + +.ste-font-options { + height: 11rem; + overflow: auto; +} \ No newline at end of file diff --git a/features/more-editor-fonts/text.svg b/features/more-editor-fonts/text.svg new file mode 100644 index 00000000..00a0ec45 --- /dev/null +++ b/features/more-editor-fonts/text.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/special-editor-fonts.js b/features/special-editor-fonts.js deleted file mode 100644 index 0dbf1fa8..00000000 --- a/features/special-editor-fonts.js +++ /dev/null @@ -1,47 +0,0 @@ -const fonts = ["Arial", "Helvetica", "Verdana", "Impact", "Monospace"]; - -function addFonts() { - if ( - document.querySelector(".font-dropdown_" + fonts[0] + "_2fPOh") === null && - document.querySelector( - "body > div.Popover.Popover-below.font-dropdown_mod-unselect_33YJN.font-dropdown_font-dropdown_3XyMU > div > div" - ) !== null - ) { - function addNewFont(font) { - var span = document.createElement("span"); - span.className = "button_button_u6SE2 font-dropdown_mod-menu-item_1wXq5"; - span.role = "button"; - var span2 = document.createElement("span"); - span2.className = "font-dropdown_" + font + "_2fPOh"; - span2.textContent = font; - span2.style.fontFamily = font; - span.appendChild(span2); - span.onclick = function () { - ScratchTools.Scratch.scratchPaint().selectedItems[0]?.setFont(font); - document - .querySelector( - "#react-tabs-3 > div > div.asset-panel_detail-area_2KQhH.box_box_2jjDp > div > div.paint-editor_editor-container-top_2wxS3 > div:nth-child(2) > div.paint-editor_mod-mode-tools_2Ihob.input-group_input-group_plJaJ > div > div > div" - ) - .click(); - document.querySelector( - ".font-dropdown_font-dropdown_3XyMU" - ).firstChild.textContent = font; - }; - document - .querySelector( - "body > div.Popover.Popover-below.font-dropdown_mod-unselect_33YJN.font-dropdown_font-dropdown_3XyMU > div > div" - ) - .appendChild(span); - } - fonts.forEach(function (el) { - addNewFont(el); - }); - } -} -var configure = { - attributes: true, - childList: true, - subtree: true, -}; -var waitForSpecialFontsSection = new MutationObserver(addFonts); -waitForSpecialFontsSection.observe(document.querySelector("body"), configure); diff --git a/libraries/opentype.js b/libraries/opentype.js new file mode 100644 index 00000000..b046c6bc --- /dev/null +++ b/libraries/opentype.js @@ -0,0 +1,10191 @@ +export default function () { + !(function (e, t) { + "object" == typeof exports && "undefined" != typeof module + ? t(exports) + : "function" == typeof define && define.amd + ? define(["exports"], t) + : t(((e = e || self).opentype = {})); + })(this, function (O) { + "use strict"; + function e(e) { + if (null == this) throw TypeError(); + var t = String(this), + r = t.length, + n = e ? Number(e) : 0; + if ((n != n && (n = 0), !(n < 0 || r <= n))) { + var a, + o = t.charCodeAt(n); + return 55296 <= o && + o <= 56319 && + n + 1 < r && + 56320 <= (a = t.charCodeAt(n + 1)) && + a <= 57343 + ? 1024 * (o - 55296) + a - 56320 + 65536 + : o; + } + } + var t; + String.prototype.codePointAt || + ((t = (function () { + try { + var e = {}, + t = Object.defineProperty, + r = t(e, e, e) && t; + } catch (e) {} + return r; + })()) + ? t(String.prototype, "codePointAt", { + value: e, + configurable: !0, + writable: !0, + }) + : (String.prototype.codePointAt = e)); + var u = 0, + o = -3; + function r() { + (this.table = new Uint16Array(16)), (this.trans = new Uint16Array(288)); + } + function s(e, t) { + (this.source = e), + (this.sourceIndex = 0), + (this.tag = 0), + (this.bitcount = 0), + (this.dest = t), + (this.destLen = 0), + (this.ltree = new r()), + (this.dtree = new r()); + } + var i = new r(), + l = new r(), + p = new Uint8Array(30), + c = new Uint16Array(30), + h = new Uint8Array(30), + f = new Uint16Array(30), + d = new Uint8Array([ + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15, + ]), + g = new r(), + v = new Uint8Array(320); + function n(e, t, r, n) { + var a, o; + for (a = 0; a < r; ++a) e[a] = 0; + for (a = 0; a < 30 - r; ++a) e[a + r] = (a / r) | 0; + for (o = n, a = 0; a < 30; ++a) (t[a] = o), (o += 1 << e[a]); + } + var m = new Uint16Array(16); + function y(e, t, r, n) { + var a, o; + for (a = 0; a < 16; ++a) e.table[a] = 0; + for (a = 0; a < n; ++a) e.table[t[r + a]]++; + for (a = o = e.table[0] = 0; a < 16; ++a) (m[a] = o), (o += e.table[a]); + for (a = 0; a < n; ++a) t[r + a] && (e.trans[m[t[r + a]]++] = a); + } + function b(e) { + e.bitcount-- || ((e.tag = e.source[e.sourceIndex++]), (e.bitcount = 7)); + var t = 1 & e.tag; + return (e.tag >>>= 1), t; + } + function S(e, t, r) { + if (!t) return r; + for (; e.bitcount < 24; ) + (e.tag |= e.source[e.sourceIndex++] << e.bitcount), (e.bitcount += 8); + var n = e.tag & (65535 >>> (16 - t)); + return (e.tag >>>= t), (e.bitcount -= t), n + r; + } + function x(e, t) { + for (; e.bitcount < 24; ) + (e.tag |= e.source[e.sourceIndex++] << e.bitcount), (e.bitcount += 8); + for ( + var r = 0, n = 0, a = 0, o = e.tag; + (n = 2 * n + (1 & o)), + (o >>>= 1), + ++a, + (r += t.table[a]), + 0 <= (n -= t.table[a]); + + ); + return (e.tag = o), (e.bitcount -= a), t.trans[r + n]; + } + function T(e, t, r) { + var n, a, o, s, i, u; + for (n = S(e, 5, 257), a = S(e, 5, 1), o = S(e, 4, 4), s = 0; s < 19; ++s) + v[s] = 0; + for (s = 0; s < o; ++s) { + var l = S(e, 3, 0); + v[d[s]] = l; + } + for (y(g, v, 0, 19), i = 0; i < n + a; ) { + var p = x(e, g); + switch (p) { + case 16: + var c = v[i - 1]; + for (u = S(e, 2, 3); u; --u) v[i++] = c; + break; + case 17: + for (u = S(e, 3, 3); u; --u) v[i++] = 0; + break; + case 18: + for (u = S(e, 7, 11); u; --u) v[i++] = 0; + break; + default: + v[i++] = p; + } + } + y(t, v, 0, n), y(r, v, n, a); + } + function k(e, t, r) { + for (;;) { + var n, + a, + o, + s, + i = x(e, t); + if (256 === i) return u; + if (i < 256) e.dest[e.destLen++] = i; + else + for ( + n = S(e, p[(i -= 257)], c[i]), + a = x(e, r), + s = o = e.destLen - S(e, h[a], f[a]); + s < o + n; + ++s + ) + e.dest[e.destLen++] = e.dest[s]; + } + } + function U(e) { + for (var t, r; 8 < e.bitcount; ) e.sourceIndex--, (e.bitcount -= 8); + if ( + (t = + 256 * (t = e.source[e.sourceIndex + 1]) + e.source[e.sourceIndex]) !== + (65535 & + ~(256 * e.source[e.sourceIndex + 3] + e.source[e.sourceIndex + 2])) + ) + return o; + for (e.sourceIndex += 4, r = t; r; --r) + e.dest[e.destLen++] = e.source[e.sourceIndex++]; + return (e.bitcount = 0), u; + } + !(function (e, t) { + var r; + for (r = 0; r < 7; ++r) e.table[r] = 0; + for ( + e.table[7] = 24, e.table[8] = 152, e.table[9] = 112, r = 0; + r < 24; + ++r + ) + e.trans[r] = 256 + r; + for (r = 0; r < 144; ++r) e.trans[24 + r] = r; + for (r = 0; r < 8; ++r) e.trans[168 + r] = 280 + r; + for (r = 0; r < 112; ++r) e.trans[176 + r] = 144 + r; + for (r = 0; r < 5; ++r) t.table[r] = 0; + for (t.table[5] = 32, r = 0; r < 32; ++r) t.trans[r] = r; + })(i, l), + n(p, c, 4, 3), + n(h, f, 2, 1), + (p[28] = 0), + (c[28] = 258); + var a = function (e, t) { + var r, + n, + a = new s(e, t); + do { + switch (((r = b(a)), S(a, 2, 0))) { + case 0: + n = U(a); + break; + case 1: + n = k(a, i, l); + break; + case 2: + T(a, a.ltree, a.dtree), (n = k(a, a.ltree, a.dtree)); + break; + default: + n = o; + } + if (n !== u) throw new Error("Data error"); + } while (!r); + return a.destLen < a.dest.length + ? "function" == typeof a.dest.slice + ? a.dest.slice(0, a.destLen) + : a.dest.subarray(0, a.destLen) + : a.dest; + }; + function E(e, t, r, n, a) { + return ( + Math.pow(1 - a, 3) * e + + 3 * Math.pow(1 - a, 2) * a * t + + 3 * (1 - a) * Math.pow(a, 2) * r + + Math.pow(a, 3) * n + ); + } + function R() { + (this.x1 = Number.NaN), + (this.y1 = Number.NaN), + (this.x2 = Number.NaN), + (this.y2 = Number.NaN); + } + function B() { + (this.commands = []), + (this.fill = "black"), + (this.stroke = null), + (this.strokeWidth = 1); + } + function L(e) { + throw new Error(e); + } + function C(e, t) { + e || L(t); + } + (R.prototype.isEmpty = function () { + return ( + isNaN(this.x1) || isNaN(this.y1) || isNaN(this.x2) || isNaN(this.y2) + ); + }), + (R.prototype.addPoint = function (e, t) { + "number" == typeof e && + ((isNaN(this.x1) || isNaN(this.x2)) && ((this.x1 = e), (this.x2 = e)), + e < this.x1 && (this.x1 = e), + e > this.x2 && (this.x2 = e)), + "number" == typeof t && + ((isNaN(this.y1) || isNaN(this.y2)) && + ((this.y1 = t), (this.y2 = t)), + t < this.y1 && (this.y1 = t), + t > this.y2 && (this.y2 = t)); + }), + (R.prototype.addX = function (e) { + this.addPoint(e, null); + }), + (R.prototype.addY = function (e) { + this.addPoint(null, e); + }), + (R.prototype.addBezier = function (e, t, r, n, a, o, s, i) { + var u = [e, t], + l = [r, n], + p = [a, o], + c = [s, i]; + this.addPoint(e, t), this.addPoint(s, i); + for (var h = 0; h <= 1; h++) { + var f = 6 * u[h] - 12 * l[h] + 6 * p[h], + d = -3 * u[h] + 9 * l[h] - 9 * p[h] + 3 * c[h], + g = 3 * l[h] - 3 * u[h]; + if (0 != d) { + var v = Math.pow(f, 2) - 4 * g * d; + if (!(v < 0)) { + var m = (-f + Math.sqrt(v)) / (2 * d); + 0 < m && + m < 1 && + (0 === h && this.addX(E(u[h], l[h], p[h], c[h], m)), + 1 === h && this.addY(E(u[h], l[h], p[h], c[h], m))); + var y = (-f - Math.sqrt(v)) / (2 * d); + 0 < y && + y < 1 && + (0 === h && this.addX(E(u[h], l[h], p[h], c[h], y)), + 1 === h && this.addY(E(u[h], l[h], p[h], c[h], y))); + } + } else { + if (0 == f) continue; + var b = -g / f; + 0 < b && + b < 1 && + (0 === h && this.addX(E(u[h], l[h], p[h], c[h], b)), + 1 === h && this.addY(E(u[h], l[h], p[h], c[h], b))); + } + } + }), + (R.prototype.addQuad = function (e, t, r, n, a, o) { + var s = e + (2 / 3) * (r - e), + i = t + (2 / 3) * (n - t), + u = s + (1 / 3) * (a - e), + l = i + (1 / 3) * (o - t); + this.addBezier(e, t, s, i, u, l, a, o); + }), + (B.prototype.moveTo = function (e, t) { + this.commands.push({ type: "M", x: e, y: t }); + }), + (B.prototype.lineTo = function (e, t) { + this.commands.push({ type: "L", x: e, y: t }); + }), + (B.prototype.curveTo = B.prototype.bezierCurveTo = + function (e, t, r, n, a, o) { + this.commands.push({ + type: "C", + x1: e, + y1: t, + x2: r, + y2: n, + x: a, + y: o, + }); + }), + (B.prototype.quadTo = B.prototype.quadraticCurveTo = + function (e, t, r, n) { + this.commands.push({ type: "Q", x1: e, y1: t, x: r, y: n }); + }), + (B.prototype.close = B.prototype.closePath = + function () { + this.commands.push({ type: "Z" }); + }), + (B.prototype.extend = function (e) { + if (e.commands) e = e.commands; + else if (e instanceof R) { + var t = e; + return ( + this.moveTo(t.x1, t.y1), + this.lineTo(t.x2, t.y1), + this.lineTo(t.x2, t.y2), + this.lineTo(t.x1, t.y2), + void this.close() + ); + } + Array.prototype.push.apply(this.commands, e); + }), + (B.prototype.getBoundingBox = function () { + for ( + var e = new R(), t = 0, r = 0, n = 0, a = 0, o = 0; + o < this.commands.length; + o++ + ) { + var s = this.commands[o]; + switch (s.type) { + case "M": + e.addPoint(s.x, s.y), (t = n = s.x), (r = a = s.y); + break; + case "L": + e.addPoint(s.x, s.y), (n = s.x), (a = s.y); + break; + case "Q": + e.addQuad(n, a, s.x1, s.y1, s.x, s.y), (n = s.x), (a = s.y); + break; + case "C": + e.addBezier(n, a, s.x1, s.y1, s.x2, s.y2, s.x, s.y), + (n = s.x), + (a = s.y); + break; + case "Z": + (n = t), (a = r); + break; + default: + throw new Error("Unexpected path command " + s.type); + } + } + return e.isEmpty() && e.addPoint(0, 0), e; + }), + (B.prototype.draw = function (e) { + e.beginPath(); + for (var t = 0; t < this.commands.length; t += 1) { + var r = this.commands[t]; + "M" === r.type + ? e.moveTo(r.x, r.y) + : "L" === r.type + ? e.lineTo(r.x, r.y) + : "C" === r.type + ? e.bezierCurveTo(r.x1, r.y1, r.x2, r.y2, r.x, r.y) + : "Q" === r.type + ? e.quadraticCurveTo(r.x1, r.y1, r.x, r.y) + : "Z" === r.type && e.closePath(); + } + this.fill && ((e.fillStyle = this.fill), e.fill()), + this.stroke && + ((e.strokeStyle = this.stroke), + (e.lineWidth = this.strokeWidth), + e.stroke()); + }), + (B.prototype.toPathData = function (o) { + function e() { + for ( + var e, t = arguments, r = "", n = 0; + n < arguments.length; + n += 1 + ) { + var a = t[n]; + 0 <= a && 0 < n && (r += " "), + (r += + ((e = a), + Math.round(e) === e ? "" + Math.round(e) : e.toFixed(o))); + } + return r; + } + o = void 0 !== o ? o : 2; + for (var t = "", r = 0; r < this.commands.length; r += 1) { + var n = this.commands[r]; + "M" === n.type + ? (t += "M" + e(n.x, n.y)) + : "L" === n.type + ? (t += "L" + e(n.x, n.y)) + : "C" === n.type + ? (t += "C" + e(n.x1, n.y1, n.x2, n.y2, n.x, n.y)) + : "Q" === n.type + ? (t += "Q" + e(n.x1, n.y1, n.x, n.y)) + : "Z" === n.type && (t += "Z"); + } + return t; + }), + (B.prototype.toSVG = function (e) { + var t = '> 8) & 255, 255 & e]; + }), + (G.USHORT = F(2)), + (M.SHORT = function (e) { + return 32768 <= e && (e = -(65536 - e)), [(e >> 8) & 255, 255 & e]; + }), + (G.SHORT = F(2)), + (M.UINT24 = function (e) { + return [(e >> 16) & 255, (e >> 8) & 255, 255 & e]; + }), + (G.UINT24 = F(3)), + (M.ULONG = function (e) { + return [(e >> 24) & 255, (e >> 16) & 255, (e >> 8) & 255, 255 & e]; + }), + (G.ULONG = F(4)), + (M.LONG = function (e) { + return ( + D <= e && (e = -(2 * D - e)), + [(e >> 24) & 255, (e >> 16) & 255, (e >> 8) & 255, 255 & e] + ); + }), + (G.LONG = F(4)), + (M.FIXED = M.ULONG), + (G.FIXED = G.ULONG), + (M.FWORD = M.SHORT), + (G.FWORD = G.SHORT), + (M.UFWORD = M.USHORT), + (G.UFWORD = G.USHORT), + (M.LONGDATETIME = function (e) { + return [ + 0, + 0, + 0, + 0, + (e >> 24) & 255, + (e >> 16) & 255, + (e >> 8) & 255, + 255 & e, + ]; + }), + (G.LONGDATETIME = F(8)), + (M.TAG = function (e) { + return ( + w.argument( + 4 === e.length, + "Tag should be exactly 4 ASCII characters." + ), + [e.charCodeAt(0), e.charCodeAt(1), e.charCodeAt(2), e.charCodeAt(3)] + ); + }), + (G.TAG = F(4)), + (M.Card8 = M.BYTE), + (G.Card8 = G.BYTE), + (M.Card16 = M.USHORT), + (G.Card16 = G.USHORT), + (M.OffSize = M.BYTE), + (G.OffSize = G.BYTE), + (M.SID = M.USHORT), + (G.SID = G.USHORT), + (M.NUMBER = function (e) { + return -107 <= e && e <= 107 + ? [e + 139] + : 108 <= e && e <= 1131 + ? [247 + ((e -= 108) >> 8), 255 & e] + : -1131 <= e && e <= -108 + ? [251 + ((e = -e - 108) >> 8), 255 & e] + : -32768 <= e && e <= 32767 + ? M.NUMBER16(e) + : M.NUMBER32(e); + }), + (G.NUMBER = function (e) { + return M.NUMBER(e).length; + }), + (M.NUMBER16 = function (e) { + return [28, (e >> 8) & 255, 255 & e]; + }), + (G.NUMBER16 = F(3)), + (M.NUMBER32 = function (e) { + return [29, (e >> 24) & 255, (e >> 16) & 255, (e >> 8) & 255, 255 & e]; + }), + (G.NUMBER32 = F(5)), + (M.REAL = function (e) { + var t = e.toString(), + r = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(t); + if (r) { + var n = parseFloat("1e" + ((r[2] ? +r[2] : 0) + r[1].length)); + t = (Math.round(e * n) / n).toString(); + } + for (var a = "", o = 0, s = t.length; o < s; o += 1) { + var i = t[o]; + a += + "e" === i + ? "-" === t[++o] + ? "c" + : "b" + : "." === i + ? "a" + : "-" === i + ? "e" + : i; + } + for ( + var u = [30], l = 0, p = (a += 1 & a.length ? "f" : "ff").length; + l < p; + l += 2 + ) + u.push(parseInt(a.substr(l, 2), 16)); + return u; + }), + (G.REAL = function (e) { + return M.REAL(e).length; + }), + (M.NAME = M.CHARARRAY), + (G.NAME = G.CHARARRAY), + (M.STRING = M.CHARARRAY), + (G.STRING = G.CHARARRAY), + (I.UTF8 = function (e, t, r) { + for (var n = [], a = r, o = 0; o < a; o++, t += 1) n[o] = e.getUint8(t); + return String.fromCharCode.apply(null, n); + }), + (I.UTF16 = function (e, t, r) { + for (var n = [], a = r / 2, o = 0; o < a; o++, t += 2) + n[o] = e.getUint16(t); + return String.fromCharCode.apply(null, n); + }), + (M.UTF16 = function (e) { + for (var t = [], r = 0; r < e.length; r += 1) { + var n = e.charCodeAt(r); + (t[t.length] = (n >> 8) & 255), (t[t.length] = 255 & n); + } + return t; + }), + (G.UTF16 = function (e) { + return 2 * e.length; + }); + var A = { + "x-mac-croatian": + "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈ƫȅ ÀÃÕŒœĐ—“”‘’÷◊©⁄€‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ", + "x-mac-cyrillic": + "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю", + "x-mac-gaelic": + "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØḂ±≤≥ḃĊċḊḋḞḟĠġṀæøṁṖṗɼƒſṠ«»… ÀÃÕŒœ–—“”‘’ṡẛÿŸṪ€‹›Ŷŷṫ·Ỳỳ⁊ÂÊÁËÈÍÎÏÌÓÔ♣ÒÚÛÙıÝýŴŵẄẅẀẁẂẃ", + "x-mac-greek": + "Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦€ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ­", + "x-mac-icelandic": + "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüݰ¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ", + "x-mac-inuit": + "ᐃᐄᐅᐆᐊᐋᐱᐲᐳᐴᐸᐹᑉᑎᑏᑐᑑᑕᑖᑦᑭᑮᑯᑰᑲᑳᒃᒋᒌᒍᒎᒐᒑ°ᒡᒥᒦ•¶ᒧ®©™ᒨᒪᒫᒻᓂᓃᓄᓅᓇᓈᓐᓯᓰᓱᓲᓴᓵᔅᓕᓖᓗᓘᓚᓛᓪᔨᔩᔪᔫᔭ… ᔮᔾᕕᕖᕗ–—“”‘’ᕘᕙᕚᕝᕆᕇᕈᕉᕋᕌᕐᕿᖀᖁᖂᖃᖄᖅᖏᖐᖑᖒᖓᖔᖕᙱᙲᙳᙴᙵᙶᖖᖠᖡᖢᖣᖤᖥᖦᕼŁł", + "x-mac-ce": + "ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ", + macintosh: + "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ", + "x-mac-romanian": + "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂȘ∞±≤≥¥µ∂∑∏π∫ªºΩăș¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›Țț‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ", + "x-mac-turkish": + "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙˆ˜¯˘˙˚¸˝˛ˇ", + }; + I.MACSTRING = function (e, t, r, n) { + var a = A[n]; + if (void 0 !== a) { + for (var o = "", s = 0; s < r; s++) { + var i = e.getUint8(t + s); + o += i <= 127 ? String.fromCharCode(i) : a[127 & i]; + } + return o; + } + }; + var P, + N = "function" == typeof WeakMap && new WeakMap(); + function H(e) { + return -128 <= e && e <= 127; + } + function z(e, t, r) { + for (var n = 0, a = e.length; t < a && n < 64 && 0 === e[t]; ) ++t, ++n; + return r.push(128 | (n - 1)), t; + } + function W(e, t, r) { + for (var n = 0, a = e.length, o = t; o < a && n < 64; ) { + var s = e[o]; + if (!H(s)) break; + if (0 === s && o + 1 < a && 0 === e[o + 1]) break; + ++o, ++n; + } + r.push(n - 1); + for (var i = t; i < o; ++i) r.push((e[i] + 256) & 255); + return o; + } + function q(e, t, r) { + for (var n = 0, a = e.length, o = t; o < a && n < 64; ) { + var s = e[o]; + if (0 === s) break; + if (H(s) && o + 1 < a && H(e[o + 1])) break; + ++o, ++n; + } + r.push(64 | (n - 1)); + for (var i = t; i < o; ++i) { + var u = e[i]; + r.push(((u + 65536) >> 8) & 255, (u + 256) & 255); + } + return o; + } + (M.MACSTRING = function (e, t) { + var r = (function (e) { + if (!P) for (var t in ((P = {}), A)) P[t] = new String(t); + var r = P[e]; + if (void 0 !== r) { + if (N) { + var n = N.get(r); + if (void 0 !== n) return n; + } + var a = A[e]; + if (void 0 !== a) { + for (var o = {}, s = 0; s < a.length; s++) + o[a.charCodeAt(s)] = s + 128; + return N && N.set(r, o), o; + } + } + })(t); + if (void 0 !== r) { + for (var n = [], a = 0; a < e.length; a++) { + var o = e.charCodeAt(a); + if (128 <= o && void 0 === (o = r[o])) return; + n[a] = o; + } + return n; + } + }), + (G.MACSTRING = function (e, t) { + var r = M.MACSTRING(e, t); + return void 0 !== r ? r.length : 0; + }), + (M.VARDELTAS = function (e) { + for (var t = 0, r = []; t < e.length; ) { + var n = e[t]; + t = (0 === n ? z : -128 <= n && n <= 127 ? W : q)(e, t, r); + } + return r; + }), + (M.INDEX = function (e) { + for (var t = 1, r = [t], n = [], a = 0; a < e.length; a += 1) { + var o = M.OBJECT(e[a]); + Array.prototype.push.apply(n, o), (t += o.length), r.push(t); + } + if (0 === n.length) return [0, 0]; + for ( + var s = [], + i = (1 + Math.floor(Math.log(t) / Math.log(2)) / 8) | 0, + u = [void 0, M.BYTE, M.USHORT, M.UINT24, M.ULONG][i], + l = 0; + l < r.length; + l += 1 + ) { + var p = u(r[l]); + Array.prototype.push.apply(s, p); + } + return Array.prototype.concat(M.Card16(e.length), M.OffSize(i), s, n); + }), + (G.INDEX = function (e) { + return M.INDEX(e).length; + }), + (M.DICT = function (e) { + for ( + var t = [], r = Object.keys(e), n = r.length, a = 0; + a < n; + a += 1 + ) { + var o = parseInt(r[a], 0), + s = e[o]; + t = (t = t.concat(M.OPERAND(s.value, s.type))).concat(M.OPERATOR(o)); + } + return t; + }), + (G.DICT = function (e) { + return M.DICT(e).length; + }), + (M.OPERATOR = function (e) { + return e < 1200 ? [e] : [12, e - 1200]; + }), + (M.OPERAND = function (e, t) { + var r = []; + if (Array.isArray(t)) + for (var n = 0; n < t.length; n += 1) + w.argument( + e.length === t.length, + "Not enough arguments given for type" + t + ), + (r = r.concat(M.OPERAND(e[n], t[n]))); + else if ("SID" === t) r = r.concat(M.NUMBER(e)); + else if ("offset" === t) r = r.concat(M.NUMBER32(e)); + else if ("number" === t) r = r.concat(M.NUMBER(e)); + else { + if ("real" !== t) throw new Error("Unknown operand type " + t); + r = r.concat(M.REAL(e)); + } + return r; + }), + (M.OP = M.BYTE), + (G.OP = G.BYTE); + var _ = "function" == typeof WeakMap && new WeakMap(); + function X(e, t, r) { + if (t.length && ("coverageFormat" !== t[0].name || 1 === t[0].value)) + for (var n = 0; n < t.length; n += 1) { + var a = t[n]; + this[a.name] = a.value; + } + if (((this.tableName = e), (this.fields = t), r)) + for (var o = Object.keys(r), s = 0; s < o.length; s += 1) { + var i = o[s], + u = r[i]; + void 0 !== this[i] && (this[i] = u); + } + } + function V(e, t, r) { + void 0 === r && (r = t.length); + var n = new Array(t.length + 1); + n[0] = { name: e + "Count", type: "USHORT", value: r }; + for (var a = 0; a < t.length; a++) + n[a + 1] = { name: e + a, type: "USHORT", value: t[a] }; + return n; + } + function Y(e, t, r) { + var n = t.length, + a = new Array(n + 1); + a[0] = { name: e + "Count", type: "USHORT", value: n }; + for (var o = 0; o < n; o++) + a[o + 1] = { name: e + o, type: "TABLE", value: r(t[o], o) }; + return a; + } + function j(e, t, r) { + var n = t.length, + a = []; + a[0] = { name: e + "Count", type: "USHORT", value: n }; + for (var o = 0; o < n; o++) a = a.concat(r(t[o], o)); + return a; + } + function Z(e) { + 1 === e.format + ? X.call( + this, + "coverageTable", + [{ name: "coverageFormat", type: "USHORT", value: 1 }].concat( + V("glyph", e.glyphs) + ) + ) + : 2 === e.format + ? X.call( + this, + "coverageTable", + [{ name: "coverageFormat", type: "USHORT", value: 2 }].concat( + j("rangeRecord", e.ranges, function (e) { + return [ + { name: "startGlyphID", type: "USHORT", value: e.start }, + { name: "endGlyphID", type: "USHORT", value: e.end }, + { + name: "startCoverageIndex", + type: "USHORT", + value: e.index, + }, + ]; + }) + ) + ) + : w.assert(!1, "Coverage format must be 1 or 2."); + } + function Q(e) { + X.call( + this, + "scriptListTable", + j("scriptRecord", e, function (e, t) { + var r = e.script, + n = r.defaultLangSys; + return ( + w.assert( + !!n, + "Unable to write GSUB: script " + + e.tag + + " has no default language system." + ), + [ + { name: "scriptTag" + t, type: "TAG", value: e.tag }, + { + name: "script" + t, + type: "TABLE", + value: new X( + "scriptTable", + [ + { + name: "defaultLangSys", + type: "TABLE", + value: new X( + "defaultLangSys", + [ + { name: "lookupOrder", type: "USHORT", value: 0 }, + { + name: "reqFeatureIndex", + type: "USHORT", + value: n.reqFeatureIndex, + }, + ].concat(V("featureIndex", n.featureIndexes)) + ), + }, + ].concat( + j("langSys", r.langSysRecords, function (e, t) { + var r = e.langSys; + return [ + { name: "langSysTag" + t, type: "TAG", value: e.tag }, + { + name: "langSys" + t, + type: "TABLE", + value: new X( + "langSys", + [ + { name: "lookupOrder", type: "USHORT", value: 0 }, + { + name: "reqFeatureIndex", + type: "USHORT", + value: r.reqFeatureIndex, + }, + ].concat(V("featureIndex", r.featureIndexes)) + ), + }, + ]; + }) + ) + ), + }, + ] + ); + }) + ); + } + function K(e) { + X.call( + this, + "featureListTable", + j("featureRecord", e, function (e, t) { + var r = e.feature; + return [ + { name: "featureTag" + t, type: "TAG", value: e.tag }, + { + name: "feature" + t, + type: "TABLE", + value: new X( + "featureTable", + [ + { + name: "featureParams", + type: "USHORT", + value: r.featureParams, + }, + ].concat(V("lookupListIndex", r.lookupListIndexes)) + ), + }, + ]; + }) + ); + } + function J(e, r) { + X.call( + this, + "lookupListTable", + Y("lookup", e, function (e) { + var t = r[e.lookupType]; + return ( + w.assert( + !!t, + "Unable to write GSUB lookup type " + e.lookupType + " tables." + ), + new X( + "lookupTable", + [ + { name: "lookupType", type: "USHORT", value: e.lookupType }, + { name: "lookupFlag", type: "USHORT", value: e.lookupFlag }, + ].concat(Y("subtable", e.subtables, t)) + ) + ); + }) + ); + } + (M.CHARSTRING = function (e) { + if (_) { + var t = _.get(e); + if (void 0 !== t) return t; + } + for (var r = [], n = e.length, a = 0; a < n; a += 1) { + var o = e[a]; + r = r.concat(M[o.type](o.value)); + } + return _ && _.set(e, r), r; + }), + (G.CHARSTRING = function (e) { + return M.CHARSTRING(e).length; + }), + (M.OBJECT = function (e) { + var t = M[e.type]; + return ( + w.argument(void 0 !== t, "No encoding function for type " + e.type), + t(e.value) + ); + }), + (G.OBJECT = function (e) { + var t = G[e.type]; + return ( + w.argument(void 0 !== t, "No sizeOf function for type " + e.type), + t(e.value) + ); + }), + (M.TABLE = function (e) { + for ( + var t = [], r = e.fields.length, n = [], a = [], o = 0; + o < r; + o += 1 + ) { + var s = e.fields[o], + i = M[s.type]; + w.argument( + void 0 !== i, + "No encoding function for field type " + + s.type + + " (" + + s.name + + ")" + ); + var u = e[s.name]; + void 0 === u && (u = s.value); + var l = i(u); + "TABLE" === s.type + ? (a.push(t.length), (t = t.concat([0, 0])), n.push(l)) + : (t = t.concat(l)); + } + for (var p = 0; p < n.length; p += 1) { + var c = a[p], + h = t.length; + w.argument(h < 65536, "Table " + e.tableName + " too big."), + (t[c] = h >> 8), + (t[c + 1] = 255 & h), + (t = t.concat(n[p])); + } + return t; + }), + (G.TABLE = function (e) { + for (var t = 0, r = e.fields.length, n = 0; n < r; n += 1) { + var a = e.fields[n], + o = G[a.type]; + w.argument( + void 0 !== o, + "No sizeOf function for field type " + a.type + " (" + a.name + ")" + ); + var s = e[a.name]; + void 0 === s && (s = a.value), + (t += o(s)), + "TABLE" === a.type && (t += 2); + } + return t; + }), + (M.RECORD = M.TABLE), + (G.RECORD = G.TABLE), + (M.LITERAL = function (e) { + return e; + }), + (G.LITERAL = function (e) { + return e.length; + }), + (X.prototype.encode = function () { + return M.TABLE(this); + }), + (X.prototype.sizeOf = function () { + return G.TABLE(this); + }); + var $ = { + Table: X, + Record: X, + Coverage: ((Z.prototype = Object.create(X.prototype)).constructor = Z), + ScriptList: ((Q.prototype = Object.create(X.prototype)).constructor = Q), + FeatureList: ((K.prototype = Object.create(X.prototype)).constructor = K), + LookupList: ((J.prototype = Object.create(X.prototype)).constructor = J), + ushortList: V, + tableList: Y, + recordList: j, + }; + function ee(e, t) { + return e.getUint8(t); + } + function te(e, t) { + return e.getUint16(t, !1); + } + function re(e, t) { + return e.getUint32(t, !1); + } + function ne(e, t) { + return e.getInt16(t, !1) + e.getUint16(t + 2, !1) / 65535; + } + var ae = { + byte: 1, + uShort: 2, + short: 2, + uLong: 4, + fixed: 4, + longDateTime: 8, + tag: 4, + }; + function oe(e, t) { + (this.data = e), (this.offset = t), (this.relativeOffset = 0); + } + (oe.prototype.parseByte = function () { + var e = this.data.getUint8(this.offset + this.relativeOffset); + return (this.relativeOffset += 1), e; + }), + (oe.prototype.parseChar = function () { + var e = this.data.getInt8(this.offset + this.relativeOffset); + return (this.relativeOffset += 1), e; + }), + (oe.prototype.parseCard8 = oe.prototype.parseByte), + (oe.prototype.parseCard16 = oe.prototype.parseUShort = + function () { + var e = this.data.getUint16(this.offset + this.relativeOffset); + return (this.relativeOffset += 2), e; + }), + (oe.prototype.parseSID = oe.prototype.parseUShort), + (oe.prototype.parseOffset16 = oe.prototype.parseUShort), + (oe.prototype.parseShort = function () { + var e = this.data.getInt16(this.offset + this.relativeOffset); + return (this.relativeOffset += 2), e; + }), + (oe.prototype.parseF2Dot14 = function () { + var e = this.data.getInt16(this.offset + this.relativeOffset) / 16384; + return (this.relativeOffset += 2), e; + }), + (oe.prototype.parseOffset32 = oe.prototype.parseULong = + function () { + var e = re(this.data, this.offset + this.relativeOffset); + return (this.relativeOffset += 4), e; + }), + (oe.prototype.parseFixed = function () { + var e = ne(this.data, this.offset + this.relativeOffset); + return (this.relativeOffset += 4), e; + }), + (oe.prototype.parseString = function (e) { + var t = this.data, + r = this.offset + this.relativeOffset, + n = ""; + this.relativeOffset += e; + for (var a = 0; a < e; a++) n += String.fromCharCode(t.getUint8(r + a)); + return n; + }), + (oe.prototype.parseTag = function () { + return this.parseString(4); + }), + (oe.prototype.parseLongDateTime = function () { + var e = re(this.data, this.offset + this.relativeOffset + 4); + return (e -= 2082844800), (this.relativeOffset += 8), e; + }), + (oe.prototype.parseVersion = function (e) { + var t = te(this.data, this.offset + this.relativeOffset), + r = te(this.data, this.offset + this.relativeOffset + 2); + return ( + (this.relativeOffset += 4), void 0 === e && (e = 4096), t + r / e / 10 + ); + }), + (oe.prototype.skip = function (e, t) { + void 0 === t && (t = 1), (this.relativeOffset += ae[e] * t); + }), + (oe.prototype.parseULongList = function (e) { + void 0 === e && (e = this.parseULong()); + for ( + var t = new Array(e), + r = this.data, + n = this.offset + this.relativeOffset, + a = 0; + a < e; + a++ + ) + (t[a] = r.getUint32(n)), (n += 4); + return (this.relativeOffset += 4 * e), t; + }), + (oe.prototype.parseOffset16List = oe.prototype.parseUShortList = + function (e) { + void 0 === e && (e = this.parseUShort()); + for ( + var t = new Array(e), + r = this.data, + n = this.offset + this.relativeOffset, + a = 0; + a < e; + a++ + ) + (t[a] = r.getUint16(n)), (n += 2); + return (this.relativeOffset += 2 * e), t; + }), + (oe.prototype.parseShortList = function (e) { + for ( + var t = new Array(e), + r = this.data, + n = this.offset + this.relativeOffset, + a = 0; + a < e; + a++ + ) + (t[a] = r.getInt16(n)), (n += 2); + return (this.relativeOffset += 2 * e), t; + }), + (oe.prototype.parseByteList = function (e) { + for ( + var t = new Array(e), + r = this.data, + n = this.offset + this.relativeOffset, + a = 0; + a < e; + a++ + ) + t[a] = r.getUint8(n++); + return (this.relativeOffset += e), t; + }), + (oe.prototype.parseList = function (e, t) { + t || ((t = e), (e = this.parseUShort())); + for (var r = new Array(e), n = 0; n < e; n++) r[n] = t.call(this); + return r; + }), + (oe.prototype.parseList32 = function (e, t) { + t || ((t = e), (e = this.parseULong())); + for (var r = new Array(e), n = 0; n < e; n++) r[n] = t.call(this); + return r; + }), + (oe.prototype.parseRecordList = function (e, t) { + t || ((t = e), (e = this.parseUShort())); + for (var r = new Array(e), n = Object.keys(t), a = 0; a < e; a++) { + for (var o = {}, s = 0; s < n.length; s++) { + var i = n[s], + u = t[i]; + o[i] = u.call(this); + } + r[a] = o; + } + return r; + }), + (oe.prototype.parseRecordList32 = function (e, t) { + t || ((t = e), (e = this.parseULong())); + for (var r = new Array(e), n = Object.keys(t), a = 0; a < e; a++) { + for (var o = {}, s = 0; s < n.length; s++) { + var i = n[s], + u = t[i]; + o[i] = u.call(this); + } + r[a] = o; + } + return r; + }), + (oe.prototype.parseStruct = function (e) { + if ("function" == typeof e) return e.call(this); + for (var t = Object.keys(e), r = {}, n = 0; n < t.length; n++) { + var a = t[n], + o = e[a]; + r[a] = o.call(this); + } + return r; + }), + (oe.prototype.parseValueRecord = function (e) { + if ((void 0 === e && (e = this.parseUShort()), 0 !== e)) { + var t = {}; + return ( + 1 & e && (t.xPlacement = this.parseShort()), + 2 & e && (t.yPlacement = this.parseShort()), + 4 & e && (t.xAdvance = this.parseShort()), + 8 & e && (t.yAdvance = this.parseShort()), + 16 & e && ((t.xPlaDevice = void 0), this.parseShort()), + 32 & e && ((t.yPlaDevice = void 0), this.parseShort()), + 64 & e && ((t.xAdvDevice = void 0), this.parseShort()), + 128 & e && ((t.yAdvDevice = void 0), this.parseShort()), + t + ); + } + }), + (oe.prototype.parseValueRecordList = function () { + for ( + var e = this.parseUShort(), + t = this.parseUShort(), + r = new Array(t), + n = 0; + n < t; + n++ + ) + r[n] = this.parseValueRecord(e); + return r; + }), + (oe.prototype.parsePointer = function (e) { + var t = this.parseOffset16(); + if (0 < t) return new oe(this.data, this.offset + t).parseStruct(e); + }), + (oe.prototype.parsePointer32 = function (e) { + var t = this.parseOffset32(); + if (0 < t) return new oe(this.data, this.offset + t).parseStruct(e); + }), + (oe.prototype.parseListOfLists = function (e) { + for ( + var t = this.parseOffset16List(), + r = t.length, + n = this.relativeOffset, + a = new Array(r), + o = 0; + o < r; + o++ + ) { + var s = t[o]; + if (0 !== s) + if (((this.relativeOffset = s), e)) { + for ( + var i = this.parseOffset16List(), + u = new Array(i.length), + l = 0; + l < i.length; + l++ + ) + (this.relativeOffset = s + i[l]), (u[l] = e.call(this)); + a[o] = u; + } else a[o] = this.parseUShortList(); + else a[o] = void 0; + } + return (this.relativeOffset = n), a; + }), + (oe.prototype.parseCoverage = function () { + var e = this.offset + this.relativeOffset, + t = this.parseUShort(), + r = this.parseUShort(); + if (1 === t) return { format: 1, glyphs: this.parseUShortList(r) }; + if (2 !== t) + throw new Error( + "0x" + e.toString(16) + ": Coverage format must be 1 or 2." + ); + for (var n = new Array(r), a = 0; a < r; a++) + n[a] = { + start: this.parseUShort(), + end: this.parseUShort(), + index: this.parseUShort(), + }; + return { format: 2, ranges: n }; + }), + (oe.prototype.parseClassDef = function () { + var e = this.offset + this.relativeOffset, + t = this.parseUShort(); + if (1 === t) + return { + format: 1, + startGlyph: this.parseUShort(), + classes: this.parseUShortList(), + }; + if (2 === t) + return { + format: 2, + ranges: this.parseRecordList({ + start: oe.uShort, + end: oe.uShort, + classId: oe.uShort, + }), + }; + throw new Error( + "0x" + e.toString(16) + ": ClassDef format must be 1 or 2." + ); + }), + (oe.list = function (e, t) { + return function () { + return this.parseList(e, t); + }; + }), + (oe.list32 = function (e, t) { + return function () { + return this.parseList32(e, t); + }; + }), + (oe.recordList = function (e, t) { + return function () { + return this.parseRecordList(e, t); + }; + }), + (oe.recordList32 = function (e, t) { + return function () { + return this.parseRecordList32(e, t); + }; + }), + (oe.pointer = function (e) { + return function () { + return this.parsePointer(e); + }; + }), + (oe.pointer32 = function (e) { + return function () { + return this.parsePointer32(e); + }; + }), + (oe.tag = oe.prototype.parseTag), + (oe.byte = oe.prototype.parseByte), + (oe.uShort = oe.offset16 = oe.prototype.parseUShort), + (oe.uShortList = oe.prototype.parseUShortList), + (oe.uLong = oe.offset32 = oe.prototype.parseULong), + (oe.uLongList = oe.prototype.parseULongList), + (oe.struct = oe.prototype.parseStruct), + (oe.coverage = oe.prototype.parseCoverage), + (oe.classDef = oe.prototype.parseClassDef); + var se = { + reserved: oe.uShort, + reqFeatureIndex: oe.uShort, + featureIndexes: oe.uShortList, + }; + (oe.prototype.parseScriptList = function () { + return ( + this.parsePointer( + oe.recordList({ + tag: oe.tag, + script: oe.pointer({ + defaultLangSys: oe.pointer(se), + langSysRecords: oe.recordList({ + tag: oe.tag, + langSys: oe.pointer(se), + }), + }), + }) + ) || [] + ); + }), + (oe.prototype.parseFeatureList = function () { + return ( + this.parsePointer( + oe.recordList({ + tag: oe.tag, + feature: oe.pointer({ + featureParams: oe.offset16, + lookupListIndexes: oe.uShortList, + }), + }) + ) || [] + ); + }), + (oe.prototype.parseLookupList = function (n) { + return ( + this.parsePointer( + oe.list( + oe.pointer(function () { + var e = this.parseUShort(); + w.argument( + 1 <= e && e <= 9, + "GPOS/GSUB lookup type " + e + " unknown." + ); + var t = this.parseUShort(), + r = 16 & t; + return { + lookupType: e, + lookupFlag: t, + subtables: this.parseList(oe.pointer(n[e])), + markFilteringSet: r ? this.parseUShort() : void 0, + }; + }) + ) + ) || [] + ); + }), + (oe.prototype.parseFeatureVariationsList = function () { + return ( + this.parsePointer32(function () { + var e = this.parseUShort(), + t = this.parseUShort(); + return ( + w.argument( + 1 === e && t < 1, + "GPOS/GSUB feature variations table unknown." + ), + this.parseRecordList32({ + conditionSetOffset: oe.offset32, + featureTableSubstitutionOffset: oe.offset32, + }) + ); + }) || [] + ); + }); + var ie = { + getByte: ee, + getCard8: ee, + getUShort: te, + getCard16: te, + getShort: function (e, t) { + return e.getInt16(t, !1); + }, + getULong: re, + getFixed: ne, + getTag: function (e, t) { + for (var r = "", n = t; n < t + 4; n += 1) + r += String.fromCharCode(e.getInt8(n)); + return r; + }, + getOffset: function (e, t, r) { + for (var n = 0, a = 0; a < r; a += 1) + (n <<= 8), (n += e.getUint8(t + a)); + return n; + }, + getBytes: function (e, t, r) { + for (var n = [], a = t; a < r; a += 1) n.push(e.getUint8(a)); + return n; + }, + bytesToString: function (e) { + for (var t = "", r = 0; r < e.length; r += 1) + t += String.fromCharCode(e[r]); + return t; + }, + Parser: oe, + }; + var ue = { + parse: function (e, t) { + var r = {}; + (r.version = ie.getUShort(e, t)), + w.argument(0 === r.version, "cmap table version should be 0."), + (r.numTables = ie.getUShort(e, t + 2)); + for (var n = -1, a = r.numTables - 1; 0 <= a; --a) { + var o = ie.getUShort(e, t + 4 + 8 * a), + s = ie.getUShort(e, t + 4 + 8 * a + 2); + if ( + (3 === o && (0 === s || 1 === s || 10 === s)) || + (0 === o && (0 === s || 1 === s || 2 === s || 3 === s || 4 === s)) + ) { + n = ie.getULong(e, t + 4 + 8 * a + 4); + break; + } + } + if (-1 === n) throw new Error("No valid cmap sub-tables found."); + var i = new ie.Parser(e, t + n); + if (((r.format = i.parseUShort()), 12 === r.format)) + !(function (e, t) { + var r; + t.parseUShort(), + (e.length = t.parseULong()), + (e.language = t.parseULong()), + (e.groupCount = r = t.parseULong()), + (e.glyphIndexMap = {}); + for (var n = 0; n < r; n += 1) + for ( + var a = t.parseULong(), + o = t.parseULong(), + s = t.parseULong(), + i = a; + i <= o; + i += 1 + ) + (e.glyphIndexMap[i] = s), s++; + })(r, i); + else { + if (4 !== r.format) + throw new Error( + "Only format 4 and 12 cmap tables are supported (found format " + + r.format + + ")." + ); + !(function (e, t, r, n, a) { + var o; + (e.length = t.parseUShort()), + (e.language = t.parseUShort()), + (e.segCount = o = t.parseUShort() >> 1), + t.skip("uShort", 3), + (e.glyphIndexMap = {}); + for ( + var s = new ie.Parser(r, n + a + 14), + i = new ie.Parser(r, n + a + 16 + 2 * o), + u = new ie.Parser(r, n + a + 16 + 4 * o), + l = new ie.Parser(r, n + a + 16 + 6 * o), + p = n + a + 16 + 8 * o, + c = 0; + c < o - 1; + c += 1 + ) + for ( + var h = void 0, + f = s.parseUShort(), + d = i.parseUShort(), + g = u.parseShort(), + v = l.parseUShort(), + m = d; + m <= f; + m += 1 + ) + 0 !== v + ? ((p = l.offset + l.relativeOffset - 2), + (p += v), + (p += 2 * (m - d)), + 0 !== (h = ie.getUShort(r, p)) && (h = (h + g) & 65535)) + : (h = (m + g) & 65535), + (e.glyphIndexMap[m] = h); + })(r, i, e, t, n); + } + return r; + }, + make: function (e) { + var t, + r = !0; + for (t = e.length - 1; 0 < t; --t) { + if (65535 < e.get(t).unicode) { + console.log("Adding CMAP format 12 (needed!)"), (r = !1); + break; + } + } + var n = [ + { name: "version", type: "USHORT", value: 0 }, + { name: "numTables", type: "USHORT", value: r ? 1 : 2 }, + { name: "platformID", type: "USHORT", value: 3 }, + { name: "encodingID", type: "USHORT", value: 1 }, + { name: "offset", type: "ULONG", value: r ? 12 : 20 }, + ]; + r || + (n = n.concat([ + { name: "cmap12PlatformID", type: "USHORT", value: 3 }, + { name: "cmap12EncodingID", type: "USHORT", value: 10 }, + { name: "cmap12Offset", type: "ULONG", value: 0 }, + ])), + (n = n.concat([ + { name: "format", type: "USHORT", value: 4 }, + { name: "cmap4Length", type: "USHORT", value: 0 }, + { name: "language", type: "USHORT", value: 0 }, + { name: "segCountX2", type: "USHORT", value: 0 }, + { name: "searchRange", type: "USHORT", value: 0 }, + { name: "entrySelector", type: "USHORT", value: 0 }, + { name: "rangeShift", type: "USHORT", value: 0 }, + ])); + var a, + o, + s, + i = new $.Table("cmap", n); + for (i.segments = [], t = 0; t < e.length; t += 1) { + for (var u = e.get(t), l = 0; l < u.unicodes.length; l += 1) + (a = i), + (o = u.unicodes[l]), + (s = t), + a.segments.push({ + end: o, + start: o, + delta: -(o - s), + offset: 0, + glyphIndex: s, + }); + i.segments = i.segments.sort(function (e, t) { + return e.start - t.start; + }); + } + i.segments.push({ end: 65535, start: 65535, delta: 1, offset: 0 }); + var p = i.segments.length, + c = 0, + h = [], + f = [], + d = [], + g = [], + v = [], + m = []; + for (t = 0; t < p; t += 1) { + var y = i.segments[t]; + y.end <= 65535 && y.start <= 65535 + ? ((h = h.concat({ + name: "end_" + t, + type: "USHORT", + value: y.end, + })), + (f = f.concat({ + name: "start_" + t, + type: "USHORT", + value: y.start, + })), + (d = d.concat({ + name: "idDelta_" + t, + type: "SHORT", + value: y.delta, + })), + (g = g.concat({ + name: "idRangeOffset_" + t, + type: "USHORT", + value: y.offset, + })), + void 0 !== y.glyphId && + (v = v.concat({ + name: "glyph_" + t, + type: "USHORT", + value: y.glyphId, + }))) + : (c += 1), + r || + void 0 === y.glyphIndex || + (m = (m = (m = m.concat({ + name: "cmap12Start_" + t, + type: "ULONG", + value: y.start, + })).concat({ + name: "cmap12End_" + t, + type: "ULONG", + value: y.end, + })).concat({ + name: "cmap12Glyph_" + t, + type: "ULONG", + value: y.glyphIndex, + })); + } + if ( + ((i.segCountX2 = 2 * (p - c)), + (i.searchRange = + 2 * Math.pow(2, Math.floor(Math.log(p - c) / Math.log(2)))), + (i.entrySelector = Math.log(i.searchRange / 2) / Math.log(2)), + (i.rangeShift = i.segCountX2 - i.searchRange), + (i.fields = i.fields.concat(h)), + i.fields.push({ name: "reservedPad", type: "USHORT", value: 0 }), + (i.fields = i.fields.concat(f)), + (i.fields = i.fields.concat(d)), + (i.fields = i.fields.concat(g)), + (i.fields = i.fields.concat(v)), + (i.cmap4Length = + 14 + + 2 * h.length + + 2 + + 2 * f.length + + 2 * d.length + + 2 * g.length + + 2 * v.length), + !r) + ) { + var b = 16 + 4 * m.length; + (i.cmap12Offset = 20 + i.cmap4Length), + (i.fields = i.fields.concat([ + { name: "cmap12Format", type: "USHORT", value: 12 }, + { name: "cmap12Reserved", type: "USHORT", value: 0 }, + { name: "cmap12Length", type: "ULONG", value: b }, + { name: "cmap12Language", type: "ULONG", value: 0 }, + { name: "cmap12nGroups", type: "ULONG", value: m.length / 3 }, + ])), + (i.fields = i.fields.concat(m)); + } + return i; + }, + }, + le = [ + ".notdef", + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "endash", + "dagger", + "daggerdbl", + "periodcentered", + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + "questiondown", + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + "ring", + "cedilla", + "hungarumlaut", + "ogonek", + "caron", + "emdash", + "AE", + "ordfeminine", + "Lslash", + "Oslash", + "OE", + "ordmasculine", + "ae", + "dotlessi", + "lslash", + "oslash", + "oe", + "germandbls", + "onesuperior", + "logicalnot", + "mu", + "trademark", + "Eth", + "onehalf", + "plusminus", + "Thorn", + "onequarter", + "divide", + "brokenbar", + "degree", + "thorn", + "threequarters", + "twosuperior", + "registered", + "minus", + "eth", + "multiply", + "threesuperior", + "copyright", + "Aacute", + "Acircumflex", + "Adieresis", + "Agrave", + "Aring", + "Atilde", + "Ccedilla", + "Eacute", + "Ecircumflex", + "Edieresis", + "Egrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Ntilde", + "Oacute", + "Ocircumflex", + "Odieresis", + "Ograve", + "Otilde", + "Scaron", + "Uacute", + "Ucircumflex", + "Udieresis", + "Ugrave", + "Yacute", + "Ydieresis", + "Zcaron", + "aacute", + "acircumflex", + "adieresis", + "agrave", + "aring", + "atilde", + "ccedilla", + "eacute", + "ecircumflex", + "edieresis", + "egrave", + "iacute", + "icircumflex", + "idieresis", + "igrave", + "ntilde", + "oacute", + "ocircumflex", + "odieresis", + "ograve", + "otilde", + "scaron", + "uacute", + "ucircumflex", + "udieresis", + "ugrave", + "yacute", + "ydieresis", + "zcaron", + "exclamsmall", + "Hungarumlautsmall", + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "266 ff", + "onedotenleader", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + "isuperior", + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + "rsuperior", + "ssuperior", + "tsuperior", + "ff", + "ffi", + "ffl", + "parenleftinferior", + "parenrightinferior", + "Circumflexsmall", + "hyphensuperior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + "Dotaccentsmall", + "Macronsmall", + "figuredash", + "hypheninferior", + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + "zerosuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", + "Agravesmall", + "Aacutesmall", + "Acircumflexsmall", + "Atildesmall", + "Adieresissmall", + "Aringsmall", + "AEsmall", + "Ccedillasmall", + "Egravesmall", + "Eacutesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Igravesmall", + "Iacutesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ethsmall", + "Ntildesmall", + "Ogravesmall", + "Oacutesmall", + "Ocircumflexsmall", + "Otildesmall", + "Odieresissmall", + "OEsmall", + "Oslashsmall", + "Ugravesmall", + "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", + "Yacutesmall", + "Thornsmall", + "Ydieresissmall", + "001.000", + "001.001", + "001.002", + "001.003", + "Black", + "Bold", + "Book", + "Light", + "Medium", + "Regular", + "Roman", + "Semibold", + ], + pe = [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "", + "endash", + "dagger", + "daggerdbl", + "periodcentered", + "", + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + "", + "questiondown", + "", + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + "", + "ring", + "cedilla", + "", + "hungarumlaut", + "ogonek", + "caron", + "emdash", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "AE", + "", + "ordfeminine", + "", + "", + "", + "", + "Lslash", + "Oslash", + "OE", + "ordmasculine", + "", + "", + "", + "", + "", + "ae", + "", + "", + "", + "dotlessi", + "", + "", + "lslash", + "oslash", + "oe", + "germandbls", + ], + ce = [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "space", + "exclamsmall", + "Hungarumlautsmall", + "", + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "comma", + "hyphen", + "period", + "fraction", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "colon", + "semicolon", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + "", + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + "", + "", + "isuperior", + "", + "", + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + "", + "", + "rsuperior", + "ssuperior", + "tsuperior", + "", + "ff", + "fi", + "fl", + "ffi", + "ffl", + "parenleftinferior", + "", + "parenrightinferior", + "Circumflexsmall", + "hyphensuperior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + "", + "", + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + "", + "Dotaccentsmall", + "", + "", + "Macronsmall", + "", + "", + "figuredash", + "hypheninferior", + "", + "", + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + "", + "", + "", + "onequarter", + "onehalf", + "threequarters", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + "", + "", + "zerosuperior", + "onesuperior", + "twosuperior", + "threesuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", + "Agravesmall", + "Aacutesmall", + "Acircumflexsmall", + "Atildesmall", + "Adieresissmall", + "Aringsmall", + "AEsmall", + "Ccedillasmall", + "Egravesmall", + "Eacutesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Igravesmall", + "Iacutesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ethsmall", + "Ntildesmall", + "Ogravesmall", + "Oacutesmall", + "Ocircumflexsmall", + "Otildesmall", + "Odieresissmall", + "OEsmall", + "Oslashsmall", + "Ugravesmall", + "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", + "Yacutesmall", + "Thornsmall", + "Ydieresissmall", + ], + he = [ + ".notdef", + ".null", + "nonmarkingreturn", + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quotesingle", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "grave", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + "Adieresis", + "Aring", + "Ccedilla", + "Eacute", + "Ntilde", + "Odieresis", + "Udieresis", + "aacute", + "agrave", + "acircumflex", + "adieresis", + "atilde", + "aring", + "ccedilla", + "eacute", + "egrave", + "ecircumflex", + "edieresis", + "iacute", + "igrave", + "icircumflex", + "idieresis", + "ntilde", + "oacute", + "ograve", + "ocircumflex", + "odieresis", + "otilde", + "uacute", + "ugrave", + "ucircumflex", + "udieresis", + "dagger", + "degree", + "cent", + "sterling", + "section", + "bullet", + "paragraph", + "germandbls", + "registered", + "copyright", + "trademark", + "acute", + "dieresis", + "notequal", + "AE", + "Oslash", + "infinity", + "plusminus", + "lessequal", + "greaterequal", + "yen", + "mu", + "partialdiff", + "summation", + "product", + "pi", + "integral", + "ordfeminine", + "ordmasculine", + "Omega", + "ae", + "oslash", + "questiondown", + "exclamdown", + "logicalnot", + "radical", + "florin", + "approxequal", + "Delta", + "guillemotleft", + "guillemotright", + "ellipsis", + "nonbreakingspace", + "Agrave", + "Atilde", + "Otilde", + "OE", + "oe", + "endash", + "emdash", + "quotedblleft", + "quotedblright", + "quoteleft", + "quoteright", + "divide", + "lozenge", + "ydieresis", + "Ydieresis", + "fraction", + "currency", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "daggerdbl", + "periodcentered", + "quotesinglbase", + "quotedblbase", + "perthousand", + "Acircumflex", + "Ecircumflex", + "Aacute", + "Edieresis", + "Egrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Oacute", + "Ocircumflex", + "apple", + "Ograve", + "Uacute", + "Ucircumflex", + "Ugrave", + "dotlessi", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "ring", + "cedilla", + "hungarumlaut", + "ogonek", + "caron", + "Lslash", + "lslash", + "Scaron", + "scaron", + "Zcaron", + "zcaron", + "brokenbar", + "Eth", + "eth", + "Yacute", + "yacute", + "Thorn", + "thorn", + "minus", + "multiply", + "onesuperior", + "twosuperior", + "threesuperior", + "onehalf", + "onequarter", + "threequarters", + "franc", + "Gbreve", + "gbreve", + "Idotaccent", + "Scedilla", + "scedilla", + "Cacute", + "cacute", + "Ccaron", + "ccaron", + "dcroat", + ]; + function fe(e) { + this.font = e; + } + function de(e) { + this.cmap = e; + } + function ge(e, t) { + (this.encoding = e), (this.charset = t); + } + function ve(e) { + switch (e.version) { + case 1: + this.names = he.slice(); + break; + case 2: + this.names = new Array(e.numberOfGlyphs); + for (var t = 0; t < e.numberOfGlyphs; t++) + e.glyphNameIndex[t] < he.length + ? (this.names[t] = he[e.glyphNameIndex[t]]) + : (this.names[t] = e.names[e.glyphNameIndex[t] - he.length]); + break; + case 2.5: + this.names = new Array(e.numberOfGlyphs); + for (var r = 0; r < e.numberOfGlyphs; r++) + this.names[r] = he[r + e.glyphNameIndex[r]]; + break; + case 3: + default: + this.names = []; + } + } + function me(e, t) { + (t.lowMemory + ? function (e) { + e._IndexToUnicodeMap = {}; + for ( + var t = e.tables.cmap.glyphIndexMap, r = Object.keys(t), n = 0; + n < r.length; + n += 1 + ) { + var a = r[n], + o = t[a]; + void 0 === e._IndexToUnicodeMap[o] + ? (e._IndexToUnicodeMap[o] = { unicodes: [parseInt(a)] }) + : e._IndexToUnicodeMap[o].unicodes.push(parseInt(a)); + } + } + : function (e) { + for ( + var t, r = e.tables.cmap.glyphIndexMap, n = Object.keys(r), a = 0; + a < n.length; + a += 1 + ) { + var o = n[a], + s = r[o]; + (t = e.glyphs.get(s)).addUnicode(parseInt(o)); + } + for (var i = 0; i < e.glyphs.length; i += 1) + (t = e.glyphs.get(i)), + e.cffEncoding + ? e.isCIDFont + ? (t.name = "gid" + i) + : (t.name = e.cffEncoding.charset[i]) + : e.glyphNames.names && + (t.name = e.glyphNames.glyphIndexToName(i)); + })(e); + } + (fe.prototype.charToGlyphIndex = function (e) { + var t = e.codePointAt(0), + r = this.font.glyphs; + if (r) + for (var n = 0; n < r.length; n += 1) + for (var a = r.get(n), o = 0; o < a.unicodes.length; o += 1) + if (a.unicodes[o] === t) return n; + return null; + }), + (de.prototype.charToGlyphIndex = function (e) { + return this.cmap.glyphIndexMap[e.codePointAt(0)] || 0; + }), + (ge.prototype.charToGlyphIndex = function (e) { + var t = e.codePointAt(0), + r = this.encoding[t]; + return this.charset.indexOf(r); + }), + (ve.prototype.nameToGlyphIndex = function (e) { + return this.names.indexOf(e); + }), + (ve.prototype.glyphIndexToName = function (e) { + return this.names[e]; + }); + var ye = { + line: function (e, t, r, n, a) { + e.beginPath(), e.moveTo(t, r), e.lineTo(n, a), e.stroke(); + }, + }; + function be(e) { + this.bindConstructorValues(e); + } + function Se(t, e, r) { + Object.defineProperty(t, e, { + get: function () { + return t.path, t[r]; + }, + set: function (e) { + t[r] = e; + }, + enumerable: !0, + configurable: !0, + }); + } + function xe(e, t) { + if (((this.font = e), (this.glyphs = {}), Array.isArray(t))) + for (var r = 0; r < t.length; r++) { + var n = t[r]; + (n.path.unitsPerEm = e.unitsPerEm), (this.glyphs[r] = n); + } + this.length = (t && t.length) || 0; + } + (be.prototype.bindConstructorValues = function (e) { + var t, r; + (this.index = e.index || 0), + (this.name = e.name || null), + (this.unicode = e.unicode || void 0), + (this.unicodes = e.unicodes || void 0 !== e.unicode ? [e.unicode] : []), + "xMin" in e && (this.xMin = e.xMin), + "yMin" in e && (this.yMin = e.yMin), + "xMax" in e && (this.xMax = e.xMax), + "yMax" in e && (this.yMax = e.yMax), + "advanceWidth" in e && (this.advanceWidth = e.advanceWidth), + Object.defineProperty( + this, + "path", + ((t = e.path), + (r = t || new B()), + { + configurable: !0, + get: function () { + return "function" == typeof r && (r = r()), r; + }, + set: function (e) { + r = e; + }, + }) + ); + }), + (be.prototype.addUnicode = function (e) { + 0 === this.unicodes.length && (this.unicode = e), this.unicodes.push(e); + }), + (be.prototype.getBoundingBox = function () { + return this.path.getBoundingBox(); + }), + (be.prototype.getPath = function (e, t, r, n, a) { + var o, s; + (e = void 0 !== e ? e : 0), + (t = void 0 !== t ? t : 0), + (r = void 0 !== r ? r : 72); + var i = (n = n || {}).xScale, + u = n.yScale; + if ( + (n.hinting && + a && + a.hinting && + (s = this.path && a.hinting.exec(this, r)), + s) + ) + (o = a.hinting.getCommands(s)), + (e = Math.round(e)), + (t = Math.round(t)), + (i = u = 1); + else { + o = this.path.commands; + var l = (1 / (this.path.unitsPerEm || 1e3)) * r; + void 0 === i && (i = l), void 0 === u && (u = l); + } + for (var p = new B(), c = 0; c < o.length; c += 1) { + var h = o[c]; + "M" === h.type + ? p.moveTo(e + h.x * i, t + -h.y * u) + : "L" === h.type + ? p.lineTo(e + h.x * i, t + -h.y * u) + : "Q" === h.type + ? p.quadraticCurveTo( + e + h.x1 * i, + t + -h.y1 * u, + e + h.x * i, + t + -h.y * u + ) + : "C" === h.type + ? p.curveTo( + e + h.x1 * i, + t + -h.y1 * u, + e + h.x2 * i, + t + -h.y2 * u, + e + h.x * i, + t + -h.y * u + ) + : "Z" === h.type && p.closePath(); + } + return p; + }), + (be.prototype.getContours = function () { + if (void 0 === this.points) return []; + for (var e = [], t = [], r = 0; r < this.points.length; r += 1) { + var n = this.points[r]; + t.push(n), n.lastPointOfContour && (e.push(t), (t = [])); + } + return ( + w.argument( + 0 === t.length, + "There are still points left in the current contour." + ), + e + ); + }), + (be.prototype.getMetrics = function () { + for ( + var e = this.path.commands, t = [], r = [], n = 0; + n < e.length; + n += 1 + ) { + var a = e[n]; + "Z" !== a.type && (t.push(a.x), r.push(a.y)), + ("Q" !== a.type && "C" !== a.type) || (t.push(a.x1), r.push(a.y1)), + "C" === a.type && (t.push(a.x2), r.push(a.y2)); + } + var o = { + xMin: Math.min.apply(null, t), + yMin: Math.min.apply(null, r), + xMax: Math.max.apply(null, t), + yMax: Math.max.apply(null, r), + leftSideBearing: this.leftSideBearing, + }; + return ( + isFinite(o.xMin) || (o.xMin = 0), + isFinite(o.xMax) || (o.xMax = this.advanceWidth), + isFinite(o.yMin) || (o.yMin = 0), + isFinite(o.yMax) || (o.yMax = 0), + (o.rightSideBearing = + this.advanceWidth - o.leftSideBearing - (o.xMax - o.xMin)), + o + ); + }), + (be.prototype.draw = function (e, t, r, n, a) { + this.getPath(t, r, n, a).draw(e); + }), + (be.prototype.drawPoints = function (o, e, t, r) { + function n(e, t, r, n) { + o.beginPath(); + for (var a = 0; a < e.length; a += 1) + o.moveTo(t + e[a].x * n, r + e[a].y * n), + o.arc(t + e[a].x * n, r + e[a].y * n, 2, 0, 2 * Math.PI, !1); + o.closePath(), o.fill(); + } + (e = void 0 !== e ? e : 0), + (t = void 0 !== t ? t : 0), + (r = void 0 !== r ? r : 24); + for ( + var a = (1 / this.path.unitsPerEm) * r, + s = [], + i = [], + u = this.path, + l = 0; + l < u.commands.length; + l += 1 + ) { + var p = u.commands[l]; + void 0 !== p.x && s.push({ x: p.x, y: -p.y }), + void 0 !== p.x1 && i.push({ x: p.x1, y: -p.y1 }), + void 0 !== p.x2 && i.push({ x: p.x2, y: -p.y2 }); + } + (o.fillStyle = "blue"), + n(s, e, t, a), + (o.fillStyle = "red"), + n(i, e, t, a); + }), + (be.prototype.drawMetrics = function (e, t, r, n) { + var a; + (t = void 0 !== t ? t : 0), + (r = void 0 !== r ? r : 0), + (n = void 0 !== n ? n : 24), + (a = (1 / this.path.unitsPerEm) * n), + (e.lineWidth = 1), + (e.strokeStyle = "black"), + ye.line(e, t, -1e4, t, 1e4), + ye.line(e, -1e4, r, 1e4, r); + var o = this.xMin || 0, + s = this.yMin || 0, + i = this.xMax || 0, + u = this.yMax || 0, + l = this.advanceWidth || 0; + (e.strokeStyle = "blue"), + ye.line(e, t + o * a, -1e4, t + o * a, 1e4), + ye.line(e, t + i * a, -1e4, t + i * a, 1e4), + ye.line(e, -1e4, r + -s * a, 1e4, r + -s * a), + ye.line(e, -1e4, r + -u * a, 1e4, r + -u * a), + (e.strokeStyle = "green"), + ye.line(e, t + l * a, -1e4, t + l * a, 1e4); + }), + (xe.prototype.get = function (e) { + if (void 0 === this.glyphs[e]) { + this.font._push(e), + "function" == typeof this.glyphs[e] && + (this.glyphs[e] = this.glyphs[e]()); + var t = this.glyphs[e], + r = this.font._IndexToUnicodeMap[e]; + if (r) + for (var n = 0; n < r.unicodes.length; n++) + t.addUnicode(r.unicodes[n]); + this.font.cffEncoding + ? this.font.isCIDFont + ? (t.name = "gid" + e) + : (t.name = this.font.cffEncoding.charset[e]) + : this.font.glyphNames.names && + (t.name = this.font.glyphNames.glyphIndexToName(e)), + (this.glyphs[e].advanceWidth = + this.font._hmtxTableData[e].advanceWidth), + (this.glyphs[e].leftSideBearing = + this.font._hmtxTableData[e].leftSideBearing); + } else + "function" == typeof this.glyphs[e] && + (this.glyphs[e] = this.glyphs[e]()); + return this.glyphs[e]; + }), + (xe.prototype.push = function (e, t) { + (this.glyphs[e] = t), this.length++; + }); + var Te = { + GlyphSet: xe, + glyphLoader: function (e, t) { + return new be({ index: t, font: e }); + }, + ttfGlyphLoader: function (r, e, n, a, o, s) { + return function () { + var t = new be({ index: e, font: r }); + return ( + (t.path = function () { + n(t, a, o); + var e = s(r.glyphs, t); + return (e.unitsPerEm = r.unitsPerEm), e; + }), + Se(t, "xMin", "_xMin"), + Se(t, "xMax", "_xMax"), + Se(t, "yMin", "_yMin"), + Se(t, "yMax", "_yMax"), + t + ); + }; + }, + cffGlyphLoader: function (r, e, n, a) { + return function () { + var t = new be({ index: e, font: r }); + return ( + (t.path = function () { + var e = n(r, t, a); + return (e.unitsPerEm = r.unitsPerEm), e; + }), + t + ); + }; + }, + }; + function ke(e, t) { + if (e === t) return 1; + if (Array.isArray(e) && Array.isArray(t)) { + if (e.length !== t.length) return; + for (var r = 0; r < e.length; r += 1) if (!ke(e[r], t[r])) return; + return 1; + } + } + function Ue(e) { + return e.length < 1240 ? 107 : e.length < 33900 ? 1131 : 32768; + } + function Oe(e, t, r) { + var n, + a, + o = [], + s = [], + i = ie.getCard16(e, t); + if (0 !== i) { + var u = ie.getByte(e, t + 2); + n = t + (i + 1) * u + 2; + for (var l = t + 3, p = 0; p < i + 1; p += 1) + o.push(ie.getOffset(e, l, u)), (l += u); + a = n + o[i]; + } else a = t + 2; + for (var c = 0; c < o.length - 1; c += 1) { + var h = ie.getBytes(e, n + o[c], n + o[c + 1]); + r && (h = r(h)), s.push(h); + } + return { objects: s, startOffset: t, endOffset: a }; + } + function Ee(e, t) { + if (28 === t) return (e.parseByte() << 8) | e.parseByte(); + if (29 === t) + return ( + (e.parseByte() << 24) | + (e.parseByte() << 16) | + (e.parseByte() << 8) | + e.parseByte() + ); + if (30 === t) + return (function (e) { + for ( + var t = "", + r = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + ".", + "E", + "E-", + null, + "-", + ]; + ; + + ) { + var n = e.parseByte(), + a = n >> 4, + o = 15 & n; + if (15 == a) break; + if (((t += r[a]), 15 == o)) break; + t += r[o]; + } + return parseFloat(t); + })(e); + if (32 <= t && t <= 246) return t - 139; + if (247 <= t && t <= 250) return 256 * (t - 247) + e.parseByte() + 108; + if (251 <= t && t <= 254) return 256 * -(t - 251) - e.parseByte() - 108; + throw new Error("Invalid b0 " + t); + } + function Re(e, t, r) { + t = void 0 !== t ? t : 0; + var n = new ie.Parser(e, t), + a = [], + o = []; + for (r = void 0 !== r ? r : e.length; n.relativeOffset < r; ) { + var s = n.parseByte(); + s <= 21 + ? (12 === s && (s = 1200 + n.parseByte()), a.push([s, o]), (o = [])) + : o.push(Ee(n, s)); + } + return (function (e) { + for (var t = {}, r = 0; r < e.length; r += 1) { + var n = e[r][0], + a = e[r][1], + o = void 0; + if ( + ((o = 1 === a.length ? a[0] : a), + t.hasOwnProperty(n) && !isNaN(t[n])) + ) + throw new Error("Object " + t + " already has key " + n); + t[n] = o; + } + return t; + })(a); + } + function Le(e, t) { + return (t = t <= 390 ? le[t] : e[t - 391]); + } + function Ce(e, t, r) { + for (var n, a = {}, o = 0; o < t.length; o += 1) { + var s = t[o]; + if (Array.isArray(s.type)) { + var i = []; + i.length = s.type.length; + for (var u = 0; u < s.type.length; u++) + void 0 === (n = void 0 !== e[s.op] ? e[s.op][u] : void 0) && + (n = + void 0 !== s.value && void 0 !== s.value[u] + ? s.value[u] + : null), + "SID" === s.type[u] && (n = Le(r, n)), + (i[u] = n); + a[s.name] = i; + } else + void 0 === (n = e[s.op]) && (n = void 0 !== s.value ? s.value : null), + "SID" === s.type && (n = Le(r, n)), + (a[s.name] = n); + } + return a; + } + var we = [ + { name: "version", op: 0, type: "SID" }, + { name: "notice", op: 1, type: "SID" }, + { name: "copyright", op: 1200, type: "SID" }, + { name: "fullName", op: 2, type: "SID" }, + { name: "familyName", op: 3, type: "SID" }, + { name: "weight", op: 4, type: "SID" }, + { name: "isFixedPitch", op: 1201, type: "number", value: 0 }, + { name: "italicAngle", op: 1202, type: "number", value: 0 }, + { name: "underlinePosition", op: 1203, type: "number", value: -100 }, + { name: "underlineThickness", op: 1204, type: "number", value: 50 }, + { name: "paintType", op: 1205, type: "number", value: 0 }, + { name: "charstringType", op: 1206, type: "number", value: 2 }, + { + name: "fontMatrix", + op: 1207, + type: ["real", "real", "real", "real", "real", "real"], + value: [0.001, 0, 0, 0.001, 0, 0], + }, + { name: "uniqueId", op: 13, type: "number" }, + { + name: "fontBBox", + op: 5, + type: ["number", "number", "number", "number"], + value: [0, 0, 0, 0], + }, + { name: "strokeWidth", op: 1208, type: "number", value: 0 }, + { name: "xuid", op: 14, type: [], value: null }, + { name: "charset", op: 15, type: "offset", value: 0 }, + { name: "encoding", op: 16, type: "offset", value: 0 }, + { name: "charStrings", op: 17, type: "offset", value: 0 }, + { name: "private", op: 18, type: ["number", "offset"], value: [0, 0] }, + { name: "ros", op: 1230, type: ["SID", "SID", "number"] }, + { name: "cidFontVersion", op: 1231, type: "number", value: 0 }, + { name: "cidFontRevision", op: 1232, type: "number", value: 0 }, + { name: "cidFontType", op: 1233, type: "number", value: 0 }, + { name: "cidCount", op: 1234, type: "number", value: 8720 }, + { name: "uidBase", op: 1235, type: "number" }, + { name: "fdArray", op: 1236, type: "offset" }, + { name: "fdSelect", op: 1237, type: "offset" }, + { name: "fontName", op: 1238, type: "SID" }, + ], + De = [ + { name: "subrs", op: 19, type: "offset", value: 0 }, + { name: "defaultWidthX", op: 20, type: "number", value: 0 }, + { name: "nominalWidthX", op: 21, type: "number", value: 0 }, + ]; + function Ie(e, t, r, n) { + return Ce(Re(e, t, r), De, n); + } + function Me(e, t, r, n) { + for (var a, o, s = [], i = 0; i < r.length; i += 1) { + var u = new DataView(new Uint8Array(r[i]).buffer), + l = ((o = n), Ce(Re((a = u), 0, a.byteLength), we, o)); + (l._subrs = []), + (l._subrsBias = 0), + (l._defaultWidthX = 0), + (l._nominalWidthX = 0); + var p = l.private[0], + c = l.private[1]; + if (0 !== p && 0 !== c) { + var h = Ie(e, c + t, p, n); + if ( + ((l._defaultWidthX = h.defaultWidthX), + (l._nominalWidthX = h.nominalWidthX), + 0 !== h.subrs) + ) { + var f = Oe(e, c + h.subrs + t); + (l._subrs = f.objects), (l._subrsBias = Ue(l._subrs)); + } + l._privateDict = h; + } + s.push(l); + } + return s; + } + function Ge(v, m, e) { + var y, + b, + S, + x, + T, + k, + t, + U, + O = new B(), + E = [], + R = 0, + L = !1, + C = !1, + w = 0, + D = 0; + if (v.isCIDFont) { + var r = v.tables.cff.topDict._fdSelect[m.index], + n = v.tables.cff.topDict._fdArray[r]; + (T = n._subrs), + (k = n._subrsBias), + (t = n._defaultWidthX), + (U = n._nominalWidthX); + } else (T = v.tables.cff.topDict._subrs), (k = v.tables.cff.topDict._subrsBias), (t = v.tables.cff.topDict._defaultWidthX), (U = v.tables.cff.topDict._nominalWidthX); + var I = t; + function M(e, t) { + C && O.closePath(), O.moveTo(e, t), (C = !0); + } + function G() { + E.length % 2 == 0 || L || (I = E.shift() + U), + (R += E.length >> 1), + (E.length = 0), + (L = !0); + } + return ( + (function e(t) { + for (var r, n, a, o, s, i, u, l, p, c, h, f, d = 0; d < t.length; ) { + var g = t[d]; + switch (((d += 1), g)) { + case 1: + case 3: + G(); + break; + case 4: + 1 < E.length && !L && ((I = E.shift() + U), (L = !0)), + (D += E.pop()), + M(w, D); + break; + case 5: + for (; 0 < E.length; ) + (w += E.shift()), (D += E.shift()), O.lineTo(w, D); + break; + case 6: + for ( + ; + 0 < E.length && + ((w += E.shift()), O.lineTo(w, D), 0 !== E.length); + + ) + (D += E.shift()), O.lineTo(w, D); + break; + case 7: + for ( + ; + 0 < E.length && + ((D += E.shift()), O.lineTo(w, D), 0 !== E.length); + + ) + (w += E.shift()), O.lineTo(w, D); + break; + case 8: + for (; 0 < E.length; ) + (y = w + E.shift()), + (b = D + E.shift()), + (S = y + E.shift()), + (x = b + E.shift()), + (w = S + E.shift()), + (D = x + E.shift()), + O.curveTo(y, b, S, x, w, D); + break; + case 10: + (s = E.pop() + k), (i = T[s]) && e(i); + break; + case 11: + return; + case 12: + switch (((g = t[d]), (d += 1), g)) { + case 35: + (y = w + E.shift()), + (b = D + E.shift()), + (S = y + E.shift()), + (x = b + E.shift()), + (u = S + E.shift()), + (l = x + E.shift()), + (p = u + E.shift()), + (c = l + E.shift()), + (h = p + E.shift()), + (f = c + E.shift()), + (w = h + E.shift()), + (D = f + E.shift()), + E.shift(), + O.curveTo(y, b, S, x, u, l), + O.curveTo(p, c, h, f, w, D); + break; + case 34: + (y = w + E.shift()), + (b = D), + (S = y + E.shift()), + (x = b + E.shift()), + (u = S + E.shift()), + (l = x), + (p = u + E.shift()), + (c = x), + (h = p + E.shift()), + (f = D), + (w = h + E.shift()), + O.curveTo(y, b, S, x, u, l), + O.curveTo(p, c, h, f, w, D); + break; + case 36: + (y = w + E.shift()), + (b = D + E.shift()), + (S = y + E.shift()), + (x = b + E.shift()), + (u = S + E.shift()), + (l = x), + (p = u + E.shift()), + (c = x), + (h = p + E.shift()), + (f = c + E.shift()), + (w = h + E.shift()), + O.curveTo(y, b, S, x, u, l), + O.curveTo(p, c, h, f, w, D); + break; + case 37: + (y = w + E.shift()), + (b = D + E.shift()), + (S = y + E.shift()), + (x = b + E.shift()), + (u = S + E.shift()), + (l = x + E.shift()), + (p = u + E.shift()), + (c = l + E.shift()), + (h = p + E.shift()), + (f = c + E.shift()), + Math.abs(h - w) > Math.abs(f - D) + ? (w = h + E.shift()) + : (D = f + E.shift()), + O.curveTo(y, b, S, x, u, l), + O.curveTo(p, c, h, f, w, D); + break; + default: + console.log( + "Glyph " + m.index + ": unknown operator 1200" + g + ), + (E.length = 0); + } + break; + case 14: + 0 < E.length && !L && ((I = E.shift() + U), (L = !0)), + C && (O.closePath(), (C = !1)); + break; + case 18: + G(); + break; + case 19: + case 20: + G(), (d += (R + 7) >> 3); + break; + case 21: + 2 < E.length && !L && ((I = E.shift() + U), (L = !0)), + (D += E.pop()), + M((w += E.pop()), D); + break; + case 22: + 1 < E.length && !L && ((I = E.shift() + U), (L = !0)), + M((w += E.pop()), D); + break; + case 23: + G(); + break; + case 24: + for (; 2 < E.length; ) + (y = w + E.shift()), + (b = D + E.shift()), + (S = y + E.shift()), + (x = b + E.shift()), + (w = S + E.shift()), + (D = x + E.shift()), + O.curveTo(y, b, S, x, w, D); + (w += E.shift()), (D += E.shift()), O.lineTo(w, D); + break; + case 25: + for (; 6 < E.length; ) + (w += E.shift()), (D += E.shift()), O.lineTo(w, D); + (y = w + E.shift()), + (b = D + E.shift()), + (S = y + E.shift()), + (x = b + E.shift()), + (w = S + E.shift()), + (D = x + E.shift()), + O.curveTo(y, b, S, x, w, D); + break; + case 26: + for (E.length % 2 && (w += E.shift()); 0 < E.length; ) + (y = w), + (b = D + E.shift()), + (S = y + E.shift()), + (x = b + E.shift()), + (w = S), + (D = x + E.shift()), + O.curveTo(y, b, S, x, w, D); + break; + case 27: + for (E.length % 2 && (D += E.shift()); 0 < E.length; ) + (y = w + E.shift()), + (b = D), + (S = y + E.shift()), + (x = b + E.shift()), + (w = S + E.shift()), + (D = x), + O.curveTo(y, b, S, x, w, D); + break; + case 28: + (r = t[d]), + (n = t[d + 1]), + E.push(((r << 24) | (n << 16)) >> 16), + (d += 2); + break; + case 29: + (s = E.pop() + v.gsubrsBias), (i = v.gsubrs[s]) && e(i); + break; + case 30: + for ( + ; + 0 < E.length && + ((y = w), + (b = D + E.shift()), + (S = y + E.shift()), + (x = b + E.shift()), + (w = S + E.shift()), + (D = x + (1 === E.length ? E.shift() : 0)), + O.curveTo(y, b, S, x, w, D), + 0 !== E.length); + + ) + (y = w + E.shift()), + (b = D), + (S = y + E.shift()), + (x = b + E.shift()), + (D = x + E.shift()), + (w = S + (1 === E.length ? E.shift() : 0)), + O.curveTo(y, b, S, x, w, D); + break; + case 31: + for ( + ; + 0 < E.length && + ((y = w + E.shift()), + (b = D), + (S = y + E.shift()), + (x = b + E.shift()), + (D = x + E.shift()), + (w = S + (1 === E.length ? E.shift() : 0)), + O.curveTo(y, b, S, x, w, D), + 0 !== E.length); + + ) + (y = w), + (b = D + E.shift()), + (S = y + E.shift()), + (x = b + E.shift()), + (w = S + E.shift()), + (D = x + (1 === E.length ? E.shift() : 0)), + O.curveTo(y, b, S, x, w, D); + break; + default: + g < 32 + ? console.log("Glyph " + m.index + ": unknown operator " + g) + : g < 247 + ? E.push(g - 139) + : g < 251 + ? ((r = t[d]), (d += 1), E.push(256 * (g - 247) + r + 108)) + : g < 255 + ? ((r = t[d]), (d += 1), E.push(256 * -(g - 251) - r - 108)) + : ((r = t[d]), + (n = t[d + 1]), + (a = t[d + 2]), + (o = t[d + 3]), + (d += 4), + E.push(((r << 24) | (n << 16) | (a << 8) | o) / 65536)); + } + } + })(e), + (m.advanceWidth = I), + O + ); + } + function Be(e, t) { + var r, + n = le.indexOf(e); + return ( + 0 <= n && (r = n), + 0 <= (n = t.indexOf(e)) + ? (r = n + le.length) + : ((r = le.length + t.length), t.push(e)), + r + ); + } + function Fe(e, t, r) { + for (var n = {}, a = 0; a < e.length; a += 1) { + var o = e[a], + s = t[o.name]; + void 0 === s || + ke(s, o.value) || + ("SID" === o.type && (s = Be(s, r)), + (n[o.op] = { name: o.name, type: o.type, value: s })); + } + return n; + } + function Ae(e, t) { + var r = new $.Record("Top DICT", [ + { name: "dict", type: "DICT", value: {} }, + ]); + return (r.dict = Fe(we, e, t)), r; + } + function Pe(e) { + var t = new $.Record("Top DICT INDEX", [ + { name: "topDicts", type: "INDEX", value: [] }, + ]); + return (t.topDicts = [{ name: "topDict_0", type: "TABLE", value: e }]), t; + } + function Ne(e) { + var t = [], + r = e.path; + t.push({ name: "width", type: "NUMBER", value: e.advanceWidth }); + for (var n = 0, a = 0, o = 0; o < r.commands.length; o += 1) { + var s = void 0, + i = void 0, + u = r.commands[o]; + if ("Q" === u.type) { + u = { + type: "C", + x: u.x, + y: u.y, + x1: Math.round((1 / 3) * n + (2 / 3) * u.x1), + y1: Math.round((1 / 3) * a + (2 / 3) * u.y1), + x2: Math.round((1 / 3) * u.x + (2 / 3) * u.x1), + y2: Math.round((1 / 3) * u.y + (2 / 3) * u.y1), + }; + } + if ("M" === u.type) + (s = Math.round(u.x - n)), + (i = Math.round(u.y - a)), + t.push({ name: "dx", type: "NUMBER", value: s }), + t.push({ name: "dy", type: "NUMBER", value: i }), + t.push({ name: "rmoveto", type: "OP", value: 21 }), + (n = Math.round(u.x)), + (a = Math.round(u.y)); + else if ("L" === u.type) + (s = Math.round(u.x - n)), + (i = Math.round(u.y - a)), + t.push({ name: "dx", type: "NUMBER", value: s }), + t.push({ name: "dy", type: "NUMBER", value: i }), + t.push({ name: "rlineto", type: "OP", value: 5 }), + (n = Math.round(u.x)), + (a = Math.round(u.y)); + else if ("C" === u.type) { + var l = Math.round(u.x1 - n), + p = Math.round(u.y1 - a), + c = Math.round(u.x2 - u.x1), + h = Math.round(u.y2 - u.y1); + (s = Math.round(u.x - u.x2)), + (i = Math.round(u.y - u.y2)), + t.push({ name: "dx1", type: "NUMBER", value: l }), + t.push({ name: "dy1", type: "NUMBER", value: p }), + t.push({ name: "dx2", type: "NUMBER", value: c }), + t.push({ name: "dy2", type: "NUMBER", value: h }), + t.push({ name: "dx", type: "NUMBER", value: s }), + t.push({ name: "dy", type: "NUMBER", value: i }), + t.push({ name: "rrcurveto", type: "OP", value: 8 }), + (n = Math.round(u.x)), + (a = Math.round(u.y)); + } + } + return t.push({ name: "endchar", type: "OP", value: 14 }), t; + } + var He = { + parse: function (r, n, a, e) { + a.tables.cff = {}; + var t, + o, + s, + i = + ((t = r), + (o = n), + ((s = {}).formatMajor = ie.getCard8(t, o)), + (s.formatMinor = ie.getCard8(t, o + 1)), + (s.size = ie.getCard8(t, o + 2)), + (s.offsetSize = ie.getCard8(t, o + 3)), + (s.startOffset = o), + (s.endOffset = o + 4), + s), + u = Oe(r, i.endOffset, ie.bytesToString), + l = Oe(r, u.endOffset), + p = Oe(r, l.endOffset, ie.bytesToString), + c = Oe(r, p.endOffset); + (a.gsubrs = c.objects), (a.gsubrsBias = Ue(a.gsubrs)); + var h = Me(r, n, l.objects, p.objects); + if (1 !== h.length) + throw new Error( + "CFF table has too many fonts in 'FontSet' - count of fonts NameIndex.length = " + + h.length + ); + var f = h[0]; + if ( + ((a.tables.cff.topDict = f)._privateDict && + ((a.defaultWidthX = f._privateDict.defaultWidthX), + (a.nominalWidthX = f._privateDict.nominalWidthX)), + void 0 !== f.ros[0] && void 0 !== f.ros[1] && (a.isCIDFont = !0), + a.isCIDFont) + ) { + var d = f.fdArray, + g = f.fdSelect; + if (0 === d || 0 === g) + throw new Error( + "Font is marked as a CID font, but FDArray and/or FDSelect information is missing" + ); + var v = Oe(r, (d += n)), + m = Me(r, n, v.objects, p.objects); + (f._fdArray = m), + (g += n), + (f._fdSelect = (function (e, t, r, n) { + var a, + o = [], + s = new ie.Parser(e, t), + i = s.parseCard8(); + if (0 === i) + for (var u = 0; u < r; u++) { + if (n <= (a = s.parseCard8())) + throw new Error( + "CFF table CID Font FDSelect has bad FD index value " + + a + + " (FD count " + + n + + ")" + ); + o.push(a); + } + else { + if (3 !== i) + throw new Error( + "CFF Table CID Font FDSelect table has unsupported format " + + i + ); + var l, + p = s.parseCard16(), + c = s.parseCard16(); + if (0 !== c) + throw new Error( + "CFF Table CID Font FDSelect format 3 range has bad initial GID " + + c + ); + for (var h = 0; h < p; h++) { + if (((a = s.parseCard8()), (l = s.parseCard16()), n <= a)) + throw new Error( + "CFF table CID Font FDSelect has bad FD index value " + + a + + " (FD count " + + n + + ")" + ); + if (r < l) + throw new Error( + "CFF Table CID Font FDSelect format 3 range has bad GID " + + l + ); + for (; c < l; c++) o.push(a); + c = l; + } + if (l !== r) + throw new Error( + "CFF Table CID Font FDSelect format 3 range has bad final GID " + + l + ); + } + return o; + })(r, g, a.numGlyphs, m.length)); + } + var y, + b = n + f.private[1], + S = Ie(r, b, f.private[0], p.objects); + if ( + ((a.defaultWidthX = S.defaultWidthX), + (a.nominalWidthX = S.nominalWidthX), + 0 !== S.subrs) + ) { + var x = b + S.subrs, + T = Oe(r, x); + (a.subrs = T.objects), (a.subrsBias = Ue(a.subrs)); + } else (a.subrs = []), (a.subrsBias = 0); + e.lowMemory + ? ((y = (function (e, t) { + var r, + n, + a = [], + o = ie.getCard16(e, t); + if (0 !== o) { + var s = ie.getByte(e, t + 2); + r = t + (o + 1) * s + 2; + for (var i = t + 3, u = 0; u < o + 1; u += 1) + a.push(ie.getOffset(e, i, s)), (i += s); + n = r + a[o]; + } else n = t + 2; + return { offsets: a, startOffset: t, endOffset: n }; + })(r, n + f.charStrings)), + (a.nGlyphs = y.offsets.length)) + : ((y = Oe(r, n + f.charStrings)), (a.nGlyphs = y.objects.length)); + var k = (function (e, t, r, n) { + var a, + o, + s = new ie.Parser(e, t); + --r; + var i = [".notdef"], + u = s.parseCard8(); + if (0 === u) + for (var l = 0; l < r; l += 1) (a = s.parseSID()), i.push(Le(n, a)); + else if (1 === u) + for (; i.length <= r; ) { + (a = s.parseSID()), (o = s.parseCard8()); + for (var p = 0; p <= o; p += 1) i.push(Le(n, a)), (a += 1); + } + else { + if (2 !== u) throw new Error("Unknown charset format " + u); + for (; i.length <= r; ) { + (a = s.parseSID()), (o = s.parseCard16()); + for (var c = 0; c <= o; c += 1) i.push(Le(n, a)), (a += 1); + } + } + return i; + })(r, n + f.charset, a.nGlyphs, p.objects); + if ( + (0 === f.encoding + ? (a.cffEncoding = new ge(pe, k)) + : 1 === f.encoding + ? (a.cffEncoding = new ge(ce, k)) + : (a.cffEncoding = (function (e, t, r) { + var n, + a = {}, + o = new ie.Parser(e, t), + s = o.parseCard8(); + if (0 === s) + for (var i = o.parseCard8(), u = 0; u < i; u += 1) + a[(n = o.parseCard8())] = u; + else { + if (1 !== s) throw new Error("Unknown encoding format " + s); + var l = o.parseCard8(); + n = 1; + for (var p = 0; p < l; p += 1) + for ( + var c = o.parseCard8(), h = o.parseCard8(), f = c; + f <= c + h; + f += 1 + ) + (a[f] = n), (n += 1); + } + return new ge(a, r); + })(r, n + f.encoding, k)), + (a.encoding = a.encoding || a.cffEncoding), + (a.glyphs = new Te.GlyphSet(a)), + e.lowMemory) + ) + a._push = function (e) { + var t = (function (e, t, r, n, a) { + var o = ie.getCard16(r, n), + s = 0; + 0 !== o && (s = n + (o + 1) * ie.getByte(r, n + 2) + 2); + var i = ie.getBytes(r, s + t[e], s + t[e + 1]); + return a && (i = a(i)), i; + })(e, y.offsets, r, n + f.charStrings); + a.glyphs.push(e, Te.cffGlyphLoader(a, e, Ge, t)); + }; + else + for (var U = 0; U < a.nGlyphs; U += 1) { + var O = y.objects[U]; + a.glyphs.push(U, Te.cffGlyphLoader(a, U, Ge, O)); + } + }, + make: function (e, t) { + for ( + var r, + n = new $.Table("CFF ", [ + { name: "header", type: "RECORD" }, + { name: "nameIndex", type: "RECORD" }, + { name: "topDictIndex", type: "RECORD" }, + { name: "stringIndex", type: "RECORD" }, + { name: "globalSubrIndex", type: "RECORD" }, + { name: "charsets", type: "RECORD" }, + { name: "charStringsIndex", type: "RECORD" }, + { name: "privateDict", type: "RECORD" }, + ]), + a = 1 / t.unitsPerEm, + o = { + version: t.version, + fullName: t.fullName, + familyName: t.familyName, + weight: t.weightName, + fontBBox: t.fontBBox || [0, 0, 0, 0], + fontMatrix: [a, 0, 0, a, 0, 0], + charset: 999, + encoding: 0, + charStrings: 999, + private: [0, 999], + }, + s = [], + i = 1; + i < e.length; + i += 1 + ) + (r = e.get(i)), s.push(r.name); + var u = []; + (n.header = new $.Record("Header", [ + { name: "major", type: "Card8", value: 1 }, + { name: "minor", type: "Card8", value: 0 }, + { name: "hdrSize", type: "Card8", value: 4 }, + { name: "major", type: "Card8", value: 1 }, + ])), + (n.nameIndex = (function (e) { + var t = new $.Record("Name INDEX", [ + { name: "names", type: "INDEX", value: [] }, + ]); + t.names = []; + for (var r = 0; r < e.length; r += 1) + t.names.push({ name: "name_" + r, type: "NAME", value: e[r] }); + return t; + })([t.postScriptName])); + var l, + p, + c, + h = Ae(o, u); + (n.topDictIndex = Pe(h)), + (n.globalSubrIndex = new $.Record("Global Subr INDEX", [ + { name: "subrs", type: "INDEX", value: [] }, + ])), + (n.charsets = (function (e, t) { + for ( + var r = new $.Record("Charsets", [ + { name: "format", type: "Card8", value: 0 }, + ]), + n = 0; + n < e.length; + n += 1 + ) { + var a = Be(e[n], t); + r.fields.push({ name: "glyph_" + n, type: "SID", value: a }); + } + return r; + })(s, u)), + (n.charStringsIndex = (function (e) { + for ( + var t = new $.Record("CharStrings INDEX", [ + { name: "charStrings", type: "INDEX", value: [] }, + ]), + r = 0; + r < e.length; + r += 1 + ) { + var n = e.get(r), + a = Ne(n); + t.charStrings.push({ + name: n.name, + type: "CHARSTRING", + value: a, + }); + } + return t; + })(e)), + (n.privateDict = + ((l = {}), + (p = u), + ((c = new $.Record("Private DICT", [ + { name: "dict", type: "DICT", value: {} }, + ])).dict = Fe(De, l, p)), + c)), + (n.stringIndex = (function (e) { + var t = new $.Record("String INDEX", [ + { name: "strings", type: "INDEX", value: [] }, + ]); + t.strings = []; + for (var r = 0; r < e.length; r += 1) + t.strings.push({ + name: "string_" + r, + type: "STRING", + value: e[r], + }); + return t; + })(u)); + var f = + n.header.sizeOf() + + n.nameIndex.sizeOf() + + n.topDictIndex.sizeOf() + + n.stringIndex.sizeOf() + + n.globalSubrIndex.sizeOf(); + return ( + (o.charset = f), + (o.encoding = 0), + (o.charStrings = o.charset + n.charsets.sizeOf()), + (o.private[1] = o.charStrings + n.charStringsIndex.sizeOf()), + (h = Ae(o, u)), + (n.topDictIndex = Pe(h)), + n + ); + }, + }; + var ze = { + parse: function (e, t) { + var r = {}, + n = new ie.Parser(e, t); + return ( + (r.version = n.parseVersion()), + (r.fontRevision = Math.round(1e3 * n.parseFixed()) / 1e3), + (r.checkSumAdjustment = n.parseULong()), + (r.magicNumber = n.parseULong()), + w.argument( + 1594834165 === r.magicNumber, + "Font header has wrong magic number." + ), + (r.flags = n.parseUShort()), + (r.unitsPerEm = n.parseUShort()), + (r.created = n.parseLongDateTime()), + (r.modified = n.parseLongDateTime()), + (r.xMin = n.parseShort()), + (r.yMin = n.parseShort()), + (r.xMax = n.parseShort()), + (r.yMax = n.parseShort()), + (r.macStyle = n.parseUShort()), + (r.lowestRecPPEM = n.parseUShort()), + (r.fontDirectionHint = n.parseShort()), + (r.indexToLocFormat = n.parseShort()), + (r.glyphDataFormat = n.parseShort()), + r + ); + }, + make: function (e) { + var t = Math.round(new Date().getTime() / 1e3) + 2082844800, + r = t; + return ( + e.createdTimestamp && (r = e.createdTimestamp + 2082844800), + new $.Table( + "head", + [ + { name: "version", type: "FIXED", value: 65536 }, + { name: "fontRevision", type: "FIXED", value: 65536 }, + { name: "checkSumAdjustment", type: "ULONG", value: 0 }, + { name: "magicNumber", type: "ULONG", value: 1594834165 }, + { name: "flags", type: "USHORT", value: 0 }, + { name: "unitsPerEm", type: "USHORT", value: 1e3 }, + { name: "created", type: "LONGDATETIME", value: r }, + { name: "modified", type: "LONGDATETIME", value: t }, + { name: "xMin", type: "SHORT", value: 0 }, + { name: "yMin", type: "SHORT", value: 0 }, + { name: "xMax", type: "SHORT", value: 0 }, + { name: "yMax", type: "SHORT", value: 0 }, + { name: "macStyle", type: "USHORT", value: 0 }, + { name: "lowestRecPPEM", type: "USHORT", value: 0 }, + { name: "fontDirectionHint", type: "SHORT", value: 2 }, + { name: "indexToLocFormat", type: "SHORT", value: 0 }, + { name: "glyphDataFormat", type: "SHORT", value: 0 }, + ], + e + ) + ); + }, + }; + var We = { + parse: function (e, t) { + var r = {}, + n = new ie.Parser(e, t); + return ( + (r.version = n.parseVersion()), + (r.ascender = n.parseShort()), + (r.descender = n.parseShort()), + (r.lineGap = n.parseShort()), + (r.advanceWidthMax = n.parseUShort()), + (r.minLeftSideBearing = n.parseShort()), + (r.minRightSideBearing = n.parseShort()), + (r.xMaxExtent = n.parseShort()), + (r.caretSlopeRise = n.parseShort()), + (r.caretSlopeRun = n.parseShort()), + (r.caretOffset = n.parseShort()), + (n.relativeOffset += 8), + (r.metricDataFormat = n.parseShort()), + (r.numberOfHMetrics = n.parseUShort()), + r + ); + }, + make: function (e) { + return new $.Table( + "hhea", + [ + { name: "version", type: "FIXED", value: 65536 }, + { name: "ascender", type: "FWORD", value: 0 }, + { name: "descender", type: "FWORD", value: 0 }, + { name: "lineGap", type: "FWORD", value: 0 }, + { name: "advanceWidthMax", type: "UFWORD", value: 0 }, + { name: "minLeftSideBearing", type: "FWORD", value: 0 }, + { name: "minRightSideBearing", type: "FWORD", value: 0 }, + { name: "xMaxExtent", type: "FWORD", value: 0 }, + { name: "caretSlopeRise", type: "SHORT", value: 1 }, + { name: "caretSlopeRun", type: "SHORT", value: 0 }, + { name: "caretOffset", type: "SHORT", value: 0 }, + { name: "reserved1", type: "SHORT", value: 0 }, + { name: "reserved2", type: "SHORT", value: 0 }, + { name: "reserved3", type: "SHORT", value: 0 }, + { name: "reserved4", type: "SHORT", value: 0 }, + { name: "metricDataFormat", type: "SHORT", value: 0 }, + { name: "numberOfHMetrics", type: "USHORT", value: 0 }, + ], + e + ); + }, + }; + var qe = { + parse: function (e, t, r, n, a, o, s) { + s.lowMemory + ? (function (e, t, r, n, a) { + var o, s; + e._hmtxTableData = {}; + for (var i = new ie.Parser(t, r), u = 0; u < a; u += 1) + u < n && ((o = i.parseUShort()), (s = i.parseShort())), + (e._hmtxTableData[u] = { + advanceWidth: o, + leftSideBearing: s, + }); + })(e, t, r, n, a) + : (function (e, t, r, n, a) { + for (var o, s, i = new ie.Parser(e, t), u = 0; u < n; u += 1) { + u < r && ((o = i.parseUShort()), (s = i.parseShort())); + var l = a.get(u); + (l.advanceWidth = o), (l.leftSideBearing = s); + } + })(t, r, n, a, o); + }, + make: function (e) { + for (var t = new $.Table("hmtx", []), r = 0; r < e.length; r += 1) { + var n = e.get(r), + a = n.advanceWidth || 0, + o = n.leftSideBearing || 0; + t.fields.push({ + name: "advanceWidth_" + r, + type: "USHORT", + value: a, + }), + t.fields.push({ + name: "leftSideBearing_" + r, + type: "SHORT", + value: o, + }); + } + return t; + }, + }; + var _e = { + make: function (e) { + for ( + var t = new $.Table("ltag", [ + { name: "version", type: "ULONG", value: 1 }, + { name: "flags", type: "ULONG", value: 0 }, + { name: "numTags", type: "ULONG", value: e.length }, + ]), + r = "", + n = 12 + 4 * e.length, + a = 0; + a < e.length; + ++a + ) { + var o = r.indexOf(e[a]); + o < 0 && ((o = r.length), (r += e[a])), + t.fields.push({ + name: "offset " + a, + type: "USHORT", + value: n + o, + }), + t.fields.push({ + name: "length " + a, + type: "USHORT", + value: e[a].length, + }); + } + return ( + t.fields.push({ name: "stringPool", type: "CHARARRAY", value: r }), t + ); + }, + parse: function (e, t) { + var r = new ie.Parser(e, t), + n = r.parseULong(); + w.argument(1 === n, "Unsupported ltag table version."), + r.skip("uLong", 1); + for (var a = r.parseULong(), o = [], s = 0; s < a; s++) { + for ( + var i = "", u = t + r.parseUShort(), l = r.parseUShort(), p = u; + p < u + l; + ++p + ) + i += String.fromCharCode(e.getInt8(p)); + o.push(i); + } + return o; + }, + }; + var Xe = { + parse: function (e, t) { + var r = {}, + n = new ie.Parser(e, t); + return ( + (r.version = n.parseVersion()), + (r.numGlyphs = n.parseUShort()), + 1 === r.version && + ((r.maxPoints = n.parseUShort()), + (r.maxContours = n.parseUShort()), + (r.maxCompositePoints = n.parseUShort()), + (r.maxCompositeContours = n.parseUShort()), + (r.maxZones = n.parseUShort()), + (r.maxTwilightPoints = n.parseUShort()), + (r.maxStorage = n.parseUShort()), + (r.maxFunctionDefs = n.parseUShort()), + (r.maxInstructionDefs = n.parseUShort()), + (r.maxStackElements = n.parseUShort()), + (r.maxSizeOfInstructions = n.parseUShort()), + (r.maxComponentElements = n.parseUShort()), + (r.maxComponentDepth = n.parseUShort())), + r + ); + }, + make: function (e) { + return new $.Table("maxp", [ + { name: "version", type: "FIXED", value: 20480 }, + { name: "numGlyphs", type: "USHORT", value: e }, + ]); + }, + }, + Ve = [ + "copyright", + "fontFamily", + "fontSubfamily", + "uniqueID", + "fullName", + "version", + "postScriptName", + "trademark", + "manufacturer", + "designer", + "description", + "manufacturerURL", + "designerURL", + "license", + "licenseURL", + "reserved", + "preferredFamily", + "preferredSubfamily", + "compatibleFullName", + "sampleText", + "postScriptFindFontName", + "wwsFamily", + "wwsSubfamily", + ], + Ye = { + 0: "en", + 1: "fr", + 2: "de", + 3: "it", + 4: "nl", + 5: "sv", + 6: "es", + 7: "da", + 8: "pt", + 9: "no", + 10: "he", + 11: "ja", + 12: "ar", + 13: "fi", + 14: "el", + 15: "is", + 16: "mt", + 17: "tr", + 18: "hr", + 19: "zh-Hant", + 20: "ur", + 21: "hi", + 22: "th", + 23: "ko", + 24: "lt", + 25: "pl", + 26: "hu", + 27: "es", + 28: "lv", + 29: "se", + 30: "fo", + 31: "fa", + 32: "ru", + 33: "zh", + 34: "nl-BE", + 35: "ga", + 36: "sq", + 37: "ro", + 38: "cz", + 39: "sk", + 40: "si", + 41: "yi", + 42: "sr", + 43: "mk", + 44: "bg", + 45: "uk", + 46: "be", + 47: "uz", + 48: "kk", + 49: "az-Cyrl", + 50: "az-Arab", + 51: "hy", + 52: "ka", + 53: "mo", + 54: "ky", + 55: "tg", + 56: "tk", + 57: "mn-CN", + 58: "mn", + 59: "ps", + 60: "ks", + 61: "ku", + 62: "sd", + 63: "bo", + 64: "ne", + 65: "sa", + 66: "mr", + 67: "bn", + 68: "as", + 69: "gu", + 70: "pa", + 71: "or", + 72: "ml", + 73: "kn", + 74: "ta", + 75: "te", + 76: "si", + 77: "my", + 78: "km", + 79: "lo", + 80: "vi", + 81: "id", + 82: "tl", + 83: "ms", + 84: "ms-Arab", + 85: "am", + 86: "ti", + 87: "om", + 88: "so", + 89: "sw", + 90: "rw", + 91: "rn", + 92: "ny", + 93: "mg", + 94: "eo", + 128: "cy", + 129: "eu", + 130: "ca", + 131: "la", + 132: "qu", + 133: "gn", + 134: "ay", + 135: "tt", + 136: "ug", + 137: "dz", + 138: "jv", + 139: "su", + 140: "gl", + 141: "af", + 142: "br", + 143: "iu", + 144: "gd", + 145: "gv", + 146: "ga", + 147: "to", + 148: "el-polyton", + 149: "kl", + 150: "az", + 151: "nn", + }, + je = { + 0: 0, + 1: 0, + 2: 0, + 3: 0, + 4: 0, + 5: 0, + 6: 0, + 7: 0, + 8: 0, + 9: 0, + 10: 5, + 11: 1, + 12: 4, + 13: 0, + 14: 6, + 15: 0, + 16: 0, + 17: 0, + 18: 0, + 19: 2, + 20: 4, + 21: 9, + 22: 21, + 23: 3, + 24: 29, + 25: 29, + 26: 29, + 27: 29, + 28: 29, + 29: 0, + 30: 0, + 31: 4, + 32: 7, + 33: 25, + 34: 0, + 35: 0, + 36: 0, + 37: 0, + 38: 29, + 39: 29, + 40: 0, + 41: 5, + 42: 7, + 43: 7, + 44: 7, + 45: 7, + 46: 7, + 47: 7, + 48: 7, + 49: 7, + 50: 4, + 51: 24, + 52: 23, + 53: 7, + 54: 7, + 55: 7, + 56: 7, + 57: 27, + 58: 7, + 59: 4, + 60: 4, + 61: 4, + 62: 4, + 63: 26, + 64: 9, + 65: 9, + 66: 9, + 67: 13, + 68: 13, + 69: 11, + 70: 10, + 71: 12, + 72: 17, + 73: 16, + 74: 14, + 75: 15, + 76: 18, + 77: 19, + 78: 20, + 79: 22, + 80: 30, + 81: 0, + 82: 0, + 83: 0, + 84: 4, + 85: 28, + 86: 28, + 87: 28, + 88: 0, + 89: 0, + 90: 0, + 91: 0, + 92: 0, + 93: 0, + 94: 0, + 128: 0, + 129: 0, + 130: 0, + 131: 0, + 132: 0, + 133: 0, + 134: 0, + 135: 7, + 136: 4, + 137: 26, + 138: 0, + 139: 0, + 140: 0, + 141: 0, + 142: 0, + 143: 28, + 144: 0, + 145: 0, + 146: 0, + 147: 0, + 148: 6, + 149: 0, + 150: 0, + 151: 0, + }, + Ze = { + 1078: "af", + 1052: "sq", + 1156: "gsw", + 1118: "am", + 5121: "ar-DZ", + 15361: "ar-BH", + 3073: "ar", + 2049: "ar-IQ", + 11265: "ar-JO", + 13313: "ar-KW", + 12289: "ar-LB", + 4097: "ar-LY", + 6145: "ary", + 8193: "ar-OM", + 16385: "ar-QA", + 1025: "ar-SA", + 10241: "ar-SY", + 7169: "aeb", + 14337: "ar-AE", + 9217: "ar-YE", + 1067: "hy", + 1101: "as", + 2092: "az-Cyrl", + 1068: "az", + 1133: "ba", + 1069: "eu", + 1059: "be", + 2117: "bn", + 1093: "bn-IN", + 8218: "bs-Cyrl", + 5146: "bs", + 1150: "br", + 1026: "bg", + 1027: "ca", + 3076: "zh-HK", + 5124: "zh-MO", + 2052: "zh", + 4100: "zh-SG", + 1028: "zh-TW", + 1155: "co", + 1050: "hr", + 4122: "hr-BA", + 1029: "cs", + 1030: "da", + 1164: "prs", + 1125: "dv", + 2067: "nl-BE", + 1043: "nl", + 3081: "en-AU", + 10249: "en-BZ", + 4105: "en-CA", + 9225: "en-029", + 16393: "en-IN", + 6153: "en-IE", + 8201: "en-JM", + 17417: "en-MY", + 5129: "en-NZ", + 13321: "en-PH", + 18441: "en-SG", + 7177: "en-ZA", + 11273: "en-TT", + 2057: "en-GB", + 1033: "en", + 12297: "en-ZW", + 1061: "et", + 1080: "fo", + 1124: "fil", + 1035: "fi", + 2060: "fr-BE", + 3084: "fr-CA", + 1036: "fr", + 5132: "fr-LU", + 6156: "fr-MC", + 4108: "fr-CH", + 1122: "fy", + 1110: "gl", + 1079: "ka", + 3079: "de-AT", + 1031: "de", + 5127: "de-LI", + 4103: "de-LU", + 2055: "de-CH", + 1032: "el", + 1135: "kl", + 1095: "gu", + 1128: "ha", + 1037: "he", + 1081: "hi", + 1038: "hu", + 1039: "is", + 1136: "ig", + 1057: "id", + 1117: "iu", + 2141: "iu-Latn", + 2108: "ga", + 1076: "xh", + 1077: "zu", + 1040: "it", + 2064: "it-CH", + 1041: "ja", + 1099: "kn", + 1087: "kk", + 1107: "km", + 1158: "quc", + 1159: "rw", + 1089: "sw", + 1111: "kok", + 1042: "ko", + 1088: "ky", + 1108: "lo", + 1062: "lv", + 1063: "lt", + 2094: "dsb", + 1134: "lb", + 1071: "mk", + 2110: "ms-BN", + 1086: "ms", + 1100: "ml", + 1082: "mt", + 1153: "mi", + 1146: "arn", + 1102: "mr", + 1148: "moh", + 1104: "mn", + 2128: "mn-CN", + 1121: "ne", + 1044: "nb", + 2068: "nn", + 1154: "oc", + 1096: "or", + 1123: "ps", + 1045: "pl", + 1046: "pt", + 2070: "pt-PT", + 1094: "pa", + 1131: "qu-BO", + 2155: "qu-EC", + 3179: "qu", + 1048: "ro", + 1047: "rm", + 1049: "ru", + 9275: "smn", + 4155: "smj-NO", + 5179: "smj", + 3131: "se-FI", + 1083: "se", + 2107: "se-SE", + 8251: "sms", + 6203: "sma-NO", + 7227: "sms", + 1103: "sa", + 7194: "sr-Cyrl-BA", + 3098: "sr", + 6170: "sr-Latn-BA", + 2074: "sr-Latn", + 1132: "nso", + 1074: "tn", + 1115: "si", + 1051: "sk", + 1060: "sl", + 11274: "es-AR", + 16394: "es-BO", + 13322: "es-CL", + 9226: "es-CO", + 5130: "es-CR", + 7178: "es-DO", + 12298: "es-EC", + 17418: "es-SV", + 4106: "es-GT", + 18442: "es-HN", + 2058: "es-MX", + 19466: "es-NI", + 6154: "es-PA", + 15370: "es-PY", + 10250: "es-PE", + 20490: "es-PR", + 3082: "es", + 1034: "es", + 21514: "es-US", + 14346: "es-UY", + 8202: "es-VE", + 2077: "sv-FI", + 1053: "sv", + 1114: "syr", + 1064: "tg", + 2143: "tzm", + 1097: "ta", + 1092: "tt", + 1098: "te", + 1054: "th", + 1105: "bo", + 1055: "tr", + 1090: "tk", + 1152: "ug", + 1058: "uk", + 1070: "hsb", + 1056: "ur", + 2115: "uz-Cyrl", + 1091: "uz", + 1066: "vi", + 1106: "cy", + 1160: "wo", + 1157: "sah", + 1144: "ii", + 1130: "yo", + }; + function Qe(e, t, r) { + switch (e) { + case 0: + if (65535 === t) return "und"; + if (r) return r[t]; + break; + case 1: + return Ye[t]; + case 3: + return Ze[t]; + } + } + var Ke = "utf-16", + Je = { + 0: "macintosh", + 1: "x-mac-japanese", + 2: "x-mac-chinesetrad", + 3: "x-mac-korean", + 6: "x-mac-greek", + 7: "x-mac-cyrillic", + 9: "x-mac-devanagai", + 10: "x-mac-gurmukhi", + 11: "x-mac-gujarati", + 12: "x-mac-oriya", + 13: "x-mac-bengali", + 14: "x-mac-tamil", + 15: "x-mac-telugu", + 16: "x-mac-kannada", + 17: "x-mac-malayalam", + 18: "x-mac-sinhalese", + 19: "x-mac-burmese", + 20: "x-mac-khmer", + 21: "x-mac-thai", + 22: "x-mac-lao", + 23: "x-mac-georgian", + 24: "x-mac-armenian", + 25: "x-mac-chinesesimp", + 26: "x-mac-tibetan", + 27: "x-mac-mongolian", + 28: "x-mac-ethiopic", + 29: "x-mac-ce", + 30: "x-mac-vietnamese", + 31: "x-mac-extarabic", + }, + $e = { + 15: "x-mac-icelandic", + 17: "x-mac-turkish", + 18: "x-mac-croatian", + 24: "x-mac-ce", + 25: "x-mac-ce", + 26: "x-mac-ce", + 27: "x-mac-ce", + 28: "x-mac-ce", + 30: "x-mac-icelandic", + 37: "x-mac-romanian", + 38: "x-mac-ce", + 39: "x-mac-ce", + 40: "x-mac-ce", + 143: "x-mac-inuit", + 146: "x-mac-gaelic", + }; + function et(e, t, r) { + switch (e) { + case 0: + return Ke; + case 1: + return $e[r] || Je[t]; + case 3: + if (1 === t || 10 === t) return Ke; + } + } + function tt(e) { + var t = {}; + for (var r in e) t[e[r]] = parseInt(r); + return t; + } + function rt(e, t, r, n, a, o) { + return new $.Record("NameRecord", [ + { name: "platformID", type: "USHORT", value: e }, + { name: "encodingID", type: "USHORT", value: t }, + { name: "languageID", type: "USHORT", value: r }, + { name: "nameID", type: "USHORT", value: n }, + { name: "length", type: "USHORT", value: a }, + { name: "offset", type: "USHORT", value: o }, + ]); + } + function nt(e, t) { + var r = (function (e, t) { + var r = e.length, + n = t.length - r + 1; + e: for (var a = 0; a < n; a++) + for (; a < n; a++) { + for (var o = 0; o < r; o++) if (t[a + o] !== e[o]) continue e; + return a; + } + return -1; + })(e, t); + if (r < 0) { + r = t.length; + for (var n = 0, a = e.length; n < a; ++n) t.push(e[n]); + } + return r; + } + var at = { + parse: function (e, t, r) { + for ( + var n = {}, + a = new ie.Parser(e, t), + o = a.parseUShort(), + s = a.parseUShort(), + i = a.offset + a.parseUShort(), + u = 0; + u < s; + u++ + ) { + var l = a.parseUShort(), + p = a.parseUShort(), + c = a.parseUShort(), + h = a.parseUShort(), + f = Ve[h] || h, + d = a.parseUShort(), + g = a.parseUShort(), + v = Qe(l, c, r), + m = et(l, p, c); + if (void 0 !== m && void 0 !== v) { + var y = void 0; + if ( + (y = + m === Ke ? I.UTF16(e, i + g, d) : I.MACSTRING(e, i + g, d, m)) + ) { + var b = n[f]; + void 0 === b && (b = n[f] = {}), (b[v] = y); + } + } + } + return 1 === o && a.parseUShort(), n; + }, + make: function (e, t) { + var r, + n = [], + a = {}, + o = tt(Ve); + for (var s in e) { + var i = o[s]; + if ((void 0 === i && (i = s), (r = parseInt(i)), isNaN(r))) + throw new Error( + 'Name table entry "' + + s + + '" does not exist, see nameTableNames for complete list.' + ); + (a[r] = e[s]), n.push(r); + } + for ( + var u = tt(Ye), l = tt(Ze), p = [], c = [], h = 0; + h < n.length; + h++ + ) { + var f = a[(r = n[h])]; + for (var d in f) { + var g = f[d], + v = 1, + m = u[d], + y = je[m], + b = et(v, y, m), + S = M.MACSTRING(g, b); + void 0 === S && + ((v = 0), + (m = t.indexOf(d)) < 0 && ((m = t.length), t.push(d)), + (y = 4), + (S = M.UTF16(g))); + var x = nt(S, c); + p.push(rt(v, y, m, r, S.length, x)); + var T = l[d]; + if (void 0 !== T) { + var k = M.UTF16(g), + U = nt(k, c); + p.push(rt(3, 1, T, r, k.length, U)); + } + } + } + p.sort(function (e, t) { + return ( + e.platformID - t.platformID || + e.encodingID - t.encodingID || + e.languageID - t.languageID || + e.nameID - t.nameID + ); + }); + for ( + var O = new $.Table("name", [ + { name: "format", type: "USHORT", value: 0 }, + { name: "count", type: "USHORT", value: p.length }, + { + name: "stringOffset", + type: "USHORT", + value: 6 + 12 * p.length, + }, + ]), + E = 0; + E < p.length; + E++ + ) + O.fields.push({ name: "record_" + E, type: "RECORD", value: p[E] }); + return ( + O.fields.push({ name: "strings", type: "LITERAL", value: c }), O + ); + }, + }, + ot = [ + { begin: 0, end: 127 }, + { begin: 128, end: 255 }, + { begin: 256, end: 383 }, + { begin: 384, end: 591 }, + { begin: 592, end: 687 }, + { begin: 688, end: 767 }, + { begin: 768, end: 879 }, + { begin: 880, end: 1023 }, + { begin: 11392, end: 11519 }, + { begin: 1024, end: 1279 }, + { begin: 1328, end: 1423 }, + { begin: 1424, end: 1535 }, + { begin: 42240, end: 42559 }, + { begin: 1536, end: 1791 }, + { begin: 1984, end: 2047 }, + { begin: 2304, end: 2431 }, + { begin: 2432, end: 2559 }, + { begin: 2560, end: 2687 }, + { begin: 2688, end: 2815 }, + { begin: 2816, end: 2943 }, + { begin: 2944, end: 3071 }, + { begin: 3072, end: 3199 }, + { begin: 3200, end: 3327 }, + { begin: 3328, end: 3455 }, + { begin: 3584, end: 3711 }, + { begin: 3712, end: 3839 }, + { begin: 4256, end: 4351 }, + { begin: 6912, end: 7039 }, + { begin: 4352, end: 4607 }, + { begin: 7680, end: 7935 }, + { begin: 7936, end: 8191 }, + { begin: 8192, end: 8303 }, + { begin: 8304, end: 8351 }, + { begin: 8352, end: 8399 }, + { begin: 8400, end: 8447 }, + { begin: 8448, end: 8527 }, + { begin: 8528, end: 8591 }, + { begin: 8592, end: 8703 }, + { begin: 8704, end: 8959 }, + { begin: 8960, end: 9215 }, + { begin: 9216, end: 9279 }, + { begin: 9280, end: 9311 }, + { begin: 9312, end: 9471 }, + { begin: 9472, end: 9599 }, + { begin: 9600, end: 9631 }, + { begin: 9632, end: 9727 }, + { begin: 9728, end: 9983 }, + { begin: 9984, end: 10175 }, + { begin: 12288, end: 12351 }, + { begin: 12352, end: 12447 }, + { begin: 12448, end: 12543 }, + { begin: 12544, end: 12591 }, + { begin: 12592, end: 12687 }, + { begin: 43072, end: 43135 }, + { begin: 12800, end: 13055 }, + { begin: 13056, end: 13311 }, + { begin: 44032, end: 55215 }, + { begin: 55296, end: 57343 }, + { begin: 67840, end: 67871 }, + { begin: 19968, end: 40959 }, + { begin: 57344, end: 63743 }, + { begin: 12736, end: 12783 }, + { begin: 64256, end: 64335 }, + { begin: 64336, end: 65023 }, + { begin: 65056, end: 65071 }, + { begin: 65040, end: 65055 }, + { begin: 65104, end: 65135 }, + { begin: 65136, end: 65279 }, + { begin: 65280, end: 65519 }, + { begin: 65520, end: 65535 }, + { begin: 3840, end: 4095 }, + { begin: 1792, end: 1871 }, + { begin: 1920, end: 1983 }, + { begin: 3456, end: 3583 }, + { begin: 4096, end: 4255 }, + { begin: 4608, end: 4991 }, + { begin: 5024, end: 5119 }, + { begin: 5120, end: 5759 }, + { begin: 5760, end: 5791 }, + { begin: 5792, end: 5887 }, + { begin: 6016, end: 6143 }, + { begin: 6144, end: 6319 }, + { begin: 10240, end: 10495 }, + { begin: 40960, end: 42127 }, + { begin: 5888, end: 5919 }, + { begin: 66304, end: 66351 }, + { begin: 66352, end: 66383 }, + { begin: 66560, end: 66639 }, + { begin: 118784, end: 119039 }, + { begin: 119808, end: 120831 }, + { begin: 1044480, end: 1048573 }, + { begin: 65024, end: 65039 }, + { begin: 917504, end: 917631 }, + { begin: 6400, end: 6479 }, + { begin: 6480, end: 6527 }, + { begin: 6528, end: 6623 }, + { begin: 6656, end: 6687 }, + { begin: 11264, end: 11359 }, + { begin: 11568, end: 11647 }, + { begin: 19904, end: 19967 }, + { begin: 43008, end: 43055 }, + { begin: 65536, end: 65663 }, + { begin: 65856, end: 65935 }, + { begin: 66432, end: 66463 }, + { begin: 66464, end: 66527 }, + { begin: 66640, end: 66687 }, + { begin: 66688, end: 66735 }, + { begin: 67584, end: 67647 }, + { begin: 68096, end: 68191 }, + { begin: 119552, end: 119647 }, + { begin: 73728, end: 74751 }, + { begin: 119648, end: 119679 }, + { begin: 7040, end: 7103 }, + { begin: 7168, end: 7247 }, + { begin: 7248, end: 7295 }, + { begin: 43136, end: 43231 }, + { begin: 43264, end: 43311 }, + { begin: 43312, end: 43359 }, + { begin: 43520, end: 43615 }, + { begin: 65936, end: 65999 }, + { begin: 66e3, end: 66047 }, + { begin: 66208, end: 66271 }, + { begin: 127024, end: 127135 }, + ]; + var st = { + parse: function (e, t) { + var r = {}, + n = new ie.Parser(e, t); + (r.version = n.parseUShort()), + (r.xAvgCharWidth = n.parseShort()), + (r.usWeightClass = n.parseUShort()), + (r.usWidthClass = n.parseUShort()), + (r.fsType = n.parseUShort()), + (r.ySubscriptXSize = n.parseShort()), + (r.ySubscriptYSize = n.parseShort()), + (r.ySubscriptXOffset = n.parseShort()), + (r.ySubscriptYOffset = n.parseShort()), + (r.ySuperscriptXSize = n.parseShort()), + (r.ySuperscriptYSize = n.parseShort()), + (r.ySuperscriptXOffset = n.parseShort()), + (r.ySuperscriptYOffset = n.parseShort()), + (r.yStrikeoutSize = n.parseShort()), + (r.yStrikeoutPosition = n.parseShort()), + (r.sFamilyClass = n.parseShort()), + (r.panose = []); + for (var a = 0; a < 10; a++) r.panose[a] = n.parseByte(); + return ( + (r.ulUnicodeRange1 = n.parseULong()), + (r.ulUnicodeRange2 = n.parseULong()), + (r.ulUnicodeRange3 = n.parseULong()), + (r.ulUnicodeRange4 = n.parseULong()), + (r.achVendID = String.fromCharCode( + n.parseByte(), + n.parseByte(), + n.parseByte(), + n.parseByte() + )), + (r.fsSelection = n.parseUShort()), + (r.usFirstCharIndex = n.parseUShort()), + (r.usLastCharIndex = n.parseUShort()), + (r.sTypoAscender = n.parseShort()), + (r.sTypoDescender = n.parseShort()), + (r.sTypoLineGap = n.parseShort()), + (r.usWinAscent = n.parseUShort()), + (r.usWinDescent = n.parseUShort()), + 1 <= r.version && + ((r.ulCodePageRange1 = n.parseULong()), + (r.ulCodePageRange2 = n.parseULong())), + 2 <= r.version && + ((r.sxHeight = n.parseShort()), + (r.sCapHeight = n.parseShort()), + (r.usDefaultChar = n.parseUShort()), + (r.usBreakChar = n.parseUShort()), + (r.usMaxContent = n.parseUShort())), + r + ); + }, + make: function (e) { + return new $.Table( + "OS/2", + [ + { name: "version", type: "USHORT", value: 3 }, + { name: "xAvgCharWidth", type: "SHORT", value: 0 }, + { name: "usWeightClass", type: "USHORT", value: 0 }, + { name: "usWidthClass", type: "USHORT", value: 0 }, + { name: "fsType", type: "USHORT", value: 0 }, + { name: "ySubscriptXSize", type: "SHORT", value: 650 }, + { name: "ySubscriptYSize", type: "SHORT", value: 699 }, + { name: "ySubscriptXOffset", type: "SHORT", value: 0 }, + { name: "ySubscriptYOffset", type: "SHORT", value: 140 }, + { name: "ySuperscriptXSize", type: "SHORT", value: 650 }, + { name: "ySuperscriptYSize", type: "SHORT", value: 699 }, + { name: "ySuperscriptXOffset", type: "SHORT", value: 0 }, + { name: "ySuperscriptYOffset", type: "SHORT", value: 479 }, + { name: "yStrikeoutSize", type: "SHORT", value: 49 }, + { name: "yStrikeoutPosition", type: "SHORT", value: 258 }, + { name: "sFamilyClass", type: "SHORT", value: 0 }, + { name: "bFamilyType", type: "BYTE", value: 0 }, + { name: "bSerifStyle", type: "BYTE", value: 0 }, + { name: "bWeight", type: "BYTE", value: 0 }, + { name: "bProportion", type: "BYTE", value: 0 }, + { name: "bContrast", type: "BYTE", value: 0 }, + { name: "bStrokeVariation", type: "BYTE", value: 0 }, + { name: "bArmStyle", type: "BYTE", value: 0 }, + { name: "bLetterform", type: "BYTE", value: 0 }, + { name: "bMidline", type: "BYTE", value: 0 }, + { name: "bXHeight", type: "BYTE", value: 0 }, + { name: "ulUnicodeRange1", type: "ULONG", value: 0 }, + { name: "ulUnicodeRange2", type: "ULONG", value: 0 }, + { name: "ulUnicodeRange3", type: "ULONG", value: 0 }, + { name: "ulUnicodeRange4", type: "ULONG", value: 0 }, + { name: "achVendID", type: "CHARARRAY", value: "XXXX" }, + { name: "fsSelection", type: "USHORT", value: 0 }, + { name: "usFirstCharIndex", type: "USHORT", value: 0 }, + { name: "usLastCharIndex", type: "USHORT", value: 0 }, + { name: "sTypoAscender", type: "SHORT", value: 0 }, + { name: "sTypoDescender", type: "SHORT", value: 0 }, + { name: "sTypoLineGap", type: "SHORT", value: 0 }, + { name: "usWinAscent", type: "USHORT", value: 0 }, + { name: "usWinDescent", type: "USHORT", value: 0 }, + { name: "ulCodePageRange1", type: "ULONG", value: 0 }, + { name: "ulCodePageRange2", type: "ULONG", value: 0 }, + { name: "sxHeight", type: "SHORT", value: 0 }, + { name: "sCapHeight", type: "SHORT", value: 0 }, + { name: "usDefaultChar", type: "USHORT", value: 0 }, + { name: "usBreakChar", type: "USHORT", value: 0 }, + { name: "usMaxContext", type: "USHORT", value: 0 }, + ], + e + ); + }, + unicodeRanges: ot, + getUnicodeRange: function (e) { + for (var t = 0; t < ot.length; t += 1) { + var r = ot[t]; + if (e >= r.begin && e < r.end) return t; + } + return -1; + }, + }; + var it = { + parse: function (e, t) { + var r = {}, + n = new ie.Parser(e, t); + switch ( + ((r.version = n.parseVersion()), + (r.italicAngle = n.parseFixed()), + (r.underlinePosition = n.parseShort()), + (r.underlineThickness = n.parseShort()), + (r.isFixedPitch = n.parseULong()), + (r.minMemType42 = n.parseULong()), + (r.maxMemType42 = n.parseULong()), + (r.minMemType1 = n.parseULong()), + (r.maxMemType1 = n.parseULong()), + r.version) + ) { + case 1: + r.names = he.slice(); + break; + case 2: + (r.numberOfGlyphs = n.parseUShort()), + (r.glyphNameIndex = new Array(r.numberOfGlyphs)); + for (var a = 0; a < r.numberOfGlyphs; a++) + r.glyphNameIndex[a] = n.parseUShort(); + r.names = []; + for (var o = 0; o < r.numberOfGlyphs; o++) + if (r.glyphNameIndex[o] >= he.length) { + var s = n.parseChar(); + r.names.push(n.parseString(s)); + } + break; + case 2.5: + (r.numberOfGlyphs = n.parseUShort()), + (r.offset = new Array(r.numberOfGlyphs)); + for (var i = 0; i < r.numberOfGlyphs; i++) + r.offset[i] = n.parseChar(); + } + return r; + }, + make: function () { + return new $.Table("post", [ + { name: "version", type: "FIXED", value: 196608 }, + { name: "italicAngle", type: "FIXED", value: 0 }, + { name: "underlinePosition", type: "FWORD", value: 0 }, + { name: "underlineThickness", type: "FWORD", value: 0 }, + { name: "isFixedPitch", type: "ULONG", value: 0 }, + { name: "minMemType42", type: "ULONG", value: 0 }, + { name: "maxMemType42", type: "ULONG", value: 0 }, + { name: "minMemType1", type: "ULONG", value: 0 }, + { name: "maxMemType1", type: "ULONG", value: 0 }, + ]); + }, + }, + ut = new Array(9); + (ut[1] = function () { + var e = this.offset + this.relativeOffset, + t = this.parseUShort(); + return 1 === t + ? { + substFormat: 1, + coverage: this.parsePointer(oe.coverage), + deltaGlyphId: this.parseUShort(), + } + : 2 === t + ? { + substFormat: 2, + coverage: this.parsePointer(oe.coverage), + substitute: this.parseOffset16List(), + } + : void w.assert( + !1, + "0x" + e.toString(16) + ": lookup type 1 format must be 1 or 2." + ); + }), + (ut[2] = function () { + var e = this.parseUShort(); + return ( + w.argument( + 1 === e, + "GSUB Multiple Substitution Subtable identifier-format must be 1" + ), + { + substFormat: e, + coverage: this.parsePointer(oe.coverage), + sequences: this.parseListOfLists(), + } + ); + }), + (ut[3] = function () { + var e = this.parseUShort(); + return ( + w.argument( + 1 === e, + "GSUB Alternate Substitution Subtable identifier-format must be 1" + ), + { + substFormat: e, + coverage: this.parsePointer(oe.coverage), + alternateSets: this.parseListOfLists(), + } + ); + }), + (ut[4] = function () { + var e = this.parseUShort(); + return ( + w.argument( + 1 === e, + "GSUB ligature table identifier-format must be 1" + ), + { + substFormat: e, + coverage: this.parsePointer(oe.coverage), + ligatureSets: this.parseListOfLists(function () { + return { + ligGlyph: this.parseUShort(), + components: this.parseUShortList(this.parseUShort() - 1), + }; + }), + } + ); + }); + var lt = { sequenceIndex: oe.uShort, lookupListIndex: oe.uShort }; + (ut[5] = function () { + var e = this.offset + this.relativeOffset, + t = this.parseUShort(); + if (1 === t) + return { + substFormat: t, + coverage: this.parsePointer(oe.coverage), + ruleSets: this.parseListOfLists(function () { + var e = this.parseUShort(), + t = this.parseUShort(); + return { + input: this.parseUShortList(e - 1), + lookupRecords: this.parseRecordList(t, lt), + }; + }), + }; + if (2 === t) + return { + substFormat: t, + coverage: this.parsePointer(oe.coverage), + classDef: this.parsePointer(oe.classDef), + classSets: this.parseListOfLists(function () { + var e = this.parseUShort(), + t = this.parseUShort(); + return { + classes: this.parseUShortList(e - 1), + lookupRecords: this.parseRecordList(t, lt), + }; + }), + }; + if (3 === t) { + var r = this.parseUShort(), + n = this.parseUShort(); + return { + substFormat: t, + coverages: this.parseList(r, oe.pointer(oe.coverage)), + lookupRecords: this.parseRecordList(n, lt), + }; + } + w.assert( + !1, + "0x" + e.toString(16) + ": lookup type 5 format must be 1, 2 or 3." + ); + }), + (ut[6] = function () { + var e = this.offset + this.relativeOffset, + t = this.parseUShort(); + return 1 === t + ? { + substFormat: 1, + coverage: this.parsePointer(oe.coverage), + chainRuleSets: this.parseListOfLists(function () { + return { + backtrack: this.parseUShortList(), + input: this.parseUShortList(this.parseShort() - 1), + lookahead: this.parseUShortList(), + lookupRecords: this.parseRecordList(lt), + }; + }), + } + : 2 === t + ? { + substFormat: 2, + coverage: this.parsePointer(oe.coverage), + backtrackClassDef: this.parsePointer(oe.classDef), + inputClassDef: this.parsePointer(oe.classDef), + lookaheadClassDef: this.parsePointer(oe.classDef), + chainClassSet: this.parseListOfLists(function () { + return { + backtrack: this.parseUShortList(), + input: this.parseUShortList(this.parseShort() - 1), + lookahead: this.parseUShortList(), + lookupRecords: this.parseRecordList(lt), + }; + }), + } + : 3 === t + ? { + substFormat: 3, + backtrackCoverage: this.parseList(oe.pointer(oe.coverage)), + inputCoverage: this.parseList(oe.pointer(oe.coverage)), + lookaheadCoverage: this.parseList(oe.pointer(oe.coverage)), + lookupRecords: this.parseRecordList(lt), + } + : void w.assert( + !1, + "0x" + + e.toString(16) + + ": lookup type 6 format must be 1, 2 or 3." + ); + }), + (ut[7] = function () { + var e = this.parseUShort(); + w.argument( + 1 === e, + "GSUB Extension Substitution subtable identifier-format must be 1" + ); + var t = this.parseUShort(), + r = new oe(this.data, this.offset + this.parseULong()); + return { substFormat: 1, lookupType: t, extension: ut[t].call(r) }; + }), + (ut[8] = function () { + var e = this.parseUShort(); + return ( + w.argument( + 1 === e, + "GSUB Reverse Chaining Contextual Single Substitution Subtable identifier-format must be 1" + ), + { + substFormat: e, + coverage: this.parsePointer(oe.coverage), + backtrackCoverage: this.parseList(oe.pointer(oe.coverage)), + lookaheadCoverage: this.parseList(oe.pointer(oe.coverage)), + substitutes: this.parseUShortList(), + } + ); + }); + var pt = new Array(9); + (pt[1] = function (e) { + return 1 === e.substFormat + ? new $.Table("substitutionTable", [ + { name: "substFormat", type: "USHORT", value: 1 }, + { + name: "coverage", + type: "TABLE", + value: new $.Coverage(e.coverage), + }, + { name: "deltaGlyphID", type: "USHORT", value: e.deltaGlyphId }, + ]) + : new $.Table( + "substitutionTable", + [ + { name: "substFormat", type: "USHORT", value: 2 }, + { + name: "coverage", + type: "TABLE", + value: new $.Coverage(e.coverage), + }, + ].concat($.ushortList("substitute", e.substitute)) + ); + }), + (pt[2] = function (e) { + return ( + w.assert(1 === e.substFormat, "Lookup type 2 substFormat must be 1."), + new $.Table( + "substitutionTable", + [ + { name: "substFormat", type: "USHORT", value: 1 }, + { + name: "coverage", + type: "TABLE", + value: new $.Coverage(e.coverage), + }, + ].concat( + $.tableList("seqSet", e.sequences, function (e) { + return new $.Table( + "sequenceSetTable", + $.ushortList("sequence", e) + ); + }) + ) + ) + ); + }), + (pt[3] = function (e) { + return ( + w.assert(1 === e.substFormat, "Lookup type 3 substFormat must be 1."), + new $.Table( + "substitutionTable", + [ + { name: "substFormat", type: "USHORT", value: 1 }, + { + name: "coverage", + type: "TABLE", + value: new $.Coverage(e.coverage), + }, + ].concat( + $.tableList("altSet", e.alternateSets, function (e) { + return new $.Table( + "alternateSetTable", + $.ushortList("alternate", e) + ); + }) + ) + ) + ); + }), + (pt[4] = function (e) { + return ( + w.assert(1 === e.substFormat, "Lookup type 4 substFormat must be 1."), + new $.Table( + "substitutionTable", + [ + { name: "substFormat", type: "USHORT", value: 1 }, + { + name: "coverage", + type: "TABLE", + value: new $.Coverage(e.coverage), + }, + ].concat( + $.tableList("ligSet", e.ligatureSets, function (e) { + return new $.Table( + "ligatureSetTable", + $.tableList("ligature", e, function (e) { + return new $.Table( + "ligatureTable", + [ + { name: "ligGlyph", type: "USHORT", value: e.ligGlyph }, + ].concat( + $.ushortList( + "component", + e.components, + e.components.length + 1 + ) + ) + ); + }) + ); + }) + ) + ) + ); + }), + (pt[6] = function (e) { + if (1 === e.substFormat) + return new $.Table( + "chainContextTable", + [ + { name: "substFormat", type: "USHORT", value: e.substFormat }, + { + name: "coverage", + type: "TABLE", + value: new $.Coverage(e.coverage), + }, + ].concat( + $.tableList("chainRuleSet", e.chainRuleSets, function (e) { + return new $.Table( + "chainRuleSetTable", + $.tableList("chainRule", e, function (e) { + var r = $.ushortList( + "backtrackGlyph", + e.backtrack, + e.backtrack.length + ) + .concat( + $.ushortList("inputGlyph", e.input, e.input.length + 1) + ) + .concat( + $.ushortList( + "lookaheadGlyph", + e.lookahead, + e.lookahead.length + ) + ) + .concat( + $.ushortList("substitution", [], e.lookupRecords.length) + ); + return ( + e.lookupRecords.forEach(function (e, t) { + r = r + .concat({ + name: "sequenceIndex" + t, + type: "USHORT", + value: e.sequenceIndex, + }) + .concat({ + name: "lookupListIndex" + t, + type: "USHORT", + value: e.lookupListIndex, + }); + }), + new $.Table("chainRuleTable", r) + ); + }) + ); + }) + ) + ); + if (2 === e.substFormat) + w.assert(!1, "lookup type 6 format 2 is not yet supported."); + else if (3 === e.substFormat) { + var r = [ + { name: "substFormat", type: "USHORT", value: e.substFormat }, + ]; + return ( + r.push({ + name: "backtrackGlyphCount", + type: "USHORT", + value: e.backtrackCoverage.length, + }), + e.backtrackCoverage.forEach(function (e, t) { + r.push({ + name: "backtrackCoverage" + t, + type: "TABLE", + value: new $.Coverage(e), + }); + }), + r.push({ + name: "inputGlyphCount", + type: "USHORT", + value: e.inputCoverage.length, + }), + e.inputCoverage.forEach(function (e, t) { + r.push({ + name: "inputCoverage" + t, + type: "TABLE", + value: new $.Coverage(e), + }); + }), + r.push({ + name: "lookaheadGlyphCount", + type: "USHORT", + value: e.lookaheadCoverage.length, + }), + e.lookaheadCoverage.forEach(function (e, t) { + r.push({ + name: "lookaheadCoverage" + t, + type: "TABLE", + value: new $.Coverage(e), + }); + }), + r.push({ + name: "substitutionCount", + type: "USHORT", + value: e.lookupRecords.length, + }), + e.lookupRecords.forEach(function (e, t) { + r = r + .concat({ + name: "sequenceIndex" + t, + type: "USHORT", + value: e.sequenceIndex, + }) + .concat({ + name: "lookupListIndex" + t, + type: "USHORT", + value: e.lookupListIndex, + }); + }), + new $.Table("chainContextTable", r) + ); + } + w.assert(!1, "lookup type 6 format must be 1, 2 or 3."); + }); + var ct = { + parse: function (e, t) { + var r = new oe(e, (t = t || 0)), + n = r.parseVersion(1); + return ( + w.argument(1 === n || 1.1 === n, "Unsupported GSUB table version."), + 1 === n + ? { + version: n, + scripts: r.parseScriptList(), + features: r.parseFeatureList(), + lookups: r.parseLookupList(ut), + } + : { + version: n, + scripts: r.parseScriptList(), + features: r.parseFeatureList(), + lookups: r.parseLookupList(ut), + variations: r.parseFeatureVariationsList(), + } + ); + }, + make: function (e) { + return new $.Table("GSUB", [ + { name: "version", type: "ULONG", value: 65536 }, + { + name: "scripts", + type: "TABLE", + value: new $.ScriptList(e.scripts), + }, + { + name: "features", + type: "TABLE", + value: new $.FeatureList(e.features), + }, + { + name: "lookups", + type: "TABLE", + value: new $.LookupList(e.lookups, pt), + }, + ]); + }, + }; + var ht = { + parse: function (e, t) { + var r = new ie.Parser(e, t), + n = r.parseULong(); + w.argument(1 === n, "Unsupported META table version."), + r.parseULong(), + r.parseULong(); + for (var a = r.parseULong(), o = {}, s = 0; s < a; s++) { + var i = r.parseTag(), + u = r.parseULong(), + l = r.parseULong(), + p = I.UTF8(e, t + u, l); + o[i] = p; + } + return o; + }, + make: function (e) { + var t = Object.keys(e).length, + r = "", + n = 16 + 12 * t, + a = new $.Table("meta", [ + { name: "version", type: "ULONG", value: 1 }, + { name: "flags", type: "ULONG", value: 0 }, + { name: "offset", type: "ULONG", value: n }, + { name: "numTags", type: "ULONG", value: t }, + ]); + for (var o in e) { + var s = r.length; + (r += e[o]), + a.fields.push({ name: "tag " + o, type: "TAG", value: o }), + a.fields.push({ name: "offset " + o, type: "ULONG", value: n + s }), + a.fields.push({ + name: "length " + o, + type: "ULONG", + value: e[o].length, + }); + } + return ( + a.fields.push({ name: "stringPool", type: "CHARARRAY", value: r }), a + ); + }, + }; + function ft(e) { + return (Math.log(e) / Math.log(2)) | 0; + } + function dt(e) { + for (; e.length % 4 != 0; ) e.push(0); + for (var t = 0, r = 0; r < e.length; r += 4) + t += (e[r] << 24) + (e[r + 1] << 16) + (e[r + 2] << 8) + e[r + 3]; + return (t %= Math.pow(2, 32)); + } + function gt(e, t, r, n) { + return new $.Record("Table Record", [ + { name: "tag", type: "TAG", value: void 0 !== e ? e : "" }, + { name: "checkSum", type: "ULONG", value: void 0 !== t ? t : 0 }, + { name: "offset", type: "ULONG", value: void 0 !== r ? r : 0 }, + { name: "length", type: "ULONG", value: void 0 !== n ? n : 0 }, + ]); + } + function vt(e) { + var t = new $.Table("sfnt", [ + { name: "version", type: "TAG", value: "OTTO" }, + { name: "numTables", type: "USHORT", value: 0 }, + { name: "searchRange", type: "USHORT", value: 0 }, + { name: "entrySelector", type: "USHORT", value: 0 }, + { name: "rangeShift", type: "USHORT", value: 0 }, + ]); + (t.tables = e), (t.numTables = e.length); + var r = Math.pow(2, ft(t.numTables)); + (t.searchRange = 16 * r), + (t.entrySelector = ft(r)), + (t.rangeShift = 16 * t.numTables - t.searchRange); + for ( + var n = [], a = [], o = t.sizeOf() + gt().sizeOf() * t.numTables; + o % 4 != 0; + + ) + (o += 1), a.push({ name: "padding", type: "BYTE", value: 0 }); + for (var s = 0; s < e.length; s += 1) { + var i = e[s]; + w.argument( + 4 === i.tableName.length, + "Table name" + i.tableName + " is invalid." + ); + var u = i.sizeOf(), + l = gt(i.tableName, dt(i.encode()), o, u); + for ( + n.push({ name: l.tag + " Table Record", type: "RECORD", value: l }), + a.push({ name: i.tableName + " table", type: "RECORD", value: i }), + o += u, + w.argument( + !isNaN(o), + "Something went wrong calculating the offset." + ); + o % 4 != 0; + + ) + (o += 1), a.push({ name: "padding", type: "BYTE", value: 0 }); + } + return ( + n.sort(function (e, t) { + return e.value.tag > t.value.tag ? 1 : -1; + }), + (t.fields = t.fields.concat(n)), + (t.fields = t.fields.concat(a)), + t + ); + } + function mt(e, t, r) { + for (var n = 0; n < t.length; n += 1) { + var a = e.charToGlyphIndex(t[n]); + if (0 < a) return e.glyphs.get(a).getMetrics(); + } + return r; + } + var yt = { + make: vt, + fontToTable: function (e) { + for ( + var t, + r = [], + n = [], + a = [], + o = [], + s = [], + i = [], + u = [], + l = 0, + p = 0, + c = 0, + h = 0, + f = 0, + d = 0; + d < e.glyphs.length; + d += 1 + ) { + var g = e.glyphs.get(d), + v = 0 | g.unicode; + if (isNaN(g.advanceWidth)) + throw new Error( + "Glyph " + g.name + " (" + d + "): advanceWidth is not a number." + ); + (v < t || void 0 === t) && 0 < v && (t = v), l < v && (l = v); + var m = st.getUnicodeRange(v); + if (m < 32) p |= 1 << m; + else if (m < 64) c |= 1 << (m - 32); + else if (m < 96) h |= 1 << (m - 64); + else { + if (!(m < 123)) + throw new Error( + "Unicode ranges bits > 123 are reserved for internal usage" + ); + f |= 1 << (m - 96); + } + if (".notdef" !== g.name) { + var y = g.getMetrics(); + r.push(y.xMin), + n.push(y.yMin), + a.push(y.xMax), + o.push(y.yMax), + i.push(y.leftSideBearing), + u.push(y.rightSideBearing), + s.push(g.advanceWidth); + } + } + var b = { + xMin: Math.min.apply(null, r), + yMin: Math.min.apply(null, n), + xMax: Math.max.apply(null, a), + yMax: Math.max.apply(null, o), + advanceWidthMax: Math.max.apply(null, s), + advanceWidthAvg: (function (e) { + for (var t = 0, r = 0; r < e.length; r += 1) t += e[r]; + return t / e.length; + })(s), + minLeftSideBearing: Math.min.apply(null, i), + maxLeftSideBearing: Math.max.apply(null, i), + minRightSideBearing: Math.min.apply(null, u), + }; + (b.ascender = e.ascender), (b.descender = e.descender); + var S = ze.make({ + flags: 3, + unitsPerEm: e.unitsPerEm, + xMin: b.xMin, + yMin: b.yMin, + xMax: b.xMax, + yMax: b.yMax, + lowestRecPPEM: 3, + createdTimestamp: e.createdTimestamp, + }), + x = We.make({ + ascender: b.ascender, + descender: b.descender, + advanceWidthMax: b.advanceWidthMax, + minLeftSideBearing: b.minLeftSideBearing, + minRightSideBearing: b.minRightSideBearing, + xMaxExtent: b.maxLeftSideBearing + (b.xMax - b.xMin), + numberOfHMetrics: e.glyphs.length, + }), + T = Xe.make(e.glyphs.length), + k = st.make( + Object.assign( + { + xAvgCharWidth: Math.round(b.advanceWidthAvg), + usFirstCharIndex: t, + usLastCharIndex: l, + ulUnicodeRange1: p, + ulUnicodeRange2: c, + ulUnicodeRange3: h, + ulUnicodeRange4: f, + sTypoAscender: b.ascender, + sTypoDescender: b.descender, + sTypoLineGap: 0, + usWinAscent: b.yMax, + usWinDescent: Math.abs(b.yMin), + ulCodePageRange1: 1, + sxHeight: mt(e, "xyvw", { yMax: Math.round(b.ascender / 2) }) + .yMax, + sCapHeight: mt(e, "HIKLEFJMNTZBDPRAGOQSUVWXY", b).yMax, + usDefaultChar: e.hasChar(" ") ? 32 : 0, + usBreakChar: e.hasChar(" ") ? 32 : 0, + }, + e.tables.os2 + ) + ), + U = qe.make(e.glyphs), + O = ue.make(e.glyphs), + E = e.getEnglishName("fontFamily"), + R = e.getEnglishName("fontSubfamily"), + L = E + " " + R, + C = e.getEnglishName("postScriptName"); + C = C || E.replace(/\s/g, "") + "-" + R; + var w = {}; + for (var D in e.names) w[D] = e.names[D]; + w.uniqueID || + (w.uniqueID = { en: e.getEnglishName("manufacturer") + ":" + L }), + w.postScriptName || (w.postScriptName = { en: C }), + w.preferredFamily || (w.preferredFamily = e.names.fontFamily), + w.preferredSubfamily || + (w.preferredSubfamily = e.names.fontSubfamily); + var I = [], + M = at.make(w, I), + G = 0 < I.length ? _e.make(I) : void 0, + B = it.make(), + F = He.make(e.glyphs, { + version: e.getEnglishName("version"), + fullName: L, + familyName: E, + weightName: R, + postScriptName: C, + unitsPerEm: e.unitsPerEm, + fontBBox: [0, b.yMin, b.ascender, b.advanceWidthMax], + }), + A = + e.metas && 0 < Object.keys(e.metas).length + ? ht.make(e.metas) + : void 0, + P = [S, x, T, k, M, O, B, F, U]; + G && P.push(G), + e.tables.gsub && P.push(ct.make(e.tables.gsub)), + A && P.push(A); + for ( + var N = vt(P), H = dt(N.encode()), z = N.fields, W = !1, q = 0; + q < z.length; + q += 1 + ) + if ("head table" === z[q].name) { + (z[q].value.checkSumAdjustment = 2981146554 - H), (W = !0); + break; + } + if (!W) + throw new Error("Could not find head table with checkSum to adjust."); + return N; + }, + computeCheckSum: dt, + }; + function bt(e, t) { + for (var r = 0, n = e.length - 1; r <= n; ) { + var a = (r + n) >>> 1, + o = e[a].tag; + if (o === t) return a; + o < t ? (r = 1 + a) : (n = a - 1); + } + return -r - 1; + } + function St(e, t) { + for (var r = 0, n = e.length - 1; r <= n; ) { + var a = (r + n) >>> 1, + o = e[a]; + if (o === t) return a; + o < t ? (r = 1 + a) : (n = a - 1); + } + return -r - 1; + } + function xt(e, t) { + for (var r, n = 0, a = e.length - 1; n <= a; ) { + var o = (n + a) >>> 1, + s = (r = e[o]).start; + if (s === t) return r; + s < t ? (n = 1 + o) : (a = o - 1); + } + if (0 < n) return t > (r = e[n - 1]).end ? 0 : r; + } + function Tt(e, t) { + (this.font = e), (this.tableName = t); + } + function kt(e) { + Tt.call(this, e, "gpos"); + } + function Ut(e) { + Tt.call(this, e, "gsub"); + } + function Ot(e, t) { + var r = e.length; + if (r === t.length) { + for (var n = 0; n < r; n++) if (e[n] !== t[n]) return; + return 1; + } + } + function Et(e, t, r) { + for (var n = e.subtables, a = 0; a < n.length; a++) { + var o = n[a]; + if (o.substFormat === t) return o; + } + if (r) return n.push(r), r; + } + function Rt(e) { + for ( + var t = new ArrayBuffer(e.length), r = new Uint8Array(t), n = 0; + n < e.length; + ++n + ) + r[n] = e[n]; + return t; + } + function Lt(e, t) { + if (!e) throw t; + } + function Ct(e, t, r, n, a) { + var o; + return (o = + 0 < (t & n) + ? ((o = e.parseByte()), 0 == (t & a) && (o = -o), r + o) + : 0 < (t & a) + ? r + : r + e.parseShort()); + } + function wt(e, t, r) { + var n, + a, + o = new ie.Parser(t, r); + if ( + ((e.numberOfContours = o.parseShort()), + (e._xMin = o.parseShort()), + (e._yMin = o.parseShort()), + (e._xMax = o.parseShort()), + (e._yMax = o.parseShort()), + 0 < e.numberOfContours) + ) { + for ( + var s = (e.endPointIndices = []), i = 0; + i < e.numberOfContours; + i += 1 + ) + s.push(o.parseUShort()); + (e.instructionLength = o.parseUShort()), (e.instructions = []); + for (var u = 0; u < e.instructionLength; u += 1) + e.instructions.push(o.parseByte()); + var l = s[s.length - 1] + 1; + n = []; + for (var p = 0; p < l; p += 1) + if (((a = o.parseByte()), n.push(a), 0 < (8 & a))) + for (var c = o.parseByte(), h = 0; h < c; h += 1) + n.push(a), (p += 1); + if ((w.argument(n.length === l, "Bad flags."), 0 < s.length)) { + var f, + d = []; + if (0 < l) { + for (var g = 0; g < l; g += 1) + (a = n[g]), + ((f = {}).onCurve = !!(1 & a)), + (f.lastPointOfContour = 0 <= s.indexOf(g)), + d.push(f); + for (var v = 0, m = 0; m < l; m += 1) + (a = n[m]), ((f = d[m]).x = Ct(o, a, v, 2, 16)), (v = f.x); + for (var y = 0, b = 0; b < l; b += 1) + (a = n[b]), ((f = d[b]).y = Ct(o, a, y, 4, 32)), (y = f.y); + } + e.points = d; + } else e.points = []; + } else if (0 === e.numberOfContours) e.points = []; + else { + (e.isComposite = !0), (e.points = []), (e.components = []); + for (var S = !0; S; ) { + n = o.parseUShort(); + var x = { + glyphIndex: o.parseUShort(), + xScale: 1, + scale01: 0, + scale10: 0, + yScale: 1, + dx: 0, + dy: 0, + }; + 0 < (1 & n) + ? 0 < (2 & n) + ? ((x.dx = o.parseShort()), (x.dy = o.parseShort())) + : (x.matchedPoints = [o.parseUShort(), o.parseUShort()]) + : 0 < (2 & n) + ? ((x.dx = o.parseChar()), (x.dy = o.parseChar())) + : (x.matchedPoints = [o.parseByte(), o.parseByte()]), + 0 < (8 & n) + ? (x.xScale = x.yScale = o.parseF2Dot14()) + : 0 < (64 & n) + ? ((x.xScale = o.parseF2Dot14()), (x.yScale = o.parseF2Dot14())) + : 0 < (128 & n) && + ((x.xScale = o.parseF2Dot14()), + (x.scale01 = o.parseF2Dot14()), + (x.scale10 = o.parseF2Dot14()), + (x.yScale = o.parseF2Dot14())), + e.components.push(x), + (S = !!(32 & n)); + } + if (256 & n) { + (e.instructionLength = o.parseUShort()), (e.instructions = []); + for (var T = 0; T < e.instructionLength; T += 1) + e.instructions.push(o.parseByte()); + } + } + } + function Dt(e, t) { + for (var r = [], n = 0; n < e.length; n += 1) { + var a = e[n], + o = { + x: t.xScale * a.x + t.scale01 * a.y + t.dx, + y: t.scale10 * a.x + t.yScale * a.y + t.dy, + onCurve: a.onCurve, + lastPointOfContour: a.lastPointOfContour, + }; + r.push(o); + } + return r; + } + function It(e) { + var t = new B(); + if (!e) return t; + for ( + var r = (function (e) { + for (var t = [], r = [], n = 0; n < e.length; n += 1) { + var a = e[n]; + r.push(a), a.lastPointOfContour && (t.push(r), (r = [])); + } + return ( + w.argument( + 0 === r.length, + "There are still points left in the current contour." + ), + t + ); + })(e), + n = 0; + n < r.length; + ++n + ) { + var a = r[n], + o = null, + s = a[a.length - 1], + i = a[0]; + if (s.onCurve) t.moveTo(s.x, s.y); + else if (i.onCurve) t.moveTo(i.x, i.y); + else { + var u = { x: 0.5 * (s.x + i.x), y: 0.5 * (s.y + i.y) }; + t.moveTo(u.x, u.y); + } + for (var l = 0; l < a.length; ++l) + if (((o = s), (s = i), (i = a[(l + 1) % a.length]), s.onCurve)) + t.lineTo(s.x, s.y); + else { + var p = i; + o.onCurve || (s.x, o.x, s.y, o.y), + i.onCurve || (p = { x: 0.5 * (s.x + i.x), y: 0.5 * (s.y + i.y) }), + t.quadraticCurveTo(s.x, s.y, p.x, p.y); + } + t.closePath(); + } + return t; + } + function Mt(e, t) { + if (t.isComposite) + for (var r = 0; r < t.components.length; r += 1) { + var n = t.components[r], + a = e.get(n.glyphIndex); + if ((a.getPath(), a.points)) { + var o = void 0; + if (void 0 === n.matchedPoints) o = Dt(a.points, n); + else { + if ( + n.matchedPoints[0] > t.points.length - 1 || + n.matchedPoints[1] > a.points.length - 1 + ) + throw Error("Matched points out of range in " + t.name); + var s = t.points[n.matchedPoints[0]], + i = a.points[n.matchedPoints[1]], + u = { + xScale: n.xScale, + scale01: n.scale01, + scale10: n.scale10, + yScale: n.yScale, + dx: 0, + dy: 0, + }; + (i = Dt([i], u)[0]), + (u.dx = s.x - i.x), + (u.dy = s.y - i.y), + (o = Dt(a.points, u)); + } + t.points = t.points.concat(o); + } + } + return It(t.points); + } + ((kt.prototype = Tt.prototype = + { + searchTag: bt, + binSearch: St, + getTable: function (e) { + var t = this.font.tables[this.tableName]; + return ( + !t && + e && + (t = this.font.tables[this.tableName] = + this.createDefaultTable()), + t + ); + }, + getScriptNames: function () { + var e = this.getTable(); + return e + ? e.scripts.map(function (e) { + return e.tag; + }) + : []; + }, + getDefaultScriptName: function () { + var e = this.getTable(); + if (e) { + for (var t = !1, r = 0; r < e.scripts.length; r++) { + var n = e.scripts[r].tag; + if ("DFLT" === n) return n; + "latn" === n && (t = !0); + } + return t ? "latn" : void 0; + } + }, + getScriptTable: function (e, t) { + var r = this.getTable(t); + if (r) { + e = e || "DFLT"; + var n = r.scripts, + a = bt(r.scripts, e); + if (0 <= a) return n[a].script; + if (t) { + var o = { + tag: e, + script: { + defaultLangSys: { + reserved: 0, + reqFeatureIndex: 65535, + featureIndexes: [], + }, + langSysRecords: [], + }, + }; + return n.splice(-1 - a, 0, o), o.script; + } + } + }, + getLangSysTable: function (e, t, r) { + var n = this.getScriptTable(e, r); + if (n) { + if (!t || "dflt" === t || "DFLT" === t) return n.defaultLangSys; + var a = bt(n.langSysRecords, t); + if (0 <= a) return n.langSysRecords[a].langSys; + if (r) { + var o = { + tag: t, + langSys: { + reserved: 0, + reqFeatureIndex: 65535, + featureIndexes: [], + }, + }; + return n.langSysRecords.splice(-1 - a, 0, o), o.langSys; + } + } + }, + getFeatureTable: function (e, t, r, n) { + var a = this.getLangSysTable(e, t, n); + if (a) { + for ( + var o, + s = a.featureIndexes, + i = this.font.tables[this.tableName].features, + u = 0; + u < s.length; + u++ + ) + if ((o = i[s[u]]).tag === r) return o.feature; + if (n) { + var l = i.length; + return ( + w.assert( + 0 === l || r >= i[l - 1].tag, + "Features must be added in alphabetical order." + ), + (o = { tag: r, feature: { params: 0, lookupListIndexes: [] } }), + i.push(o), + s.push(l), + o.feature + ); + } + } + }, + getLookupTables: function (e, t, r, n, a) { + var o = this.getFeatureTable(e, t, r, a), + s = []; + if (o) { + for ( + var i, + u = o.lookupListIndexes, + l = this.font.tables[this.tableName].lookups, + p = 0; + p < u.length; + p++ + ) + (i = l[u[p]]).lookupType === n && s.push(i); + if (0 === s.length && a) { + i = { + lookupType: n, + lookupFlag: 0, + subtables: [], + markFilteringSet: void 0, + }; + var c = l.length; + return l.push(i), u.push(c), [i]; + } + } + return s; + }, + getGlyphClass: function (e, t) { + switch (e.format) { + case 1: + return e.startGlyph <= t && t < e.startGlyph + e.classes.length + ? e.classes[t - e.startGlyph] + : 0; + case 2: + var r = xt(e.ranges, t); + return r ? r.classId : 0; + } + }, + getCoverageIndex: function (e, t) { + switch (e.format) { + case 1: + var r = St(e.glyphs, t); + return 0 <= r ? r : -1; + case 2: + var n = xt(e.ranges, t); + return n ? n.index + t - n.start : -1; + } + }, + expandCoverage: function (e) { + if (1 === e.format) return e.glyphs; + for (var t = [], r = e.ranges, n = 0; n < r.length; n++) + for (var a = r[n], o = a.start, s = a.end, i = o; i <= s; i++) + t.push(i); + return t; + }, + }).init = function () { + var e = this.getDefaultScriptName(); + this.defaultKerningTables = this.getKerningTables(e); + }), + (kt.prototype.getKerningValue = function (e, t, r) { + for (var n = 0; n < e.length; n++) + for (var a = e[n].subtables, o = 0; o < a.length; o++) { + var s = a[o], + i = this.getCoverageIndex(s.coverage, t); + if (!(i < 0)) + switch (s.posFormat) { + case 1: + for (var u = s.pairSets[i], l = 0; l < u.length; l++) { + var p = u[l]; + if (p.secondGlyph === r) + return (p.value1 && p.value1.xAdvance) || 0; + } + break; + case 2: + var c = this.getGlyphClass(s.classDef1, t), + h = this.getGlyphClass(s.classDef2, r), + f = s.classRecords[c][h]; + return (f.value1 && f.value1.xAdvance) || 0; + } + } + return 0; + }), + (kt.prototype.getKerningTables = function (e, t) { + if (this.font.tables.gpos) return this.getLookupTables(e, t, "kern", 2); + }), + ((Ut.prototype = Tt.prototype).createDefaultTable = function () { + return { + version: 1, + scripts: [ + { + tag: "DFLT", + script: { + defaultLangSys: { + reserved: 0, + reqFeatureIndex: 65535, + featureIndexes: [], + }, + langSysRecords: [], + }, + }, + ], + features: [], + lookups: [], + }; + }), + (Ut.prototype.getSingle = function (e, t, r) { + for ( + var n = [], a = this.getLookupTables(t, r, e, 1), o = 0; + o < a.length; + o++ + ) + for (var s = a[o].subtables, i = 0; i < s.length; i++) { + var u = s[i], + l = this.expandCoverage(u.coverage), + p = void 0; + if (1 === u.substFormat) { + var c = u.deltaGlyphId; + for (p = 0; p < l.length; p++) { + var h = l[p]; + n.push({ sub: h, by: h + c }); + } + } else { + var f = u.substitute; + for (p = 0; p < l.length; p++) n.push({ sub: l[p], by: f[p] }); + } + } + return n; + }), + (Ut.prototype.getMultiple = function (e, t, r) { + for ( + var n = [], a = this.getLookupTables(t, r, e, 2), o = 0; + o < a.length; + o++ + ) + for (var s = a[o].subtables, i = 0; i < s.length; i++) { + var u = s[i], + l = this.expandCoverage(u.coverage), + p = void 0; + for (p = 0; p < l.length; p++) { + var c = l[p], + h = u.sequences[p]; + n.push({ sub: c, by: h }); + } + } + return n; + }), + (Ut.prototype.getAlternates = function (e, t, r) { + for ( + var n = [], a = this.getLookupTables(t, r, e, 3), o = 0; + o < a.length; + o++ + ) + for (var s = a[o].subtables, i = 0; i < s.length; i++) + for ( + var u = s[i], + l = this.expandCoverage(u.coverage), + p = u.alternateSets, + c = 0; + c < l.length; + c++ + ) + n.push({ sub: l[c], by: p[c] }); + return n; + }), + (Ut.prototype.getLigatures = function (e, t, r) { + for ( + var n = [], a = this.getLookupTables(t, r, e, 4), o = 0; + o < a.length; + o++ + ) + for (var s = a[o].subtables, i = 0; i < s.length; i++) + for ( + var u = s[i], + l = this.expandCoverage(u.coverage), + p = u.ligatureSets, + c = 0; + c < l.length; + c++ + ) + for (var h = l[c], f = p[c], d = 0; d < f.length; d++) { + var g = f[d]; + n.push({ sub: [h].concat(g.components), by: g.ligGlyph }); + } + return n; + }), + (Ut.prototype.addSingle = function (e, t, r, n) { + var a = Et(this.getLookupTables(r, n, e, 1, !0)[0], 2, { + substFormat: 2, + coverage: { format: 1, glyphs: [] }, + substitute: [], + }); + w.assert( + 1 === a.coverage.format, + "Single: unable to modify coverage table format " + a.coverage.format + ); + var o = t.sub, + s = this.binSearch(a.coverage.glyphs, o); + s < 0 && + ((s = -1 - s), + a.coverage.glyphs.splice(s, 0, o), + a.substitute.splice(s, 0, 0)), + (a.substitute[s] = t.by); + }), + (Ut.prototype.addMultiple = function (e, t, r, n) { + w.assert( + t.by instanceof Array && 1 < t.by.length, + 'Multiple: "by" must be an array of two or more ids' + ); + var a = Et(this.getLookupTables(r, n, e, 2, !0)[0], 1, { + substFormat: 1, + coverage: { format: 1, glyphs: [] }, + sequences: [], + }); + w.assert( + 1 === a.coverage.format, + "Multiple: unable to modify coverage table format " + + a.coverage.format + ); + var o = t.sub, + s = this.binSearch(a.coverage.glyphs, o); + s < 0 && + ((s = -1 - s), + a.coverage.glyphs.splice(s, 0, o), + a.sequences.splice(s, 0, 0)), + (a.sequences[s] = t.by); + }), + (Ut.prototype.addAlternate = function (e, t, r, n) { + var a = Et(this.getLookupTables(r, n, e, 3, !0)[0], 1, { + substFormat: 1, + coverage: { format: 1, glyphs: [] }, + alternateSets: [], + }); + w.assert( + 1 === a.coverage.format, + "Alternate: unable to modify coverage table format " + + a.coverage.format + ); + var o = t.sub, + s = this.binSearch(a.coverage.glyphs, o); + s < 0 && + ((s = -1 - s), + a.coverage.glyphs.splice(s, 0, o), + a.alternateSets.splice(s, 0, 0)), + (a.alternateSets[s] = t.by); + }), + (Ut.prototype.addLigature = function (e, t, r, n) { + var a = this.getLookupTables(r, n, e, 4, !0)[0], + o = a.subtables[0]; + o || + ((o = { + substFormat: 1, + coverage: { format: 1, glyphs: [] }, + ligatureSets: [], + }), + (a.subtables[0] = o)), + w.assert( + 1 === o.coverage.format, + "Ligature: unable to modify coverage table format " + + o.coverage.format + ); + var s = t.sub[0], + i = t.sub.slice(1), + u = { ligGlyph: t.by, components: i }, + l = this.binSearch(o.coverage.glyphs, s); + if (0 <= l) { + for (var p = o.ligatureSets[l], c = 0; c < p.length; c++) + if (Ot(p[c].components, i)) return; + p.push(u); + } else + (l = -1 - l), + o.coverage.glyphs.splice(l, 0, s), + o.ligatureSets.splice(l, 0, [u]); + }), + (Ut.prototype.getFeature = function (e, t, r) { + if (/ss\d\d/.test(e)) return this.getSingle(e, t, r); + switch (e) { + case "aalt": + case "salt": + return this.getSingle(e, t, r).concat(this.getAlternates(e, t, r)); + case "dlig": + case "liga": + case "rlig": + return this.getLigatures(e, t, r); + case "ccmp": + return this.getMultiple(e, t, r).concat(this.getLigatures(e, t, r)); + case "stch": + return this.getMultiple(e, t, r); + } + }), + (Ut.prototype.add = function (e, t, r, n) { + if (/ss\d\d/.test(e)) return this.addSingle(e, t, r, n); + switch (e) { + case "aalt": + case "salt": + return "number" == typeof t.by + ? this.addSingle(e, t, r, n) + : this.addAlternate(e, t, r, n); + case "dlig": + case "liga": + case "rlig": + return this.addLigature(e, t, r, n); + case "ccmp": + return t.by instanceof Array + ? this.addMultiple(e, t, r, n) + : this.addLigature(e, t, r, n); + } + }); + var Gt, + Bt, + Ft, + At, + Pt = { + getPath: It, + parse: function (e, t, r, n, a) { + return a.lowMemory + ? ((o = e), + (s = t), + (i = r), + (u = n), + (l = new Te.GlyphSet(u)), + (u._push = function (e) { + var t = i[e]; + t !== i[e + 1] + ? l.push(e, Te.ttfGlyphLoader(u, e, wt, o, s + t, Mt)) + : l.push(e, Te.glyphLoader(u, e)); + }), + l) + : (function (e, t, r, n) { + for ( + var a = new Te.GlyphSet(n), o = 0; + o < r.length - 1; + o += 1 + ) { + var s = r[o]; + s !== r[o + 1] + ? a.push(o, Te.ttfGlyphLoader(n, o, wt, e, t + s, Mt)) + : a.push(o, Te.glyphLoader(n, o)); + } + return a; + })(e, t, r, n); + var o, s, i, u, l; + }, + }; + function Nt(e) { + (this.font = e), + (this.getCommands = function (e) { + return Pt.getPath(e).commands; + }), + (this._fpgmState = this._prepState = void 0), + (this._errorState = 0); + } + function Ht(e) { + return e; + } + function zt(e) { + return Math.sign(e) * Math.round(Math.abs(e)); + } + function Wt(e) { + return (Math.sign(e) * Math.round(Math.abs(2 * e))) / 2; + } + function qt(e) { + return Math.sign(e) * (Math.round(Math.abs(e) + 0.5) - 0.5); + } + function _t(e) { + return Math.sign(e) * Math.ceil(Math.abs(e)); + } + function Xt(e) { + return Math.sign(e) * Math.floor(Math.abs(e)); + } + function Vt(e) { + var t = this.srPeriod, + r = this.srPhase, + n = 1; + return ( + e < 0 && ((e = -e), (n = -1)), + (e += this.srThreshold - r), + (e = Math.trunc(e / t) * t), + (e += r) < 0 ? r * n : e * n + ); + } + var Yt = { + x: 1, + y: 0, + axis: "x", + distance: function (e, t, r, n) { + return (r ? e.xo : e.x) - (n ? t.xo : t.x); + }, + interpolate: function (e, t, r, n) { + var a, o, s, i, u, l, p; + if (!n || n === this) + return ( + (a = e.xo - t.xo), + (o = e.xo - r.xo), + (u = t.x - t.xo), + (l = r.x - r.xo), + 0 === (p = (s = Math.abs(a)) + (i = Math.abs(o))) + ? void (e.x = e.xo + (u + l) / 2) + : void (e.x = e.xo + (u * i + l * s) / p) + ); + (a = n.distance(e, t, !0, !0)), + (o = n.distance(e, r, !0, !0)), + (u = n.distance(t, t, !1, !0)), + (l = n.distance(r, r, !1, !0)), + 0 !== (p = (s = Math.abs(a)) + (i = Math.abs(o))) + ? Yt.setRelative(e, e, (u * i + l * s) / p, n, !0) + : Yt.setRelative(e, e, (u + l) / 2, n, !0); + }, + normalSlope: Number.NEGATIVE_INFINITY, + setRelative: function (e, t, r, n, a) { + if (n && n !== this) { + var o = a ? t.xo : t.x, + s = a ? t.yo : t.y, + i = o + r * n.x, + u = s + r * n.y; + e.x = i + (e.y - u) / n.normalSlope; + } else e.x = (a ? t.xo : t.x) + r; + }, + slope: 0, + touch: function (e) { + e.xTouched = !0; + }, + touched: function (e) { + return e.xTouched; + }, + untouch: function (e) { + e.xTouched = !1; + }, + }, + jt = { + x: 0, + y: 1, + axis: "y", + distance: function (e, t, r, n) { + return (r ? e.yo : e.y) - (n ? t.yo : t.y); + }, + interpolate: function (e, t, r, n) { + var a, o, s, i, u, l, p; + if (!n || n === this) + return ( + (a = e.yo - t.yo), + (o = e.yo - r.yo), + (u = t.y - t.yo), + (l = r.y - r.yo), + 0 === (p = (s = Math.abs(a)) + (i = Math.abs(o))) + ? void (e.y = e.yo + (u + l) / 2) + : void (e.y = e.yo + (u * i + l * s) / p) + ); + (a = n.distance(e, t, !0, !0)), + (o = n.distance(e, r, !0, !0)), + (u = n.distance(t, t, !1, !0)), + (l = n.distance(r, r, !1, !0)), + 0 !== (p = (s = Math.abs(a)) + (i = Math.abs(o))) + ? jt.setRelative(e, e, (u * i + l * s) / p, n, !0) + : jt.setRelative(e, e, (u + l) / 2, n, !0); + }, + normalSlope: 0, + setRelative: function (e, t, r, n, a) { + if (n && n !== this) { + var o = a ? t.xo : t.x, + s = a ? t.yo : t.y, + i = o + r * n.x, + u = s + r * n.y; + e.y = u + n.normalSlope * (e.x - i); + } else e.y = (a ? t.yo : t.y) + r; + }, + slope: Number.POSITIVE_INFINITY, + touch: function (e) { + e.yTouched = !0; + }, + touched: function (e) { + return e.yTouched; + }, + untouch: function (e) { + e.yTouched = !1; + }, + }; + function Zt(e, t) { + (this.x = e), + (this.y = t), + (this.axis = void 0), + (this.slope = t / e), + (this.normalSlope = -e / t), + Object.freeze(this); + } + function Qt(e, t) { + var r = Math.sqrt(e * e + t * t); + return ( + (t /= r), + 1 === (e /= r) && 0 === t ? Yt : 0 === e && 1 === t ? jt : new Zt(e, t) + ); + } + function Kt(e, t, r, n) { + (this.x = this.xo = Math.round(64 * e) / 64), + (this.y = this.yo = Math.round(64 * t) / 64), + (this.lastPointOfContour = r), + (this.onCurve = n), + (this.prevPointOnContour = void 0), + (this.nextPointOnContour = void 0), + (this.xTouched = !1), + (this.yTouched = !1), + Object.preventExtensions(this); + } + Object.freeze(Yt), + Object.freeze(jt), + (Zt.prototype.distance = function (e, t, r, n) { + return ( + this.x * Yt.distance(e, t, r, n) + this.y * jt.distance(e, t, r, n) + ); + }), + (Zt.prototype.interpolate = function (e, t, r, n) { + var a, o, s, i, u, l, p; + (s = n.distance(e, t, !0, !0)), + (i = n.distance(e, r, !0, !0)), + (a = n.distance(t, t, !1, !0)), + (o = n.distance(r, r, !1, !0)), + 0 !== (p = (u = Math.abs(s)) + (l = Math.abs(i))) + ? this.setRelative(e, e, (a * l + o * u) / p, n, !0) + : this.setRelative(e, e, (a + o) / 2, n, !0); + }), + (Zt.prototype.setRelative = function (e, t, r, n, a) { + n = n || this; + var o = a ? t.xo : t.x, + s = a ? t.yo : t.y, + i = o + r * n.x, + u = s + r * n.y, + l = n.normalSlope, + p = this.slope, + c = e.x, + h = e.y; + (e.x = (p * c - l * i + u - h) / (p - l)), (e.y = p * (e.x - c) + h); + }), + (Zt.prototype.touch = function (e) { + (e.xTouched = !0), (e.yTouched = !0); + }), + (Kt.prototype.nextTouched = function (e) { + for (var t = this.nextPointOnContour; !e.touched(t) && t !== this; ) + t = t.nextPointOnContour; + return t; + }), + (Kt.prototype.prevTouched = function (e) { + for (var t = this.prevPointOnContour; !e.touched(t) && t !== this; ) + t = t.prevPointOnContour; + return t; + }); + var Jt = Object.freeze(new Kt(0, 0)), + $t = { + cvCutIn: 17 / 16, + deltaBase: 9, + deltaShift: 0.125, + loop: 1, + minDis: 1, + autoFlip: !0, + }; + function er(e, t) { + switch (((this.env = e), (this.stack = []), (this.prog = t), e)) { + case "glyf": + (this.zp0 = this.zp1 = this.zp2 = 1), + (this.rp0 = this.rp1 = this.rp2 = 0); + case "prep": + (this.fv = this.pv = this.dpv = Yt), (this.round = zt); + } + } + function tr(e) { + for ( + var t = (e.tZone = new Array(e.gZone.length)), r = 0; + r < t.length; + r++ + ) + t[r] = new Kt(0, 0); + } + function rr(e, t) { + var r, + n = e.prog, + a = e.ip, + o = 1; + do { + if (88 === (r = n[++a])) o++; + else if (89 === r) o--; + else if (64 === r) a += n[a + 1] + 1; + else if (65 === r) a += 2 * n[a + 1] + 1; + else if (176 <= r && r <= 183) a += r - 176 + 1; + else if (184 <= r && r <= 191) a += 2 * (r - 184 + 1); + else if (t && 1 === o && 27 === r) break; + } while (0 < o); + e.ip = a; + } + function nr(e, t) { + O.DEBUG && console.log(t.step, "SVTCA[" + e.axis + "]"), + (t.fv = t.pv = t.dpv = e); + } + function ar(e, t) { + O.DEBUG && console.log(t.step, "SPVTCA[" + e.axis + "]"), + (t.pv = t.dpv = e); + } + function or(e, t) { + O.DEBUG && console.log(t.step, "SFVTCA[" + e.axis + "]"), (t.fv = e); + } + function sr(e, t) { + var r, + n, + a = t.stack, + o = a.pop(), + s = a.pop(), + i = t.z2[o], + u = t.z1[s]; + O.DEBUG && console.log("SPVTL[" + e + "]", o, s), + (n = e ? ((r = i.y - u.y), u.x - i.x) : ((r = u.x - i.x), u.y - i.y)), + (t.pv = t.dpv = Qt(r, n)); + } + function ir(e, t) { + var r, + n, + a = t.stack, + o = a.pop(), + s = a.pop(), + i = t.z2[o], + u = t.z1[s]; + O.DEBUG && console.log("SFVTL[" + e + "]", o, s), + (n = e ? ((r = i.y - u.y), u.x - i.x) : ((r = u.x - i.x), u.y - i.y)), + (t.fv = Qt(r, n)); + } + function ur(e) { + O.DEBUG && console.log(e.step, "POP[]"), e.stack.pop(); + } + function lr(e, t) { + var r = t.stack.pop(), + n = t.z0[r], + a = t.fv, + o = t.pv; + O.DEBUG && console.log(t.step, "MDAP[" + e + "]", r); + var s = o.distance(n, Jt); + e && (s = t.round(s)), + a.setRelative(n, Jt, s, o), + a.touch(n), + (t.rp0 = t.rp1 = r); + } + function pr(e, t) { + var r, + n, + a, + o = t.z2, + s = o.length - 2; + O.DEBUG && console.log(t.step, "IUP[" + e.axis + "]"); + for (var i = 0; i < s; i++) + (r = o[i]), + e.touched(r) || + ((n = r.prevTouched(e)) !== r && + (n === (a = r.nextTouched(e)) && + e.setRelative(r, r, e.distance(n, n, !1, !0), e, !0), + e.interpolate(r, n, a, e))); + } + function cr(e, t) { + for ( + var r = t.stack, + n = e ? t.rp1 : t.rp2, + a = (e ? t.z0 : t.z1)[n], + o = t.fv, + s = t.pv, + i = t.loop, + u = t.z2; + i--; + + ) { + var l = r.pop(), + p = u[l], + c = s.distance(a, a, !1, !0); + o.setRelative(p, p, c, s), + o.touch(p), + O.DEBUG && + console.log( + t.step, + (1 < t.loop ? "loop " + (t.loop - i) + ": " : "") + + "SHP[" + + (e ? "rp1" : "rp2") + + "]", + l + ); + } + t.loop = 1; + } + function hr(e, t) { + var r = t.stack, + n = e ? t.rp1 : t.rp2, + a = (e ? t.z0 : t.z1)[n], + o = t.fv, + s = t.pv, + i = r.pop(), + u = t.z2[t.contours[i]], + l = u; + O.DEBUG && console.log(t.step, "SHC[" + e + "]", i); + for ( + var p = s.distance(a, a, !1, !0); + l !== a && o.setRelative(l, l, p, s), (l = l.nextPointOnContour) !== u; + + ); + } + function fr(e, t) { + var r, + n, + a = t.stack, + o = e ? t.rp1 : t.rp2, + s = (e ? t.z0 : t.z1)[o], + i = t.fv, + u = t.pv, + l = a.pop(); + switch ((O.DEBUG && console.log(t.step, "SHZ[" + e + "]", l), l)) { + case 0: + r = t.tZone; + break; + case 1: + r = t.gZone; + break; + default: + throw new Error("Invalid zone"); + } + for ( + var p = u.distance(s, s, !1, !0), c = r.length - 2, h = 0; + h < c; + h++ + ) + (n = r[h]), i.setRelative(n, n, p, u); + } + function dr(e, t) { + var r = t.stack, + n = r.pop() / 64, + a = r.pop(), + o = t.z1[a], + s = t.z0[t.rp0], + i = t.fv, + u = t.pv; + i.setRelative(o, s, n, u), + i.touch(o), + O.DEBUG && console.log(t.step, "MSIRP[" + e + "]", n, a), + (t.rp1 = t.rp0), + (t.rp2 = a), + e && (t.rp0 = a); + } + function gr(e, t) { + var r = t.stack, + n = r.pop(), + a = r.pop(), + o = t.z0[a], + s = t.fv, + i = t.pv, + u = t.cvt[n]; + O.DEBUG && console.log(t.step, "MIAP[" + e + "]", n, "(", u, ")", a); + var l = i.distance(o, Jt); + e && (Math.abs(l - u) < t.cvCutIn && (l = u), (l = t.round(l))), + s.setRelative(o, Jt, l, i), + 0 === t.zp0 && ((o.xo = o.x), (o.yo = o.y)), + s.touch(o), + (t.rp0 = t.rp1 = a); + } + function vr(e, t) { + var r = t.stack, + n = r.pop(), + a = t.z2[n]; + O.DEBUG && console.log(t.step, "GC[" + e + "]", n), + r.push(64 * t.dpv.distance(a, Jt, e, !1)); + } + function mr(e, t) { + var r = t.stack, + n = r.pop(), + a = r.pop(), + o = t.z1[n], + s = t.z0[a], + i = t.dpv.distance(s, o, e, e); + O.DEBUG && console.log(t.step, "MD[" + e + "]", n, a, "->", i), + t.stack.push(Math.round(64 * i)); + } + function yr(e, t) { + var r = t.stack, + n = r.pop(), + a = t.fv, + o = t.pv, + s = t.ppem, + i = t.deltaBase + 16 * (e - 1), + u = t.deltaShift, + l = t.z0; + O.DEBUG && console.log(t.step, "DELTAP[" + e + "]", n, r); + for (var p = 0; p < n; p++) { + var c = r.pop(), + h = r.pop(); + if (i + ((240 & h) >> 4) === s) { + var f = (15 & h) - 8; + 0 <= f && f++, + O.DEBUG && console.log(t.step, "DELTAPFIX", c, "by", f * u); + var d = l[c]; + a.setRelative(d, d, f * u, o); + } + } + } + function br(e, t) { + var r = t.stack, + n = r.pop(); + O.DEBUG && console.log(t.step, "ROUND[]"), r.push(64 * t.round(n / 64)); + } + function Sr(e, t) { + var r = t.stack, + n = r.pop(), + a = t.ppem, + o = t.deltaBase + 16 * (e - 1), + s = t.deltaShift; + O.DEBUG && console.log(t.step, "DELTAC[" + e + "]", n, r); + for (var i = 0; i < n; i++) { + var u = r.pop(), + l = r.pop(); + if (o + ((240 & l) >> 4) === a) { + var p = (15 & l) - 8; + 0 <= p && p++; + var c = p * s; + O.DEBUG && console.log(t.step, "DELTACFIX", u, "by", c), + (t.cvt[u] += c); + } + } + } + function xr(e, t) { + var r, + n, + a = t.stack, + o = a.pop(), + s = a.pop(), + i = t.z2[o], + u = t.z1[s]; + O.DEBUG && console.log(t.step, "SDPVTL[" + e + "]", o, s), + (n = e ? ((r = i.y - u.y), u.x - i.x) : ((r = u.x - i.x), u.y - i.y)), + (t.dpv = Qt(r, n)); + } + function Tr(e, t) { + var r = t.stack, + n = t.prog, + a = t.ip; + O.DEBUG && console.log(t.step, "PUSHB[" + e + "]"); + for (var o = 0; o < e; o++) r.push(n[++a]); + t.ip = a; + } + function kr(e, t) { + var r = t.ip, + n = t.prog, + a = t.stack; + O.DEBUG && console.log(t.ip, "PUSHW[" + e + "]"); + for (var o = 0; o < e; o++) { + var s = (n[++r] << 8) | n[++r]; + 32768 & s && (s = -(1 + (65535 ^ s))), a.push(s); + } + t.ip = r; + } + function Ur(e, t, r, n, a, o) { + var s, + i, + u, + l, + p = o.stack, + c = e && p.pop(), + h = p.pop(), + f = o.rp0, + d = o.z0[f], + g = o.z1[h], + v = o.minDis, + m = o.fv, + y = o.dpv; + (u = 0 <= (i = s = y.distance(g, d, !0, !0)) ? 1 : -1), + (i = Math.abs(i)), + e && ((l = o.cvt[c]), n && Math.abs(i - l) < o.cvCutIn && (i = l)), + r && i < v && (i = v), + n && (i = o.round(i)), + m.setRelative(g, d, u * i, y), + m.touch(g), + O.DEBUG && + console.log( + o.step, + (e ? "MIRP[" : "MDRP[") + + (t ? "M" : "m") + + (r ? ">" : "_") + + (n ? "R" : "_") + + (0 === a ? "Gr" : 1 === a ? "Bl" : 2 === a ? "Wh" : "") + + "]", + e ? c + "(" + o.cvt[c] + "," + l + ")" : "", + h, + "(d =", + s, + "->", + u * i, + ")" + ), + (o.rp1 = o.rp0), + (o.rp2 = h), + t && (o.rp0 = h); + } + function Or(e) { + (this.char = e), (this.state = {}), (this.activeState = null); + } + function Er(e, t, r) { + (this.contextName = r), (this.startIndex = e), (this.endOffset = t); + } + function Rr(e, t, r) { + (this.contextName = e), + (this.openRange = null), + (this.ranges = []), + (this.checkStart = t), + (this.checkEnd = r); + } + function Lr(e, t) { + (this.context = e), + (this.index = t), + (this.length = e.length), + (this.current = e[t]), + (this.backtrack = e.slice(0, t)), + (this.lookahead = e.slice(t + 1)); + } + function Cr(e) { + (this.eventId = e), (this.subscribers = []); + } + function wr(e) { + (this.tokens = []), + (this.registeredContexts = {}), + (this.contextCheckers = []), + (this.events = {}), + (this.registeredModifiers = []), + function (r) { + var n = this, + e = [ + "start", + "end", + "next", + "newToken", + "contextStart", + "contextEnd", + "insertToken", + "removeToken", + "removeRange", + "replaceToken", + "replaceRange", + "composeRUD", + "updateContextsRanges", + ]; + e.forEach(function (e) { + Object.defineProperty(n.events, e, { value: new Cr(e) }); + }), + r && + e.forEach(function (e) { + var t = r[e]; + "function" == typeof t && n.events[e].subscribe(t); + }), + [ + "insertToken", + "removeToken", + "removeRange", + "replaceToken", + "replaceRange", + "composeRUD", + ].forEach(function (e) { + n.events[e].subscribe(n.updateContextsRanges); + }); + }.call(this, e); + } + function Dr(e) { + return /[\u0600-\u065F\u066A-\u06D2\u06FA-\u06FF]/.test(e); + } + function Ir(e) { + return /[\u0630\u0690\u0621\u0631\u0661\u0671\u0622\u0632\u0672\u0692\u06C2\u0623\u0673\u0693\u06C3\u0624\u0694\u06C4\u0625\u0675\u0695\u06C5\u06E5\u0676\u0696\u06C6\u0627\u0677\u0697\u06C7\u0648\u0688\u0698\u06C8\u0689\u0699\u06C9\u068A\u06CA\u066B\u068B\u06CB\u068C\u068D\u06CD\u06FD\u068E\u06EE\u06FE\u062F\u068F\u06CF\u06EF]/.test( + e + ); + } + function Mr(e) { + return /[\u0600-\u0605\u060C-\u060E\u0610-\u061B\u061E\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/.test( + e + ); + } + function Gr(e) { + return /[A-z]/.test(e); + } + function Br(e) { + (this.font = e), (this.features = {}); + } + function Fr(e) { + (this.id = e.id), + (this.tag = e.tag), + (this.substitution = e.substitution); + } + function Ar(e, t) { + if (!e) return -1; + switch (t.format) { + case 1: + return t.glyphs.indexOf(e); + case 2: + for (var r = t.ranges, n = 0; n < r.length; n++) { + var a = r[n]; + if (e >= a.start && e <= a.end) { + var o = e - a.start; + return a.index + o; + } + } + break; + default: + return -1; + } + return -1; + } + function Pr(e, t) { + for (var r = [], n = 0; n < e.length; n++) { + var a = e[n], + o = t.current, + s = Ar((o = Array.isArray(o) ? o[0] : o), a); + -1 !== s && r.push(s); + } + return r.length !== e.length ? -1 : r; + } + (Nt.prototype.exec = function (e, t) { + if ("number" != typeof t) throw new Error("Point size is not a number!"); + if (!(2 < this._errorState)) { + var r = this.font, + n = this._prepState; + if (!n || n.ppem !== t) { + var a = this._fpgmState; + if (!a) { + (er.prototype = $t), + ((a = this._fpgmState = new er("fpgm", r.tables.fpgm)).funcs = + []), + (a.font = r), + O.DEBUG && (console.log("---EXEC FPGM---"), (a.step = -1)); + try { + Bt(a); + } catch (e) { + return ( + console.log("Hinting error in FPGM:" + e), + void (this._errorState = 3) + ); + } + } + (er.prototype = a), + ((n = this._prepState = new er("prep", r.tables.prep)).ppem = t); + var o = r.tables.cvt; + if (o) + for ( + var s = (n.cvt = new Array(o.length)), + i = t / r.unitsPerEm, + u = 0; + u < o.length; + u++ + ) + s[u] = o[u] * i; + else n.cvt = []; + O.DEBUG && (console.log("---EXEC PREP---"), (n.step = -1)); + try { + Bt(n); + } catch (e) { + this._errorState < 2 && console.log("Hinting error in PREP:" + e), + (this._errorState = 2); + } + } + if (!(1 < this._errorState)) + try { + return Ft(e, n); + } catch (e) { + return ( + this._errorState < 1 && + (console.log("Hinting error:" + e), + console.log("Note: further hinting errors are silenced")), + void (this._errorState = 1) + ); + } + } + }), + (Ft = function (e, t) { + var r, + n, + a, + o = t.ppem / t.font.unitsPerEm, + s = o, + i = e.components; + if (((er.prototype = t), i)) { + var u = t.font; + (n = []), (r = []); + for (var l = 0; l < i.length; l++) { + var p = i[l], + c = u.glyphs.get(p.glyphIndex); + (a = new er("glyf", c.instructions)), + O.DEBUG && + (console.log("---EXEC COMP " + l + "---"), (a.step = -1)), + At(c, a, o, s); + for ( + var h = Math.round(p.dx * o), + f = Math.round(p.dy * s), + d = a.gZone, + g = a.contours, + v = 0; + v < d.length; + v++ + ) { + var m = d[v]; + (m.xTouched = m.yTouched = !1), + (m.xo = m.x = m.x + h), + (m.yo = m.y = m.y + f); + } + var y = n.length; + n.push.apply(n, d); + for (var b = 0; b < g.length; b++) r.push(g[b] + y); + } + e.instructions && + !a.inhibitGridFit && + (((a = new er("glyf", e.instructions)).gZone = + a.z0 = + a.z1 = + a.z2 = + n), + (a.contours = r), + n.push(new Kt(0, 0), new Kt(Math.round(e.advanceWidth * o), 0)), + O.DEBUG && (console.log("---EXEC COMPOSITE---"), (a.step = -1)), + Bt(a), + (n.length -= 2)); + } else + (a = new er("glyf", e.instructions)), + O.DEBUG && (console.log("---EXEC GLYPH---"), (a.step = -1)), + At(e, a, o, s), + (n = a.gZone); + return n; + }), + (At = function (e, t, r, n) { + for ( + var a, + o, + s, + i = e.points || [], + u = i.length, + l = (t.gZone = t.z0 = t.z1 = t.z2 = []), + p = (t.contours = []), + c = 0; + c < u; + c++ + ) + (a = i[c]), + (l[c] = new Kt(a.x * r, a.y * n, a.lastPointOfContour, a.onCurve)); + for (var h = 0; h < u; h++) + (a = l[h]), + o || ((o = a), p.push(h)), + a.lastPointOfContour + ? (((a.nextPointOnContour = o).prevPointOnContour = a), + (o = void 0)) + : ((s = l[h + 1]), + ((a.nextPointOnContour = s).prevPointOnContour = a)); + if (!t.inhibitGridFit) { + if (O.DEBUG) { + console.log("PROCESSING GLYPH", t.stack); + for (var f = 0; f < u; f++) console.log(f, l[f].x, l[f].y); + } + if ( + (l.push(new Kt(0, 0), new Kt(Math.round(e.advanceWidth * r), 0)), + Bt(t), + (l.length -= 2), + O.DEBUG) + ) { + console.log("FINISHED GLYPH", t.stack); + for (var d = 0; d < u; d++) console.log(d, l[d].x, l[d].y); + } + } + }), + (Bt = function (e) { + var t = e.prog; + if (t) { + var r, + n = t.length; + for (e.ip = 0; e.ip < n; e.ip++) { + if ((O.DEBUG && e.step++, !(r = Gt[t[e.ip]]))) + throw new Error( + "unknown instruction: 0x" + Number(t[e.ip]).toString(16) + ); + r(e); + } + } + }), + (Gt = [ + nr.bind(void 0, jt), + nr.bind(void 0, Yt), + ar.bind(void 0, jt), + ar.bind(void 0, Yt), + or.bind(void 0, jt), + or.bind(void 0, Yt), + sr.bind(void 0, 0), + sr.bind(void 0, 1), + ir.bind(void 0, 0), + ir.bind(void 0, 1), + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "SPVFS[]", r, n), + (e.pv = e.dpv = Qt(n, r)); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "SPVFS[]", r, n), (e.fv = Qt(n, r)); + }, + function (e) { + var t = e.stack, + r = e.pv; + O.DEBUG && console.log(e.step, "GPV[]"), + t.push(16384 * r.x), + t.push(16384 * r.y); + }, + function (e) { + var t = e.stack, + r = e.fv; + O.DEBUG && console.log(e.step, "GFV[]"), + t.push(16384 * r.x), + t.push(16384 * r.y); + }, + function (e) { + (e.fv = e.pv), O.DEBUG && console.log(e.step, "SFVTPV[]"); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(), + a = t.pop(), + o = t.pop(), + s = t.pop(), + i = e.z0, + u = e.z1, + l = i[r], + p = i[n], + c = u[a], + h = u[o], + f = e.z2[s]; + O.DEBUG && console.log("ISECT[], ", r, n, a, o, s); + var d = l.x, + g = l.y, + v = p.x, + m = p.y, + y = c.x, + b = c.y, + S = h.x, + x = h.y, + T = (d - v) * (b - x) - (g - m) * (y - S), + k = d * m - g * v, + U = y * x - b * S; + (f.x = (k * (y - S) - U * (d - v)) / T), + (f.y = (k * (b - x) - U * (g - m)) / T); + }, + function (e) { + (e.rp0 = e.stack.pop()), + O.DEBUG && console.log(e.step, "SRP0[]", e.rp0); + }, + function (e) { + (e.rp1 = e.stack.pop()), + O.DEBUG && console.log(e.step, "SRP1[]", e.rp1); + }, + function (e) { + (e.rp2 = e.stack.pop()), + O.DEBUG && console.log(e.step, "SRP2[]", e.rp2); + }, + function (e) { + var t = e.stack.pop(); + switch ((O.DEBUG && console.log(e.step, "SZP0[]", t), (e.zp0 = t))) { + case 0: + e.tZone || tr(e), (e.z0 = e.tZone); + break; + case 1: + e.z0 = e.gZone; + break; + default: + throw new Error("Invalid zone pointer"); + } + }, + function (e) { + var t = e.stack.pop(); + switch ((O.DEBUG && console.log(e.step, "SZP1[]", t), (e.zp1 = t))) { + case 0: + e.tZone || tr(e), (e.z1 = e.tZone); + break; + case 1: + e.z1 = e.gZone; + break; + default: + throw new Error("Invalid zone pointer"); + } + }, + function (e) { + var t = e.stack.pop(); + switch ((O.DEBUG && console.log(e.step, "SZP2[]", t), (e.zp2 = t))) { + case 0: + e.tZone || tr(e), (e.z2 = e.tZone); + break; + case 1: + e.z2 = e.gZone; + break; + default: + throw new Error("Invalid zone pointer"); + } + }, + function (e) { + var t = e.stack.pop(); + switch ( + (O.DEBUG && console.log(e.step, "SZPS[]", t), + (e.zp0 = e.zp1 = e.zp2 = t), + t) + ) { + case 0: + e.tZone || tr(e), (e.z0 = e.z1 = e.z2 = e.tZone); + break; + case 1: + e.z0 = e.z1 = e.z2 = e.gZone; + break; + default: + throw new Error("Invalid zone pointer"); + } + }, + function (e) { + (e.loop = e.stack.pop()), + O.DEBUG && console.log(e.step, "SLOOP[]", e.loop); + }, + function (e) { + O.DEBUG && console.log(e.step, "RTG[]"), (e.round = zt); + }, + function (e) { + O.DEBUG && console.log(e.step, "RTHG[]"), (e.round = qt); + }, + function (e) { + var t = e.stack.pop(); + O.DEBUG && console.log(e.step, "SMD[]", t), (e.minDis = t / 64); + }, + function (e) { + O.DEBUG && console.log(e.step, "ELSE[]"), rr(e, !1); + }, + function (e) { + var t = e.stack.pop(); + O.DEBUG && console.log(e.step, "JMPR[]", t), (e.ip += t - 1); + }, + function (e) { + var t = e.stack.pop(); + O.DEBUG && console.log(e.step, "SCVTCI[]", t), (e.cvCutIn = t / 64); + }, + void 0, + void 0, + function (e) { + var t = e.stack; + O.DEBUG && console.log(e.step, "DUP[]"), t.push(t[t.length - 1]); + }, + ur, + function (e) { + O.DEBUG && console.log(e.step, "CLEAR[]"), (e.stack.length = 0); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "SWAP[]"), t.push(r), t.push(n); + }, + function (e) { + var t = e.stack; + O.DEBUG && console.log(e.step, "DEPTH[]"), t.push(t.length); + }, + function (e) { + var t = e.stack, + r = t.pop(); + O.DEBUG && console.log(e.step, "CINDEX[]", r), + t.push(t[t.length - r]); + }, + function (e) { + var t = e.stack, + r = t.pop(); + O.DEBUG && console.log(e.step, "MINDEX[]", r), + t.push(t.splice(t.length - r, 1)[0]); + }, + void 0, + void 0, + void 0, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "LOOPCALL[]", r, n); + var a = e.ip, + o = e.prog; + e.prog = e.funcs[r]; + for (var s = 0; s < n; s++) + Bt(e), + O.DEBUG && + console.log( + ++e.step, + s + 1 < n ? "next loopcall" : "done loopcall", + s + ); + (e.ip = a), (e.prog = o); + }, + function (e) { + var t = e.stack.pop(); + O.DEBUG && console.log(e.step, "CALL[]", t); + var r = e.ip, + n = e.prog; + (e.prog = e.funcs[t]), + Bt(e), + (e.ip = r), + (e.prog = n), + O.DEBUG && console.log(++e.step, "returning from", t); + }, + function (e) { + if ("fpgm" !== e.env) throw new Error("FDEF not allowed here"); + var t = e.stack, + r = e.prog, + n = e.ip, + a = t.pop(), + o = n; + for (O.DEBUG && console.log(e.step, "FDEF[]", a); 45 !== r[++n]; ); + (e.ip = n), (e.funcs[a] = r.slice(o + 1, n)); + }, + void 0, + lr.bind(void 0, 0), + lr.bind(void 0, 1), + pr.bind(void 0, jt), + pr.bind(void 0, Yt), + cr.bind(void 0, 0), + cr.bind(void 0, 1), + hr.bind(void 0, 0), + hr.bind(void 0, 1), + fr.bind(void 0, 0), + fr.bind(void 0, 1), + function (e) { + for ( + var t = e.stack, r = e.loop, n = e.fv, a = t.pop() / 64, o = e.z2; + r--; + + ) { + var s = t.pop(), + i = o[s]; + O.DEBUG && + console.log( + e.step, + (1 < e.loop ? "loop " + (e.loop - r) + ": " : "") + "SHPIX[]", + s, + a + ), + n.setRelative(i, i, a), + n.touch(i); + } + e.loop = 1; + }, + function (e) { + for ( + var t = e.stack, + r = e.rp1, + n = e.rp2, + a = e.loop, + o = e.z0[r], + s = e.z1[n], + i = e.fv, + u = e.dpv, + l = e.z2; + a--; + + ) { + var p = t.pop(), + c = l[p]; + O.DEBUG && + console.log( + e.step, + (1 < e.loop ? "loop " + (e.loop - a) + ": " : "") + "IP[]", + p, + r, + "<->", + n + ), + i.interpolate(c, o, s, u), + i.touch(c); + } + e.loop = 1; + }, + dr.bind(void 0, 0), + dr.bind(void 0, 1), + function (e) { + for ( + var t = e.stack, + r = e.rp0, + n = e.z0[r], + a = e.loop, + o = e.fv, + s = e.pv, + i = e.z1; + a--; + + ) { + var u = t.pop(), + l = i[u]; + O.DEBUG && + console.log( + e.step, + (1 < e.loop ? "loop " + (e.loop - a) + ": " : "") + "ALIGNRP[]", + u + ), + o.setRelative(l, n, 0, s), + o.touch(l); + } + e.loop = 1; + }, + function (e) { + O.DEBUG && console.log(e.step, "RTDG[]"), (e.round = Wt); + }, + gr.bind(void 0, 0), + gr.bind(void 0, 1), + function (e) { + var t = e.prog, + r = e.ip, + n = e.stack, + a = t[++r]; + O.DEBUG && console.log(e.step, "NPUSHB[]", a); + for (var o = 0; o < a; o++) n.push(t[++r]); + e.ip = r; + }, + function (e) { + var t = e.ip, + r = e.prog, + n = e.stack, + a = r[++t]; + O.DEBUG && console.log(e.step, "NPUSHW[]", a); + for (var o = 0; o < a; o++) { + var s = (r[++t] << 8) | r[++t]; + 32768 & s && (s = -(1 + (65535 ^ s))), n.push(s); + } + e.ip = t; + }, + function (e) { + var t = e.stack, + r = e.store; + r = r || (e.store = []); + var n = t.pop(), + a = t.pop(); + O.DEBUG && console.log(e.step, "WS", n, a), (r[a] = n); + }, + function (e) { + var t = e.stack, + r = e.store, + n = t.pop(); + O.DEBUG && console.log(e.step, "RS", n); + var a = (r && r[n]) || 0; + t.push(a); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "WCVTP", r, n), (e.cvt[n] = r / 64); + }, + function (e) { + var t = e.stack, + r = t.pop(); + O.DEBUG && console.log(e.step, "RCVT", r), t.push(64 * e.cvt[r]); + }, + vr.bind(void 0, 0), + vr.bind(void 0, 1), + void 0, + mr.bind(void 0, 0), + mr.bind(void 0, 1), + function (e) { + O.DEBUG && console.log(e.step, "MPPEM[]"), e.stack.push(e.ppem); + }, + void 0, + function (e) { + O.DEBUG && console.log(e.step, "FLIPON[]"), (e.autoFlip = !0); + }, + void 0, + void 0, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "LT[]", r, n), t.push(n < r ? 1 : 0); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "LTEQ[]", r, n), + t.push(n <= r ? 1 : 0); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "GT[]", r, n), t.push(r < n ? 1 : 0); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "GTEQ[]", r, n), + t.push(r <= n ? 1 : 0); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "EQ[]", r, n), t.push(r === n ? 1 : 0); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "NEQ[]", r, n), + t.push(r !== n ? 1 : 0); + }, + function (e) { + var t = e.stack, + r = t.pop(); + O.DEBUG && console.log(e.step, "ODD[]", r), + t.push(Math.trunc(r) % 2 ? 1 : 0); + }, + function (e) { + var t = e.stack, + r = t.pop(); + O.DEBUG && console.log(e.step, "EVEN[]", r), + t.push(Math.trunc(r) % 2 ? 0 : 1); + }, + function (e) { + var t = e.stack.pop(); + O.DEBUG && console.log(e.step, "IF[]", t), + t || (rr(e, !0), O.DEBUG && console.log(e.step, "EIF[]")); + }, + function (e) { + O.DEBUG && console.log(e.step, "EIF[]"); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "AND[]", r, n), t.push(r && n ? 1 : 0); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "OR[]", r, n), t.push(r || n ? 1 : 0); + }, + function (e) { + var t = e.stack, + r = t.pop(); + O.DEBUG && console.log(e.step, "NOT[]", r), t.push(r ? 0 : 1); + }, + yr.bind(void 0, 1), + function (e) { + var t = e.stack.pop(); + O.DEBUG && console.log(e.step, "SDB[]", t), (e.deltaBase = t); + }, + function (e) { + var t = e.stack.pop(); + O.DEBUG && console.log(e.step, "SDS[]", t), + (e.deltaShift = Math.pow(0.5, t)); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "ADD[]", r, n), t.push(n + r); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "SUB[]", r, n), t.push(n - r); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "DIV[]", r, n), t.push((64 * n) / r); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "MUL[]", r, n), t.push((n * r) / 64); + }, + function (e) { + var t = e.stack, + r = t.pop(); + O.DEBUG && console.log(e.step, "ABS[]", r), t.push(Math.abs(r)); + }, + function (e) { + var t = e.stack, + r = t.pop(); + O.DEBUG && console.log(e.step, "NEG[]", r), t.push(-r); + }, + function (e) { + var t = e.stack, + r = t.pop(); + O.DEBUG && console.log(e.step, "FLOOR[]", r), + t.push(64 * Math.floor(r / 64)); + }, + function (e) { + var t = e.stack, + r = t.pop(); + O.DEBUG && console.log(e.step, "CEILING[]", r), + t.push(64 * Math.ceil(r / 64)); + }, + br.bind(void 0, 0), + br.bind(void 0, 1), + br.bind(void 0, 2), + br.bind(void 0, 3), + void 0, + void 0, + void 0, + void 0, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "WCVTF[]", r, n), + (e.cvt[n] = (r * e.ppem) / e.font.unitsPerEm); + }, + yr.bind(void 0, 2), + yr.bind(void 0, 3), + Sr.bind(void 0, 1), + Sr.bind(void 0, 2), + Sr.bind(void 0, 3), + function (e) { + var t, + r = e.stack.pop(); + switch ( + (O.DEBUG && console.log(e.step, "SROUND[]", r), + (e.round = Vt), + 192 & r) + ) { + case 0: + t = 0.5; + break; + case 64: + t = 1; + break; + case 128: + t = 2; + break; + default: + throw new Error("invalid SROUND value"); + } + switch (((e.srPeriod = t), 48 & r)) { + case 0: + e.srPhase = 0; + break; + case 16: + e.srPhase = 0.25 * t; + break; + case 32: + e.srPhase = 0.5 * t; + break; + case 48: + e.srPhase = 0.75 * t; + break; + default: + throw new Error("invalid SROUND value"); + } + (r &= 15), (e.srThreshold = 0 === r ? 0 : (r / 8 - 0.5) * t); + }, + function (e) { + var t, + r = e.stack.pop(); + switch ( + (O.DEBUG && console.log(e.step, "S45ROUND[]", r), + (e.round = Vt), + 192 & r) + ) { + case 0: + t = Math.sqrt(2) / 2; + break; + case 64: + t = Math.sqrt(2); + break; + case 128: + t = 2 * Math.sqrt(2); + break; + default: + throw new Error("invalid S45ROUND value"); + } + switch (((e.srPeriod = t), 48 & r)) { + case 0: + e.srPhase = 0; + break; + case 16: + e.srPhase = 0.25 * t; + break; + case 32: + e.srPhase = 0.5 * t; + break; + case 48: + e.srPhase = 0.75 * t; + break; + default: + throw new Error("invalid S45ROUND value"); + } + (r &= 15), (e.srThreshold = 0 === r ? 0 : (r / 8 - 0.5) * t); + }, + void 0, + void 0, + function (e) { + O.DEBUG && console.log(e.step, "ROFF[]"), (e.round = Ht); + }, + void 0, + function (e) { + O.DEBUG && console.log(e.step, "RUTG[]"), (e.round = _t); + }, + function (e) { + O.DEBUG && console.log(e.step, "RDTG[]"), (e.round = Xt); + }, + ur, + ur, + void 0, + void 0, + void 0, + void 0, + void 0, + function (e) { + var t = e.stack.pop(); + O.DEBUG && console.log(e.step, "SCANCTRL[]", t); + }, + xr.bind(void 0, 0), + xr.bind(void 0, 1), + function (e) { + var t = e.stack, + r = t.pop(), + n = 0; + O.DEBUG && console.log(e.step, "GETINFO[]", r), + 1 & r && (n = 35), + 32 & r && (n |= 4096), + t.push(n); + }, + void 0, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(), + a = t.pop(); + O.DEBUG && console.log(e.step, "ROLL[]"), + t.push(n), + t.push(r), + t.push(a); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "MAX[]", r, n), t.push(Math.max(n, r)); + }, + function (e) { + var t = e.stack, + r = t.pop(), + n = t.pop(); + O.DEBUG && console.log(e.step, "MIN[]", r, n), t.push(Math.min(n, r)); + }, + function (e) { + var t = e.stack.pop(); + O.DEBUG && console.log(e.step, "SCANTYPE[]", t); + }, + function (e) { + var t = e.stack.pop(), + r = e.stack.pop(); + switch ((O.DEBUG && console.log(e.step, "INSTCTRL[]", t, r), t)) { + case 1: + return void (e.inhibitGridFit = !!r); + case 2: + return void (e.ignoreCvt = !!r); + default: + throw new Error("invalid INSTCTRL[] selector"); + } + }, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + void 0, + Tr.bind(void 0, 1), + Tr.bind(void 0, 2), + Tr.bind(void 0, 3), + Tr.bind(void 0, 4), + Tr.bind(void 0, 5), + Tr.bind(void 0, 6), + Tr.bind(void 0, 7), + Tr.bind(void 0, 8), + kr.bind(void 0, 1), + kr.bind(void 0, 2), + kr.bind(void 0, 3), + kr.bind(void 0, 4), + kr.bind(void 0, 5), + kr.bind(void 0, 6), + kr.bind(void 0, 7), + kr.bind(void 0, 8), + Ur.bind(void 0, 0, 0, 0, 0, 0), + Ur.bind(void 0, 0, 0, 0, 0, 1), + Ur.bind(void 0, 0, 0, 0, 0, 2), + Ur.bind(void 0, 0, 0, 0, 0, 3), + Ur.bind(void 0, 0, 0, 0, 1, 0), + Ur.bind(void 0, 0, 0, 0, 1, 1), + Ur.bind(void 0, 0, 0, 0, 1, 2), + Ur.bind(void 0, 0, 0, 0, 1, 3), + Ur.bind(void 0, 0, 0, 1, 0, 0), + Ur.bind(void 0, 0, 0, 1, 0, 1), + Ur.bind(void 0, 0, 0, 1, 0, 2), + Ur.bind(void 0, 0, 0, 1, 0, 3), + Ur.bind(void 0, 0, 0, 1, 1, 0), + Ur.bind(void 0, 0, 0, 1, 1, 1), + Ur.bind(void 0, 0, 0, 1, 1, 2), + Ur.bind(void 0, 0, 0, 1, 1, 3), + Ur.bind(void 0, 0, 1, 0, 0, 0), + Ur.bind(void 0, 0, 1, 0, 0, 1), + Ur.bind(void 0, 0, 1, 0, 0, 2), + Ur.bind(void 0, 0, 1, 0, 0, 3), + Ur.bind(void 0, 0, 1, 0, 1, 0), + Ur.bind(void 0, 0, 1, 0, 1, 1), + Ur.bind(void 0, 0, 1, 0, 1, 2), + Ur.bind(void 0, 0, 1, 0, 1, 3), + Ur.bind(void 0, 0, 1, 1, 0, 0), + Ur.bind(void 0, 0, 1, 1, 0, 1), + Ur.bind(void 0, 0, 1, 1, 0, 2), + Ur.bind(void 0, 0, 1, 1, 0, 3), + Ur.bind(void 0, 0, 1, 1, 1, 0), + Ur.bind(void 0, 0, 1, 1, 1, 1), + Ur.bind(void 0, 0, 1, 1, 1, 2), + Ur.bind(void 0, 0, 1, 1, 1, 3), + Ur.bind(void 0, 1, 0, 0, 0, 0), + Ur.bind(void 0, 1, 0, 0, 0, 1), + Ur.bind(void 0, 1, 0, 0, 0, 2), + Ur.bind(void 0, 1, 0, 0, 0, 3), + Ur.bind(void 0, 1, 0, 0, 1, 0), + Ur.bind(void 0, 1, 0, 0, 1, 1), + Ur.bind(void 0, 1, 0, 0, 1, 2), + Ur.bind(void 0, 1, 0, 0, 1, 3), + Ur.bind(void 0, 1, 0, 1, 0, 0), + Ur.bind(void 0, 1, 0, 1, 0, 1), + Ur.bind(void 0, 1, 0, 1, 0, 2), + Ur.bind(void 0, 1, 0, 1, 0, 3), + Ur.bind(void 0, 1, 0, 1, 1, 0), + Ur.bind(void 0, 1, 0, 1, 1, 1), + Ur.bind(void 0, 1, 0, 1, 1, 2), + Ur.bind(void 0, 1, 0, 1, 1, 3), + Ur.bind(void 0, 1, 1, 0, 0, 0), + Ur.bind(void 0, 1, 1, 0, 0, 1), + Ur.bind(void 0, 1, 1, 0, 0, 2), + Ur.bind(void 0, 1, 1, 0, 0, 3), + Ur.bind(void 0, 1, 1, 0, 1, 0), + Ur.bind(void 0, 1, 1, 0, 1, 1), + Ur.bind(void 0, 1, 1, 0, 1, 2), + Ur.bind(void 0, 1, 1, 0, 1, 3), + Ur.bind(void 0, 1, 1, 1, 0, 0), + Ur.bind(void 0, 1, 1, 1, 0, 1), + Ur.bind(void 0, 1, 1, 1, 0, 2), + Ur.bind(void 0, 1, 1, 1, 0, 3), + Ur.bind(void 0, 1, 1, 1, 1, 0), + Ur.bind(void 0, 1, 1, 1, 1, 1), + Ur.bind(void 0, 1, 1, 1, 1, 2), + Ur.bind(void 0, 1, 1, 1, 1, 3), + ]), + (Or.prototype.setState = function (e, t) { + return ( + (this.state[e] = t), + (this.activeState = { key: e, value: this.state[e] }), + this.activeState + ); + }), + (Or.prototype.getState = function (e) { + return this.state[e] || null; + }), + (wr.prototype.inboundIndex = function (e) { + return 0 <= e && e < this.tokens.length; + }), + (wr.prototype.composeRUD = function (e) { + function t(e) { + return "object" == typeof e && e.hasOwnProperty("FAIL"); + } + var r = this, + n = e.map(function (e) { + return r[e[0]].apply(r, e.slice(1).concat(!0)); + }); + if (n.every(t)) + return { + FAIL: "composeRUD: one or more operations hasn't completed successfully", + report: n.filter(t), + }; + this.dispatch("composeRUD", [ + n.filter(function (e) { + return !t(e); + }), + ]); + }), + (wr.prototype.replaceRange = function (e, t, r, n) { + t = null !== t ? t : this.tokens.length; + var a = r.every(function (e) { + return e instanceof Or; + }); + if (!isNaN(e) && this.inboundIndex(e) && a) { + var o = this.tokens.splice.apply(this.tokens, [e, t].concat(r)); + return n || this.dispatch("replaceToken", [e, t, r]), [o, r]; + } + return { FAIL: "replaceRange: invalid tokens or startIndex." }; + }), + (wr.prototype.replaceToken = function (e, t, r) { + if (!isNaN(e) && this.inboundIndex(e) && t instanceof Or) { + var n = this.tokens.splice(e, 1, t); + return r || this.dispatch("replaceToken", [e, t]), [n[0], t]; + } + return { FAIL: "replaceToken: invalid token or index." }; + }), + (wr.prototype.removeRange = function (e, t, r) { + t = isNaN(t) ? this.tokens.length : t; + var n = this.tokens.splice(e, t); + return r || this.dispatch("removeRange", [n, e, t]), n; + }), + (wr.prototype.removeToken = function (e, t) { + if (isNaN(e) || !this.inboundIndex(e)) + return { FAIL: "removeToken: invalid token index." }; + var r = this.tokens.splice(e, 1); + return t || this.dispatch("removeToken", [r, e]), r; + }), + (wr.prototype.insertToken = function (e, t, r) { + return e.every(function (e) { + return e instanceof Or; + }) + ? (this.tokens.splice.apply(this.tokens, [t, 0].concat(e)), + r || this.dispatch("insertToken", [e, t]), + e) + : { FAIL: "insertToken: invalid token(s)." }; + }), + (wr.prototype.registerModifier = function (o, s, i) { + this.events.newToken.subscribe(function (e, t) { + var r = [e, t], + n = [e, t]; + if (null === s || !0 === s.apply(this, r)) { + var a = i.apply(this, n); + e.setState(o, a); + } + }), + this.registeredModifiers.push(o); + }), + (Cr.prototype.subscribe = function (e) { + return "function" == typeof e + ? this.subscribers.push(e) - 1 + : { FAIL: "invalid '" + this.eventId + "' event handler" }; + }), + (Cr.prototype.unsubscribe = function (e) { + this.subscribers.splice(e, 1); + }), + (Lr.prototype.setCurrentIndex = function (e) { + (this.index = e), + (this.current = this.context[e]), + (this.backtrack = this.context.slice(0, e)), + (this.lookahead = this.context.slice(e + 1)); + }), + (Lr.prototype.get = function (e) { + switch (!0) { + case 0 === e: + return this.current; + case e < 0 && Math.abs(e) <= this.backtrack.length: + return this.backtrack.slice(e)[0]; + case 0 < e && e <= this.lookahead.length: + return this.lookahead[e - 1]; + default: + return null; + } + }), + (wr.prototype.rangeToText = function (e) { + if (e instanceof Er) + return this.getRangeTokens(e) + .map(function (e) { + return e.char; + }) + .join(""); + }), + (wr.prototype.getText = function () { + return this.tokens + .map(function (e) { + return e.char; + }) + .join(""); + }), + (wr.prototype.getContext = function (e) { + var t = this.registeredContexts[e]; + return t || null; + }), + (wr.prototype.on = function (e, t) { + var r = this.events[e]; + return r ? r.subscribe(t) : null; + }), + (wr.prototype.dispatch = function (e, t) { + var r = this, + n = this.events[e]; + n instanceof Cr && + n.subscribers.forEach(function (e) { + e.apply(r, t || []); + }); + }), + (wr.prototype.registerContextChecker = function (e, t, r) { + if (this.getContext(e)) + return { FAIL: "context name '" + e + "' is already registered." }; + if ("function" != typeof t) + return { FAIL: "missing context start check." }; + if ("function" != typeof r) + return { FAIL: "missing context end check." }; + var n = new Rr(e, t, r); + return ( + (this.registeredContexts[e] = n), this.contextCheckers.push(n), n + ); + }), + (wr.prototype.getRangeTokens = function (e) { + var t = e.startIndex + e.endOffset; + return [].concat(this.tokens.slice(e.startIndex, t)); + }), + (wr.prototype.getContextRanges = function (e) { + var t = this.getContext(e); + return t + ? t.ranges + : { FAIL: "context checker '" + e + "' is not registered." }; + }), + (wr.prototype.resetContextsRanges = function () { + var e = this.registeredContexts; + for (var t in e) { + if (e.hasOwnProperty(t)) e[t].ranges = []; + } + }), + (wr.prototype.updateContextsRanges = function () { + this.resetContextsRanges(); + for ( + var e = this.tokens.map(function (e) { + return e.char; + }), + t = 0; + t < e.length; + t++ + ) { + var r = new Lr(e, t); + this.runContextCheck(r); + } + this.dispatch("updateContextsRanges", [this.registeredContexts]); + }), + (wr.prototype.setEndOffset = function (e, t) { + var r = new Er(this.getContext(t).openRange.startIndex, e, t), + n = this.getContext(t).ranges; + return ( + (r.rangeId = t + "." + n.length), + n.push(r), + (this.getContext(t).openRange = null), + r + ); + }), + (wr.prototype.runContextCheck = function (o) { + var s = this, + i = o.index; + this.contextCheckers.forEach(function (e) { + var t = e.contextName, + r = s.getContext(t).openRange; + if ( + (!r && + e.checkStart(o) && + ((r = new Er(i, null, t)), + (s.getContext(t).openRange = r), + s.dispatch("contextStart", [t, i])), + r && e.checkEnd(o)) + ) { + var n = i - r.startIndex + 1, + a = s.setEndOffset(n, t); + s.dispatch("contextEnd", [t, a]); + } + }); + }), + (wr.prototype.tokenize = function (e) { + (this.tokens = []), this.resetContextsRanges(); + var t = Array.from(e); + this.dispatch("start"); + for (var r = 0; r < t.length; r++) { + var n = t[r], + a = new Lr(t, r); + this.dispatch("next", [a]), this.runContextCheck(a); + var o = new Or(n); + this.tokens.push(o), this.dispatch("newToken", [o, a]); + } + return this.dispatch("end", [this.tokens]), this.tokens; + }), + (Br.prototype.getDefaultScriptFeaturesIndexes = function () { + for (var e = this.font.tables.gsub.scripts, t = 0; t < e.length; t++) { + var r = e[t]; + if ("DFLT" === r.tag) return r.script.defaultLangSys.featureIndexes; + } + return []; + }), + (Br.prototype.getScriptFeaturesIndexes = function (e) { + if (!this.font.tables.gsub) return []; + if (!e) return this.getDefaultScriptFeaturesIndexes(); + for (var t = this.font.tables.gsub.scripts, r = 0; r < t.length; r++) { + var n = t[r]; + if (n.tag === e && n.script.defaultLangSys) + return n.script.defaultLangSys.featureIndexes; + var a = n.langSysRecords; + if (a) + for (var o = 0; o < a.length; o++) { + var s = a[o]; + if (s.tag === e) return s.langSys.featureIndexes; + } + } + return this.getDefaultScriptFeaturesIndexes(); + }), + (Br.prototype.mapTagsToFeatures = function (e, t) { + for (var r = {}, n = 0; n < e.length; n++) { + var a = e[n].tag, + o = e[n].feature; + r[a] = o; + } + this.features[t].tags = r; + }), + (Br.prototype.getScriptFeatures = function (e) { + var t = this.features[e]; + if (this.features.hasOwnProperty(e)) return t; + var r = this.getScriptFeaturesIndexes(e); + if (!r) return null; + var n = this.font.tables.gsub; + return ( + (t = r.map(function (e) { + return n.features[e]; + })), + (this.features[e] = t), + this.mapTagsToFeatures(t, e), + t + ); + }), + (Br.prototype.getSubstitutionType = function (e, t) { + return e.lookupType.toString() + t.substFormat.toString(); + }), + (Br.prototype.getLookupMethod = function (e, t) { + var r = this; + switch (this.getSubstitutionType(e, t)) { + case "11": + return function (e) { + return function (e, t) { + return -1 === Ar(e, t.coverage) ? null : e + t.deltaGlyphId; + }.apply(r, [e, t]); + }; + case "12": + return function (e) { + return function (e, t) { + var r = Ar(e, t.coverage); + return -1 === r ? null : t.substitute[r]; + }.apply(r, [e, t]); + }; + case "63": + return function (e) { + return function (e, t) { + var r = + t.inputCoverage.length + + t.lookaheadCoverage.length + + t.backtrackCoverage.length; + if (e.context.length < r) return []; + var n = Pr(t.inputCoverage, e); + if (-1 === n) return []; + var a = t.inputCoverage.length - 1; + if (e.lookahead.length < t.lookaheadCoverage.length) return []; + for (var o = e.lookahead.slice(a); o.length && Mr(o[0].char); ) + o.shift(); + var s = new Lr(o, 0), + i = Pr(t.lookaheadCoverage, s), + u = [].concat(e.backtrack); + for (u.reverse(); u.length && Mr(u[0].char); ) u.shift(); + if (u.length < t.backtrackCoverage.length) return []; + var l = new Lr(u, 0), + p = Pr(t.backtrackCoverage, l), + c = []; + if ( + n.length === t.inputCoverage.length && + i.length === t.lookaheadCoverage.length && + p.length === t.backtrackCoverage.length + ) + for (var h = 0; h < t.lookupRecords.length; h++) + for ( + var f = t.lookupRecords[h].lookupListIndex, + d = this.getLookupByIndex(f), + g = 0; + g < d.subtables.length; + g++ + ) { + var v = d.subtables[g], + m = this.getLookupMethod(d, v); + if ("12" === this.getSubstitutionType(d, v)) + for (var y = 0; y < n.length; y++) { + var b = m(e.get(y)); + b && c.push(b); + } + } + return c; + }.apply(r, [e, t]); + }; + case "41": + return function (e) { + return function (e, t) { + var r, + n = Ar(e.current, t.coverage); + if (-1 === n) return null; + for (var a = t.ligatureSets[n], o = 0; o < a.length; o++) { + r = a[o]; + for (var s = 0; s < r.components.length; s++) { + if (e.lookahead[s] !== r.components[s]) break; + if (s === r.components.length - 1) return r; + } + } + return null; + }.apply(r, [e, t]); + }; + case "21": + return function (e) { + return function (e, t) { + var r = Ar(e, t.coverage); + return -1 === r ? null : t.sequences[r]; + }.apply(r, [e, t]); + }; + default: + throw new Error( + "lookupType: " + + e.lookupType + + " - substFormat: " + + t.substFormat + + " is not yet supported" + ); + } + }), + (Br.prototype.lookupFeature = function (e) { + var t = e.contextParams, + r = t.index, + n = this.getFeature({ tag: e.tag, script: e.script }); + if (!n) + return new Error( + "font '" + + this.font.names.fullName.en + + "' doesn't support feature '" + + e.tag + + "' for script '" + + e.script + + "'." + ); + for ( + var a = this.getFeatureLookups(n), o = [].concat(t.context), s = 0; + s < a.length; + s++ + ) + for ( + var i = a[s], u = this.getLookupSubtables(i), l = 0; + l < u.length; + l++ + ) { + var p = u[l], + c = this.getSubstitutionType(i, p), + h = this.getLookupMethod(i, p), + f = void 0; + switch (c) { + case "11": + (f = h(t.current)) && + o.splice( + r, + 1, + new Fr({ id: 11, tag: e.tag, substitution: f }) + ); + break; + case "12": + (f = h(t.current)) && + o.splice( + r, + 1, + new Fr({ id: 12, tag: e.tag, substitution: f }) + ); + break; + case "63": + (f = h(t)), + Array.isArray(f) && + f.length && + o.splice( + r, + 1, + new Fr({ id: 63, tag: e.tag, substitution: f }) + ); + break; + case "41": + (f = h(t)) && + o.splice( + r, + 1, + new Fr({ id: 41, tag: e.tag, substitution: f }) + ); + break; + case "21": + (f = h(t.current)) && + o.splice( + r, + 1, + new Fr({ id: 21, tag: e.tag, substitution: f }) + ); + } + (t = new Lr(o, r)), (Array.isArray(f) && !f.length) || (f = null); + } + return o.length ? o : null; + }), + (Br.prototype.supports = function (t) { + if (!t.script) return !1; + this.getScriptFeatures(t.script); + var e = this.features.hasOwnProperty(t.script); + if (!t.tag) return e; + var r = this.features[t.script].some(function (e) { + return e.tag === t.tag; + }); + return e && r; + }), + (Br.prototype.getLookupSubtables = function (e) { + return e.subtables || null; + }), + (Br.prototype.getLookupByIndex = function (e) { + return this.font.tables.gsub.lookups[e] || null; + }), + (Br.prototype.getFeatureLookups = function (e) { + return e.lookupListIndexes.map(this.getLookupByIndex.bind(this)); + }), + (Br.prototype.getFeature = function (e) { + if (!this.font) return { FAIL: "No font was found" }; + this.features.hasOwnProperty(e.script) || + this.getScriptFeatures(e.script); + var t = this.features[e.script]; + return t + ? t.tags[e.tag] + ? this.features[e.script].tags[e.tag] + : null + : { FAIL: "No feature for script " + e.script }; + }); + var Nr = { + startCheck: function (e) { + var t = e.current, + r = e.get(-1); + return (null === r && Dr(t)) || (!Dr(r) && Dr(t)); + }, + endCheck: function (e) { + var t = e.get(1); + return null === t || !Dr(t); + }, + }; + var Hr = { + startCheck: function (e) { + var t = e.current, + r = e.get(-1); + return (Dr(t) || Mr(t)) && !Dr(r); + }, + endCheck: function (e) { + var t = e.get(1); + switch (!0) { + case null === t: + return !0; + case !Dr(t) && !Mr(t): + var r = /\s/.test(t); + if (!r) return !0; + if (r) { + if ( + !e.lookahead.some(function (e) { + return Dr(e) || Mr(e); + }) + ) + return !0; + } + break; + default: + return !1; + } + }, + }; + var zr = { + 11: function (e, t, r) { + t[r].setState(e.tag, e.substitution); + }, + 12: function (e, t, r) { + t[r].setState(e.tag, e.substitution); + }, + 63: function (r, n, a) { + r.substitution.forEach(function (e, t) { + n[a + t].setState(r.tag, e); + }); + }, + 41: function (e, t, r) { + var n = t[r]; + n.setState(e.tag, e.substitution.ligGlyph); + for (var a = e.substitution.components.length, o = 0; o < a; o++) + (n = t[r + o + 1]).setState("deleted", !0); + }, + }; + function Wr(e, t, r) { + e instanceof Fr && zr[e.id] && zr[e.id](e, t, r); + } + function qr(e) { + var o = this, + s = this.featuresTags.arab, + i = this.tokenizer.getRangeTokens(e); + if (1 !== i.length) { + var u = new Lr( + i.map(function (e) { + return e.getState("glyphIndex"); + }), + 0 + ), + l = new Lr( + i.map(function (e) { + return e.char; + }), + 0 + ); + i.forEach(function (e, t) { + if (!Mr(e.char)) { + u.setCurrentIndex(t), l.setCurrentIndex(t); + var r, + n = 0; + switch ( + (!(function (e) { + for ( + var t = [].concat(e.backtrack), r = t.length - 1; + 0 <= r; + r-- + ) { + var n = t[r], + a = Ir(n), + o = Mr(n); + if (!a && !o) return 1; + if (a) return; + } + })(l) || (n |= 1), + (function (e) { + if (!Ir(e.current)) + for (var t = 0; t < e.lookahead.length; t++) { + if (!Mr(e.lookahead[t])) return 1; + } + })(l) && (n |= 2), + n) + ) { + case 1: + r = "fina"; + break; + case 2: + r = "init"; + break; + case 3: + r = "medi"; + } + if (-1 !== s.indexOf(r)) { + var a = o.query.lookupFeature({ + tag: r, + script: "arab", + contextParams: u, + }); + if (a instanceof Error) return console.info(a.message); + a.forEach(function (e, t) { + e instanceof Fr && + (Wr(e, i, t), (u.context[t] = e.substitution)); + }); + } + } + }); + } + } + function _r(e, t) { + return new Lr( + e.map(function (e) { + return e.activeState.value; + }), + t || 0 + ); + } + var Xr = { + startCheck: function (e) { + var t = e.current, + r = e.get(-1); + return (null === r && Gr(t)) || (!Gr(r) && Gr(t)); + }, + endCheck: function (e) { + var t = e.get(1); + return null === t || !Gr(t); + }, + }; + function Vr(e, t) { + return new Lr( + e.map(function (e) { + return e.activeState.value; + }), + t || 0 + ); + } + function Yr(e) { + (this.baseDir = e || "ltr"), + (this.tokenizer = new wr()), + (this.featuresTags = {}); + } + function jr(e) { + var t = this.contextChecks[e + "Check"]; + return this.tokenizer.registerContextChecker(e, t.startCheck, t.endCheck); + } + function Zr() { + if (-1 === this.tokenizer.registeredModifiers.indexOf("glyphIndex")) + throw new Error( + "glyphIndex modifier is required to apply arabic presentation features." + ); + } + function Qr() { + var t = this; + this.featuresTags.hasOwnProperty("arab") && + -1 !== this.featuresTags.arab.indexOf("rlig") && + (Zr.call(this), + this.tokenizer.getContextRanges("arabicWord").forEach(function (e) { + (function (e) { + var n = this, + a = this.tokenizer.getRangeTokens(e), + o = _r(a); + o.context.forEach(function (e, t) { + o.setCurrentIndex(t); + var r = n.query.lookupFeature({ + tag: "rlig", + script: "arab", + contextParams: o, + }); + r.length && + (r.forEach(function (e) { + return Wr(e, a, t); + }), + (o = _r(a))); + }); + }).call(t, e); + })); + } + function Kr() { + var t = this; + this.featuresTags.hasOwnProperty("latn") && + -1 !== this.featuresTags.latn.indexOf("liga") && + (Zr.call(this), + this.tokenizer.getContextRanges("latinWord").forEach(function (e) { + (function (e) { + var n = this, + a = this.tokenizer.getRangeTokens(e), + o = Vr(a); + o.context.forEach(function (e, t) { + o.setCurrentIndex(t); + var r = n.query.lookupFeature({ + tag: "liga", + script: "latn", + contextParams: o, + }); + r.length && + (r.forEach(function (e) { + return Wr(e, a, t); + }), + (o = Vr(a))); + }); + }).call(t, e); + })); + } + function Jr(e) { + ((e = e || {}).tables = e.tables || {}), + e.empty || + (Lt( + e.familyName, + "When creating a new Font object, familyName is required." + ), + Lt( + e.styleName, + "When creating a new Font object, styleName is required." + ), + Lt( + e.unitsPerEm, + "When creating a new Font object, unitsPerEm is required." + ), + Lt( + e.ascender, + "When creating a new Font object, ascender is required." + ), + Lt( + e.descender <= 0, + "When creating a new Font object, negative descender value is required." + ), + (this.names = { + fontFamily: { en: e.familyName || " " }, + fontSubfamily: { en: e.styleName || " " }, + fullName: { en: e.fullName || e.familyName + " " + e.styleName }, + postScriptName: { + en: + e.postScriptName || + (e.familyName + e.styleName).replace(/\s/g, ""), + }, + designer: { en: e.designer || " " }, + designerURL: { en: e.designerURL || " " }, + manufacturer: { en: e.manufacturer || " " }, + manufacturerURL: { en: e.manufacturerURL || " " }, + license: { en: e.license || " " }, + licenseURL: { en: e.licenseURL || " " }, + version: { en: e.version || "Version 0.1" }, + description: { en: e.description || " " }, + copyright: { en: e.copyright || " " }, + trademark: { en: e.trademark || " " }, + }), + (this.unitsPerEm = e.unitsPerEm || 1e3), + (this.ascender = e.ascender), + (this.descender = e.descender), + (this.createdTimestamp = e.createdTimestamp), + (this.tables = Object.assign(e.tables, { + os2: Object.assign( + { + usWeightClass: e.weightClass || this.usWeightClasses.MEDIUM, + usWidthClass: e.widthClass || this.usWidthClasses.MEDIUM, + fsSelection: e.fsSelection || this.fsSelectionValues.REGULAR, + }, + e.tables.os2 + ), + }))), + (this.supported = !0), + (this.glyphs = new Te.GlyphSet(this, e.glyphs || [])), + (this.encoding = new fe(this)), + (this.position = new kt(this)), + (this.substitution = new Ut(this)), + (this.tables = this.tables || {}), + (this._push = null), + (this._hmtxTableData = {}), + Object.defineProperty(this, "hinting", { + get: function () { + return this._hinting + ? this._hinting + : "truetype" === this.outlinesFormat + ? (this._hinting = new Nt(this)) + : void 0; + }, + }); + } + function $r(e, t) { + var r = JSON.stringify(e), + n = 256; + for (var a in t) { + var o = parseInt(a); + if (o && !(o < 256)) { + if (JSON.stringify(t[a]) === r) return o; + n <= o && (n = o + 1); + } + } + return (t[n] = e), n; + } + function en(e, t, r, n) { + for ( + var a = [ + { name: "nameID_" + e, type: "USHORT", value: $r(t.name, n) }, + { name: "flags_" + e, type: "USHORT", value: 0 }, + ], + o = 0; + o < r.length; + ++o + ) { + var s = r[o].tag; + a.push({ + name: "axis_" + e + " " + s, + type: "FIXED", + value: t.coordinates[s] << 16, + }); + } + return a; + } + function tn(e, t, r, n) { + var a = {}, + o = new ie.Parser(e, t); + (a.name = n[o.parseUShort()] || {}), + o.skip("uShort", 1), + (a.coordinates = {}); + for (var s = 0; s < r.length; ++s) + a.coordinates[r[s].tag] = o.parseFixed(); + return a; + } + (Yr.prototype.setText = function (e) { + this.text = e; + }), + (Yr.prototype.contextChecks = { + latinWordCheck: Xr, + arabicWordCheck: Nr, + arabicSentenceCheck: Hr, + }), + (Yr.prototype.registerFeatures = function (t, e) { + var r = this, + n = e.filter(function (e) { + return r.query.supports({ script: t, tag: e }); + }); + this.featuresTags.hasOwnProperty(t) + ? (this.featuresTags[t] = this.featuresTags[t].concat(n)) + : (this.featuresTags[t] = n); + }), + (Yr.prototype.applyFeatures = function (e, t) { + if (!e) throw new Error("No valid font was provided to apply features"); + this.query || (this.query = new Br(e)); + for (var r = 0; r < t.length; r++) { + var n = t[r]; + this.query.supports({ script: n.script }) && + this.registerFeatures(n.script, n.tags); + } + }), + (Yr.prototype.registerModifier = function (e, t, r) { + this.tokenizer.registerModifier(e, t, r); + }), + (Yr.prototype.checkContextReady = function (e) { + return !!this.tokenizer.getContext(e); + }), + (Yr.prototype.applyFeaturesToContexts = function () { + this.checkContextReady("arabicWord") && + (function () { + var t = this; + this.featuresTags.hasOwnProperty("arab") && + (Zr.call(this), + this.tokenizer + .getContextRanges("arabicWord") + .forEach(function (e) { + qr.call(t, e); + })); + }.call(this), + Qr.call(this)), + this.checkContextReady("latinWord") && Kr.call(this), + this.checkContextReady("arabicSentence") && + function () { + var r = this; + this.tokenizer + .getContextRanges("arabicSentence") + .forEach(function (e) { + var t = r.tokenizer.getRangeTokens(e); + r.tokenizer.replaceRange( + e.startIndex, + e.endOffset, + t.reverse() + ); + }); + }.call(this); + }), + (Yr.prototype.processText = function (e) { + (this.text && this.text === e) || + (this.setText(e), + function () { + return ( + jr.call(this, "latinWord"), + jr.call(this, "arabicWord"), + jr.call(this, "arabicSentence"), + this.tokenizer.tokenize(this.text) + ); + }.call(this), + this.applyFeaturesToContexts()); + }), + (Yr.prototype.getBidiText = function (e) { + return this.processText(e), this.tokenizer.getText(); + }), + (Yr.prototype.getTextGlyphs = function (e) { + this.processText(e); + for (var t = [], r = 0; r < this.tokenizer.tokens.length; r++) { + var n = this.tokenizer.tokens[r]; + if (!n.state.deleted) { + var a = n.activeState.value; + t.push(Array.isArray(a) ? a[0] : a); + } + } + return t; + }), + (Jr.prototype.hasChar = function (e) { + return null !== this.encoding.charToGlyphIndex(e); + }), + (Jr.prototype.charToGlyphIndex = function (e) { + return this.encoding.charToGlyphIndex(e); + }), + (Jr.prototype.charToGlyph = function (e) { + var t = this.charToGlyphIndex(e), + r = this.glyphs.get(t); + return (r = r || this.glyphs.get(0)); + }), + (Jr.prototype.updateFeatures = function (t) { + return this.defaultRenderOptions.features.map(function (e) { + return "latn" === e.script + ? { + script: "latn", + tags: e.tags.filter(function (e) { + return t[e]; + }), + } + : e; + }); + }), + (Jr.prototype.stringToGlyphs = function (e, t) { + var r = this, + n = new Yr(); + n.registerModifier("glyphIndex", null, function (e) { + return r.charToGlyphIndex(e.char); + }); + var a = t + ? this.updateFeatures(t.features) + : this.defaultRenderOptions.features; + n.applyFeatures(this, a); + for ( + var o = n.getTextGlyphs(e), + s = o.length, + i = new Array(s), + u = this.glyphs.get(0), + l = 0; + l < s; + l += 1 + ) + i[l] = this.glyphs.get(o[l]) || u; + return i; + }), + (Jr.prototype.nameToGlyphIndex = function (e) { + return this.glyphNames.nameToGlyphIndex(e); + }), + (Jr.prototype.nameToGlyph = function (e) { + var t = this.nameToGlyphIndex(e), + r = this.glyphs.get(t); + return (r = r || this.glyphs.get(0)); + }), + (Jr.prototype.glyphIndexToName = function (e) { + return this.glyphNames.glyphIndexToName + ? this.glyphNames.glyphIndexToName(e) + : ""; + }), + (Jr.prototype.getKerningValue = function (e, t) { + (e = e.index || e), (t = t.index || t); + var r = this.position.defaultKerningTables; + return r + ? this.position.getKerningValue(r, e, t) + : this.kerningPairs[e + "," + t] || 0; + }), + (Jr.prototype.defaultRenderOptions = { + kerning: !0, + features: [ + { script: "arab", tags: ["init", "medi", "fina", "rlig"] }, + { script: "latn", tags: ["liga", "rlig"] }, + ], + }), + (Jr.prototype.forEachGlyph = function (e, t, r, n, a, o) { + (t = void 0 !== t ? t : 0), + (r = void 0 !== r ? r : 0), + (n = void 0 !== n ? n : 72), + (a = Object.assign({}, this.defaultRenderOptions, a)); + var s, + i = (1 / this.unitsPerEm) * n, + u = this.stringToGlyphs(e, a); + if (a.kerning) { + var l = a.script || this.position.getDefaultScriptName(); + s = this.position.getKerningTables(l, a.language); + } + for (var p = 0; p < u.length; p += 1) { + var c = u[p]; + if ( + (o.call(this, c, t, r, n, a), + c.advanceWidth && (t += c.advanceWidth * i), + a.kerning && p < u.length - 1) + ) + t += + (s + ? this.position.getKerningValue(s, c.index, u[p + 1].index) + : this.getKerningValue(c, u[p + 1])) * i; + a.letterSpacing + ? (t += a.letterSpacing * n) + : a.tracking && (t += (a.tracking / 1e3) * n); + } + return t; + }), + (Jr.prototype.getPath = function (e, t, r, n, o) { + var s = new B(); + return ( + this.forEachGlyph(e, t, r, n, o, function (e, t, r, n) { + var a = e.getPath(t, r, n, o, this); + s.extend(a); + }), + s + ); + }), + (Jr.prototype.getPaths = function (e, t, r, n, o) { + var s = []; + return ( + this.forEachGlyph(e, t, r, n, o, function (e, t, r, n) { + var a = e.getPath(t, r, n, o, this); + s.push(a); + }), + s + ); + }), + (Jr.prototype.getAdvanceWidth = function (e, t, r) { + return this.forEachGlyph(e, 0, 0, t, r, function () {}); + }), + (Jr.prototype.draw = function (e, t, r, n, a, o) { + this.getPath(t, r, n, a, o).draw(e); + }), + (Jr.prototype.drawPoints = function (a, e, t, r, n, o) { + this.forEachGlyph(e, t, r, n, o, function (e, t, r, n) { + e.drawPoints(a, t, r, n); + }); + }), + (Jr.prototype.drawMetrics = function (a, e, t, r, n, o) { + this.forEachGlyph(e, t, r, n, o, function (e, t, r, n) { + e.drawMetrics(a, t, r, n); + }); + }), + (Jr.prototype.getEnglishName = function (e) { + var t = this.names[e]; + if (t) return t.en; + }), + (Jr.prototype.validate = function () { + var r = this; + function e(e) { + var t = r.getEnglishName(e); + t && t.trim().length; + } + e("fontFamily"), + e("weightName"), + e("manufacturer"), + e("copyright"), + e("version"), + this.unitsPerEm; + }), + (Jr.prototype.toTables = function () { + return yt.fontToTable(this); + }), + (Jr.prototype.toBuffer = function () { + return ( + console.warn( + "Font.toBuffer is deprecated. Use Font.toArrayBuffer instead." + ), + this.toArrayBuffer() + ); + }), + (Jr.prototype.toArrayBuffer = function () { + for ( + var e = this.toTables().encode(), + t = new ArrayBuffer(e.length), + r = new Uint8Array(t), + n = 0; + n < e.length; + n++ + ) + r[n] = e[n]; + return t; + }), + (Jr.prototype.download = function (e) { + var t = this.getEnglishName("fontFamily"), + r = this.getEnglishName("fontSubfamily"); + e = e || t.replace(/\s/g, "") + "-" + r + ".otf"; + var n = this.toArrayBuffer(); + if ("undefined" != typeof window) + if (((window.URL = window.URL || window.webkitURL), window.URL)) { + var a = new DataView(n), + o = new Blob([a], { type: "font/opentype" }), + s = document.createElement("a"); + (s.href = window.URL.createObjectURL(o)), (s.download = e); + var i = document.createEvent("MouseEvents"); + i.initEvent("click", !0, !1), s.dispatchEvent(i); + } else + console.warn( + "Font file could not be downloaded. Try using a different browser." + ); + else { + var u = require("fs"), + l = (function (e) { + for ( + var t = new Buffer(e.byteLength), r = new Uint8Array(e), n = 0; + n < t.length; + ++n + ) + t[n] = r[n]; + return t; + })(n); + u.writeFileSync(e, l); + } + }), + (Jr.prototype.fsSelectionValues = { + ITALIC: 1, + UNDERSCORE: 2, + NEGATIVE: 4, + OUTLINED: 8, + STRIKEOUT: 16, + BOLD: 32, + REGULAR: 64, + USER_TYPO_METRICS: 128, + WWS: 256, + OBLIQUE: 512, + }), + (Jr.prototype.usWidthClasses = { + ULTRA_CONDENSED: 1, + EXTRA_CONDENSED: 2, + CONDENSED: 3, + SEMI_CONDENSED: 4, + MEDIUM: 5, + SEMI_EXPANDED: 6, + EXPANDED: 7, + EXTRA_EXPANDED: 8, + ULTRA_EXPANDED: 9, + }), + (Jr.prototype.usWeightClasses = { + THIN: 100, + EXTRA_LIGHT: 200, + LIGHT: 300, + NORMAL: 400, + MEDIUM: 500, + SEMI_BOLD: 600, + BOLD: 700, + EXTRA_BOLD: 800, + BLACK: 900, + }); + function rn() { + return { + coverage: this.parsePointer(oe.coverage), + attachPoints: this.parseList(oe.pointer(oe.uShortList)), + }; + } + function nn() { + var e = this.parseUShort(); + return ( + w.argument( + 1 === e || 2 === e || 3 === e, + "Unsupported CaretValue table version." + ), + 1 === e + ? { coordinate: this.parseShort() } + : 2 === e + ? { pointindex: this.parseShort() } + : 3 === e + ? { coordinate: this.parseShort() } + : void 0 + ); + } + function an() { + return this.parseList(oe.pointer(nn)); + } + function on() { + return { + coverage: this.parsePointer(oe.coverage), + ligGlyphs: this.parseList(oe.pointer(an)), + }; + } + function sn() { + return this.parseUShort(), this.parseList(oe.pointer(oe.coverage)); + } + var un = { + make: function (e, t) { + var r, + n, + a, + o, + s = new $.Table("fvar", [ + { name: "version", type: "ULONG", value: 65536 }, + { name: "offsetToData", type: "USHORT", value: 0 }, + { name: "countSizePairs", type: "USHORT", value: 2 }, + { name: "axisCount", type: "USHORT", value: e.axes.length }, + { name: "axisSize", type: "USHORT", value: 20 }, + { + name: "instanceCount", + type: "USHORT", + value: e.instances.length, + }, + { + name: "instanceSize", + type: "USHORT", + value: 4 + 4 * e.axes.length, + }, + ]); + s.offsetToData = s.sizeOf(); + for (var i = 0; i < e.axes.length; i++) + s.fields = s.fields.concat( + ((r = i), + (n = e.axes[i]), + (a = t), + (o = $r(n.name, a)), + [ + { name: "tag_" + r, type: "TAG", value: n.tag }, + { name: "minValue_" + r, type: "FIXED", value: n.minValue << 16 }, + { + name: "defaultValue_" + r, + type: "FIXED", + value: n.defaultValue << 16, + }, + { name: "maxValue_" + r, type: "FIXED", value: n.maxValue << 16 }, + { name: "flags_" + r, type: "USHORT", value: 0 }, + { name: "nameID_" + r, type: "USHORT", value: o }, + ]) + ); + for (var u = 0; u < e.instances.length; u++) + s.fields = s.fields.concat(en(u, e.instances[u], e.axes, t)); + return s; + }, + parse: function (e, t, r) { + var n = new ie.Parser(e, t), + a = n.parseULong(); + w.argument(65536 === a, "Unsupported fvar table version."); + var o = n.parseOffset16(); + n.skip("uShort", 1); + for ( + var s, + i, + u, + l, + p, + c = n.parseUShort(), + h = n.parseUShort(), + f = n.parseUShort(), + d = n.parseUShort(), + g = [], + v = 0; + v < c; + v++ + ) + g.push( + ((s = e), + (i = t + o + v * h), + (u = r), + (p = l = void 0), + (l = {}), + (p = new ie.Parser(s, i)), + (l.tag = p.parseTag()), + (l.minValue = p.parseFixed()), + (l.defaultValue = p.parseFixed()), + (l.maxValue = p.parseFixed()), + p.skip("uShort", 1), + (l.name = u[p.parseUShort()] || {}), + l) + ); + for (var m = [], y = t + o + c * h, b = 0; b < f; b++) + m.push(tn(e, y + b * d, g, r)); + return { axes: g, instances: m }; + }, + }; + var ln = { + parse: function (e, t) { + var r = new oe(e, (t = t || 0)), + n = r.parseVersion(1); + w.argument( + 1 === n || 1.2 === n || 1.3 === n, + "Unsupported GDEF table version." + ); + var a = { + version: n, + classDef: r.parsePointer(oe.classDef), + attachList: r.parsePointer(rn), + ligCaretList: r.parsePointer(on), + markAttachClassDef: r.parsePointer(oe.classDef), + }; + return 1.2 <= n && (a.markGlyphSets = r.parsePointer(sn)), a; + }, + }, + pn = new Array(10); + (pn[1] = function () { + var e = this.offset + this.relativeOffset, + t = this.parseUShort(); + return 1 === t + ? { + posFormat: 1, + coverage: this.parsePointer(oe.coverage), + value: this.parseValueRecord(), + } + : 2 === t + ? { + posFormat: 2, + coverage: this.parsePointer(oe.coverage), + values: this.parseValueRecordList(), + } + : void w.assert( + !1, + "0x" + + e.toString(16) + + ": GPOS lookup type 1 format must be 1 or 2." + ); + }), + (pn[2] = function () { + var e = this.offset + this.relativeOffset, + t = this.parseUShort(); + w.assert( + 1 === t || 2 === t, + "0x" + e.toString(16) + ": GPOS lookup type 2 format must be 1 or 2." + ); + var r = this.parsePointer(oe.coverage), + n = this.parseUShort(), + a = this.parseUShort(); + if (1 === t) + return { + posFormat: t, + coverage: r, + valueFormat1: n, + valueFormat2: a, + pairSets: this.parseList( + oe.pointer( + oe.list(function () { + return { + secondGlyph: this.parseUShort(), + value1: this.parseValueRecord(n), + value2: this.parseValueRecord(a), + }; + }) + ) + ), + }; + if (2 === t) { + var o = this.parsePointer(oe.classDef), + s = this.parsePointer(oe.classDef), + i = this.parseUShort(), + u = this.parseUShort(); + return { + posFormat: t, + coverage: r, + valueFormat1: n, + valueFormat2: a, + classDef1: o, + classDef2: s, + class1Count: i, + class2Count: u, + classRecords: this.parseList( + i, + oe.list(u, function () { + return { + value1: this.parseValueRecord(n), + value2: this.parseValueRecord(a), + }; + }) + ), + }; + } + }), + (pn[3] = function () { + return { error: "GPOS Lookup 3 not supported" }; + }), + (pn[4] = function () { + return { error: "GPOS Lookup 4 not supported" }; + }), + (pn[5] = function () { + return { error: "GPOS Lookup 5 not supported" }; + }), + (pn[6] = function () { + return { error: "GPOS Lookup 6 not supported" }; + }), + (pn[7] = function () { + return { error: "GPOS Lookup 7 not supported" }; + }), + (pn[8] = function () { + return { error: "GPOS Lookup 8 not supported" }; + }), + (pn[9] = function () { + return { error: "GPOS Lookup 9 not supported" }; + }); + var cn = new Array(10); + var hn = { + parse: function (e, t) { + var r = new oe(e, (t = t || 0)), + n = r.parseVersion(1); + return ( + w.argument( + 1 === n || 1.1 === n, + "Unsupported GPOS table version " + n + ), + 1 === n + ? { + version: n, + scripts: r.parseScriptList(), + features: r.parseFeatureList(), + lookups: r.parseLookupList(pn), + } + : { + version: n, + scripts: r.parseScriptList(), + features: r.parseFeatureList(), + lookups: r.parseLookupList(pn), + variations: r.parseFeatureVariationsList(), + } + ); + }, + make: function (e) { + return new $.Table("GPOS", [ + { name: "version", type: "ULONG", value: 65536 }, + { + name: "scripts", + type: "TABLE", + value: new $.ScriptList(e.scripts), + }, + { + name: "features", + type: "TABLE", + value: new $.FeatureList(e.features), + }, + { + name: "lookups", + type: "TABLE", + value: new $.LookupList(e.lookups, cn), + }, + ]); + }, + }; + var fn = { + parse: function (e, t) { + var r = new ie.Parser(e, t), + n = r.parseUShort(); + if (0 === n) + return (function (e) { + var t = {}; + e.skip("uShort"); + var r = e.parseUShort(); + w.argument(0 === r, "Unsupported kern sub-table version."), + e.skip("uShort", 2); + var n = e.parseUShort(); + e.skip("uShort", 3); + for (var a = 0; a < n; a += 1) { + var o = e.parseUShort(), + s = e.parseUShort(), + i = e.parseShort(); + t[o + "," + s] = i; + } + return t; + })(r); + if (1 === n) + return (function (e) { + var t = {}; + e.skip("uShort"), + 1 < e.parseULong() && + console.warn("Only the first kern subtable is supported."), + e.skip("uLong"); + var r = 255 & e.parseUShort(); + if ((e.skip("uShort"), 0 == r)) { + var n = e.parseUShort(); + e.skip("uShort", 3); + for (var a = 0; a < n; a += 1) { + var o = e.parseUShort(), + s = e.parseUShort(), + i = e.parseShort(); + t[o + "," + s] = i; + } + } + return t; + })(r); + throw new Error("Unsupported kern table version (" + n + ")."); + }, + }; + var dn = { + parse: function (e, t, r, n) { + for ( + var a = new ie.Parser(e, t), + o = n ? a.parseUShort : a.parseULong, + s = [], + i = 0; + i < r + 1; + i += 1 + ) { + var u = o.call(a); + n && (u *= 2), s.push(u); + } + return s; + }, + }; + function gn(e, r) { + require("fs").readFile(e, function (e, t) { + if (e) return r(e.message); + r(null, Rt(t)); + }); + } + function vn(e, t) { + var r = new XMLHttpRequest(); + r.open("get", e, !0), + (r.responseType = "arraybuffer"), + (r.onload = function () { + return r.response + ? t(null, r.response) + : t("Font could not be loaded: " + r.statusText); + }), + (r.onerror = function () { + t("Font could not be loaded"); + }), + r.send(); + } + function mn(e, t) { + for (var r = [], n = 12, a = 0; a < t; a += 1) { + var o = ie.getTag(e, n), + s = ie.getULong(e, n + 4), + i = ie.getULong(e, n + 8), + u = ie.getULong(e, n + 12); + r.push({ tag: o, checksum: s, offset: i, length: u, compression: !1 }), + (n += 16); + } + return r; + } + function yn(e, t) { + if ("WOFF" !== t.compression) return { data: e, offset: t.offset }; + var r = new Uint8Array(e.buffer, t.offset + 2, t.compressedLength - 2), + n = new Uint8Array(t.length); + if ((a(r, n), n.byteLength !== t.length)) + throw new Error( + "Decompression error: " + + t.tag + + " decompressed length doesn't match recorded length" + ); + return { data: new DataView(n.buffer, 0), offset: 0 }; + } + function bn(e, t) { + var r, n; + t = null == t ? {} : t; + var a, + o, + s, + i, + u, + l, + p, + c, + h, + f, + d, + g, + v, + m = new Jr({ empty: !0 }), + y = new DataView(e, 0), + b = [], + S = ie.getTag(y, 0); + if (S === String.fromCharCode(0, 1, 0, 0) || "true" === S || "typ1" === S) + (m.outlinesFormat = "truetype"), (b = mn(y, (a = ie.getUShort(y, 4)))); + else if ("OTTO" === S) + (m.outlinesFormat = "cff"), (b = mn(y, (a = ie.getUShort(y, 4)))); + else { + if ("wOFF" !== S) + throw new Error("Unsupported OpenType signature " + S); + var x = ie.getTag(y, 4); + if (x === String.fromCharCode(0, 1, 0, 0)) + m.outlinesFormat = "truetype"; + else { + if ("OTTO" !== x) throw new Error("Unsupported OpenType flavor " + S); + m.outlinesFormat = "cff"; + } + b = (function (e, t) { + for (var r = [], n = 44, a = 0; a < t; a += 1) { + var o = ie.getTag(e, n), + s = ie.getULong(e, n + 4), + i = ie.getULong(e, n + 8), + u = ie.getULong(e, n + 12), + l = void 0; + (l = i < u && "WOFF"), + r.push({ + tag: o, + offset: s, + compression: l, + compressedLength: i, + length: u, + }), + (n += 20); + } + return r; + })(y, (a = ie.getUShort(y, 12))); + } + for (var T = 0; T < a; T += 1) { + var k = b[T], + U = void 0; + switch (k.tag) { + case "cmap": + (U = yn(y, k)), + (m.tables.cmap = ue.parse(U.data, U.offset)), + (m.encoding = new de(m.tables.cmap)); + break; + case "cvt ": + (U = yn(y, k)), + (v = new ie.Parser(U.data, U.offset)), + (m.tables.cvt = v.parseShortList(k.length / 2)); + break; + case "fvar": + s = k; + break; + case "fpgm": + (U = yn(y, k)), + (v = new ie.Parser(U.data, U.offset)), + (m.tables.fpgm = v.parseByteList(k.length)); + break; + case "head": + (U = yn(y, k)), + (m.tables.head = ze.parse(U.data, U.offset)), + (m.unitsPerEm = m.tables.head.unitsPerEm), + (r = m.tables.head.indexToLocFormat); + break; + case "hhea": + (U = yn(y, k)), + (m.tables.hhea = We.parse(U.data, U.offset)), + (m.ascender = m.tables.hhea.ascender), + (m.descender = m.tables.hhea.descender), + (m.numberOfHMetrics = m.tables.hhea.numberOfHMetrics); + break; + case "hmtx": + c = k; + break; + case "ltag": + (U = yn(y, k)), (n = _e.parse(U.data, U.offset)); + break; + case "maxp": + (U = yn(y, k)), + (m.tables.maxp = Xe.parse(U.data, U.offset)), + (m.numGlyphs = m.tables.maxp.numGlyphs); + break; + case "name": + d = k; + break; + case "OS/2": + (U = yn(y, k)), (m.tables.os2 = st.parse(U.data, U.offset)); + break; + case "post": + (U = yn(y, k)), + (m.tables.post = it.parse(U.data, U.offset)), + (m.glyphNames = new ve(m.tables.post)); + break; + case "prep": + (U = yn(y, k)), + (v = new ie.Parser(U.data, U.offset)), + (m.tables.prep = v.parseByteList(k.length)); + break; + case "glyf": + i = k; + break; + case "loca": + f = k; + break; + case "CFF ": + o = k; + break; + case "kern": + h = k; + break; + case "GDEF": + u = k; + break; + case "GPOS": + l = k; + break; + case "GSUB": + p = k; + break; + case "meta": + g = k; + } + } + var O = yn(y, d); + if ( + ((m.tables.name = at.parse(O.data, O.offset, n)), + (m.names = m.tables.name), + i && f) + ) { + var E = 0 === r, + R = yn(y, f), + L = dn.parse(R.data, R.offset, m.numGlyphs, E), + C = yn(y, i); + m.glyphs = Pt.parse(C.data, C.offset, L, m, t); + } else { + if (!o) + throw new Error("Font doesn't contain TrueType or CFF outlines."); + var w = yn(y, o); + He.parse(w.data, w.offset, m, t); + } + var D = yn(y, c); + if ( + (qe.parse( + m, + D.data, + D.offset, + m.numberOfHMetrics, + m.numGlyphs, + m.glyphs, + t + ), + me(m, t), + h) + ) { + var I = yn(y, h); + m.kerningPairs = fn.parse(I.data, I.offset); + } else m.kerningPairs = {}; + if (u) { + var M = yn(y, u); + m.tables.gdef = ln.parse(M.data, M.offset); + } + if (l) { + var G = yn(y, l); + (m.tables.gpos = hn.parse(G.data, G.offset)), m.position.init(); + } + if (p) { + var B = yn(y, p); + m.tables.gsub = ct.parse(B.data, B.offset); + } + if (s) { + var F = yn(y, s); + m.tables.fvar = un.parse(F.data, F.offset, m.names); + } + if (g) { + var A = yn(y, g); + (m.tables.meta = ht.parse(A.data, A.offset)), (m.metas = m.tables.meta); + } + return m; + } + function Sn(e, o, s) { + s = null == s ? {} : s; + var t = "undefined" == typeof window && !s.isUrl ? gn : vn; + return new Promise(function (n, a) { + t(e, function (e, t) { + if (e) { + if (o) return o(e); + a(e); + } + var r; + try { + r = bn(t, s); + } catch (e) { + if (o) return o(e, null); + a(e); + } + if (o) return o(null, r); + n(r); + }); + }); + } + function xn(e, t) { + return bn(Rt(require("fs").readFileSync(e)), t); + } + var Tn = Object.freeze({ + __proto__: null, + Font: Jr, + Glyph: be, + Path: B, + BoundingBox: R, + _parse: ie, + parse: bn, + load: Sn, + loadSync: xn, + }); + (O.BoundingBox = R), + (O.Font = Jr), + (O.Glyph = be), + (O.Path = B), + (O._parse = ie), + (O.default = Tn), + (O.load = Sn), + (O.loadSync = xn), + (O.parse = bn), + Object.defineProperty(O, "__esModule", { value: !0 }); + }); + //# sourceMappingURL=opentype.min.js.map +} diff --git a/manifest.json b/manifest.json index 8534f3d4..66e10786 100644 --- a/manifest.json +++ b/manifest.json @@ -43,6 +43,7 @@ "features/*", "/extras/feature/index.html", "/api/*", + "/libraries/*", "/extras/icons/*" ], "matches": [ From 94d69b03a8dddaa03bfc7731384fbe80c6df63e7 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 7 Jul 2024 09:24:31 -0700 Subject: [PATCH 085/253] Improve spacing for `more-editor-fonts` options --- features/more-editor-fonts/style.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/features/more-editor-fonts/style.css b/features/more-editor-fonts/style.css index ad12d909..030785e0 100644 --- a/features/more-editor-fonts/style.css +++ b/features/more-editor-fonts/style.css @@ -15,6 +15,9 @@ span.ste-font-option { padding-left: .5rem; border-radius: .5rem; cursor: pointer; + height: 3rem; + margin-bottom: .25rem; + margin-top: .25rem; } span.ste-font-option:hover { From 65650a3bf40d835d7fac024efc1d3bdbf39d6c6b Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 7 Jul 2024 14:41:19 -0400 Subject: [PATCH 086/253] Remove waitForElements --- features/align-to-center/script.js | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/features/align-to-center/script.js b/features/align-to-center/script.js index ae3cd5a7..7eef27f8 100644 --- a/features/align-to-center/script.js +++ b/features/align-to-center/script.js @@ -23,14 +23,6 @@ export default async function ({ feature, console }) { return textWidth; } - function clearCenterAlignment(textarea) { - const lines = textarea.value.split("\n"); - const uncenteredLines = lines.map((line) => { - return line.replace(/^\s+/, ""); - }); - textarea.value = uncenteredLines.join("\n"); - } - function centerAlignText() { const form = document.querySelector(".project-description-form"); if (form) { @@ -39,8 +31,6 @@ export default async function ({ feature, console }) { activeElement.tagName === "TEXTAREA" && form.contains(activeElement) ) { - clearCenterAlignment(activeElement); - const spaceWidth = getSpaceWidth(); const lines = activeElement.value.split("\n"); const centeredLines = lines.map((line) => { @@ -59,16 +49,4 @@ export default async function ({ feature, console }) { centerAlignText(); } }); - - await ScratchTools.waitForElements( - ".project-description-form textarea", - (textareas) => { - textareas.forEach((textarea) => { - textarea.addEventListener("input", function () { - centerAlignText(); - }); - }); - } - ); } - From 8fdde1c13ba549f5e20b56fff1d95a3c0541f00c Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 7 Jul 2024 14:50:13 -0400 Subject: [PATCH 087/253] More Fixes + Add back prevent multiple --- features/align-to-center/script.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/features/align-to-center/script.js b/features/align-to-center/script.js index 7eef27f8..1ebb0ae6 100644 --- a/features/align-to-center/script.js +++ b/features/align-to-center/script.js @@ -23,6 +23,14 @@ export default async function ({ feature, console }) { return textWidth; } + function clearCenterAlignment(textarea) { + const lines = textarea.value.split("\n"); + const uncenteredLines = lines.map((line) => { + return line.replace(/^\s+/, ""); + }); + textarea.value = uncenteredLines.join("\n"); + } + function centerAlignText() { const form = document.querySelector(".project-description-form"); if (form) { @@ -31,6 +39,8 @@ export default async function ({ feature, console }) { activeElement.tagName === "TEXTAREA" && form.contains(activeElement) ) { + clearCenterAlignment(activeElement); // Clear any existing center alignment + const spaceWidth = getSpaceWidth(); const lines = activeElement.value.split("\n"); const centeredLines = lines.map((line) => { From e72c91c9d20a01be461e50393912b656aa41f5c2 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 7 Jul 2024 14:51:02 -0400 Subject: [PATCH 088/253] Update script.js --- features/align-to-center/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/align-to-center/script.js b/features/align-to-center/script.js index 1ebb0ae6..8f792b9c 100644 --- a/features/align-to-center/script.js +++ b/features/align-to-center/script.js @@ -39,7 +39,7 @@ export default async function ({ feature, console }) { activeElement.tagName === "TEXTAREA" && form.contains(activeElement) ) { - clearCenterAlignment(activeElement); // Clear any existing center alignment + clearCenterAlignment(activeElement); const spaceWidth = getSpaceWidth(); const lines = activeElement.value.split("\n"); From 2157d3a3b1775e7ac2ced69b47a3af5c81bdf72e Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 7 Jul 2024 12:45:03 -0700 Subject: [PATCH 089/253] Let it work for Notes & Credits too --- features/align-to-center/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/align-to-center/script.js b/features/align-to-center/script.js index 8f792b9c..514da195 100644 --- a/features/align-to-center/script.js +++ b/features/align-to-center/script.js @@ -32,7 +32,7 @@ export default async function ({ feature, console }) { } function centerAlignText() { - const form = document.querySelector(".project-description-form"); + const form = document.querySelector(".project-notes"); if (form) { const activeElement = document.activeElement; if ( From e45bd65d30e6a4c92931d3c645723bb5c4c4ec84 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 7 Jul 2024 13:37:20 -0700 Subject: [PATCH 090/253] A few fixes and improvements and stuff --- features/align-to-center/data.json | 22 ++++++++++++++-- features/align-to-center/icon.svg | 1 + features/align-to-center/script.js | 42 +++++++++++++++++++++++++++--- features/align-to-center/style.css | 17 ++++++++++++ 4 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 features/align-to-center/icon.svg create mode 100644 features/align-to-center/style.css diff --git a/features/align-to-center/data.json b/features/align-to-center/data.json index e926f233..4cc6dda2 100644 --- a/features/align-to-center/data.json +++ b/features/align-to-center/data.json @@ -1,6 +1,6 @@ { "title": "Align to Center", - "description": "Use Control + U / Command + U to center text within the instruction box on projects", + "description": "Allows you to align text in Instructions and Notes & Credits boxes to the center of the input.", "credits": [ { "username": "Brass_Glass", @@ -14,5 +14,23 @@ "type": ["Website"], "tags": ["New", "Recommended"], "dynamic": true, - "scripts": [{ "file": "script.js", "runOn": "/projects/*" }] + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], + "styles": [{ "file": "style.css", "runOn": "/projects/*" }], + "resources": [{ "name": "center-align", "path": "/icon.svg" }], + "options": [{ "id": "use-align-hotkey", "name": "Use Hotkey (Ctrl + U)", "type": "boolean" }], + "components": [ + { + "type": "info", + "content": "For Mac users, use Command + U when the hotkey option is enabled to center text.", + "if": { + "type": "all", + "conditions": [ + { + "type": "os", + "value": "Macintosh" + } + ] + } + } + ] } diff --git a/features/align-to-center/icon.svg b/features/align-to-center/icon.svg new file mode 100644 index 00000000..c1304368 --- /dev/null +++ b/features/align-to-center/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/features/align-to-center/script.js b/features/align-to-center/script.js index 514da195..2ec53b9e 100644 --- a/features/align-to-center/script.js +++ b/features/align-to-center/script.js @@ -31,10 +31,12 @@ export default async function ({ feature, console }) { textarea.value = uncenteredLines.join("\n"); } - function centerAlignText() { + function centerAlignText(textarea) { + if (!feature.self.enabled) return; + const form = document.querySelector(".project-notes"); if (form) { - const activeElement = document.activeElement; + const activeElement = textarea || document.activeElement; if ( activeElement.tagName === "TEXTAREA" && form.contains(activeElement) @@ -46,7 +48,8 @@ export default async function ({ feature, console }) { const centeredLines = lines.map((line) => { const textWidth = getTextWidth(line); const totalSpaces = (availableWidth - textWidth) / spaceWidth / 2; - const spaces = " ".repeat(Math.floor(totalSpaces)); + const spaces = + totalSpaces > 0 ? " ".repeat(Math.floor(totalSpaces)) : ""; return spaces + line; }); activeElement.value = centeredLines.join("\n"); @@ -56,7 +59,38 @@ export default async function ({ feature, console }) { window.addEventListener("keydown", (event) => { if ((event.ctrlKey || event.metaKey) && event.key === "u") { - centerAlignText(); + if (feature.settings.get("use-align-hotkey")) { + centerAlignText(); + } } }); + + console.log("hey"); + + ScratchTools.waitForElements( + ".project-notes .project-textlabel", + function (div) { + if (div.querySelector(".ste-align-center")) return; + + let textarea = div.parentElement.querySelector("textarea"); + + let img = document.createElement("img"); + img.src = feature.self.getResource("center-align"); + img.className = "ste-align-center"; + img.addEventListener("click", function () { + centerAlignText(textarea); + }); + feature.self.hideOnDisable(img); + + div.appendChild(img); + + textarea.addEventListener("focusin", function () { + img.classList.add("show"); + }); + + textarea.addEventListener("focusout", function () { + img.classList.remove("show"); + }); + } + ); } diff --git a/features/align-to-center/style.css b/features/align-to-center/style.css new file mode 100644 index 00000000..c1937d8a --- /dev/null +++ b/features/align-to-center/style.css @@ -0,0 +1,17 @@ +.project-notes .project-textlabel { + position: relative; + width: 100%; +} + +.ste-align-center { + position: absolute; + right: 0px; + top: 0px; + height: 100%; + cursor: pointer; + display: none; +} + +.ste-align-center.show { + display: block; +} \ No newline at end of file From f97323ab80d0c2afbb02aaec1eb76040e94c9718 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 7 Jul 2024 13:37:49 -0700 Subject: [PATCH 091/253] Fix --- extras/popup/popup.css | 2 +- extras/style.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/popup/popup.css b/extras/popup/popup.css index dd1f85b6..a421c854 100644 --- a/extras/popup/popup.css +++ b/extras/popup/popup.css @@ -496,7 +496,7 @@ span.new-feature-tag.beta { border-inline-end: 1.5px solid var(--feature-input-bg); } -.option label { +.option label:not(.special-switch) { margin-right: 1rem; } diff --git a/extras/style.css b/extras/style.css index 338f926f..f1524756 100644 --- a/extras/style.css +++ b/extras/style.css @@ -875,7 +875,7 @@ body { border-inline-end: 1.5px solid var(--feature-input-bg); } -.option label { +.option label:not(.special-switch) { margin-right: 1rem; } From 629e2602cc8927a0880e298c239d232a382d0105 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 7 Jul 2024 13:53:39 -0700 Subject: [PATCH 092/253] Fix `select-self` leaving out important options --- features/select-self/script.js | 147 +++++++++++++++++++-------------- 1 file changed, 83 insertions(+), 64 deletions(-) diff --git a/features/select-self/script.js b/features/select-self/script.js index 846a89d2..233076c2 100644 --- a/features/select-self/script.js +++ b/features/select-self/script.js @@ -1,79 +1,98 @@ export default async function ({ feature, console }) { + let MENU_TYPES = [ + "motion_glideto_menu", + "motion_goto_menu", + "motion_pointtowards_menu", + "sensing_touchingobjectmenu", + "sensing_of_object_menu", + "sensing_distancetomenu", + ]; + let ORIGINAL_DATA = { + motion_glideto_menu: [ + ["random position", "_random_"], + ["mouse-pointer", "_mouse_"], + ], + motion_goto_menu: [ + ["random position", "_random_"], + ["mouse-pointer", "_mouse_"], + ], + motion_pointtowards_menu: [["random position", "_random_"]], + sensing_touchingobjectmenu: [ + ["mouse-pointer", "_mouse_"], + ["edge", "_edge_"], + ], + sensing_of_object_menu: [["Stage", "_stage_"]], + sensing_distancetomenu: [["mouse-pointer", "_mouse_"]], + }; + + let blocks = []; + + ScratchTools.waitForElements( + "g.blocklyDraggable > g[data-shapes='argument round']", + function (block) { + if (!Blockly) return; + + block = Blockly.getMainWorkspace().getBlockById(block.dataset.id); + if (!block) return; + + if (MENU_TYPES.includes(block.type)) { + let menu = block.inputList[0].fieldRow[0].menuGenerator_; + + if (!blocks.includes(block.id)) { + blocks.push(block.id); + } - let MENU_TYPES = ["motion_glideto_menu", "motion_goto_menu", "motion_pointtowards_menu", "sensing_touchingobjectmenu", "sensing_of_object_menu"] - - let blocks = [] + updateMenu(block.id); + } + } + ); - ScratchTools.waitForElements( - "g.blocklyDraggable > g[data-shapes='argument round']", - function (block) { - if (!Blockly) return; + feature.traps.vm.on("targetsUpdate", function (el) { + for (var i in blocks) { + updateMenu(blocks[i]); + } + }); - block = Blockly.getMainWorkspace().getBlockById(block.dataset.id); - if (!block) return; + feature.addEventListener("disabled", function () { + for (var i in blocks) { + updateMenu(blocks[i]); + } + }); - if (MENU_TYPES.includes(block.type)) { - let menu = block.inputList[0].fieldRow[0].menuGenerator_; + feature.addEventListener("enabled", function () { + for (var i in blocks) { + updateMenu(blocks[i]); + } + }); - if (!blocks.includes(block.id)) { - blocks.push(block.id) - } + function updateMenu(blockId) { + let SPRITES = []; - updateMenu(block.id) - } - } + let targets = feature.traps.vm.runtime.targets.filter( + (target) => !target.isStage && target.isOriginal ); - feature.traps.vm.on("targetsUpdate", function (el) { - for (var i in blocks) { - updateMenu(blocks[i]) - } - }) + for (var i in targets) { + SPRITES.push(targets[i].sprite.name); + } - feature.addEventListener("disabled", function () { - for (var i in blocks) { - updateMenu(blocks[i]) - } - }) + let block = Blockly.getMainWorkspace().getBlockById(blockId); - feature.addEventListener("enabled", function () { - for (var i in blocks) { - updateMenu(blocks[i]) - } - }) + if (!block) return; - function updateMenu(blockId) { - let SPRITES = [] + block.inputList[0].fieldRow[0].menuGenerator_ = function () { + let data = ORIGINAL_DATA[block.type]; - let targets = feature.traps.vm.runtime.targets.filter((target) => !target.isStage && target.isOriginal) - - for (var i in targets) { - SPRITES.push(targets[i].sprite.name) + for (var i in SPRITES) { + if ( + feature.self.enabled || + feature.traps.vm.runtime._editingTarget?.sprite?.name !== SPRITES[i] + ) { + data.push([SPRITES[i], SPRITES[i]]); } + } - let block = Blockly.getMainWorkspace().getBlockById(blockId); - - if (!block) return; - - block.inputList[0].fieldRow[0].menuGenerator_ = function () { - let data = [ - [ - "random position", - "_random_" - ], - [ - "mouse-pointer", - "_mouse_" - ] - ] - - for (var i in SPRITES) { - if (feature.self.enabled || feature.traps.vm.runtime._editingTarget?.sprite?.name !== SPRITES[i]) { - data.push([SPRITES[i], SPRITES[i]]) - } - } - - return data - } - } -} \ No newline at end of file + return data; + }; + } +} From 62efb294d0393ad78cdf237202d135a54d79506f Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 7 Jul 2024 14:10:01 -0700 Subject: [PATCH 093/253] Fix `align-to-center` not working when clicked --- features/align-to-center/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/align-to-center/script.js b/features/align-to-center/script.js index 2ec53b9e..f0af171e 100644 --- a/features/align-to-center/script.js +++ b/features/align-to-center/script.js @@ -77,7 +77,7 @@ export default async function ({ feature, console }) { let img = document.createElement("img"); img.src = feature.self.getResource("center-align"); img.className = "ste-align-center"; - img.addEventListener("click", function () { + img.addEventListener("mousedown", function () { centerAlignText(textarea); }); feature.self.hideOnDisable(img); From b7a2ac1c9aa3d3e6ca6f34d4fbfad0c221c58a52 Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 00:00:13 +0000 Subject: [PATCH 094/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index 76d37306..eeff9a7f 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"special-editor-fonts/title":{"message":"More Editor Fonts"},"special-editor-fonts/description":{"message":"Adds more fonts to choose from in the paint editor. They look nicer and are more modern."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"aviate/title":{"message":"Aviate Statuses"},"aviate/description":{"message":"Displays Aviate statuses on profile pages. You can set your status at aviate.scratchers.tech."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From 59e5077af55b9c68bd822d42e4d8bbce0f8fb6e1 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Mon, 8 Jul 2024 12:42:46 -0700 Subject: [PATCH 095/253] Improve search system --- extras/index.html | 2 +- extras/popup/popup.js | 150 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 122 insertions(+), 30 deletions(-) diff --git a/extras/index.html b/extras/index.html index a60d0cfa..14ce2b14 100644 --- a/extras/index.html +++ b/extras/index.html @@ -102,7 +102,7 @@

-

All features

+

All features

\ No newline at end of file + From 3925cc114c1a45f9118bc20a90cbb40b19652c42 Mon Sep 17 00:00:00 2001 From: stio Date: Tue, 30 Jul 2024 18:01:10 +0200 Subject: [PATCH 125/253] popup opener button not being shown --- features/video-recorder/video-recorder.js | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/features/video-recorder/video-recorder.js b/features/video-recorder/video-recorder.js index e9daa9cc..701eaba2 100644 --- a/features/video-recorder/video-recorder.js +++ b/features/video-recorder/video-recorder.js @@ -1,8 +1,11 @@ export default async function ({ feature, console }) { + let openPopup = document.createElement("button"); + openPopup.className = "button action-button ste-video-recorder-open"; + openPopup.textContent = "Record Video"; - const row = await new Promise(async (resolve, reject) => { + await new Promise(async (resolve, reject) => { (async () => { - const rem = await ScratchTools.waitForElement(".preview .inner .flex-row.action-buttons") + const rem = await ScratchTools.waitForElement(".preview .inner .flex-row.action-buttons") resolve(rem); })(); (async () => { @@ -10,12 +13,16 @@ export default async function ({ feature, console }) { resolve(rem); })(); }) - - let openPopup = document.createElement("button"); - openPopup.className = "button action-button ste-video-recorder-open"; - openPopup.textContent = "Record Video"; - row.insertAdjacentElement("afterbegin", openPopup); - + + ScratchTools.waitForElements(".preview .inner .flex-row.action-buttons", async function (row) { + if (row.querySelector(".ste-video-recorder-open")) return; + row.insertAdjacentElement("afterbegin", openPopup); + }) + ScratchTools.waitForElements(".menu-bar_account-info-group_MeJZP", async function (row) { + if (row.querySelector(".ste-video-recorder-open")) return; + row.insertAdjacentElement("afterbegin", openPopup); + }) + let popup = document.createElement("div"); popup.insertAdjacentHTML("afterbegin", await (await fetch(feature.self.getResource("popup-html"))).text()) popup = popup.querySelector("div.ReactModalPortal") From 09aa23d120b28cb6b9b24ae4bc6ab7fac2fb828a Mon Sep 17 00:00:00 2001 From: stio Date: Tue, 30 Jul 2024 18:10:14 +0200 Subject: [PATCH 126/253] Elements fix --- features/video-recorder/popup.html | 18 ++++++++----- features/video-recorder/video-recorder.js | 33 ++++++++++++----------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/features/video-recorder/popup.html b/features/video-recorder/popup.html index 83a404d2..f02484bb 100644 --- a/features/video-recorder/popup.html +++ b/features/video-recorder/popup.html @@ -13,19 +13,25 @@ @@ -43,11 +49,11 @@

Preview:
- + - + \ No newline at end of file diff --git a/features/video-recorder/video-recorder.js b/features/video-recorder/video-recorder.js index 701eaba2..ab51fe4e 100644 --- a/features/video-recorder/video-recorder.js +++ b/features/video-recorder/video-recorder.js @@ -1,11 +1,7 @@ export default async function ({ feature, console }) { - let openPopup = document.createElement("button"); - openPopup.className = "button action-button ste-video-recorder-open"; - openPopup.textContent = "Record Video"; - await new Promise(async (resolve, reject) => { (async () => { - const rem = await ScratchTools.waitForElement(".preview .inner .flex-row.action-buttons") + const rem = await ScratchTools.waitForElement(".preview .inner .flex-row.action-buttons") resolve(rem); })(); (async () => { @@ -13,16 +9,30 @@ export default async function ({ feature, console }) { resolve(rem); })(); }) + + let openPopup = document.createElement("button"); ScratchTools.waitForElements(".preview .inner .flex-row.action-buttons", async function (row) { if (row.querySelector(".ste-video-recorder-open")) return; + openPopup = document.createElement("button"); + openPopup.className = "button action-button ste-video-recorder-open"; + openPopup.textContent = "Record Video"; row.insertAdjacentElement("afterbegin", openPopup); + openPopup.addEventListener('click', () => { + document.body.append(popup) + }) }) ScratchTools.waitForElements(".menu-bar_account-info-group_MeJZP", async function (row) { if (row.querySelector(".ste-video-recorder-open")) return; + openPopup = document.createElement("div"); + openPopup.className = "menu-bar_menu-bar-item_oLDa- menu-bar_hoverable_c6WFB"; + openPopup.textContent = "Record Video"; row.insertAdjacentElement("afterbegin", openPopup); + openPopup.addEventListener('click', () => { + document.body.append(popup) + }) }) - + let popup = document.createElement("div"); popup.insertAdjacentHTML("afterbegin", await (await fetch(feature.self.getResource("popup-html"))).text()) popup = popup.querySelector("div.ReactModalPortal") @@ -31,17 +41,10 @@ export default async function ({ feature, console }) { let startButton = popup.querySelector(".startButton"); let closeButton = popup.querySelector(".close-button_close-button_lOp2G"); let downloadButton = popup.querySelector(".downloadButton"); - let lastDownloadFunction = ()=>{} + let lastDownloadFunction = () => { } let mimeType = popup.querySelector("select"); - // console.log([stopButton, startButton]) - - openPopup.addEventListener('click', () => { - document.body.append(popup) - }) - - // console.log(closeButton) closeButton.addEventListener('click', () => { document.querySelector(".STE-ReactModalPortal").remove() }) @@ -82,7 +85,7 @@ export default async function ({ feature, console }) { preview.controls = true; preview.download = `${projectTitle.value}.${mimeType.value}` downloadButton.removeEventListener("click", lastDownloadFunction) - lastDownloadFunction = async () => { + lastDownloadFunction = async () => { const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url From 91f81a0fc1adf8a4049654ab33dc412648220530 Mon Sep 17 00:00:00 2001 From: stio Date: Tue, 30 Jul 2024 18:20:10 +0200 Subject: [PATCH 127/253] Padding fix? --- features/video-recorder/video-recorder.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/features/video-recorder/video-recorder.js b/features/video-recorder/video-recorder.js index ab51fe4e..a991e00d 100644 --- a/features/video-recorder/video-recorder.js +++ b/features/video-recorder/video-recorder.js @@ -26,7 +26,9 @@ export default async function ({ feature, console }) { if (row.querySelector(".ste-video-recorder-open")) return; openPopup = document.createElement("div"); openPopup.className = "menu-bar_menu-bar-item_oLDa- menu-bar_hoverable_c6WFB"; - openPopup.textContent = "Record Video"; + let rem = document.createElement("div"); + rem.textContent = "Record Video"; + openPopup.append(rem); row.insertAdjacentElement("afterbegin", openPopup); openPopup.addEventListener('click', () => { document.body.append(popup) From 9f82912262dba8a261cf0eb15dfcc9396452c584 Mon Sep 17 00:00:00 2001 From: stio Date: Tue, 30 Jul 2024 18:37:54 +0200 Subject: [PATCH 128/253] scratchtoolsTag --- features/video-recorder/popup.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/video-recorder/popup.html b/features/video-recorder/popup.html index f02484bb..3681b7bc 100644 --- a/features/video-recorder/popup.html +++ b/features/video-recorder/popup.html @@ -41,7 +41,7 @@ name="Rename all "box size" variables to:" value="box size"> -->
- +

- - - -

- Preview:
- - -
- - +
+ + +

+ +

+ Preview:
+ + +
+ - \ No newline at end of file + + From 13fc06f6d5473f7fb0f100ba8eef961607765930 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Tue, 30 Jul 2024 12:52:24 -0400 Subject: [PATCH 130/253] Add CSS file --- features/video-recorder/style.css | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 features/video-recorder/style.css diff --git a/features/video-recorder/style.css b/features/video-recorder/style.css new file mode 100644 index 00000000..7f62e73c --- /dev/null +++ b/features/video-recorder/style.css @@ -0,0 +1,21 @@ +.STE-ReactModalPortal .STE-recorded-video { + width: 100%; + height: 100%; + border: 10px solid #ccc; + border-radius: 10px; +} + +.STE-ReactModalPortal .STE-hide-button { + display: none; +} + +.STE-ReactModalPortal .STE-left-text { + text-align: left; +} + +.STE-ReactModalPortal .stopButton, +.STE-ReactModalPortal .startButton, +.STE-ReactModalPortal .downloadButton, +.STE-ReactModalPortal .video-format-select { + width: 100%; +} From ce95a08eb2d17d5904d2a84ba22ad0a3d24ca751 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Tue, 30 Jul 2024 12:55:37 -0400 Subject: [PATCH 131/253] Update JSON file --- features/video-recorder/data.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/features/video-recorder/data.json b/features/video-recorder/data.json index 332b5422..97288bc0 100644 --- a/features/video-recorder/data.json +++ b/features/video-recorder/data.json @@ -20,7 +20,16 @@ "runOn": "/projects/*" } ], + "styles": [ + { + "file": "style.css", + "runOn": "/projects/*" + } + ], "resources": [ - { "name": "popup-html", "path": "/popup.html" } + { + "name": "popup-html", + "path": "/popup.html" + } ] } From 157f647adb11b1d16516a0f550aed2ec35510146 Mon Sep 17 00:00:00 2001 From: stio Date: Tue, 30 Jul 2024 20:49:14 +0200 Subject: [PATCH 132/253] Audio Update --- features/video-recorder/popup.html | 39 +++----- features/video-recorder/video-recorder.js | 107 +++++++++++++++++----- 2 files changed, 97 insertions(+), 49 deletions(-) diff --git a/features/video-recorder/popup.html b/features/video-recorder/popup.html index 746c1c6d..ef9c057c 100644 --- a/features/video-recorder/popup.html +++ b/features/video-recorder/popup.html @@ -1,33 +1,18 @@
- \ No newline at end of file diff --git a/features/video-recorder/style.css b/features/video-recorder/style.css deleted file mode 100644 index 7f62e73c..00000000 --- a/features/video-recorder/style.css +++ /dev/null @@ -1,21 +0,0 @@ -.STE-ReactModalPortal .STE-recorded-video { - width: 100%; - height: 100%; - border: 10px solid #ccc; - border-radius: 10px; -} - -.STE-ReactModalPortal .STE-hide-button { - display: none; -} - -.STE-ReactModalPortal .STE-left-text { - text-align: left; -} - -.STE-ReactModalPortal .stopButton, -.STE-ReactModalPortal .startButton, -.STE-ReactModalPortal .downloadButton, -.STE-ReactModalPortal .video-format-select { - width: 100%; -} diff --git a/features/video-recorder/video-recorder.js b/features/video-recorder/video-recorder.js deleted file mode 100644 index 5bdee8b5..00000000 --- a/features/video-recorder/video-recorder.js +++ /dev/null @@ -1,179 +0,0 @@ -export default async function ({ feature, console }) { - await new Promise(async (resolve, reject) => { - (async () => { - const rem = await ScratchTools.waitForElement(".preview .inner .flex-row.action-buttons") - resolve(rem); - })(); - (async () => { - const rem = await ScratchTools.waitForElement(".menu-bar_account-info-group_MeJZP") - resolve(rem); - })(); - }) - - let openPopup = document.createElement("button"); - - ScratchTools.waitForElements(".preview .inner .flex-row.action-buttons", async function (row) { - if (row.querySelector(".ste-video-recorder-open")) return; - openPopup = document.createElement("button"); - openPopup.className = "button action-button ste-video-recorder-open"; - openPopup.textContent = "Record Video"; - row.insertAdjacentElement("afterbegin", openPopup); - openPopup.addEventListener('click', () => { - document.body.append(popup) - }) - }) - - ScratchTools.waitForElements(".menu-bar_account-info-group_MeJZP", async function (row) { - if (row.querySelector(".ste-video-recorder-open")) return; - openPopup = document.createElement("div"); - openPopup.className = "menu-bar_menu-bar-item_oLDa- menu-bar_hoverable_c6WFB"; - let rem = document.createElement("div"); - rem.textContent = "Record Video"; - openPopup.append(rem); - row.insertAdjacentElement("afterbegin", openPopup); - openPopup.addEventListener('click', () => { - document.body.append(popup) - }) - }) - - let popup = document.createElement("div"); - popup.insertAdjacentHTML("afterbegin", await (await fetch(feature.self.getResource("popup-html"))).text()) - popup = popup.querySelector("div.ReactModalPortal") - - let stopButton = popup.querySelector(".stopButton"); - let startButton = popup.querySelector(".startButton"); - let closeButton = popup.querySelector(".close-button_close-button_lOp2G"); - let downloadButton = popup.querySelector(".downloadButton"); - let lastDownloadFunction = () => { } - let mimeType = popup.querySelector("select"); - let microphoneCheckbox = popup.querySelector(".microphoneCheckbox"); - let desktopSoundCheckbox = popup.querySelector(".desktopSoundCheckbox"); - - closeButton.addEventListener('click', () => { - document.querySelector(".STE-ReactModalPortal").remove() - }) - addEventListener("keydown", (e) => { - if (e.key === "Escape") { - document.querySelector(".STE-ReactModalPortal").remove() - } - }) - - const canvas = feature.traps.vm.renderer.canvas; - const preview = popup.querySelector("video") - - await new Promise(async (resolve, reject) => { - (async () => { - const rem = await ScratchTools.waitForElement("input.inplace-input") - resolve(rem); - })(); - (async () => { - const rem = await ScratchTools.waitForElement("input.project-title-input_title-field_en5Gd") - resolve(rem); - })(); - (async () => { - const rem = await ScratchTools.waitForElement(".project-title") - resolve(rem); - })(); - }) - - let projectTitle = document.querySelector("input.inplace-input") || document.querySelector("input.project-title-input_title-field_en5Gd") || document.querySelector(".project-title"); - - ScratchTools.waitForElements("input.inplace-input", async function (_projectTitle) { - projectTitle = _projectTitle - }) - - ScratchTools.waitForElements("input.project-title-input_title-field_en5Gd", async function (_projectTitle) { - projectTitle = _projectTitle - }) - - ScratchTools.waitForElements(".project-title", async function (_projectTitle) { - projectTitle = _projectTitle - }) - - - let mediaRecorder; - let recordedChunks = []; - - startButton.addEventListener('click', async () => { - startButton.classList.add("STE-hide-button"); - stopButton.classList.remove("STE-hide-button"); - - // Capture the canvas element as a stream - const canvasStream = canvas.captureStream(30); // 30 FPS - - // Get the audio context from the Scratch VM - const audioContext = feature.traps.vm.runtime.audioEngine.audioContext; - const audioDestination = audioContext.createMediaStreamDestination(); - - if (microphoneCheckbox.checked) { - // Capture the microphone audio - let micStream; - try { - micStream = await navigator.mediaDevices.getUserMedia({ audio: true }); - } catch (err) { - console.error("Error capturing microphone audio:", err); - } - - if (micStream) { - const micSource = audioContext.createMediaStreamSource(micStream); - micSource.connect(audioDestination); - } - } - - // Connect the audio engine's output - if (desktopSoundCheckbox.checked) { - feature.traps.vm.runtime.audioEngine.inputNode.connect(audioDestination); - } - - // Combine the canvas video track and audio tracks - const combinedStream = new MediaStream(); - canvasStream.getVideoTracks().forEach(track => combinedStream.addTrack(track)); - if (microphoneCheckbox.checked || desktopSoundCheckbox.checked) { - audioDestination.stream.getAudioTracks().forEach(track => combinedStream.addTrack(track)); - } - - mediaRecorder = new MediaRecorder(combinedStream); - - mediaRecorder.ondataavailable = function (event) { - if (event.data.size > 0) { - recordedChunks.push(event.data); - } - }; - - mediaRecorder.onstop = function () { - const blob = new Blob(recordedChunks, { - type: `video/${mimeType.value}` - }); - preview.src = URL.createObjectURL(blob); - preview.controls = true; - // console.log(projectTitle) - preview.download = `${projectTitle.value}.${mimeType.value}`; - downloadButton.removeEventListener("click", lastDownloadFunction); - lastDownloadFunction = async () => { - const url = URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = `${projectTitle.value}.${mimeType.value}`; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - URL.revokeObjectURL(url); - } - downloadButton.addEventListener("click", lastDownloadFunction); - recordedChunks = []; - }; - - mediaRecorder.start(); - startButton.disabled = true; - stopButton.disabled = false; - }); - - stopButton.addEventListener('click', () => { - mediaRecorder.stop(); - startButton.disabled = false; - stopButton.disabled = true; - - stopButton.classList.add("STE-hide-button"); - startButton.classList.remove("STE-hide-button"); - }); -} From c6abcaf9e781150eae305debfb147d19daad9348 Mon Sep 17 00:00:00 2001 From: stio Date: Tue, 30 Jul 2024 23:37:56 +0200 Subject: [PATCH 135/253] bug fix --- features/picture-in-picture/picture-in-picture.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/features/picture-in-picture/picture-in-picture.js b/features/picture-in-picture/picture-in-picture.js index f97f7bf3..e17c88f7 100644 --- a/features/picture-in-picture/picture-in-picture.js +++ b/features/picture-in-picture/picture-in-picture.js @@ -23,9 +23,9 @@ export default async function ({ feature, console }) { let openPopup = document.createElement("button"); ScratchTools.waitForElements(".preview .inner .flex-row.action-buttons", async function (row) { - if (row.querySelector(".ste-video-recorder-open")) return; + if (row.querySelector(".ste-picture-in-picture")) return; openPopup = document.createElement("button"); - openPopup.className = "button action-button ste-video-recorder-open"; + openPopup.className = "button action-button ste-picture-in-picture"; openPopup.textContent = "Picture in Picture"; row.insertAdjacentElement("afterbegin", openPopup); openPopup.addEventListener('click', () => { @@ -33,7 +33,7 @@ export default async function ({ feature, console }) { }) }) ScratchTools.waitForElements(".menu-bar_account-info-group_MeJZP", async function (row) { - if (row.querySelector(".ste-video-recorder-open")) return; + if (row.querySelector(".ste-picture-in-picture")) return; openPopup = document.createElement("div"); openPopup.className = "menu-bar_menu-bar-item_oLDa- menu-bar_hoverable_c6WFB"; let rem = document.createElement("div"); From cc5773750939dccc5c39e5554663824ea5bb1dc7 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:38:33 -0700 Subject: [PATCH 136/253] A few small changes --- features/video-recorder/data.json | 5 ++--- features/video-recorder/style.css | 1 + features/video-recorder/video-recorder.js | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/features/video-recorder/data.json b/features/video-recorder/data.json index 97288bc0..506e139c 100644 --- a/features/video-recorder/data.json +++ b/features/video-recorder/data.json @@ -1,6 +1,6 @@ { - "title": "Video Recorder", - "description": "Record videos of Scratch projects.", + "title": "Record Stage", + "description": "Allows you to record the stage for projects while in the editor.", "credits": [ { "username": "blob2763", @@ -13,7 +13,6 @@ ], "type": ["Editor"], "tags": ["New", "Featured"], - "dynamic": true, "scripts": [ { "file": "video-recorder.js", diff --git a/features/video-recorder/style.css b/features/video-recorder/style.css index 7f62e73c..70fa6eac 100644 --- a/features/video-recorder/style.css +++ b/features/video-recorder/style.css @@ -19,3 +19,4 @@ .STE-ReactModalPortal .video-format-select { width: 100%; } + diff --git a/features/video-recorder/video-recorder.js b/features/video-recorder/video-recorder.js index 5bdee8b5..ccba54cd 100644 --- a/features/video-recorder/video-recorder.js +++ b/features/video-recorder/video-recorder.js @@ -27,6 +27,7 @@ export default async function ({ feature, console }) { if (row.querySelector(".ste-video-recorder-open")) return; openPopup = document.createElement("div"); openPopup.className = "menu-bar_menu-bar-item_oLDa- menu-bar_hoverable_c6WFB"; + openPopup.style.padding = "0 0.75rem" let rem = document.createElement("div"); rem.textContent = "Record Video"; openPopup.append(rem); From 3a5e9c37a9904e5bcf1ef0225b71bfb703c5bb29 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:39:05 -0700 Subject: [PATCH 137/253] Update data.json --- features/video-recorder/data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/video-recorder/data.json b/features/video-recorder/data.json index 506e139c..42d327f1 100644 --- a/features/video-recorder/data.json +++ b/features/video-recorder/data.json @@ -1,6 +1,6 @@ { "title": "Record Stage", - "description": "Allows you to record the stage for projects while in the editor.", + "description": "Allows you to record the stage for projects while in the editor or on the project page.", "credits": [ { "username": "blob2763", From 2d41080a70b07bd22cae29bfbd401fba59555aa0 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:44:01 -0700 Subject: [PATCH 138/253] Update data.json --- features/picture-in-picture/data.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/picture-in-picture/data.json b/features/picture-in-picture/data.json index 437f4566..4f16fec3 100644 --- a/features/picture-in-picture/data.json +++ b/features/picture-in-picture/data.json @@ -1,6 +1,6 @@ { "title": "Picture in Picture", - "description": "Adds a button for opening a picture in picture for projects.", + "description": "Adds a button to the project page that allows you to open the stage up and continue to view it while using other tabs or apps.", "credits": [ { "username": "stio_studio", @@ -18,6 +18,6 @@ ], "components": [{ "type": "info", - "content": "Picture in Picture does NOT have inputs, of any kind. This means that it can mostly only be used for watching." + "content": "Picture in Picture will not allow you to interact with the project. You must be on the project page to interact with it." }] } From a388a0f36296b31ac64098c7642729fe4c49bbd2 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:46:44 -0700 Subject: [PATCH 139/253] try to resolve some issues --- features/video-recorder/data.json | 34 ++++ features/video-recorder/popup.html | 50 ++++++ features/video-recorder/style.css | 22 +++ features/video-recorder/video-recorder.js | 180 ++++++++++++++++++++++ 4 files changed, 286 insertions(+) create mode 100644 features/video-recorder/data.json create mode 100644 features/video-recorder/popup.html create mode 100644 features/video-recorder/style.css create mode 100644 features/video-recorder/video-recorder.js diff --git a/features/video-recorder/data.json b/features/video-recorder/data.json new file mode 100644 index 00000000..42d327f1 --- /dev/null +++ b/features/video-recorder/data.json @@ -0,0 +1,34 @@ +{ + "title": "Record Stage", + "description": "Allows you to record the stage for projects while in the editor or on the project page.", + "credits": [ + { + "username": "blob2763", + "url": "https://blob2763.is-a.dev/" + }, + { + "username": "stio_studio", + "url": "https://stio.studio/" + } + ], + "type": ["Editor"], + "tags": ["New", "Featured"], + "scripts": [ + { + "file": "video-recorder.js", + "runOn": "/projects/*" + } + ], + "styles": [ + { + "file": "style.css", + "runOn": "/projects/*" + } + ], + "resources": [ + { + "name": "popup-html", + "path": "/popup.html" + } + ] +} diff --git a/features/video-recorder/popup.html b/features/video-recorder/popup.html new file mode 100644 index 00000000..ef9c057c --- /dev/null +++ b/features/video-recorder/popup.html @@ -0,0 +1,50 @@ +
+ +
\ No newline at end of file diff --git a/features/video-recorder/style.css b/features/video-recorder/style.css new file mode 100644 index 00000000..70fa6eac --- /dev/null +++ b/features/video-recorder/style.css @@ -0,0 +1,22 @@ +.STE-ReactModalPortal .STE-recorded-video { + width: 100%; + height: 100%; + border: 10px solid #ccc; + border-radius: 10px; +} + +.STE-ReactModalPortal .STE-hide-button { + display: none; +} + +.STE-ReactModalPortal .STE-left-text { + text-align: left; +} + +.STE-ReactModalPortal .stopButton, +.STE-ReactModalPortal .startButton, +.STE-ReactModalPortal .downloadButton, +.STE-ReactModalPortal .video-format-select { + width: 100%; +} + diff --git a/features/video-recorder/video-recorder.js b/features/video-recorder/video-recorder.js new file mode 100644 index 00000000..ccba54cd --- /dev/null +++ b/features/video-recorder/video-recorder.js @@ -0,0 +1,180 @@ +export default async function ({ feature, console }) { + await new Promise(async (resolve, reject) => { + (async () => { + const rem = await ScratchTools.waitForElement(".preview .inner .flex-row.action-buttons") + resolve(rem); + })(); + (async () => { + const rem = await ScratchTools.waitForElement(".menu-bar_account-info-group_MeJZP") + resolve(rem); + })(); + }) + + let openPopup = document.createElement("button"); + + ScratchTools.waitForElements(".preview .inner .flex-row.action-buttons", async function (row) { + if (row.querySelector(".ste-video-recorder-open")) return; + openPopup = document.createElement("button"); + openPopup.className = "button action-button ste-video-recorder-open"; + openPopup.textContent = "Record Video"; + row.insertAdjacentElement("afterbegin", openPopup); + openPopup.addEventListener('click', () => { + document.body.append(popup) + }) + }) + + ScratchTools.waitForElements(".menu-bar_account-info-group_MeJZP", async function (row) { + if (row.querySelector(".ste-video-recorder-open")) return; + openPopup = document.createElement("div"); + openPopup.className = "menu-bar_menu-bar-item_oLDa- menu-bar_hoverable_c6WFB"; + openPopup.style.padding = "0 0.75rem" + let rem = document.createElement("div"); + rem.textContent = "Record Video"; + openPopup.append(rem); + row.insertAdjacentElement("afterbegin", openPopup); + openPopup.addEventListener('click', () => { + document.body.append(popup) + }) + }) + + let popup = document.createElement("div"); + popup.insertAdjacentHTML("afterbegin", await (await fetch(feature.self.getResource("popup-html"))).text()) + popup = popup.querySelector("div.ReactModalPortal") + + let stopButton = popup.querySelector(".stopButton"); + let startButton = popup.querySelector(".startButton"); + let closeButton = popup.querySelector(".close-button_close-button_lOp2G"); + let downloadButton = popup.querySelector(".downloadButton"); + let lastDownloadFunction = () => { } + let mimeType = popup.querySelector("select"); + let microphoneCheckbox = popup.querySelector(".microphoneCheckbox"); + let desktopSoundCheckbox = popup.querySelector(".desktopSoundCheckbox"); + + closeButton.addEventListener('click', () => { + document.querySelector(".STE-ReactModalPortal").remove() + }) + addEventListener("keydown", (e) => { + if (e.key === "Escape") { + document.querySelector(".STE-ReactModalPortal").remove() + } + }) + + const canvas = feature.traps.vm.renderer.canvas; + const preview = popup.querySelector("video") + + await new Promise(async (resolve, reject) => { + (async () => { + const rem = await ScratchTools.waitForElement("input.inplace-input") + resolve(rem); + })(); + (async () => { + const rem = await ScratchTools.waitForElement("input.project-title-input_title-field_en5Gd") + resolve(rem); + })(); + (async () => { + const rem = await ScratchTools.waitForElement(".project-title") + resolve(rem); + })(); + }) + + let projectTitle = document.querySelector("input.inplace-input") || document.querySelector("input.project-title-input_title-field_en5Gd") || document.querySelector(".project-title"); + + ScratchTools.waitForElements("input.inplace-input", async function (_projectTitle) { + projectTitle = _projectTitle + }) + + ScratchTools.waitForElements("input.project-title-input_title-field_en5Gd", async function (_projectTitle) { + projectTitle = _projectTitle + }) + + ScratchTools.waitForElements(".project-title", async function (_projectTitle) { + projectTitle = _projectTitle + }) + + + let mediaRecorder; + let recordedChunks = []; + + startButton.addEventListener('click', async () => { + startButton.classList.add("STE-hide-button"); + stopButton.classList.remove("STE-hide-button"); + + // Capture the canvas element as a stream + const canvasStream = canvas.captureStream(30); // 30 FPS + + // Get the audio context from the Scratch VM + const audioContext = feature.traps.vm.runtime.audioEngine.audioContext; + const audioDestination = audioContext.createMediaStreamDestination(); + + if (microphoneCheckbox.checked) { + // Capture the microphone audio + let micStream; + try { + micStream = await navigator.mediaDevices.getUserMedia({ audio: true }); + } catch (err) { + console.error("Error capturing microphone audio:", err); + } + + if (micStream) { + const micSource = audioContext.createMediaStreamSource(micStream); + micSource.connect(audioDestination); + } + } + + // Connect the audio engine's output + if (desktopSoundCheckbox.checked) { + feature.traps.vm.runtime.audioEngine.inputNode.connect(audioDestination); + } + + // Combine the canvas video track and audio tracks + const combinedStream = new MediaStream(); + canvasStream.getVideoTracks().forEach(track => combinedStream.addTrack(track)); + if (microphoneCheckbox.checked || desktopSoundCheckbox.checked) { + audioDestination.stream.getAudioTracks().forEach(track => combinedStream.addTrack(track)); + } + + mediaRecorder = new MediaRecorder(combinedStream); + + mediaRecorder.ondataavailable = function (event) { + if (event.data.size > 0) { + recordedChunks.push(event.data); + } + }; + + mediaRecorder.onstop = function () { + const blob = new Blob(recordedChunks, { + type: `video/${mimeType.value}` + }); + preview.src = URL.createObjectURL(blob); + preview.controls = true; + // console.log(projectTitle) + preview.download = `${projectTitle.value}.${mimeType.value}`; + downloadButton.removeEventListener("click", lastDownloadFunction); + lastDownloadFunction = async () => { + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `${projectTitle.value}.${mimeType.value}`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + } + downloadButton.addEventListener("click", lastDownloadFunction); + recordedChunks = []; + }; + + mediaRecorder.start(); + startButton.disabled = true; + stopButton.disabled = false; + }); + + stopButton.addEventListener('click', () => { + mediaRecorder.stop(); + startButton.disabled = false; + stopButton.disabled = true; + + stopButton.classList.add("STE-hide-button"); + startButton.classList.remove("STE-hide-button"); + }); +} From d3b1765c2949a350b05082776bf1171b2bffab1a Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Wed, 31 Jul 2024 00:00:17 +0000 Subject: [PATCH 140/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index 0a6b0fa9..0dfa016b 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From 48191f29d3779e3d938525fda10f34f1ee05292a Mon Sep 17 00:00:00 2001 From: stio Date: Thu, 1 Aug 2024 18:39:41 +0200 Subject: [PATCH 141/253] Using the Document Picture-in-Picture API (optional) --- features/picture-in-picture/data.json | 23 ++-- .../picture-in-picture/picture-in-picture.js | 119 +++++++++++++++--- features/picture-in-picture/popup.html | 40 ++++++ 3 files changed, 160 insertions(+), 22 deletions(-) create mode 100644 features/picture-in-picture/popup.html diff --git a/features/picture-in-picture/data.json b/features/picture-in-picture/data.json index 4f16fec3..9da27acc 100644 --- a/features/picture-in-picture/data.json +++ b/features/picture-in-picture/data.json @@ -7,8 +7,13 @@ "url": "https://stio.studio/" } ], - "type": ["Website"], - "tags": ["New", "Featured"], + "type": [ + "Website" + ], + "tags": [ + "New", + "Featured" + ], "dynamic": true, "scripts": [ { @@ -16,8 +21,12 @@ "runOn": "/projects/*" } ], - "components": [{ - "type": "info", - "content": "Picture in Picture will not allow you to interact with the project. You must be on the project page to interact with it." - }] -} + "resources": [{ "name": "popup-html", "path": "/popup.html" }], + "options": [ + { + "id": "interactivity-PiP", + "name": "Make the project in picture popup interactive. (Experimental)", + "type": 1 + } + ] +} \ No newline at end of file diff --git a/features/picture-in-picture/picture-in-picture.js b/features/picture-in-picture/picture-in-picture.js index e17c88f7..e1c45e0c 100644 --- a/features/picture-in-picture/picture-in-picture.js +++ b/features/picture-in-picture/picture-in-picture.js @@ -1,14 +1,4 @@ export default async function ({ feature, console }) { - const canvas = feature.traps.vm.renderer.canvas; - - let video = document.createElement("video"); - // video.setAttribute("controls", "controls"); - video.setAttribute("autoplay", "autoplay"); - video.setAttribute("style", "width: 100%; height: 100%"); - // document.querySelector(".preview .inner").append(video); - - video.srcObject = canvas.captureStream(30) - await new Promise(async (resolve, reject) => { (async () => { const rem = await ScratchTools.waitForElement(".preview .inner .flex-row.action-buttons") @@ -20,6 +10,7 @@ export default async function ({ feature, console }) { })(); }) + const canvas = feature.traps.vm.renderer.canvas; let openPopup = document.createElement("button"); ScratchTools.waitForElements(".preview .inner .flex-row.action-buttons", async function (row) { @@ -45,12 +36,110 @@ export default async function ({ feature, console }) { }) }) - function popup() { - try { - video.requestPictureInPicture() + let popup; + + if (feature.settings.get("interactivity-PiP")) { + if (!"documentPictureInPicture" in window) console.error("Picture in Picture not supported") + + let pipWindow + + let docPopup = document.createElement("div"); + docPopup.insertAdjacentHTML("afterbegin", await (await fetch(feature.self.getResource("popup-html"))).text()) + docPopup = docPopup.querySelector("div.popup-GUI") + + let video = docPopup.querySelector("video"); + + const greenFlag = document.querySelector(".green-flag_green-flag_1kiAo") + docPopup.querySelector(".popup-greenflag").addEventListener("click", () => { + greenFlag.click() + }); + const redFlag = document.querySelector(".stop-all_stop-all_1Y8P9") + docPopup.querySelector(".popup-redflag").addEventListener("click", () => { + redFlag.click() + }); + + // video.addEventListener("mousedown", (old_event) => { + function translateEvent_pointer(old_event) { + // Calculate the canvas position relative to the viewport + const a_rect = canvas.getBoundingClientRect(); + const b_rect = video.getBoundingClientRect(); + + // console.log(old_event) + // Create a new event with the adjusted coordinates + + let new_event = new old_event.constructor(old_event.type, { + bubbles: old_event.bubbles, + cancelable: old_event.cancelable, + clientX: (old_event.clientX - b_rect.left) * (a_rect.width / b_rect.width) + a_rect.left, + clientY: (old_event.clientY - b_rect.top) * (a_rect.height / b_rect.height) + a_rect.top, + // Copy over other necessary properties from the old event + screenX: (old_event.screenX - pipWindow.screenLeft + window.screenLeft - b_rect.left) * (a_rect.width / b_rect.width) + a_rect.left, + screenY: (old_event.screenY - pipWindow.screenTop + window.screenTop - b_rect.top) * (a_rect.height / b_rect.height) + a_rect.top, + layerX: old_event.layerX, + layerY: old_event.layerY, + button: old_event.button, + buttons: old_event.buttons, + relatedTarget: old_event.relatedTarget, + altKey: old_event.altKey, + ctrlKey: old_event.ctrlKey, + shiftKey: old_event.shiftKey, + metaKey: old_event.metaKey, + movementX: old_event.movementX, + movementY: old_event.movementY, + }); + + // Dispatch the new event + canvas.dispatchEvent(new_event); + } + video.addEventListener("mousedown", translateEvent_pointer) + video.addEventListener("mouseup", translateEvent_pointer) + video.addEventListener("mousemove", translateEvent_pointer) + video.addEventListener("wheel", translateEvent_pointer) + video.addEventListener("touchstart", translateEvent_pointer) + video.addEventListener("touchend", translateEvent_pointer) + video.addEventListener("touchmove", translateEvent_pointer) + + function translateEvent_key(old_event) { + let new_event = new KeyboardEvent(old_event.type, old_event) + document.dispatchEvent(new_event); } - catch { - console.log("Picture in Picture not supported or failed to request") + + let buttonClickedTimes = 0 + popup = async function () { + if (buttonClickedTimes === 0) { + video.srcObject = canvas.captureStream() + buttonClickedTimes++ + } + // Open a Picture-in-Picture window. + pipWindow = await window.documentPictureInPicture.requestWindow({ + width: canvas.width, + height: canvas.height + 20 + 6 * 2, + }); + + // Move the player to the Picture-in-Picture window. + pipWindow.document.body.append(docPopup); + + pipWindow.document.addEventListener("keydown", translateEvent_key) + pipWindow.document.addEventListener("keypress", translateEvent_key) + pipWindow.document.addEventListener("keyup", translateEvent_key) + } + } + else { + let video = document.createElement("video"); + // video.setAttribute("controls", "controls"); + video.setAttribute("autoplay", "autoplay"); + video.setAttribute("style", "width: 100%; height: 100%"); + // document.querySelector(".preview .inner").append(video); + + video.srcObject = canvas.captureStream() + + popup = function () { + try { + video.requestPictureInPicture() + } + catch { + console.log("Picture in Picture not supported or failed to request") + } } } } diff --git a/features/picture-in-picture/popup.html b/features/picture-in-picture/popup.html new file mode 100644 index 00000000..1cee1d36 --- /dev/null +++ b/features/picture-in-picture/popup.html @@ -0,0 +1,40 @@ + \ No newline at end of file From b53efaf211d00e9b219db39629a7ba10785ab5af Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Fri, 2 Aug 2024 08:36:58 -0700 Subject: [PATCH 142/253] returnToTab --- extras/background.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extras/background.js b/extras/background.js index bd33d7c9..61eefa65 100644 --- a/extras/background.js +++ b/extras/background.js @@ -691,6 +691,9 @@ chrome.runtime.onMessageExternal.addListener(async function ( url: "/extras/index.html", }); } + if (msg === "returnToTab") { + await chrome.tabs.update(sender.tab.id, {active: true}) + } if (typeof msg === "object") { if (msg.message === "storageSet") { await chrome.storage.sync.set({ [msg.key]: msg.value }); From 7cff9ea306f5f83abb1a7590ba132e24056fe9f9 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 4 Aug 2024 13:06:28 -0700 Subject: [PATCH 143/253] Delete unused feature JS files --- features/clone-counter.js | 51 --------------- features/default-to-local.js | 17 ----- features/dumpster-fire.js | 25 ------- features/hide-scratch-news.js | 15 ----- features/message-count.js | 33 ---------- features/more-tutorials.js | 93 -------------------------- features/plain-background.js | 8 --- features/start-stop-hotkeys.js | 15 ----- features/statistics.js | 26 -------- features/two-colors.js | 100 ---------------------------- features/user-stats.js | 116 --------------------------------- 11 files changed, 499 deletions(-) delete mode 100644 features/clone-counter.js delete mode 100644 features/default-to-local.js delete mode 100644 features/dumpster-fire.js delete mode 100644 features/hide-scratch-news.js delete mode 100644 features/message-count.js delete mode 100644 features/more-tutorials.js delete mode 100644 features/plain-background.js delete mode 100644 features/start-stop-hotkeys.js delete mode 100644 features/statistics.js delete mode 100644 features/two-colors.js delete mode 100644 features/user-stats.js diff --git a/features/clone-counter.js b/features/clone-counter.js deleted file mode 100644 index 284cad21..00000000 --- a/features/clone-counter.js +++ /dev/null @@ -1,51 +0,0 @@ -var countClonesStill = true; -function addCloneCounter() { - if (document.querySelector("progress.clonecount.scratchtools") === null) { - var bar = document.createElement("progress"); - bar.value = "0"; - bar.max = "300"; - bar.className = "clonecount scratchtools"; - bar.style.position = "absolute"; - bar.style.margin = "0"; - var style = document.createElement("style"); - style.innerHTML = ` - .clonecount { - top: 50%; - left: 50%; - -ms-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - } - `; - document.body.appendChild(style); - checkForCloneCounterPosition(); - - function checkForCloneCounterPosition() { - document.querySelectorAll("div").forEach(function (el) { - if (el.className.includes("controls_controls-container_")) { - el.appendChild(bar); - cloneCount(); - } - }); - if (document.querySelector("progress.clonecount.scratchtools") === null) { - setTimeout(checkForCloneCounterPosition, 100); - } - } - - function cloneCount() { - document.querySelector("progress.clonecount.scratchtools").value = - ScratchTools.Scratch.vm.runtime._cloneCounter.toString(); - document.querySelector( - "progress.clonecount.scratchtools" - ).style.backgroundColor = - ScratchTools.Scratch.vm.runtime._cloneCounter.toString(); - if (countClonesStill) { - setTimeout(cloneCount, 200); - } - } - } -} -addCloneCounter(); -ScratchTools.setDisable("clone-counter", function () { - countClonesStill = false; - document.querySelector(".clonecount").remove(); -}); diff --git a/features/default-to-local.js b/features/default-to-local.js deleted file mode 100644 index 3a7dfb6e..00000000 --- a/features/default-to-local.js +++ /dev/null @@ -1,17 +0,0 @@ -var defaultToLocal = true; -ScratchTools.waitForElements( - ".ReactModalPortal", - function (el) { - if (el.querySelector('[class^="prompt_variable-name-text-input_"]')) { - if (defaultToLocal) { - document.querySelectorAll('[name="variableScopeOption"]')[1].click(); - } - } - }, - "default local", - false -); - -ScratchTools.setDisable("default-to-local", function () { - defaultToLocal = false; -}); diff --git a/features/dumpster-fire.js b/features/dumpster-fire.js deleted file mode 100644 index b5e4ae2d..00000000 --- a/features/dumpster-fire.js +++ /dev/null @@ -1,25 +0,0 @@ -var enabledDumpsterFire = true; - -ScratchTools.waitForElements( - "div.inner.mod-splash > div.box > div.box-header > h4", - function (element) { - if (enabledDumpsterFire) { - element.textContent = "Dumpster Fire"; - } - }, - "dumpster fire", - false -); - -ScratchTools.setDisable("dumpster-fire", function () { - enabledDumpsterFire = false; - if ( - document.querySelector( - "div.inner.mod-splash > div.box > div.box-header > h4" - ) - ) { - document.querySelector( - "div.inner.mod-splash > div.box > div.box-header > h4" - ).textContent = "Featured Projects"; - } -}); diff --git a/features/hide-scratch-news.js b/features/hide-scratch-news.js deleted file mode 100644 index 6ab683df..00000000 --- a/features/hide-scratch-news.js +++ /dev/null @@ -1,15 +0,0 @@ -if ( - window.location.href === "https://scratch.mit.edu" || - window.location.href === "https://scratch.mit.edu/" -) { - function checkForDiv() { - if (document.querySelector("div.box.news") !== null) { - document.querySelector("div.box.news").remove(); - document.querySelector("div.box.activity").style.width = - "calc(120% - 20px)"; - } else { - setTimeout(checkForDiv, 100); - } - } - checkForDiv(); -} diff --git a/features/message-count.js b/features/message-count.js deleted file mode 100644 index 4f2f3a18..00000000 --- a/features/message-count.js +++ /dev/null @@ -1,33 +0,0 @@ -if (!document.querySelector(".location").className.includes(" scratchtools")) { - getapi2( - `https://api.${window.location.href.replaceAll( - "https://", - "" - )}messages/count` - ); - async function getapi2(url) { - if (!document.querySelector(".ste-messagecount")) { - // Storing response - const response = await fetch(url); - - // Storing data in form of JSON - var data = await response.json(); - console.log(data); - var stuff = data["count"]; - var span = document.createElement("span"); - span.className = "ste-messagecount"; - span.textContent = `${stuff} Messages`; - span.title = "This was added by ScratchTools."; - span.style.borderLeft = "1px solid #ccc"; - span.style.paddingLeft = "5px"; - span.style.marginLeft = "5px"; - span.setScratchTools(); - - ScratchTools.appendToSharedSpace({ - space: "afterProfileCountry", - element: span, - order: 0, - }); - } - } -} diff --git a/features/more-tutorials.js b/features/more-tutorials.js deleted file mode 100644 index 0020c46b..00000000 --- a/features/more-tutorials.js +++ /dev/null @@ -1,93 +0,0 @@ -if (window.location.href.includes("https://scratch.mit.edu/ideas")) { - el = document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(1)" - ); - var clone = el.cloneNode(true); - document - .querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div" - ) - .appendChild(clone); - var elem = document.createElement("a"); - elem.href = "https://www.youtube.com/watch?v=xZgeaYdx_uM&t"; - elem.textContent = "Make a Clicker Game"; - document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(10) > div > div.ttt-tile-info > h4" - ).textContent = ""; - document - .querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(10) > div > div.ttt-tile-info > h4" - ) - .appendChild(elem); - document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(10)" - ).onClick = 'window.location.href = "https://scratchstatus.org/"'; - document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(10) > div > div.ttt-tile-info > p" - ).textContent = "Make a game where people earn points by clicking an object!"; - document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(10) > div > div.ttt-tile-image > img" - ).src = "https://i.ibb.co/m0Kp8BG/download-1-1.png"; - - el = document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(1)" - ); - var clone = el.cloneNode(true); - document - .querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div" - ) - .appendChild(clone); - var elem = document.createElement("a"); - elem.href = "https://youtu.be/aUmXJJww7KE"; - elem.textContent = "Make a Platformer Game"; - document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(11) > div > div.ttt-tile-info > h4" - ).textContent = ""; - document - .querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(11) > div > div.ttt-tile-info > h4" - ) - .appendChild(elem); - document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(11)" - ).onClick = 'window.location.href = "https://scratchstatus.org/"'; - document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(11) > div > div.ttt-tile-info > p" - ).textContent = "Make a game where characters jump over walls and spikes!"; - document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(11) > div > div.ttt-tile-image > img" - ).src = "https://i.ibb.co/0ZsJKff/a-Um-XJJww7-KE-HD.jpg"; - - el = document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(1)" - ); - var clone = el.cloneNode(true); - document - .querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div" - ) - .appendChild(clone); - var elem = document.createElement("a"); - elem.href = "https://youtu.be/JEw3xiC3-aQ"; - elem.textContent = "Make a Snake Game"; - document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(12) > div > div.ttt-tile-info > h4" - ).textContent = ""; - document - .querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(12) > div > div.ttt-tile-info > h4" - ) - .appendChild(elem); - document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(12)" - ).onClick = 'window.location.href = "https://scratchstatus.org/"'; - document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(12) > div > div.ttt-tile-info > p" - ).textContent = - "Make a game where you control a snake and make sure it does not die!"; - document.querySelector( - "#view > div > div.tips-activity-guides > div > section > div.masonry > div > div:nth-child(12) > div > div.ttt-tile-image > img" - ).src = - "https://i.ytimg.com/vi/JEw3xiC3-aQ/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBBSeaBRVYFbQ99iUc4iqPTmVvytg"; -} diff --git a/features/plain-background.js b/features/plain-background.js deleted file mode 100644 index f6363ad5..00000000 --- a/features/plain-background.js +++ /dev/null @@ -1,8 +0,0 @@ -var scratchtoolsPlainBackground = ScratchTools.styles.add( - ".blocklyMainBackground { fill: none !important; }", - "plain-background" -); - -ScratchTools.setDisable("plain-background", function () { - ScratchTools.styles.removeStyleById("plain-background"); -}); diff --git a/features/start-stop-hotkeys.js b/features/start-stop-hotkeys.js deleted file mode 100644 index 2db0884d..00000000 --- a/features/start-stop-hotkeys.js +++ /dev/null @@ -1,15 +0,0 @@ -document.addEventListener("keydown", function (e) { - if (e.which === 71 && (e.metaKey || e.ctrlKey)) { - e.preventDefault(); - if (ScratchTools.Scratch.scratchGui().vmStatus.started) { - if (ScratchTools.Scratch.scratchGui().vmStatus.running) { - ScratchTools.Scratch.vm.stopAll(); - } else { - ScratchTools.Scratch.vm.greenFlag(); - } - } else { - ScratchTools.Scratch.vm.start(); - ScratchTools.Scratch.vm.greenFlag(); - } - } -}); diff --git a/features/statistics.js b/features/statistics.js deleted file mode 100644 index 5781a486..00000000 --- a/features/statistics.js +++ /dev/null @@ -1,26 +0,0 @@ -if (window.location.href.includes("https://scratch.mit.edu/mystuff")) { - if (document.querySelector("li.statistics") === null) { - function stuff() { - el = document.querySelector("#tabs > li:nth-child(5)"); - var clone = el.cloneNode(true); - document.querySelector("#tabs").appendChild(clone); - document.querySelector("#tabs > li:nth-child(6) > a").textContent = - "Statistics"; - document.querySelector("#tabs > li:nth-child(6)").className = - "last statistics"; - document.querySelector("#tabs > li:nth-child(6)").dataTab = "stats"; - document.querySelector( - "#tabs > li:nth-child(6) > a" - ).href = `https://scratchstats.com/${ - document - .querySelector( - "#topnav > div > div > ul.account-nav.logged-in > li.logged-in-user.dropdown > div > ul > li:nth-child(1) > a" - ) - .href.split("/users/")[1] - }`; - } - setTimeout(() => { - stuff(); - }, 50); - } -} diff --git a/features/two-colors.js b/features/two-colors.js deleted file mode 100644 index 9c99ca5e..00000000 --- a/features/two-colors.js +++ /dev/null @@ -1,100 +0,0 @@ -function GM_addStyle(text) { - var style = document.createElement("style"); - style.innerHTML = text; - document.body.appendChild(style); -} -//Procedures -GM_addStyle( - " path.blocklyBlockBackground[stroke='#FF3355'], .blocklyBlockBackground[stroke='#FF3355']{fill:#6d30a4 !important; stroke: #8a55d7 !important; stroke-width: 1px;} g[data-shapes='argument round'] > path.blocklyPath[fill='#FF6680']{fill: #6d30a4 !important;} path.blocklyPath[fill='#FF3355'][data-argument-type='boolean']{fill: #8357AC !important;}" -); -//Motion -GM_addStyle( - "g[data-category=motion] > path.blocklyBlockBackground{fill:#4a6cd4;}.blocklyDropDownDiv[data-category=motion]{background:#4a6cd4 !important;}" -); -//Looks -GM_addStyle( - "g[data-category=looks] > path.blocklyBlockBackground{fill:#8a55d7;}.blocklyDropDownDiv[data-category=looks]{background:#8a55d7 !important;}" -); -//Sound & Music -GM_addStyle( - "g[data-category=sounds] > path.blocklyBlockBackground,g[data-category=Music] > path.blocklyBlockBackground, g[data-category=Music] > g[data-shapes=round] > path.blocklyPath.blocklyBlockBackground {fill:#bb42c3; stroke:#99489e !important;}.blocklyDropDownDiv[data-category=sounds], .blocklyDropDownDiv[data-category=Music]{background:#bb42c3 !important; border-color: #99489e !important;} line[stroke='#0DA57A'] {stroke: white !important;} path[stroke='#0B8E69']:not(g[data-category='Pen'] > path.blocklyBlockBackground){stroke: #99489e !important;}" -); -//Events -GM_addStyle( - "g[data-category=events] > path.blocklyBlockBackground, .blocklyPath[fill='#FFBF00']{fill:#c88330;}.blocklyDropDownDiv[data-category=events], .blocklyPath[fill='#FFBF00'].blocklyDropDownDiv[data-category=events] /*Commented out for now, as this causes some issues ,.blocklyDropDownDiv[data-category=null]*/{background:#c88330 !important;}" -); -//Control -GM_addStyle( - "g[data-category=control] > path.blocklyBlockBackground{fill:#e1a91a;}.blocklyDropDownDiv[data-category=control]{background:#e1a91a !important;}" -); -//Sensing -GM_addStyle( - "g[data-category=sensing] > path.blocklyBlockBackground, .blocklyPath[fill='#5CB1D6'] {fill:#2ca5e2;}.blocklyDropDownDiv[data-category=sensing]{background:#2ca5e2 !important;}" -); -//Operators -GM_addStyle( - "g[data-category=operators] > path.blocklyBlockBackground{fill:#5cb712;}.blocklyDropDownDiv[data-category=operators]{background:#5cb712 !important;}" -); -//Pen -GM_addStyle( - "g[data-category=Pen] > path.blocklyBlockBackground{fill:#00a375; stroke: #009365}.blocklyDropDownDiv[data-category=Pen]{background:#00a375 !important;}" -); -//Data -GM_addStyle( - "g[data-category=data] > path.blocklyBlockBackground{fill:#ee7d16;}.blocklyDropDownDiv[data-category=data]{background:#ee7d16 !important;}" -); -//Lists -GM_addStyle( - "g[data-category=data-lists] > path.blocklyBlockBackground{fill:#d36518;}.blocklyDropDownDiv[data-category=data-lists]{background:#d36518 !important;}" -); -//Text Inputs -GM_addStyle( - "g[data-shapes='argument round']path.blocklyBlockBackground, path[fill='#ffffff']{fill: white; stroke-width: 1px;}" -); -//Make dropdowns stand out -GM_addStyle( - "g[data-argument-type='dropdown'] path.blocklyBlockBackground, g[data-argument-type='variable'] path.blocklyBlockBackground, rect.blocklyBlockBackground{fill: #55555555;}" -); -//Make color previews continue to work -GM_addStyle( - "g[data-argument-type='colour']path.blocklyBlockBackground{fill: initial;}" -); -//Make category colors match the block colors -GM_addStyle( - "div.scratchCategoryMenuRow:nth-child(1) > div:nth-child(1) > div:nth-child(1) {background: #4a6cd4 !important; border-color: #4e64aa !important;}" -); -GM_addStyle( - "div.scratchCategoryMenuRow:nth-child(2) > div:nth-child(1) > div:nth-child(1) {background: #8a55d7 !important;}" -); -GM_addStyle( - "div.scratchCategoryMenuRow:nth-child(3) > div:nth-child(1) > div:nth-child(1) {background: #bb42c3 !important;}" -); -GM_addStyle( - "div.scratchCategoryMenuRow:nth-child(4) > div:nth-child(1) > div:nth-child(1) {background: #c88330 !important;}" -); -GM_addStyle( - "div.scratchCategoryMenuRow:nth-child(5) > div:nth-child(1) > div:nth-child(1) {background: #e1a91a !important;}" -); -GM_addStyle( - "div.scratchCategoryMenuRow:nth-child(6) > div:nth-child(1) > div:nth-child(1) {background: #2ca5e2 !important;}" -); -GM_addStyle( - "div.scratchCategoryMenuRow:nth-child(7) > div:nth-child(1) > div:nth-child(1) {background: #5cb712 !important;}" -); -GM_addStyle( - "div.scratchCategoryMenuRow:nth-child(8) > div:nth-child(1) > div:nth-child(1) {background: #ee7d16 !important;}" -); -GM_addStyle( - "div.scratchCategoryMenuRow:nth-child(9) > div:nth-child(1) > div:nth-child(1) {background: #6d30a4 !important; border-color: #a249f3 !important;}" -); -//Various fixes -GM_addStyle( - ".removableTextInput, .blocklyWidgetDiv, .fieldTextInput {border-color: #ffffff66;" -); -GM_addStyle(".valueReportBox{color: #bfbfbf;}"); -GM_addStyle( - ".blocklyWidgetDiv .fieldTextInput {border-color: #55555555;} g[data-shapes='argument round'] > .blocklyPath[stroke='#FF3355']{fill: white !important;}" -); -GM_addStyle( - "g[data-argument-type='dropdown'] path.blocklyBlockBackground, g[data-shapes='argument round'] > .blocklyPath.blocklyBlockBackground {stroke: #55555555;} " -); diff --git a/features/user-stats.js b/features/user-stats.js deleted file mode 100644 index 5a5b8f84..00000000 --- a/features/user-stats.js +++ /dev/null @@ -1,116 +0,0 @@ -async function getStats() { - if (window.location.href.startsWith("https://scratch.mit.edu/users/")) { - var response = await fetch( - `https://scratchdb.lefty.one/v3/user/info/${window.location.href.replaceAll( - "https://scratch.mit.edu/users/", - "" - )}` - ); - var data = await response.json(); - if (data.statistics != undefined) { - function image(url, alt) { - return ``; - } - function space() { - return "      "; - } - function commafy(num) { - if (num == undefined) { - return "0"; - } else { - return parseInt(num).toLocaleString(); - } - } - var activity = document.getElementById("activity-feed"); - activity.style.display = "none"; //remove(); - var box = document.getElementsByClassName("doing")[0]; - var table = `${ - "
#" + - commafy(data.statistics.ranks.followers) + - " (#" + - commafy(data.statistics.ranks.country.followers) + - ")" + - space() + - "
" - }${image( - "https://scratch.mit.edu/svgs/messages/follow.svg", - "Followers" - )}${commafy(data.statistics.followers)}${space()}
${image( - "https://scratch.mit.edu/svgs/messages/love.svg", - "Loves" - )}${commafy(data.statistics.loves)}${space()}
${image( - "https://scratch.mit.edu/svgs/messages/favorite.svg", - "Favorites" - )}${commafy(data.statistics.favorites)}${space()}
${image( - "https://scratch.mit.edu/svgs/project/views-gray.svg", - "Views" - )}${commafy(data.statistics.views)}${space()}
`; - var scratchstats = `View on Scratchstats`; - var divText = - `
${table}${scratchstats}
`.replaceAll( - "undefined", - "0" - ); - var div = document.createElement("div"); - div.innerHTML = divText; - box.appendChild(div); - var statistics = document.getElementById("statistics"); - - //=============Create spans============== - var children = box.childNodes; - var h3 = children[1]; - h3.innerText = ""; - var spans = []; - - // functions & variables - var boxStyle = - "background-color: var(--darkWww-box, white);border-radius: 8px;border: 1px solid var(--darkWww-border-15, #d9d9d9);padding:2px;cursor:pointer"; - function click(type) { - if (type) { - statistics.style.display = "block"; - activity.style.display = "none"; - spans[1].style.fontSize = "75%"; - spans[0].style.fontSize = "90%"; - } else { - statistics.style.display = "none"; - activity.style.display = "block"; - spans[0].style.fontSize = "75%"; - spans[1].style.fontSize = "90%"; - } - } - - // #1 - spans[0] = document.createElement("span"); - spans[0].id = "ST-STATS"; - spans[0].innerText = "Statistics"; - spans[0].style = boxStyle; - h3.appendChild(spans[0]); - h3.appendChild(document.createTextNode(" ")); - // #2 - spans[1] = document.createElement("span"); - spans[1].id = "ST-WIBD"; - spans[1].innerText = "Recent Activity"; - spans[1].style = `${boxStyle};font-size:80%`; - h3.appendChild(spans[1]); - - // onclick - spans[0].onclick = function () { - click(true); - }; - spans[1].onclick = function () { - click(false); - }; - //=============================== - } - } -} - -ScratchTools.waitForElements( - "#activity-feed", - getStats, - "getUserStatistics", - false -); From aa55ff79476c2aeb274a245afe726b05aed2b7f8 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 4 Aug 2024 13:45:30 -0700 Subject: [PATCH 144/253] Remaining replies --- features/features.json | 5 ++ features/remaining-replies/data.json | 14 ++++++ features/remaining-replies/script.js | 70 ++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 features/remaining-replies/data.json create mode 100644 features/remaining-replies/script.js diff --git a/features/features.json b/features/features.json index 6e545b93..f1ae98d2 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "remaining-replies", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "video-recorder", diff --git a/features/remaining-replies/data.json b/features/remaining-replies/data.json new file mode 100644 index 00000000..172693bf --- /dev/null +++ b/features/remaining-replies/data.json @@ -0,0 +1,14 @@ +{ + "title": "Remaining Replies", + "description": "Shows how many more replies are allowed in a thread of studio comments.", + "credits": [ + { + "url": "https://scratch.mit.edu/users/rgantzos/", + "username": "rgantzos" + } + ], + "type": ["Website"], + "dynamic": true, + "scripts": [{ "file": "script.js", "runOn": "/studios/*" }] + } + \ No newline at end of file diff --git a/features/remaining-replies/script.js b/features/remaining-replies/script.js new file mode 100644 index 00000000..b9193f80 --- /dev/null +++ b/features/remaining-replies/script.js @@ -0,0 +1,70 @@ +export default async function ({ feature, console }) { + window.feature = feature + + ScratchTools.waitForElements(".flex-row.comment", function (comment) { + let data = feature.redux + .getState() + .comments.comments.find( + (c) => c.id.toString() === comment.id.split("-")[1] + ); + + if (data) { + let replyCount = + feature.redux.getState().comments.replies[data.id]?.length || 0; + let repliesLeft = 25 - replyCount; + + updateReply(data.id, repliesLeft); + } else { + let parent = findParent(Number(comment.id.split("-")[1])); + + if (parent) { + let replyCount = + feature.redux.getState().comments.replies[parent]?.length || 0; + let repliesLeft = 25 - replyCount; + updateReply(parent, repliesLeft); + } else { + console.log("nope") + } + } + }); + + function findParent(replyId) { + let replies = feature.redux.getState().comments.replies; + let keys = Object.keys(replies); + + let key = keys.find((k) => replies[k].find((r) => r.id === replyId)); + + return key ? Number(key) : null; + } + + function updateReply(commentId, count) { + let div = document.querySelector(`.comment#comments-${commentId}`); + if (!div) return; + + let reply = div.querySelector(".comment-reply span"); + + if (reply.querySelector(".ste-reply-count")) { + reply.querySelector( + ".ste-reply-count" + ).textContent = ` (${count.toString()} left)`; + } else { + let span = document.createElement("span"); + span.className = "ste-reply-count"; + feature.self.hideOnDisable(span) + span.textContent = ` (${count.toString()} left)`; + reply.appendChild(span); + } + + let data = feature.redux + .getState() + .comments.comments.find((c) => c.id.toString() === commentId.toString()); + + let replies = feature.redux.getState().comments.replies[commentId.toString()]; + + if (data && replies) { + for (var i in replies) { + updateReply(replies[i].id, count); + } + } + } +} From f0c5921caae9960e5f61503e5338070ae60fcf01 Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 00:00:15 +0000 Subject: [PATCH 145/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index 0dfa016b..9b081dc5 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From 580cd9a6bfc815dd9a22dc01cba453c950a618eb Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 18 Aug 2024 13:53:58 -0700 Subject: [PATCH 146/253] Change username credit for Projects from Country feature --- features/localized-explore/data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/localized-explore/data.json b/features/localized-explore/data.json index 16afb48e..2ed32d0c 100644 --- a/features/localized-explore/data.json +++ b/features/localized-explore/data.json @@ -2,7 +2,7 @@ "title": "Projects from Country", "description": "On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand.", "credits": [ - { "username": "EiramC", "url": "https://scratch.mit.edu/users/EiramC/" }, + { "username": "KitsunLilly", "url": "https://scratch.mit.edu/users/KitsunLilly/" }, { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } ], "type": ["Website"], From a0e20bda0343080817175754546236669eb80257 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Fri, 23 Aug 2024 12:27:56 -0700 Subject: [PATCH 147/253] webp uploads --- features/features.json | 5 + features/webp-uploads/data.json | 10 ++ features/webp-uploads/script.js | 173 ++++++++++++++++++++++++++++++++ 3 files changed, 188 insertions(+) create mode 100644 features/webp-uploads/data.json create mode 100644 features/webp-uploads/script.js diff --git a/features/features.json b/features/features.json index fa38492f..44c8da8d 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "webp-uploads", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "explore-filter", diff --git a/features/webp-uploads/data.json b/features/webp-uploads/data.json new file mode 100644 index 00000000..a39533fb --- /dev/null +++ b/features/webp-uploads/data.json @@ -0,0 +1,10 @@ +{ + "title": "WEBP Uploads", + "description": "Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops.", + "credits": [ + { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } + ], + "type": ["Editor"], + "tags": ["New", "Featured"], + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }] +} diff --git a/features/webp-uploads/script.js b/features/webp-uploads/script.js new file mode 100644 index 00000000..4a486b06 --- /dev/null +++ b/features/webp-uploads/script.js @@ -0,0 +1,173 @@ +export default async function ({ feature, console }) { + let fileInput = { + costume: null, + sprite: null, + stage: null, + }; + + ScratchTools.waitForElements( + "div[class*='asset-panel_wrapper_'] input[type=file]", + function (input) { + fileInput.costume = input; + + fileInput.costume.parentElement.addEventListener("click", function (e) { + e.preventDefault(); + e.stopImmediatePropagation(); + + let input = document.createElement("input"); + input.accept = ".svg, .png, .bmp, .jpg, .jpeg, .gif, .webp"; + input.setAttribute("multiple", null); + input.type = "file"; + + let files = []; + + input.addEventListener("change", async function () { + const dataTransfer = new DataTransfer(); + + for (var i in input.files) { + let file = input.files[i]; + if (file?.type?.startsWith("image/")) { + if (file.type === "image/webp") { + let blob = await convertWebPFileToPng(file); + file = new File([blob], file.name.split(".")[0] + ".png", { + type: "image/png", + }); + dataTransfer.items.add(file); + } else { + dataTransfer.items.add(file); + } + } + } + + fileInput.costume.files = dataTransfer.files; + + fileInput.costume.dispatchEvent( + new Event("change", { bubbles: true }) + ); + }); + + input.click(); + }); + } + ); + + ScratchTools.waitForElements( + "div[class*='sprite-selector_sprite-selector_'] input[type=file]", + function (input) { + fileInput.sprite = input; + + fileInput.sprite.parentElement.addEventListener("click", function (e) { + e.preventDefault(); + e.stopImmediatePropagation(); + + let input = document.createElement("input"); + input.accept = ".svg, .png, .bmp, .jpg, .jpeg, .gif, .webp"; + input.setAttribute("multiple", null); + input.type = "file"; + + let files = []; + + input.addEventListener("change", async function () { + const dataTransfer = new DataTransfer(); + + for (var i in input.files) { + let file = input.files[i]; + if (file?.type?.startsWith("image/")) { + if (file.type === "image/webp") { + let blob = await convertWebPFileToPng(file); + file = new File([blob], file.name.split(".")[0] + ".png", { + type: "image/png", + }); + dataTransfer.items.add(file); + } else { + dataTransfer.items.add(file); + } + } + } + + fileInput.sprite.files = dataTransfer.files; + + fileInput.sprite.dispatchEvent( + new Event("change", { bubbles: true }) + ); + }); + + input.click(); + }); + } + ); + + ScratchTools.waitForElements( + "div[class*='stage-selector_stage-selector_'] input[type=file]", + function (input) { + fileInput.stage = input; + + fileInput.stage.parentElement.addEventListener("click", function (e) { + e.preventDefault(); + e.stopImmediatePropagation(); + + let input = document.createElement("input"); + input.accept = ".svg, .png, .bmp, .jpg, .jpeg, .gif, .webp"; + input.setAttribute("multiple", null); + input.type = "file"; + + let files = []; + + input.addEventListener("change", async function () { + const dataTransfer = new DataTransfer(); + + for (var i in input.files) { + let file = input.files[i]; + if (file?.type?.startsWith("image/")) { + if (file.type === "image/webp") { + let blob = await convertWebPFileToPng(file); + file = new File([blob], file.name.split(".")[0] + ".png", { + type: "image/png", + }); + dataTransfer.items.add(file); + } else { + dataTransfer.items.add(file); + } + } + } + + fileInput.stage.files = dataTransfer.files; + + fileInput.stage.dispatchEvent(new Event("change", { bubbles: true })); + }); + + input.click(); + }); + } + ); + + async function convertWebPFileToPng(webpFile) { + try { + const img = new Image(); + const webpUrl = URL.createObjectURL(webpFile); + img.src = webpUrl; + + await new Promise((resolve, reject) => { + img.onload = resolve; + img.onerror = reject; + }); + + const canvas = document.createElement("canvas"); + canvas.width = img.width; + canvas.height = img.height; + const ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0); + + const pngBlob = await new Promise((resolve) => { + canvas.toBlob(resolve, "image/png"); + }); + + URL.revokeObjectURL(webpUrl); + + return pngBlob; + } catch (error) { + console.error("Error converting webp to png:", error); + throw error; + } + } +} From d937ceb4cec79805e64f74663ea9ea10d9a437ca Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Fri, 23 Aug 2024 12:28:55 -0700 Subject: [PATCH 148/253] Update data.json --- features/webp-uploads/data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/webp-uploads/data.json b/features/webp-uploads/data.json index a39533fb..0ba81835 100644 --- a/features/webp-uploads/data.json +++ b/features/webp-uploads/data.json @@ -1,5 +1,5 @@ { - "title": "WEBP Uploads", + "title": "WEBP Image Uploads", "description": "Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops.", "credits": [ { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } From 4ebd112c6a79a957dc78dba2153079e2afa3ab26 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Fri, 23 Aug 2024 12:36:14 -0700 Subject: [PATCH 149/253] dynamic! --- features/webp-uploads/data.json | 1 + features/webp-uploads/script.js | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/features/webp-uploads/data.json b/features/webp-uploads/data.json index 0ba81835..4301dfd8 100644 --- a/features/webp-uploads/data.json +++ b/features/webp-uploads/data.json @@ -6,5 +6,6 @@ ], "type": ["Editor"], "tags": ["New", "Featured"], + "dynamic": true, "scripts": [{ "file": "script.js", "runOn": "/projects/*" }] } diff --git a/features/webp-uploads/script.js b/features/webp-uploads/script.js index 4a486b06..5b0f8e6f 100644 --- a/features/webp-uploads/script.js +++ b/features/webp-uploads/script.js @@ -11,6 +11,8 @@ export default async function ({ feature, console }) { fileInput.costume = input; fileInput.costume.parentElement.addEventListener("click", function (e) { + if (!feature.self.enabled) return; + e.preventDefault(); e.stopImmediatePropagation(); @@ -57,6 +59,8 @@ export default async function ({ feature, console }) { fileInput.sprite = input; fileInput.sprite.parentElement.addEventListener("click", function (e) { + if (!feature.self.enabled) return; + e.preventDefault(); e.stopImmediatePropagation(); @@ -103,6 +107,8 @@ export default async function ({ feature, console }) { fileInput.stage = input; fileInput.stage.parentElement.addEventListener("click", function (e) { + if (!feature.self.enabled) return; + e.preventDefault(); e.stopImmediatePropagation(); From 640270f495caff0b81bd845dbb15a4e24a5f11d5 Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Sat, 24 Aug 2024 00:00:16 +0000 Subject: [PATCH 150/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index 9b081dc5..8279bfe4 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From ea495c4962fab76bb556233687f5ce8b4f5289f5 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sat, 24 Aug 2024 17:48:10 -0700 Subject: [PATCH 151/253] Disable Cloud --- features/disable-cloud/data.json | 13 +++++++++ features/disable-cloud/script.js | 48 ++++++++++++++++++++++++++++++++ features/disable-cloud/style.css | 12 ++++++++ features/features.json | 5 ++++ 4 files changed, 78 insertions(+) create mode 100644 features/disable-cloud/data.json create mode 100644 features/disable-cloud/script.js create mode 100644 features/disable-cloud/style.css diff --git a/features/disable-cloud/data.json b/features/disable-cloud/data.json new file mode 100644 index 00000000..42601723 --- /dev/null +++ b/features/disable-cloud/data.json @@ -0,0 +1,13 @@ +{ + "title": "Disable Cloud", + "description": "Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any.", + "credits": [ + { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } + ], + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], + "styles": [{ "file": "style.css", "runOn": "/projects/*" }], + "type": ["Editor"], + "tags": ["New", "Featured"], + "dynamic": true + } + \ No newline at end of file diff --git a/features/disable-cloud/script.js b/features/disable-cloud/script.js new file mode 100644 index 00000000..92f441b0 --- /dev/null +++ b/features/disable-cloud/script.js @@ -0,0 +1,48 @@ +export default async function ({ feature, console }) { + feature.traps.gui().projectState.cloudStatus = "ENABLED"; + + ScratchTools.waitForElements(".extension-chip", function (chip) { + if (!chip.firstChild.src.endsWith("/svgs/project/clouddata.svg")) return; + if (chip.querySelector(".ste-cloud-disable")) return; + + let content = chip.querySelector(".extension-content"); + + let outer = document.createElement("div"); + outer.className = "ste-action-holder"; + outer.appendChild(content.lastChild); + + let div = document.createElement("div"); + div.className = "extension-action ste-cloud-disable"; + outer.appendChild(div); + + feature.self.hideOnDisable(div) + + let span = document.createElement("span"); + span.textContent = "Disable"; + div.appendChild(span); + + span.addEventListener("click", function () { + if (span.textContent === "Disable") { + span.textContent = "Enable"; + feature.traps.gui().projectState.cloudStatus = "DISABLED"; + } else { + span.textContent = "Disable"; + feature.traps.gui().projectState.cloudStatus = "ENABLED"; + } + }); + + content.appendChild(outer); + }); + + const nativeWsSend = WebSocket.prototype.send; + WebSocket.prototype.send = function (...args) { + let data = JSON.parse(args[0]); + if ( + data.method === "set" && + feature.traps.gui().projectState.cloudStatus === "DISABLED" && + feature.self.enabled + ) + return; + return nativeWsSend.call(this, ...args); + }; +} diff --git a/features/disable-cloud/style.css b/features/disable-cloud/style.css new file mode 100644 index 00000000..88d0712c --- /dev/null +++ b/features/disable-cloud/style.css @@ -0,0 +1,12 @@ +.ste-cloud-disable { + height: 14px; + margin-left: .25rem; + cursor: pointer; + padding-top: 1px !important; + position: relative; + top: 1px; +} + +.extension-chip .extension-action { + display: inline-flex !important; +} \ No newline at end of file diff --git a/features/features.json b/features/features.json index 44c8da8d..5206ba59 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "disable-cloud", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "webp-uploads", From 9102f016c4baeb8729945bbc341f4346bd0e0cd8 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 25 Aug 2024 15:59:06 -0700 Subject: [PATCH 152/253] Asset Size --- features/asset-size/data.json | 13 +++++++ features/asset-size/script.js | 57 ++++++++++++++++++++++++++++ features/features.json | 5 +++ features/remaining-replies/script.js | 2 - 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 features/asset-size/data.json create mode 100644 features/asset-size/script.js diff --git a/features/asset-size/data.json b/features/asset-size/data.json new file mode 100644 index 00000000..9b31f47c --- /dev/null +++ b/features/asset-size/data.json @@ -0,0 +1,13 @@ +{ + "title": "Asset Size", + "description": "Allows you to hover over any asset (costumes and sounds) in the editor to view the file size.", + "credits": [ + { + "url": "https://scratch.mit.edu/users/rgantzos/", + "username": "rgantzos" + } + ], + "type": ["Editor"], + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }] + } + \ No newline at end of file diff --git a/features/asset-size/script.js b/features/asset-size/script.js new file mode 100644 index 00000000..a1aaebbe --- /dev/null +++ b/features/asset-size/script.js @@ -0,0 +1,57 @@ +export default async function ({ feature, console }) { + ScratchTools.waitForElements( + "div[class*='asset-panel_wrapper_'] div[class*='selector_list-area_'] > div", + function (asset) { + if (asset.dataset.ste === "ste-file-size") return; + asset.dataset.ste = "ste-file-size"; + + let content = asset.querySelector( + "div[class*='sprite-selector-item_sprite-info_-'] div[class*='sprite-selector-item_sprite-details_']" + ); + + asset.firstChild.addEventListener("mouseover", function () { + let scratchAsset = ScratchTools.Scratch.vm.editingTarget; + let targetAssets = + feature.traps.gui().editorTab?.activeTabIndex === 1 + ? scratchAsset.getCostumes() + : scratchAsset.getSounds(); + let data = targetAssets[getElementIndex(asset)].asset.data.byteLength; + + content.dataset.previousContent = content.textContent; + content.textContent = formatBytes(data); + }); + + asset.firstChild.addEventListener("mouseout", function () { + if (content.dataset.previousContent) { + content.textContent = content.dataset.previousContent; + } + }); + } + ); + + function getElementIndex(element) { + const parent = element.parentElement; + + const children = parent.children; + + for (let i = 0; i < children.length; i++) { + if (children[i] === element) { + return i; + } + } + + return -1; + } + + function formatBytes(bytes, decimals = 2) { + if (bytes === 0) return "0 Bytes"; + + const k = 1024; + const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + + const sizeInUnits = parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)); + + return `${sizeInUnits} ${sizes[i]}`; + } +} diff --git a/features/features.json b/features/features.json index 6ccffea7..9f0054a1 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "asset-size", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "disable-cloud", diff --git a/features/remaining-replies/script.js b/features/remaining-replies/script.js index b9193f80..ac444348 100644 --- a/features/remaining-replies/script.js +++ b/features/remaining-replies/script.js @@ -1,6 +1,4 @@ export default async function ({ feature, console }) { - window.feature = feature - ScratchTools.waitForElements(".flex-row.comment", function (comment) { let data = feature.redux .getState() From 6be8082c30929a8c7a0d16778ae925715ca2b10a Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 25 Aug 2024 16:01:05 -0700 Subject: [PATCH 153/253] Update script.js --- features/asset-size/script.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/features/asset-size/script.js b/features/asset-size/script.js index a1aaebbe..382c7046 100644 --- a/features/asset-size/script.js +++ b/features/asset-size/script.js @@ -10,6 +10,8 @@ export default async function ({ feature, console }) { ); asset.firstChild.addEventListener("mouseover", function () { + if (!feature.self.enabled) return; + let scratchAsset = ScratchTools.Scratch.vm.editingTarget; let targetAssets = feature.traps.gui().editorTab?.activeTabIndex === 1 From 616bffdf9bdf89f8b8795bbe667bb1b33f659e45 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sun, 25 Aug 2024 16:01:19 -0700 Subject: [PATCH 154/253] Update data.json --- features/asset-size/data.json | 1 + 1 file changed, 1 insertion(+) diff --git a/features/asset-size/data.json b/features/asset-size/data.json index 9b31f47c..ab88577f 100644 --- a/features/asset-size/data.json +++ b/features/asset-size/data.json @@ -8,6 +8,7 @@ } ], "type": ["Editor"], + "dynamic": true, "scripts": [{ "file": "script.js", "runOn": "/projects/*" }] } \ No newline at end of file From c46845228a190b914b1b93825a5e76e2da596a7f Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 00:00:16 +0000 Subject: [PATCH 155/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index 8279bfe4..12c05182 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"disable-cloud/title":{"message":"Disable Cloud"},"disable-cloud/description":{"message":"Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any."},"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From e2909dc59e9dc33fd1bc97c04df6cf1c4e59b732 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Mon, 26 Aug 2024 08:18:45 -0700 Subject: [PATCH 156/253] Add How-To video links --- extras/icons/external.svg | 1 + extras/popup/popup.css | 23 +++++++++++++++++++++++ extras/popup/popup.js | 17 +++++++++++++++++ extras/style.css | 20 ++++++++++++++++++++ features/asset-size/data.json | 5 ++++- features/chomp-blocks/data.json | 5 ++++- features/custom-explore/data.json | 5 ++++- features/more-editor-fonts/data.json | 5 ++++- features/rotate-gradient/data.json | 5 ++++- 9 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 extras/icons/external.svg diff --git a/extras/icons/external.svg b/extras/icons/external.svg new file mode 100644 index 00000000..445732ca --- /dev/null +++ b/extras/icons/external.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extras/popup/popup.css b/extras/popup/popup.css index a421c854..d55125c4 100644 --- a/extras/popup/popup.css +++ b/extras/popup/popup.css @@ -508,4 +508,27 @@ span.new-feature-tag.beta { .option-selection span:last-child { border-inline-end: none; +} + +/* Support */ + +.support-vid { + color: #ff9f00 !important; + opacity: .5; + cursor: pointer; + position: relative; + top: -.25rem; + margin-bottom: .25rem; + display: block; +} + +.support-vid:hover { + opacity: 1; +} + +.support-vid img { + height: 1rem; + margin-left: .25rem; + position: relative; + top: .3rem; } \ No newline at end of file diff --git a/extras/popup/popup.js b/extras/popup/popup.js index c32f55d2..f6c735ff 100644 --- a/extras/popup/popup.js +++ b/extras/popup/popup.js @@ -679,6 +679,23 @@ async function getFeatures() { languageData[feature.id + "/description"]?.message || feature.description; div.appendChild(p); + if (feature.support?.yt) { + let span = document.createElement("span") + span.textContent = "How-To Video" + span.className = "support-vid" + span.dataset.url = feature.support.yt + span.addEventListener("click", function() { + let url = this.dataset.url + chrome.tabs.create({ + url, + }) + }) + span.appendChild(Object.assign(document.createElement("img"), { + src: "/extras/icons/external.svg" + })) + div.appendChild(span) + } + if (feature.options) { for (var optionPlace in feature.options) { var option = feature.options[optionPlace]; diff --git a/extras/style.css b/extras/style.css index f1524756..5334565a 100644 --- a/extras/style.css +++ b/extras/style.css @@ -887,4 +887,24 @@ body { .option-selection span:last-child { border-inline-end: none; +} +/* Support */ + +.support-vid { + color: #ff9f00 !important; + opacity: .5; + cursor: pointer; + position: relative; + top: -.25rem; +} + +.support-vid:hover { + opacity: 1; +} + +.support-vid img { + height: 1rem; + margin-left: .25rem; + position: relative; + top: .3rem; } \ No newline at end of file diff --git a/features/asset-size/data.json b/features/asset-size/data.json index ab88577f..3c919da9 100644 --- a/features/asset-size/data.json +++ b/features/asset-size/data.json @@ -9,6 +9,9 @@ ], "type": ["Editor"], "dynamic": true, - "scripts": [{ "file": "script.js", "runOn": "/projects/*" }] + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], + "support": { + "yt": "https://youtu.be/gpH3VJvDTkc" + } } \ No newline at end of file diff --git a/features/chomp-blocks/data.json b/features/chomp-blocks/data.json index a138facd..7a8ca42e 100644 --- a/features/chomp-blocks/data.json +++ b/features/chomp-blocks/data.json @@ -10,5 +10,8 @@ "tags": [], "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], "dynamic": true, - "type": ["Editor"] + "type": ["Editor"], + "support": { + "yt": "https://youtu.be/6sl-Q0ZYYyQ" + } } diff --git a/features/custom-explore/data.json b/features/custom-explore/data.json index d3e37908..5d82a3f8 100644 --- a/features/custom-explore/data.json +++ b/features/custom-explore/data.json @@ -61,5 +61,8 @@ } ] } - ] + ], + "support": { + "yt": "https://youtu.be/QIWxCXrD2-M" + } } diff --git a/features/more-editor-fonts/data.json b/features/more-editor-fonts/data.json index 86a9d203..d2d33fbd 100644 --- a/features/more-editor-fonts/data.json +++ b/features/more-editor-fonts/data.json @@ -12,5 +12,8 @@ "tags": ["New", "Featured"], "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], "styles": [{ "file": "style.css", "runOn": "/projects/*" }], - "resources": [{ "name": "more-text-icon", "path": "/text.svg" }] + "resources": [{ "name": "more-text-icon", "path": "/text.svg" }], + "support": { + "yt": "https://youtu.be/zh3zsjBcz_M" + } } diff --git a/features/rotate-gradient/data.json b/features/rotate-gradient/data.json index 899bcaab..1edb09bc 100644 --- a/features/rotate-gradient/data.json +++ b/features/rotate-gradient/data.json @@ -10,5 +10,8 @@ "type": ["Editor"], "dynamic": true, "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], - "styles": [{ "file": "style.css", "runOn": "/projects/*" }] + "styles": [{ "file": "style.css", "runOn": "/projects/*" }], + "support": { + "yt": "https://youtu.be/5S032vWPvd0" + } } From d1bdb63ae2c50aba7ba1b9a48a49eb0d1f93344c Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 00:00:17 +0000 Subject: [PATCH 157/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index 12c05182..fddcf44e 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"disable-cloud/title":{"message":"Disable Cloud"},"disable-cloud/description":{"message":"Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any."},"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"asset-size/title":{"message":"Asset Size"},"asset-size/description":{"message":"Allows you to hover over any asset (costumes and sounds) in the editor to view the file size."},"disable-cloud/title":{"message":"Disable Cloud"},"disable-cloud/description":{"message":"Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any."},"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From 5914db3bb4491f686428064f96f5f5509b5f70b1 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Mon, 2 Sep 2024 14:01:09 -0700 Subject: [PATCH 158/253] More Paint Functions --- features/features.json | 5 + features/more-editor-fonts/script.js | 1 + features/more-paint-functions/data.json | 22 +++ .../more-paint-functions/icons/exclude.svg | 13 ++ .../more-paint-functions/icons/intersect.svg | 20 +++ .../more-paint-functions/icons/subtract.svg | 17 ++ features/more-paint-functions/icons/unite.svg | 13 ++ features/more-paint-functions/script.js | 161 ++++++++++++++++++ features/more-paint-functions/style.css | 7 + 9 files changed, 259 insertions(+) create mode 100644 features/more-paint-functions/data.json create mode 100644 features/more-paint-functions/icons/exclude.svg create mode 100644 features/more-paint-functions/icons/intersect.svg create mode 100644 features/more-paint-functions/icons/subtract.svg create mode 100644 features/more-paint-functions/icons/unite.svg create mode 100644 features/more-paint-functions/script.js create mode 100644 features/more-paint-functions/style.css diff --git a/features/features.json b/features/features.json index 9f0054a1..9588ccbe 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "more-paint-functions", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "asset-size", diff --git a/features/more-editor-fonts/script.js b/features/more-editor-fonts/script.js index 791529dc..7efad503 100644 --- a/features/more-editor-fonts/script.js +++ b/features/more-editor-fonts/script.js @@ -9,6 +9,7 @@ export default async function ({ feature, console }) { feature.page.waitForElements( "div[class^='asset-panel_wrapper_'] div[class^='action-menu_more-buttons_']", function (menu) { + if (feature.traps.gui().editorTab.activeTabIndex !== 1) return; if (menu.querySelector(".ste-more-fonts")) return; let div = document.createElement("div"); diff --git a/features/more-paint-functions/data.json b/features/more-paint-functions/data.json new file mode 100644 index 00000000..11c00e90 --- /dev/null +++ b/features/more-paint-functions/data.json @@ -0,0 +1,22 @@ +{ + "title": "More Paint Functions", + "description": "Adds new functions to the paint editor. The new functions include unite (combining them into one), subtract (removing one shape from another), exclude (removing the overlap of 2 items), and intersect (removing everything but the overlap of 2 items). Each function only works with 2 items.", + "credits": [ + { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } + ], + "type": ["Editor"], + "tags": ["New", "Featured"], + "dynamic": true, + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], + "styles": [{ "file": "style.css", "runOn": "/projects/*" }], + "resources": [ + { "name": "function-exclude", "path": "/icons/exclude.svg" }, + { "name": "function-intersect", "path": "/icons/intersect.svg" }, + { "name": "function-subtract", "path": "/icons/subtract.svg" }, + { "name": "function-unite", "path": "/icons/unite.svg" } + ], + "components": [{ + "type": "warning", + "content": "In order to avoid clutter in the paint editor, this feature replaces the Copy, Paste and Delete buttons. However, hotkeys still work." + }] +} diff --git a/features/more-paint-functions/icons/exclude.svg b/features/more-paint-functions/icons/exclude.svg new file mode 100644 index 00000000..76c50759 --- /dev/null +++ b/features/more-paint-functions/icons/exclude.svg @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/features/more-paint-functions/icons/intersect.svg b/features/more-paint-functions/icons/intersect.svg new file mode 100644 index 00000000..399d3a7d --- /dev/null +++ b/features/more-paint-functions/icons/intersect.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/features/more-paint-functions/icons/subtract.svg b/features/more-paint-functions/icons/subtract.svg new file mode 100644 index 00000000..4d10c195 --- /dev/null +++ b/features/more-paint-functions/icons/subtract.svg @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/features/more-paint-functions/icons/unite.svg b/features/more-paint-functions/icons/unite.svg new file mode 100644 index 00000000..dee97002 --- /dev/null +++ b/features/more-paint-functions/icons/unite.svg @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/features/more-paint-functions/script.js b/features/more-paint-functions/script.js new file mode 100644 index 00000000..ddfd0849 --- /dev/null +++ b/features/more-paint-functions/script.js @@ -0,0 +1,161 @@ +export default async function ({ feature, console }) { + function unite() { + let paper = feature.traps.getPaper(); + let items = paper.project.selectedItems; + + if (items.length !== 2) return; + + for (var i in items) { + if (i > 0) { + items[0].unite(items[i]); + } + } + + for (var i in items) { + items[i].remove(); + } + + paper.tool.onUpdateImage(); + } + + function subtract() { + let paper = feature.traps.getPaper(); + let items = paper.project.selectedItems; + + if (items.length !== 2) return; + + for (var i in items) { + if (i > 0) { + items[0].subtract(items[i]); + } + } + + for (var i in items) { + items[i].remove(); + } + + paper.tool.onUpdateImage(); + } + + function exclude() { + let paper = feature.traps.getPaper(); + let items = paper.project.selectedItems; + + if (items.length !== 2) return; + + for (var i in items) { + if (i > 0) { + items[0].exclude(items[i]); + } + } + + for (var i in items) { + items[i].remove(); + } + + paper.tool.onUpdateImage(); + } + + function intersect() { + let paper = feature.traps.getPaper(); + let items = paper.project.selectedItems; + + if (items.length !== 2) return; + + for (var i in items) { + if (i > 0) { + items[0].intersect(items[i]); + } + } + + for (var i in items) { + items[i].remove(); + } + + paper.tool.onUpdateImage(); + } + + ScratchTools.waitForElements( + "div[class^='mode-tools_mod-labeled-icon-height_']", + async function (row) { + if (row.querySelector(".ste-more-functions")) return; + + let functions = [ + { + name: "Unite", + icon: "function-unite", + callback: unite, + }, + { + name: "Subtract", + icon: "function-subtract", + callback: subtract, + }, + { + name: "Exclude", + icon: "function-exclude", + callback: exclude, + }, + { + name: "Intersect", + icon: "function-intersect", + callback: intersect, + }, + ]; + + for (var i in functions) { + row.appendChild(makeButton(functions[i])); + } + + let align = await ScratchTools.waitForElement(".ste-align-items"); + row.appendChild(align); + } + ); + + feature.redux.subscribe(function () { + if (document.querySelector(".ste-more-functions")) { + let span = document.querySelector(".ste-more-functions"); + if ( + feature.traps.paint().format === "BITMAP" || + feature.traps.paint().selectedItems?.length < 2 + ) { + document.querySelectorAll(".ste-more-functions").forEach(function (el) { + el.classList.add("button_mod-disabled_1rf31"); + }); + } else { + document.querySelectorAll(".ste-more-functions").forEach(function (el) { + el.classList.remove("button_mod-disabled_1rf31"); + }); + } + } + }); + + function makeButton({ name, icon, callback }) { + let span = document.createElement("span"); + span.className = + "button_button_u6SE2 labeled-icon-button_mod-edit-field_1bXYC ste-more-functions"; + span.role = "button"; + + let img = document.createElement("img"); + img.src = feature.self.getResource(icon); + img.className = "labeled-icon-button_edit-field-icon_3j-Pf"; + img.alt = name; + img.title = name; + img.draggable = false; + span.appendChild(img); + + let label = document.createElement("span"); + label.textContent = name; + label.className = "labeled-icon-button_edit-field-title_1ZoEV"; + span.appendChild(label); + + span.addEventListener("click", function (e) { + if (span.className.includes("disabled")) return; + callback(); + }); + + feature.self.hideOnDisable(span); + + return span; + } +} diff --git a/features/more-paint-functions/style.css b/features/more-paint-functions/style.css new file mode 100644 index 00000000..752ac1b7 --- /dev/null +++ b/features/more-paint-functions/style.css @@ -0,0 +1,7 @@ +div[class*='mode-tools_mode-tools_'] > div[class*='mode-tools_mod-dashed-border_']:nth-child(1), div[class*='mode-tools_mode-tools_'] > div[class*='mode-tools_mod-dashed-border_']:nth-child(2) { + display: none; +} + +div[class*='mode-tools_mode-tools_'] > div[class*='mode-tools_mod-labeled-icon-height_']:nth-child(3) { + margin-left: 0px !important; +} \ No newline at end of file From 8b894f342bd6d430d884b30d02d4e5789036f76d Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 21:17:16 +0000 Subject: [PATCH 159/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index fddcf44e..df65bcd4 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"asset-size/title":{"message":"Asset Size"},"asset-size/description":{"message":"Allows you to hover over any asset (costumes and sounds) in the editor to view the file size."},"disable-cloud/title":{"message":"Disable Cloud"},"disable-cloud/description":{"message":"Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any."},"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"more-paint-functions/title":{"message":"More Paint Functions"},"more-paint-functions/description":{"message":"Adds new functions to the paint editor. The new functions include unite (combining them into one), subtract (removing one shape from another), exclude (removing the overlap of 2 items), and intersect (removing everything but the overlap of 2 items). Each function only works with 2 items."},"asset-size/title":{"message":"Asset Size"},"asset-size/description":{"message":"Allows you to hover over any asset (costumes and sounds) in the editor to view the file size."},"disable-cloud/title":{"message":"Disable Cloud"},"disable-cloud/description":{"message":"Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any."},"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From 7eb6cc3330c0ecf9214e9a2d3f31481fa8d670a3 Mon Sep 17 00:00:00 2001 From: Masaabu Date: Tue, 3 Sep 2024 13:36:38 +0900 Subject: [PATCH 160/253] outline-shape-options --- features/features.json | 5 ++ features/outline-shape-options/data.json | 25 ++++++ .../resources/cap-butt.svg | 4 + .../resources/cap-round.svg | 4 + .../resources/cap-square.svg | 4 + .../resources/join-arcs.svg | 4 + .../resources/join-bevel.svg | 4 + .../resources/join-miter-clip.svg | 4 + .../resources/join-miter.svg | 4 + .../resources/join-round.svg | 4 + features/outline-shape-options/script.js | 80 +++++++++++++++++++ features/outline-shape-options/style.css | 3 + 12 files changed, 145 insertions(+) create mode 100644 features/outline-shape-options/data.json create mode 100644 features/outline-shape-options/resources/cap-butt.svg create mode 100644 features/outline-shape-options/resources/cap-round.svg create mode 100644 features/outline-shape-options/resources/cap-square.svg create mode 100644 features/outline-shape-options/resources/join-arcs.svg create mode 100644 features/outline-shape-options/resources/join-bevel.svg create mode 100644 features/outline-shape-options/resources/join-miter-clip.svg create mode 100644 features/outline-shape-options/resources/join-miter.svg create mode 100644 features/outline-shape-options/resources/join-round.svg create mode 100644 features/outline-shape-options/script.js create mode 100644 features/outline-shape-options/style.css diff --git a/features/features.json b/features/features.json index 9588ccbe..caa770ce 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "outline-shape-options", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "more-paint-functions", diff --git a/features/outline-shape-options/data.json b/features/outline-shape-options/data.json new file mode 100644 index 00000000..250698ba --- /dev/null +++ b/features/outline-shape-options/data.json @@ -0,0 +1,25 @@ +{ + "title": "Outline Shape Options", + "description": "Change the shape of the corners of the object's outline in the Paint Editor..", + "credits": [ + { + "username": "Masaabu-YT", + "url": "https://scratch.mit.edu/users/Masaabu-YT/" + } + ], + "type": ["Editor"], + "tags": ["New", "Featured"], + "dynamic": true, + "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], + "styles": [{ "file": "style.css", "runOn": "/projects/*" }], + "resources": [ + { "name": "Join-miter", "path": "/resources/join-miter.svg" }, + { "name": "Join-round", "path": "/resources/join-round.svg" }, + { "name": "Join-bevel", "path": "/resources/join-bevel.svg" }, + { "name": "Join-arcs", "path": "/resources/join-arcs.svg" }, + { "name": "Join-miter-clip", "path": "/resources/join-miter-clip.svg" }, + { "name": "Cap-butt", "path": "/resources/cap-butt.svg" }, + { "name": "Cap-round", "path": "/resources/cap-round.svg" }, + { "name": "Cap-square", "path": "/resources/cap-square.svg" } + ] +} diff --git a/features/outline-shape-options/resources/cap-butt.svg b/features/outline-shape-options/resources/cap-butt.svg new file mode 100644 index 00000000..65b4c0e8 --- /dev/null +++ b/features/outline-shape-options/resources/cap-butt.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/features/outline-shape-options/resources/cap-round.svg b/features/outline-shape-options/resources/cap-round.svg new file mode 100644 index 00000000..1b0cf28d --- /dev/null +++ b/features/outline-shape-options/resources/cap-round.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/features/outline-shape-options/resources/cap-square.svg b/features/outline-shape-options/resources/cap-square.svg new file mode 100644 index 00000000..c5d67c40 --- /dev/null +++ b/features/outline-shape-options/resources/cap-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/features/outline-shape-options/resources/join-arcs.svg b/features/outline-shape-options/resources/join-arcs.svg new file mode 100644 index 00000000..65452e9d --- /dev/null +++ b/features/outline-shape-options/resources/join-arcs.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/features/outline-shape-options/resources/join-bevel.svg b/features/outline-shape-options/resources/join-bevel.svg new file mode 100644 index 00000000..e6886775 --- /dev/null +++ b/features/outline-shape-options/resources/join-bevel.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/features/outline-shape-options/resources/join-miter-clip.svg b/features/outline-shape-options/resources/join-miter-clip.svg new file mode 100644 index 00000000..6004671c --- /dev/null +++ b/features/outline-shape-options/resources/join-miter-clip.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/features/outline-shape-options/resources/join-miter.svg b/features/outline-shape-options/resources/join-miter.svg new file mode 100644 index 00000000..710ba8f2 --- /dev/null +++ b/features/outline-shape-options/resources/join-miter.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/features/outline-shape-options/resources/join-round.svg b/features/outline-shape-options/resources/join-round.svg new file mode 100644 index 00000000..707fb425 --- /dev/null +++ b/features/outline-shape-options/resources/join-round.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/features/outline-shape-options/script.js b/features/outline-shape-options/script.js new file mode 100644 index 00000000..13995099 --- /dev/null +++ b/features/outline-shape-options/script.js @@ -0,0 +1,80 @@ +export default async function ({ feature, console }) { + const icons = { + Cap: [ + "butt", + "round", + "square" + ], + Join: [ + "miter", + "round", + "bevel", + "arcs", + "miter-clip" + ] + } + + function createSection(type) { + const selectedItems = feature.traps.getPaper().project.selectedItems; + const result = document.createElement("div"); + let strokeValue = undefined; + + function changeItems(pos, value) { + for (var i in selectedItems) { + if (selectedItems[i][pos]!==undefined) { + selectedItems[i][pos] = value; + } + } + } + + const row = document.createElement("div"); + row.classList.add('color-picker_row-header_173LQ') + const labelName = document.createElement("span"); + labelName.classList.add('color-picker_label-name_17igY') + labelName.textContent = `Line${type}`; + const labelReadout = document.createElement("span"); + labelReadout.classList.add('color-picker_label-readout_9vjb2') + if (selectedItems.length === 1) { + strokeValue = `${selectedItems[0][`stroke${type}`]}`; + labelReadout.textContent = strokeValue; + } + row.appendChild(labelName); + row.appendChild(labelReadout); + + const content = document.createElement("div") + content.classList.add('color-picker_gradient-picker-row_mnu4O') + icons[type].forEach(iconName => { + const icon = document.createElement("img"); + icon.classList.add(`ste-outline-shape-options-${iconName}`) + icon.src = feature.self.getResource(`${type}-${iconName}`); + if (iconName !== strokeValue) icon.classList.add("ste-outline-shape-options-passive"); + icon.addEventListener("click", () => { + changeItems(`stroke${type}`,`${iconName}`) + labelReadout.textContent = iconName + const elements = content.getElementsByTagName('*'); + for (let i=0; i Date: Tue, 3 Sep 2024 13:39:23 +0900 Subject: [PATCH 161/253] outline-shape-options --- features/outline-shape-options/data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/outline-shape-options/data.json b/features/outline-shape-options/data.json index 250698ba..b467132a 100644 --- a/features/outline-shape-options/data.json +++ b/features/outline-shape-options/data.json @@ -1,6 +1,6 @@ { "title": "Outline Shape Options", - "description": "Change the shape of the corners of the object's outline in the Paint Editor..", + "description": "Change the shape of the corners of the object's outline in the Paint Editor.", "credits": [ { "username": "Masaabu-YT", From 75f7a36a600e6e6fe5698f48937c89e3fc237e7c Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Tue, 3 Sep 2024 19:15:26 -0700 Subject: [PATCH 162/253] A few small changes --- features/outline-shape-options/data.json | 4 +- features/outline-shape-options/script.js | 84 ++++++++++++------------ 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/features/outline-shape-options/data.json b/features/outline-shape-options/data.json index b467132a..a7606f33 100644 --- a/features/outline-shape-options/data.json +++ b/features/outline-shape-options/data.json @@ -1,6 +1,6 @@ { - "title": "Outline Shape Options", - "description": "Change the shape of the corners of the object's outline in the Paint Editor.", + "title": "Customizable Shape Outlines", + "description": "Adds more options in the outline dropdown to allow you to customize the shape of the outline, such as making corners round.", "credits": [ { "username": "Masaabu-YT", diff --git a/features/outline-shape-options/script.js b/features/outline-shape-options/script.js index 13995099..f6bcae54 100644 --- a/features/outline-shape-options/script.js +++ b/features/outline-shape-options/script.js @@ -1,18 +1,8 @@ export default async function ({ feature, console }) { const icons = { - Cap: [ - "butt", - "round", - "square" - ], - Join: [ - "miter", - "round", - "bevel", - "arcs", - "miter-clip" - ] - } + Cap: ["butt", "round", "square"], + Join: ["miter", "round", "bevel", "arcs", "miter-clip"], + }; function createSection(type) { const selectedItems = feature.traps.getPaper().project.selectedItems; @@ -21,19 +11,19 @@ export default async function ({ feature, console }) { function changeItems(pos, value) { for (var i in selectedItems) { - if (selectedItems[i][pos]!==undefined) { + if (selectedItems[i][pos] !== undefined) { selectedItems[i][pos] = value; } } } const row = document.createElement("div"); - row.classList.add('color-picker_row-header_173LQ') + row.classList.add("color-picker_row-header_173LQ"); const labelName = document.createElement("span"); - labelName.classList.add('color-picker_label-name_17igY') - labelName.textContent = `Line${type}`; + labelName.classList.add("color-picker_label-name_17igY"); + labelName.textContent = `Line ${type}`; const labelReadout = document.createElement("span"); - labelReadout.classList.add('color-picker_label-readout_9vjb2') + labelReadout.classList.add("color-picker_label-readout_9vjb2"); if (selectedItems.length === 1) { strokeValue = `${selectedItems[0][`stroke${type}`]}`; labelReadout.textContent = strokeValue; @@ -41,40 +31,50 @@ export default async function ({ feature, console }) { row.appendChild(labelName); row.appendChild(labelReadout); - const content = document.createElement("div") - content.classList.add('color-picker_gradient-picker-row_mnu4O') - icons[type].forEach(iconName => { + const content = document.createElement("div"); + content.classList.add("color-picker_gradient-picker-row_mnu4O"); + icons[type].forEach((iconName) => { const icon = document.createElement("img"); - icon.classList.add(`ste-outline-shape-options-${iconName}`) + icon.classList.add(`ste-outline-shape-options-${iconName}`); icon.src = feature.self.getResource(`${type}-${iconName}`); - if (iconName !== strokeValue) icon.classList.add("ste-outline-shape-options-passive"); + if (iconName !== strokeValue) + icon.classList.add("ste-outline-shape-options-passive"); icon.addEventListener("click", () => { - changeItems(`stroke${type}`,`${iconName}`) - labelReadout.textContent = iconName - const elements = content.getElementsByTagName('*'); - for (let i=0; i Date: Thu, 5 Sep 2024 00:00:18 +0000 Subject: [PATCH 163/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index df65bcd4..5727477c 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"more-paint-functions/title":{"message":"More Paint Functions"},"more-paint-functions/description":{"message":"Adds new functions to the paint editor. The new functions include unite (combining them into one), subtract (removing one shape from another), exclude (removing the overlap of 2 items), and intersect (removing everything but the overlap of 2 items). Each function only works with 2 items."},"asset-size/title":{"message":"Asset Size"},"asset-size/description":{"message":"Allows you to hover over any asset (costumes and sounds) in the editor to view the file size."},"disable-cloud/title":{"message":"Disable Cloud"},"disable-cloud/description":{"message":"Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any."},"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"outline-shape-options/title":{"message":"Customizable Shape Outlines"},"outline-shape-options/description":{"message":"Adds more options in the outline dropdown to allow you to customize the shape of the outline, such as making corners round."},"more-paint-functions/title":{"message":"More Paint Functions"},"more-paint-functions/description":{"message":"Adds new functions to the paint editor. The new functions include unite (combining them into one), subtract (removing one shape from another), exclude (removing the overlap of 2 items), and intersect (removing everything but the overlap of 2 items). Each function only works with 2 items."},"asset-size/title":{"message":"Asset Size"},"asset-size/description":{"message":"Allows you to hover over any asset (costumes and sounds) in the editor to view the file size."},"disable-cloud/title":{"message":"Disable Cloud"},"disable-cloud/description":{"message":"Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any."},"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From fa46e4bd3d97746378e7dba8ce5011b5cdc6f3e0 Mon Sep 17 00:00:00 2001 From: Masaabu Date: Fri, 6 Sep 2024 17:18:05 +0900 Subject: [PATCH 164/253] fix-feature-traps-paint-cant-get --- api/vm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/vm.js b/api/vm.js index f587e948..413379e6 100644 --- a/api/vm.js +++ b/api/vm.js @@ -176,7 +176,7 @@ ScratchTools.Scratch.waitForContextMenu = function (info) { }; ScratchTools.Scratch.scratchPaint = function () { - var app = document.querySelector(".paint-editor_mode-selector_28iiQ"); + var app = document.querySelector(".paint-editor_mode-selector_28iiQ")||document.querySelector(".paint-editor_mode-selector_O2uhP"); if (app !== null) { return ( app[ From cb6929ddb3f95e64ee0a20ccd57bc265f6c7f470 Mon Sep 17 00:00:00 2001 From: Masaabu Date: Mon, 9 Sep 2024 12:36:14 +0900 Subject: [PATCH 165/253] update script.js --- features/project-miniplayer/script.js | 53 ++++++++++++++++----------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/features/project-miniplayer/script.js b/features/project-miniplayer/script.js index 36c0df84..83ae03f7 100644 --- a/features/project-miniplayer/script.js +++ b/features/project-miniplayer/script.js @@ -1,11 +1,38 @@ export default async function ({ feature, console }) { + let observerEnabled = false; + const miniplayerElement = document.createElement('div'); miniplayerElement.className = 'ste-project-miniplayer'; document.body.appendChild(miniplayerElement); - await ScratchTools.waitForElement("div.guiPlayer") - const guiPlayer = document.getElementsByClassName("guiPlayer")[0] - const projectHeader = document.querySelector('.description-block'); - const title = projectHeader.closest('.flex-row.project-notes'); + + await ScratchTools.waitForElements("div.guiPlayer", function(element) { + if (observerEnabled === false) createObserver(element) + }); + function createObserver(guiPlayer) { + const projectHeader = document.querySelector('.description-block'); + const title = projectHeader.closest('.flex-row.project-notes'); + + const callback = (entries, observer) => { + const editorPlayer = document.querySelector(".gui_stage-and-target-wrapper_Qg4hA .stage-wrapper_stage-wrapper_odn2t"); + entries.forEach(entry => { + if (entry.isIntersecting) { + miniplayerElement.style.display = 'none'; + title.insertAdjacentElement('beforebegin', guiPlayer); + } else if (editorPlayer) { + miniplayerElement.style.display = 'none'; + observerObject.disconnect() + observerEnabled = false; + } else { + miniplayerElement.style.display = 'block'; + miniplayerElement.appendChild(guiPlayer); + } + }); + }; + const observerObject = new IntersectionObserver(callback); + const targetArea = document.querySelector("div.preview .inner .project-notes") + observerObject.observe(targetArea); + observerEnabled = true; + } function updateSetting (key, value) { switch (key) { @@ -49,24 +76,6 @@ export default async function ({ feature, console }) { updateSetting('position-bottom', await feature.settings.get("position-bottom")); updateSetting('opacity', await feature.settings.get("opacity")); - const observerOptions = { - root: document - }; - const callback = (entries, observer) => { - entries.forEach(entry => { - if (entry.isIntersecting) { - miniplayerElement.style.display = 'none'; - title.insertAdjacentElement('beforebegin', guiPlayer); - } else { - miniplayerElement.style.display = 'block'; - miniplayerElement.appendChild(guiPlayer); - } - }); - }; - const observerObject = new IntersectionObserver(callback, observerOptions); - const targetArea = document.querySelector("div.preview .inner .project-notes") - observerObject.observe(targetArea); - feature.settings.addEventListener("changed", function({ key, value }) { updateSetting(key, value) }) From 7702af5557f40ba85bfef0aebdd5a8516872a3c7 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Fri, 13 Sep 2024 07:19:11 -0400 Subject: [PATCH 166/253] Fix Compatibility Issue Resolves #962 --- features/sprite-layers/style.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/features/sprite-layers/style.css b/features/sprite-layers/style.css index 178f6f77..38d7afbb 100644 --- a/features/sprite-layers/style.css +++ b/features/sprite-layers/style.css @@ -50,4 +50,8 @@ height: 2rem; position: relative; top: .5rem; -} \ No newline at end of file +} + +[class^="sprite-info_sprite-info_"]:hover { + overflow: visible !important; +} From baa63918b5454ff409e506705227bef5a2a757f2 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Fri, 13 Sep 2024 20:31:30 -0400 Subject: [PATCH 167/253] Fix text not showing up --- features/sprite-layers/style.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/features/sprite-layers/style.css b/features/sprite-layers/style.css index 38d7afbb..5308859a 100644 --- a/features/sprite-layers/style.css +++ b/features/sprite-layers/style.css @@ -18,6 +18,7 @@ font-size: 1.1rem; margin-bottom: .5rem; margin-left: .15rem; + color: #575e75 !important; } .ste-layers>div>div { @@ -44,6 +45,7 @@ line-height: .95rem; padding-left: .05rem; padding-right: .05rem; + color: #c8cad2 !important; } .ste-long-layers>div>div:nth-child(even) { From 2c3b9ee328aa63aadb1ba6f43f319eea016bf065 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sat, 14 Sep 2024 15:53:21 -0700 Subject: [PATCH 168/253] Update features.json --- features/features.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/features/features.json b/features/features.json index caa770ce..27c76b0c 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "fix-gifs", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "outline-shape-options", From 43cdd71bbc5874f9981edbfebb46cf6c9ad8bb3d Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sat, 30 Nov 2024 09:39:42 -0800 Subject: [PATCH 169/253] Add option to not hide advertisements in studio comments --- features/hide-advertisements/data.json | 9 ++++++++- features/hide-advertisements/style.css | 4 ++-- features/hide-advertisements/three.js | 10 ++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/features/hide-advertisements/data.json b/features/hide-advertisements/data.json index cd4ee4c4..1b3e3192 100644 --- a/features/hide-advertisements/data.json +++ b/features/hide-advertisements/data.json @@ -17,6 +17,13 @@ { "file": "three.js", "runOn": "/studios/*" }, { "file": "two.js", "runOn": "/users/*" } ], - "options": [{ "id": "colorComment", "name": "Highlight Comments", "type": 1 }], + "options": [ + { "id": "colorComment", "name": "Highlight Comments", "type": 1 }, + { + "id": "dontHideStudioComments", + "name": "Don't Hide Studio Comments", + "type": 1 + } + ], "similar": ["important-messages", "block-messages"] } diff --git a/features/hide-advertisements/style.css b/features/hide-advertisements/style.css index e3627493..b207372c 100644 --- a/features/hide-advertisements/style.css +++ b/features/hide-advertisements/style.css @@ -1,4 +1,4 @@ -body.colorComment .scratchtoolsAd .comment-bubble, .scratchtoolsAd .comment-bubble::before { +body.colorComment .scratchtoolsAd .comment-bubble, body.colorComment .scratchtoolsAd .comment-bubble::before { background-color: #eccedf !important; border: 1px solid #ff6680; } @@ -9,6 +9,6 @@ body.colorComment .scratchtoolsAd .comment-bubble:before { background-color: #eccedf !important; } -body.hideComment .scratchtoolsAd { +body.hideComment:not(.dontHideStudioComments) .scratchtoolsAd { display: none; } diff --git a/features/hide-advertisements/three.js b/features/hide-advertisements/three.js index bb203a3c..fceabbeb 100644 --- a/features/hide-advertisements/three.js +++ b/features/hide-advertisements/three.js @@ -6,6 +6,10 @@ if (ScratchTools.Storage.colorComment) { document.body.classList.add("hideComment"); } +if (ScratchTools.Storage.dontHideStudioComments) { + document.body.classList.add("dontHideStudioComments") +} + var hideAds = new Feature({ id: "hide-advertisements" }); hideAds.settings.addEventListener("changed", function ({key: name, value}) { if (name === "colorComment") { @@ -16,6 +20,12 @@ hideAds.settings.addEventListener("changed", function ({key: name, value}) { document.body.classList.remove("colorComment"); document.body.classList.add("hideComment"); } + } else if (name === "dontHideStudioComments") { + if (value) { + document.body.classList.add("dontHideStudioComments") + } else { + document.body.classList.remove("dontHideStudioComments") + } } }); From 0ad6f43abec5a652a1a63abeb0e8320f8bb647fc Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sat, 30 Nov 2024 09:40:21 -0800 Subject: [PATCH 170/253] Revert "Update features.json" This reverts commit 2c3b9ee328aa63aadb1ba6f43f319eea016bf065. --- features/features.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/features/features.json b/features/features.json index 27c76b0c..caa770ce 100644 --- a/features/features.json +++ b/features/features.json @@ -1,9 +1,4 @@ [ - { - "version": 2, - "id": "fix-gifs", - "versionAdded": "v4.0.0" - }, { "version": 2, "id": "outline-shape-options", From 460de3a2b69ac1159fbaa8eb76ac1fa960399583 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sat, 30 Nov 2024 09:41:35 -0800 Subject: [PATCH 171/253] Fix duplicates in `select-self` --- features/select-self/script.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/features/select-self/script.js b/features/select-self/script.js index 233076c2..2eb3ef86 100644 --- a/features/select-self/script.js +++ b/features/select-self/script.js @@ -88,7 +88,9 @@ export default async function ({ feature, console }) { feature.self.enabled || feature.traps.vm.runtime._editingTarget?.sprite?.name !== SPRITES[i] ) { - data.push([SPRITES[i], SPRITES[i]]); + if (!data.find((el) => el[0] === SPRITES[i])) { + data.push([SPRITES[i], SPRITES[i]]); + } } } From 3234d04226d310da0010852a6bb4bbefe0fdec28 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sat, 30 Nov 2024 09:42:04 -0800 Subject: [PATCH 172/253] New API: `feature.getInternals()` --- api/feature.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api/feature.js b/api/feature.js index d37bad3c..26fe2fb1 100644 --- a/api/feature.js +++ b/api/feature.js @@ -81,6 +81,12 @@ class Feature { path: window.location.pathname, scratch: document.querySelector("#app") ? 3 : 2, } + this.getInternals = function(element) { + let reactKey = Object.keys(element).find((key) => key.startsWith("__reactInternalInstance")) + if (!reactKey) return null; + + return element[reactKey] + } this.redux = document.querySelector("#app")?.[ Object.keys(app).find((key) => key.startsWith("__reactContainer")) ].child.stateNode.store From 97e6ce169a688d95c46aac36993967fd7a944c26 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sat, 30 Nov 2024 09:44:33 -0800 Subject: [PATCH 173/253] Update vm.js --- api/vm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/vm.js b/api/vm.js index 413379e6..b5838473 100644 --- a/api/vm.js +++ b/api/vm.js @@ -176,7 +176,7 @@ ScratchTools.Scratch.waitForContextMenu = function (info) { }; ScratchTools.Scratch.scratchPaint = function () { - var app = document.querySelector(".paint-editor_mode-selector_28iiQ")||document.querySelector(".paint-editor_mode-selector_O2uhP"); + var app = document.querySelector(".paint-editor_mode-selector_28iiQ")||document.querySelector(".paint-editor_mode-selector_O2uhP")||document.querySelector("[class*='paint-editor_mode-selector_']"); if (app !== null) { return ( app[ From 4b74d5e92e81f40e1afbb56e549f03b2670bc731 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sat, 30 Nov 2024 11:20:12 -0800 Subject: [PATCH 174/253] New API: `scratchClass` --- api/main.js | 63 +++++++++++++++++++++-- api/module.js | 22 ++++++++ features/dark-paint-editor/script.js | 6 +-- features/delete-all.js | 2 +- features/echo-effect/script.js | 6 +-- features/go-to-parent/script.js | 2 +- features/last-key-pressed.js | 2 +- features/more-block-themes/script.js | 10 ++-- features/more-editor-fonts/script.js | 8 +-- features/more-paint-functions/script.js | 8 +-- features/move-project-title-input.js | 2 +- features/opacity-slider/script.js | 12 ++--- features/paint-align/script.js | 8 +-- features/rotate-gradient/script.js | 12 ++--- features/search-assets.js | 4 +- features/sprite-clones.js | 2 +- features/turbowarp-button-in-editor.js | 8 +-- features/video-recorder/video-recorder.js | 4 +- 18 files changed, 130 insertions(+), 51 deletions(-) diff --git a/api/main.js b/api/main.js index 6af72838..0100bca2 100644 --- a/api/main.js +++ b/api/main.js @@ -74,6 +74,24 @@ ScratchTools.Storage = {}; ScratchTools.Resources = {}; ste.console.log("ScratchTools API Created", "ste-main"); +ScratchTools.cssFiles = []; +async function updateCSSFiles() { + let activeCSSFiles = Array.from(document.styleSheets) + .filter((sheet) => sheet.href) + .map((sheet) => sheet.href) + .filter((el) => new URL(el).host === "scratch.mit.edu"); + activeCSSFiles = activeCSSFiles.filter( + (el) => !ScratchTools.cssFiles.find((e) => e.url === el) + ); + + for (var i in activeCSSFiles) { + ScratchTools.cssFiles.push({ + url: activeCSSFiles[i], + data: await (await fetch(activeCSSFiles[i])).text(), + }); + } +} + if ( window.location.href.startsWith("https://scratch.mit.edu/projects/") && window.location.href.includes("/editor") @@ -159,6 +177,7 @@ function enableScratchToolsSelectorsMutationObserver() { enableScratchToolsSelectorsMutationObserver(); function returnScratchToolsSelectorsMutationObserverCallbacks() { + updateCSSFiles() Object.keys(allWaitInstances).forEach(function (key) { var waitInstance = allWaitInstances[key]; if (!waitInstance.removed) { @@ -340,6 +359,39 @@ ScratchTools.styles = { }, }; +function scratchClass(name) { + let element = document.querySelector(`[class*='${name}']`); + if (element) { + let classes = [...element.classList]; + return classes.find((el) => el.includes(name)); + } else { + let text = [] + + for (var i in ScratchTools.cssFiles) { + text.push(ScratchTools.cssFiles[i].data) + } + + text = text.join("\n\n") + let classes = getClassNamesFromCSSText(text) + + let relClass = classes.find((el) => el.includes(name)) + return relClass + } +} + +ScratchTools.getClassNamesFromCSSText = function(cssText) { + const classNames = new Set(); + + const classRegex = /\.([a-zA-Z0-9_-]+)\b/g; + + let match; + while ((match = classRegex.exec(cssText)) !== null) { + classNames.add(match[1]); + } + + return Array.from(classNames); +} + ScratchTools.waitForElements( "ul[class*='menu_menu_'][class*='menu_right_']", function (ul) { @@ -351,7 +403,10 @@ ScratchTools.waitForElements( if (!ul.querySelector(".ste-menu-full-settings")) { var li = document.createElement("li"); li.className = - "ste-menu-full-settings menu_menu-item_3EwYA menu_hoverable_3u9dt"; + "ste-menu-full-settings " + + scratchClass("menu_menu-item_") + + " " + + scratchClass("menu_hoverable_"); var div = document.createElement("div"); div.className = "settings-menu_option_3rMur"; @@ -391,6 +446,8 @@ async function blockliveDetection() { Object.keys(app).find((key) => key.startsWith("__reactContainer")) ].child.stateNode.store.getState()?.scratchGui; if (!gui?.projectState) return; - let detectBlocklive = await import("./blocklive-detection/blocklive-detect.js"); + let detectBlocklive = await import( + "./blocklive-detection/blocklive-detect.js" + ); detectBlocklive.default(); -} \ No newline at end of file +} diff --git a/api/module.js b/api/module.js index 589f2731..a3fa58f0 100644 --- a/api/module.js +++ b/api/module.js @@ -1,6 +1,26 @@ let allFeatures = [] let alreadyInjected = []; +function scratchClass(name) { + let element = document.querySelector(`[class*='${name}']`); + if (element) { + let classes = [...element.classList]; + return classes.find((el) => el.includes(name)); + } else { + let text = [] + + for (var i in ScratchTools.cssFiles) { + text.push(ScratchTools.cssFiles[i].data) + } + + text = text.join("\n\n") + let classes = getClassNamesFromCSSText(text) + + let relClass = classes.find((el) => el.includes(name)) + return relClass + } +} + ScratchTools.modules.forEach(async function (script) { var feature = await import(ScratchTools.dir + "/api/feature/index.js"); var shouldBeRun = true; @@ -20,6 +40,7 @@ ScratchTools.modules.forEach(async function (script) { allFeatures.push(featureGenerated) fun.default({ feature: featureGenerated, + scratchClass, console: { log: function (content) { ste.console.log(content, script.feature.id); @@ -56,6 +77,7 @@ ScratchTools.injectModule = async function (script) { allFeatures.push(featureGenerated) fun.default({ feature: featureGenerated, + scratchClass, console: { log: function (content) { ste.console.log(content, script.feature.id); diff --git a/features/dark-paint-editor/script.js b/features/dark-paint-editor/script.js index 3461ade5..a466c715 100644 --- a/features/dark-paint-editor/script.js +++ b/features/dark-paint-editor/script.js @@ -1,4 +1,4 @@ -export default async function ({ feature, console }) { +export default async function ({ feature, console, scratchClass }) { let isDark; const BACKGROUND_LIGHT = "#FFFFFF"; @@ -18,10 +18,10 @@ export default async function ({ feature, console }) { if (document.querySelector(".ste-dark-paint-btn")) return; let button = document.createElement("div") - button.className = "button-group_button-group_2_h4y ste-dark-paint-btn" + button.className = `${scratchClass("button-group_button-group_2_")} ste-dark-paint-btn` let span = document.createElement("span") - span.className = "button_button_u6SE2 paint-editor_button-group-button_1I1tm" + span.className = `${scratchClass("button_button_")} ${scratchClass("paint-editor_button-group-button_")}` span.role = "button" button.appendChild(span) diff --git a/features/delete-all.js b/features/delete-all.js index 55a712f7..b5828a39 100644 --- a/features/delete-all.js +++ b/features/delete-all.js @@ -7,7 +7,7 @@ function checkForContextMenu() { ) { var div = document.createElement("div"); div.className = - "react-contextmenu-item context-menu_menu-item_3cioN context-menu_menu-item-bordered_29CJG context-menu_menu-item-danger_1tJg0 scratchtools deleteall"; + `react-contextmenu-item ${scratchClass("context-menu_menu-item_")} ${scratchClass("context-menu_menu-item-bordered_")} ${scratchClass("context-menu_menu-item-danger_")} scratchtools deleteall`; div.role = "menuitem"; div.tabindex = "-1"; div.arialDisabled = "false"; diff --git a/features/echo-effect/script.js b/features/echo-effect/script.js index 0c7eb933..1b77baf7 100644 --- a/features/echo-effect/script.js +++ b/features/echo-effect/script.js @@ -1,11 +1,11 @@ -export default function ({ feature, console }) { +export default function ({ feature, console, scratchClass }) { ScratchTools.waitForElements( "div[class^='sound-editor_row_'][class*='sound-editor_row-reverse_']", function (container) { if (container.querySelector(".ste-echo")) return; let button = document.createElement("div"); button.className = - "icon-button_container_278u5 sound-editor_effect-button_2zuzT ste-echo"; + `${scratchClass("icon-button_container_")} ${scratchClass("sound-editor_effect-button_")} ste-echo`; button.role = "button"; feature.self.hideOnDisable(button) @@ -20,7 +20,7 @@ export default function ({ feature, console }) { button.appendChild(img); let title = document.createElement("div"); - title.className = "icon-button_title_36ChS"; + title.className = scratchClass("icon-button_title_"); title.textContent = feature.msg("echo"); button.appendChild(title); diff --git a/features/go-to-parent/script.js b/features/go-to-parent/script.js index 65e01dc3..7928ba6e 100644 --- a/features/go-to-parent/script.js +++ b/features/go-to-parent/script.js @@ -54,7 +54,7 @@ if ( if (data.remix !== undefined) { if (data.remix.parent !== null) { var div = document.createElement("div"); - div.className = "menu-bar_menu-bar-item_oLDa- scratchtools remix"; + div.className = `${scratchClass("menu-bar_menu-bar-item_")} scratchtools remix`; div.innerHTML = `
Go to Parent
`; document.querySelectorAll("div").forEach(function (el) { if (el.className.includes("menu-bar_main-menu_")) { diff --git a/features/last-key-pressed.js b/features/last-key-pressed.js index 260e5e8a..348b543c 100644 --- a/features/last-key-pressed.js +++ b/features/last-key-pressed.js @@ -15,7 +15,7 @@ function addKeyPressed() { function addKeyPressedEditor() { var div = document.createElement("div"); - div.className = "menu-bar_file-group_1_CHX scratchtools navlastkey"; + div.className = `${scratchClass("menu-bar_file-group_1_")} scratchtools navlastkey`; div.innerHTML = ` No Key Pressed `; diff --git a/features/more-block-themes/script.js b/features/more-block-themes/script.js index 23f9c673..68ee6378 100644 --- a/features/more-block-themes/script.js +++ b/features/more-block-themes/script.js @@ -1,4 +1,4 @@ -export default async function ({ feature, console }) { +export default async function ({ feature, console, scratchClass }) { let CIRCLE = await (await fetch(feature.self.getResource("circle"))).text(); let COLORS = document.createElement("link") @@ -118,18 +118,18 @@ export default async function ({ feature, console }) { let li = document.createElement("li"); li.dataset.id = THEMES[i].id; - li.className = "menu_menu-item_3EwYA menu_hoverable_3u9dt ste-custom"; + li.className = `${scratchClass("menu_menu-item_")} ${scratchClass("menu_hoverable_")} ste-custom`; let div = document.createElement("div"); - div.className = "settings-menu_option_3rMur"; + div.className = scratchClass("settings-menu_option_"); let check = document.createElement("img"); - check.className = "settings-menu_check_3ssaq"; + check.className = scratchClass("settings-menu_check_"); check.src = feature.self.getResource("check"); let img = document.createElement("span"); img.innerHTML = CIRCLE.replaceAll("-fill", "-circle-fill" + THEMES[i].id).replaceAll("-stroke", "-circle-stroke-" + THEMES[i].id); - img.className = "settings-menu_icon_3QaRk"; + img.className = scratchClass("settings-menu_icon_"); let circleCSS = document.createElement("style"); circleCSS.textContent = css.replaceAll("-fill", "-circle-fill" + THEMES[i].id).replaceAll("-stroke", "-circle-stroke-" + THEMES[i].id) diff --git a/features/more-editor-fonts/script.js b/features/more-editor-fonts/script.js index 7efad503..62fedb90 100644 --- a/features/more-editor-fonts/script.js +++ b/features/more-editor-fonts/script.js @@ -1,4 +1,4 @@ -export default async function ({ feature, console }) { +export default async function ({ feature, console, scratchClass }) { let { default: openTypeDefault } = await import( "../../libraries/opentype.js" ); @@ -26,20 +26,20 @@ export default async function ({ feature, console }) { button.currentitem = false; button.ariaLabel = "Add Font"; button.className = - "action-menu_button_1qbot action-menu_more-button_1fMGZ ste-more-fonts-btn"; + `${scratchClass("action-menu_button_")} ${scratchClass("action-menu_more-button_")} ste-more-fonts-btn`; div.appendChild(button); let img = Object.assign(document.createElement("img"), { src: feature.self.getResource("more-text-icon"), draggable: false, - className: "action-menu_more-icon_TJUQ7", + className: scratchClass("action-menu_more-icon_"), width: 10, }); button.appendChild(img); let tooltip = Object.assign(document.createElement("div"), { className: - "__react_component_tooltip place-right type-dark action-menu_tooltip_3Bkh5", + `__react_component_tooltip place-right type-dark ${scratchClass("action-menu_tooltip_")}`, id: `ste-${id}-Add Font`, textContent: "Add Font", }); diff --git a/features/more-paint-functions/script.js b/features/more-paint-functions/script.js index ddfd0849..a753cf89 100644 --- a/features/more-paint-functions/script.js +++ b/features/more-paint-functions/script.js @@ -1,4 +1,4 @@ -export default async function ({ feature, console }) { +export default async function ({ feature, console, scratchClass }) { function unite() { let paper = feature.traps.getPaper(); let items = paper.project.selectedItems; @@ -133,12 +133,12 @@ export default async function ({ feature, console }) { function makeButton({ name, icon, callback }) { let span = document.createElement("span"); span.className = - "button_button_u6SE2 labeled-icon-button_mod-edit-field_1bXYC ste-more-functions"; + `${scratchClass("button_button_")} ${scratchClass("labeled-icon-button_mod-edit-field_")} ste-more-functions`; span.role = "button"; let img = document.createElement("img"); img.src = feature.self.getResource(icon); - img.className = "labeled-icon-button_edit-field-icon_3j-Pf"; + img.className = scratchClass("labeled-icon-button_edit-field-icon_"); img.alt = name; img.title = name; img.draggable = false; @@ -146,7 +146,7 @@ export default async function ({ feature, console }) { let label = document.createElement("span"); label.textContent = name; - label.className = "labeled-icon-button_edit-field-title_1ZoEV"; + label.className = scratchClass("labeled-icon-button_edit-field-title_"); span.appendChild(label); span.addEventListener("click", function (e) { diff --git a/features/move-project-title-input.js b/features/move-project-title-input.js index 828cf89e..73fcfecd 100644 --- a/features/move-project-title-input.js +++ b/features/move-project-title-input.js @@ -13,7 +13,7 @@ ScratchTools.waitForElements( if (!document.querySelector(".st-new-title-input") && !document.querySelector("span[class*='menu-bar_remix-button_']")) { var input = document.createElement("input"); input.className = - "input_input-form_l9eYg project-title-input_title-field_en5Gd menu-bar_title-field-growable_3qr4G"; + `${scratchClass("input_input-form_")} ${scratchClass("project-title-input_title-field_")} ${scratchClass("menu-bar_title-field-growable_")}`; input.value = window.newTitle || ScratchTools.Scratch.scratchGui().projectTitle; input.placeholder = "Title"; input.style.width = "100%"; diff --git a/features/opacity-slider/script.js b/features/opacity-slider/script.js index d65584c1..925109e4 100644 --- a/features/opacity-slider/script.js +++ b/features/opacity-slider/script.js @@ -1,4 +1,4 @@ -export default function ({ feature, console }) { +export default function ({ feature, console, scratchClass }) { ScratchTools.waitForElements(".Popover-body", function (body) { if (!feature.traps.paint().modals.fillColor) return; if (!feature.traps.paint().selectedItems[0]) return; @@ -11,15 +11,15 @@ export default function ({ feature, console }) { feature.self.hideOnDisable(div); let data = document.createElement("div"); - data.className = "color-picker_row-header_173LQ"; + data.className = scratchClass("color-picker_row-header_"); div.appendChild(data); let name = document.createElement("span"); - name.className = "color-picker_label-name_17igY"; + name.className = scratchClass("color-picker_label-name_"); name.textContent = "Opacity"; let value = document.createElement("span"); - value.className = "color-picker_label-readout_9vjb2"; + value.className = scratchClass("color-picker_label-readout_"); value.textContent = Math.floor( (feature.traps.paint().selectedItems[0]?.opacity || 1) * 100 )?.toString(); @@ -29,7 +29,7 @@ export default function ({ feature, console }) { let slider = document.createElement("div"); slider.className = - "ste-opacity-slider-checkered slider_container_o2aIb slider_last_10jvO"; + `ste-opacity-slider-checkered ${scratchClass("slider_container_")} ${scratchClass("slider_last_")}`; div.appendChild(slider); let sliderBg = document.createElement("div"); @@ -41,7 +41,7 @@ export default function ({ feature, console }) { let handle = document.createElement("div"); handleSlider(handle, value); - handle.className = "ste-opacity-handle slider_handle_3f0xk"; + handle.className = `ste-opacity-handle ${scratchClass("slider_handle_")}`; handle.style.left = "124px"; if (feature.traps.paint().selectedItems[0]?.opacity) { handle.style.left = diff --git a/features/paint-align/script.js b/features/paint-align/script.js index 15e83ddd..4b127091 100644 --- a/features/paint-align/script.js +++ b/features/paint-align/script.js @@ -1,4 +1,4 @@ -export default async function ({ feature }) { +export default async function ({ feature, scratchClass }) { ScratchTools.waitForElements( "div[class^='mode-tools_mod-labeled-icon-height_']", function (row) { @@ -6,12 +6,12 @@ export default async function ({ feature }) { let span = document.createElement("span"); span.className = - "button_button_u6SE2 labeled-icon-button_mod-edit-field_1bXYC ste-align-items"; + `${scratchClass("button_button_")} ${scratchClass("labeled-icon-button_mod-edit-field_")} ste-align-items`; span.role = "button"; let img = document.createElement("img"); img.src = feature.self.getResource("paint-align"); - img.className = "labeled-icon-button_edit-field-icon_3j-Pf"; + img.className = scratchClass("labeled-icon-button_edit-field-icon_"); img.alt = feature.msg("align"); img.title = feature.msg("align"); img.draggable = false; @@ -19,7 +19,7 @@ export default async function ({ feature }) { let label = document.createElement("span"); label.textContent = feature.msg("align"); - label.className = "labeled-icon-button_edit-field-title_1ZoEV"; + label.className = scratchClass("labeled-icon-button_edit-field-title_"); span.appendChild(label); span.addEventListener("click", function (e) { diff --git a/features/rotate-gradient/script.js b/features/rotate-gradient/script.js index 4aa736f3..a26a2ee1 100644 --- a/features/rotate-gradient/script.js +++ b/features/rotate-gradient/script.js @@ -1,4 +1,4 @@ -export default async function ({ feature, console }) { +export default async function ({ feature, console, scratchClass }) { let lastRotation = 0 feature.page.waitForElements( @@ -16,15 +16,15 @@ export default async function ({ feature, console }) { feature.self.hideOnDisable(div); let data = document.createElement("div"); - data.className = "color-picker_row-header_173LQ"; + data.className = scratchClass("color-picker_row-header_"); div.appendChild(data); let name = document.createElement("span"); - name.className = "color-picker_label-name_17igY"; + name.className = scratchClass("color-picker_label-name_"); name.textContent = feature.msg("direction"); let value = document.createElement("span"); - value.className = "color-picker_label-readout_9vjb2"; + value.className = scratchClass("color-picker_label-readout_"); value.textContent = "0"; data.appendChild(name); @@ -32,7 +32,7 @@ export default async function ({ feature, console }) { let slider = document.createElement("div"); slider.className = - "ste-direction-slider-checkered slider_container_o2aIb slider_last_10jvO"; + "ste-direction-slider-checkered " + scratchClass("slider_container_") + " " + scratchClass("slider_last_Ik11I"); div.appendChild(slider); let sliderBg = document.createElement("div"); @@ -44,7 +44,7 @@ export default async function ({ feature, console }) { let handle = document.createElement("div"); handleSlider(handle, value); - handle.className = "ste-direction-handle slider_handle_3f0xk"; + handle.className = "ste-direction-handle " + scratchClass("slider_handle_ubeAr"); handle.style.left = "0px"; slider.appendChild(handle); diff --git a/features/search-assets.js b/features/search-assets.js index afd13cf4..611d7e8e 100644 --- a/features/search-assets.js +++ b/features/search-assets.js @@ -5,7 +5,7 @@ if (document.querySelector('[class^="asset-panel_wrapper_"]')) { var input = document.createElement("input"); var assetBox = document.querySelector('[class^="asset-panel_wrapper_"]'); var assetRow = assetBox.firstChild.firstChild; - input.className = "scratchtoolsAssetSearch input_input-form_l9eYg"; + input.className = "scratchtoolsAssetSearch " + scratchClass("input_input-form_l9eYg"); input.placeholder = "Search"; input.type = "search"; input.autocomplete = "off"; @@ -40,7 +40,7 @@ ScratchTools.waitForElements( if (!document.querySelector(".scratchtoolsAssetSearch") && showSearchBar) { var input = document.createElement("input"); var assetRow = assetBox.firstChild.firstChild; - input.className = "scratchtoolsAssetSearch input_input-form_l9eYg"; + input.className = "scratchtoolsAssetSearch " + scratchClass("input_input-form_"); input.placeholder = "Search"; input.type = "search"; input.autocomplete = "off"; diff --git a/features/sprite-clones.js b/features/sprite-clones.js index 8bf19d82..7f6f7e5a 100644 --- a/features/sprite-clones.js +++ b/features/sprite-clones.js @@ -19,7 +19,7 @@ if ( if (el.className.startsWith("sprite-info_row_")) { foundIt = true; var div = document.createElement("div"); - div.className = "sprite-info_group_14-B_"; + div.className = scratchClass("sprite-info_group_"); div.innerHTML = ``; diff --git a/features/turbowarp-button-in-editor.js b/features/turbowarp-button-in-editor.js index 249d3482..9039f8cc 100644 --- a/features/turbowarp-button-in-editor.js +++ b/features/turbowarp-button-in-editor.js @@ -8,7 +8,7 @@ if ( waitForNavForTurbowarp.disconnect(); var outerDiv = document.createElement("div"); outerDiv.className = - "menu-bar_menu-bar-item_oLDa- scratchtoolsTurbowarp"; + scratchClass("menu-bar_menu-bar-item_") + " scratchtoolsTurbowarp"; var a = document.createElement("a"); a.addEventListener("click", async function () { let projectToken = ( @@ -35,17 +35,17 @@ if ( }); var outerSpan = document.createElement("span"); outerSpan.className = - "button_outlined-button_1bS__ menu-bar_menu-bar-button_3IDN0 community-button_community-button_2Lo_g"; + `${scratchClass("button_outlined-button_")} ${scratchClass("menu-bar_menu-bar-button_")} ${scratchClass("community-button_community-button_")}`; outerSpan.role = "button"; var img = document.createElement("img"); img.draggable = false; img.src = "https://dashboard.snapcraft.io/site_media/appmedia/2021/02/512x512_Q3PveGU.png"; img.className = - "community-button_community-button-icon_1IFvv button_icon_77d8G"; + `${scratchClass("community-button_community-button-icon_")} ${scratchClass("button_icon_")}`; outerSpan.appendChild(img); var innerDiv = document.createElement("div"); - innerDiv.className = "button_content_3jdgj"; + innerDiv.className = scratchClass("button_content_"); var innerSpan = document.createElement("span"); innerSpan.style.color = "white"; innerSpan.textContent = "Open in TurboWarp"; diff --git a/features/video-recorder/video-recorder.js b/features/video-recorder/video-recorder.js index ccba54cd..d43b84b5 100644 --- a/features/video-recorder/video-recorder.js +++ b/features/video-recorder/video-recorder.js @@ -1,4 +1,4 @@ -export default async function ({ feature, console }) { +export default async function ({ feature, console, scratchClass }) { await new Promise(async (resolve, reject) => { (async () => { const rem = await ScratchTools.waitForElement(".preview .inner .flex-row.action-buttons") @@ -26,7 +26,7 @@ export default async function ({ feature, console }) { ScratchTools.waitForElements(".menu-bar_account-info-group_MeJZP", async function (row) { if (row.querySelector(".ste-video-recorder-open")) return; openPopup = document.createElement("div"); - openPopup.className = "menu-bar_menu-bar-item_oLDa- menu-bar_hoverable_c6WFB"; + openPopup.className = `${scratchClass("menu-bar_menu-bar-item_")} ${scratchClass("menu-bar_hoverable_")}`; openPopup.style.padding = "0 0.75rem" let rem = document.createElement("div"); rem.textContent = "Record Video"; From c0457b052b9d086a09fa36c9e03d2ec888789c9b Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Sat, 30 Nov 2024 11:33:31 -0800 Subject: [PATCH 175/253] A few minor improvements --- api/main.js | 2 +- api/module.js | 2 +- extras/feature-locales/en.json | 2 +- features/asset-size/script.js | 2 +- features/chomp-blocks/data.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/api/main.js b/api/main.js index 0100bca2..9ae24062 100644 --- a/api/main.js +++ b/api/main.js @@ -372,7 +372,7 @@ function scratchClass(name) { } text = text.join("\n\n") - let classes = getClassNamesFromCSSText(text) + let classes = ScratchTools.getClassNamesFromCSSText(text) let relClass = classes.find((el) => el.includes(name)) return relClass diff --git a/api/module.js b/api/module.js index a3fa58f0..041bd33d 100644 --- a/api/module.js +++ b/api/module.js @@ -14,7 +14,7 @@ function scratchClass(name) { } text = text.join("\n\n") - let classes = getClassNamesFromCSSText(text) + let classes = ScratchTools.getClassNamesFromCSSText(text) let relClass = classes.find((el) => el.includes(name)) return relClass diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index 5727477c..8504ab38 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"outline-shape-options/title":{"message":"Customizable Shape Outlines"},"outline-shape-options/description":{"message":"Adds more options in the outline dropdown to allow you to customize the shape of the outline, such as making corners round."},"more-paint-functions/title":{"message":"More Paint Functions"},"more-paint-functions/description":{"message":"Adds new functions to the paint editor. The new functions include unite (combining them into one), subtract (removing one shape from another), exclude (removing the overlap of 2 items), and intersect (removing everything but the overlap of 2 items). Each function only works with 2 items."},"asset-size/title":{"message":"Asset Size"},"asset-size/description":{"message":"Allows you to hover over any asset (costumes and sounds) in the editor to view the file size."},"disable-cloud/title":{"message":"Disable Cloud"},"disable-cloud/description":{"message":"Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any."},"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend Wrapped C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"outline-shape-options/title":{"message":"Customizable Shape Outlines"},"outline-shape-options/description":{"message":"Adds more options in the outline dropdown to allow you to customize the shape of the outline, such as making corners round."},"more-paint-functions/title":{"message":"More Paint Functions"},"more-paint-functions/description":{"message":"Adds new functions to the paint editor. The new functions include unite (combining them into one), subtract (removing one shape from another), exclude (removing the overlap of 2 items), and intersect (removing everything but the overlap of 2 items). Each function only works with 2 items."},"asset-size/title":{"message":"Asset Size"},"asset-size/description":{"message":"Allows you to hover over any asset (costumes and sounds) in the editor to view the file size."},"disable-cloud/title":{"message":"Disable Cloud"},"disable-cloud/description":{"message":"Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any."},"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file diff --git a/features/asset-size/script.js b/features/asset-size/script.js index 382c7046..c067cc34 100644 --- a/features/asset-size/script.js +++ b/features/asset-size/script.js @@ -6,7 +6,7 @@ export default async function ({ feature, console }) { asset.dataset.ste = "ste-file-size"; let content = asset.querySelector( - "div[class*='sprite-selector-item_sprite-info_-'] div[class*='sprite-selector-item_sprite-details_']" + "div[class*='sprite-selector-item_sprite-info_'] div[class*='sprite-selector-item_sprite-details_']" ); asset.firstChild.addEventListener("mouseover", function () { diff --git a/features/chomp-blocks/data.json b/features/chomp-blocks/data.json index 7a8ca42e..ad8a176e 100644 --- a/features/chomp-blocks/data.json +++ b/features/chomp-blocks/data.json @@ -1,5 +1,5 @@ { - "title": "Extend Wrapped C Blocks", + "title": "Extend C Blocks", "description": "Automatically extends C blocks to wrap around blocks that it is being placed over when dragging.", "credits": [ { From 5eda7c7f5e3a86bf6170f4eb5d2455b1ac8f3337 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Wed, 4 Dec 2024 15:19:33 -0800 Subject: [PATCH 176/253] Request permissions API --- api/feature.js | 3 +++ api/main.js | 17 +++++++++++++++++ build/index.js | 1 + build/write-permissions.js | 26 ++++++++++++++++++++++++++ extras/background.js | 23 ++++++++++++++++++++++- 5 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 build/index.js create mode 100644 build/write-permissions.js diff --git a/api/feature.js b/api/feature.js index 26fe2fb1..8eb4b689 100644 --- a/api/feature.js +++ b/api/feature.js @@ -6,6 +6,9 @@ class Feature { finalFeature = el; } }); + this.requestPermissions = async function(...permissions) { + return await ScratchTools.sendMessage("request-perms", permissions) + } this.data = finalFeature; this.msg = function (string) { return this.data.localesData[`${this.data.id}/`+string] || `ScratchTools.${this.data.id}.${string}`; diff --git a/api/main.js b/api/main.js index 9ae24062..f45ee597 100644 --- a/api/main.js +++ b/api/main.js @@ -101,6 +101,23 @@ if ( ScratchTools.type = "Website"; } +ScratchTools.MESSAGES = [] +ScratchTools.sendMessage = function(id, content) { + let uuid = UUID() + chrome.runtime.sendMessage(ScratchTools.id, { message: id, content, source: "message-api", uuid }); + return new Promise((resolve, reject) => { + ScratchTools.MESSAGES.push({ message: id, source: "message-api", uuid, resolve }); + }); +} + +function UUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (char) { + const random = Math.random() * 16 | 0; + const value = char === 'x' ? random : (random & 0x3 | 0x8); + return value.toString(16); + }); +} + var storagePromises = []; ScratchTools.storage = { get: async function (key) { diff --git a/build/index.js b/build/index.js new file mode 100644 index 00000000..152e7566 --- /dev/null +++ b/build/index.js @@ -0,0 +1 @@ +require("./write-permissions") \ No newline at end of file diff --git a/build/write-permissions.js b/build/write-permissions.js new file mode 100644 index 00000000..b1136f1a --- /dev/null +++ b/build/write-permissions.js @@ -0,0 +1,26 @@ +const fs = require("fs") +let features = JSON.parse(fs.readFileSync("./features/features.json")) +let manifest = JSON.parse(fs.readFileSync("./manifest.json")) +let permissions = ["https://api.scratch.mit.edu"] + +for (var i in features) { + if (features[i].version === 2) { + let feature = JSON.parse(fs.readFileSync(`./features/${features[i].id}/data.json`)) + if (feature.permissions) { + permissions.push(...feature.permissions.filter((perm) => !permissions.includes(perm))) + } + } +} + +manifest.optional_permissions = permissions.filter((perm) => !checkUrl(perm)) +manifest.optional_host_permissions = permissions.filter((perm) => checkUrl(perm)) +fs.writeFileSync("./manifest.json", JSON.stringify(manifest, null, 2), 'utf8'); + +function checkUrl(perm) { + try { + new URL(perm); + return true; + } catch (_) { + return false; + } +} \ No newline at end of file diff --git a/extras/background.js b/extras/background.js index 61eefa65..1e404847 100644 --- a/extras/background.js +++ b/extras/background.js @@ -692,7 +692,28 @@ chrome.runtime.onMessageExternal.addListener(async function ( }); } if (msg === "returnToTab") { - await chrome.tabs.update(sender.tab.id, {active: true}) + await chrome.tabs.update(sender.tab.id, { active: true }); + } + if (msg.source === "message-api") { + if (msg.message?.startsWith("request-perms")) { + let perms = msg.content; + + chrome.permissions.request({ permissions: perms }, async (granted) => { + let isComplete = !!granted; + + await chrome.scripting.executeScript({ + args: [isComplete, msg.uuid], + target: { tabId: sender.tab.id }, + func: sendPermsResponse, + world: "MAIN", + }); + function sendPermsResponse(completed, uuid) { + ScratchTools.MESSAGES.find((el) => el.uuid === uuid).resolve( + completed + ); + } + }); + } } if (typeof msg === "object") { if (msg.message === "storageSet") { From ca58148fc416b51776438af193432af250b641d5 Mon Sep 17 00:00:00 2001 From: Elip100 Date: Fri, 20 Dec 2024 14:24:18 -0500 Subject: [PATCH 177/253] Grammer fix --- .github/ISSUE_TEMPLATE/--bug.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/--bug.yml b/.github/ISSUE_TEMPLATE/--bug.yml index 72513211..c5e8de7e 100644 --- a/.github/ISSUE_TEMPLATE/--bug.yml +++ b/.github/ISSUE_TEMPLATE/--bug.yml @@ -1,5 +1,5 @@ name: 🐛 Bug -description: Report a bug for ScratchTool. +description: Report a bug in ScratchTools. labels: ["type: bug", "status: needs review"] body: From b35118f01adedb22667cf831bf019302ee9d9d6c Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sat, 28 Dec 2024 11:27:19 -0500 Subject: [PATCH 178/253] Remove Confirmation Remove the new sprite confirmation feature from Scratch --- features/remove-confirmation/data.json | 13 +++++++++++++ features/remove-confirmation/script.js | 12 ++++++++++++ features/remove-confirmation/style.css | 4 ++++ 3 files changed, 29 insertions(+) create mode 100644 features/remove-confirmation/data.json create mode 100644 features/remove-confirmation/script.js create mode 100644 features/remove-confirmation/style.css diff --git a/features/remove-confirmation/data.json b/features/remove-confirmation/data.json new file mode 100644 index 00000000..beaa2dab --- /dev/null +++ b/features/remove-confirmation/data.json @@ -0,0 +1,13 @@ +{ + "title": "Remove Delete Confirmation", + "description": "Removes the delete confirmation prompt when deleting sprites in the Scratch editor.", + "credits": [ + { "username": "MaterArc", "url": "https://scratch.mit.edu/users/MaterArc/" } + ], + "type": ["Editor"], + "tags": ["New", "Featured"], + "dynamic": true, + "styles": [{ "file": "style.css", "runOn": "/editor/*" }], + "scripts": [{ "file": "script.js", "runOn": "/editor/*" }] + } + \ No newline at end of file diff --git a/features/remove-confirmation/script.js b/features/remove-confirmation/script.js new file mode 100644 index 00000000..5aa71290 --- /dev/null +++ b/features/remove-confirmation/script.js @@ -0,0 +1,12 @@ +export default async function ({ feature, console }) { + ScratchTools.waitForElements("body", () => { + document.body.addEventListener("click", () => { + ScratchTools.waitForElements( + "[class^='delete-confirmation-prompt_ok-button_']", + (confirmButton) => { + if (feature.self.enabled) confirmButton.click(); + } + ); + }); + }); +} diff --git a/features/remove-confirmation/style.css b/features/remove-confirmation/style.css new file mode 100644 index 00000000..6175c942 --- /dev/null +++ b/features/remove-confirmation/style.css @@ -0,0 +1,4 @@ +[class*="delete-confirmation-prompt_modal-container"] { + visibility: hidden; + } + \ No newline at end of file From 9cdbc264e318bef570c2ce95d2f946e25b231970 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sat, 28 Dec 2024 11:29:03 -0500 Subject: [PATCH 179/253] Update feature.json --- features/features.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/features/features.json b/features/features.json index caa770ce..779defe0 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "remove-confirmation", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "outline-shape-options", From 49ce9a5ece19f5782ee482ccc6e249d5c6c24fea Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sat, 28 Dec 2024 12:21:39 -0500 Subject: [PATCH 180/253] Use `Attribute Selectors` to fix Dark Mode Refactor feature to utilize Attribute Selectors instead of hashed class names. Previously, the use of hashed class names led to issues as they became outdated, causing the feature to break. --- features/editor-dark-mode.js | 614 ++++++++++++++++++----------------- 1 file changed, 310 insertions(+), 304 deletions(-) diff --git a/features/editor-dark-mode.js b/features/editor-dark-mode.js index 0de48d63..01a11870 100644 --- a/features/editor-dark-mode.js +++ b/features/editor-dark-mode.js @@ -1,306 +1,312 @@ if ( - window.location.href.includes("https://scratch.mit.edu/projects/") && - window.location.href.includes("/editor") -) { - var style = document.createElement("style"); - style.id = "scratchtoolseditor"; - style.innerHTML = ` -/* 3.Darker CSS. -Built by infinitytec. -Version 1.8. -*/ - - -/*3.0 Theme Userscript Framework by infinitytec. Released under the MIT license.*/ -/*Set colors for the editor. Names should explain what they are. They will automatically be applied to different parts of the editor. For the purpose of simplification, the red cancel button and the hover/active/focus effects are hard-coded. The effects use filters so they should be good-to-go in most cases.*/ -:root { - --main-bg: #111111; - --secondary-bg: #151515; - --accent: #202020; - --text: #bfbfbf; - --editorDarkMode-primary-text: #ffffff; -} - -/*Main UI bar, similar bars, and dropdown menu*/ -.menu-bar_main-menu_3wjWH, -.modal_header_1h7ps, -.menu-bar_account-info-group_MeJZP, -.menu_menu_3k7QT, -.project-title-input_title-field_en5Gd:focus { - background: var(--accent); -} - -/*Main background*/ -.gui_body-wrapper_-N0sA, -.blocklySvg { - background: var(--main-bg); -} - -/*Scripting area background*/ -.blocklyMainBackground { - fill: var(--secondary-bg) !important; -} - -/*Right-click & pop-ups*/ -.context-menu_context-menu_2SJM-, -.blocklyWidgetDiv .goog-menu, -.Popover-body { - background: var(--accent) !important; - color: var(--text) !important; - border: 1px solid white; -} - -.goog-menuitem-content, -.color-picker_row-header_173LQ { - color: var(--text); -} - -/*Highlight*/ -.blocklyWidgetDiv .goog-menuitem-highlight, -.blocklyWidgetDiv .goog-menuitem-hover, -.context-menu_menu-item_3cioN:hover { - background-color: #ffffff33 !important; -} - -/*Palette*/ -.blocklyFlyoutBackground { - fill: var(--accent) !important; -} - -/*Palette text*/ -.blocklyFlyoutLabelText { - fill: var(--text) !important; -} - -/*Toolbox, extension connection box*/ -.connection-modal_bottom-area_AHeQ3, -.connection-modal_body_3YO9j, -.blocklyToolboxDiv, -.scratchCategoryMenu { - background: var(--accent); - color: var(--text); -} - -/*Selected category*/ -.scratchCategoryMenuItem.categorySelected { - background: #ffffff22; -} - -/*Sprite and stage selection area*/ -.sprite-selector_sprite-selector_2KgCX, -.stage-selector_stage-selector_3oWOr, -.stage-selector_label_1MCfr, -.stage-selector_count_2QK7D { - background: var(--accent); - color: var(--text); -} - -.sprite-info_sprite-info_3EyZh, -.stage-selector_header_2GVr1, -.stage-selector_header-title_33xCt, -.stage-selector_header-title_33xCt, -.sprite-selector-item_sprite-selector-item_kQm-i:hover { - background: var(--secondary-bg); - color: var(--text); -} - -/*Palette Buttons*/ -.blocklyFlyoutButtonBackground { - fill: var(--accent) !important; -} - -.blocklyFlyoutButtonBackground:hover, -.blocklyFlyoutButton:hover { - fill: var(--accent) !important; - filter: brightness(110%) !important; -} - -blocklyFlyoutButton>text.blocklyText { - fill: var(--text) !important; -} - -/*Text fill of "Make A" buttons*/ -.blocklyFlyoutButton .blocklyText { - fill: var(--text) !important; -} - -/*Backpack header*/ -.backpack_backpack-header_6ltCS { - background: var(--accent); - color: var(--text); -} - -/*Backpack*/ -.backpack_backpack-list-inner_10a2A { - background: var(--secondary-bg); -} - -.backpack_backpack-item_hwqzQ, -.sprite-selector-item_sprite-image-outer_Xs0wN, -.backpack_backpack-item_hwqzQ>div { - background: var(--main-bg); -} - -.backpack_backpack-item_hwqzQ img { - mix-blend-mode: normal; -} - -/*Paint & sound editor sidebar*/ -.selector_list-area_1Xbj_ { - background: var(--accent); -} - -.selector_new-buttons_2qHDd::before { - background: none; -} - -/*Paint & sound editor main*/ -.asset-panel_wrapper_366X0 { - background: var(--secondary-bg); - color: var(--text); -} - -.sound-editor_effect-button_2zuzT, -.sound-editor_trim-button_lSENI { - color: var(--text); -} - -/*Paint and sound editor buttons*/ -img.tool-select-base_tool-select-icon_tJ-rr, -.sound-editor_trim-button_lSENI { - filter: brightness(2); -} - -/*Sprite costume selector text*/ -.selector_list-item_3N_u7, -.sprite-selector-item_sprite-name_1PXjh, -.sprite-selector-item_sprite-details_2UVpA { - color: var(--text); -} - -/*Tabs*/ -.gui_tab_27Unf.gui_is-selected_sHAiu { - background: var(--accent); - color: var(--text); -} - -.gui_tab_27Unf { - background: var(--secondary-bg); - color: var(--text); -} - -.gui_tab_27Unf:hover { - background: var(--accent); - filter: brightness(90%); - color: var(--text); -} - -/*New variable/list/custom block*/ -.prompt_body_18Z-I, -.custom-procedures_body_SQBv6, -div.custom-procedures_option-card_BtHt3 { - background: var(--accent); - color: var(--text); -} - -.custom-procedures_button-row_2jBu3>button:nth-child(1), -.prompt_button-row_3Wc5Z>button:nth-child(1), -.prompt_button-row_3Wc5Z>button:nth-child(1) { - background: #ff3a5b; -} - -/*Fullscreen view*/ -.stage_stage-wrapper-overlay_fmZuD, -.stage-header_stage-header-wrapper-overlay_5vfJa { - background: black; -} - -.stage_stage-overlay-content_ePv_6 { - border: none; -} - -/*Library and card backgrounds*/ -.library_library-scroll-grid_1jyXm, -.modal_modal-content_1h3ll.modal_full-screen_FA4cr, -.card_step-body_2bFkf, -.card_left-card_1KpEh, -.card_right-card_3IrbD { - background: var(--accent); - color: var(--text); -} - -/*Library items & filter bar*/ -.library-item_library-item-extension_3xus9, -.library-item_library-item_1DcMO, -.library_filter-bar_1W0DW { - background: var(--accent); -} - -.library-item_library-item-extension_3xus9 span, -.library-item_featured-extension-metadata_3D8E8, -.library-item_library-item-name_2qMXu { - color: var(--text) !important; -} - -/*Text input*/ -input[type=text], -.input_input-form_1Y0wX, -.prompt_variable-name-text-input_1iu8- { - background: var(--accent); - color: var(--text) !important; -} - -input[type=text]:hover, -input[type=text]:focus { - background: var(--accent); - filter: brightness(90%); -} - -/*Buttons (inverted for dark theme)*/ -.blocklyZoom, -.stage-header_stage-button_hkl9B, -.sound-editor_round-button_3NLcW, -.sound-editor_button-group_SFPoV { - filter: invert(100) hue-rotate(180deg); -} - -/*Set the selected costume/backdrop to have a transparent background as default*/ -.sprite-selector-item_is-selected_24tQj { - background: transparent !important; -} - -/*Fixing white area around the paint editor*/ -.paint-editor_canvas-container_x2D0a { - border: 1px solid var(--accent); - overflow: hidden; -} - -/*Tweaks for updated paint editor*/ -.paper-canvas_paper-canvas_1y588 { - background-color: var(--secondary-bg); - border-radius: .4rem; -} - -.paint-editor_canvas-container_x2D0a { - border: 2px solid var(--accent); - border-radius: .4rem; -} - -/*Tweaks for users not signed in*/ -.card_card_3GG7C, -.card_left-card_1KpEh, -.card_right-card_3IrbD { - border: 1px solid hsla(216, 49%, 90%, 0.14); -} - -/*Scrollbar*/ -.blocklyScrollbarHandle { - fill: #CECDCE55; -} -`; - document.body.appendChild(style); -} else { - if (document.querySelector("style#scratchtoolseditor") !== null) { - document.querySelector("style#scratchtoolseditor").remove(); + window.location.href.includes("https://scratch.mit.edu/projects/") && + window.location.href.includes("/editor") + ) { + var style = document.createElement("style"); + style.id = "scratchtoolseditor"; + style.innerHTML = ` + /* 3.Darker CSS. + Built by infinitytec. + Version 1.8. */ + + /*3.0 Theme Userscript Framework by infinitytec. Released under the MIT license.*/ + /*Set colors for the editor. Names should explain what they are. They will automatically be applied to different parts of the editor. + For the purpose of simplification, the red cancel button and the hover/active/focus effects are hard-coded. The effects use filters so they should be good-to-go in most cases.*/ + + :root { + --main-bg: #111111; + --secondary-bg: #151515; + --accent: #202020; + --text: #bfbfbf; + --editorDarkMode-primary-text: #ffffff; + } + + /*Main UI bar, similar bars, and dropdown menu*/ + [class^="menu-bar_main-menu_"], + [class^="modal_header_"], + [class^="menu-bar_account-info-group_"], + [class^="menu_menu_"], + [class^="project-title-input_title-field_"]:focus { + background: var(--accent); + } + + /*Main background*/ + [class^="gui_body-wrapper_"], + [class^="blocklySvg"] { + background: var(--main-bg); + } + + /*Scripting area background*/ + [class^="blocklyMainBackground"] { + fill: var(--secondary-bg) !important; + } + + /*Right-click & pop-ups*/ + [class^="context-menu_context-menu_"], + [class^="blocklyWidgetDiv .goog-menu"], + [class^="Popover-body"] { + background: var(--accent) !important; + color: var(--text) !important; + border: 1px solid white; + } + + [class^="goog-menuitem-content"], + [class^="color-picker_row-header_"] { + color: var(--text); + } + + /*Highlight*/ + [class^="blocklyWidgetDiv .goog-menuitem-highlight"], + [class^="blocklyWidgetDiv .goog-menuitem-hover"], + [class^="context-menu_menu-item_"]:hover { + background-color: #ffffff33 !important; + } + + /*Palette*/ + [class^="blocklyFlyoutBackground"] { + fill: var(--accent) !important; + } + + /*Palette text*/ + [class^="blocklyFlyoutLabelText"] { + fill: var(--text) !important; + } + + /*Toolbox, extension connection box*/ + [class^="connection-modal_bottom-area_"], + [class^="connection-modal_body_"], + [class^="blocklyToolboxDiv"], + [class*="scratchCategoryMenuItem"][class*="categorySelected"], + [class^="scratchCategoryMenu"] { + background: var(--accent); + color: var(--text); + } + + /*Selected category*/ + [class^="scratchCategoryMenuItem.categorySelected"] { + background: #ffffff22; + } + + /*Sprite and stage selection area*/ + [class^="sprite-selector_sprite-selector_"], + [class^="stage-selector_stage-selector_"], + [class^="stage-selector_label_"], + [class^="stage-selector_count_"] { + background: var(--accent); + color: var(--text); + } + + [class^="sprite-info_sprite-info_"], + [class^="stage-selector_header_"], + [class^="stage-selector_header-title_"], + [class^="sprite-selector-item_sprite-selector-item_"]:hover { + background: var(--secondary-bg); + color: var(--text); + } + + /*Palette Buttons*/ + [class^="blocklyFlyoutButtonBackground"] { + fill: var(--accent) !important; + } + + [class^="blocklyFlyoutButtonBackground"]:hover, + [class^="blocklyFlyoutButton"]:hover { + fill: var(--accent) !important; + filter: brightness(110%) !important; + } + + [class^="blocklyFlyoutButton"] > text[class^="blocklyText"] { + fill: var(--text) !important; + } + + /*Text fill of "Make A" buttons*/ + [class^="blocklyFlyoutButton"] .blocklyText { + fill: var(--text) !important; + } + + /*Backpack header*/ + [class^="backpack_backpack-header_"] { + background: var(--accent); + color: var(--text); + } + + /*Backpack*/ + [class^="backpack_backpack-list-inner_"] { + background: var(--secondary-bg); + } + + [class^="backpack_backpack-item_"], + [class^="sprite-selector-item_sprite-image-outer_"], + [class^="backpack_backpack-item_"] > div { + background: var(--main-bg); + } + + [class^="backpack_backpack-item_"] img { + mix-blend-mode: normal; + } + + /*Paint & sound editor sidebar*/ + [class^="selector_list-area_"] { + background: var(--accent); + } + + [class^="selector_new-buttons_"]::before { + background: none; + } + + /*Paint & sound editor main*/ + [class^="asset-panel_wrapper_"] { + background: var(--secondary-bg); + color: var(--text); + } + + [class^="sound-editor_effect-button_"], + [class^="sound-editor_trim-button_"] { + color: var(--text); + } + + /*Paint and sound editor buttons*/ + [class^="img.tool-select-base_tool-select-icon_"], + [class^="sound-editor_trim-button_"] { + filter: brightness(2); + } + + /*Sprite costume selector text*/ + [class^="selector_list-item_"], + [class^="sprite-selector-item_sprite-name_"], + [class^="sprite-selector-item_sprite-details_"] { + color: var(--text); + } + + /*Tabs*/ + [class^="react-tabs_react-tabs__tab_"] { + background: var(--accent); + color: var(--text); + } + + [class~="gui_tab_cxXL7"][class~="gui_is-selected_XzCUQ"] { + background: var(--accent); + color: var(--text); + } + + [class*="gui_tab_"]:hover { + background: var(--accent); + filter: brightness(90%); + color: var(--text); + } + + [class^="gui_tab_"] { + background: var(--secondary-bg); + color: var(--text); + } + + /*New variable/list/custom block*/ + [class^="prompt_body_"], + [class^="custom-procedures_body_"], + [class^="div.custom-procedures_option-card_"] { + background: var(--accent); + color: var(--text); + } + + [class^="custom-procedures_button-row_"] > button:nth-child(1), + [class^="prompt_button-row_"] > button:nth-child(1) { + background: #ff3a5b; + } + + /*Fullscreen view*/ + [class^="stage_stage-wrapper-overlay_"], + [class^="stage-header_stage-header-wrapper-overlay_"] { + background: black; + } + + [class^="stage_stage-overlay-content_"] { + border: none; + } + + /*Library and card backgrounds*/ + [class^="library_library-scroll-grid_"], + [class^="modal_modal-content_"].modal_full-screen_, + [class^="card_step-body_"], + [class^="card_left-card_"], + [class^="card_right-card_"] { + background: var(--accent); + color: var(--text); + } + + /*Library items & filter bar*/ + [class^="library-item_library-item-extension_"], + [class^="library-item_library-item_"], + [class^="library_filter-bar_"] { + background: var(--accent); + } + + [class^="library-item_library-item-extension_"] span, + [class^="library-item_featured-extension-metadata_"], + [class^="library-item_library-item-name_"] { + color: var(--text) !important; + } + + /*Text input*/ + input[type="text"], + [class^="input_input-form_"], + [class^="prompt_variable-name-text-input_"] { + background: var(--accent); + color: var(--text) !important; + } + + input[type="text"]:hover, + input[type="text"]:focus { + background: var(--accent); + filter: brightness(90%); + } + + /*Buttons (inverted for dark theme)*/ + [class^="blocklyZoom"], + [class^="stage-header_stage-button_"], + [class^="sound-editor_round-button_"], + [class^="sound-editor_button-group_"] { + filter: invert(100) hue-rotate(180deg); + } + + /*Set the selected costume/backdrop to have a transparent background as default*/ + [class^="sprite-selector-item_is-selected_"] { + background: transparent !important; + } + + /*Fixing white area around the paint editor*/ + [class^="paint-editor_canvas-container_"] { + border: 1px solid var(--accent); + overflow: hidden; + } + + /*Tweaks for updated paint editor*/ + [class^="paper-canvas_paper-canvas_"] { + background-color: var(--secondary-bg); + border-radius: .4rem; + } + + [class^="paint-editor_canvas-container_"] { + border: 2px solid var(--accent); + border-radius: .4rem; + } + + /*Tweaks for users not signed in*/ + [class^="card_card_"], + [class^="card_left-card_"], + [class^="card_right-card_"] { + border: 1px solid hsla(216, 49%, 90%, 0.14); + } + + /*Scrollbar*/ + [class^="blocklyScrollbarHandle"] { + fill: #CECDCE55; + } + `; + + document.body.appendChild(style); + } else { + if (document.querySelector("style#scratchtoolseditor") !== null) { + document.querySelector("style#scratchtoolseditor").remove(); + } } -} + From 22603005e8022050505713b41790af5e3f10ffb3 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 29 Dec 2024 12:43:40 -0500 Subject: [PATCH 181/253] Recent Followers and Following New feature to revert the recent Scratch update that displayed old followers and followings, restoring the view of the most recent ones --- .../recent-followers-and-following/data.json | 15 +++ .../recent-followers-and-following/script.js | 112 ++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 features/recent-followers-and-following/data.json create mode 100644 features/recent-followers-and-following/script.js diff --git a/features/recent-followers-and-following/data.json b/features/recent-followers-and-following/data.json new file mode 100644 index 00000000..240263c2 --- /dev/null +++ b/features/recent-followers-and-following/data.json @@ -0,0 +1,15 @@ +{ + "title": "Show Recent Followers and Followings", + "description": "Displays the most recent followers and followings of a user on their profile page.", + "credits": [ + { + "username": "-Brass_Glass-", + "url": "https://scratch.mit.edu/users/-Brass_Glass-/" + }, + { "username": "MaterArc", "url": "https://scratch.mit.edu/users/MaterArc/" } + ], + "type": ["Website"], + "tags": ["New", "Featured"], + "dynamic": true, + "scripts": [{ "file": "script.js", "runOn": "/users/*" }] +} diff --git a/features/recent-followers-and-following/script.js b/features/recent-followers-and-following/script.js new file mode 100644 index 00000000..db82ea36 --- /dev/null +++ b/features/recent-followers-and-following/script.js @@ -0,0 +1,112 @@ +export default async function ({ feature, console }) { + const username = window.location.pathname.split('/')[2]; + if (!username) return; + + const followersEndpoint = `https://api.scratch.mit.edu/users/${username}/followers/`; + const followingEndpoint = `https://api.scratch.mit.edu/users/${username}/following/`; + + try { + const followersResponse = await fetch(followersEndpoint); + if (!followersResponse.ok) return; + + const followersData = await followersResponse.json(); + if (!Array.isArray(followersData)) return; + + const mostRecentFollowers = followersData + .slice(0, 9) + .filter(follower => follower.username && follower.profile && follower.profile.images) + .map(follower => ({ + username: follower.username, + profileImage: follower.profile.images['90x90'] || follower.profile.images['50x50'] || '', + })); + + const followingResponse = await fetch(followingEndpoint); + if (!followingResponse.ok) return; + + const followingData = await followingResponse.json(); + if (!Array.isArray(followingData)) return; + + const mostRecentFollowing = followingData + .slice(0, 9) + .filter(follow => follow.username && follow.profile && follow.profile.images) + .map(follow => ({ + username: follow.username, + profileImage: follow.profile.images['90x90'] || follow.profile.images['50x50'] || '', + })); + + ScratchTools.waitForElements("#featured", function (allFeaturedElements) { + if (allFeaturedElements.length === 0) return; + + const lastFeaturedElement = allFeaturedElements[allFeaturedElements.length - 1]; + lastFeaturedElement.innerHTML = ""; + + mostRecentFollowers.forEach(follower => { + const li = document.createElement("li"); + li.className = "user thumb item"; + + const link = document.createElement("a"); + link.href = `/users/${follower.username}/`; + link.title = follower.username; + + const img = document.createElement("img"); + img.className = "lazy"; + img.src = follower.profileImage; + img.alt = follower.username; + img.width = 60; + img.height = 60; + + const span = document.createElement("span"); + span.className = "title"; + + const spanLink = document.createElement("a"); + spanLink.href = `/users/${follower.username}/`; + spanLink.textContent = follower.username; + + link.appendChild(img); + span.appendChild(spanLink); + li.appendChild(link); + li.appendChild(span); + + lastFeaturedElement.appendChild(li); + }); + + if (allFeaturedElements.length > 1) { + const secondLastFeaturedElement = allFeaturedElements[allFeaturedElements.length - 2]; + secondLastFeaturedElement.innerHTML = ""; + + mostRecentFollowing.forEach(follow => { + const li = document.createElement("li"); + li.className = "user thumb item"; + + const link = document.createElement("a"); + link.href = `/users/${follow.username}/`; + link.title = follow.username; + + const img = document.createElement("img"); + img.className = "lazy"; + img.src = follow.profileImage; + img.alt = follow.username; + img.width = 60; + img.height = 60; + + const span = document.createElement("span"); + span.className = "title"; + + const spanLink = document.createElement("a"); + spanLink.href = `/users/${follow.username}/`; + spanLink.textContent = follow.username; + + link.appendChild(img); + span.appendChild(spanLink); + li.appendChild(link); + li.appendChild(span); + + secondLastFeaturedElement.appendChild(li); + }); + } + }); + } catch (error) { + return; + } + } + \ No newline at end of file From d66081dcd7a01bf4b14b8a4c01adf084c1eeab02 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 29 Dec 2024 12:44:50 -0500 Subject: [PATCH 182/253] Update features.json --- features/features.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/features/features.json b/features/features.json index caa770ce..ce8ae54e 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "recent-followers-and-following", + "versionAdded": "v4.0.0" + }, { "version": 2, "id": "outline-shape-options", From f2de1e57ec0764dd012b7bc3ab3758aea723e260 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 29 Dec 2024 15:38:47 -0500 Subject: [PATCH 183/253] Update script.js --- features/recent-followers-and-following/script.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/recent-followers-and-following/script.js b/features/recent-followers-and-following/script.js index db82ea36..d5dac9eb 100644 --- a/features/recent-followers-and-following/script.js +++ b/features/recent-followers-and-following/script.js @@ -34,7 +34,7 @@ export default async function ({ feature, console }) { profileImage: follow.profile.images['90x90'] || follow.profile.images['50x50'] || '', })); - ScratchTools.waitForElements("#featured", function (allFeaturedElements) { + const allFeaturedElements = document.querySelectorAll("#featured"); if (allFeaturedElements.length === 0) return; const lastFeaturedElement = allFeaturedElements[allFeaturedElements.length - 1]; @@ -109,4 +109,4 @@ export default async function ({ feature, console }) { return; } } - \ No newline at end of file + From bc54bfbaf8e765f5fbdcd09537dad759127e4fac Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Sun, 29 Dec 2024 18:51:22 -0500 Subject: [PATCH 184/253] Style new banner link --- features/original-colors/scratch-www.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/features/original-colors/scratch-www.css b/features/original-colors/scratch-www.css index 242e15dd..2928ba5f 100644 --- a/features/original-colors/scratch-www.css +++ b/features/original-colors/scratch-www.css @@ -565,3 +565,7 @@ input[class^="input_input-form_"]:focus { .studio-status-icon-unselected { background-color: var(--ste-blue) !important; } + +.banner-wrapper .banner-description p a { + color: #fff; +} From d8322ae9b9ffc7c3cc3e60e12850ac9da3c14ccb Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Fri, 3 Jan 2025 16:17:21 -0500 Subject: [PATCH 185/253] Fix Syntax Error --- .../recent-followers-and-following/script.js | 214 +++++++++--------- 1 file changed, 106 insertions(+), 108 deletions(-) diff --git a/features/recent-followers-and-following/script.js b/features/recent-followers-and-following/script.js index d5dac9eb..f50ca063 100644 --- a/features/recent-followers-and-following/script.js +++ b/features/recent-followers-and-following/script.js @@ -1,112 +1,110 @@ export default async function ({ feature, console }) { - const username = window.location.pathname.split('/')[2]; - if (!username) return; - - const followersEndpoint = `https://api.scratch.mit.edu/users/${username}/followers/`; - const followingEndpoint = `https://api.scratch.mit.edu/users/${username}/following/`; - - try { - const followersResponse = await fetch(followersEndpoint); - if (!followersResponse.ok) return; - - const followersData = await followersResponse.json(); - if (!Array.isArray(followersData)) return; - - const mostRecentFollowers = followersData - .slice(0, 9) - .filter(follower => follower.username && follower.profile && follower.profile.images) - .map(follower => ({ - username: follower.username, - profileImage: follower.profile.images['90x90'] || follower.profile.images['50x50'] || '', - })); - - const followingResponse = await fetch(followingEndpoint); - if (!followingResponse.ok) return; - - const followingData = await followingResponse.json(); - if (!Array.isArray(followingData)) return; - - const mostRecentFollowing = followingData - .slice(0, 9) - .filter(follow => follow.username && follow.profile && follow.profile.images) - .map(follow => ({ - username: follow.username, - profileImage: follow.profile.images['90x90'] || follow.profile.images['50x50'] || '', - })); - - const allFeaturedElements = document.querySelectorAll("#featured"); - if (allFeaturedElements.length === 0) return; - - const lastFeaturedElement = allFeaturedElements[allFeaturedElements.length - 1]; - lastFeaturedElement.innerHTML = ""; - - mostRecentFollowers.forEach(follower => { - const li = document.createElement("li"); - li.className = "user thumb item"; - - const link = document.createElement("a"); - link.href = `/users/${follower.username}/`; - link.title = follower.username; - - const img = document.createElement("img"); - img.className = "lazy"; - img.src = follower.profileImage; - img.alt = follower.username; - img.width = 60; - img.height = 60; - - const span = document.createElement("span"); - span.className = "title"; - - const spanLink = document.createElement("a"); - spanLink.href = `/users/${follower.username}/`; - spanLink.textContent = follower.username; - - link.appendChild(img); - span.appendChild(spanLink); - li.appendChild(link); - li.appendChild(span); - - lastFeaturedElement.appendChild(li); - }); - - if (allFeaturedElements.length > 1) { - const secondLastFeaturedElement = allFeaturedElements[allFeaturedElements.length - 2]; - secondLastFeaturedElement.innerHTML = ""; - - mostRecentFollowing.forEach(follow => { - const li = document.createElement("li"); - li.className = "user thumb item"; - - const link = document.createElement("a"); - link.href = `/users/${follow.username}/`; - link.title = follow.username; - - const img = document.createElement("img"); - img.className = "lazy"; - img.src = follow.profileImage; - img.alt = follow.username; - img.width = 60; - img.height = 60; - - const span = document.createElement("span"); - span.className = "title"; - - const spanLink = document.createElement("a"); - spanLink.href = `/users/${follow.username}/`; - spanLink.textContent = follow.username; - - link.appendChild(img); - span.appendChild(spanLink); - li.appendChild(link); - li.appendChild(span); - - secondLastFeaturedElement.appendChild(li); - }); - } + const username = window.location.pathname.split('/')[2]; + if (!username) return; + + const followersEndpoint = `https://api.scratch.mit.edu/users/${username}/followers/`; + const followingEndpoint = `https://api.scratch.mit.edu/users/${username}/following/`; + + try { + const followersResponse = await fetch(followersEndpoint); + if (!followersResponse.ok) return; + + const followersData = await followersResponse.json(); + if (!Array.isArray(followersData)) return; + + const mostRecentFollowers = followersData + .slice(0, 9) + .filter(follower => follower.username && follower.profile && follower.profile.images) + .map(follower => ({ + username: follower.username, + profileImage: follower.profile.images['90x90'] || follower.profile.images['50x50'] || '', + })); + + const followingResponse = await fetch(followingEndpoint); + if (!followingResponse.ok) return; + + const followingData = await followingResponse.json(); + if (!Array.isArray(followingData)) return; + + const mostRecentFollowing = followingData + .slice(0, 9) + .filter(follow => follow.username && follow.profile && follow.profile.images) + .map(follow => ({ + username: follow.username, + profileImage: follow.profile.images['90x90'] || follow.profile.images['50x50'] || '', + })); + + const allFeaturedElements = document.querySelectorAll("#featured"); + if (allFeaturedElements.length === 0) return; + + const lastFeaturedElement = allFeaturedElements[allFeaturedElements.length - 1]; + lastFeaturedElement.innerHTML = ""; + + mostRecentFollowers.forEach(follower => { + const li = document.createElement("li"); + li.className = "user thumb item"; + + const link = document.createElement("a"); + link.href = `/users/${follower.username}/`; + link.title = follower.username; + + const img = document.createElement("img"); + img.className = "lazy"; + img.src = follower.profileImage; + img.alt = follower.username; + img.width = 60; + img.height = 60; + + const span = document.createElement("span"); + span.className = "title"; + + const spanLink = document.createElement("a"); + spanLink.href = `/users/${follower.username}/`; + spanLink.textContent = follower.username; + + link.appendChild(img); + span.appendChild(spanLink); + li.appendChild(link); + li.appendChild(span); + + lastFeaturedElement.appendChild(li); + }); + + if (allFeaturedElements.length > 1) { + const secondLastFeaturedElement = allFeaturedElements[allFeaturedElements.length - 2]; + secondLastFeaturedElement.innerHTML = ""; + + mostRecentFollowing.forEach(follow => { + const li = document.createElement("li"); + li.className = "user thumb item"; + + const link = document.createElement("a"); + link.href = `/users/${follow.username}/`; + link.title = follow.username; + + const img = document.createElement("img"); + img.className = "lazy"; + img.src = follow.profileImage; + img.alt = follow.username; + img.width = 60; + img.height = 60; + + const span = document.createElement("span"); + span.className = "title"; + + const spanLink = document.createElement("a"); + spanLink.href = `/users/${follow.username}/`; + spanLink.textContent = follow.username; + + link.appendChild(img); + span.appendChild(spanLink); + li.appendChild(link); + li.appendChild(span); + + secondLastFeaturedElement.appendChild(li); }); - } catch (error) { - return; } + } catch (error) { + return; } - +} From 8c3e1163c8358100028f736f39b558df62efae06 Mon Sep 17 00:00:00 2001 From: "scratchtools-bot[bot]" <123264640+scratchtools-bot[bot]@users.noreply.github.com> Date: Sat, 4 Jan 2025 00:00:20 +0000 Subject: [PATCH 186/253] Updated file. --- extras/feature-locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/feature-locales/en.json b/extras/feature-locales/en.json index 8504ab38..594e6f70 100644 --- a/extras/feature-locales/en.json +++ b/extras/feature-locales/en.json @@ -1 +1 @@ -{"outline-shape-options/title":{"message":"Customizable Shape Outlines"},"outline-shape-options/description":{"message":"Adds more options in the outline dropdown to allow you to customize the shape of the outline, such as making corners round."},"more-paint-functions/title":{"message":"More Paint Functions"},"more-paint-functions/description":{"message":"Adds new functions to the paint editor. The new functions include unite (combining them into one), subtract (removing one shape from another), exclude (removing the overlap of 2 items), and intersect (removing everything but the overlap of 2 items). Each function only works with 2 items."},"asset-size/title":{"message":"Asset Size"},"asset-size/description":{"message":"Allows you to hover over any asset (costumes and sounds) in the editor to view the file size."},"disable-cloud/title":{"message":"Disable Cloud"},"disable-cloud/description":{"message":"Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any."},"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file +{"remove-confirmation/title":{"message":"Remove Delete Confirmation"},"remove-confirmation/description":{"message":"Removes the delete confirmation prompt when deleting sprites in the Scratch editor."},"outline-shape-options/title":{"message":"Customizable Shape Outlines"},"outline-shape-options/description":{"message":"Adds more options in the outline dropdown to allow you to customize the shape of the outline, such as making corners round."},"more-paint-functions/title":{"message":"More Paint Functions"},"more-paint-functions/description":{"message":"Adds new functions to the paint editor. The new functions include unite (combining them into one), subtract (removing one shape from another), exclude (removing the overlap of 2 items), and intersect (removing everything but the overlap of 2 items). Each function only works with 2 items."},"asset-size/title":{"message":"Asset Size"},"asset-size/description":{"message":"Allows you to hover over any asset (costumes and sounds) in the editor to view the file size."},"disable-cloud/title":{"message":"Disable Cloud"},"disable-cloud/description":{"message":"Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any."},"webp-uploads/title":{"message":"WEBP Image Uploads"},"webp-uploads/description":{"message":"Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops."},"remaining-replies/title":{"message":"Remaining Replies"},"remaining-replies/description":{"message":"Shows how many more replies are allowed in a thread of studio comments."},"video-recorder/title":{"message":"Record Stage"},"video-recorder/description":{"message":"Allows you to record the stage for projects while in the editor or on the project page."},"studio-creation-date/title":{"message":"Studio Creation Date"},"studio-creation-date/description":{"message":"Adds the creation date of the studio to the studio footer."},"explore-filter/title":{"message":"Explore Filter"},"explore-filter/description":{"message":"Customize project and studio search results with filters on the Search, Explore, and Studio pages."},"better-featured-projects/title":{"message":"Better Featured Projects"},"better-featured-projects/description":{"message":"Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well."},"align-to-center/title":{"message":"Align to Center"},"align-to-center/description":{"message":"Allows you to align text in Instructions and Notes & Credits boxes to the center of the input."},"more-editor-fonts/title":{"message":"More Paint Editor Fonts"},"more-editor-fonts/description":{"message":"Allows you to use dozens of extra fonts in the paint editor."},"upload-thumbnail/title":{"message":"Set Thumbnail"},"upload-thumbnail/description":{"message":"Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage."},"paint-align/title":{"message":"Align Objects in Paint Editor"},"paint-align/description":{"message":"Adds a button to the paint editor that allows you to align selected items."},"rotate-gradient/title":{"message":"Rotate Gradients"},"rotate-gradient/description":{"message":"Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors."},"change-monitor-opacity/title":{"message":"Custom Monitor Opacity"},"change-monitor-opacity/description":{"message":"Set the opacity of variables and lists on the stage to a custom number."},"project-reactions/title":{"message":"Project Reactions"},"project-reactions/description":{"message":"Allows you to react to projects with different emojis."},"chomp-blocks/title":{"message":"Extend C Blocks"},"chomp-blocks/description":{"message":"Automatically extends C blocks to wrap around blocks that it is being placed over when dragging."},"custom-explore/title":{"message":"Custom Explore Redirect"},"custom-explore/description":{"message":"Automatically redirect to a specific tab on the Explore page."},"stage-in-spritepane/title":{"message":"Stage In Sprite Pane"},"stage-in-spritepane/description":{"message":"Move the stage button to the sprite pane to widen the sprite field."},"better-cloud-history/title":{"message":"Better Cloud History"},"better-cloud-history/description":{"message":"Updates the cloud monitor page to a more modern version with more details. You can click on variable names to sort by that variable."},"sprite-layers/title":{"message":"View Sprite Layers"},"sprite-layers/description":{"message":"Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers."},"hide-project-tags/title":{"message":"Hide Project Tags"},"hide-project-tags/description":{"message":"Hides all linked tags in the Instructions/Notes and Credits of projects."},"snap-to-grid/title":{"message":"Snap Scripts to Grid"},"snap-to-grid/description":{"message":"Automatically aligns scripts to the dotted grid in the editor when placed."},"select-self/title":{"message":"Select Self"},"select-self/description":{"message":"Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites."},"sidebar/title":{"message":"Sidebar"},"sidebar/description":{"message":"Adds a sidebar to the Scratch website, rather than just the normal navigation bar at the top of the screen."},"project-version-detector/title":{"message":"Project Version Detector"},"project-version-detector/description":{"message":"Checks when a project was shared and adds a label next to the share date to indicate which version of Scratch was in use at that time."},"fullscreen-explorer/title":{"message":"Fullscreen Project Grids"},"fullscreen-explorer/description":{"message":"Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages."},"project-descriptions/title":{"message":"Summarized Descriptions"},"project-descriptions/description":{"message":"Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions."},"total-stats/title":{"message":"Total User Stats"},"total-stats/description":{"message":"Next to shared projects on a user's profile, displays the total loves, favorites and views that the user has received across all of their shared projects."},"project-miniplayer/title":{"message":"Project Miniplayer"},"project-miniplayer/description":{"message":"Scroll down on the project page and you will automatically see the project miniplayer."},"pin-comments/title":{"message":"Pin Project Comments"},"pin-comments/description":{"message":"Allows you to pin comments on your own projects and see what comments are pinned on other projects."},"download-project/title":{"message":"Download Projects"},"download-project/description":{"message":"Adds a button to project pages that allows you to download the project as an .sb3 file."},"blur-modal/title":{"message":"Blur Modal Backgrounds"},"blur-modal/description":{"message":"Blurs the backgrounds of modals instead of having a colored overlay."},"quick-search/title":{"message":"Quick Search"},"quick-search/description":{"message":"Easily jump between pages on the Scratch website with just the click of Control + K."},"favicon-messages/title":{"message":"Tab Message Count"},"favicon-messages/description":{"message":"Displays your message count in the tab favicon, the Scratch icon at the top of your tab."},"show-emoji-names/title":{"message":"Show Emoji Name"},"show-emoji-names/description":{"message":"Allows you to hover over Scratch emojis in the comments and view their names."},"more-block-themes/title":{"message":"More Block Themes"},"more-block-themes/description":{"message":"Adds additional themes for blocks in the code editor."},"more-key-inputs/title":{"message":"More Key Inputs"},"more-key-inputs/description":{"message":"Adds support for more keys on \"key pressed\" blocks."},"comment-tags/title":{"message":"Editor Comment Tags"},"comment-tags/description":{"message":"Add tags to editor comments to easily organize them."},"profile-flag/title":{"message":"Flag on Profile"},"profile-flag/description":{"message":"Adds flag emojis near selected locations on profile pages."},"follow-on-projects/title":{"message":"Follow on Project Page"},"follow-on-projects/description":{"message":"Follow users directly from the project page instead of going to their profile."},"dark-paint-editor/title":{"message":"Switch Paint Background"},"dark-paint-editor/description":{"message":"Adds a button next to the zoom controls in the paint editor that allows you to switch the background color of the paint editor between light and dark."},"specific-replies/title":{"message":"Specific Reply Messages"},"specific-replies/description":{"message":"In messages related to comments, specifies who a comment was replying to."},"better-trending-thumbnails/title":{"message":"Larger Thumbnails"},"better-trending-thumbnails/description":{"message":"Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box."},"anti-generic/title":{"message":"Anti Generic"},"anti-generic/description":{"message":"On the explore and trending pages, this beta feature automatically hides repetitive projects, along with projects that it expects are generic. This includes projects with a lot of tags, common names, and project duplicates."},"wrap-lists/title":{"message":"Wrap List Items"},"wrap-lists/description":{"message":"Displays text in list items normally without cutting them off if they're too long."},"live-stats/title":{"message":"Live Stats"},"live-stats/description":{"message":"Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts."},"hide-scratch-news/title":{"message":"Hide Scratch News"},"hide-scratch-news/description":{"message":"Hides the Scratch News section on the homepage of the Scratch website."},"watch-later/title":{"message":"Save to Watch Later"},"watch-later/description":{"message":"Save projects you want to view later and they'll appear on a watch later page."},"remove-project-button/title":{"message":"Remove Project Button"},"remove-project-button/description":{"message":"Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu."},"right-side-flag/title":{"message":"Right Side Flag"},"right-side-flag/description":{"message":"Moves the green flag and the red stop sign to the right side of the stage."},"love-fave-animate/title":{"message":"Love Animations"},"love-fave-animate/description":{"message":"Animates the clicking of the love and favorite buttons on project pages."},"default-to-local/title":{"message":"Default to Local"},"default-to-local/description":{"message":"When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites."},"start-stop-hotkeys/title":{"message":"Green Flag Hotkeys"},"start-stop-hotkeys/description":{"message":"Use Control + G to start or stop a project, depending on whether or not it is running."},"opacity-slider/title":{"message":"Opacity Slider"},"opacity-slider/description":{"message":"Change the opacity of objects in the paint editor."},"more-studios/title":{"message":"More Studios"},"more-studios/description":{"message":"Allows you to add projects to more studios instead of just 20."},"localized-explore/title":{"message":"Projects from Country"},"localized-explore/description":{"message":"On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand."},"project-bar/title":{"message":"Project Bar"},"project-bar/description":{"message":"Continue to view the information for a project, even after you scroll down past the notes and credits."},"more-news/title":{"message":"More Scratch News"},"more-news/description":{"message":"On the main page, scroll through the Scratch News section and load more results."},"dumpster-fire/title":{"message":"Dumpster Fire"},"dumpster-fire/description":{"message":"The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\"."},"steal-game/title":{"message":"Steal Game"},"steal-game/description":{"message":"Changes the remix button's text to 'Steal game'."},"statistics/title":{"message":"Statistics"},"statistics/description":{"message":"Adds a statistics button on the my stuff page that leads to your ScratchStats profile."},"echo-effect/title":{"message":"Echo Effect"},"echo-effect/description":{"message":"Adds the echo effect back to the Scratch sound editor."},"compact-buttons/title":{"message":"Compact Buttons"},"compact-buttons/description":{"message":"Buttons text gets removed and will get a new icon if it does not have one already."},"message-count/title":{"message":"Message Count"},"message-count/description":{"message":"Displays the user's message count on their profile next to the country."},"move-share-button/title":{"message":"Move Share Button"},"move-share-button/description":{"message":"On project pages, moves the share button next to the See Inside button."},"preview-textboxes/title":{"message":"Preview Textboxes"},"preview-textboxes/description":{"message":"Preview your profile About Me and What I'm Working On, and your projects' Instructions and Notes and Credits, so that you can see what it will look like to other users."},"more-tutorials/title":{"message":"More Tutorials"},"more-tutorials/description":{"message":"On the Ideas page, you can view additional tutorials from other Scratchers."},"simplify-action-buttons/title":{"message":"Simplify Action Buttons"},"simplify-action-buttons/description":{"message":"Displays project action buttons underneath Notes and Credits as their icons."},"slash-to-search/title":{"message":"Slash to Search"},"slash-to-search/description":{"message":"Click the slash key (/) to select the search bar and start typing."},"shared-clipboard/title":{"message":"Shared Clipboard"},"shared-clipboard/description":{"message":"Allows you to copy and paste items between paint editors in different projects."},"hide-footer/title":{"message":"Hide Footer"},"hide-footer/description":{"message":"The footer takes up a lot of unnecessary space. So hide it!"},"original-colors/title":{"message":"Revert to Blue"},"original-colors/description":{"message":"Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple."},"simplify-editor-tabs/title":{"message":"Simplify Editor Tabs"},"simplify-editor-tabs/description":{"message":"Changes editor tabs to icon-only and shows them as a circle"},"live-character-counts/title":{"message":"Live Character Counts"},"live-character-counts/description":{"message":"On forum, studio, and project pages, displays the live character count for textboxes."},"advanced-search/title":{"message":"Search Profiles"},"advanced-search/description":{"message":"When you search for a user, a link to their profile will be at the top of the page."},"studio-links/title":{"message":"Studio Links as Titles"},"studio-links/description":{"message":"Replaces studio links with their titles, all across the Scratch website."},"block-studios/title":{"message":"Block Individual Studio Activity"},"block-studios/description":{"message":"Disable studio activity messages from specific studios."},"block-messages/title":{"message":"Block Users"},"block-messages/description":{"message":"Hide messages from users that you block. Other users won't see that you've blocked them."},"two-colors/title":{"message":"2.0 Block Colors"},"two-colors/description":{"message":"Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor."},"project-links/title":{"message":"Project Links as Titles"},"project-links/description":{"message":"Replaces project links with their titles, all across the Scratch website."},"emoji-status/title":{"message":"Emoji Statuses"},"emoji-status/description":{"message":"Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status."},"display-name/title":{"message":"Display Names"},"display-name/description":{"message":"Shows display names for Scratchers, and allows you to set your own display name. Display names show next to your username, and aren't limited like usernames are."},"isonline/title":{"message":"Show if User is Online"},"isonline/description":{"message":"On profile pages, displays if a user is online. This will also let other users see if you are online."},"plain-background/title":{"message":"Plain Background"},"plain-background/description":{"message":"Removes the dots from the background of the code editor."},"hide-advertisements/title":{"message":"Hide Ads in Comments"},"hide-advertisements/description":{"message":"Hides advertisements in the comments of profiles, projects, and studios. They can take up a lot of space in the comments."},"hide-block-category-names/title":{"message":"Hide Block Category Names"},"hide-block-category-names/description":{"message":"Changes the block categories in the editor to only show the colors of the categories."},"unlisted-projects/title":{"message":"Unlisted Projects"},"unlisted-projects/description":{"message":"Allows you to generate share links for unshared projects in the editor."},"stats-percentages/title":{"message":"Show Percentages for Project Stats"},"stats-percentages/description":{"message":"On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action."},"clone-counter/title":{"message":"Clone Counter"},"clone-counter/description":{"message":"Displays the total number of clones in the project above, in the stage header."},"colored-shadows/title":{"message":"Colored Shadows"},"colored-shadows/description":{"message":"Replaces the shadow created when you drag a block near another block with the color of the block that is being moved."},"creator-badge/title":{"message":"Author Badge"},"creator-badge/description":{"message":"Adds a badge next to comments written by the author of the project."},"original-buttons/title":{"message":"Original Buttons"},"original-buttons/description":{"message":"Returns the original love, favorite, remix, and view buttons to the Scratch project pages."},"box-shadows/title":{"message":"Content Box Shadows"},"box-shadows/description":{"message":"Adds shadows on all content boxes. When hovering one, the shadow will darken."},"admin-notifications/title":{"message":"Red Admin Message Indicator"},"admin-notifications/description":{"message":"If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange."},"nicknames/title":{"message":"Nicknames"},"nicknames/description":{"message":"Set nicknames for other Scratchers. Only you can see the nicknames, and their username will be replaced with the nickname when you see their name."},"load-more-forum-posts/title":{"message":"Load More Posts"},"load-more-forum-posts/description":{"message":"Load more posts in the forum without having to switch pages."},"scroll-project-titles/title":{"message":"Scroll Project Titles"},"scroll-project-titles/description":{"message":"Allows you to scroll and view the entire title of projects that you don't own."},"search-context-menus/title":{"message":"Search Context Menus"},"search-context-menus/description":{"message":"Type and search context menus to select an option efficiently. You can also press enter to select the top option."},"hover-user-cards/title":{"message":"User Hover Cards"},"hover-user-cards/description":{"message":"Hover over any username on the website to display the profile picture, username and follower count."},"exact-join-date/title":{"message":"Exact Join Date"},"exact-join-date/description":{"message":"Displays the exact time that a user joined, shown on their profile."},"upload-img-directly/title":{"message":"Direct Image Uploads"},"upload-img-directly/description":{"message":"Allows you to upload images to the Scratch forums for posts and signatures without having to use third party image uploading services."},"leave-studio/title":{"message":"Leave Studio Button"},"leave-studio/description":{"message":"Adds a button to the curators page of any studios you curate or manage that allows you to leave the studio. A confirmation shows first."},"frontpage-curator/title":{"message":"Frontpage Curator Name as Link"},"frontpage-curator/description":{"message":"Makes the name of the Frontpage Curator to a clickable link to his profile."},"minimized-remix-credits/title":{"message":"Minimized Remix Credits"},"minimized-remix-credits/description":{"message":"The remix credit boxes for projects take space from the project Instructions, so this makes the box smaller."},"follows-you/title":{"message":"Show if Following on Profile"},"follows-you/description":{"message":"If a user is following you, it will show next to their username when you visit their profile."},"custom-studio/title":{"message":"Custom Studio Section"},"custom-studio/description":{"message":"On the homepage of the Scratch website, the newest projects from the studio of your choice are displayed above the Featured Projects."},"highlight-unanswered/title":{"message":"Highlight Unanswered Forum Topics"},"highlight-unanswered/description":{"message":"Adds a blue highlight to topics in the forums that have no replies."},"search-assets/title":{"message":"Search Assets"},"search-assets/description":{"message":"Search through costume and sound assets in the editor."},"block-count-in-mystuff/title":{"message":"Block Count in My Stuff"},"block-count-in-mystuff/description":{"message":"Displays the block count for projects on the My Stuff page."},"pause-audio/title":{"message":"Pause Audio"},"pause-audio/description":{"message":"Allows you to pause and resume audio in the sound editor of Scratch projects."},"display-message-count-in-icon/title":{"message":"Display Message Count"},"display-message-count-in-icon/description":{"message":"Displays your current message count in the extension icon for ScratchTools."},"colored-context-menus/title":{"message":"Colored Context Menus"},"colored-context-menus/description":{"message":"Like in Scratch 2.0, colors the context menus based on the color of the block they're for."},"left-side-stage/title":{"message":"Stage on Left Side"},"left-side-stage/description":{"message":"Like in Scratch 2.0, moves the stage to the left side of the editor, rather than keeping it on the right."},"move-project-title-input/title":{"message":"Project Title Above Stage"},"move-project-title-input/description":{"message":"Like in Scratch 2.0, moves the project title input box above the stage, rather than in the navbar. This only applies to the editor."},"hide-disabled-menu-options/title":{"message":"Hide Disabled Context Menu Options"},"hide-disabled-menu-options/description":{"message":"Context menu options in the editor show even if they are disabled and unable to be used, so this feature will hide them if they are."},"follower-count/title":{"message":"Follower Count on Projects"},"follower-count/description":{"message":"Displays the follower count of the project creator on their projects."},"hide-studio-borders/title":{"message":"Hide Studio Frames"},"hide-studio-borders/description":{"message":"Removes the odd frames from around studio images on 2.0 pages."},"hide-textarea-labels/title":{"message":"Hide Project Instructions and Notes and Credits Labels"},"hide-textarea-labels/description":{"message":"The instructions and notes and credits labels take up quite a bit of space where there could be usual information. This removes them."},"default-to-trending/title":{"message":"Search Trending by Default"},"default-to-trending/description":{"message":"Currently, when you search projects on the Scratch website, you automatically search with the popular filter, instead of trending."},"infinite-backpack-scrolling/title":{"message":"Infinite Backpack Scrolling"},"infinite-backpack-scrolling/description":{"message":"Scroll through the backpack until you reach the very end (does take some time to load, but loads automatically)."},"hide-studio-messages/title":{"message":"Hide Studio Activity Messages"},"hide-studio-messages/description":{"message":"Hide the studio activity messages from the messages page- they pile up quickly and can get annoying."},"get-project-tags/title":{"message":"Display Project Tags"},"get-project-tags/description":{"message":"Lists all of the tags used in the project description right below the project notes and credits."},"link-to-propose/title":{"message":"Link Featured Projects to Studio"},"link-to-propose/description":{"message":"Links the Featured Projects box on the homepage to the Propose Projects to Be Featured studio."},"add-last-option-list/title":{"message":"Set List Item to Last"},"add-last-option-list/description":{"message":"Right click a 'get item [number] of [list]' to set it to select the very last item in the selected list."},"cloud-scratchers/title":{"message":"Online Scratchers in Multiplayer Game"},"cloud-scratchers/description":{"message":"On project pages, displays all of the Scratchers currently in that multiplayer game."},"editor-in-two/title":{"message":"2.0 Editor"},"editor-in-two/description":{"message":"Replaces the default 3.0 online project editor with the 2.0 editor. It's nostalgic, really."},"comment-on-closed-profile/title":{"message":"Comment On Profile With Comments Closed"},"comment-on-closed-profile/description":{"message":"If your profile comments are closed, you can now comment on your own profile anyways. Only you can comment on the profile."},"turbowarp-button-in-editor/title":{"message":"Open in TurboWarp from Editor"},"turbowarp-button-in-editor/description":{"message":"Adds a button to the editor so that you can instantly open the current project in TurboWarp."},"sprite-clones/title":{"message":"Sprite Clone Counter"},"sprite-clones/description":{"message":"Displays the clone count for each individual sprite."},"block-log/title":{"message":"Block Log"},"block-log/description":{"message":"Logs and displays all undo information for the block editor when you press ctrl+shift+l."},"scrollable-list-items/title":{"message":"Scrollable List Items"},"scrollable-list-items/description":{"message":"List items that have a value longer than the width of the list itself will get cut off. Now, you can scroll left and right through the list item."},"custom-fonts/title":{"message":"Custom Website Font"},"custom-fonts/description":{"message":"On the Scratch website, you can set the font to whatever font you want, as long as it is on the Google Fonts website. This is case-sensitive."},"project-timer/title":{"message":"Project Timer"},"project-timer/description":{"message":"Displays the amount of time (in seconds) that the project has been running for."},"colored-comments/title":{"message":"Colored Editor Comments"},"colored-comments/description":{"message":"Colors comments in the editor based on the color of their parent block."},"recently-viewed-projects/title":{"message":"Recently Viewed Projects"},"recently-viewed-projects/description":{"message":"Adds a tab to the My Stuff page where you can see a list of the projects that you have recently viewed."},"collapse-blocks/title":{"message":"Collapse Blocks"},"collapse-blocks/description":{"message":"Right-click block menus in the editor include a button that will let you collapse the selected block."},"set-featured-project/title":{"message":"Set Featured Project"},"set-featured-project/description":{"message":"On any project page, you can set your profile's featured project with the click of a button- even unshared projects."},"scratchformat/title":{"message":"ScratchFormat"},"scratchformat/description":{"message":"Format your comments with bold, italic, and more. The comments will be styled to everyone using ScratchTools."},"expand-editor/title":{"message":"Expand Editor"},"expand-editor/description":{"message":"Use the ctrl+e to switch between the default block editor view and one that hides the stage to expand editor itself."},"list-sprites/title":{"message":"Sprite List"},"list-sprites/description":{"message":"Replaces the sprite grid in the editor with a list that includes the block count and position of the sprite."},"check-if-trending/title":{"message":"Check if Trending"},"check-if-trending/description":{"message":"If a project you're viewing is on the trending page, the place on the trending page will be shown next to the share date on the project page."},"link-forum-activity/title":{"message":"Link Users in Forum Activity"},"link-forum-activity/description":{"message":"In the forums' last post section, makes the usernames link to the user's profile."},"remove-topic-and-post/title":{"message":"Hide Forum Category Counts"},"remove-topic-and-post/description":{"message":"Hides the forum homepage topic and post boxes."},"forum-homepage-emojis/title":{"message":"Forum Category Emojis"},"forum-homepage-emojis/description":{"message":"Adds colorful emojis on the forum homepage categories based on their topic."},"remove-collapse-buttons/title":{"message":"Hide Forum Collapse Buttons"},"remove-collapse-buttons/description":{"message":"Hides the collapse buttons on the forum main page."},"pin-projects/title":{"message":"Pin Projects to My Stuff"},"pin-projects/description":{"message":"Pin one of your projects to the top of your My Stuff page with the click of a button. You can unpin your pinned project or switch out your pinned project for another one as well."},"last-key-pressed/title":{"message":"Last Key Pressed"},"last-key-pressed/description":{"message":"On any project page and in the editor, you can view the last key that you have pressed while on that project, according to the project itself. This is good for games such as platformers."},"hide-signatures/title":{"message":"Hide Forum Signatures"},"hide-signatures/description":{"message":"Hides all forum signatures and signature dividers."},"twemoji-in-forums/title":{"message":"Better Forum Emojis"},"twemoji-in-forums/description":{"message":"Replaces the current low resolution forum emojis with high quality Twemojis."},"go-to-parent/title":{"message":"Go to Parent Button"},"go-to-parent/description":{"message":"In the editor for any project that is a remix, you can click a button to go to the editor in the parent project."},"most-popular-project/title":{"message":"Most Popular Project"},"most-popular-project/description":{"message":"Displays the most popular project (by views) of the user on profile pages. You can click on the project to view it."},"editor-dark-mode/title":{"message":"Editor Dark Mode"},"editor-dark-mode/description":{"message":"Switches the editor's light color scheme to a darker one."},"hide-studio-group-icon/title":{"message":"Hide Studio Group Icon"},"hide-studio-group-icon/description":{"message":"Hides the studio group icon, and only shows the studio thumbnail."},"colored-messages/title":{"message":"Colored Messages"},"colored-messages/description":{"message":"Colors your messages based on the type of message, such as loves, favorites, and studio invites."},"full-title/title":{"message":"Full Project Title"},"full-title/description":{"message":"On profile pages, hover over any project title to show the full title."},"fixed-box/title":{"message":"Fix Content Boxes"},"fixed-box/description":{"message":"Makes all sides of boxes on the pages rounded, rather than just the tops."},"user-bio/title":{"message":"User Bio on Hover"},"user-bio/description":{"message":"In profile comments, hover over any username to display the user's bio."},"nfe-project-checker/title":{"message":"NFE Project Checker"},"nfe-project-checker/description":{"message":"On project pages, displays whether the project is Safe, Unreviewed, or NSFE (Not Safe for Everyone)."},"sprite-data/title":{"message":"Display Sprite Data"},"sprite-data/description":{"message":"In the Code, Costumes, and Sounds tab for each sprite, the number of blocks, costumes, and sounds will be displayed for the current sprite."},"idea-generator/title":{"message":"Project Idea Generator"},"idea-generator/description":{"message":"On the Scratch Ideas page, there will be a section where you can generate project ideas if you need some."},"hide-stickies/title":{"message":"Hide Forum Stickies"},"hide-stickies/description":{"message":"Hides the basic stickies from the top of each forum topic."},"nfe-search/title":{"message":"NFE Search"},"nfe-search/description":{"message":"Use a button to search all projects, including NFE ones."},"open-in-new-tab/title":{"message":"Open in New Tab"},"open-in-new-tab/description":{"message":"Automatically opens links on project pages in a new tab."},"unbold-site-text/title":{"message":"Unbold Site Text"},"unbold-site-text/description":{"message":"Makes it so that all text across Scratch is unbolded, and just normal text."},"compact-navbar/title":{"message":"Compact Navbar"},"compact-navbar/description":{"message":"Makes more room on the navigation bar near where your profile dropdown is."},"delete-all/title":{"message":"Delete All Sprites"},"delete-all/description":{"message":"Adds an option in the right-click context menu for sprites. It will delete all sprites (after confirmation to make sure it isn't an accident)."},"round-profile-pictures/title":{"message":"Round Profile Pictures"},"round-profile-pictures/description":{"message":"All profile pictures on the Scratch website will be rounded."},"ocular-link/title":{"message":"Ocular Links in Forums"},"ocular-link/description":{"message":"Adds a link to any user's Ocular page right below their username on a post."},"forum-scratch-team/title":{"message":"Scratch Team Symbol in Forums"},"forum-scratch-team/description":{"message":"Next to the username of any Scratch Team member in the forums, an asterisk (*) is placed at the end of their username."},"remove-editor-icons/title":{"message":"Remove Editor Icons"},"remove-editor-icons/description":{"message":"Removes the icons from the tabs in the editor."},"sprite-watermark/title":{"message":"Remove Sprite Watermark"},"sprite-watermark/description":{"message":"Removes the sprite watermark that shows in the editor."},"compact-editor/title":{"message":"Compact Editor"},"compact-editor/description":{"message":"Makes sprite and backdrop information more compact."},"my-recent-projects/title":{"message":"Replace Scratch News with Recent Projects"},"my-recent-projects/description":{"message":"Replaces the Scratch News section on the homepage with your recently shared projects."},"focus-mode/title":{"message":"Focus Mode"},"focus-mode/description":{"message":"Removes the comments, studio and remix column, header, and footer on project pages when the button is clicked."}} \ No newline at end of file From 1a87e031753903467bdcfd40ccdde411c434dbdb Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Mon, 27 Jan 2025 16:51:36 -0800 Subject: [PATCH 187/253] v4.0.0 update screen --- api/update/changelogs/forum.json | 7 ++ api/update/changelogs/project.json | 63 +++++++++++++ api/update/changelogs/website.json | 28 ++++++ api/update/icons/align.svg | 1 + api/update/icons/change.svg | 1 + api/update/icons/countdown.svg | 1 + api/update/icons/date.svg | 1 + api/update/icons/extend.svg | 1 + api/update/icons/filesize.svg | 1 + api/update/icons/filter.svg | 1 + api/update/icons/font.svg | 1 + api/update/icons/gift.svg | 1 + api/update/icons/gradient.svg | 1 + api/update/icons/logo.svg | 13 +++ api/update/icons/nocloud.svg | 1 + api/update/icons/opacity.svg | 1 + api/update/icons/outline.svg | 1 + api/update/icons/reaction.svg | 1 + api/update/icons/record.svg | 1 + api/update/icons/shapes.svg | 1 + api/update/icons/thumbnail.svg | 1 + api/update/icons/upload.svg | 1 + api/update/icons/variable.svg | 1 + api/update/index.js | 146 +++++++++++++++++++++++++++++ api/update/style.css | 138 +++++++++++++++++++++++++++ manifest.json | 6 +- 26 files changed, 419 insertions(+), 1 deletion(-) create mode 100644 api/update/changelogs/forum.json create mode 100644 api/update/changelogs/project.json create mode 100644 api/update/changelogs/website.json create mode 100644 api/update/icons/align.svg create mode 100644 api/update/icons/change.svg create mode 100644 api/update/icons/countdown.svg create mode 100644 api/update/icons/date.svg create mode 100644 api/update/icons/extend.svg create mode 100644 api/update/icons/filesize.svg create mode 100644 api/update/icons/filter.svg create mode 100644 api/update/icons/font.svg create mode 100644 api/update/icons/gift.svg create mode 100644 api/update/icons/gradient.svg create mode 100644 api/update/icons/logo.svg create mode 100644 api/update/icons/nocloud.svg create mode 100644 api/update/icons/opacity.svg create mode 100644 api/update/icons/outline.svg create mode 100644 api/update/icons/reaction.svg create mode 100644 api/update/icons/record.svg create mode 100644 api/update/icons/shapes.svg create mode 100644 api/update/icons/thumbnail.svg create mode 100644 api/update/icons/upload.svg create mode 100644 api/update/icons/variable.svg create mode 100644 api/update/index.js create mode 100644 api/update/style.css diff --git a/api/update/changelogs/forum.json b/api/update/changelogs/forum.json new file mode 100644 index 00000000..9a9b0818 --- /dev/null +++ b/api/update/changelogs/forum.json @@ -0,0 +1,7 @@ +{ + "active": false, + "title": "Forum Changes for {{ version }}", + "description": "", + "changes": [] + } + \ No newline at end of file diff --git a/api/update/changelogs/project.json b/api/update/changelogs/project.json new file mode 100644 index 00000000..ca32136d --- /dev/null +++ b/api/update/changelogs/project.json @@ -0,0 +1,63 @@ +{ + "active": true, + "title": "Project Page Changes for {{ version }}", + "description": "ScratchTools is introducing many new project page and editor features that will revolutionize the way that you use Scratch. You can enable them on the settings page.", + "changes": [ + { + "icon": "gradient.svg", + "slogan": "Rotate gradient colors in the paint editor" + }, + { + "icon": "align.svg", + "slogan": "Align shapes and objects in the paint editor" + }, + { + "icon": "align.svg", + "slogan": "Quickly center text in your project instructions" + }, + { + "icon": "extend.svg", + "slogan": "Extend C-blocks around code when dragging them" + }, + { + "icon": "filesize.svg", + "slogan": "View file sizes for any asset" + }, + { + "icon": "font.svg", + "slogan": "Use dozens of extra fonts in the paint editor" + }, + { + "icon": "nocloud.svg", + "slogan": "Temporarily disable cloud variables in projects" + }, + { + "icon": "opacity.svg", + "slogan": "Customize the opacity of stage variable monitors" + }, + { + "icon": "outline.svg", + "slogan": "Customize and round lines and shape outlines" + }, + { + "icon": "reaction.svg", + "slogan": "Add and view emoji reactions on any project" + }, + { + "icon": "record.svg", + "slogan": "Record and save videos of your project stage" + }, + { + "icon": "shapes.svg", + "slogan": "Unite, subtract, intersect, and exclude shapes" + }, + { + "icon": "thumbnail.svg", + "slogan": "Upload custom project thumbnails" + }, + { + "icon": "upload.svg", + "slogan": "Upload WEBP images as costumes and sprites" + } + ] +} diff --git a/api/update/changelogs/website.json b/api/update/changelogs/website.json new file mode 100644 index 00000000..8e4cd84c --- /dev/null +++ b/api/update/changelogs/website.json @@ -0,0 +1,28 @@ +{ + "active": true, + "title": "Website Changes for {{ version }}", + "description": "ScratchTools is introducing many new features for the Scratch website. You can enable them on the settings page.", + "changes": [ + { + "icon": "change.svg", + "slogan": "Customize what tag is used by default on the explore page" + }, + { + "icon": "gift.svg", + "slogan": "A ScratchTools selection of featured projects" + }, + { + "icon": "filter.svg", + "slogan": "Filter through studio, explore, and searched projects" + }, + { + "icon": "date.svg", + "slogan": "See when a studio was created" + }, + { + "icon": "countdown.svg", + "slogan": "View how many replies are left in a thread" + } + ] + } + \ No newline at end of file diff --git a/api/update/icons/align.svg b/api/update/icons/align.svg new file mode 100644 index 00000000..0f181f48 --- /dev/null +++ b/api/update/icons/align.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/change.svg b/api/update/icons/change.svg new file mode 100644 index 00000000..5040be17 --- /dev/null +++ b/api/update/icons/change.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/countdown.svg b/api/update/icons/countdown.svg new file mode 100644 index 00000000..b2483d3d --- /dev/null +++ b/api/update/icons/countdown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/date.svg b/api/update/icons/date.svg new file mode 100644 index 00000000..98123090 --- /dev/null +++ b/api/update/icons/date.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/extend.svg b/api/update/icons/extend.svg new file mode 100644 index 00000000..59355358 --- /dev/null +++ b/api/update/icons/extend.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/filesize.svg b/api/update/icons/filesize.svg new file mode 100644 index 00000000..b3887810 --- /dev/null +++ b/api/update/icons/filesize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/filter.svg b/api/update/icons/filter.svg new file mode 100644 index 00000000..add0849e --- /dev/null +++ b/api/update/icons/filter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/font.svg b/api/update/icons/font.svg new file mode 100644 index 00000000..9886d27c --- /dev/null +++ b/api/update/icons/font.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/gift.svg b/api/update/icons/gift.svg new file mode 100644 index 00000000..ada83f3c --- /dev/null +++ b/api/update/icons/gift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/gradient.svg b/api/update/icons/gradient.svg new file mode 100644 index 00000000..b60fe149 --- /dev/null +++ b/api/update/icons/gradient.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/logo.svg b/api/update/icons/logo.svg new file mode 100644 index 00000000..e5f60834 --- /dev/null +++ b/api/update/icons/logo.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/api/update/icons/nocloud.svg b/api/update/icons/nocloud.svg new file mode 100644 index 00000000..b550d987 --- /dev/null +++ b/api/update/icons/nocloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/opacity.svg b/api/update/icons/opacity.svg new file mode 100644 index 00000000..4f91c12a --- /dev/null +++ b/api/update/icons/opacity.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/outline.svg b/api/update/icons/outline.svg new file mode 100644 index 00000000..76653e2b --- /dev/null +++ b/api/update/icons/outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/reaction.svg b/api/update/icons/reaction.svg new file mode 100644 index 00000000..939ef3e1 --- /dev/null +++ b/api/update/icons/reaction.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/record.svg b/api/update/icons/record.svg new file mode 100644 index 00000000..19a6067a --- /dev/null +++ b/api/update/icons/record.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/shapes.svg b/api/update/icons/shapes.svg new file mode 100644 index 00000000..b0546afa --- /dev/null +++ b/api/update/icons/shapes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/thumbnail.svg b/api/update/icons/thumbnail.svg new file mode 100644 index 00000000..ba07ba78 --- /dev/null +++ b/api/update/icons/thumbnail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/upload.svg b/api/update/icons/upload.svg new file mode 100644 index 00000000..ebd22086 --- /dev/null +++ b/api/update/icons/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/icons/variable.svg b/api/update/icons/variable.svg new file mode 100644 index 00000000..73a6a993 --- /dev/null +++ b/api/update/icons/variable.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api/update/index.js b/api/update/index.js new file mode 100644 index 00000000..7c235ca0 --- /dev/null +++ b/api/update/index.js @@ -0,0 +1,146 @@ +function getPageType() { + let url = new URL(window.location.href); + if (document.querySelector("#page-404")) { + return null; + } else if (url.pathname.startsWith("/projects/")) { + return "project"; + } else if (url.pathname.startsWith("/discuss/")) { + return "forum"; + } else { + return "website"; + } +} + +async function checkUpdate() { + let version = chrome.runtime.getManifest().version; + let { updateScreens } = await chrome.storage.sync.get("updateScreens"); + + if (updateScreens) { + let page = getPageType(); + + if (page && updateScreens[page] !== version) { + updateScreens[page] = version; + await chrome.storage.sync.set({ + updateScreens, + }); + let update = await ( + await fetch( + chrome.runtime.getURL(`/api/update/changelogs/${page}.json`) + ) + ).json(); + if (update.active) { + makeScreen(update); + } + } + } else { + await chrome.storage.sync.set({ + updateScreens: { + website: "0", + project: "0", + forum: "0", + }, + }); + checkUpdate() + } +} +checkUpdate(); + +function makeScreen(update) { + console.log(update); + if (document.querySelector(".ste-update-bg")) return; + let background = Object.assign(document.createElement("div"), { + className: "ste-update-bg", + }); + + let div = Object.assign(document.createElement("div"), { + className: "ste-update-box", + }); + + let topRow = document.createElement("div"); + topRow.append( + Object.assign(document.createElement("img"), { + src: chrome.runtime.getURL("/api/update/icons/logo.svg"), + }) + ); + div.appendChild(topRow); + + let h2 = document.createElement("h2"); + buildText(h2, update.title); + div.appendChild(h2); + + let p = document.createElement("p"); + p.textContent = update.description; + div.appendChild(p); + + let b = document.createElement("b"); + b.textContent = " Here's what's new:"; + p.appendChild(b); + + let rows = Object.assign(document.createElement("div"), { + className: "rows", + }); + + for (var i in update.changes) { + let row = document.createElement("div"); + let img = document.createElement("img"); + img.src = chrome.runtime.getURL( + `/api/update/icons/${update.changes[i].icon}` + ); + let slogan = document.createElement("p"); + slogan.textContent = update.changes[i].slogan; + row.append(img, slogan); + rows.appendChild(row); + } + + div.appendChild(rows); + + let viewMore = document.createElement("div"); + viewMore.className = "view-more"; + let viewMoreSpan = viewMore.appendChild( + Object.assign(document.createElement("span"), { + textContent: "View All", + }) + ); + div.appendChild(viewMore); + + viewMoreSpan.addEventListener("click", function () { + viewMore.remove(); + rows.style.maxHeight = "none"; + }); + + let button = document.createElement("button"); + button.textContent = "Continue"; + button.addEventListener("click", function () { + background.remove(); + div.remove(); + }); + background.addEventListener("click", function () { + div.remove(); + background.remove(); + }); + div.appendChild(button); + + document.body.appendChild(div); + document.body.appendChild(background); +} + +function buildText(element, title) { + let blocks = title.split("{{ version }}"); + console.log(blocks); + + for (var i in blocks) { + let span = document.createElement("span"); + span.textContent = blocks[i]; + element.appendChild(span); + + if (Number(i) !== Number(blocks.length - 1)) { + console.log(i); + let version = document.createElement("span"); + version.textContent = "v" + chrome.runtime.getManifest().version; + version.className = "color"; + element.appendChild(version); + } + } + + return; +} diff --git a/api/update/style.css b/api/update/style.css new file mode 100644 index 00000000..2654759b --- /dev/null +++ b/api/update/style.css @@ -0,0 +1,138 @@ +@import url("https://fonts.googleapis.com/css2?family=Inter&display=swap"); + +.ste-update-bg { + display: block; + position: fixed; + left: 0px; + top: 0px; + z-index: 2147483646; + width: 100vw; + height: 100vh; + background: #00000080; +} + +.ste-update-box { + all: unset; /* Reset inherited styles */ + box-sizing: border-box; + position: fixed; + left: 50%; + top: 50%; + transform: translateX(-50%) translateY(-50%); + background: white; + padding: 32px; + border-radius: 12.8px; + z-index: 2147483647; + width: calc(40 * 16px); + max-width: calc(100% - calc(8 * 16px)); + max-height: calc(100% - calc(8 * 16px)); + overflow-y: auto; + font-size: 16px; + line-height: 20px; +} + +.ste-update-box > div:first-child img { + height: calc(2 * 16px); + float: right; +} + +.ste-update-box * { + font-family: "Inter", sans-serif !important; + text-shadow: none !important; +} + +.ste-update-box h2 { + position: relative; + top: calc(.4 * -16px); + margin-bottom: 20px; + color: black; + font-size: calc(2 * 16px); +} + +.ste-update-box .rows div { + display: flex; + vertical-align: middle; + margin-bottom: calc(2 * 16px); + align-items: center; + break-inside: avoid +} + +.ste-update-box h2 span.color { + background: -webkit-linear-gradient(#ff8c2d, #ffb740); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.ste-update-box .rows div p { + color: black; + margin: 0px; + font-weight: 600; + font-size: calc(1 * 16px); + margin-left: calc(.8 * 16px); +} + +.ste-update-box > p { + color: black; + opacity: .6; + margin-top: 0px; + margin-bottom: calc(1 * 16px); + position: relative; + top: calc(1 * -16px); +} + +.ste-update-box > p > b { + font-weight: 600; +} + +.ste-update-box .rows img { + height: calc(2 * 16px); +} + +.ste-update-box .rows { + column-count: 2; + column-gap: calc(2 * 16px); + margin-bottom: calc(2 * 16px); + max-height: calc(14 * 16px); + overflow-y: hidden; +} + +.ste-update-box > button { + background: linear-gradient(0.25turn, #ff8c2d, #ffb740); + color: white; + width: 100%; + outline: none; + border: 0px; + padding: calc(.8 * 16px); + border-radius: calc(.5 * 16px); + cursor: pointer; + font-weight: 600; + transition: background .3s, opacity .3s; + line-height: 24px; + height: 48px; + font-size: 16px; +} + +.ste-update-box > button:hover { + background: linear-gradient(0.25turn, #ffb740, #ff8c2d); + opacity: .7; +} + +.ste-update-box .view-more { + height: calc(5 * 16px); + width: 100%; + background: linear-gradient(360deg, white, transparent); + position: relative; + top: calc(-8 * 16px); + margin-bottom: calc(-4 * 16px); +} + +.ste-update-box .view-more span { + position: absolute; + left: 50%; + top: calc(50% + calc(3 * 16px)); + transform: translateX(-50%) translateY(-50%); + font-size: calc(1 * 16px); + font-weight: 600; + color: black; + opacity: .6; + cursor: pointer; +} \ No newline at end of file diff --git a/manifest.json b/manifest.json index 66e10786..ca65517a 100644 --- a/manifest.json +++ b/manifest.json @@ -32,7 +32,11 @@ ], "run_at": "document_start", "js": [ - "extras/inject-styles.js" + "extras/inject-styles.js", + "api/update/index.js" + ], + "css": [ + "api/update/style.css" ], "all_frames": true } From f7883818e6022d675a5dba6aef476e86acde9354 Mon Sep 17 00:00:00 2001 From: rgantzos <86856959+rgantzos@users.noreply.github.com> Date: Mon, 27 Jan 2025 16:59:09 -0800 Subject: [PATCH 188/253] Change to "Get live support" --- _locales/en/messages.json | 2 +- extras/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index e6b5260c..725bacc9 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -6,7 +6,7 @@ "message": "ScratchTools is fully customizable with tons of features, all for making the Scratch website better and easier to use!" }, "supportButton": { - "message": "Get support" + "message": "Get live support" }, "feedbackButton": { "message": "Give feedback" diff --git a/extras/index.html b/extras/index.html index 14ce2b14..deecad57 100644 --- a/extras/index.html +++ b/extras/index.html @@ -126,7 +126,7 @@

All feat fill="var(--primary-color)" /> - Get supportGet live support