diff --git a/src/containers/blocks.jsx b/src/containers/blocks.jsx
index f3426c5ff..0b9264a02 100644
--- a/src/containers/blocks.jsx
+++ b/src/containers/blocks.jsx
@@ -130,6 +130,9 @@ class Blocks extends React.Component {
log.warn('cannot open docs URI', e);
}
});
+ toolboxWorkspace.registerButtonCallback('TW_MIGRATION', () => {
+ window.open('https://github.com/TurboWarp/scratch-gui/discussions/100');
+ });
// Store the xml of the toolbox that is actually rendered.
// This is used in componentDidUpdate instead of prevProps, because
diff --git a/src/lib/libraries/extensions/index.jsx b/src/lib/libraries/extensions/index.jsx
index ab94fc10c..a86eff4b4 100644
--- a/src/lib/libraries/extensions/index.jsx
+++ b/src/lib/libraries/extensions/index.jsx
@@ -46,6 +46,8 @@ import gdxforInsetIconURL from './gdxfor/gdxfor-small.svg';
import gdxforConnectionIconURL from './gdxfor/gdxfor-illustration.svg';
import gdxforConnectionSmallIconURL from './gdxfor/gdxfor-small.svg';
+import twIcon from './tw/tw.svg';
+
import customExtensionIcon from './custom/custom.svg';
export default [
@@ -320,6 +322,25 @@ export default [
),
helpLink: 'https://scratch.mit.edu/vernier'
},
+ {
+ name: (
+
+ ),
+ extensionId: 'tw',
+ iconURL: twIcon,
+ description: (
+
+ ),
+ featured: true
+ },
{
name: (
+
diff --git a/src/lib/make-toolbox-xml.js b/src/lib/make-toolbox-xml.js
index f7858a4a8..44e077ede 100644
--- a/src/lib/make-toolbox-xml.js
+++ b/src/lib/make-toolbox-xml.js
@@ -724,23 +724,15 @@ const myBlocks = function () {
};
// tw: add custom category
-const turbowarp = function () {
- return `
-
-
- `;
-};
-const turbowarpIsCompiledBlock = function () {
- return `
-
- is compiled?
-
- `;
-};
+// eslint-disable-next-line max-len
+const turbowarpIsCompiledBlock = `is compiled?`;
+const turbowarpCategory = `
+
+ ${turbowarpIsCompiledBlock}`;
/* eslint-enable no-unused-vars */
const xmlOpen = '';
@@ -790,9 +782,11 @@ const makeToolboxXML = function (isInitialSetup, isStage = true, targetId, categ
const variablesXML = moveCategory('data') || variables(isInitialSetup, isStage, targetId);
const myBlocksXML = moveCategory('procedures') || myBlocks(isInitialSetup, isStage, targetId);
// tw: add custom category
- let turbowarpXML = moveCategory('tw') || turbowarp(isInitialSetup, isStage, targetId);
+ let turbowarpXML = moveCategory('tw') || turbowarpCategory;
// terrible hack to add "is compiled" to the top of the category...
- turbowarpXML = turbowarpXML.replace('