├── .github ├── ISSUE_TEMPLATE │ ├── --bug.yml │ ├── --enhancement.yml │ ├── --feature.yml │ ├── blank.md │ └── config.yml └── workflows │ └── codeql.yml ├── .gitignore ├── .vscode └── settings.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SECURITY.md ├── _locales ├── en │ └── messages.json ├── es │ └── messages.json ├── ja │ └── messages.json └── tr │ └── messages.json ├── api ├── april │ ├── clap │ │ └── script.js │ ├── index.js │ ├── jokes │ │ ├── data.js │ │ └── script.js │ └── pong │ │ ├── index.html │ │ ├── profile.js │ │ └── script.js ├── auth.js ├── blocklive-detection │ ├── blocklive-detect.js │ ├── extensions.svg │ └── style.css ├── cookies.js ├── feature.js ├── feature │ ├── auth.js │ ├── index.js │ ├── self.js │ ├── server.js │ └── traps.js ├── getScratch.js ├── logging.js ├── main.js ├── modal.css ├── modals.js ├── module.js ├── spaces.js ├── update │ ├── changelogs │ │ ├── forum.json │ │ ├── project.json │ │ └── website.json │ ├── icons │ │ ├── align.svg │ │ ├── change.svg │ │ ├── countdown.svg │ │ ├── date.svg │ │ ├── extend.svg │ │ ├── filesize.svg │ │ ├── filter.svg │ │ ├── font.svg │ │ ├── gift.svg │ │ ├── gradient.svg │ │ ├── logo.svg │ │ ├── nocloud.svg │ │ ├── opacity.svg │ │ ├── outline.svg │ │ ├── reaction.svg │ │ ├── record.svg │ │ ├── shapes.svg │ │ ├── thumbnail.svg │ │ ├── upload.svg │ │ └── variable.svg │ ├── index.js │ └── style.css ├── verify.js └── vm.js ├── brand └── SpaceGrotesk.ttf ├── build ├── index.js └── write-permissions.js ├── changelog ├── 3 │ ├── bg.svg │ ├── images │ │ ├── better-blue.png │ │ ├── chat.png │ │ ├── feedback.png │ │ ├── hide-footer.png │ │ ├── important-messages.png │ │ ├── peace.svg │ │ ├── shared-clipboard.png │ │ ├── simplify-action-buttons.png │ │ ├── slash-to-search.png │ │ ├── support.png │ │ └── themes.png │ ├── index.html │ └── style.css ├── background.svg ├── beta.json ├── changes.json ├── dev.svg ├── index.html ├── script.js └── style.css ├── extras ├── awards │ ├── banner.svg │ ├── index.html │ ├── script.js │ └── style.css ├── background.js ├── beta.js ├── beta │ ├── background.svg │ ├── beta.json │ ├── index.html │ └── style.css ├── blocked.js ├── dashboard │ ├── emojis.json │ ├── index.html │ ├── script.js │ └── style.css ├── feature-locales │ ├── en.json │ ├── es.json │ ├── ja.json │ └── tr.json ├── feature │ ├── banner.svg │ ├── index.html │ ├── script.js │ └── style.css ├── feedback │ ├── index.html │ ├── page.js │ ├── script.js │ └── style.css ├── game │ ├── assets │ │ └── logo.svg │ ├── index.html │ ├── script.js │ └── style.css ├── games │ └── tetris │ │ ├── index.html │ │ ├── styles.css │ │ └── tetris.js ├── icons │ ├── beta │ │ ├── beta.svg │ │ ├── beta128.png │ │ ├── beta16.png │ │ └── beta48.png │ ├── campsitedark.svg │ ├── campsitelight.svg │ ├── dark.svg │ ├── external.svg │ ├── feedback.svg │ ├── gear-light.png │ ├── gear-light.svg │ ├── icon128.png │ ├── icon16.png │ ├── icon48.png │ ├── icontrans128.png │ ├── info.svg │ ├── light.svg │ ├── mini-logo.svg │ ├── note.svg │ ├── palette-fill.svg │ ├── search-light.png │ ├── search-light.svg │ ├── search.png │ ├── search.svg │ ├── search2.svg │ ├── settings-icon.svg │ ├── settings.svg │ ├── sparkle.svg │ ├── support.svg │ └── warning.svg ├── index.html ├── inject-styles.js ├── messaging │ ├── script.js │ └── style.css ├── modals.css ├── new.js ├── page.js ├── popup │ ├── popup.css │ ├── popup.html │ └── popup.js ├── protect-mention.js ├── style.css ├── styles │ ├── beta.css │ ├── dark.css │ ├── light.css │ ├── purple-light.css │ ├── purple.css │ ├── system.css │ └── theme.js └── support │ ├── chat │ ├── index.html │ ├── script.js │ └── style.css │ ├── index.html │ ├── page.js │ ├── style.css │ └── support.js ├── feature-locales ├── comment-tags │ ├── en.json │ ├── es.json │ ├── ja.json │ └── tr.json ├── echo-effect │ ├── en.json │ ├── es.json │ ├── ja.json │ └── tr.json ├── explore-filter │ └── en.json ├── isonline │ ├── en.json │ ├── es.json │ ├── ja.json │ └── tr.json ├── message-count │ ├── en.json │ ├── es.json │ ├── ja.json │ └── tr.json ├── more-block-themes │ ├── en.json │ ├── es.json │ ├── ja.json │ └── tr.json ├── paint-align │ └── en.json ├── rotate-gradient │ └── en.json ├── specific-replies │ ├── en.json │ ├── es.json │ ├── ja.json │ └── tr.json ├── statistics │ ├── en.json │ ├── es.json │ ├── ja.json │ └── tr.json └── watch-later │ ├── en.json │ ├── es.json │ ├── ja.json │ └── tr.json ├── features ├── add-last-option-list.js ├── admin-notifications │ ├── data.json │ ├── script.js │ └── style.css ├── advanced-search │ ├── data.json │ ├── script.js │ └── style.css ├── align-to-center │ ├── data.json │ ├── icon.svg │ ├── script.js │ └── style.css ├── anti-generic │ ├── data.json │ └── script.js ├── asset-size │ ├── data.json │ └── script.js ├── better-cloud-history │ ├── data.json │ ├── script.js │ └── style.css ├── better-featured-projects │ ├── data.json │ └── script.js ├── better-trending-thumbnails │ ├── data.json │ └── style.css ├── block-count-in-mystuff.js ├── block-log.js ├── block-messages │ ├── data.json │ ├── messages.css │ ├── messages.js │ ├── profile.css │ └── profile.js ├── block-studios │ ├── data.json │ ├── messages.css │ ├── messages.js │ └── studios.js ├── blur-modal │ ├── data.json │ └── style.css ├── box-shadows │ ├── box-shadows.css │ └── data.json ├── change-monitor-opacity │ ├── data.json │ └── script.js ├── check-if-trending.js ├── chomp-blocks │ ├── data.json │ └── script.js ├── clone-counter │ ├── data.json │ ├── gobo.svg │ ├── script.js │ └── style.css ├── cloud-scratchers.js ├── collapse-blocks.js ├── colored-comments.js ├── colored-context-menus.js ├── colored-messages.js ├── colored-shadows │ ├── data.json │ └── style.css ├── comment-on-closed-profile.js ├── comment-tags │ ├── colors.json │ ├── data.json │ ├── editor.css │ └── script.js ├── compact-buttons │ ├── data.json │ ├── editor.css │ ├── icons │ │ ├── link.svg │ │ └── upload.svg │ └── project.css ├── compact-editor.js ├── compact-navbar.js ├── copy-paste-lists │ ├── data.json │ └── script.js ├── creator-badge │ ├── data.json │ ├── script.js │ └── style.css ├── custom-explore │ ├── data.json │ └── script.js ├── custom-fonts.js ├── custom-studio.js ├── dark-paint-editor │ ├── dark.svg │ ├── data.json │ ├── script.js │ └── style.css ├── default-to-local │ ├── data.json │ └── script.js ├── default-to-trending.js ├── delete-all.js ├── disable-cloud │ ├── data.json │ ├── script.js │ └── style.css ├── display-message-count-in-icon.js ├── display-name │ ├── data.json │ ├── profile.css │ └── profile.js ├── download-project │ ├── data.json │ ├── download.svg │ ├── script.js │ └── style.css ├── dumpster-fire │ ├── data.json │ └── script.js ├── echo-effect │ ├── data.json │ ├── echo.svg │ └── script.js ├── editor-dark-mode.js ├── editor-in-two.js ├── emoji-status │ ├── data.json │ ├── script.js │ └── style.css ├── exact-join-date.js ├── expand-editor.js ├── explore-filter │ ├── data.json │ ├── resources │ │ ├── calendar.svg │ │ ├── filter.svg │ │ ├── title.svg │ │ └── user.svg │ ├── script.js │ └── style.css ├── favicon-messages │ ├── data.json │ └── script.js ├── features.json ├── fixed-box.js ├── focus-mode.js ├── follow-on-projects │ ├── data.json │ ├── follow.svg │ ├── script.js │ └── style.css ├── follower-count.js ├── follows-you.js ├── forum-homepage-emojis.js ├── forum-scratch-team.js ├── frontpage-curator.js ├── full-title.js ├── fullscreen-explorer │ ├── data.json │ ├── style.css │ └── style2.css ├── get-project-tags.js ├── go-to-parent │ ├── data.json │ └── script.js ├── hide-advertisements │ ├── data.json │ ├── style.css │ ├── three.js │ ├── two.css │ └── two.js ├── hide-block-category-names │ ├── data.json │ ├── script.js │ └── style.css ├── hide-disabled-menu-options.js ├── hide-footer │ ├── data.json │ └── style.css ├── hide-project-tags │ ├── data.json │ └── script.js ├── hide-scratch-news │ ├── data.json │ └── style.css ├── hide-signatures.js ├── hide-stickies.js ├── hide-studio-borders.js ├── hide-studio-group-icon.js ├── hide-studio-messages.js ├── hide-textarea-labels.js ├── highlight-unanswered.js ├── hover-user-cards.js ├── idea-generator.js ├── important-messages │ ├── data.json │ ├── script.js │ └── style.css ├── infinite-backpack-scrolling.js ├── isonline │ ├── data.json │ ├── script.js │ └── style.css ├── last-key-pressed.js ├── leave-studio.js ├── left-side-stage.js ├── link-forum-activity.js ├── link-to-propose.js ├── list-sprites.js ├── live-character-counts │ ├── data.json │ ├── forums.js │ ├── projects.js │ ├── studios.js │ └── style.css ├── live-stats │ ├── data.json │ └── script.js ├── load-more-forum-posts.js ├── localized-explore │ ├── data.json │ ├── script.js │ └── style.css ├── love-fave-animate │ ├── data.json │ └── style.css ├── message-count │ ├── data.json │ └── script.js ├── minimized-remix-credits.js ├── more-block-themes │ ├── check.svg │ ├── circle.svg │ ├── colors.css │ ├── data.json │ ├── main.css │ ├── script.js │ └── themes │ │ ├── dark.css │ │ ├── transparent.css │ │ └── ultradark.css ├── more-editor-fonts │ ├── data.json │ ├── script.js │ ├── style.css │ └── text.svg ├── more-key-inputs │ ├── data.json │ └── script.js ├── more-news │ ├── data.json │ ├── script.js │ └── style.css ├── more-paint-functions │ ├── data.json │ ├── icons │ │ ├── exclude.svg │ │ ├── intersect.svg │ │ ├── subtract.svg │ │ └── unite.svg │ ├── script.js │ └── style.css ├── more-studios │ ├── data.json │ ├── script.js │ └── style.css ├── more-tutorials │ ├── data.json │ └── script.js ├── most-popular-project.js ├── move-project-title-input.js ├── move-share-button │ ├── data.json │ └── script.js ├── my-recent-projects.js ├── nfe-project-checker.js ├── nfe-search.js ├── nicknames.js ├── ocular-link.js ├── opacity-slider │ ├── data.json │ ├── script.js │ └── style.css ├── open-in-new-tab.js ├── original-buttons │ ├── data.json │ ├── resources │ │ ├── fav-gray.svg │ │ ├── fav-yellow.svg │ │ ├── love-gray.svg │ │ ├── love-red.svg │ │ ├── remix-gray.svg │ │ └── views-gray.svg │ └── style.css ├── original-colors │ ├── data.json │ ├── reply.svg │ └── scratch-www.css ├── outline-shape-options │ ├── data.json │ ├── resources │ │ ├── cap-butt.svg │ │ ├── cap-round.svg │ │ ├── cap-square.svg │ │ ├── join-arcs.svg │ │ ├── join-bevel.svg │ │ ├── join-miter-clip.svg │ │ ├── join-miter.svg │ │ └── join-round.svg │ ├── script.js │ └── style.css ├── paint-align │ ├── align.svg │ ├── data.json │ ├── script.js │ └── style.css ├── pause-audio.js ├── pin-comments │ ├── data.json │ ├── pin.svg │ ├── script.js │ └── style.css ├── pin-projects.js ├── plain-background │ ├── data.json │ └── style.css ├── preview-textboxes │ ├── data.json │ ├── preview.svg │ ├── profiles.js │ ├── projects.css │ └── projects.js ├── profile-flag │ ├── data.json │ ├── script.js │ └── style.css ├── project-bar │ ├── arrow.svg │ ├── data.json │ ├── script.js │ └── style.css ├── project-descriptions │ ├── data.json │ ├── script.js │ ├── star.svg │ └── style.css ├── project-links │ ├── data.json │ └── script.js ├── project-miniplayer │ ├── data.json │ ├── script.js │ └── style.css ├── project-reactions │ ├── data.json │ ├── emojis │ │ ├── beaming.svg │ │ ├── crying.svg │ │ ├── fire.svg │ │ ├── hands.svg │ │ ├── heart-eyes.svg │ │ ├── heart-face.svg │ │ ├── hearts.svg │ │ ├── laughing.svg │ │ ├── popper.svg │ │ └── thumbsup.svg │ ├── script.js │ └── style.css ├── project-timer.js ├── project-version-detector │ ├── data.json │ └── script.js ├── quick-search │ ├── data.json │ ├── scatt.png │ ├── script.js │ └── style.css ├── random-block-colors │ ├── check.svg │ ├── circle.svg │ ├── colors.css │ ├── data.json │ ├── script.js │ └── style.css ├── recently-viewed-projects.js ├── relevant-forum-posts │ ├── data.json │ ├── script.js │ └── style.css ├── remaining-replies │ ├── data.json │ └── script.js ├── remove-collapse-buttons.js ├── remove-confirmation │ ├── data.json │ ├── script.js │ └── style.css ├── remove-editor-icons.js ├── remove-project-button │ ├── data.json │ ├── remove.svg │ ├── script.js │ └── style.css ├── remove-topic-and-post.js ├── right-side-flag │ ├── data.json │ └── style.css ├── rotate-gradient │ ├── data.json │ ├── script.js │ └── style.css ├── round-profile-pictures.js ├── scratchformat.js ├── scroll-project-titles.js ├── scrollable-list-items.js ├── search-assets.js ├── search-context-menus.js ├── select-self │ ├── data.json │ └── script.js ├── set-featured-project.js ├── shared-clipboard │ ├── data.json │ └── script.js ├── show-emoji-names │ ├── data.json │ └── script.js ├── sidebar │ ├── data.json │ ├── resources │ │ ├── about.svg │ │ ├── create.svg │ │ ├── explore.svg │ │ ├── home.svg │ │ ├── ideas.svg │ │ ├── logout.svg │ │ ├── search.svg │ │ ├── settings.svg │ │ └── signin.svg │ ├── script.js │ └── style.css ├── simplify-action-buttons │ ├── data.json │ └── style.css ├── simplify-editor-tabs │ ├── data.json │ └── style.css ├── slash-to-search │ ├── data.json │ └── script.js ├── snap-to-grid │ ├── data.json │ └── script.js ├── specific-replies │ ├── data.json │ └── script.js ├── sprite-clones.js ├── sprite-data.js ├── sprite-layers │ ├── data.json │ ├── script.js │ └── style.css ├── sprite-watermark.js ├── stage-in-spritepane │ ├── data.json │ ├── script.js │ └── style.css ├── start-stop-hotkeys │ ├── data.json │ └── script.js ├── statistics │ ├── data.json │ └── script.js ├── stats-percentages │ ├── data.json │ └── script.js ├── steal-game │ ├── data.json │ ├── resources │ │ └── trash.svg │ ├── script.js │ └── style.css ├── studio-creation-date │ ├── calendar.svg │ ├── data.json │ └── script.js ├── studio-links │ ├── data.json │ └── script.js ├── total-stats │ ├── data.json │ ├── script.js │ └── style.css ├── turbowarp-button-in-editor.js ├── twemoji-in-forums.js ├── two-colors │ ├── data.json │ └── style.css ├── unbold-site-text.js ├── unlisted-projects │ ├── data.json │ ├── mystuff.css │ ├── mystuff.js │ ├── script.js │ ├── star-full.svg │ ├── star.svg │ └── style.css ├── upload-img-directly.js ├── upload-thumbnail │ ├── data.json │ ├── script.js │ ├── style.css │ └── thumbnail-btn.svg ├── user-bio.js ├── video-recorder │ ├── data.json │ ├── popup.html │ ├── style.css │ └── video-recorder.js ├── watch-later │ ├── data.json │ ├── mystuff.js │ ├── page │ │ ├── index.html │ │ ├── script.js │ │ └── style.css │ ├── script.js │ ├── style.css │ └── watch-later.svg ├── webp-uploads │ ├── data.json │ └── script.js └── wrap-lists │ ├── data.json │ └── style.css ├── libraries └── opentype.js ├── licenses └── mit.txt ├── makefile ├── manifest.json ├── onboarding ├── background.svg ├── featured.json ├── images │ ├── collapse-blocks.png │ ├── isonline.png │ └── search-context-menus.png ├── index.html ├── script2.js ├── style.css └── themes │ ├── dark.png │ ├── dark.svg │ ├── light.png │ ├── light.svg │ └── purple.svg └── themes └── settings ├── index.html ├── script.js ├── style.css └── svgData.svg /.github/ISSUE_TEMPLATE/--bug.yml: -------------------------------------------------------------------------------- 1 | name: 🐛 Bug 2 | description: Report a bug in ScratchTools. 3 | labels: ["type: bug", "status: needs review"] 4 | body: 5 | 6 | - type: textarea 7 | id: describe 8 | attributes: 9 | label: Describe the bug. What is going wrong? 10 | description: We'd like to know what the bug is so that we can fix it very soon. 11 | placeholder: Type here 12 | validations: 13 | required: true 14 | 15 | - type: textarea 16 | id: why 17 | attributes: 18 | label: What is causing the bug? 19 | description: We aren't asking for code, we just want to know when and where this code is happening. 20 | placeholder: For example- "When I go to my own profile and close the comments." 21 | validations: 22 | required: true 23 | 24 | - type: textarea 25 | id: extra 26 | attributes: 27 | label: Anything else? 28 | description: You can put more info here if you have any. 29 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/--enhancement.yml: -------------------------------------------------------------------------------- 1 | name: ✨ Enhancement 2 | description: Suggest an enhancement for ScratchTools to improve a certain feature or other part of the extension. 3 | labels: ["status: needs review", "type: enhancement"] 4 | body: 5 | 6 | - type: textarea 7 | id: describe 8 | attributes: 9 | label: Why would this be helpful? 10 | description: We'd like to know in what cases something like this might be helpful. 11 | placeholder: Type here 12 | validations: 13 | required: true 14 | 15 | - type: textarea 16 | id: how 17 | attributes: 18 | label: How would this work? 19 | description: We aren't asking for code specifics, but we'd like to know your vision for it. 20 | placeholder: Type here 21 | validations: 22 | required: true 23 | 24 | - type: textarea 25 | id: extra 26 | attributes: 27 | label: Anything else? 28 | description: You can put more info here if you have any. 29 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/--feature.yml: -------------------------------------------------------------------------------- 1 | name: 🎉 New Feature 2 | description: Suggest an entirely new feature for ScratchTools. 3 | labels: ["new feature", "status: needs review"] 4 | body: 5 | 6 | - type: textarea 7 | id: describe 8 | attributes: 9 | label: Why would this be helpful? 10 | description: We'd like to know in what cases something like this might be helpful. 11 | placeholder: Type here 12 | validations: 13 | required: true 14 | 15 | - type: textarea 16 | id: how 17 | attributes: 18 | label: How would this work? 19 | description: We aren't asking for code specifics, but we'd like to know your vision for it. 20 | placeholder: Type here 21 | validations: 22 | required: true 23 | 24 | - type: textarea 25 | id: extra 26 | attributes: 27 | label: Anything else? 28 | description: You can put more info here if you have any. 29 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/blank.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 'Blank issue' 3 | about: "Don't see your issue here? Open a blank issue." 4 | title: '' 5 | labels: 'status: needs review' 6 | assignees: '' 7 | --- 8 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: 💬 Send Feedback 4 | url: https://scratchtools.app/feedback 5 | about: Submit feedback for ScratchTools developers to review. 6 | - name: 🔒 Report a Vulnerability 7 | url: mailto:security@scratchtools.app?subject=Reporting%20a%20Security%20Vulnerability&body=(Please%20put%20the%20details%20below) 8 | about: Please report security vulnerabilities here. 9 | - name: 👥 Community Discord Server 10 | url: https://discord.gg/EByJKZR2AE 11 | about: Join the Discord server to submit suggestions/bugs and talk to other users. 12 | - name: 🧑‍💻 Development Discord Server 13 | url: https://discord.gg/6Ecds4pTKT 14 | about: Join the development server to chat with other developers. 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | package.json 3 | package-lock.json -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "json.schemas": [ 3 | { 4 | "fileMatch": ["/features/*/data.json"], 5 | "url": "https://raw.githubusercontent.com/STForScratch/schema/main/feature.json" 6 | }, 7 | { 8 | "fileMatch": ["/manifest.json"], 9 | "url": "https://json.schemastore.org/chrome-manifest.json" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | We only support security issues from versions currently hosted on either Chrome, Firefox, or Edge. Our most recent update on Edge was v2.12.0, and that is the earliest version still hosted. 6 | 7 | | Version | Supported | 8 | | ------- | ------------------ | 9 | | > 2.12 | :white_check_mark: | 10 | | < 2.12 | :x: | 11 | 12 | ## Reporting a Vulnerability 13 | 14 | Please do not report any vulnerabilities publicly. Please only report them at https://scratchtools.app/feedback - our official bugs site. There are links to bug and security bug forms. 15 | -------------------------------------------------------------------------------- /api/april/index.js: -------------------------------------------------------------------------------- 1 | export default async function () { 2 | if (!(new Date().getMonth() === 3 && new Date().getDate() === 1)) return; 3 | 4 | if (window.location.pathname.toLowerCase().startsWith("/users/")) { 5 | let pong = await import("./pong/profile.js"); 6 | pong.default(); 7 | } 8 | 9 | if ( 10 | window.location.pathname.toLowerCase().startsWith("/explore/") || 11 | window.location.pathname.toLowerCase().startsWith("/search/") 12 | ) { 13 | let jokes = await import("./jokes/script.js"); 14 | jokes.default(); 15 | } 16 | 17 | if (window.location.pathname.toLowerCase().startsWith("/projects/")) { 18 | let clap = await import("./clap/script.js"); 19 | clap.default(); 20 | } 21 | } -------------------------------------------------------------------------------- /api/april/jokes/script.js: -------------------------------------------------------------------------------- 1 | export default async function () { 2 | let jokes = (await import("./data.js")).default(); 3 | let outer = await ScratchTools.waitForElement(".outer") 4 | 5 | let joke = jokes[Math.floor(Math.random() * jokes.length)]; 6 | 7 | let div = document.createElement("div"); 8 | div.textContent = joke; 9 | div.classList.add("ste-joke-banner"); 10 | outer.prepend(div); 11 | 12 | div.style.backgroundColor = "#eb506a" 13 | div.style.color = "white" 14 | div.style.fontSize = "1.2rem" 15 | div.style.fontWeight = "500" 16 | div.style.textAlign = "center" 17 | div.style.padding = "1rem" 18 | } 19 | -------------------------------------------------------------------------------- /api/april/pong/profile.js: -------------------------------------------------------------------------------- 1 | export default async function () { 2 | let img = await ScratchTools.waitForElement("form#profile-avatar a img") 3 | 4 | let user = Scratch.INIT_DATA?.LOGGED_IN_USER?.model?.username.toLowerCase() 5 | let username = window.location.pathname.split("/")[2].toLowerCase() 6 | 7 | if (user === username) return; 8 | 9 | img.parentNode.removeAttribute("href") 10 | 11 | img.addEventListener("click", function() { 12 | chrome.runtime.sendMessage(ScratchTools.id, { 13 | msg: "openPong", 14 | username, 15 | id: Scratch.INIT_DATA.PROFILE.model.userId, 16 | }); 17 | }) 18 | } -------------------------------------------------------------------------------- /api/auth.js: -------------------------------------------------------------------------------- 1 | ScratchTools.Session = async function () { 2 | var response = await fetch("https://scratch.mit.edu/session/", { 3 | headers: { 4 | accept: "*/*", 5 | "accept-language": "en-US,en;q=0.9,el;q=0.8", 6 | "sec-ch-ua": 7 | '" Not A;Brand";v="99", "Chromium";v="102", "Google Chrome";v="102"', 8 | "sec-ch-ua-mobile": "?0", 9 | "sec-ch-ua-platform": '"macOS"', 10 | "sec-fetch-dest": "empty", 11 | "sec-fetch-mode": "cors", 12 | "sec-fetch-site": "same-origin", 13 | "x-requested-with": "XMLHttpRequest", 14 | }, 15 | referrer: window.location.href, 16 | referrerPolicy: "strict-origin-when-cross-origin", 17 | body: null, 18 | method: "GET", 19 | mode: "cors", 20 | credentials: "include", 21 | }); 22 | var data = await response.json(); 23 | return data; 24 | }; 25 | async function getAuth() { 26 | ScratchTools.Auth = await ScratchTools.Session(); 27 | } 28 | getAuth(); 29 | -------------------------------------------------------------------------------- /api/cookies.js: -------------------------------------------------------------------------------- 1 | ScratchTools.cookies = {}; 2 | ScratchTools.cookies.get = function (name) { 3 | const value = `; ${document.cookie}`; 4 | const parts = value.split(`; ${name}=`); 5 | if (parts.length === 2) return parts.pop().split(";").shift(); 6 | }; 7 | -------------------------------------------------------------------------------- /api/feature/auth.js: -------------------------------------------------------------------------------- 1 | export default function () { 2 | let auth = { 3 | fetch: async function () { 4 | let data = await ( 5 | await fetch("https://scratch.mit.edu/session/", { 6 | headers: { 7 | "x-requested-with": "XMLHttpRequest", 8 | }, 9 | }) 10 | ).json(); 11 | return data; 12 | }, 13 | csrf: function() { 14 | return ScratchTools.cookies.get("scratchcsrftoken") 15 | }, 16 | cookies: ScratchTools.cookies, 17 | }; 18 | return auth 19 | } 20 | -------------------------------------------------------------------------------- /api/feature/index.js: -------------------------------------------------------------------------------- 1 | import { default as self } from "./self.js"; 2 | import { default as traps } from "./traps.js"; 3 | import { default as auth } from "./auth.js"; 4 | import { default as server } from "./server.js"; 5 | 6 | export default function (data) { 7 | var feature = new Feature(data); 8 | feature.self = self(data.id); 9 | feature.traps = traps() 10 | feature.auth = auth() 11 | feature.server = server() 12 | feature.page = { 13 | appendToSharedSpace: ScratchTools.appendToSharedSpace, 14 | waitForElement: ScratchTools.waitForElement, 15 | waitForElements: ScratchTools.waitForElements, 16 | } 17 | return feature; 18 | } 19 | -------------------------------------------------------------------------------- /api/feature/self.js: -------------------------------------------------------------------------------- 1 | export default function (id) { 2 | var feature = ScratchTools.Features.data.find((el) => el.id === id); 3 | return { 4 | id, 5 | data: feature, 6 | enabled: true, 7 | waitForElement: ScratchTools.waitForElement, 8 | waitForElements: ScratchTools.waitForElements, 9 | hideOnDisable: function(element) { 10 | ScratchTools.managedElements.push({ 11 | element, 12 | feature: feature.id, 13 | previousDisplay: element.style.display, 14 | }) 15 | if (!this.enabled) { 16 | element.style.display = "none" 17 | } 18 | }, 19 | dir: ScratchTools.dir + `/features/${id}/`, 20 | getResource: function (resource) { 21 | if (!feature.resources.find((el) => el.name === resource)) return; 22 | return ( 23 | ScratchTools.dir + 24 | `/features/${id}` + 25 | feature.resources.find((el) => el.name === resource).path 26 | ); 27 | }, 28 | }; 29 | } 30 | -------------------------------------------------------------------------------- /api/feature/server.js: -------------------------------------------------------------------------------- 1 | export default function (id) { 2 | return { 3 | url: "https://data.scratchtools.app", 4 | endpoint: function(path) { 5 | return "https://data.scratchtools.app" + path 6 | }, 7 | } 8 | } -------------------------------------------------------------------------------- /api/feature/traps.js: -------------------------------------------------------------------------------- 1 | export default function () { 2 | return { 3 | vm: ScratchTools.Scratch.vm, 4 | blockly: ScratchTools.Scratch.blockly, 5 | gui: ScratchTools.Scratch.scratchGui, 6 | paint: ScratchTools.Scratch.scratchPaint, 7 | sound: ScratchTools.Scratch.scratchSound, 8 | blocks: ScratchTools.traps.getScratchBlocks, 9 | getPaper: ScratchTools.Scratch.getPaper, 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /api/getScratch.js: -------------------------------------------------------------------------------- 1 | ScratchTools.getScratch = {}; 2 | var allCallbacks = []; 3 | ScratchTools.getScratch.waitForCommentBox = function (callback) { 4 | allCallbacks.push(callback); 5 | }; 6 | 7 | function commentBoxes() { 8 | document.querySelectorAll("textarea").forEach(function (el) { 9 | if (el.name === "content" || el.name === "compose-comment") { 10 | if (!el.className.includes("scratchtoolsCheck")) { 11 | el.className = el.className + " scratchtoolsCheck"; 12 | allCallbacks.forEach(function (callback) { 13 | callback(el); 14 | }); 15 | } 16 | } 17 | }); 18 | } 19 | 20 | var waitForCommentBoxObserver = new MutationObserver(commentBoxes); 21 | waitForCommentBoxObserver.observe(document.querySelector("body"), { 22 | attributes: true, 23 | childList: true, 24 | subtree: true, 25 | }); 26 | -------------------------------------------------------------------------------- /api/logging.js: -------------------------------------------------------------------------------- 1 | ScratchTools.console = {}; 2 | 3 | ScratchTools.console.styleLog = function (text, backgroundColor) { 4 | var styleArray = [ 5 | "padding: 0.1rem", 6 | "background-color: " + backgroundColor, 7 | "border-radius: 0.2rem", 8 | "color: black", 9 | ]; 10 | console.log("%cScratchTools", styleArray.join(";"), text); 11 | }; 12 | 13 | ScratchTools.console.log = function (text) { 14 | ScratchTools.console.styleLog(text, "lime"); 15 | }; 16 | 17 | ScratchTools.console.warn = function (text) { 18 | ScratchTools.console.styleLog(text, "yellow"); 19 | }; 20 | 21 | ScratchTools.console.error = function (text) { 22 | ScratchTools.console.styleLog(text, "#ff9f00"); 23 | }; 24 | -------------------------------------------------------------------------------- /api/update/changelogs/forum.json: -------------------------------------------------------------------------------- 1 | { 2 | "active": false, 3 | "title": "Forum Changes for {{ version }}", 4 | "description": "", 5 | "changes": [] 6 | } 7 | -------------------------------------------------------------------------------- /api/update/changelogs/website.json: -------------------------------------------------------------------------------- 1 | { 2 | "active": true, 3 | "title": "Website Changes for {{ version }}", 4 | "description": "ScratchTools is introducing many new features for the Scratch website. You can enable them on the settings page.", 5 | "changes": [ 6 | { 7 | "icon": "change.svg", 8 | "slogan": "Customize what tag is used by default on the explore page" 9 | }, 10 | { 11 | "icon": "gift.svg", 12 | "slogan": "A ScratchTools selection of featured projects" 13 | }, 14 | { 15 | "icon": "filter.svg", 16 | "slogan": "Filter through studio, explore, and searched projects" 17 | }, 18 | { 19 | "icon": "date.svg", 20 | "slogan": "See when a studio was created" 21 | }, 22 | { 23 | "icon": "countdown.svg", 24 | "slogan": "View how many replies are left in a thread" 25 | } 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /api/update/icons/align.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /api/update/icons/filesize.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /api/update/icons/filter.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /api/update/icons/gradient.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /api/update/icons/nocloud.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /api/update/icons/opacity.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /api/update/icons/outline.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 | -------------------------------------------------------------------------------- /brand/SpaceGrotesk.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/brand/SpaceGrotesk.ttf -------------------------------------------------------------------------------- /build/index.js: -------------------------------------------------------------------------------- 1 | require("./write-permissions") -------------------------------------------------------------------------------- /changelog/3/images/better-blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/changelog/3/images/better-blue.png -------------------------------------------------------------------------------- /changelog/3/images/chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/changelog/3/images/chat.png -------------------------------------------------------------------------------- /changelog/3/images/feedback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/changelog/3/images/feedback.png -------------------------------------------------------------------------------- /changelog/3/images/hide-footer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/changelog/3/images/hide-footer.png -------------------------------------------------------------------------------- /changelog/3/images/important-messages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/changelog/3/images/important-messages.png -------------------------------------------------------------------------------- /changelog/3/images/shared-clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/changelog/3/images/shared-clipboard.png -------------------------------------------------------------------------------- /changelog/3/images/simplify-action-buttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/changelog/3/images/simplify-action-buttons.png -------------------------------------------------------------------------------- /changelog/3/images/slash-to-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/changelog/3/images/slash-to-search.png -------------------------------------------------------------------------------- /changelog/3/images/support.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/changelog/3/images/support.png -------------------------------------------------------------------------------- /changelog/3/images/themes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/changelog/3/images/themes.png -------------------------------------------------------------------------------- /changelog/beta.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 4 3 | } 4 | -------------------------------------------------------------------------------- /extras/awards/script.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/extras/awards/script.js -------------------------------------------------------------------------------- /extras/beta/beta.json: -------------------------------------------------------------------------------- 1 | { 2 | "beta": 4 3 | } 4 | -------------------------------------------------------------------------------- /extras/beta/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Beta 5 | 6 | 7 | 8 | 12 |

