├── .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 |
9 |
Beta Update
10 | You're currently using ScratchTools on a beta version, but there's a new one available..
11 |
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 |
5 |
--------------------------------------------------------------------------------
/extras/icons/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/STForScratch/ScratchTools/1224cacee0bb7bf07632d6523f975a7fb7915a78/extras/icons/search.png
--------------------------------------------------------------------------------
/extras/icons/search.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/extras/icons/search2.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/features/explore-filter/resources/filter.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/features/explore-filter/resources/title.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/features/explore-filter/resources/user.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/features/more-paint-functions/icons/intersect.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/features/more-paint-functions/icons/subtract.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/features/more-paint-functions/icons/unite.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/features/original-buttons/resources/love-red.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/features/outline-shape-options/resources/cap-round.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/features/outline-shape-options/resources/cap-square.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/features/outline-shape-options/resources/join-arcs.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/features/outline-shape-options/resources/join-bevel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/features/outline-shape-options/resources/join-miter-clip.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/features/outline-shape-options/resources/join-miter.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/features/outline-shape-options/resources/join-round.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/features/outline-shape-options/style.css:
--------------------------------------------------------------------------------
1 | .ste-outline-shape-options-passive {
2 | filter: saturate(0%);
3 | }
--------------------------------------------------------------------------------
/features/paint-align/align.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
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 |
--------------------------------------------------------------------------------
/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 |
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 |
--------------------------------------------------------------------------------
/features/unlisted-projects/star.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
10 |
11 |
Settings Themes
20 |
21 |
22 |
Theme Store
23 |
24 | These themes allow you to customize the settings page of ScratchTools.
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------