diff --git a/package-lock.json b/package-lock.json index 480c86973..22f9b941d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,9 +45,9 @@ } }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "optional": true }, @@ -62,15 +62,15 @@ } }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.0.tgz", + "integrity": "sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q==", "dev": true, "optional": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -95,9 +95,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", + "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", "dev": true, "optional": true }, @@ -326,26 +326,26 @@ } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -516,9 +516,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -550,9 +550,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -669,26 +669,26 @@ } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -788,9 +788,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -908,26 +908,26 @@ } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -1027,9 +1027,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -1155,26 +1155,26 @@ } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -4609,9 +4609,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001170", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001170.tgz", - "integrity": "sha512-Dd4d/+0tsK0UNLrZs3CvNukqalnVTRrxb5mcQm8rHL49t7V5ZaTygwXkrq+FB+dVDf++4ri8eJnFEJAB8332PA==", + "version": "1.0.30001177", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001177.tgz", + "integrity": "sha512-6Ld7t3ifCL02jTj3MxPMM5wAYjbo4h/TAQGFTgv1inihP1tWnWp8mxxT4ut4JBEHLbpFXEXJJQ119JCJTBkYDw==", "dev": true }, "canvas-fit": { @@ -15557,9 +15557,9 @@ } }, "node-releases": { - "version": "1.1.67", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", - "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", + "version": "1.1.69", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.69.tgz", + "integrity": "sha512-DGIjo79VDEyAnRlfSqYTsy+yoHd2IOjJiKUozD2MV2D85Vso6Bug56mb9tT/fY5Urt0iqk01H7x+llAruDR2zA==", "dev": true }, "node-sass": { @@ -20527,9 +20527,9 @@ } }, "scratch-blocks": { - "version": "0.1.0-prerelease.20201221034416", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20201221034416.tgz", - "integrity": "sha512-ylaNnIGm6BS9cf7jwmGRzIUBCujl5JdDYYrltxoRBpqSg7GvFkvKwld13XHQNDr5t7Zo4WPB3cfXYhSQ/wINOw==", + "version": "0.1.0-prerelease.20210114034612", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20210114034612.tgz", + "integrity": "sha512-LPMpbEmY82CNFNQAcEYJCrA+qKYgSkUhI+e97T1bxV8PCxeYEo6p2INhPUEc69paDHoiqugIay6q3piMukaPCA==", "dev": true, "requires": { "exports-loader": "0.6.3", @@ -20537,9 +20537,9 @@ } }, "scratch-gui": { - "version": "0.1.0-prerelease.20201221041259", - "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20201221041259.tgz", - "integrity": "sha512-/ZHX3M3YI7+u3WhfnejMkytMjrExvTzzRWB+RbxSouabpRLucqsKxOtTTKkob6B3SjboQXWefQ3pBegKnVLOvQ==", + "version": "0.1.0-prerelease.20210114042314", + "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20210114042314.tgz", + "integrity": "sha512-XnlrtQoDzPg6py78Lyx11m42enkLzEWwl7K+DNHJ/4argxPVry4QH68oCCjUAXBg0VbUU9efmGSltiIA4rxIZw==", "dev": true, "requires": { "arraybuffer-loader": "^1.0.6", @@ -20590,12 +20590,12 @@ "redux": "3.7.2", "redux-throttle": "0.1.1", "scratch-audio": "0.1.0-prerelease.20200528195344", - "scratch-blocks": "0.1.0-prerelease.20201221034416", - "scratch-l10n": "3.10.20201221031502", + "scratch-blocks": "0.1.0-prerelease.20210114034612", + "scratch-l10n": "3.10.20210114031436", "scratch-paint": "0.2.0-prerelease.20201020103914", "scratch-render": "0.1.0-prerelease.20201113223804", "scratch-storage": "1.3.3", - "scratch-svg-renderer": "0.2.0-prerelease.20201019174008", + "scratch-svg-renderer": "0.2.0-prerelease.20210107222546", "scratch-vm": "0.2.0-prerelease.20201125065300", "startaudiocontext": "1.2.1", "style-loader": "^0.23.0", @@ -20636,16 +20636,16 @@ "dev": true }, "browserslist": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", - "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", + "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001165", + "caniuse-lite": "^1.0.30001173", "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.621", + "electron-to-chromium": "^1.3.634", "escalade": "^3.1.1", - "node-releases": "^1.1.67" + "node-releases": "^1.1.69" } }, "chalk": { @@ -20775,9 +20775,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.629", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.629.tgz", - "integrity": "sha512-iSPPJtPvHrMAvYOt+9cdbDmTasPqwnwz4lkP8Dn200gDNUBQOLQ96xUsWXBwXslAo5XxdoXAoQQ3RAy4uao9IQ==", + "version": "1.3.639", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.639.tgz", + "integrity": "sha512-bwl6/U6xb3d3CNufQU9QeO1L32ueouFwW4bWANSwdXR7LVqyLzWjNbynoKNfuC38QFB5Qn7O0l2KLqBkcXnC3Q==", "dev": true }, "file-loader": { @@ -21080,9 +21080,9 @@ } }, "scratch-l10n": { - "version": "3.10.20201221031502", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.10.20201221031502.tgz", - "integrity": "sha512-ETdmV6AC64QNWqaq5YChJ8UKNiVyxlTMs/chzm2mg4Xc2QBGi+1eti0cdwb7E5GVLYRcAcFYk7znFKeFm+t1zQ==", + "version": "3.10.20210114031436", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.10.20210114031436.tgz", + "integrity": "sha512-vbTrYfklSsr//jbx2/JYQqq0vuLV39iEJ20nbr6uxQCbvpagpiqrALxB2X0J98aEiTCccF8IqKcGrUcDGb2uCA==", "dev": true, "requires": { "@babel/cli": "^7.1.2", @@ -21128,6 +21128,20 @@ "requires": { "microee": "0.0.6" } + }, + "scratch-svg-renderer": { + "version": "0.2.0-prerelease.20201019174008", + "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0-prerelease.20201019174008.tgz", + "integrity": "sha512-RF3Zx09Nl+uLTrPD7K4tR6Sqq/JqRTsLVRugohEJ8pGHXshvBh/A4zWx7XmMZHOdEDHunPxpCDHkW2LoMCFioQ==", + "dev": true, + "requires": { + "base64-js": "1.2.1", + "base64-loader": "1.0.0", + "dompurify": "2.1.1", + "minilog": "3.1.0", + "scratch-render-fonts": "1.0.0-prerelease.20200507182347", + "transformation-matrix": "1.15.0" + } } } }, @@ -21212,6 +21226,28 @@ "worker-loader": "^2.0.0" } }, + "scratch-svg-renderer": { + "version": "0.2.0-prerelease.20201019174008", + "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0-prerelease.20201019174008.tgz", + "integrity": "sha512-RF3Zx09Nl+uLTrPD7K4tR6Sqq/JqRTsLVRugohEJ8pGHXshvBh/A4zWx7XmMZHOdEDHunPxpCDHkW2LoMCFioQ==", + "dev": true, + "requires": { + "base64-js": "1.2.1", + "base64-loader": "1.0.0", + "dompurify": "2.1.1", + "minilog": "3.1.0", + "scratch-render-fonts": "1.0.0-prerelease.20200507182347", + "transformation-matrix": "1.15.0" + }, + "dependencies": { + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + } + } + }, "text-encoding": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", @@ -21283,9 +21319,9 @@ } }, "scratch-svg-renderer": { - "version": "0.2.0-prerelease.20201019174008", - "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0-prerelease.20201019174008.tgz", - "integrity": "sha512-RF3Zx09Nl+uLTrPD7K4tR6Sqq/JqRTsLVRugohEJ8pGHXshvBh/A4zWx7XmMZHOdEDHunPxpCDHkW2LoMCFioQ==", + "version": "0.2.0-prerelease.20210107222546", + "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0-prerelease.20210107222546.tgz", + "integrity": "sha512-1cf+QlOIMblQ9z/yVZhrWkgmkOHwcl3BgqB6+aAV8IS6E7yWa2H0Cxundak089pDH47mbSf6PGs/aljjT/bpew==", "dev": true, "requires": { "base64-js": "1.2.1", diff --git a/package.json b/package.json index 2914c36fd..69525e5ad 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "redux-mock-store": "^1.2.3", "redux-thunk": "2.0.1", "sass-loader": "6.0.6", - "scratch-gui": "0.1.0-prerelease.20201221041259", + "scratch-gui": "0.1.0-prerelease.20210114042314", "scratch-l10n": "latest", "selenium-webdriver": "3.6.0", "slick-carousel": "1.6.0", diff --git a/src/components/modal/mute/modal.scss b/src/components/modal/mute/modal.scss index c33d1ca77..16c0f4fa6 100644 --- a/src/components/modal/mute/modal.scss +++ b/src/components/modal/mute/modal.scss @@ -11,10 +11,11 @@ } .mute-step { display: flex; - padding: 48px 16px; + padding: 36px 16px 28px 16px; } .mute-content { padding-top: 16px; + justify-content: flex-start; } .mute-inner-content { padding: 0 32px; @@ -29,7 +30,7 @@ line-height: 2rem; } .mute-bottom-row { - padding-top: 32px; + padding-top: 12px; } .bottom-img { width: 380px; @@ -47,7 +48,7 @@ .mute-nav { display:flex; justify-content: space-between; - padding: 24px 0; + padding: 20px 0; } .back-button { margin-top: 0; diff --git a/src/components/people-grid/people-grid.jsx b/src/components/people-grid/people-grid.jsx index adbbd5473..3ed83f6e3 100644 --- a/src/components/people-grid/people-grid.jsx +++ b/src/components/people-grid/people-grid.jsx @@ -13,7 +13,11 @@ const PeopleGrid = props => ( >
{person.userName ? ( - + ( ); PeopleGrid.propTypes = { + linkToNewTab: PropTypes.bool, people: PropTypes.arrayOf(PropTypes.shape({ name: PropTypes.string, userId: PropTypes.number, @@ -43,4 +48,8 @@ PeopleGrid.propTypes = { })) }; +PeopleGrid.defaultProps = { + linkToNewTab: false +}; + module.exports = PeopleGrid; diff --git a/src/components/world-map/world-map.jsx b/src/components/world-map/world-map.jsx index 986b0f055..5a9781d74 100644 --- a/src/components/world-map/world-map.jsx +++ b/src/components/world-map/world-map.jsx @@ -20,10 +20,7 @@ const WorldMap = props => ( locations: props.countryNames, z: props.colorIndex, text: props.countryData, - hovertemplate: ' %{location} ' + - '
' + - ' %{text:,.0f} ' + - '', + hovertemplate: '%{text}', hoverlabel: { bgcolor: '#FFF', bordercolor: '#5B6671', @@ -38,7 +35,7 @@ const WorldMap = props => ( marker: { line: { color: '#FFFF', - width: 1 + width: .4 } } } diff --git a/src/template.ejs b/src/template.ejs index dc46b019e..afa720981 100644 --- a/src/template.ejs +++ b/src/template.ejs @@ -53,6 +53,9 @@ +
diff --git a/src/views/annual-report/annual-report.jsx b/src/views/annual-report/annual-report.jsx index d0d461071..f174f2b61 100644 --- a/src/views/annual-report/annual-report.jsx +++ b/src/views/annual-report/annual-report.jsx @@ -2,7 +2,6 @@ const bindAll = require('lodash.bindall'); const classNames = require('classnames'); const React = require('react'); const MediaQuery = require('react-responsive').default; -const FormattedHTMLMessage = require('react-intl').FormattedHTMLMessage; const FormattedMessage = require('react-intl').FormattedMessage; const injectIntl = require('react-intl').injectIntl; const intlShape = require('react-intl').intlShape; @@ -52,10 +51,11 @@ const SECTION_NAMES = { }; // Constants used for world map data processing/formatting for use with Plotly -const countryKeys = Object.keys(CountryUsage); -const countryNames = countryKeys.map(key => CountryUsage[key].display); -const countryData = countryKeys.map(key => CountryUsage[key].count); -const colorIndex = countryKeys.map(key => CountryUsage[key]['log count']); +const countryNames = Object.keys(CountryUsage); +const countryData = countryNames.map(key => + `${CountryUsage[key].display}
${CountryUsage[key].count.toLocaleString('en')}` +); +const colorIndex = countryNames.map(key => CountryUsage[key]['log count']); // Create the div given a list of supporter names, // this will contain two columns of names either of equal size @@ -1993,11 +1993,11 @@ class AnnualReport extends React.Component {

- +

- +
@@ -2032,53 +2032,53 @@ class AnnualReport extends React.Component {

- +

- +

- +

- +

{createSupportersLists(Supporters.founding)}
- +

{createSupportersLists(Supporters.creativity)}
- +

{createSupportersLists(Supporters.collaboration)}
- +

{createSupportersLists(Supporters.imagination)}
- +

{createSupportersLists(Supporters.inspiration)}
- +

{createSupportersLists(Supporters.exploration)} @@ -2087,7 +2087,7 @@ class AnnualReport extends React.Component {

- +

{createSupportersLists(Supporters.inKind)}
@@ -2178,6 +2178,7 @@ class AnnualReport extends React.Component {
- +
diff --git a/src/views/annual-report/annual-report.scss b/src/views/annual-report/annual-report.scss index 40657a3c9..bd92becb4 100644 --- a/src/views/annual-report/annual-report.scss +++ b/src/views/annual-report/annual-report.scss @@ -2681,12 +2681,6 @@ p { background-color: $box-shadow-light-gray; } } - - // Would be good to see if this works in RTL... - [dir="rtl"] a { - margin-left: 10px; - margin-right: 0px; - } } } diff --git a/src/views/annual-report/people.json b/src/views/annual-report/people.json index 41089394f..6d60d4873 100644 --- a/src/views/annual-report/people.json +++ b/src/views/annual-report/people.json @@ -255,6 +255,11 @@ "userId": 3714374, "name": "Shruti" }, + { + "userName": "Pandatt", + "userId": 18417774, + "name": "Tracy" + }, { "userName": "starry_sky7", "userId": 61374093, diff --git a/src/views/credits/people.json b/src/views/credits/people.json index f52b0758a..bb73c87cb 100644 --- a/src/views/credits/people.json +++ b/src/views/credits/people.json @@ -234,6 +234,11 @@ "userId": 3714374, "name": "Shruti" }, + { + "userName": "Pandatt", + "userId": 18417774, + "name": "Tracy" + }, { "userName": "shaanmasala", "userId": 29995562, diff --git a/src/views/preview/comment/compose-comment.jsx b/src/views/preview/comment/compose-comment.jsx index a8d97579d..130bd2da1 100644 --- a/src/views/preview/comment/compose-comment.jsx +++ b/src/views/preview/comment/compose-comment.jsx @@ -43,7 +43,8 @@ class ComposeComment extends React.Component { 'isMuted', 'setupMuteExpirationTimeout' ]); - const muteExpiresAtMs = this.props.muteStatus.muteExpiresAt * 1000; // convert to ms + const muteExpiresAtMs = this.props.muteStatus.muteExpiresAt ? + this.props.muteStatus.muteExpiresAt * 1000 : 0, // convert to ms this.state = { message: '', status: ComposeStatus.EDITING, @@ -51,6 +52,7 @@ class ComposeComment extends React.Component { appealId: null, muteOpen: false, muteExpiresAtMs: muteExpiresAtMs, + muteType: this.props.muteStatus.currentMessageType, showWarning: this.props.muteStatus.showWarning ? this.props.muteStatus.showWarning : false }; if (this.isMuted()) { @@ -94,6 +96,7 @@ class ComposeComment extends React.Component { let muteExpiresAtMs = 0; let rejectedStatus = ComposeStatus.REJECTED; let showWarning = false; + let muteType = null; if (body.status && body.status.mute_status) { muteExpiresAtMs = body.status.mute_status.muteExpiresAt * 1000; // convert to ms rejectedStatus = ComposeStatus.REJECTED_MUTE; @@ -101,6 +104,7 @@ class ComposeComment extends React.Component { muteOpen = true; } showWarning = body.status.mute_status.showWarning; + muteType = body.status.mute_status.muteType; this.setupMuteExpirationTimeout(muteExpiresAtMs); } // Note: does not reset the message state @@ -110,6 +114,7 @@ class ComposeComment extends React.Component { appealId: body.appealId, muteOpen: muteOpen, muteExpiresAtMs: muteExpiresAtMs, + muteType: muteType, showWarning: showWarning }); return; @@ -184,13 +189,34 @@ class ComposeComment extends React.Component { getMuteMessageInfo () { // return the ids for the messages that are shown for this mute type - // Note, it will probably be passed a 'type', but right now there's only one // If mute modals have more than one unique "step" we could pass an array of steps - return { - commentType: 'comment.type.disrespectful', - muteStepHeader: 'comment.disrespectful.header', - muteStepContent: ['comment.disrespectful.content1', 'comment.disrespectful.content2'] + const messageInfo = { + pii: { + commentType: 'comment.type.pii', + muteStepHeader: 'comment.pii.header', + muteStepContent: ['comment.pii.content1', 'comment.pii.content2', 'comment.pii.content3'] + }, + unconstructive: { + commentType: 'comment.type.unconstructive', + muteStepHeader: 'comment.unconstructive.header', + muteStepContent: ['comment.unconstructive.content1', 'comment.unconstructive.content2'] + }, + vulgarity: { + commentType: 'comment.type.vulgarity', + muteStepHeader: 'comment.vulgarity.header', + muteStepContent: ['comment.vulgarity.content1', 'comment.vulgar.content2'] + }, + general: { + commentType: 'comment.type.disrespectful', + muteStepHeader: 'comment.disrespectful.header', + muteStepContent: ['comment.disrespectful.content1', 'comment.disrespectful.content2'] + } }; + + if (this.state.muteType && messageInfo[this.state.muteType]) { + return messageInfo[this.state.muteType]; + } + return messageInfo.general; } handleCancel () { @@ -202,6 +228,7 @@ class ComposeComment extends React.Component { }); if (this.props.onCancel) this.props.onCancel(); } + render () { return ( @@ -327,6 +354,7 @@ ComposeComment.propTypes = { muteStatus: PropTypes.shape({ offenses: PropTypes.array, muteExpiresAt: PropTypes.number, + currentMessageType: PropTypes.string, showWarning: PropTypes.bool }), onAddComment: PropTypes.func, diff --git a/src/views/preview/l10n.json b/src/views/preview/l10n.json index 9126193a6..670b5757a 100644 --- a/src/views/preview/l10n.json +++ b/src/views/preview/l10n.json @@ -49,5 +49,18 @@ "comment.type.disrespectful": "Scratch thinks your most recent comment was disrespectful.", "comment.disrespectful.header": "Make sure to be friendly and respectful when using Scratch.", "comment.disrespectful.content1": "The Scratch comment filter thinks your comment was disrespectful.", - "comment.disrespectful.content2": "Remember: There is a person behind every Scratch account and unfriendly comments can really hurt someone's feelings." + "comment.disrespectful.content2": "Remember: There is a person behind every Scratch account and unfriendly comments can really hurt someone's feelings.", + "comment.type.pii": "The Scratch comment filter thought your most recent comment was sharing or asking for private information.", + "comment.pii.header": "Make sure not to share private information on Scratch.", + "comment.pii.content1": "The Scratch comment filter thinks that in your comment, you were sharing or asking for private information.", + "comment.pii.content2": "Things you share on Scratch can be seen by everyone, and can appear in search engines. Private information can be used by other people in harmful ways, so it’s important to keep it private.", + "comment.pii.content3": "This is a serious safety issue.", + "comment.type.unconstructive": "The Scratch comment filter thought your most recent comment was saying something bad about someone’s project.", + "comment.unconstructive.header": "Make sure to be supportive when commenting on other people’s projects", + "comment.unconstructive.content1": "The Scratch comment filter thinks your comment was saying something bad or mean about someone’s project.", + "comment.unconstructive.content2": "If you think something could be better, you can say something you like about the project, and make a suggestion about how to improve it.", + "comment.type.vulgarity": "The Scratch comment filter thought your most recent comment contained a bad word.", + "comment.vulgarity.header": "Make sure to use language that’s appropriate for all ages", + "comment.vulgarity.content1": "The Scratch comment filter thinks your comment contains a bad word.", + "comment.vulgarity.content2": "Scratch has users of all ages, so it’s important to use language that is appropriate for all Scratchers." } diff --git a/src/views/search/search.scss b/src/views/search/search.scss index 07bf1f911..358503caf 100644 --- a/src/views/search/search.scss +++ b/src/views/search/search.scss @@ -152,6 +152,7 @@ $base-bg: $ui-white; background-color: $ui-gray; padding-bottom: 32px; width: 100%; + overflow-anchor: none; .button { display: block; diff --git a/src/views/sec/l10n.json b/src/views/sec/l10n.json index e753d196a..f860ab987 100644 --- a/src/views/sec/l10n.json +++ b/src/views/sec/l10n.json @@ -1,29 +1,72 @@ { "sec.title": "Scratch Education Collaborative", - "sec.intro": "A global network of organizations supporting creative coding", + "sec.intro": "Join a global network of organizations supporting creative coding", + "sec.applyNow": "Apply now!", + "sec.applyBanner": "Applications are open now through March 1st 2021!", "sec.projectsTitle": "Overview", "sec.eligibilityTitle": "Eligibility", "sec.applyTitle": "How do I apply?", - "sec.subscribe": "To receive updates about resources, events, and ideas for supporting families and educators using Scratch, {subscribeLink}", - "sec.subscribeCallToAction": "sign up for our mailing list", - "sec.applyDeadline": "The deadline for applying to the Scratch Education Collaborative is January 10th, 2021", + "sec.applyDeadline": "The deadline for applying to the Scratch Education has been extended to March 1st, 2021", "sec.applyButton": "Click here to apply", - "sec.projectsIntro": "The Scratch Foundation is launching the Scratch Education Collaborative (SEC), to bring together organizations committed to supporting creative coding experiences with a focus on educators, students, and communities historically excluded from computing.", - "sec.projectsIntro2": "In 2021, during the pilot year of the SEC, 5 organizations from across the globe will be selected to share their work, learn from one another, and help to develop best practices and examples for implementing {culturallySustainingLink} creative computing with Scratch.", - "sec.culturallySustaining": "culturally sustaining", - "sec.expectationsFromSec": "What participating organizations can expect from the SEC", - "sec.expectationsFromSecPoint1": "Opportunities to connect with and learn from peer organizations and thought leaders around the globe through virtual workshops", - "sec.expectationsFromSecPoint2": "Support in developing and promoting equity-centered creative coding resources, events, and workshops using Scratch", - "sec.expectationsFromSecPoint3": "Opportunities to connect with and learn from the Scratch Team through workshops and virtual office hours", - "sec.expectationsFromSecPoint4": "Promotion of the organization’s work and impact through Scratch Team social-channels, websites, and newsletters", - "sec.expectationsFromOrgs": "What the SEC expects of participating organizations", - "sec.expectationsFromOrgsPoint1": "Participate in 4-6 virtual workshops or meetings over the course of the year", - "sec.expectationsFromOrgsPoint2": "Support the creation of culturally sustaining Scratch creative coding resources for your community", - "sec.expectationsFromOrgsPoint3": "Host at least one event, tutorial, or professional development activity for your community in 2021", - "sec.expectationsFromOrgsPoint4": "Share best-practices, learnings, and challenges back with the Scratch Foundation and SEC peer organizations", - "sec.eligibilityPoint1": "Participants must be a non-profit organization, public school, school district, university, college, or government entity", - "sec.eligibilityPoint2": "Organizations must be part-of and work with communities historically excluded from computing", - "sec.eligibilityPoint3": "Must be able to dedicate at least one staff person as point of contact for the program", - "sec.eligibilityPrompt": "Wondering if your organization might be a good fit for the pilot year of the Scratch Education Collaborative? {link} to find out more.", - "sec.eligibilityPromptLink": "Read the FAQ" - } + "sec.projectsIntro": "The Scratch Education Collaborative (SEC), with support from Google.org, is building a powerful network of organizations across the world", + "sec.projectsIntroBold": "focused on supporting learners from historically marginalized and underserved communities developing their confidence with creative computing.", + "sec.projectsIntro2": "Up to 10 organizations will be selected in the 2021 pilot year to expand on and support each other's work with historically underrepresented youth including Black, LatinX, and Indigenous Americans, learn from one another, and collaborate with members of the Scratch Foundation, The MIT Media Lab, and other global leaders in creative computing to develop best practices for implementing culturally sustaining creative computing with Scratch.", + "sec.projectsIntro3": "The SEC is a key initiative of the Scratch Foundation. Originating from MIT Media Lab’s Lifelong Kindergarten Group and with over 200 million users, Scratch is the world’s largest and most diverse coding community for children offered free of charge.", + "sec.expectationsFromSec": "As a member of the SEC network, benefits include:", + "sec.expectationsFromSecPoint1": "Connect with and learn from the Scratch Foundation, the MIT Media Lab, and other leading organizations from around the world with experience implementing creative learning with Scratch", + "sec.expectationsFromSecPoint2": "Grow your organization’s capacity through equity-centered professional development", + "sec.expectationsFromSecPoint3": "Collaborate in developing equity-centered creative coding resources, events, and workshops using Scratch for your local community", + "sec.expectationsFromSecPoint4": "Access to seed funding for Scratch and SEC related activities for your local community", + "sec.expectationsFromOrgs": "Join the SEC Network:", + "sec.expectationsFromOrgsPoint1": "Engage in quarterly virtual meetings and workshops with Scratch Foundation and SEC partner organizations over the course of the year", + "sec.expectationsFromOrgsPoint2": "Host at least one creative computing virtual event, tutorial, or professional development activity for your community in 2021", + "sec.expectationsFromOrgsPoint3": "Develop and promote equity-centered creative coding resources, events, and workshops using Scratch for your local community", + "sec.expectationsFromOrgsPoint4": "Share best-practices and innovative creative computing curricula with the Scratch Foundation and SEC community", + "sec.expectationsFromOrgsPoint5": "Promote your organization’s work and impact through Scratch Foundation social-channels, websites, newsletters, and the Scratch Conference", + "sec.expectationsFromOrgsPoint6": "Facilitate a Scratch Day for your community with support from the Scratch Foundation", + "sec.eligibilityPrefix": "Your organization is:", + "sec.eligibilityPoint1": "Primarily focused on supporting traditionally underrepresented youth, including Black, LatinX, and Indigenous Americans in the United States and/or globally", + "sec.eligibilityPoint2": "Directly serving youth through creative learning and/or creative coding initiatives", + "sec.eligibilityPoint3": "Designated as a non-profit, or a school district that has demonstrated a commitment to equitable creative learning practices", + "sec.eligibilityPoint4": "Willing to collaborate with Scratch and the SEC community to develop and utilize creative computing resources that can be shared globally", + "sec.eligibilityPoint5": "Able to engage in quarterly virtual meetings", + "sec.faqHeader": "FAQ", + "sec.faqWhatIs": "What is Creative Learning with Scratch?", + "sec.faqWhatIsAnswer": "Scratch embraces creative learning as an educational approach that supports students in developing as creative thinkers and contributors to their communities. The Creative Learning approach focuses on 4P’s: Projects, Passion, Peers, and Play: providing students with opportunities to work on projects, based on their passions, in collaboration with peers, in a playful spirit (Resnick, 2017).", + "sec.faqWhatIsAnswer2": "To learn more about how the Scratch Foundation and the Lifelong Kindergarten group think about creative learning, visit the {lclLink}.", + "sec.faqLCLWebsite": "Learning Creative Learning website", + "sec.faqWhen": "When does the yearlong program begin and end?", + "sec.faqWhenAnswer": "The SEC program begins the first week of May 2021, and ends in May of 2022.", + "sec.faqUsingScratch": "Do I have to be using Scratch at my organization already?", + "sec.faqUsingScratchAnswer": "No, your organization does not need to already be using Scratch.", + "sec.faqUsingScratchAnswer2": "As a participant in the SEC, you will collaborate in developing and implementing programming and events for your community which incorporate Scratch. It is important that your organization and the community you will support through your work with the SEC has a plan for accessing technology.", + "sec.faqBackground": "Do I need to have a background in computer science?", + "sec.faqBackgroundAnswer": "You do not need to have a background in computer science, or be implementing educational programming in computer science in order to participate in the SEC.", + "sec.faqBackgroundAnswer2": "We encourage the use of Scratch as a creative tool and welcome organizations who are interested in using Scratch in a variety of contexts.", + "sec.faqEligible": "What kinds of organizations can apply to be members of the SEC?", + "sec.faqEligibleAnswer": "Non-profit organizations, public schools, school districts, universities, colleges, and other government entities are all welcome to apply.", + "sec.faqEligibleAnswer2": "The SEC encourages organizations from around the world to apply.", + "sec.faqInternational": "Do you accept international applications?", + "sec.faqInternationalAnswer": "Yes, the SEC is an international community. We welcome applications from organizations around the world.", + "sec.faqEnglish": "Does my organization need to be english-speaking?", + "sec.faqEnglishAnswer": "Your organization does not need to be English-speaking in order to apply.", + "sec.faqEnglishAnswer2": "We do ask that one member of your organization is able to participate in SEC events, which will be run in English.", + "sec.faqHowManyMembers": "How many members of my organization will be required to participate? ", + "sec.faqHowManyMembersAnswer": "Being a member organization requires buy-in from, at minimum, one representative and the Executive director/CEO/or equivalent position. ", + "sec.faqHowManyMembersAnswer2": "One member of your team will be responsible for attending SEC events, and communicating with Scratch Team members and other participating SEC member organizations.", + "sec.faqNotified": "When will I be notified of my acceptance?", + "sec.faqNotifiedAnswer": "You will hear back from us by the first week of April, 2021.", + "sec.faqHours": "How many hours per month should I expect to devote to participating in the SEC?", + "sec.faqHoursAnswer": "You should expect to spend 4-10 hours a month participating in SEC related work.", + "sec.faqVirtual": "Will the program be entirely virtual?", + "sec.faqVirtualAnswer": "All workshops and sessions for the 2021-2022 cohort will be hosted virtually.", + "sec.faqWorkshopLanguage": "The SEC is an international community, what is the primary language that workshops and sessions will be offered in?", + "sec.faqWorkshopLanguageAnswer": "SEC workshops and events will be facilitated in English. ", + "sec.faqCost": "What is the cost of participating in the SEC?", + "sec.faqCostAnswer": "Participating in the SEC is free for all participating organizations.", + "sec.faqCulturallySustaining": "What do we mean by culturally sustaining in the context of education?", + "sec.faqCulturallySustainingAnswer": "Culturally sustaining pedagogy empowers students by creating educational experiences which reaffirm, honor, explore, and extend their culture, heritage and communities (Ladson-Billings, 1994). Scratch and the SEC aims to empower educators and students across the globe through engagement in culturally relevant creative learning practices and creative computing experiences that will lead to culturally sustaining frames of reference and perspective (Hammond, 2015) and support relevant personal connections to Scratch’s and the SEC’s mission and values. ", + "sec.faqFuture": "I cannot participate this year, can I apply in the future? ", + "sec.faqFutureAnswer": "Yes! Join our {subscribeLink} to stay connected and receive future updates about the SEC.", + "sec.faqMailingList": "mailing list" +} \ No newline at end of file diff --git a/src/views/sec/sec.jsx b/src/views/sec/sec.jsx index a594e7f1d..700858559 100644 --- a/src/views/sec/sec.jsx +++ b/src/views/sec/sec.jsx @@ -2,6 +2,7 @@ const FormattedMessage = require('react-intl').FormattedMessage; const React = require('react'); const FlexRow = require('../../components/flex-row/flex-row.jsx'); +const Button = require('../../components/forms/button.jsx'); const SubNavigation = require('../../components/subnavigation/subnavigation.jsx'); const TitleBanner = require('../../components/title-banner/title-banner.jsx'); @@ -24,34 +25,41 @@ const EducationCollaborative = () => ( id="sec.intro" />

+
+ +
- +
+
+

+
+

-

- - - - }} - /> + +   +

+

+

+

@@ -59,7 +67,7 @@ const EducationCollaborative = () => (
  • -
  • +
  • @@ -70,32 +78,23 @@ const EducationCollaborative = () => (
  • +
  • +
  • +

    -
    -

    - - - }} - /> -

    -
    @@ -122,29 +121,82 @@ const EducationCollaborative = () => ( - -
    +
    -

    - - - - ) - }} - /> -

    +

    +
    +
    +
    +
    + + + + ) + }} + /> +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + ) + }} + /> +
    +
    diff --git a/src/views/sec/sec.scss b/src/views/sec/sec.scss index 4ceb96e9d..fc0dbe8a0 100644 --- a/src/views/sec/sec.scss +++ b/src/views/sec/sec.scss @@ -11,7 +11,8 @@ $sec-spot: $ui-blue; .title-banner { &.masthead { background-color: $sec-spot; - padding: 50px 0; + padding: 50px 0 0 0; + margin: 0; .masthead-info { align-items: center; @@ -21,6 +22,10 @@ $sec-spot: $ui-blue; justify-content: end; } + .long { + padding-bottom: 2rem; + } + h1 { margin: 0 0 1rem 0; text-align: left; @@ -33,7 +38,28 @@ $sec-spot: $ui-blue; max-width: $cols6; font-size: 1.65em; } - img { + + .title-banner-button { + background-color: $ui-white; + color: $ui-blue; + font-size: 1rem; + padding: 0.75rem 1rem; + img { + margin-right: 1rem; + height: 1.2rem; + vertical-align: middle; + } + + a { + color: $ui-white; + } + + span { + vertical-align: middle; + } + } + + .title-banner-img { width: $cols4; } @@ -57,8 +83,35 @@ $sec-spot: $ui-blue; max-width: $cols8; } } + + .band { + background: $ui-light-primary; + padding: 0.5rem 0; + + h4.applyBanner { + color: $ui-blue; + } + } + .sec-faq { + margin-top: 3rem; + dl { + dt { + margin-bottom: .25rem; + font-size: 1.1rem; + } + + dd { + margin-bottom: 1.25rem; + margin-left: 0; + max-width: $cols8; + text-align: left; + } + } + } } + + @media #{$intermediate, $medium, $small} { #view { text-align: left; diff --git a/static/images/sec/SEC-Top-img.svg b/static/images/sec/SEC-Top-img.svg deleted file mode 100644 index e1fe4f1f8..000000000 --- a/static/images/sec/SEC-Top-img.svg +++ /dev/null @@ -1,302 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/images/sec/SEC-bottom-image.png b/static/images/sec/SEC-bottom-image.png new file mode 100644 index 000000000..c147ad862 Binary files /dev/null and b/static/images/sec/SEC-bottom-image.png differ diff --git a/static/images/sec/SEC-bottom-img.svg b/static/images/sec/SEC-bottom-img.svg deleted file mode 100644 index 6fdf0d7b8..000000000 --- a/static/images/sec/SEC-bottom-img.svg +++ /dev/null @@ -1,381 +0,0 @@ - - - - -SEC-bottom-img - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/images/sec/SEC-top-image.png b/static/images/sec/SEC-top-image.png new file mode 100644 index 000000000..6127b2afc Binary files /dev/null and b/static/images/sec/SEC-top-image.png differ diff --git a/static/images/sec/apply-icon.svg b/static/images/sec/apply-icon.svg new file mode 100644 index 000000000..c7f08412b --- /dev/null +++ b/static/images/sec/apply-icon.svg @@ -0,0 +1,48 @@ + + + + +Created with Sketch. + + + + + + + + + + + + + + + + + + + + + diff --git a/test/unit/components/compose-comment.test.jsx b/test/unit/components/compose-comment.test.jsx index bd3d6aa63..96ac8606d 100644 --- a/test/unit/components/compose-comment.test.jsx +++ b/test/unit/components/compose-comment.test.jsx @@ -338,4 +338,21 @@ describe('Compose Comment test', () => { expect(commentInstance.isMuted()).toBe(false); global.Date.now = realDateNow; }); + + test('getMuteMessageInfo: muteType set', () => { + const commentInstance = getComposeCommentWrapper({}).instance(); + commentInstance.setState({muteType: 'unconstructive'}); + expect(commentInstance.getMuteMessageInfo().commentType).toBe('comment.type.unconstructive'); + }); + + test('getMuteMessageInfo: muteType not set', () => { + const commentInstance = getComposeCommentWrapper({}).instance(); + expect(commentInstance.getMuteMessageInfo().commentType).toBe('comment.type.disrespectful'); + }); + + test('getMuteMessageInfo: muteType set to something we don\'t have messages for', () => { + const commentInstance = getComposeCommentWrapper({}).instance(); + commentInstance.setState({muteType: 'spaghetti'}); + expect(commentInstance.getMuteMessageInfo().commentType).toBe('comment.type.disrespectful'); + }); });