Click the button below to install the latest beta.

13 |

After installing, please make sure to remove all other beta versions of ScratchTools.

14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /extras/feature/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Feature 5 | 6 | 7 | 8 | 9 |

10 |

11 | Credits: 12 |
13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /extras/game/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Clicker Game 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 |
14 |

0

15 | 16 | -------------------------------------------------------------------------------- /extras/games/tetris/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Tetris Game 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /extras/games/tetris/styles.css: -------------------------------------------------------------------------------- 1 | body, 2 | html { 3 | height: 100%; 4 | margin: 0; 5 | display: flex; 6 | justify-content: center; 7 | align-items: center; 8 | transition: background-color 0.3s; 9 | } 10 | 11 | canvas { 12 | border: 0px; 13 | display: block; 14 | background-color: white; 15 | padding: 0.5rem; 16 | border-radius: 0.5rem; 17 | } 18 | 19 | body.colorful { 20 | animation: gradientFlash 5s infinite; 21 | background: linear-gradient(to right, #ffc700, #ff0000); 22 | } 23 | 24 | @keyframes gradientFlash { 25 | 0%, 26 | 100% { 27 | background-position: 0%; 28 | } 29 | 25% { 30 | background-position: 100%; 31 | } 32 | 50% { 33 | background-position: 100%; 34 | } 35 | 75% { 36 | background-position: 0%; 37 | } 38 | } -------------------------------------------------------------------------------- /extras/icons/beta/beta128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/extras/icons/beta/beta128.png -------------------------------------------------------------------------------- /extras/icons/beta/beta16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/extras/icons/beta/beta16.png -------------------------------------------------------------------------------- /extras/icons/beta/beta48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/extras/icons/beta/beta48.png -------------------------------------------------------------------------------- /extras/icons/dark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extras/icons/external.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extras/icons/feedback.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extras/icons/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/extras/icons/icon128.png -------------------------------------------------------------------------------- /extras/icons/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/extras/icons/icon16.png -------------------------------------------------------------------------------- /extras/icons/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/extras/icons/icon48.png -------------------------------------------------------------------------------- /extras/icons/icontrans128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/extras/icons/icontrans128.png -------------------------------------------------------------------------------- /extras/icons/info.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extras/icons/note.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extras/icons/palette-fill.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extras/icons/search-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/extras/icons/search-light.png -------------------------------------------------------------------------------- /extras/icons/search-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extras/icons/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/extras/icons/search.png -------------------------------------------------------------------------------- /extras/icons/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extras/icons/search2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /extras/icons/sparkle.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extras/icons/support.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extras/popup/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Popup 5 | 6 | 7 | 8 | 19 |
20 |
21 |
There's nothing here.
22 |
23 |
24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /extras/styles/beta.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --theme: #00a2ff; 3 | --mini-logo: url("/extras/icons/beta/beta.svg"); 4 | --navbar-gradient: linear-gradient(45deg, #00a2ff, #29b0ff); 5 | } 6 | -------------------------------------------------------------------------------- /extras/styles/dark.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --theme: #FF9F00; 3 | --background: #3f3f3f; 4 | --primary-color: white; 5 | --secondary-color: #ffffff77; 6 | --searchbar-bg: #ffffff17; 7 | --searchbar-gears: url("/extras/icons/gear-light.svg"); 8 | --searchbar-search: url("/extras/icons/search-light.svg"); 9 | --mini-logo: url("/extras/icons/mini-logo.svg"); 10 | --box: #eeeeee; 11 | --feature-bg: #343434; 12 | --feature-input-bg: #545454; 13 | --feature-slider-bg: #4b4b4b; 14 | --scrollbar-handle: #797979; 15 | --scrollbar-handle-active: #656565; 16 | --theme-icon: url("/extras/icons/light.svg"); 17 | --navbar-gradient: linear-gradient(0.25turn, #ff8c2d, #ffb740); 18 | --campsite: url("/extras/icons/campsitedark.svg"); 19 | } 20 | -------------------------------------------------------------------------------- /extras/styles/light.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --theme: #FF9F00; 3 | --background: white; 4 | --primary-color: black; 5 | --secondary-color: #00000077; 6 | --searchbar-bg: #eeeeee; 7 | --searchbar-gears: url("/extras/icons/settings.svg"); 8 | --searchbar-search: url("/extras/icons/search.svg"); 9 | --mini-logo: url("/extras/icons/mini-logo.svg"); 10 | --box: #eeeeee; 11 | --feature-bg: #eeeeee75; 12 | --feature-input-bg: #e4e4e4; 13 | --feature-slider-bg: #cccccc; 14 | --scrollbar-handle: #c2bfbf; 15 | --scrollbar-handle-active: #b2afaf; 16 | --theme-icon: url("/extras/icons/dark.svg"); 17 | --navbar-gradient: linear-gradient(0.25turn, #ff8c2d, #ffb740); 18 | --campsite: url("/extras/icons/campsitelight.svg"); 19 | } 20 | 21 | .feedback-btn img { 22 | height: 1rem; 23 | position: relative; 24 | top: 0.2rem; 25 | filter: invert(1); 26 | } 27 | 28 | .support-btn img { 29 | height: 1rem; 30 | position: relative; 31 | top: 0.2rem; 32 | filter: invert(1); 33 | } -------------------------------------------------------------------------------- /extras/styles/purple-light.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --theme: #6a00ff; 3 | --background: #e5d2ff; 4 | --primary-color: rgb(0 0 0); 5 | --secondary-color: #00000077; 6 | --searchbar-bg: #ffffff80; 7 | --searchbar-gears: url(/extras/icons/settings.svg); 8 | --searchbar-search: url(/extras/icons/search.svg); 9 | --mini-logo: url(/extras/icons/mini-logo.svg); 10 | --box: #00000080; 11 | --feature-bg: #ffffff80; 12 | --feature-input-bg: #0000001a; 13 | --feature-slider-bg: #0000001a; 14 | --scrollbar-handle: #00000080; 15 | --scrollbar-handle-active: #38383880; 16 | --theme-icon: url(/extras/icons/dark.svg); 17 | --navbar-gradient: linear-gradient(0.25turn, #6a00ff, #9447ff); 18 | --campsite: url(/extras/icons/campsitelight.svg); 19 | } -------------------------------------------------------------------------------- /extras/styles/purple.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --theme: #6a00ff; 3 | --background: #13002e; 4 | --primary-color: #ffffff; 5 | --secondary-color: #ffffff77; 6 | --searchbar-bg: #00000080; 7 | --searchbar-gears: url("/extras/icons/gear-light.svg"); 8 | --searchbar-search: url("/extras/icons/search-light.svg"); 9 | --mini-logo: url("/extras/icons/mini-logo.svg"); 10 | --box: #00000080; 11 | --feature-bg: #00000080; 12 | --feature-input-bg: #44444475; 13 | --feature-slider-bg: #44444475; 14 | --scrollbar-handle: #00000080; 15 | --scrollbar-handle-active: #38383880; 16 | --theme-icon: url("/extras/icons/light.svg"); 17 | --navbar-gradient: linear-gradient(0.25turn, #6a00ff, #9447ff); 18 | --campsite: url("/extras/icons/campsitedark.svg"); 19 | } -------------------------------------------------------------------------------- /feature-locales/comment-tags/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "clear-search": "Clear Search" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/comment-tags/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "clear-search": "Limpiar búsqueda" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/comment-tags/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "clear-search": "検索をクリア" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/comment-tags/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "clear-search": "Arama Temizle" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/echo-effect/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "echo": "Echo" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/echo-effect/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "echo": "Eco" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/echo-effect/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "echo": "エコー" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/echo-effect/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "echo": "Yankı" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/explore-filter/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "filter", 3 | "title": "Title", 4 | "author": "Author", 5 | "period": "Period", 6 | "reset": "Reset", 7 | "sharedDate": "Shared Date", 8 | "updateDate": "Update Date", 9 | "startDate": "Start date", 10 | "endDate": "End date", 11 | "including": "including", 12 | "excluding": "excluding" 13 | } -------------------------------------------------------------------------------- /feature-locales/isonline/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "online": "Online", 3 | "offline": "Offline", 4 | "unavailable": "(Doesn't use ScratchTools online detection)" 5 | } 6 | -------------------------------------------------------------------------------- /feature-locales/isonline/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "online": "Conectado", 3 | "offline": "Desconectado", 4 | "unavailable": "(No mostrará si estás en línea en ScratchTools)" 5 | } 6 | -------------------------------------------------------------------------------- /feature-locales/isonline/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "online": "オンライン", 3 | "offline": "オフライン", 4 | "unavailable": "ScratchToolsのオンライン表示機能を使用していません" 5 | } 6 | -------------------------------------------------------------------------------- /feature-locales/isonline/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "online": "Çevrimiçi", 3 | "offline": "Çevrimdışı", 4 | "unavailable": "(ScratchTools çevrimiçi tespiti kullanmaz)" 5 | } 6 | -------------------------------------------------------------------------------- /feature-locales/message-count/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "messagesCount": "messages" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/message-count/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "messagesCount": "mensajes" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/message-count/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "messagesCount": "メッセージ" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/message-count/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "messagesCount": "Mesajlar" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/more-block-themes/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "theme-dark": "Dark", 3 | "theme-transparent": "Transparent", 4 | "theme-ultradark": "Ultradark" 5 | } 6 | -------------------------------------------------------------------------------- /feature-locales/more-block-themes/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "theme-dark": "Oscuro", 3 | "theme-transparent": "Transparente", 4 | "theme-ultradark": "Ultra-oscuro" 5 | } 6 | -------------------------------------------------------------------------------- /feature-locales/more-block-themes/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "theme-dark": "ダーク", 3 | "theme-transparent": "クリア", 4 | "theme-ultradark": "ウルトラダーク" 5 | } 6 | -------------------------------------------------------------------------------- /feature-locales/more-block-themes/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "theme-dark": "Koyu", 3 | "theme-transparent": "Saydam", 4 | "theme-ultradark": "Ultra Koyu" 5 | } 6 | -------------------------------------------------------------------------------- /feature-locales/paint-align/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "align": "Align" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/rotate-gradient/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "direction": "Direction" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/specific-replies/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "repliedTo": "replied to a comment from ${commenter} on" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/specific-replies/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "repliedTo": "respondió a un comentario de ${commenter} en" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/specific-replies/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "repliedTo": " ${commenter}のコメントへの返信" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/specific-replies/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "repliedTo": "${commenter} tarafından yapılan bir yoruma yanıt verildi." 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/statistics/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "statistics": "Statistics" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/statistics/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "statistics": "Estadísticas" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/statistics/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "statistics": "統計" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/statistics/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "statistics": "İstatistikler" 3 | } 4 | -------------------------------------------------------------------------------- /feature-locales/watch-later/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "save": "Save", 3 | "unsave": "Unsave", 4 | "watch-later": "Watch Later" 5 | } 6 | -------------------------------------------------------------------------------- /feature-locales/watch-later/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "save": "Guardar", 3 | "unsave": "Desguardar", 4 | "watch-later": "Ver más tarde" 5 | } 6 | -------------------------------------------------------------------------------- /feature-locales/watch-later/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "save": "保存", 3 | "unsave": "保存を破棄", 4 | "watch-later": "後で見る" 5 | } 6 | -------------------------------------------------------------------------------- /feature-locales/watch-later/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "save": "Kaydet", 3 | "unsave": "Kaydetme", 4 | "watch-later": "Sonra İzle" 5 | } 6 | -------------------------------------------------------------------------------- /features/admin-notifications/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Red Admin Message Indicator", 3 | "description": "If you have an admin notification from the Scratch Team, the message indicator in the navigation bar will display red instead of orange.", 4 | "credits": [ 5 | { 6 | "username": "rgantzos", 7 | "url": "https://scratch.mit.edu/users/rgantzos" 8 | } 9 | ], 10 | "scripts": [ 11 | { 12 | "file": "script.js", 13 | "runOn": "/*" 14 | } 15 | ], 16 | "styles": [ 17 | { 18 | "file": "style.css", 19 | "runOn": "/*" 20 | } 21 | ], 22 | "tags": [], 23 | "type": ["Website"], 24 | "dynamic": "true" 25 | } 26 | -------------------------------------------------------------------------------- /features/admin-notifications/script.js: -------------------------------------------------------------------------------- 1 | export default async function ({ feature, console }) { 2 | const session = await ScratchTools.Session(); 3 | if (!session.user) return; 4 | 5 | const username = session.user.username; 6 | const response = await fetch( 7 | `https://api.scratch.mit.edu/users/${username}/messages/admin`, 8 | { 9 | headers: { 10 | "x-token": session.user.token, 11 | }, 12 | } 13 | ); 14 | const data = await response.json(); 15 | 16 | if (data.length > 0) { 17 | if (feature.tab.scratch === 2) { 18 | document 19 | .querySelector(".notificationsCount") 20 | .classList.add("ste-red-alert"); 21 | } else { 22 | document.querySelector(".message-count").classList.add("ste-red-alert"); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /features/admin-notifications/style.css: -------------------------------------------------------------------------------- 1 | .ste-red-alert { 2 | background-color: #ff1a1a !important; 3 | } 4 | -------------------------------------------------------------------------------- /features/advanced-search/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Search Profiles", 3 | "description": "When you search for a user, a link to their profile will be at the top of the page.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "scripts": [{ "file": "script.js", "runOn": "/search/projects*" }], 10 | "styles": [{ "file": "style.css", "runOn": "/search/projects*" }] 11 | } 12 | -------------------------------------------------------------------------------- /features/align-to-center/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/align-to-center/style.css: -------------------------------------------------------------------------------- 1 | .project-notes .project-textlabel { 2 | position: relative; 3 | width: 100%; 4 | } 5 | 6 | .ste-align-center { 7 | position: absolute; 8 | right: 0px; 9 | top: 0px; 10 | height: 100%; 11 | cursor: pointer; 12 | display: none; 13 | } 14 | 15 | .ste-align-center.show { 16 | display: block; 17 | } -------------------------------------------------------------------------------- /features/asset-size/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Asset Size", 3 | "description": "Allows you to hover over any asset (costumes and sounds) in the editor to view the file size.", 4 | "credits": [ 5 | { 6 | "url": "https://scratch.mit.edu/users/rgantzos/", 7 | "username": "rgantzos" 8 | } 9 | ], 10 | "type": ["Editor"], 11 | "dynamic": true, 12 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 13 | "support": { 14 | "yt": "https://youtu.be/gpH3VJvDTkc" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /features/better-cloud-history/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Better Cloud History", 3 | "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.", 4 | "credits": [ 5 | { 6 | "username": "-Brass_Glass-", 7 | "url": "https://scratch.mit.edu/users/-Brass_Glass-/" 8 | }, 9 | { 10 | "username": "rgantzos", 11 | "url": "https://scratch.mit.edu/users/rgantzos/" 12 | } 13 | ], 14 | "type": [ 15 | "Website" 16 | ], 17 | "tags": [ 18 | "New" 19 | ], 20 | "dynamic": true, 21 | "scripts": [ 22 | { 23 | "file": "script.js", 24 | "runOn": "/cloudmonitor/*" 25 | } 26 | ], 27 | "styles": [ 28 | { 29 | "file": "style.css", 30 | "runOn": "/cloudmonitor/*" 31 | } 32 | ] 33 | } -------------------------------------------------------------------------------- /features/better-featured-projects/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Better Featured Projects", 3 | "description": "Replaces the Featured Projects section with featured projects curated by ScratchTools users. You can submit your own projects to be featured as well.", 4 | "credits": [ 5 | { 6 | "username": "rgantzos", 7 | "url": "https://scratch.mit.edu/users/rgantzos/" 8 | } 9 | ], 10 | "type": ["Website"], 11 | "tags": ["New", "Recommended"], 12 | "scripts": [{ "file": "script.js", "runOn": "/*" }] 13 | } 14 | -------------------------------------------------------------------------------- /features/better-trending-thumbnails/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Larger Thumbnails", 3 | "description": "Updates thumbnails on the trending and search pages to be larger and better fit the project/studio box.", 4 | "credits": [ 5 | { "username": "MaterArc", "url": "https://scratch.mit.edu/users/MaterArc/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New"], 9 | "dynamic": true, 10 | "styles": [ 11 | { 12 | "file": "style.css", 13 | "runOn": "/explore/projects/*||/search/projects/*||/explore/studios/*" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /features/better-trending-thumbnails/style.css: -------------------------------------------------------------------------------- 1 | .grid .thumbnail.project .thumbnail-image img { 2 | position: absolute; 3 | top: 0; 4 | bottom: 0; 5 | left:0; 6 | width: 100% !important; 7 | width: 100% !important; 8 | border-bottom-right-radius: 0px !important; 9 | border-bottom-left-radius: 0px !important; 10 | } 11 | .slick-slide img { 12 | position: none !important; 13 | } 14 | 15 | .thumbnail.project { 16 | position: relative; 17 | } 18 | 19 | .grid .thumbnail.gallery .thumbnail-image img { 20 | position: absolute; 21 | top: 0; 22 | bottom: 0; 23 | left:0; 24 | width: 100% !important; 25 | width: 100% !important; 26 | border-bottom-right-radius: 0px !important; 27 | border-bottom-left-radius: 0px !important; 28 | } 29 | 30 | .thumbnail.gallery { 31 | position: relative; 32 | } 33 | -------------------------------------------------------------------------------- /features/block-messages/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Block Users", 3 | "description": "Hide messages from users that you block. Other users won't see that you've blocked them.", 4 | "credits": [ 5 | { 6 | "username": "rgantzos", 7 | "url": "https://scratch.mit.edu/users/rgantzos/" 8 | }, 9 | { 10 | "username": "Scratchfangs", 11 | "url": "https://scratch.mit.edu/users/rgantzos/" 12 | } 13 | ], 14 | "type": ["Website"], 15 | "tags": ["New", "Featured"], 16 | "scripts": [ 17 | { "file": "profile.js", "runOn": "/users/*" }, 18 | { "file": "messages.js", "runOn": "/messages*" } 19 | ], 20 | "styles": [ 21 | { "file": "profile.css", "runOn": "/users/*" }, 22 | { "file": "messages.css", "runOn": "/messages*" } 23 | ], 24 | "dynamic": true, 25 | "similar": ["block-studios", "important-messages"] 26 | } 27 | -------------------------------------------------------------------------------- /features/block-messages/messages.css: -------------------------------------------------------------------------------- 1 | .ste-blocked-message { 2 | display: none; 3 | } -------------------------------------------------------------------------------- /features/block-messages/messages.js: -------------------------------------------------------------------------------- 1 | async function getBlockedUsers() { 2 | var blocked = await ScratchTools.storage.get("block") || [] 3 | ScratchTools.waitForElements("li.social-message", async function(message) { 4 | if (message.querySelector("a.social-messages-profile-link")) { 5 | if (blocked.includes(message.querySelector("a.social-messages-profile-link").textContent)) { 6 | message.classList.add("ste-blocked-message") 7 | } 8 | } 9 | }) 10 | } 11 | getBlockedUsers() -------------------------------------------------------------------------------- /features/block-messages/profile.css: -------------------------------------------------------------------------------- 1 | .ste-block-user { 2 | color: rgba(255, 0, 0, 0.642); 3 | opacity: .5; 4 | display: inline-block; 5 | cursor: pointer; 6 | } 7 | 8 | .ste-block-user:hover { 9 | opacity: 1; 10 | } -------------------------------------------------------------------------------- /features/block-studios/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Block Individual Studio Activity", 3 | "description": "Disable studio activity messages from specific studios.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "scripts": [ 10 | { "file": "studios.js", "runOn": "/studios/*" }, 11 | { "file": "messages.js", "runOn": "/messages*" } 12 | ], 13 | "styles": [{ "file": "messages.css", "runOn": "/messages*" }], 14 | "similar": ["block-messages"] 15 | } 16 | -------------------------------------------------------------------------------- /features/block-studios/messages.css: -------------------------------------------------------------------------------- 1 | .ste-blocked-studio { 2 | display: none; 3 | } 4 | -------------------------------------------------------------------------------- /features/block-studios/messages.js: -------------------------------------------------------------------------------- 1 | var storage = {}; 2 | 3 | storage.setItem = function (name, value) { 4 | return localStorage.setItem(name, JSON.stringify(value)); 5 | }; 6 | 7 | storage.getItem = function (name) { 8 | return JSON.parse(localStorage.getItem(name)); 9 | }; 10 | 11 | ScratchTools.waitForElements( 12 | ".social-message.mod-studio-activity", 13 | function (el) { 14 | if ( 15 | storage 16 | .getItem("blockedStudios") 17 | .includes(getStudioId(el.querySelector("a").href)) 18 | ) { 19 | el.classList.add("ste-blocked-studio"); 20 | } 21 | }, 22 | "hideCertainActivityMessages", 23 | false 24 | ); 25 | -------------------------------------------------------------------------------- /features/blur-modal/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Blur Modal Backgrounds", 3 | "description": "Blurs the backgrounds of modals instead of having a colored overlay.", 4 | "credits": [ 5 | { 6 | "username": "rgantzos", 7 | "url": "https://scratch.mit.edu/users/rgantzos/" 8 | } 9 | ], 10 | "tags": [], 11 | "styles": [{ "file": "style.css", "runOn": "/*" }], 12 | "dynamic": true, 13 | "type": ["Editor"] 14 | } 15 | -------------------------------------------------------------------------------- /features/blur-modal/style.css: -------------------------------------------------------------------------------- 1 | div.ReactModal__Overlay[class*='modal_modal-overlay_'] { 2 | background-color: #00000040 !important; 3 | backdrop-filter: blur(.5rem); 4 | } -------------------------------------------------------------------------------- /features/box-shadows/box-shadows.css: -------------------------------------------------------------------------------- 1 | .box { 2 | transition: box-shadow 0.2s; 3 | box-shadow: 0 0 7px #999999; 4 | } 5 | .box:hover { 6 | box-shadow: 0 0 15px #999999; 7 | } 8 | -------------------------------------------------------------------------------- /features/box-shadows/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Content Box Shadows", 3 | "description": "Adds shadows on all content boxes. When hovering one, the shadow will darken.", 4 | "credits": [ 5 | { "username": "Scratchfangs", "url": "https://scratch.mit.edu/users/Scratchfangs/" } 6 | ], 7 | "tags": [], 8 | "styles": [{ "file": "box-shadows.css", "runOn": "/*" }], 9 | "dynamic": true, 10 | "type": ["Website"] 11 | } 12 | -------------------------------------------------------------------------------- /features/change-monitor-opacity/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Custom Monitor Opacity", 3 | "description": "Set the opacity of variables and lists on the stage to a custom number.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "tags": [], 8 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 9 | "dynamic": true, 10 | "options": [ 11 | { 12 | "id": "monitor-opacity", 13 | "name": "Monitor Opacity (0% - 100%)", 14 | "type": 2, 15 | "validators": { 16 | "min": 0, 17 | "max": 100 18 | } 19 | } 20 | ], 21 | "type": ["Website", "Editor"] 22 | } 23 | -------------------------------------------------------------------------------- /features/change-monitor-opacity/script.js: -------------------------------------------------------------------------------- 1 | export default async function ({ feature, console }) { 2 | let MONITORS = [] 3 | 4 | feature.page.waitForElements("div.monitor-overlay[class*='monitor-list_monitor-list_']", function(monitors) { 5 | MONITORS.push(monitors) 6 | 7 | monitors.style.opacity = feature.self.enabled ? (((feature.settings.get("monitor-opacity")) || 0) / 100).toString() : "100%" 8 | }) 9 | 10 | function updateMonitors(opacity) { 11 | for (var i in MONITORS) { 12 | MONITORS[i].style.opacity = feature.self.enabled ? (((feature.settings.get("monitor-opacity")) || 0) / 100).toString() : "100%" 13 | } 14 | } 15 | 16 | feature.addEventListener("enabled", updateMonitors) 17 | feature.addEventListener("disabled", updateMonitors) 18 | feature.settings.addEventListener("changed", updateMonitors) 19 | } -------------------------------------------------------------------------------- /features/chomp-blocks/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Extend C Blocks", 3 | "description": "Automatically extends C blocks to wrap around blocks that it is being placed over when dragging.", 4 | "credits": [ 5 | { 6 | "username": "CST1229", 7 | "url": "https://github.com/CST1229/" 8 | } 9 | ], 10 | "tags": [], 11 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 12 | "dynamic": true, 13 | "type": ["Editor"], 14 | "support": { 15 | "yt": "https://youtu.be/6sl-Q0ZYYyQ" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /features/clone-counter/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Clone Counter", 3 | "description": "Displays the total number of clones in the project above, in the stage header.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Editor", "Website"], 8 | "tags": ["New", "Featured"], 9 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 10 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 11 | "resources": [{ "name": "clones", "path": "/gobo.svg" }] 12 | } 13 | -------------------------------------------------------------------------------- /features/clone-counter/style.css: -------------------------------------------------------------------------------- 1 | .scratchtools-main-clone-counter { 2 | position: relative; 3 | top: 0.6rem; 4 | margin-left: 1rem; 5 | opacity: 0.8; 6 | font-weight: 600; 7 | font-size: 0.8rem; 8 | } 9 | 10 | .scratchtools-main-clone-counter span { 11 | position: relative; 12 | top: -0.2rem; 13 | } 14 | 15 | .scratchtools-main-clone-counter img { 16 | height: 1rem; 17 | margin-right: 0.5rem; 18 | } 19 | -------------------------------------------------------------------------------- /features/colored-shadows/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Colored Shadows", 3 | "description": "Replaces the shadow created when you drag a block near another block with the color of the block that is being moved.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Editor"], 8 | "tags": ["New"], 9 | "dynamic": true, 10 | "styles": [{ "file": "style.css", "runOn": "/*" }] 11 | } 12 | -------------------------------------------------------------------------------- /features/comment-tags/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Editor Comment Tags", 3 | "description": "Add tags to editor comments to easily organize them.", 4 | "credits": [ 5 | { 6 | "username": "rgantzos", 7 | "url": "https://scratch.mit.edu/users/rgantzos/" 8 | } 9 | ], 10 | "type": ["Editor"], 11 | "tags": ["New", "Featured"], 12 | "dynamic": true, 13 | "scripts": [ 14 | { 15 | "file": "script.js", 16 | "runOn": "/projects/*" 17 | } 18 | ], 19 | "styles": [ 20 | { 21 | "file": "editor.css", 22 | "runOn": "/projects/*" 23 | } 24 | ], 25 | "resources": [{ "name": "tag-colors", "path": "/colors.json" }] 26 | } 27 | -------------------------------------------------------------------------------- /features/comment-tags/editor.css: -------------------------------------------------------------------------------- 1 | .ste-comment-tags { 2 | position: absolute; 3 | bottom: 0px; 4 | left: 0px; 5 | padding: 1rem; 6 | } 7 | 8 | .ste-comment-tags span { 9 | padding: .5rem; 10 | font-size: 1rem; 11 | border-radius: 0.5rem; 12 | margin: .25rem; 13 | display: inline-block; 14 | cursor: pointer; 15 | } 16 | 17 | .ste-clear-search { 18 | padding: 0.2rem; 19 | padding-left: 1rem; 20 | padding-right: 1rem; 21 | background: hsla(260, 60%, 60%, 1); 22 | color: white; 23 | border-radius: 0.5rem; 24 | margin-left: 1rem; 25 | font-size: .7rem; 26 | float: right; 27 | position: absolute; 28 | right: 0px; 29 | top: 0.6rem; 30 | cursor: pointer; 31 | } 32 | 33 | .blocklyWorkspace > * > .ste-hide-search { 34 | opacity: .25; 35 | } -------------------------------------------------------------------------------- /features/compact-buttons/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Compact Buttons", 3 | "description": "Buttons text gets removed and will get a new icon if it does not have one already.", 4 | "credits": [ 5 | { 6 | "username": "stio_studio", 7 | "url": "https://scratch.mit.edu/users/stio_studio/" 8 | } 9 | ], 10 | "type": ["Website"], 11 | "tags": ["New", "Featured"], 12 | "dynamic": true, 13 | "styles": [ 14 | { 15 | "file": "editor.css", 16 | "runOn": "/projects/*" 17 | }, 18 | { 19 | "file": "project.css", 20 | "runOn": "/projects/*" 21 | } 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /features/compact-buttons/icons/upload.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/copy-paste-lists/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Copy and Paste Lists", 3 | "description": "Allows you to right-click on lists on the stage to copy and paste large amounts of items.", 4 | "credits": [ 5 | { 6 | "username": "Brass_Glass", 7 | "url": "https://scratch.mit.edu/users/Brass_Glass/" 8 | }, 9 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 10 | ], 11 | "type": ["Editor"], 12 | "tags": ["New", "Featured"], 13 | "dynamic": true, 14 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }] 15 | } 16 | -------------------------------------------------------------------------------- /features/creator-badge/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Author Badge", 3 | "description": "Adds a badge next to comments written by the author of the project.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "dynamic": true, 10 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 11 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }] 12 | } 13 | -------------------------------------------------------------------------------- /features/creator-badge/script.js: -------------------------------------------------------------------------------- 1 | async function addBadges() { 2 | var author = ( 3 | await ( 4 | await fetch( 5 | `https://api.scratch.mit.edu/projects/${ 6 | window.location.pathname.split("/")[2] 7 | }/` 8 | ) 9 | ).json() 10 | ).author.username; 11 | ScratchTools.waitForElements( 12 | ".comment .username", 13 | function (el) { 14 | if (el.innerText === author) { 15 | if (!el.querySelector(".creator-badge")) { 16 | var span = document.createElement("span"); 17 | span.textContent = "Author"; 18 | span.className = "creator-badge"; 19 | el.appendChild(span); 20 | } 21 | } 22 | }, 23 | "creator-comments", 24 | false 25 | ); 26 | } 27 | addBadges(); 28 | 29 | ScratchTools.setDisable("creator-badge", function() { 30 | document.querySelectorAll(".creator-badge").forEach(function(badge) { 31 | badge.remove() 32 | }) 33 | }) -------------------------------------------------------------------------------- /features/creator-badge/style.css: -------------------------------------------------------------------------------- 1 | .creator-badge { 2 | margin-left: .5rem; 3 | font-size: .8rem; 4 | font-weight: 400; 5 | background: #855cd6; 6 | color: white; 7 | padding: 0.2rem; 8 | border-radius: 0.2rem; 9 | opacity: .6; 10 | } -------------------------------------------------------------------------------- /features/custom-fonts.js: -------------------------------------------------------------------------------- 1 | var name = ScratchTools.Storage.font; 2 | var style = document.createElement("style"); 3 | style.className = "scratchtoolsCustomFont"; 4 | style.innerHTML = ` 5 | @import url('https://fonts.googleapis.com/css2?family=${name 6 | .replaceAll(")", "") 7 | .replaceAll("'", "") 8 | .replaceAll("}", "") 9 | .replaceAll(" ", "+")}:wght@200;300;400;500;600;700&display=swap'); 10 | 11 | :not(code) { 12 | font-family: '${name 13 | .replaceAll("\\", "") 14 | .replaceAll("'", "") 15 | .replaceAll("}", "")}', sans-serif; 16 | } 17 | `; 18 | document.body.appendChild(style); 19 | 20 | ScratchTools.setDisable("custom-fonts", function () { 21 | document.querySelectorAll(".scratchtoolsCustomFont").forEach(function (el) { 22 | el.remove(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /features/dark-paint-editor/dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /features/dark-paint-editor/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Switch Paint Background", 3 | "description": "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.", 4 | "credits": [ 5 | { "username": "GarboMuffin", "url": "https://scratch.mit.edu/users/GarboMuffin/" }, 6 | { "username": "Mechanical_coding", "url": "https://scratch.mit.edu/users/Mechanical_coding/" }, 7 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 8 | ], 9 | "type": ["Editor"], 10 | "tags": ["New", "Featured"], 11 | "dynamic": true, 12 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 13 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 14 | "resources": [{ "name": "dark-paint-btn", "path": "/dark.svg" }] 15 | } 16 | -------------------------------------------------------------------------------- /features/dark-paint-editor/style.css: -------------------------------------------------------------------------------- 1 | .ste-dark-paint-btn img { 2 | width: 1.25rem; 3 | height: 1.25rem; 4 | vertical-align: middle; 5 | } -------------------------------------------------------------------------------- /features/default-to-local/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Default to Local", 3 | "description": "When creating a variable, sets the default to For This Sprite Only, rather than For All Sprites.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 8 | "type": ["Editor"], 9 | "tags": ["New", "Featured"], 10 | "dynamic": true 11 | } 12 | -------------------------------------------------------------------------------- /features/default-to-local/script.js: -------------------------------------------------------------------------------- 1 | export default function ({ feature, console }) { 2 | ScratchTools.waitForElements(".ReactModalPortal", function (modal) { 3 | console.log(modal) 4 | if (!feature.self.enabled) return; 5 | console.log("passed enabled") 6 | if (modal.querySelector(".sa-swap-local-global-hint")) return; 7 | console.log("passed no sa") 8 | if (modal.querySelector('[class^="prompt_variable-name-text-input_"]')) { 9 | document.querySelectorAll('[name="variableScopeOption"]')[1].click(); 10 | } 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /features/default-to-trending.js: -------------------------------------------------------------------------------- 1 | var urlParams = new URLSearchParams(window.location.search); 2 | if ( 3 | !urlParams.get("mode") && 4 | window.location.href 5 | .toLowerCase() 6 | .startsWith("https://scratch.mit.edu/search/projects") 7 | ) { 8 | window.location.href = window.location.href + "&mode=trending"; 9 | } 10 | -------------------------------------------------------------------------------- /features/disable-cloud/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Disable Cloud", 3 | "description": "Allows you to disable cloud data on any project. This will still receive cloud data information, but will not send any.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 8 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 9 | "type": ["Editor"], 10 | "tags": ["New", "Featured"], 11 | "dynamic": true 12 | } 13 | -------------------------------------------------------------------------------- /features/disable-cloud/style.css: -------------------------------------------------------------------------------- 1 | .ste-cloud-disable { 2 | height: 14px; 3 | margin-left: .25rem; 4 | cursor: pointer; 5 | padding-top: 1px !important; 6 | position: relative; 7 | top: 1px; 8 | } 9 | 10 | .extension-chip .extension-action { 11 | display: inline-flex !important; 12 | } -------------------------------------------------------------------------------- /features/display-message-count-in-icon.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/features/display-message-count-in-icon.js -------------------------------------------------------------------------------- /features/display-name/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Display Names", 3 | "description": "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.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "scripts": [ 10 | { "file": "profile.js", "runOn": "/users/*" } 11 | ], 12 | "styles": [ 13 | { "file": "profile.css", "runOn": "/users/*" } 14 | ], 15 | "similar": ["isonline", "emoji-status"] 16 | } 17 | -------------------------------------------------------------------------------- /features/display-name/profile.css: -------------------------------------------------------------------------------- 1 | .ste-username { 2 | margin-left: 0.25rem; 3 | opacity: 0.5; 4 | font-weight: normal; 5 | font-size: 1.25rem; 6 | } 7 | 8 | .ste-set-display-name { 9 | margin-left: 1rem; 10 | cursor: pointer; 11 | font-weight: 400; 12 | color: #1aa0d8; 13 | font-size: 1rem; 14 | } -------------------------------------------------------------------------------- /features/download-project/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Download Projects", 3 | "description": "Adds a button to project pages that allows you to download the project as an .sb3 file.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 10 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 11 | "resources": [{ "name": "download-btn", "path": "/download.svg" }] 12 | } 13 | -------------------------------------------------------------------------------- /features/download-project/download.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/download-project/style.css: -------------------------------------------------------------------------------- 1 | .ste-download::before { 2 | background-image: var(--scratchtoolsresource-download-btn); 3 | display: inline-block; 4 | margin-right: .25rem; 5 | background-repeat: no-repeat; 6 | background-position: center center; 7 | background-size: contain; 8 | width: .875rem; 9 | height: .875rem; 10 | vertical-align: bottom; 11 | content: ""; 12 | transform: scale(1.3); 13 | } -------------------------------------------------------------------------------- /features/dumpster-fire/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Dumpster Fire", 3 | "description": "The Scratch homepage is a liar with their \"Featured Projects\" section. This changes the name to the proper form, which is \"Dumpster Fire\".", 4 | "credits": [ 5 | { 6 | "username": "Kuzyn_Official", 7 | "url": "https://scratch.mit.edu/users/Kuzyn_Official/" 8 | }, 9 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 10 | ], 11 | "type": ["Website", "Egg"], 12 | "dynamic": true, 13 | "scripts": [{ "file": "script.js", "runOn": "/" }] 14 | } 15 | -------------------------------------------------------------------------------- /features/dumpster-fire/script.js: -------------------------------------------------------------------------------- 1 | export default async function ({ feature }) { 2 | let box = await ScratchTools.waitForElement(".inner.mod-splash > .box"); 3 | 4 | if (box.className.includes("scratchtoolsCustomStudio")) { 5 | box = box.nextSibling; 6 | } 7 | 8 | let oldContent = box.querySelector("h4").textContent; 9 | if (feature.self.enabled) { 10 | box.querySelector("h4").textContent = "Dumpster Fire"; 11 | } 12 | 13 | feature.addEventListener("disabled", function () { 14 | box.querySelector("h4").textContent = oldContent; 15 | }); 16 | 17 | feature.addEventListener("enabled", function () { 18 | box.querySelector("h4").textContent = "Dumpster Fire"; 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /features/echo-effect/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Echo Effect", 3 | "description": "Adds the echo effect back to the Scratch sound editor.", 4 | "credits": [ 5 | { 6 | "username": "Numberblock891011", 7 | "url": "https://scratch.mit.edu/users/Numberblock891011/" 8 | }, 9 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 10 | ], 11 | "type": ["Editor"], 12 | "tags": ["New", "Featured"], 13 | "dynamic": true, 14 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 15 | "resources": [{ "name": "echo-effect-btn", "path": "/echo.svg" }] 16 | } 17 | -------------------------------------------------------------------------------- /features/emoji-status/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Emoji Statuses", 3 | "description": "Set the status on your profile to an emoji. Other ScratchTools users will be able to see this status.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "styles": [{ "file": "style.css", "runOn": "/users/*" }], 10 | "scripts": [{ "file": "script.js", "runOn": "/users/*" }], 11 | "similar": ["isonline", "display-name"] 12 | } 13 | -------------------------------------------------------------------------------- /features/emoji-status/script.js: -------------------------------------------------------------------------------- 1 | async function getStatus() { 2 | if (document.querySelector(".ste-status")) { 3 | document.querySelector(".ste-status").remove(); 4 | } 5 | var data = await ( 6 | await fetch( 7 | `https://data.scratchtools.app/status/${ 8 | window.location.pathname.split("/")[2] 9 | }/` 10 | ) 11 | ).json(); 12 | var span = document.createElement("span"); 13 | span.className = "ste-status"; 14 | span.textContent = data.status || "🙂"; 15 | if ( 16 | Scratch.INIT_DATA.PROFILE.model.username === ScratchTools.Auth.user.username 17 | ) { 18 | span.addEventListener("click", async function () { 19 | window.location.href = "https://auth.itinerary.eu.org/auth/?redirect="+ btoa("https://scratch.mit.edu/ste/dashboard/verify/?system=dashboard")+"&name=ScratchTools" 20 | }); 21 | } 22 | document.querySelector(".profile-details").prepend(span); 23 | } 24 | getStatus(); 25 | -------------------------------------------------------------------------------- /features/emoji-status/style.css: -------------------------------------------------------------------------------- 1 | .ste-status { 2 | border-right: 1px solid #ccc; 3 | margin-right: 5px; 4 | padding-right: 5px; 5 | cursor: pointer; 6 | transition: opacity .3s; 7 | opacity: 1; 8 | } 9 | 10 | .ste-status:hover { 11 | opacity: .5; 12 | } -------------------------------------------------------------------------------- /features/exact-join-date.js: -------------------------------------------------------------------------------- 1 | async function getExactJoinDate(el) { 2 | if (!el.className.includes("scratchtoolsUpdateTime")) { 3 | el.classList.add("scratchtoolsUpdateTime"); 4 | var response = await fetch( 5 | "https://api.scratch.mit.edu/users/" + 6 | Scratch.INIT_DATA.PROFILE.model.username + 7 | "/" 8 | ); 9 | var data = await response.json(); 10 | el.childNodes[3].textContent = new Date( 11 | data.history.joined 12 | ).toLocaleString(); 13 | el.childNodes[4].textContent = ""; 14 | } 15 | } 16 | 17 | ScratchTools.waitForElements( 18 | ".profile-details", 19 | getExactJoinDate, 20 | "get-exact-join-date", 21 | false 22 | ); 23 | -------------------------------------------------------------------------------- /features/explore-filter/resources/calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /features/explore-filter/resources/filter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /features/explore-filter/resources/title.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /features/explore-filter/resources/user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /features/favicon-messages/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Tab Message Count", 3 | "description": "Displays your message count in the tab favicon, the Scratch icon at the top of your tab.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "scripts": [{ "file": "script.js", "runOn": "/*" }], 8 | "type": ["Website"], 9 | "tags": ["New", "Featured"], 10 | "dynamic": true 11 | } 12 | -------------------------------------------------------------------------------- /features/fixed-box.js: -------------------------------------------------------------------------------- 1 | var style = document.createElement("style"); 2 | style.innerHTML = ` 3 | .box, .box-content { 4 | border-radius: 10px; 5 | } 6 | `; 7 | document.body.appendChild(style); 8 | -------------------------------------------------------------------------------- /features/follow-on-projects/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Follow on Project Page", 3 | "description": "Follow users directly from the project page instead of going to their profile.", 4 | "credits": [ 5 | { "username": "green_thing_game2", "url": "https://scratch.mit.edu/users/green_thing_game2/" }, 6 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 7 | ], 8 | "type": ["Website"], 9 | "tags": [], 10 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 11 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 12 | "resources": [{ "name": "project-follow-icon", "path": "/follow.svg" }] 13 | } 14 | -------------------------------------------------------------------------------- /features/follow-on-projects/style.css: -------------------------------------------------------------------------------- 1 | .ste-follow-btn { 2 | margin-top: 0; 3 | border-radius: 0.25rem; 4 | padding-top: 0.6875rem; 5 | padding-right: 0.9375rem; 6 | padding-bottom: 0.6875rem; 7 | padding-left: 0.875rem; 8 | height: 2.5rem; 9 | font-size: .875rem; 10 | } 11 | 12 | .ste-follow-btn::before { 13 | background-image: var(--scratchtoolsresource-project-follow-icon); 14 | display: inline-block; 15 | margin-top: -2px; 16 | margin-right: 0.4375rem; 17 | background-repeat: no-repeat; 18 | background-position: center center; 19 | background-size: contain; 20 | width: 1.125rem; 21 | height: 1.125rem; 22 | vertical-align: middle; 23 | content: ""; 24 | } 25 | 26 | .ste-follow-btn.following { 27 | background-color: rgb(171, 171, 171); 28 | } -------------------------------------------------------------------------------- /features/forum-scratch-team.js: -------------------------------------------------------------------------------- 1 | document.querySelectorAll("a").forEach(async function (item) { 2 | if (item.className === "black username") { 3 | const response = await fetch( 4 | `https://api.${item.href.replace("https://", "")}` 5 | ); 6 | 7 | // Storing data in form of JSON 8 | var data = await response.json(); 9 | console.log(data); 10 | if (data.hasOwnProperty("scratchteam")) { 11 | if (data["scratchteam"] === true) { 12 | item.textContent = `${item.textContent}*`; 13 | } 14 | } 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /features/frontpage-curator.js: -------------------------------------------------------------------------------- 1 | if (window.location.href == "https://scratch.mit.edu/") { 2 | text = 3 | document.getElementsByClassName("inner mod-splash")[1].firstChild.firstChild 4 | .firstChild; 5 | Name = text.innerText.split(" ")[3]; 6 | text.innerHTML = `Projects Curated by ${Name}`; 7 | } 8 | -------------------------------------------------------------------------------- /features/full-title.js: -------------------------------------------------------------------------------- 1 | ScratchTools.waitForElements( 2 | "li.project > span.title > a", 3 | function (el) { 4 | el.title = el.textContent; 5 | }, 6 | "full project title", 7 | false 8 | ); 9 | -------------------------------------------------------------------------------- /features/fullscreen-explorer/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Fullscreen Project Grids", 3 | "description": "Find projects on the big screen by removing the left and right blanks on the Trends, Search, Remix pages.", 4 | "credits": [ 5 | { "username": "Masaabu-YT", "url": "https://scratch.mit.edu/users/Masaabu-YT/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "dynamic": true, 10 | "styles": [ 11 | { "file": "style.css", "runOn": "/explore/*" }, 12 | { "file": "style.css", "runOn": "/search/*" }, 13 | { "file": "style2.css", "runOn": "/projects/*" } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /features/fullscreen-explorer/style.css: -------------------------------------------------------------------------------- 1 | .grid .flex-row { 2 | width: 100%; 3 | justify-content: center; 4 | } -------------------------------------------------------------------------------- /features/fullscreen-explorer/style2.css: -------------------------------------------------------------------------------- 1 | .container { 2 | display: inline-block; 3 | margin: 0; 4 | } 5 | 6 | #content { 7 | width: 100%; 8 | } 9 | 10 | #topnav .container { 11 | margin: auto; 12 | } -------------------------------------------------------------------------------- /features/go-to-parent/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Go to Parent Button", 3 | "description": "In the editor for any project that is a remix, you can click a button to go to the editor in the parent project.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Editor"], 8 | "tags": [], 9 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }] 10 | } -------------------------------------------------------------------------------- /features/hide-advertisements/style.css: -------------------------------------------------------------------------------- 1 | body.colorComment .scratchtoolsAd .comment-bubble, body.colorComment .scratchtoolsAd .comment-bubble::before { 2 | background-color: #eccedf !important; 3 | border: 1px solid #ff6680; 4 | } 5 | 6 | body.colorComment .scratchtoolsAd .comment-bubble:before { 7 | border: 1px solid #ff6680; 8 | border-right: transparent; 9 | background-color: #eccedf !important; 10 | } 11 | 12 | body.hideComment:not(.dontHideStudioComments) .scratchtoolsAd { 13 | display: none; 14 | } 15 | -------------------------------------------------------------------------------- /features/hide-advertisements/two.css: -------------------------------------------------------------------------------- 1 | body.colorComment .scratchtoolsAd > div[id^="comments-"] { 2 | background-color: #eccedf !important; 3 | border: 1px solid #ff6680; 4 | } 5 | 6 | body.colorComment .scratchtoolsAd .comment-bubble:before { 7 | border: 1px solid #ff6680; 8 | border-right: transparent; 9 | background-color: #eccedf !important; 10 | } 11 | 12 | body.hideComment .scratchtoolsAd { 13 | display: none; 14 | } 15 | -------------------------------------------------------------------------------- /features/hide-block-category-names/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Hide Block Category Names", 3 | "description": "Changes the block categories in the editor to only show the colors of the categories.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 8 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 9 | "tags": ["Theme", "New"], 10 | "type": ["Editor"], 11 | "dynamic": true, 12 | "options": [{ "id": "displayAsCircle", "name": "Display as Circle", "default": false, "type": 1 }], 13 | "similar": ["simplify-editor-tabs", "plain-background"] 14 | } 15 | -------------------------------------------------------------------------------- /features/hide-block-category-names/script.js: -------------------------------------------------------------------------------- 1 | var hideBlockCategoryNames = new Feature({ id: "hide-block-category-names" }) 2 | 3 | ScratchTools.setDisable("hide-block-category-names", function() {}) 4 | 5 | if (ScratchTools.Storage.displayAsCircle) { 6 | document.body.classList.add("st-category-circle") 7 | } else { 8 | document.body.classList.remove("st-category-circle") 9 | } 10 | 11 | hideBlockCategoryNames.settings.addEventListener("changed", function({key: name, value}) { 12 | console.log(name) 13 | console.log(value) 14 | if (name === "displayAsCircle") { 15 | if (value) { 16 | document.body.classList.add("st-category-circle") 17 | } else { 18 | document.body.classList.remove("st-category-circle") 19 | } 20 | } 21 | }) -------------------------------------------------------------------------------- /features/hide-block-category-names/style.css: -------------------------------------------------------------------------------- 1 | .scratchCategoryItemBubble { 2 | border-radius: 0.2rem !important; 3 | width: 2rem !important; 4 | } 5 | 6 | .st-category-circle .scratchCategoryItemBubble { 7 | height: 1.5rem !important; 8 | width: 1.5rem !important; 9 | border-radius: 0.75rem !important; 10 | } 11 | 12 | .scratchCategoryMenuItemLabel { 13 | display: none !important; 14 | } 15 | -------------------------------------------------------------------------------- /features/hide-disabled-menu-options.js: -------------------------------------------------------------------------------- 1 | var style = document.createElement("style"); 2 | style.textContent = ` 3 | .blocklyContextMenu > [aria-disabled='true'] { 4 | display: none !important; 5 | } 6 | `; 7 | style.className = "scratchtoolsHideDisabledOptions"; 8 | if (!document.querySelector(".scratchtoolsHideDisabledOptions")) { 9 | document.body.appendChild(style); 10 | } 11 | 12 | ScratchTools.setDisable("hide-disabled-menu-options", function () { 13 | if (document.querySelector(".scratchtoolsHideDisabledOptions")) { 14 | document.querySelector(".scratchtoolsHideDisabledOptions").remove(); 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /features/hide-footer/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Hide Footer", 3 | "description": "The footer takes up a lot of unnecessary space. So hide it!", 4 | "credits": [ 5 | { "username": "stio_studio", "url": "https://scratch.mit.edu/users/stio_studio/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "styles": [ 10 | { 11 | "file": "style.css", 12 | "runOn": "/*" 13 | } 14 | ], 15 | "dynamic": true 16 | } 17 | 18 | -------------------------------------------------------------------------------- /features/hide-footer/style.css: -------------------------------------------------------------------------------- 1 | #footer, #donor { 2 | display: none; 3 | } 4 | #content { 5 | padding-bottom: 0px; 6 | } -------------------------------------------------------------------------------- /features/hide-project-tags/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Hide Project Tags", 3 | "description": "Hides all linked tags in the Instructions/Notes and Credits of projects.", 4 | "credits": [ 5 | { 6 | "username": "MaterArc", 7 | "url": "https://scratch.mit.edu/users/MaterArc/" 8 | }, 9 | { 10 | "username": "rgantzos", 11 | "url": "https://scratch.mit.edu/users/rgantzos/" 12 | } 13 | ], 14 | "type": [ 15 | "Website" 16 | ], 17 | "tags": [ 18 | "New", 19 | "Featured" 20 | ], 21 | "scripts": [ 22 | { 23 | "file": "script.js", 24 | "runOn": "/projects/*" 25 | } 26 | ], 27 | "dynamic": true, 28 | "options": [{ "id": "remove-dupes", "name": "Hide Duplicate Tags", "type": 1 }] 29 | } -------------------------------------------------------------------------------- /features/hide-scratch-news/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Hide Scratch News", 3 | "description": "Hides the Scratch News section on the homepage of the Scratch website.", 4 | "credits": [ 5 | { "username": "JefferyTheSuperKat", "url": "https://scratch.mit.edu/users/JefferyTheSuperKat/" }, 6 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 7 | ], 8 | "type": ["Website"], 9 | "tags": ["New"], 10 | "styles": [{ "file": "style.css", "runOn": "/" }], 11 | "dynamic": true, 12 | "components": [{ 13 | "type": "warning", 14 | "content": "This feature will override the \"Replace Scratch News with Recent Projects\" feature." 15 | }] 16 | } 17 | -------------------------------------------------------------------------------- /features/hide-scratch-news/style.css: -------------------------------------------------------------------------------- 1 | .box.news { 2 | display: none !important; 3 | } 4 | 5 | .box.activity { 6 | width: 100% !important; 7 | } -------------------------------------------------------------------------------- /features/hide-signatures.js: -------------------------------------------------------------------------------- 1 | document.querySelectorAll(".postsignature").forEach((el) => el.remove()); 2 | -------------------------------------------------------------------------------- /features/hide-studio-borders.js: -------------------------------------------------------------------------------- 1 | var style = document.createElement("style"); 2 | style.textContent = ` 3 | li.gallery > a.image > span.image { 4 | border: 0px !important; 5 | } 6 | `; 7 | style.className = "scratchtoolsRemoveBorder"; 8 | document.body.appendChild(style); 9 | ScratchTools.setDisable("hide-studio-borders", function () { 10 | document.querySelector(".scratchtoolsRemoveBorder").remove(); 11 | }); 12 | -------------------------------------------------------------------------------- /features/hide-studio-group-icon.js: -------------------------------------------------------------------------------- 1 | var style = document.createElement("style"); 2 | style.innerHTML = ` 3 | .icon-sm.studio.white { 4 | display: none; 5 | } 6 | `; 7 | document.body.appendChild(style); 8 | -------------------------------------------------------------------------------- /features/hide-textarea-labels.js: -------------------------------------------------------------------------------- 1 | var style = document.createElement("style"); 2 | style.className = ".hideTextareaLabels"; 3 | style.textContent = ` 4 | .project-textlabel { 5 | display: none !important; 6 | }`; 7 | document.body.appendChild(style); 8 | 9 | ScratchTools.setDisable("hide-textarea-labels", function () { 10 | document.querySelector(".hideTextareaLabels").remove(); 11 | }); 12 | -------------------------------------------------------------------------------- /features/highlight-unanswered.js: -------------------------------------------------------------------------------- 1 | if ( 2 | window.location.href 3 | .toLowerCase() 4 | .startsWith("https://scratch.mit.edu/discuss/") && 5 | window.location.href.toLowerCase() !== "https://scratch.mit.edu/discuss/" && 6 | window.location.href.toLowerCase() !== "https://scratch.mit.edu/discuss" 7 | ) { 8 | document.querySelectorAll("tbody > tr").forEach(function (el) { 9 | if (el.querySelector("td.tc2").textContent === "0") { 10 | el.style.backgroundColor = "#dce8f7"; 11 | } 12 | }); 13 | } 14 | 15 | ScratchTools.setDisable("highlight-unanswered", function () { 16 | document.querySelectorAll("tbody > tr").forEach(function (el) { 17 | el.style.backgroundColor = null; 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /features/important-messages/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Important Messages", 3 | "description": "Separate important messages on the messages page.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "scripts": [{ "file": "script.js", "runOn": "/messages*" }], 10 | "styles": [{ "file": "style.css", "runOn": "/messages*" }], 11 | "similar": ["block-messages", "hide-advertisements"] 12 | } 13 | -------------------------------------------------------------------------------- /features/important-messages/style.css: -------------------------------------------------------------------------------- 1 | .ste-important > div > div { 2 | padding: 1rem; 3 | border-bottom: 1px solid #d9d9d9; 4 | } 5 | 6 | .ste-important > div { 7 | border: 1px solid #d9d9d9; 8 | border-radius: 5px; 9 | background-color: rgb(255, 241, 241); 10 | margin-top: 1rem; 11 | } 12 | 13 | .ste-important { 14 | margin-bottom: 2rem; 15 | } 16 | 17 | .ste-important-content { 18 | background-color: white; 19 | padding: 1rem; 20 | line-height: 1.3rem; 21 | width: fit-content; 22 | max-width: 100%; 23 | margin-top: 1rem; 24 | border-radius: 5px; 25 | border: 1px solid #d9d9d9; 26 | } 27 | 28 | .ste-important h4 span { 29 | font-style: italic; 30 | opacity: .5; 31 | margin-left: .5rem; 32 | font-weight: 400; 33 | } -------------------------------------------------------------------------------- /features/isonline/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Show if User is Online", 3 | "description": "On profile pages, displays if a user is online. This will also let other users see if you are online.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "dynamic": true, 10 | "styles": [{ "file": "style.css", "runOn": "/users/*" }], 11 | "scripts": [{ "file": "script.js", "runOn": "/users/*", "module": true }], 12 | "additionalAgreements": "By enabling this feature, you understand that other users will be able to see if you are online or not.", 13 | "similar": ["display-name", "emoji-status"] 14 | } 15 | -------------------------------------------------------------------------------- /features/isonline/style.css: -------------------------------------------------------------------------------- 1 | .ste-isonline { 2 | border-left: 1px solid #ccc; 3 | margin-left: 5px; 4 | padding-left: 5px; 5 | } 6 | 7 | .ste-isonline.unsure { 8 | font-style: italic; 9 | color: #be650d; 10 | opacity: .4; 11 | } 12 | 13 | .ste-isonline.ste-detect-online { 14 | color: #0dbea1; 15 | } 16 | 17 | .ste-isonline.ste-detect-offline { 18 | color: #be0d51; 19 | } -------------------------------------------------------------------------------- /features/link-forum-activity.js: -------------------------------------------------------------------------------- 1 | if (window.location.href.startsWith("https://scratch.mit.edu/discuss")) { 2 | document.querySelectorAll("span.byuser").forEach(function (el) { 3 | var user = el.textContent.replace("by ", ""); 4 | el.textContent = "by "; 5 | var a = document.createElement("a"); 6 | a.textContent = user; 7 | a.href = `https://scratch.mit.edu/users/${user}/`; 8 | el.appendChild(a); 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /features/link-to-propose.js: -------------------------------------------------------------------------------- 1 | function setProposeLink() { 2 | document.querySelectorAll("div.box-header").forEach(function (el) { 3 | if (el.textContent === "Featured Projects") { 4 | el.parentNode.querySelector("a").href = 5 | "https://scratch.mit.edu/studios/28715018"; 6 | el.parentNode.querySelector("a").textContent = "Visit the studio"; 7 | } 8 | }); 9 | } 10 | ScratchTools.waitForElements( 11 | "div.box-header", 12 | setProposeLink, 13 | "set propose link", 14 | false 15 | ); 16 | -------------------------------------------------------------------------------- /features/live-character-counts/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Live Character Counts", 3 | "description": "On forum, studio, and project pages, displays the live character count for textboxes.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "styles": [ 10 | { "file": "style.css", "runOn": "/projects/*" }, 11 | { "file": "style.css", "runOn": "/discuss/settings/*" }, 12 | { "file": "style.css", "runOn": "/studios/*" } 13 | ], 14 | "scripts": [ 15 | { "file": "projects.js", "runOn": "/projects/*" }, 16 | { "file": "forums.js", "runOn": "/discuss/settings/*" }, 17 | { "file": "studios.js", "runOn": "/studios/*" } 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /features/live-character-counts/forums.js: -------------------------------------------------------------------------------- 1 | if (!document.querySelector(".ste-forum-char")) { 2 | var textarea = document.querySelector("div#markItUpId_signature textarea"); 3 | 4 | var span = document.createElement("span"); 5 | span.classList.add("ste-forum-char"); 6 | span.textContent = `${( 7 | 2000 - textarea.value.length 8 | ).toString()} characters left.`; 9 | if (2000 - textarea.value.length <= 250) { 10 | span.classList.add("ste-lcc-low"); 11 | } 12 | 13 | textarea.addEventListener("input", function () { 14 | span.textContent = `${( 15 | 2000 - textarea.value.length 16 | ).toString()} characters left.`; 17 | if (2000 - textarea.value.length <= 250) { 18 | span.classList.add("ste-lcc-low"); 19 | } else { 20 | span.classList.remove("ste-lcc-low"); 21 | } 22 | }); 23 | 24 | ScratchTools.appendToSharedSpace({ 25 | space: "forumToolbarTools", 26 | element: span, 27 | order: 0, 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /features/live-character-counts/style.css: -------------------------------------------------------------------------------- 1 | .ste-live-character-count { 2 | font-weight: normal; 3 | font-size: 0.8rem; 4 | opacity: 0.5; 5 | margin-left: 0.5rem; 6 | } 7 | 8 | .ste-lcc-low { 9 | color: red; 10 | } 11 | 12 | .ste-forum-char { 13 | opacity: 0.5; 14 | float: right; 15 | font-size: 0.8rem; 16 | } 17 | 18 | .ste-studio-charcount { 19 | font-weight: normal; 20 | font-size: 0.8rem; 21 | opacity: 0.5; 22 | float: right; 23 | } 24 | 25 | .ste-project-title-count, .ste-stu-title-count { 26 | font-size: 0.8rem; 27 | opacity: 0.5; 28 | position: relative; 29 | top: 0.25rem; 30 | float: right; 31 | font-weight: normal; 32 | } 33 | -------------------------------------------------------------------------------- /features/live-stats/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Live Stats", 3 | "description": "Updates the loves, favorites, remixes, and views on a project live, without having to reload to view the new counts.", 4 | "credits": [ 5 | { 6 | "username": "RowanMoonBoy", 7 | "url": "https://scratch.mit.edu/users/RowanMoonBoy/" 8 | }, 9 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 10 | ], 11 | "scripts": [ 12 | { 13 | "file": "script.js", 14 | "runOn": "/projects/*" 15 | } 16 | ], 17 | "dynamic": true, 18 | "type": ["Website"], 19 | "tags": ["New", "Featured"] 20 | } 21 | -------------------------------------------------------------------------------- /features/localized-explore/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Projects from Country", 3 | "description": "On the explore page, makes projects from other countries less visible. This is to only show projects in languages that you understand.", 4 | "credits": [ 5 | { "username": "KitsunLilly", "url": "https://scratch.mit.edu/users/KitsunLilly/" }, 6 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 7 | ], 8 | "type": ["Website"], 9 | "tags": ["New", "Featured"], 10 | "dynamic": true, 11 | "scripts": [ 12 | { "file": "script.js", "runOn": "/explore/projects/*" }, 13 | { "file": "script.js", "runOn": "/search/projects*" } 14 | ], 15 | "styles": [ 16 | { "file": "style.css", "runOn": "/explore/projects/*" }, 17 | { "file": "style.css", "runOn": "/search/projects*" } 18 | ], 19 | "options": [{ "id": "hide-completely", "name": "Hide Projects", "type": 1 }] 20 | } 21 | -------------------------------------------------------------------------------- /features/localized-explore/style.css: -------------------------------------------------------------------------------- 1 | .ste-outside-country { 2 | opacity: .5; 3 | } 4 | 5 | .ste-country-hide { 6 | display: none; 7 | ] -------------------------------------------------------------------------------- /features/love-fave-animate/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Love Animations", 3 | "description": "Animates the clicking of the love and favorite buttons on project pages.", 4 | "credits": [ 5 | { "username": "NcTV-", "url": "https://scratch.mit.edu/users/NcTV-/" }, 6 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 7 | ], 8 | "type": ["Website", "Egg"], 9 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }] 10 | } 11 | -------------------------------------------------------------------------------- /features/love-fave-animate/style.css: -------------------------------------------------------------------------------- 1 | .project-favorites.favorited:before { 2 | animation-duration: 0.5s; 3 | animation-name: popButton; 4 | } 5 | 6 | .project-loves.loved:before { 7 | animation-duration: 0.5s; 8 | animation-name: popButton; 9 | } 10 | 11 | @keyframes popButton { 12 | from { 13 | transform: scale(100%) rotate(0deg); 14 | } 15 | 16 | 50% { 17 | transform: scale(150%) rotate(200deg); 18 | } 19 | 20 | to { 21 | transform: scale(100%) rotate(360deg); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /features/message-count/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Message Count", 3 | "description": "Displays the user's message count on their profile next to the country.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "dynamic": true, 10 | "scripts": [{ "file": "script.js", "runOn": "/users/*", "module": true }] 11 | } 12 | -------------------------------------------------------------------------------- /features/minimized-remix-credits.js: -------------------------------------------------------------------------------- 1 | ScratchTools.waitForElements( 2 | ".flex-row.remix-credit", 3 | function (el) { 4 | el.querySelector("img").remove(); 5 | var title = el.querySelector("[href^='/projects/']").textContent; 6 | var link = el.querySelector("[href^='/projects/']").href; 7 | var a = document.createElement("a"); 8 | a.textContent = title; 9 | a.href = link; 10 | el.textContent = "Original project: "; 11 | a.style.marginLeft = ".25rem"; 12 | el.appendChild(a); 13 | }, 14 | "minimizedRemixCredits", 15 | false 16 | ); 17 | -------------------------------------------------------------------------------- /features/more-block-themes/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /features/more-block-themes/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "More Block Themes", 3 | "description": "Adds additional themes for blocks in the code editor.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Editor"], 8 | "tags": ["New", "Featured"], 9 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 10 | "styles": [ 11 | { "file": "main.css", "runOn": "/projects/*" } 12 | ], 13 | "resources": [ 14 | { "name": "check", "path": "/check.svg" }, 15 | { "name": "circle", "path": "/circle.svg" }, 16 | { "name": "colors", "path": "/colors.css" }, 17 | { "name": "dark", "path": "/themes/dark.css" }, 18 | { "name": "transparent", "path": "/themes/transparent.css" }, 19 | { "name": "ultradark", "path": "/themes/ultradark.css" } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /features/more-block-themes/main.css: -------------------------------------------------------------------------------- 1 | li.ste-custom svg { 2 | height: 100%; 3 | width: 100%; 4 | } 5 | 6 | li.ste-custom span[class^='settings-menu_icon_'] { 7 | height: 1.5rem; 8 | width: 1.5rem; 9 | } -------------------------------------------------------------------------------- /features/more-block-themes/themes/dark.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --motion-fill: #0f1e33; 3 | --motion-stroke: #4c97ff; 4 | 5 | --looks-fill: #1e1433; 6 | --looks-stroke: #9966ff; 7 | 8 | --sound-fill: #291329; 9 | --sound-stroke: #cf63cf; 10 | 11 | --event-fill: #332600; 12 | --event-stroke: #ffbf00; 13 | 14 | --control-fill: #332205; 15 | --control-stroke: #ffab19; 16 | 17 | --sensing-fill: #12232a; 18 | --sensing-stroke: #5cb1d6; 19 | 20 | --operators-fill: #112611; 21 | --operators-stroke: #59c059; 22 | 23 | --data-fill: #331c05; 24 | --data-stroke: #ff8c1a; 25 | --data-lists-fill: #331405; 26 | --data-lists-stroke: #ff661a; 27 | 28 | --custom-fill: #331419; 29 | --custom-stroke: #ff6680; 30 | 31 | --other-fill: #03251c; 32 | --other-stroke: #0fbd8c; 33 | 34 | --text-light: #e5e5e5; 35 | --text-normal: rgba(255, 255, 255, 0.7); 36 | 37 | --arg-border: #4c4c4c; 38 | } -------------------------------------------------------------------------------- /features/more-block-themes/themes/ultradark.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --motion-fill: #060f1c; 3 | --motion-stroke: #4c97ff; 4 | 5 | --looks-fill: #0f081d; 6 | --looks-stroke: #9966ff; 7 | 8 | --sound-fill: #170717; 9 | --sound-stroke: #cf63cf; 10 | 11 | --event-fill: #161100; 12 | --event-stroke: #ffbf00; 13 | 14 | --control-fill: #181001; 15 | --control-stroke: #ffab19; 16 | 17 | --sensing-fill: #051116; 18 | --sensing-stroke: #5cb1d6; 19 | 20 | --operators-fill: #040b04; 21 | --operators-stroke: #59c059; 22 | 23 | --data-fill: #211102; 24 | --data-stroke: #ff8c1a; 25 | --data-lists-fill: #1f0b01; 26 | --data-lists-stroke: #ff661a; 27 | 28 | --custom-fill: #1f0a0d; 29 | --custom-stroke: #ff6680; 30 | 31 | --other-fill: #01100c; 32 | --other-stroke: #0fbd8c; 33 | 34 | --text-light: #e5e5e5; 35 | --text-normal: rgba(255, 255, 255, 0.7); 36 | 37 | --arg-border: #4c4c4c; 38 | } 39 | -------------------------------------------------------------------------------- /features/more-editor-fonts/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "More Paint Editor Fonts", 3 | "description": "Allows you to use dozens of extra fonts in the paint editor.", 4 | "credits": [ 5 | { 6 | "username": "Sanjang_Beta", 7 | "url": "https://scratch.mit.edu/users/Sanjang_Beta/" 8 | }, 9 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 10 | ], 11 | "type": ["Editor"], 12 | "tags": ["New", "Featured"], 13 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 14 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 15 | "resources": [{ "name": "more-text-icon", "path": "/text.svg" }], 16 | "support": { 17 | "yt": "https://youtu.be/zh3zsjBcz_M" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /features/more-editor-fonts/style.css: -------------------------------------------------------------------------------- 1 | [data-for*="Add Font"]:hover + .__react_component_tooltip { 2 | visibility: visible; 3 | } 4 | 5 | .ste-more-fonts-btn + .__react_component_tooltip { 6 | left: auto; 7 | } 8 | 9 | span.ste-font-option:nth-child(even) { 10 | background-color: #e9e9e9; 11 | } 12 | 13 | span.ste-font-option { 14 | display: block; 15 | padding-left: .5rem; 16 | border-radius: .5rem; 17 | cursor: pointer; 18 | height: 3rem; 19 | margin-bottom: .25rem; 20 | margin-top: .25rem; 21 | } 22 | 23 | span.ste-font-option:hover { 24 | background-color: #ff9f00; 25 | } 26 | 27 | span.ste-font-option:hover img { 28 | filter: invert(1); 29 | } 30 | 31 | span.ste-font-option img { 32 | height: 3rem; 33 | } 34 | 35 | .ste-font-options { 36 | height: 11rem; 37 | overflow: auto; 38 | } -------------------------------------------------------------------------------- /features/more-key-inputs/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "More Key Inputs", 3 | "description": "Adds support for more keys on \"key pressed\" blocks.", 4 | "credits": [ 5 | { 6 | "username": "o0blackbat0o", 7 | "url": "https://scratch.mit.edu/users/o0blackbat0o/" 8 | }, 9 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 10 | ], 11 | "type": ["Editor"], 12 | "tags": ["New", "Featured"], 13 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }] 14 | } 15 | -------------------------------------------------------------------------------- /features/more-news/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "More Scratch News", 3 | "description": "On the main page, scroll through the Scratch News section and load more results.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "dynamic": true, 10 | "scripts": [{ "file": "script.js", "runOn": "/" }], 11 | "styles": [{ "file": "style.css", "runOn": "/" }] 12 | } 13 | -------------------------------------------------------------------------------- /features/more-news/style.css: -------------------------------------------------------------------------------- 1 | .splash-header > .news ul { 2 | height: 23rem; 3 | overflow-y: scroll; 4 | } 5 | 6 | button.button.ste-load-more-news { 7 | width: 100%; 8 | padding: .4rem; 9 | } -------------------------------------------------------------------------------- /features/more-paint-functions/icons/exclude.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /features/more-paint-functions/icons/intersect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /features/more-paint-functions/icons/subtract.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /features/more-paint-functions/icons/unite.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /features/more-paint-functions/style.css: -------------------------------------------------------------------------------- 1 | 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) { 2 | display: none; 3 | } 4 | 5 | div[class*='mode-tools_mode-tools_'] > div[class*='mode-tools_mod-labeled-icon-height_']:nth-child(3) { 6 | margin-left: 0px !important; 7 | } -------------------------------------------------------------------------------- /features/more-studios/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "More Studios", 3 | "description": "Allows you to add projects to more studios instead of just 20.", 4 | "credits": [ 5 | { "username": "Oldcoinmania", "url": "https://scratch.mit.edu/users/Oldcoinmania/" }, 6 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 7 | ], 8 | "type": ["Website"], 9 | "tags": ["New", "Featured"], 10 | "dynamic": true, 11 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 12 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }] 13 | } 14 | -------------------------------------------------------------------------------- /features/more-studios/style.css: -------------------------------------------------------------------------------- 1 | .ste-load-more-studios { 2 | width: calc(100% - 1.46875rem); 3 | margin-left: 1.46875rem; 4 | position: relative; 5 | top: -1rem; 6 | } 7 | -------------------------------------------------------------------------------- /features/more-tutorials/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "More Tutorials", 3 | "description": "On the Ideas page, you can view additional tutorials from other Scratchers.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "scripts": [ 10 | { "file": "script.js", "runOn": "/ideas*" } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /features/move-share-button/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Move Share Button", 3 | "description": "On project pages, moves the share button next to the See Inside button.", 4 | "credits": [ 5 | { "username": "stio_studio", "url": "https://scratch.mit.edu/users/stio_studio/" }, 6 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 7 | ], 8 | "type": ["Website"], 9 | "tags": ["New", "Featured"], 10 | "dynamic": true, 11 | "scripts": [{ "file": "script.js", "runOn": "/projects/*", "module": true }] 12 | } 13 | -------------------------------------------------------------------------------- /features/move-share-button/script.js: -------------------------------------------------------------------------------- 1 | export default async function({ feature, console }) { 2 | let container = await ScratchTools.waitForElement(".preview > .banner-outer") 3 | let share = container.querySelector("button.button.banner-button") 4 | let buttons = await ScratchTools.waitForElement(".inner > .flex-row.preview-row.force-row > .project-buttons") 5 | buttons.prepend(share) 6 | container.style.display = "none" 7 | 8 | feature.addEventListener("disabled", function() { 9 | container.style.display = null 10 | container.firstChild.appendChild(share) 11 | }) 12 | 13 | feature.addEventListener("enabled", function() { 14 | container.style.display = "none" 15 | buttons.prepend(share) 16 | }) 17 | } -------------------------------------------------------------------------------- /features/nfe-search.js: -------------------------------------------------------------------------------- 1 | if (window.location.href.includes("https://scratch.mit.edu/search/")) { 2 | if (window.location.href.includes("%23")) { 3 | } else { 4 | var btn = document.createElement("button"); 5 | btn.className = "button showAll"; 6 | btn.textContent = "Show All"; 7 | btn.onclick = function () { 8 | str = window.location.href; 9 | var apple = str.split("https://scratch.mit.edu/search/projects?q=")[1]; 10 | window.location.href = `https://scratch.mit.edu/search/projects?q=%23${apple.replaceAll( 11 | "%20", 12 | "%20%23" 13 | )}`; 14 | }; 15 | document 16 | .querySelector("#view > div > div > div.sort-controls") 17 | .appendChild(btn); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /features/ocular-link.js: -------------------------------------------------------------------------------- 1 | if (window.location.href.startsWith("https://scratch.mit.edu/discuss/")) { 2 | document.querySelectorAll(".blockpost").forEach(function (post) { 3 | if (!post.querySelector(".scratchtools-open-in-ocular")) { 4 | var a = document.createElement("a"); 5 | a.textContent = "Open in Ocular"; 6 | a.style.display = "block"; 7 | a.href = `https://ocular.jeffalo.net/users/${post 8 | .querySelector(".username") 9 | .textContent.replaceAll("*", "")}/`; 10 | a.className = "scratchtools-open-in-ocular black"; 11 | a.style.fontWeight = "bold"; 12 | post.querySelector(".postleft > dl").appendChild(a); 13 | } 14 | }); 15 | } 16 | -------------------------------------------------------------------------------- /features/opacity-slider/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Opacity Slider", 3 | "description": "Change the opacity of objects in the paint editor.", 4 | "credits": [ 5 | { 6 | "username": "IncognitoOrange", 7 | "url": "https://scratch.mit.edu/users/IncognitoOrange/" 8 | }, 9 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 10 | ], 11 | "type": ["Editor"], 12 | "tags": ["New", "Featured", "Beta"], 13 | "dynamic": true, 14 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 15 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 16 | "components": [ 17 | { 18 | "type": "warning", 19 | "content": "The slider, although located in the fill modal, controls the opacity of the entire shape, including the outline." 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /features/opacity-slider/style.css: -------------------------------------------------------------------------------- 1 | .ste-opacity-slider { 2 | padding-top: 0.2rem; 3 | } 4 | 5 | .ste-opacity-slider-checkered { 6 | background-image: linear-gradient( 7 | 45deg, 8 | #c5ccd6 25%, 9 | transparent 25%, 10 | transparent 75%, 11 | #c5ccd6 75% 12 | ), 13 | linear-gradient( 14 | 45deg, 15 | #c5ccd6 25%, 16 | transparent 25%, 17 | transparent 75%, 18 | #c5ccd6 75% 19 | ); 20 | background-size: 20px 20px; 21 | background-position: 0 0, 10px 10px; 22 | } 23 | 24 | .ste-opacity-background { 25 | content: ""; 26 | position: absolute; 27 | top: 0; 28 | left: 0; 29 | width: 100%; 30 | height: 100%; 31 | border-radius: 11px; 32 | } 33 | -------------------------------------------------------------------------------- /features/open-in-new-tab.js: -------------------------------------------------------------------------------- 1 | if (window.location.href.includes("https://scratch.mit.edu/projects/")) { 2 | waitforit(); 3 | 4 | function waitforit() { 5 | if ( 6 | document.querySelector( 7 | "#view > div > div.inner > div:nth-child(2) > div.flex-row.project-notes" 8 | ) === null 9 | ) { 10 | window.setTimeout(waitforit, 50); 11 | } else { 12 | var openlink = document.querySelectorAll("a"); 13 | openlink.forEach(function (link) { 14 | if ( 15 | link.parentNode.parentNode === 16 | document.querySelector("#navigation > div > ul") 17 | ) { 18 | } else { 19 | link.target = "_blank"; 20 | link.rel = "noopener noreferrer"; 21 | } 22 | }); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /features/original-buttons/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Original Buttons", 3 | "description": "Returns the original love, favorite, remix, and view buttons to the Scratch project pages.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "dynamic": true, 10 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 11 | "resources": [ 12 | { "name": "fav-gray", "path": "/resources/fav-gray.svg" }, 13 | { "name": "fav-yellow", "path": "/resources/fav-yellow.svg" }, 14 | { "name": "love-gray", "path": "/resources/love-gray.svg" }, 15 | { "name": "love-red", "path": "/resources/love-red.svg" }, 16 | { "name": "remix-gray", "path": "/resources/remix-gray.svg" }, 17 | { "name": "views-gray", "path": "/resources/views-gray.svg" } 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /features/original-buttons/resources/love-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | love-gray 4 | Created with Sketch. 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /features/original-buttons/resources/love-red.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | love-red 4 | Created with Sketch. 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /features/original-buttons/style.css: -------------------------------------------------------------------------------- 1 | .project-loves:before { 2 | background-image: var(--scratchtoolsresource-love-gray) !important; 3 | opacity: 0.5; 4 | } 5 | 6 | .project-favorites:before { 7 | background-image: var(--scratchtoolsresource-fav-gray) !important; 8 | opacity: 0.5; 9 | } 10 | 11 | .project-loves.loved:before { 12 | background-image: var(--scratchtoolsresource-love-red) !important; 13 | opacity: 1; 14 | } 15 | 16 | .project-favorites.favorited:before { 17 | background-image: var(--scratchtoolsresource-fav-yellow) !important; 18 | opacity: 1; 19 | } 20 | 21 | .project-remixes:before { 22 | opacity: 0.5; 23 | } 24 | 25 | .project-views:before { 26 | opacity: 0.5; 27 | } 28 | -------------------------------------------------------------------------------- /features/original-colors/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Revert to Blue", 3 | "description": "Changes all of the Scratch website's colors back to the original coloring from 3.0, before purple.", 4 | "credits": [ 5 | { "username": "MaterArc", "url": "https://scratch.mit.edu/users/materarc/" }, 6 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 7 | ], 8 | "styles": [{ "file": "scratch-www.css", "runOn": "/*" }], 9 | "tags": ["Theme", "New"], 10 | "type": ["Website", "Editor"], 11 | "dynamic": true, 12 | "resources": [{ "name": "reply", "path": "/reply.svg" }] 13 | } 14 | -------------------------------------------------------------------------------- /features/outline-shape-options/resources/cap-butt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /features/outline-shape-options/resources/cap-round.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /features/outline-shape-options/resources/cap-square.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /features/outline-shape-options/resources/join-arcs.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /features/outline-shape-options/resources/join-bevel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /features/outline-shape-options/resources/join-miter-clip.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /features/outline-shape-options/resources/join-miter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /features/outline-shape-options/resources/join-round.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /features/outline-shape-options/style.css: -------------------------------------------------------------------------------- 1 | .ste-outline-shape-options-passive { 2 | filter: saturate(0%); 3 | } -------------------------------------------------------------------------------- /features/paint-align/align.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /features/paint-align/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Align Objects in Paint Editor", 3 | "description": "Adds a button to the paint editor that allows you to align selected items.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Editor"], 8 | "tags": ["New"], 9 | "dynamic": true, 10 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 11 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 12 | "resources": [{ "name": "paint-align", "path": "/align.svg" }], 13 | "components": [{ 14 | "type": "info", 15 | "content": "Holding the shift key while clicking the align items button will center all selected items on the item in the furthest-back layer." 16 | }] 17 | } 18 | -------------------------------------------------------------------------------- /features/paint-align/style.css: -------------------------------------------------------------------------------- 1 | .ste-align-items.disabled { 2 | cursor: auto; 3 | opacity: .5; 4 | } -------------------------------------------------------------------------------- /features/pin-comments/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Pin Project Comments", 3 | "description": "Allows you to pin comments on your own projects and see what comments are pinned on other projects.", 4 | "credits": [ 5 | { 6 | "username": "NewYearsFan", 7 | "url": "https://scratch.mit.edu/users/NewYearsFan/" 8 | }, 9 | { 10 | "username": "rgantzos", 11 | "url": "https://scratch.mit.edu/users/rgantzos/" 12 | } 13 | ], 14 | "scripts": [ 15 | { 16 | "file": "script.js", 17 | "runOn": "/projects/*" 18 | } 19 | ], 20 | "styles": [ 21 | { 22 | "file": "style.css", 23 | "runOn": "/projects/*" 24 | } 25 | ], 26 | "tags": [ 27 | "New" 28 | ], 29 | "type": [ 30 | "Website" 31 | ], 32 | "dynamic": true, 33 | "resources": [{ "name": "pin", "path": "/pin.svg" }] 34 | } -------------------------------------------------------------------------------- /features/pin-comments/pin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /features/pin-comments/style.css: -------------------------------------------------------------------------------- 1 | .comment-pin { 2 | opacity: .5; 3 | cursor: pointer; 4 | font-size: .75rem; 5 | font-weight: 500; 6 | margin-right: 1rem; 7 | } 8 | 9 | .comment-pin:before { 10 | background-image: var(--scratchtoolsresource-pin); 11 | width: 1rem; 12 | height: 1rem; 13 | vertical-align: -0.25rem; 14 | display: inline-block; 15 | margin-right: .5rem; 16 | background-repeat: no-repeat; 17 | background-position: center center; 18 | background-size: contain; 19 | content: ""; 20 | } 21 | 22 | .ste-pinned-comment { 23 | padding: 1rem; 24 | width: 100%; 25 | position: relative; 26 | left: -1rem; 27 | border-radius: .5rem; 28 | margin-bottom: 2rem; 29 | background-color: #ff9f0020; 30 | } 31 | 32 | .ste-pinned-comment h3 { 33 | width: 100%; 34 | text-align: center; 35 | display: block; 36 | } -------------------------------------------------------------------------------- /features/plain-background/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Plain Background", 3 | "description": "Removes the dots from the background of the code editor.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Editor"], 8 | "tags": ["New", "Featured"], 9 | "dynamic": true, 10 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 11 | "similar": ["simplify-editor-tabs", "hide-block-category-names"] 12 | } 13 | -------------------------------------------------------------------------------- /features/plain-background/style.css: -------------------------------------------------------------------------------- 1 | .blocklyMainBackground { 2 | fill: transparent !important; 3 | } 4 | -------------------------------------------------------------------------------- /features/preview-textboxes/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Preview Textboxes", 3 | "description": "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.", 4 | "credits": [ 5 | { 6 | "username": "rgantzos", 7 | "url": "https://scratch.mit.edu/users/rgantzos/" 8 | }, 9 | { 10 | "username": "Giolaboman", 11 | "url": "https://scratch.mit.edu/users/Giolaboman/" 12 | } 13 | ], 14 | "styles": [{ "file": "projects.css", "runOn": "/projects/*" }], 15 | "scripts": [ 16 | { "file": "projects.js", "runOn": "/projects/*" }, 17 | { "file": "profiles.js", "runOn": "/users/*" } 18 | ], 19 | "tags": ["New"], 20 | "type": ["Website"], 21 | "resources": [{ "name": "preview-icon", "path": "/preview.svg" }] 22 | } 23 | -------------------------------------------------------------------------------- /features/preview-textboxes/preview.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/preview-textboxes/projects.css: -------------------------------------------------------------------------------- 1 | .scratchtools-preview-button::before { 2 | display: inline-block; 3 | margin-right: 0.25rem; 4 | background-repeat: no-repeat; 5 | background-position: center center; 6 | background-size: contain; 7 | width: 0.875rem; 8 | height: 0.875rem; 9 | vertical-align: bottom; 10 | content: ""; 11 | background-image: var(--scratchtoolsresource-preview-icon ); 12 | transform: scale(120%); 13 | } -------------------------------------------------------------------------------- /features/profile-flag/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Flag on Profile", 3 | "description": "Adds flag emojis near selected locations on profile pages.", 4 | "credits": [ 5 | { "username": "MaterArc", "url": "https://scratch.mit.edu/users/MaterArc/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New"], 9 | "dynamic": true, 10 | "styles": [{ "file": "style.css", "runOn": "/users/*" }], 11 | "scripts": [{ "file": "script.js", "runOn": "/users/*" }] 12 | } -------------------------------------------------------------------------------- /features/profile-flag/style.css: -------------------------------------------------------------------------------- 1 | .location img { 2 | width: 15px; 3 | height: auto; 4 | margin-top: -1rem; 5 | position: relative; 6 | bottom: -.25rem; 7 | margin-left: .4rem; 8 | } 9 | -------------------------------------------------------------------------------- /features/project-bar/arrow.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/project-bar/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Project Bar", 3 | "description": "Continue to view the information for a project, even after you scroll down past the notes and credits.", 4 | "credits": [ 5 | { 6 | "username": "cally", 7 | "url": "https://scratch.mit.edu/users/callumjt/" 8 | }, 9 | { 10 | "username": "rgantzos", 11 | "url": "https://scratch.mit.edu/users/rgantzos/" 12 | } 13 | ], 14 | "dynamic": true, 15 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 16 | "scripts": [ 17 | { "file": "script.js", "runOn": "/projects/*" } 18 | ], 19 | "tags": ["New"], 20 | "type": ["Website"], 21 | "resources": [{ "name": "up-arrow-icon", "path": "/arrow.svg" }] 22 | } 23 | -------------------------------------------------------------------------------- /features/project-descriptions/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Summarized Descriptions", 3 | "description": "Uses artificial intelligence to summarize project descriptions when you choose to, and shortens long descriptions down to important information, such as gameplay instructions.", 4 | "credits": [ 5 | { 6 | "username": "rgantzos", 7 | "url": "https://scratch.mit.edu/users/rgantzos/" 8 | } 9 | ], 10 | "dynamic": true, 11 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 12 | "scripts": [ 13 | { "file": "script.js", "runOn": "/projects/*" } 14 | ], 15 | "tags": ["New"], 16 | "type": ["Website"], 17 | "resources": [{ "name": "ai-star", "path": "/star.svg" }] 18 | } 19 | -------------------------------------------------------------------------------- /features/project-descriptions/star.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/project-descriptions/style.css: -------------------------------------------------------------------------------- 1 | .ai-star { 2 | height: 1.4rem; 3 | position: absolute; 4 | margin-left: .5rem; 5 | cursor: pointer; 6 | transform: none; 7 | transition: transform .3s; 8 | } 9 | 10 | .ai-star:hover { 11 | transform: scale(1.1); 12 | } 13 | 14 | .ai-description div { 15 | background-color: rgb(112 0 255 / 20%) !important; 16 | flex: none !important; 17 | height: fit-content; 18 | font-weight: 500; 19 | color: rgb(82, 35, 118); 20 | } 21 | 22 | .ai-description p { 23 | margin: 0px; 24 | font-size: .8rem; 25 | font-weight: 500; 26 | width: 100%; 27 | text-align: right; 28 | margin-top: .2rem; 29 | opacity: .6; 30 | } 31 | 32 | div.project-textlabel { 33 | position: relative; 34 | } 35 | -------------------------------------------------------------------------------- /features/project-links/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Project Links as Titles", 3 | "description": "Replaces project links with their titles, all across the Scratch website.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New"], 9 | "scripts": [{ "file": "script.js", "runOn": "/*" }], 10 | "similar": ["studio-links"] 11 | } 12 | -------------------------------------------------------------------------------- /features/project-links/script.js: -------------------------------------------------------------------------------- 1 | ScratchTools.waitForElements( 2 | "a[href*='https://scratch.mit.edu/projects/'], a[href^='/projects/']", 3 | async function (a) { 4 | if ( 5 | !a.parentNode?.className.includes("title") && 6 | a.textContent.toLowerCase().replaceAll(" ", "").replaceAll("\n", "") === 7 | a.href.toLowerCase().replaceAll(" ", "").replaceAll("\n", "") 8 | ) { 9 | var data = await ( 10 | await fetch( 11 | `https://api.scratch.mit.edu/projects/${ 12 | new URL( 13 | a.href.toLowerCase().replaceAll(" ", "").replaceAll("\n", "") 14 | ).pathname.split("/")[2] 15 | }/` 16 | ) 17 | ).json(); 18 | if (data?.title) { 19 | a.textContent = data.title; 20 | } 21 | } 22 | }, 23 | "project-links", 24 | false 25 | ); 26 | -------------------------------------------------------------------------------- /features/project-miniplayer/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Project Miniplayer", 3 | "description": "Scroll down on the project page and you will automatically see the project miniplayer.", 4 | "credits": [ 5 | { "username": "Masaabu-YT", "url": "https://scratch.mit.edu/users/Masaabu-YT/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "dynamic": true, 10 | "options": [ 11 | { "id": "position-right", "name": "Move the project player to the right.", "type": 1 }, 12 | { "id": "position-bottom", "name": "Move the project player to the bottom.", "type": 1 }, 13 | { "id": "opacity", "name": "Player Transparency (0% - 90%)", "type": 2 } 14 | ], 15 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 16 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }] 17 | } 18 | -------------------------------------------------------------------------------- /features/project-miniplayer/style.css: -------------------------------------------------------------------------------- 1 | .ste-project-miniplayer { 2 | position: fixed; 3 | z-index: 100; 4 | background-color: #000000aa; 5 | padding: 5px; 6 | border-radius: 10px; 7 | max-width: 485px; 8 | display: none; 9 | } -------------------------------------------------------------------------------- /features/project-version-detector/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Project Version Detector", 3 | "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.", 4 | "credits": [ 5 | { "username": "MaterArc", "url": "https://scratch.mit.edu/users/MaterArc/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New"], 9 | "dynamic": true, 10 | "scripts": [ 11 | { 12 | "file": "script.js", 13 | "runOn": "/projects/*" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /features/quick-search/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Quick Search", 3 | "description": "Easily jump between pages on the Scratch website with just the click of Control + K.", 4 | "credits": [ 5 | { 6 | "username": "rgantzos", 7 | "url": "https://scratch.mit.edu/users/rgantzos/" 8 | } 9 | ], 10 | "dynamic": true, 11 | "styles": [{ "file": "style.css", "runOn": "/*" }], 12 | "scripts": [{ "file": "script.js", "runOn": "/*" }], 13 | "tags": ["New"], 14 | "type": ["Website"], 15 | "components": [ 16 | { 17 | "type": "info", 18 | "content": "For Mac users, use Command + K to open quick search.", 19 | "if": { 20 | "type": "all", 21 | "conditions": [ 22 | { 23 | "type": "os", 24 | "value": "Macintosh" 25 | } 26 | ] 27 | } 28 | } 29 | ], 30 | "resources": [{ "name": "scatt", "path": "/scatt.png" }] 31 | } 32 | -------------------------------------------------------------------------------- /features/quick-search/scatt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/features/quick-search/scatt.png -------------------------------------------------------------------------------- /features/random-block-colors/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /features/random-block-colors/style.css: -------------------------------------------------------------------------------- 1 | li.ste-custom-april svg { 2 | height: 100%; 3 | width: 100%; 4 | } 5 | 6 | li.ste-custom-april span[class^='settings-menu_icon_'] { 7 | height: 1.5rem; 8 | width: 1.5rem; 9 | } -------------------------------------------------------------------------------- /features/relevant-forum-posts/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Show Relevant Forum Posts", 3 | "description": "When creating a new forum topic, shows other topics that may be similar to what you are creating.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Forums"], 8 | "tags": ["New"], 9 | "dynamic": true, 10 | "scripts": [{ "file": "script.js", "runOn": "/discuss/*" }], 11 | "styles": [{ "file": "style.css", "runOn": "/discuss/*" }] 12 | } 13 | -------------------------------------------------------------------------------- /features/relevant-forum-posts/style.css: -------------------------------------------------------------------------------- 1 | .ste-relevant-posts { 2 | display: flex; 3 | flex-wrap: nowrap; 4 | overflow-x: auto; 5 | margin-bottom: 1rem; 6 | } 7 | 8 | .ste-relevant-posts > a { 9 | width: 20rem; 10 | display: inline-block; 11 | flex-shrink: 0; 12 | flex-grow: 0; 13 | margin-right: 0.8rem; 14 | padding: 0.5rem; 15 | border: 1px solid #ccc; 16 | border-radius: 3px; 17 | } 18 | 19 | .ste-relevant-posts *:hover { 20 | text-decoration: none; 21 | } 22 | 23 | .ste-relevant-category { 24 | color: #55474790; 25 | margin-top: .5rem; 26 | } -------------------------------------------------------------------------------- /features/remaining-replies/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Remaining Replies", 3 | "description": "Shows how many more replies are allowed in a thread of studio comments.", 4 | "credits": [ 5 | { 6 | "url": "https://scratch.mit.edu/users/rgantzos/", 7 | "username": "rgantzos" 8 | } 9 | ], 10 | "type": ["Website"], 11 | "dynamic": true, 12 | "scripts": [{ "file": "script.js", "runOn": "/studios/*" }] 13 | } 14 | -------------------------------------------------------------------------------- /features/remove-collapse-buttons.js: -------------------------------------------------------------------------------- 1 | if (window.location.href.startsWith("https://scratch.mit.edu/discuss/")) { 2 | document.querySelectorAll(".toggle").forEach((el) => el.remove()); 3 | } 4 | -------------------------------------------------------------------------------- /features/remove-confirmation/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Remove Delete Confirmation", 3 | "description": "Removes the delete confirmation prompt when deleting sprites in the Scratch editor.", 4 | "credits": [ 5 | { "username": "MaterArc", "url": "https://scratch.mit.edu/users/MaterArc/" } 6 | ], 7 | "type": ["Editor"], 8 | "tags": ["New", "Featured"], 9 | "dynamic": true, 10 | "styles": [{ "file": "style.css", "runOn": "/editor/*" }], 11 | "scripts": [{ "file": "script.js", "runOn": "/editor/*" }] 12 | } 13 | -------------------------------------------------------------------------------- /features/remove-confirmation/script.js: -------------------------------------------------------------------------------- 1 | export default async function ({ feature, console }) { 2 | ScratchTools.waitForElements("body", () => { 3 | document.body.addEventListener("click", () => { 4 | ScratchTools.waitForElements( 5 | "[class^='delete-confirmation-prompt_ok-button_']", 6 | (confirmButton) => { 7 | if (feature.self.enabled) confirmButton.click(); 8 | } 9 | ); 10 | }); 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /features/remove-confirmation/style.css: -------------------------------------------------------------------------------- 1 | [class*="delete-confirmation-prompt_modal-container"] { 2 | visibility: hidden; 3 | } 4 | -------------------------------------------------------------------------------- /features/remove-editor-icons.js: -------------------------------------------------------------------------------- 1 | var removeEditorIcons = ScratchTools.styles.add( 2 | ` 3 | [class^="react-tabs_react-tabs__tab_"] > img[draggable="false"] { 4 | display: none !important; 5 | } 6 | `, 7 | "remove-editor-icons" 8 | ); 9 | 10 | ScratchTools.setDisable("remove-editor-icons", function () { 11 | ScratchTools.styles.removeStyleById("remove-editor-icons"); 12 | }); 13 | -------------------------------------------------------------------------------- /features/remove-project-button/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Remove Project Button", 3 | "description": "Adds a button to projects in studios that allows you to easily remove it from the studio without opening the menu.", 4 | "credits": [ 5 | { 6 | "username": "rgantzos", 7 | "url": "https://scratch.mit.edu/users/rgantzos/" 8 | } 9 | ], 10 | "dynamic": true, 11 | "styles": [{ "file": "style.css", "runOn": "/studios/*" }], 12 | "scripts": [{ "file": "script.js", "runOn": "/studios/*" }], 13 | "tags": ["New"], 14 | "type": ["Website"], 15 | "resources": [{ "name": "remove-project-trash", "path": "/remove.svg" }] 16 | } 17 | -------------------------------------------------------------------------------- /features/remove-project-button/style.css: -------------------------------------------------------------------------------- 1 | .overflow-menu-container .overflow-menu-trigger { 2 | display: none; 3 | } 4 | 5 | .ste-remove-project { 6 | height: 2rem; 7 | position: relative; 8 | top: 0.35rem; 9 | cursor: pointer; 10 | transition: transform .3s, opacity .3s; 11 | opacity: .6; 12 | transform: scale(90%); 13 | margin-right: .5rem; 14 | } 15 | 16 | .ste-remove-project:hover { 17 | transform: scale(95%); 18 | opacity: 1; 19 | } -------------------------------------------------------------------------------- /features/remove-topic-and-post.js: -------------------------------------------------------------------------------- 1 | if (window.location.href.endsWith("https://scratch.mit.edu/discuss/")) { 2 | document.querySelectorAll(".tc2").forEach((el) => el.remove()); 3 | document.querySelectorAll(".tc3").forEach((el) => el.remove()); 4 | } 5 | -------------------------------------------------------------------------------- /features/right-side-flag/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Right Side Flag", 3 | "description": "Moves the green flag and the red stop sign to the right side of the stage.", 4 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 5 | "credits": [ 6 | { 7 | "url": "https://scratch.mit.edu/users/garbomuffin/", 8 | "username": "GarboMuffin" 9 | } 10 | ], 11 | "type": ["Editor", "Website"], 12 | "dynamic": true 13 | } 14 | -------------------------------------------------------------------------------- /features/right-side-flag/style.css: -------------------------------------------------------------------------------- 1 | div[class^='stage-header_stage-menu-wrapper'] { 2 | flex-direction: row-reverse !important; 3 | } 4 | -------------------------------------------------------------------------------- /features/rotate-gradient/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Rotate Gradients", 3 | "description": "Allows you to rotate gradients in any direction in the costume editor. Works in both the vector and bitmap editors.", 4 | "credits": [ 5 | { 6 | "url": "https://scratch.mit.edu/users/rgantzos/", 7 | "username": "rgantzos" 8 | } 9 | ], 10 | "type": ["Editor"], 11 | "dynamic": true, 12 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 13 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 14 | "support": { 15 | "yt": "https://youtu.be/5S032vWPvd0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /features/rotate-gradient/style.css: -------------------------------------------------------------------------------- 1 | .ste-direction-slider { 2 | padding-top: 0.2rem; 3 | margin-bottom: 20px; 4 | } 5 | 6 | .ste-direction-slider-checkered { 7 | background-color: #f6f6f6; 8 | background-image: linear-gradient( 9 | to right, 10 | #c5ccd6, 11 | #c5ccd6 1px, 12 | transparent 1px, 13 | transparent 1.5px 14 | ); 15 | background-size: 3px 100%; 16 | background-position: 0 0, 10px 10px; 17 | } 18 | 19 | .ste-direction-background { 20 | content: ""; 21 | position: absolute; 22 | top: 0; 23 | left: 0; 24 | width: 100%; 25 | height: 100%; 26 | border-radius: 11px; 27 | } 28 | -------------------------------------------------------------------------------- /features/round-profile-pictures.js: -------------------------------------------------------------------------------- 1 | function roundProfile() { 2 | document.querySelectorAll("img").forEach(function (el) { 3 | if (el.src !== undefined) { 4 | if (el.src.includes("scratch.mit.edu/get_image/user/")) { 5 | el.style.borderRadius = "50%"; 6 | } 7 | } 8 | }); 9 | window.setTimeout(roundProfile, 80); 10 | } 11 | 12 | roundProfile(); 13 | -------------------------------------------------------------------------------- /features/scroll-project-titles.js: -------------------------------------------------------------------------------- 1 | ScratchTools.styles.add( 2 | ` 3 | .project-title.no-edit { 4 | overflow-x: auto !important; 5 | text-overflow: clip !important; 6 | }`, 7 | "scroll project titles" 8 | ); 9 | 10 | ScratchTools.setDisable("scroll-project-titles", function () { 11 | if (document.querySelector(".project-title.no-edit")) { 12 | document.querySelector(".project-title.no-edit").scrollLeft = 0; 13 | } 14 | ScratchTools.styles.removeStyleById("scroll project titles"); 15 | }); 16 | -------------------------------------------------------------------------------- /features/scrollable-list-items.js: -------------------------------------------------------------------------------- 1 | ScratchTools.styles.add( 2 | ` 3 | [class^="monitor_value-inner_"] { 4 | overflow-x: scroll; 5 | text-overflow: clip; 6 | } 7 | `, 8 | "scrollable-lists" 9 | ); 10 | 11 | ScratchTools.setDisable("scrollable-list-items", function () { 12 | document 13 | .querySelectorAll('[class^="monitor_value-inner_"]') 14 | .forEach(function (el) { 15 | el.scrollLeft = 0; 16 | }); 17 | ScratchTools.styles.removeStyleById("scrollable-lists"); 18 | }); 19 | -------------------------------------------------------------------------------- /features/select-self/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Select Self", 3 | "description": "Allows you to select the current sprite when opening sprite dropdowns, instead of only other sprites.", 4 | "scripts": [ 5 | { 6 | "file": "script.js", 7 | "runOn": "/projects/*" 8 | } 9 | ], 10 | "credits": [ 11 | { 12 | "url": "https://scratch.mit.edu/users/rgantzos/", 13 | "username": "rgantzos" 14 | } 15 | ], 16 | "type": [ 17 | "Editor" 18 | ], 19 | "dynamic": true 20 | } -------------------------------------------------------------------------------- /features/shared-clipboard/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Shared Clipboard", 3 | "description": "Allows you to copy and paste items between paint editors in different projects.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Editor"], 8 | "tags": ["New"], 9 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }] 10 | } 11 | -------------------------------------------------------------------------------- /features/show-emoji-names/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Show Emoji Name", 3 | "description": "Allows you to hover over Scratch emojis in the comments and view their names.", 4 | "credits": [ 5 | { "username": "IQBit", "url": "https://iqnite.github.io/" }, 6 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 7 | ], 8 | "type": ["Website"], 9 | "tags": ["New"], 10 | "scripts": [ 11 | { "file": "script.js", "runOn": "/users/*||/projects/*||/studios/*" } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /features/show-emoji-names/script.js: -------------------------------------------------------------------------------- 1 | export default async function ({ feature, console }) { 2 | ScratchTools.waitForElements(".comments img.easter-egg", function (img) { 3 | img.title = capitalize( 4 | img.src.split("/")[8].split(".")[0].replaceAll("-", " ") 5 | ); 6 | }); 7 | 8 | ScratchTools.waitForElements("span.emoji-text img.emoji", function (img) { 9 | img.title = capitalize( 10 | img.src.split("/")[5].split(".")[0].replaceAll("-", " ") 11 | ); 12 | }); 13 | 14 | function capitalize(string) { 15 | return string 16 | .split(" ") 17 | .map((word) => { 18 | return word[0].toUpperCase() + word.substring(1); 19 | }) 20 | .join(" "); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /features/sidebar/resources/about.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/sidebar/resources/create.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/sidebar/resources/explore.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/sidebar/resources/home.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/sidebar/resources/ideas.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/sidebar/resources/logout.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/sidebar/resources/search.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/sidebar/resources/settings.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/sidebar/resources/signin.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/simplify-action-buttons/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title":"Simplify Action Buttons", 3 | "description":"Displays project action buttons underneath Notes and Credits as their icons.", 4 | "credits":[ 5 | { 6 | "username":"MaterArc", 7 | "url":"https://scratch.mit.edu/users/MaterArc/" 8 | }, 9 | { 10 | "username":"syesjohnny", 11 | "url":"https://scratch.mit.edu/users/0920613562/" 12 | } 13 | ], 14 | "type":[ 15 | "Website" 16 | ], 17 | "tags":[ 18 | "New" 19 | ], 20 | "dynamic":true, 21 | "styles":[ 22 | { 23 | "file":"style.css", 24 | "runOn":"/projects/*" 25 | } 26 | ], 27 | "similar":[ 28 | "simplify-editor-tabs", 29 | "hide-block-category-names" 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /features/simplify-action-buttons/style.css: -------------------------------------------------------------------------------- 1 | .copy-link-button span, .studio-button span, .report-button span, .scratchtools-preview-button span { 2 | display: none !important; 3 | } 4 | 5 | .report-button::before, .studio-button::before, .copy-link-button::before, .scratchtools-preview-button::before{ 6 | margin-left: 3px; 7 | } -------------------------------------------------------------------------------- /features/simplify-editor-tabs/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Simplify Editor Tabs", 3 | "description": "Changes editor tabs to icon-only and shows them as a circle", 4 | "credits": [ 5 | { "username": "Wilamaxin", "url": "https://scratch.mit.edu/users/Wilamaxin/" } 6 | ], 7 | "type": ["Editor"], 8 | "tags": ["New"], 9 | "dynamic": true, 10 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 11 | "similar": ["plain-background", "hide-block-category-names"] 12 | } -------------------------------------------------------------------------------- /features/simplify-editor-tabs/style.css: -------------------------------------------------------------------------------- 1 | li[class^='react-tabs_react-tabs__tab'] > span { 2 | display:none !important; 3 | } 4 | 5 | li[class^='react-tabs_react-tabs__tab'] > img { 6 | width: 25px !important; 7 | height: 25px !important; 8 | bottom: .5px !important; 9 | margin-right: 0 !important; 10 | position: relative !important; 11 | } 12 | 13 | li[class^='react-tabs_react-tabs__tab'] { 14 | width: 35px !important; 15 | height: 35px !important; 16 | min-height: 35px !important; 17 | min-width: 35px !important; 18 | padding: 0 !important; 19 | flex-grow: 0 !important; 20 | margin: 0px 0px 5.25px 10px !important; 21 | border-radius: 100% !important; 22 | } 23 | -------------------------------------------------------------------------------- /features/slash-to-search/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Slash to Search", 3 | "description": "Click the slash key (/) to select the search bar and start typing.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New"], 9 | "scripts": [{ "file": "script.js", "runOn": "/*" }] 10 | } 11 | -------------------------------------------------------------------------------- /features/slash-to-search/script.js: -------------------------------------------------------------------------------- 1 | document.body.addEventListener("keyup", function (e) { 2 | if ( 3 | e.which === 191 && 4 | document.activeElement === document.body && 5 | !ScratchTools.Scratch?.scratchGui()?.vmStatus?.running 6 | ) { 7 | document.querySelector("li.search input")?.focus(); 8 | document.querySelector("input#search-input")?.focus() 9 | } 10 | }); 11 | -------------------------------------------------------------------------------- /features/snap-to-grid/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Snap Scripts to Grid", 3 | "description": "Automatically aligns scripts to the dotted grid in the editor when placed.", 4 | "credits": [ 5 | { 6 | "username": "rgantzos", 7 | "url": "https://scratch.mit.edu/users/rgantzos/" 8 | } 9 | ], 10 | "type": [ 11 | "Editor" 12 | ], 13 | "tags": [ 14 | "New" 15 | ], 16 | "scripts": [ 17 | { 18 | "file": "script.js", 19 | "runOn": "/projects/*" 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /features/snap-to-grid/script.js: -------------------------------------------------------------------------------- 1 | export default async function ({ feature, console }) { 2 | await ScratchTools.waitForElement("div.gui") 3 | update() 4 | 5 | feature.traps.vm.on("workspaceUpdate", function() { 6 | update() 7 | }) 8 | 9 | function update() { 10 | Blockly.getMainWorkspace().grid_.snapToGrid_ = feature.self.enabled 11 | } 12 | } -------------------------------------------------------------------------------- /features/specific-replies/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Specific Reply Messages", 3 | "description": "In messages related to comments, specifies who a comment was replying to.", 4 | "credits": [ 5 | { 6 | "username": "MaterArc", 7 | "url": "https://scratch.mit.edu/users/MaterArc/" 8 | }, 9 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 10 | ], 11 | "type": ["Website"], 12 | "tags": ["New"], 13 | "scripts": [{ "file": "script.js", "runOn": "/messages*" }] 14 | } 15 | -------------------------------------------------------------------------------- /features/sprite-layers/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "View Sprite Layers", 3 | "description": "Allows you to hover over the show/hide toggle in the sprite properties panel of the editor to view the sprite layers.", 4 | "credits": [ 5 | { 6 | "username": "-Brass_Glass-", 7 | "url": "https://scratch.mit.edu/users/-Brass_Glass-/" 8 | }, 9 | { 10 | "username": "rgantzos", 11 | "url": "https://scratch.mit.edu/users/rgantzos/" 12 | } 13 | ], 14 | "type": [ 15 | "Editor" 16 | ], 17 | "tags": [ 18 | "New" 19 | ], 20 | "scripts": [ 21 | { 22 | "file": "script.js", 23 | "runOn": "/projects/*" 24 | } 25 | ], 26 | "styles": [ 27 | { 28 | "file": "style.css", 29 | "runOn": "/projects/*" 30 | } 31 | ] 32 | } -------------------------------------------------------------------------------- /features/sprite-watermark.js: -------------------------------------------------------------------------------- 1 | ScratchTools.styles.add( 2 | "[class^='gui_watermark_'] > [class^='watermark_sprite-image_'] { display: none !important; }", 3 | "sprite-watermark" 4 | ); 5 | 6 | ScratchTools.setDisable("sprite-watermark", function () { 7 | ScratchTools.styles.removeStyleById("sprite-watermark"); 8 | }); 9 | -------------------------------------------------------------------------------- /features/stage-in-spritepane/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Stage In Sprite Pane", 3 | "description": "Move the stage button to the sprite pane to widen the sprite field.", 4 | "credits": [ 5 | { "username": "Masaabu-YT", "url": "https://scratch.mit.edu/users/Masaabu-YT/" } 6 | ], 7 | "type": ["Editor"], 8 | "tags": ["New", "Featured"], 9 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 10 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 11 | "dynamic": true 12 | } 13 | -------------------------------------------------------------------------------- /features/start-stop-hotkeys/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Green Flag Hotkeys", 3 | "description": "Use Control + G to start or stop a project, depending on whether or not it is running.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New"], 9 | "dynamic": true, 10 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 11 | "components": [ 12 | { 13 | "type": "info", 14 | "content": "For Mac users, use Command + G to start and stop the project.", 15 | "if": { 16 | "type": "all", 17 | "conditions": [ 18 | { 19 | "type": "os", 20 | "value": "Macintosh" 21 | } 22 | ] 23 | } 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /features/start-stop-hotkeys/script.js: -------------------------------------------------------------------------------- 1 | export default function ({ feature, console }) { 2 | document.addEventListener("keydown", function (e) { 3 | if (!feature.traps.vm) return; 4 | if (!feature.self.enabled) return; 5 | if (e.which === 71 && (e.metaKey || e.ctrlKey)) { 6 | e.preventDefault(); 7 | if (feature.traps.gui().vmStatus.started) { 8 | if (feature.traps.gui().vmStatus.running) { 9 | feature.traps.vm.stopAll(); 10 | } else { 11 | feature.traps.vm.greenFlag(); 12 | } 13 | } else { 14 | feature.traps.vm.start(); 15 | feature.traps.vm.greenFlag(); 16 | } 17 | } 18 | }); 19 | } 20 | -------------------------------------------------------------------------------- /features/statistics/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Statistics", 3 | "description": "Adds a statistics button on the my stuff page that leads to your ScratchStats profile.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Website"], 8 | "tags": ["New", "Featured"], 9 | "dynamic": true, 10 | "scripts": [{ "file": "script.js", "runOn": "/mystuff*" }] 11 | } 12 | -------------------------------------------------------------------------------- /features/stats-percentages/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Show Percentages for Project Stats", 3 | "description": "On the my stuff page, hover over the number of loves, favorites or remixes to view what percent of viewers performed the action.", 4 | "credits": [ 5 | { 6 | "username": "JefferyTheSuperKat", 7 | "url": "https://scratch.mit.edu/users/JefferyTheSuperKat/" 8 | }, 9 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 10 | ], 11 | "type": ["Website"], 12 | "tags": ["New"], 13 | "dynamic": true, 14 | "scripts": [{ "file": "script.js", "runOn": "/mystuff/" }] 15 | } 16 | -------------------------------------------------------------------------------- /features/steal-game/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Steal Game", 3 | "description": "Changes the remix button's text to 'Steal game'.", 4 | "credits": [ 5 | { 6 | "username": "cally", 7 | "url": "https://github.com/callumjt" 8 | } 9 | ], 10 | "type": ["Website", "Egg"], 11 | "tags": ["New"], 12 | "dynamic": true, 13 | "scripts": [{ "file": "script.js", "runOn": "/projects/" }], 14 | "styles": [{ "file": "style.css", "runOn": "/projects/" }], 15 | "resources": [ 16 | { "name": "trash-remix", "path": "/resources/trash.svg" } 17 | ] 18 | } 19 | 20 | -------------------------------------------------------------------------------- /features/steal-game/resources/trash.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/steal-game/script.js: -------------------------------------------------------------------------------- 1 | export default async function ({ feature, console }) { 2 | ScratchTools.waitForElements(".remix-button span", function(remixText) { 3 | if (feature.self.enabled) { 4 | remixText.textContent = "Steal Game"; 5 | } 6 | }); 7 | 8 | feature.addEventListener("enabled", async function () { 9 | var remixText = await document.querySelector(".remix-button span"); 10 | if (!remixText) return; 11 | remixText.textContent = "Steal Game"; 12 | }); 13 | 14 | feature.addEventListener("disabled", async function () { 15 | var remixText = await document.querySelector(".remix-button span"); 16 | if (!remixText) return; 17 | remixText.textContent = "Remix"; 18 | }); 19 | } 20 | -------------------------------------------------------------------------------- /features/steal-game/style.css: -------------------------------------------------------------------------------- 1 | .remix-button::before { 2 | background-image: var(--scratchtoolsresource-trash-remix) !important; 3 | } -------------------------------------------------------------------------------- /features/studio-creation-date/calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /features/studio-creation-date/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Studio Creation Date", 3 | "description": "Adds the creation date of the studio to the studio footer.", 4 | "credits": [ 5 | { 6 | "username": "MaterArc", 7 | "url": "https://scratch.mit.edu/users/MaterArc/" 8 | } 9 | ], 10 | "type": ["Website"], 11 | "tags": ["New"], 12 | "dynamic": true, 13 | "scripts": [{ "file": "script.js", "runOn": "/studios/*" }], 14 | "resources": [{ "name": "calendar", "path": "/calendar.svg" }] 15 | } 16 | -------------------------------------------------------------------------------- /features/studio-links/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Studio Links as Titles", 3 | "description": "Replaces studio links with their titles, all across the Scratch website.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" }, 6 | { "username": "palindromos", "url": "https://scratch.mit.edu/users/palindromos/" } 7 | ], 8 | "type": ["Website"], 9 | "tags": ["New"], 10 | "scripts": [{ "file": "script.js", "runOn": "/*" }], 11 | "similar": ["project-links"] 12 | } 13 | -------------------------------------------------------------------------------- /features/studio-links/script.js: -------------------------------------------------------------------------------- 1 | ScratchTools.waitForElements( 2 | "a[href*='https://scratch.mit.edu/studios/'], a[href^='/studios/']", 3 | async function (a) { 4 | if ( 5 | !a.parentNode?.className.includes("title") && 6 | a.textContent.toLowerCase().replaceAll(" ", "").replaceAll("\n", "") === 7 | a.href.toLowerCase().replaceAll(" ", "").replaceAll("\n", "") 8 | ) { 9 | var data = await ( 10 | await fetch( 11 | `https://api.scratch.mit.edu/studios/${ 12 | new URL( 13 | a.href.toLowerCase().replaceAll(" ", "").replaceAll("\n", "") 14 | ).pathname.split("/")[2] 15 | }/` 16 | ) 17 | ).json(); 18 | if (data?.title) { 19 | a.textContent = data.title; 20 | } 21 | } 22 | }, 23 | "studio-links", 24 | false 25 | ); 26 | -------------------------------------------------------------------------------- /features/total-stats/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Total User Stats", 3 | "description": "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.", 4 | "credits": [ 5 | { 6 | "username": "RowanMoonBoy", 7 | "url": "https://scratch.mit.edu/users/RowanMoonBoy/" 8 | }, 9 | { 10 | "username": "rgantzos", 11 | "url": "https://scratch.mit.edu/users/rgantzos/" 12 | } 13 | ], 14 | "dynamic": true, 15 | "styles": [ 16 | { 17 | "file": "style.css", 18 | "runOn": "/users/*" 19 | } 20 | ], 21 | "scripts": [ 22 | { 23 | "file": "script.js", 24 | "runOn": "/users/*" 25 | } 26 | ], 27 | "tags": [ 28 | "New" 29 | ], 30 | "type": [ 31 | "Website" 32 | ] 33 | } -------------------------------------------------------------------------------- /features/total-stats/style.css: -------------------------------------------------------------------------------- 1 | .ste-total-stats { 2 | font-weight: 500; 3 | opacity: .6; 4 | margin-left: 1rem; 5 | font-style: italic; 6 | font-size: .9rem; 7 | } -------------------------------------------------------------------------------- /features/twemoji-in-forums.js: -------------------------------------------------------------------------------- 1 | if (window.location.href.startsWith("https://scratch.mit.edu/discuss/")) { 2 | document.querySelectorAll("img").forEach(function (el) { 3 | var types = { 4 | smile: "1F600", 5 | neutral: "1F610", 6 | sad: "1F61F", 7 | big_smile: "1F603", 8 | yikes: "1F62C", 9 | wink: "1F609", 10 | hmm: "1F914", 11 | tongue: "1F61B", 12 | lol: "1F923", 13 | mad: "1F621", 14 | roll: "1F644", 15 | cool: "1F60E", 16 | }; 17 | if (el.src.startsWith("https://cdn.scratch.mit.edu/scratchr2/static/__")) { 18 | Object.keys(types).forEach(function (obj) { 19 | if (el.src.endsWith(`__/djangobb_forum/img/smilies/${obj}.png`)) { 20 | el.src = 21 | "https://raw.githubusercontent.com/twitter/twemoji/master/assets/72x72/" + 22 | types[obj].toLowerCase() + 23 | ".png"; 24 | el.style.width = "15px"; 25 | } 26 | }); 27 | } 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /features/two-colors/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "2.0 Block Colors", 3 | "description": "Replaces the colors of the blocks in the editor with the blocks from the 2.0 version of the code editor.", 4 | "credits": [ 5 | { 6 | "username": "infinitytec", 7 | "url": "https://github.com/infinitytec" 8 | } 9 | ], 10 | "type": ["Editor", "Theme"], 11 | "tags": ["New"], 12 | "dynamic": true, 13 | "styles": [{ "file": "style.css", "runOn": "/projects/" }] 14 | } 15 | -------------------------------------------------------------------------------- /features/unbold-site-text.js: -------------------------------------------------------------------------------- 1 | var style = ScratchTools.styles.add("* { font-weight: normal !important; }"); 2 | 3 | ScratchTools.setDisable("unbold-site-text", function () { 4 | style.remove(); 5 | }); 6 | -------------------------------------------------------------------------------- /features/unlisted-projects/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Unlisted Projects", 3 | "description": "Allows you to generate share links for unshared projects in the editor.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Editor", "Website"], 8 | "tags": ["New", "Recommended"], 9 | "dynamic": false, 10 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }, { "file": "mystuff.js", "runOn": "/mystuff/" }], 11 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }, { "file": "mystuff.css", "runOn": "/mystuff/" }], 12 | "resources": [{ "name": "unlisted-star", "path": "/star.svg" }, { "name": "unlisted-star-full", "path": "/star-full.svg" }] 13 | } 14 | -------------------------------------------------------------------------------- /features/unlisted-projects/mystuff.css: -------------------------------------------------------------------------------- 1 | .scratchtools-unlisted-star { 2 | height: 1rem; 3 | display: inline-block; 4 | margin-left: 0.5rem; 5 | position: relative; 6 | top: 0.15rem; 7 | } 8 | 9 | .media-info-item.title a { 10 | display: inline-block !important; 11 | margin-bottom: -0.5rem; 12 | } 13 | -------------------------------------------------------------------------------- /features/unlisted-projects/mystuff.js: -------------------------------------------------------------------------------- 1 | ScratchTools.waitForElements( 2 | ".media-item-content", 3 | async function (el) { 4 | var data = await ( 5 | await fetch( 6 | `https://unlisted.gantzos.com/iscached/${ 7 | new URL(el.querySelector(".title a").href).pathname.split("/")[2] 8 | }/` 9 | ) 10 | ).json(); 11 | if (data.isCached) { 12 | var img = document.createElement("img"); 13 | img.src = ScratchTools.Resources["unlisted-star"]; 14 | img.className = "scratchtools-unlisted-star"; 15 | img.title = "This project is unlisted."; 16 | el.querySelector(".title").appendChild(img); 17 | } 18 | }, 19 | "show-if-unlisted", 20 | false 21 | ); 22 | -------------------------------------------------------------------------------- /features/unlisted-projects/star-full.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /features/unlisted-projects/star.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /features/unlisted-projects/style.css: -------------------------------------------------------------------------------- 1 | .scratchtools-copy-unlisted-link::before { 2 | background-image: var(--scratchtoolsresource-unlisted-star-full); 3 | filter: brightness(0) invert(1); 4 | display: inline-block; 5 | margin-right: 0.25rem; 6 | background-repeat: no-repeat; 7 | background-position: center center; 8 | background-size: contain; 9 | width: 0.875rem; 10 | height: 0.875rem; 11 | vertical-align: bottom; 12 | content: ""; 13 | } -------------------------------------------------------------------------------- /features/upload-thumbnail/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Set Thumbnail", 3 | "description": "Allows you to upload an image or GIF as a project thumbnail, or set the thumbnail to the current stage.", 4 | "credits": [ 5 | { 6 | "username": "Sanjang_Beta", 7 | "url": "https://scratch.mit.edu/users/Sanjang_Beta/" 8 | }, 9 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 10 | ], 11 | "type": ["Website"], 12 | "tags": ["New", "Recommended"], 13 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }], 14 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }], 15 | "resources": [{ "name": "thumbnail-btn", "path": "/thumbnail-btn.svg" }], 16 | "dynamic": true 17 | } 18 | -------------------------------------------------------------------------------- /features/upload-thumbnail/style.css: -------------------------------------------------------------------------------- 1 | .ste-thumbnail::before { 2 | background-image: var(--scratchtoolsresource-thumbnail-btn); 3 | display: inline-block; 4 | margin-right: 0.25rem; 5 | background-repeat: no-repeat; 6 | background-position: center center; 7 | background-size: contain; 8 | width: 0.875rem; 9 | height: 0.875rem; 10 | vertical-align: bottom; 11 | content: ""; 12 | transform: scale(1.3); 13 | } 14 | 15 | 16 | .ste-thumbnail-stage:disabled { 17 | opacity: .5; 18 | cursor: not-allowed !important; 19 | background: #b5b5b5 !important; 20 | } 21 | 22 | .ste-thumbnail-stage:disabled:hover { 23 | top: 0px !important; 24 | } -------------------------------------------------------------------------------- /features/upload-thumbnail/thumbnail-btn.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/video-recorder/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Record Stage", 3 | "description": "Allows you to record the stage for projects while in the editor or on the project page.", 4 | "credits": [ 5 | { 6 | "username": "blob2763", 7 | "url": "https://blob2763.is-a.dev/" 8 | }, 9 | { 10 | "username": "stio_studio", 11 | "url": "https://stio.studio/" 12 | } 13 | ], 14 | "type": ["Editor"], 15 | "tags": ["New", "Featured"], 16 | "scripts": [ 17 | { 18 | "file": "video-recorder.js", 19 | "runOn": "/projects/*" 20 | } 21 | ], 22 | "styles": [ 23 | { 24 | "file": "style.css", 25 | "runOn": "/projects/*" 26 | } 27 | ], 28 | "resources": [ 29 | { 30 | "name": "popup-html", 31 | "path": "/popup.html" 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /features/video-recorder/style.css: -------------------------------------------------------------------------------- 1 | .STE-ReactModalPortal .STE-recorded-video { 2 | width: 100%; 3 | height: 100%; 4 | border: 10px solid #ccc; 5 | border-radius: 10px; 6 | } 7 | 8 | .STE-ReactModalPortal .STE-hide-button { 9 | display: none; 10 | } 11 | 12 | .STE-ReactModalPortal .STE-left-text { 13 | text-align: left; 14 | } 15 | 16 | .STE-ReactModalPortal .stopButton, 17 | .STE-ReactModalPortal .startButton, 18 | .STE-ReactModalPortal .downloadButton, 19 | .STE-ReactModalPortal .video-format-select { 20 | width: 100%; 21 | } 22 | 23 | -------------------------------------------------------------------------------- /features/watch-later/mystuff.js: -------------------------------------------------------------------------------- 1 | export default async function ({ feature, console }) { 2 | let buttons = await ScratchTools.waitForElement(".cols .box div.buttons") 3 | 4 | let a = document.createElement("a") 5 | a.href = feature.self.getResource("watch-later-page") 6 | a.className = "button small grey" 7 | 8 | let span = document.createElement("span") 9 | span.textContent = feature.msg("watch-later") 10 | span.className = "text" 11 | a.appendChild(span) 12 | 13 | buttons.appendChild(a) 14 | 15 | feature.self.hideOnDisable(a) 16 | } -------------------------------------------------------------------------------- /features/watch-later/page/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Watch Later | ScratchTools 5 | 6 | 7 | 8 | 17 |
18 |

Watch Later

19 |

These are the Scratch projects that you have saved to watch later.

20 |
21 |
22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /features/watch-later/style.css: -------------------------------------------------------------------------------- 1 | .ste-watch-later::before { 2 | display: inline-block; 3 | margin-right: 0.25rem; 4 | background-repeat: no-repeat; 5 | background-position: center center; 6 | background-size: contain; 7 | width: 0.875rem; 8 | height: 0.875rem; 9 | vertical-align: bottom; 10 | content: ""; 11 | background-image: var(--scratchtoolsresource-watch-later-icon); 12 | } -------------------------------------------------------------------------------- /features/webp-uploads/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "WEBP Image Uploads", 3 | "description": "Allows you to upload webp images in the editor for new sprites, costumes and stage backdrops.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Editor"], 8 | "tags": ["New", "Featured"], 9 | "dynamic": true, 10 | "scripts": [{ "file": "script.js", "runOn": "/projects/*" }] 11 | } 12 | -------------------------------------------------------------------------------- /features/wrap-lists/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Wrap List Items", 3 | "description": "Displays text in list items normally without cutting them off if they're too long.", 4 | "credits": [ 5 | { "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" } 6 | ], 7 | "type": ["Editor"], 8 | "tags": ["New", "Featured", "Beta"], 9 | "dynamic": true, 10 | "styles": [{ "file": "style.css", "runOn": "/projects/*" }] 11 | } 12 | -------------------------------------------------------------------------------- /features/wrap-lists/style.css: -------------------------------------------------------------------------------- 1 | div[class^="monitor_list-row_"] { 2 | position: static !important; 3 | height: fit-content !important; 4 | } 5 | 6 | div[class^="monitor_list-row_"] div[class^="monitor_value-inner_"] { 7 | text-overflow: initial !important; 8 | text-wrap: wrap !important; 9 | overflow-wrap: break-word; 10 | } 11 | 12 | div[class^="monitor_list-row_"] div[class^="monitor_list-value_"] { 13 | height: fit-content !important; 14 | } 15 | 16 | div.ReactVirtualized__Grid__innerScrollContainer { 17 | overflow-y: visible !important; 18 | height: fit-content !important; 19 | max-height: fit-content !important; 20 | } -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | all: macos 2 | 3 | clean: 4 | rm -rf safari-extension 5 | rm -rf safari-extension-build 6 | 7 | ios: clean 8 | xcrun safari-web-extension-converter "$(PWD)" --project-location safari-extension --force 9 | 10 | create-without-open: clean 11 | xcrun safari-web-extension-converter "$(PWD)" --project-location safari-extension --force --no-open 12 | 13 | macos: create-without-open 14 | xcodebuild -workspace safari-extension/ScratchTools/ScratchTools.xcodeproj/project.xcworkspace -scheme "ScratchTools (macOS)" -configuration Debug clean build CONFIGURATION_BUILD_DIR="$(PWD)/safari-extension-build" 15 | echo "App available at $(PWD)/safari-extension-build" 16 | -------------------------------------------------------------------------------- /onboarding/featured.json: -------------------------------------------------------------------------------- 1 | [ 2 | "search-context-menus", 3 | "isonline", 4 | "collapse-blocks" 5 | ] -------------------------------------------------------------------------------- /onboarding/images/collapse-blocks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/onboarding/images/collapse-blocks.png -------------------------------------------------------------------------------- /onboarding/images/isonline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/onboarding/images/isonline.png -------------------------------------------------------------------------------- /onboarding/images/search-context-menus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/onboarding/images/search-context-menus.png -------------------------------------------------------------------------------- /onboarding/themes/dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/onboarding/themes/dark.png -------------------------------------------------------------------------------- /onboarding/themes/light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/onboarding/themes/light.png -------------------------------------------------------------------------------- /themes/settings/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Theme Store | ScratchTools 5 | 6 | 7 | 8 | 9 | 21 |
22 |

Theme Store

23 |

24 | These themes allow you to customize the settings page of ScratchTools. 25 |

26 |
27 |
28 | 29 | 30 | 31 | --------------------------------------------------------------------------------