diff --git a/plugins/dev-create/templates/typescript-block/template/src/blockly-env.d.ts b/plugins/dev-create/templates/typescript-block/template/src/blockly-env.d.ts
new file mode 100644
index 0000000000..cf7b656651
--- /dev/null
+++ b/plugins/dev-create/templates/typescript-block/template/src/blockly-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/plugins/dev-create/templates/typescript-field/template/src/blockly-env.d.ts b/plugins/dev-create/templates/typescript-field/template/src/blockly-env.d.ts
new file mode 100644
index 0000000000..cf7b656651
--- /dev/null
+++ b/plugins/dev-create/templates/typescript-field/template/src/blockly-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/plugins/dev-create/templates/typescript-plugin/template/src/blockly-env.d.ts b/plugins/dev-create/templates/typescript-plugin/template/src/blockly-env.d.ts
new file mode 100644
index 0000000000..cf7b656651
--- /dev/null
+++ b/plugins/dev-create/templates/typescript-plugin/template/src/blockly-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/plugins/dev-create/templates/typescript-theme/template/src/blockly-env.d.ts b/plugins/dev-create/templates/typescript-theme/template/src/blockly-env.d.ts
new file mode 100644
index 0000000000..cf7b656651
--- /dev/null
+++ b/plugins/dev-create/templates/typescript-theme/template/src/blockly-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/plugins/dev-scripts/config/blockly-env.d.ts b/plugins/dev-scripts/config/blockly-env.d.ts
new file mode 100644
index 0000000000..b8fb25fe30
--- /dev/null
+++ b/plugins/dev-scripts/config/blockly-env.d.ts
@@ -0,0 +1,59 @@
+declare module '*.avif' {
+ const src: string;
+ export default src;
+ }
+
+ declare module '*.bmp' {
+ const src: string;
+ export default src;
+ }
+
+ declare module '*.cur' {
+ const src: string;
+ export default src;
+ }
+
+ declare module '*.gif' {
+ const src: string;
+ export default src;
+ }
+
+ declare module '*.jpg' {
+ const src: string;
+ export default src;
+ }
+
+ declare module '*.jpeg' {
+ const src: string;
+ export default src;
+ }
+
+ declare module '*.png' {
+ const src: string;
+ export default src;
+ }
+
+ declare module '*.svg' {
+ const src: string;
+ export default src;
+ }
+
+ declare module '*.webp' {
+ const src: string;
+ export default src;
+ }
+
+ declare module '*.mp3' {
+ const src: string;
+ export default src;
+ }
+
+ declare module '*.ogg' {
+ const src: string;
+ export default src;
+ }
+
+ declare module '*.wav' {
+ const src: string;
+ export default src;
+ }
diff --git a/plugins/dev-scripts/config/webpack.config.js b/plugins/dev-scripts/config/webpack.config.js
index d1a8726910..85307de1a0 100644
--- a/plugins/dev-scripts/config/webpack.config.js
+++ b/plugins/dev-scripts/config/webpack.config.js
@@ -98,6 +98,10 @@ module.exports = (env) => {
use: [require.resolve('source-map-loader')],
enforce: 'pre',
},
+ {
+ test: /\.(avif|bmp|cur|gif|jpe?g|png|svg|webp|mp3|ogg|wav)$/,
+ type: 'asset/inline',
+ },
isTypescript && {
test: /\.tsx?$/,
loader: require.resolve('ts-loader'),
diff --git a/plugins/dev-scripts/package.json b/plugins/dev-scripts/package.json
index b36be7a3db..0fd4cb3202 100644
--- a/plugins/dev-scripts/package.json
+++ b/plugins/dev-scripts/package.json
@@ -51,6 +51,7 @@
"access": "public",
"registry": "https://wombat-dressing-room.appspot.com"
},
+ "types": "./config/blockly-env.d.ts",
"eslintConfig": {
"extends": "@blockly/eslint-config"
},
diff --git a/plugins/eslint-config/index.js b/plugins/eslint-config/index.js
index 801853fd13..1fbdbdb153 100644
--- a/plugins/eslint-config/index.js
+++ b/plugins/eslint-config/index.js
@@ -219,6 +219,8 @@ module.exports = {
{'accessibility': 'no-public'}],
'@typescript-eslint/no-require-imports': 'error',
'@typescript-eslint/semi': ['error', 'always'],
+ 'spaced-comment': ['error', 'always',
+ {'markers': ['/']}],
},
},
],
diff --git a/plugins/workspace-backpack/src/backpack.ts b/plugins/workspace-backpack/src/backpack.ts
index 1f7ffb47da..ff7c3a29e8 100644
--- a/plugins/workspace-backpack/src/backpack.ts
+++ b/plugins/workspace-backpack/src/backpack.ts
@@ -13,6 +13,9 @@
import * as Blockly from 'blockly/core';
+import backpackSvgDataUri from '../media/backpack.svg';
+import backpackFilledSvgDataUri from '../media/filled_backpack.svg';
+
import {registerContextMenus} from './backpack_helpers';
import {BackpackOptions, parseOptions} from './options';
import {BackpackChange, BackpackOpen} from './ui_events';
@@ -744,71 +747,6 @@ export class Backpack extends Blockly.DragTarget implements
}
}
-/**
- * Base64 encoded data uri for backpack icon.
- */
-const backpackSvgDataUri =
- 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC' +
- '9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0cHgiIH' +
- 'ZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0cHgiIGZpbGw9IiM0NTVBNjQiPjxnPjxyZW' +
- 'N0IGZpbGw9Im5vbmUiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCIvPjwvZz48Zz48Zy8+PGc+PH' +
- 'BhdGggZD0iTTEzLjk3LDUuMzRDMTMuOTgsNS4yMywxNCw1LjEyLDE0LDVjMC0xLjEtMC45LT' +
- 'ItMi0ycy0yLDAuOS0yLDJjMCwwLjEyLDAuMDIsMC4yMywwLjAzLDAuMzRDNy42OSw2LjE1LD' +
- 'YsOC4zOCw2LDExdjggYzAsMS4xLDAuOSwyLDIsMmg4YzEuMSwwLDItMC45LDItMnYtOEMxOC' +
- 'w4LjM4LDE2LjMxLDYuMTUsMTMuOTcsNS4zNHogTTExLDVjMC0wLjU1LDAuNDUtMSwxLTFzMS' +
- 'wwLjQ1LDEsMSBjMCwwLjAzLTAuMDEsMC4wNi0wLjAyLDAuMDlDMTIuNjYsNS4wMywxMi4zNC' +
- 'w1LDEyLDVzLTAuNjYsMC4wMy0wLjk4LDAuMDlDMTEuMDEsNS4wNiwxMSw1LjAzLDExLDV6IE' +
- '0xNiwxM3YxdjAuNSBjMCwwLjI4LTAuMjIsMC41LTAuNSwwLjVTMTUsMTQuNzgsMTUsMTQuNV' +
- 'YxNHYtMUg4di0xaDdoMVYxM3oiLz48L2c+PC9nPjwvc3ZnPg==';
-
-/**
- * Base64 encoded data uri for backpack icon when filled.
- */
-const backpackFilledSvgDataUri = 'data:image/svg+xml;base64,PD94bWwgdmVyc2' +
- 'lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYX' +
- 'RlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2Zw' +
- 'ogICB3aWR0aD0iMjQiCiAgIGhlaWdodD0iMjQiCiAgIHZpZXdCb3g9IjAgMCAyNCAyNCIKIC' +
- 'AgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnNSIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3' +
- 'JnLzIwMDAvc3ZnIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj' +
- '4KICA8ZGVmcwogICAgIGlkPSJkZWZzMiIgLz4KICA8ZwogICAgIGlkPSJsYXllcjEiPgogIC' +
- 'AgPGcKICAgICAgIHN0eWxlPSJmaWxsOiM0NTVhNjQiCiAgICAgICBpZD0iZzg0OCIKICAgIC' +
- 'AgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjY0NTgzMzMsMCwwLDAuMjY0NTgzMzMsOC44MjQ5OT' +
- 'k3LDguODI0OTk5NykiPgogICAgICA8ZwogICAgICAgICBpZD0iZzgyNiI+CiAgICAgICAgPH' +
- 'JlY3QKICAgICAgICAgICBmaWxsPSJub25lIgogICAgICAgICAgIGhlaWdodD0iMjQiCiAgIC' +
- 'AgICAgICAgd2lkdGg9IjI0IgogICAgICAgICAgIGlkPSJyZWN0ODI0IgogICAgICAgICAgIH' +
- 'g9IjAiCiAgICAgICAgICAgeT0iMCIgLz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgIC' +
- 'BpZD0iZzgzNCI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzgyOCIgLz4KICAgICAgIC' +
- 'A8ZwogICAgICAgICAgIGlkPSJnMjIyMyI+CiAgICAgICAgICA8ZwogICAgICAgICAgICAgaW' +
- 'Q9ImcyMTAxNiI+CiAgICAgICAgICAgIDxnCiAgICAgICAgICAgICAgIHN0eWxlPSJmaWxsOi' +
- 'M0NTVhNjQiCiAgICAgICAgICAgICAgIGlkPSJnMTQ5MyIKICAgICAgICAgICAgICAgdHJhbn' +
- 'Nmb3JtPSJtYXRyaXgoMy43Nzk1Mjc2LDAsMCwzLjc3OTUyNzYsLTMzLjM1NDMzLC0zMy4zNT' +
- 'QzMykiPgogICAgICAgICAgICAgIDxnCiAgICAgICAgICAgICAgICAgaWQ9ImcxNDcxIj4KIC' +
- 'AgICAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgICAgICBpZD0icmVjdDE0NjkiCi' +
- 'AgICAgICAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lIgogICAgICAgICAgICAgICAgIC' +
- 'AgZD0iTSAwLDAgSCAyNCBWIDI0IEggMCBaIiAvPgogICAgICAgICAgICAgIDwvZz4KICAgIC' +
- 'AgICAgICAgICA8ZwogICAgICAgICAgICAgICAgIGlkPSJnMTQ3OSI+CiAgICAgICAgICAgIC' +
- 'AgICA8ZwogICAgICAgICAgICAgICAgICAgaWQ9ImcxNDczIiAvPgogICAgICAgICAgICAgIC' +
- 'AgPGcKICAgICAgICAgICAgICAgICAgIGlkPSJnMTQ3NyI+CiAgICAgICAgICAgICAgICAgID' +
- 'xwYXRoCiAgICAgICAgICAgICAgICAgICAgIGlkPSJwYXRoMTQ3NSIKICAgICAgICAgICAgIC' +
- 'AgICAgICAgZD0ibSAxMiwzIGMgLTEuMSwwIC0yLDAuOSAtMiwyIDAsMC4xMiAwLjAxOTMsMC' +
- '4yMjk4NDM4IDAuMDI5MywwLjMzOTg0MzggQyA3LjY4OTI5NjUsNi4xNDk4NDMzIDYsOC4zOC' +
- 'A2LDExIHYgOCBjIDAsMS4xIDAuOSwyIDIsMiBoIDggYyAxLjEsMCAyLC0wLjkgMiwtMiBWID' +
- 'ExIEMgMTgsOC4zOCAxNi4zMTA3MDMsNi4xNDk4NDMzIDEzLjk3MDcwMyw1LjMzOTg0MzggMT' +
- 'MuOTgwNzAzLDUuMjI5ODQzOCAxNCw1LjEyIDE0LDUgMTQsMy45IDEzLjEsMyAxMiwzIFogbS' +
- 'AwLDEgYyAwLjU1LDAgMSwwLjQ1IDEsMSAwLDAuMDMgLTAuMDA5NSwwLjA1OTg0NCAtMC4wMT' +
- 'k1MywwLjA4OTg0NCBDIDEyLjY2MDQ2OSw1LjAyOTg0MzggMTIuMzQsNSAxMiw1IDExLjY2LD' +
- 'UgMTEuMzM5NTMxLDUuMDI5ODQzOCAxMS4wMTk1MzEsNS4wODk4NDM4IDExLjAwOTUzMSw1Lj' +
- 'A1OTg0MzggMTEsNS4wMyAxMSw1IDExLDQuNDUgMTEuNDUsNCAxMiw0IFogbSAtMy40NzI2NT' +
- 'YyLDYuMzk4NDM4IGggMS4xNTYyNSB2IDIuNjQwNjI0IGggMC4zMDkzMzU0IGwgLTIuMzdlLT' +
- 'UsLTEuMTcxMTQ2IDEuMDgyNzEwNSwtMTBlLTcgMC4wMTEsMS4xNzExNDYgaCAwLjMzMzMwNC' +
- 'BsIC0wLjAzNTA0LC0yLjU4NzMxNSBoIDAuNTc4MTI1IDAuNTc4MTI1IGwgMC4wMTEwNSwyLj' +
- 'U4NzMxNSBoIDAuMzU2MDI0IFYgMTIuMDYwNTQ3IEggMTQuMDYyNSB2IDAuOTc4NTE1IGggMC' +
- '4zMzAwNzggdiAtMi41NTI3MzQgaCAxLjE1NjI1IHYgMi41NTI3MzQgaCAwLjk2Njc5NyB2ID' +
- 'AuMzU3NDIyIEggOS42ODM1OTM4IDguNTI3MzQzOCA3LjYwMzUxNTYgdiAtMC4zNTc0MjIgaC' +
- 'AwLjkyMzgyODIgeiIKICAgICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgID' +
- 'wvZz4KICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgIDwvZz' +
- '4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=';
-
Blockly.Css.register(`
.blocklyBackpack {
opacity: 0.4;
diff --git a/plugins/workspace-backpack/src/blockly-env.d.ts b/plugins/workspace-backpack/src/blockly-env.d.ts
new file mode 100644
index 0000000000..cf7b656651
--- /dev/null
+++ b/plugins/workspace-backpack/src/blockly-env.d.ts
@@ -0,0 +1 @@
+///