diff --git a/.nvmrc b/.nvmrc index 17719ce25..1117d417c 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18.20.4 +18.20.5 diff --git a/package-lock.json b/package-lock.json index 012dbc812..68c3db5da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -88,7 +88,7 @@ "minilog": "2.1.0", "pako": "0.2.8", "plotly.js": "1.47.4", - "postcss": "8.4.47", + "postcss": "8.4.49", "postcss-import": "12.0.1", "postcss-loader": "4.3.0", "postcss-simple-vars": "5.0.2", @@ -109,10 +109,10 @@ "redux-mock-store": "1.5.5", "redux-thunk": "2.4.2", "regenerator-runtime": "0.13.9", - "sass": "1.80.6", + "sass": "1.81.0", "sass-loader": "10.5.2", - "scratch-gui": "4.1.2", - "scratch-l10n": "4.0.22", + "scratch-gui": "4.1.5", + "scratch-l10n": "4.0.34", "selenium-webdriver": "4.26.0", "slick-carousel": "1.8.1", "stream-browserify": "3.0.0", @@ -370,9 +370,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dev": true, "license": "MIT", "dependencies": { @@ -5523,14 +5523,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", + "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -5552,13 +5552,13 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5814,9 +5814,9 @@ "license": "MIT" }, "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", "dev": true, "license": "MIT" }, @@ -6551,9 +6551,9 @@ "license": "MIT" }, "node_modules/caniuse-lite": { - "version": "1.0.30001679", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001679.tgz", - "integrity": "sha512-j2YqID/YwpLnKzCmBOS4tlZdWprXm3ZmQLBH9ZBXFOhoxLA46fwyBvx6toCBWBmnuwUY/qB3kEU6gFx8qgCroA==", + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", "dev": true, "funding": [ { @@ -8976,9 +8976,9 @@ } }, "node_modules/dompurify": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.7.tgz", - "integrity": "sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.0.tgz", + "integrity": "sha512-AMdOzK44oFWqHEi0wpOqix/fUNY707OmoeFDnbi3Q5I8uOpy21ufUA5cDJPr0bosxrflOVD/H2DMSvuGKJGfmQ==", "dev": true, "license": "(MPL-2.0 OR Apache-2.0)" }, @@ -9246,9 +9246,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.55", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.55.tgz", - "integrity": "sha512-6maZ2ASDOTBtjt9FhqYPRnbvKU5tjG0IN9SztUOWYw2AzNDNpKJYLJmlK0/En4Hs/aiWnB+JZ+gW19PIGszgKg==", + "version": "1.5.62", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.62.tgz", + "integrity": "sha512-t8c+zLmJHa9dJy96yBZRXGQYoiCEnHYgFwn1asvSPZSUdVxnB62A4RASd7k41ytG3ErFBA0TpHlKg9D9SQBmLg==", "dev": true, "license": "ISC" }, @@ -9523,9 +9523,9 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", @@ -9543,7 +9543,7 @@ "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", @@ -9559,10 +9559,10 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", + "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", @@ -11004,9 +11004,9 @@ } }, "node_modules/flow-remove-types": { - "version": "2.252.0", - "resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.252.0.tgz", - "integrity": "sha512-Vv3p2UjixHt2ISJJUwbGmXA104uegB79eEGuqr5uOlJDD7JdiZgR2jH+Mxqaq1gRQXBenHKGgRVLJkgtKn98DQ==", + "version": "2.253.0", + "resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.253.0.tgz", + "integrity": "sha512-4L1X1FZE08AOe9SMyqFhyl+TSM6L+tHbVBfIMQsZHduPUwnTuIs5jfVyz35bRAS67k2c1e14qSosgYVi+Uuj1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -12093,9 +12093,9 @@ } }, "node_modules/gl-text/node_modules/regl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/regl/-/regl-2.1.0.tgz", - "integrity": "sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/regl/-/regl-2.1.1.tgz", + "integrity": "sha512-+IOGrxl3FZ8ZM9ixCWQZzFRiRn7Rzn9bu3iFHwg/yz4tlOUQgbO4PHLgG+1ZT60zcIV8tief6Qrmyl8qcoJP0g==", "dev": true, "license": "MIT" }, @@ -13304,9 +13304,9 @@ "license": "MIT" }, "node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.2.tgz", + "integrity": "sha512-1NU7hWZDkV7hJ4PJ9dur9gTNQ4ePNPN4k9/0YhwjzykTi/+3Q5pF93YU5QoVj8BuOnhLgaY8gs0U2pj4kSYVcw==", "dev": true, "license": "MIT" }, @@ -19359,9 +19359,9 @@ } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -19380,7 +19380,7 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -19506,14 +19506,14 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", + "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", "dev": true, "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -19524,13 +19524,13 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "dev": true, "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -19556,9 +19556,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21905,14 +21905,14 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.80.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.6.tgz", - "integrity": "sha512-ccZgdHNiBF1NHBsWvacvT5rju3y1d/Eu+8Ex6c21nHp2lZGLBEtuwc415QfiI1PJa1TpCo3iXwwSRjRpn2Ckjg==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.81.0.tgz", + "integrity": "sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA==", "dev": true, "license": "MIT", "dependencies": { "chokidar": "^4.0.0", - "immutable": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -22068,9 +22068,9 @@ } }, "node_modules/scratch-audio": { - "version": "1.0.310", - "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-1.0.310.tgz", - "integrity": "sha512-4CrTZ8Lcw8InfodNz6btNNfQ9QtjTZ1ZiuyZ7N9V8Wwe3fmcWn/Kffq/fqLRN9C41nhmsJSQZ2v+Nb3jRGKo9w==", + "version": "1.0.320", + "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-1.0.320.tgz", + "integrity": "sha512-wZwgxXqAzqv/NN+Ps/NbLn1xWyvjGrYirumcflzDuQbIJxxj8CXF0ChN029S1ydFWbHodsKLRxICgF5yfX5HXQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -22192,9 +22192,9 @@ } }, "node_modules/scratch-gui": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-4.1.2.tgz", - "integrity": "sha512-uS7qTAAMF6vjiyN0c+sHqrSGFOR3mA5T2fb1dl4nwWNEKYNGXQnRayjEzpOKL8Foo5uBOg4Qigf1mV3BRu/iiA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-4.1.5.tgz", + "integrity": "sha512-+UQ2ARJQRn4GKEAZH2GDaaC1zmlACFBDcPWMRXfMfbJlIIhGlfaDOVVpZR3ftSfeDuRO9RfA0x5jhkaN2qlIhw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -22461,9 +22461,9 @@ } }, "node_modules/scratch-l10n": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-4.0.22.tgz", - "integrity": "sha512-bhIy0FM+2gCcdNrifnuXskevSf90wyjdDnsm7XGr+jMMLyws75+Vo5p36LNZwvxztrFbQ21toNopl9f9VVw95w==", + "version": "4.0.34", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-4.0.34.tgz", + "integrity": "sha512-sO/KcFdLVZT+zRmp/CGUvYYIGd2f1csXSmhHvaHSeumh6CY83nv0YDqd3zOLRmoomW0MgoxrlKIH8WUqWSNSNg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -22477,9 +22477,9 @@ } }, "node_modules/scratch-paint": { - "version": "2.2.487", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-2.2.487.tgz", - "integrity": "sha512-qwlv2snJPRXTAKLlU9Dsd3ncVE6S7rvqo1we7CFDraaQIfxMeajaMOMp5jwOoBGdoOdyYlKiPo/1PNmjzqaQyw==", + "version": "2.2.498", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-2.2.498.tgz", + "integrity": "sha512-Xe4gOaLm317ngGjpG4FNDWjysHsBEf/h0ypGKAlCnRoqeEXmTMgoM68qisgBNV9gNWZ7/fwciv1bdDcQ9ovSmg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -22545,9 +22545,9 @@ } }, "node_modules/scratch-render": { - "version": "1.2.90", - "resolved": "https://registry.npmjs.org/scratch-render/-/scratch-render-1.2.90.tgz", - "integrity": "sha512-pcbNQd/473r5wGa3GTBgz7r+J9G5s3iWw0v55rEq27KvmdZKiIgD9/EWowbrrPu5rlJMQ5BaRaRJfXxqbeIJsw==", + "version": "1.2.104", + "resolved": "https://registry.npmjs.org/scratch-render/-/scratch-render-1.2.104.tgz", + "integrity": "sha512-hDGfW0AsWWKmW7XALjNqdS3C7gsdpC02GL4qfDRBNIkNrcB5QvOFOlvWQaEFDPE879a5EST77Us3e3mk5/zFeg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -22565,9 +22565,9 @@ } }, "node_modules/scratch-render-fonts": { - "version": "1.0.123", - "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.123.tgz", - "integrity": "sha512-sAMxwwAg7fP0T73U7Fs8/u7wHHFtiV62MykGrTf0SzJXOGx4xu4illVKKa/CyYh6Kh2fsgSyucNdkD2zHi2x2Q==", + "version": "1.0.126", + "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.126.tgz", + "integrity": "sha512-XBK88BjPMdBK1MOIKafGibCaSaoPj2sueu1QglRL2WFKy6y66v830TTfE1ugHK5RCXCbDFx7iJV1QOgJqkSFHw==", "dev": true, "dependencies": { "base64-loader": "^1.0.0" @@ -22597,9 +22597,9 @@ "dev": true }, "node_modules/scratch-sb1-converter": { - "version": "1.0.303", - "resolved": "https://registry.npmjs.org/scratch-sb1-converter/-/scratch-sb1-converter-1.0.303.tgz", - "integrity": "sha512-HJGH6xJXyThzzuqkSbXzln+2CxC2wpf1lEIUd4WjQD4BG2P3RucQynWM9bDHJA9bZsviyNiKmX3uPhscRdqXqw==", + "version": "1.0.311", + "resolved": "https://registry.npmjs.org/scratch-sb1-converter/-/scratch-sb1-converter-1.0.311.tgz", + "integrity": "sha512-Rz7g05oW+IS60wqEG5y6b/l3R8v/maGpICyqqMzdfNOP1KAkgykBb9+VubYiGm9Sgr9VzphEWpkI79bYEOKPuw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -22657,9 +22657,9 @@ } }, "node_modules/scratch-svg-renderer": { - "version": "2.5.34", - "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-2.5.34.tgz", - "integrity": "sha512-iTdI3Fql7WbeY2Cf4Bsotji5vizNfoDtVb90nLkJaNr4sDof9IP64+0y+p5dEn33r+XDubz9bhf+05U/zkX/Yg==", + "version": "2.5.38", + "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-2.5.38.tgz", + "integrity": "sha512-71MwTICnoAr3l7ytETlORxKUBfRlURLvvHXhPoVLlGhL9t5Byuly/JkxiCglELFzbH8pGnN5rBHR7bzTpD9PkA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -22700,9 +22700,9 @@ "license": "BSD-3-Clause" }, "node_modules/scratch-vm": { - "version": "4.8.79", - "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-4.8.79.tgz", - "integrity": "sha512-2FJssRj9PU47spmvRimoHkBZKneoc3xXoTkxbt1+OJEoVk5nnH6HwO0GcQZa2HmxR32IHjuqcOyqkENRtgapnw==", + "version": "4.8.91", + "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-4.8.91.tgz", + "integrity": "sha512-495Qbqe2XVqjB9/Wz0HpEVwubSVdL74Lrx4pyYvBnoEG4sZ1wWLfWB8ZNzHf16vETZ5U7zDcUayVUacg6e1jdQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -22723,7 +22723,7 @@ "scratch-render": "^1.0.232", "scratch-sb1-converter": "^1.0.0", "scratch-storage": "^2.3.5", - "scratch-svg-renderer": "2.5.34", + "scratch-svg-renderer": "2.5.38", "scratch-translate-extension-languages": "^1.0.0", "text-encoding": "^0.7.0", "uuid": "^8.3.2", @@ -26576,22 +26576,22 @@ "license": "ISC" }, "node_modules/tldts": { - "version": "6.1.60", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.60.tgz", - "integrity": "sha512-TYVHm7G9NCnhgqOsFalbX6MG1Po5F4efF+tLfoeiOGQq48Oqgwcgz8upY2R1BHWa4aDrj28RYx0dkYJ63qCFMg==", + "version": "6.1.61", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.61.tgz", + "integrity": "sha512-rv8LUyez4Ygkopqn+M6OLItAOT9FF3REpPQDkdMx5ix8w4qkuE7Vo2o/vw1nxKQYmJDV8JpAMJQr1b+lTKf0FA==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.60" + "tldts-core": "^6.1.61" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.60", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.60.tgz", - "integrity": "sha512-XHjoxak8SFQnHnmYHb3PcnW5TZ+9ErLZemZei3azuIRhQLw4IExsVbL3VZJdHcLeNaXq6NqawgpDPpjBOg4B5g==", + "version": "6.1.61", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.61.tgz", + "integrity": "sha512-In7VffkDWUPgwa+c9picLUxvb0RltVwTkSgMNFgvlGSWveCzGBemBqTsgJCL4EDFWZ6WH0fKTsot6yNhzy3ZzQ==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index eed5e7ac0..943eafe05 100644 --- a/package.json +++ b/package.json @@ -123,7 +123,7 @@ "minilog": "2.1.0", "pako": "0.2.8", "plotly.js": "1.47.4", - "postcss": "8.4.47", + "postcss": "8.4.49", "postcss-import": "12.0.1", "postcss-loader": "4.3.0", "postcss-simple-vars": "5.0.2", @@ -144,10 +144,10 @@ "redux-mock-store": "1.5.5", "redux-thunk": "2.4.2", "regenerator-runtime": "0.13.9", - "sass": "1.80.6", + "sass": "1.81.0", "sass-loader": "10.5.2", - "scratch-gui": "4.1.2", - "scratch-l10n": "4.0.22", + "scratch-gui": "4.1.5", + "scratch-l10n": "4.0.34", "selenium-webdriver": "4.26.0", "slick-carousel": "1.8.1", "stream-browserify": "3.0.0", diff --git a/src/components/journeys/project-journey/project-journey.scss b/src/components/journeys/common-journey.scss similarity index 66% rename from src/components/journeys/project-journey/project-journey.scss rename to src/components/journeys/common-journey.scss index ad1637e23..3b87c2bb9 100644 --- a/src/components/journeys/project-journey/project-journey.scss +++ b/src/components/journeys/common-journey.scss @@ -1,19 +1,27 @@ -@import "../../../colors"; +@import "../../colors"; +.driver-popover.tutorials-highlight, .driver-popover.project-journey { - display: flex; - flex-direction: column; + display: flex !important; + flex-direction: row-reverse; + justify-content: space-between; + align-items: center; background-color: $ui-purple-dark; + padding: 0.5rem; .driver-popover-close-btn { + display: flex !important; + justify-content: center; + align-items: center; + position: relative; height: 2.5rem; width: 2.5rem; - border-radius: 50%; - margin: 0.5rem; - font-size: 2rem; - font-weight: bold; color: $type-white; - background-color: $ui-purple-dark; + + .close-btn-img { + height: 1.25rem; + width: 1.25rem; + } } .driver-popover-arrow-side-left.driver-popover-arrow { diff --git a/src/components/journeys/driver-journey/driver-journey.jsx b/src/components/journeys/driver-journey/driver-journey.jsx index 965cfecf3..cd404170d 100644 --- a/src/components/journeys/driver-journey/driver-journey.jsx +++ b/src/components/journeys/driver-journey/driver-journey.jsx @@ -20,6 +20,19 @@ const DriverJourney = ({configProps, driverObj}) => { callback(); } const portalData = []; + + const closeButton = document.getElementsByClassName('driver-popover-close-btn')[0]; + if (closeButton) { + closeButton.textContent = ''; + + const closeButtonImage = document.createElement('img'); + closeButtonImage.src = '/svgs/modal/close-x.svg'; + closeButtonImage.className = 'close-btn-img'; + + closeButton.appendChild(closeButtonImage); + closeButton.addEventListener('click', () => driverObj.destroy()); + } + for (const [section, component] of Object.entries( sectionComponents )) { @@ -62,7 +75,8 @@ DriverJourney.propTypes = { }), driverObj: PropTypes.shape({ setConfig: PropTypes.func, - drive: PropTypes.func + drive: PropTypes.func, + destroy: PropTypes.func }) }; diff --git a/src/components/journeys/editor-journey/editor-journey.jsx b/src/components/journeys/editor-journey/editor-journey.jsx index d83a9a8d2..4dd2bcc17 100644 --- a/src/components/journeys/editor-journey/editor-journey.jsx +++ b/src/components/journeys/editor-journey/editor-journey.jsx @@ -3,96 +3,13 @@ const {driver} = require('driver.js'); const FlexRow = require('../../flex-row/flex-row.jsx'); const Button = require('../../forms/button.jsx'); const DriverJourney = require('../driver-journey/driver-journey.jsx'); -const {defineMessages, useIntl} = require('react-intl'); +const {useIntl} = require('react-intl'); const {useMemo, useState, useCallback} = require('react'); const PropTypes = require('prop-types'); const {triggerAnalyticsEvent} = require('../../../lib/onboarding.js'); require('./editor-journey.scss'); -const messages = defineMessages({ - createStepTitle: { - id: 'gui.journey.controls.create', - defaultMessage: 'Create', - description: 'Create step title' - }, - projectGenreStepTitle: { - id: 'gui.journey.controls.choose.projectGenre', - defaultMessage: 'What do you whant to create?', - description: 'Choose project genre step title' - }, - typeStepTitle: { - id: 'gui.journey.controls.choose.type', - defaultMessage: 'Which type?', - description: 'Choose project type step title' - }, - startStepTitle: { - id: 'gui.journey.controls.choose.start', - defaultMessage: 'How do you want to start?', - description: 'Choose way to start step title' - }, - gameButtonText: { - id: 'gui.journey.controls.game', - defaultMessage: 'Game', - description: 'Game button text' - }, - animiationButtonText: { - id: 'gui.journey.controls.animation', - defaultMessage: 'Animation', - description: 'Animation button text' - }, - musicButtonText: { - id: 'gui.journey.controls.music', - defaultMessage: 'Music', - description: 'Music button text' - }, - clickerGameButtonText: { - id: 'gui.journey.controls.game.clicker', - defaultMessage: 'Clicker Game', - description: 'Clicker game button text' - }, - pongGameButtonText: { - id: 'gui.journey.controls.game.pong', - defaultMessage: 'Pong Game', - description: 'Pong game button text' - }, - characterAnimationButtonText: { - id: 'gui.journey.controls.animation.character', - defaultMessage: 'Animate a character', - description: 'Animate a character button text' - }, - flyAnimationButtonText: { - id: 'gui.journey.controls.animation.fly', - defaultMessage: 'Make it fly', - description: 'Make it fly animation button text' - }, - recordSoundButtonText: { - id: 'gui.journey.controls.music.record', - defaultMessage: 'Record a sound', - description: 'Record a sound button text' - }, - makeMusicButtonText: { - id: 'gui.journey.controls.music.make', - defaultMessage: 'Make music', - description: 'Make music button text' - }, - tutorialButtonText: { - id: 'gui.journey.controls.tutorial', - defaultMessage: 'Tutorial', - description: 'Tutorial button text' - }, - starterProjectButtonText: { - id: 'gui.journey.controls.starterProject', - defaultMessage: 'Starter project', - description: 'Starter project button text' - }, - onMyOwnButtonText: { - id: 'gui.journey.controls.onMyOwn', - defaultMessage: 'On my own', - description: 'On my own button text' - } -}); - const STEP_NAMES = [ 'pick-genre-step', 'game-step', @@ -151,18 +68,18 @@ const EditorJourney = ({onActivateDeck, setCanViewTutorialsHighlight, setShowJou editorJourneyStep: editorJourneyStep }); driverObj.moveTo(stepNumber); - }, driverObj); + }, [driverObj]); const createStep = useCallback((projectId, tutorialId) => ({ - title: intl.formatMessage(messages.createStepTitle), + title: intl.formatMessage({id: 'project.journey.controls.create'}), showButtons: ['close'], sectionComponents: { description: { triggerAnalyticsEvent({ event: 'editor-journey-step', @@ -175,7 +92,7 @@ const EditorJourney = ({onActivateDeck, setCanViewTutorialsHighlight, setShowJou }, { imgSrc: '/images/onboarding-journeys/Starter-Projects-Icon.svg', - text: intl.formatMessage(messages.starterProjectButtonText), + text: intl.formatMessage({id: 'project.journey.controls.starterProject'}), handleOnClick: () => { location.href = `/projects/${projectId}?showJourney=true`; setShowJourney(false); @@ -184,7 +101,7 @@ const EditorJourney = ({onActivateDeck, setCanViewTutorialsHighlight, setShowJou }, { imgSrc: '/images/onboarding-journeys/On-Own-Icon.svg', - text: intl.formatMessage(messages.onMyOwnButtonText), + text: intl.formatMessage({id: 'project.journey.controls.onMyOwn'}), handleOnClick: () => { triggerAnalyticsEvent({ event: 'editor-journey-step', @@ -217,25 +134,25 @@ const EditorJourney = ({onActivateDeck, setCanViewTutorialsHighlight, setShowJou }, steps: [{ popover: { - title: intl.formatMessage(messages.createStepTitle), + title: intl.formatMessage({id: 'project.journey.controls.create'}), showButtons: ['close'], sectionComponents: { description: pickStep(1, 'Games') }, { imgSrc: '/images/onboarding-journeys/Animation-Icon.svg', - text: intl.formatMessage(messages.animiationButtonText), + text: intl.formatMessage({id: 'project.journey.controls.animation'}), handleOnClick: () => pickStep(2, 'Animation') }, { imgSrc: '/images/onboarding-journeys/Music-Icon.svg', - text: intl.formatMessage(messages.musicButtonText), + text: intl.formatMessage({id: 'project.journey.controls.music'}), handleOnClick: () => pickStep(3, 'Music') } ]} @@ -245,20 +162,20 @@ const EditorJourney = ({onActivateDeck, setCanViewTutorialsHighlight, setShowJou }, { popover: { - title: intl.formatMessage(messages.createStepTitle), + title: intl.formatMessage({id: 'project.journey.controls.create'}), showButtons: ['close'], sectionComponents: { description: pickStep(4, 'Clicker-Game') }, { imgSrc: '/images/onboarding-journeys/Pong-Game.jpg', - text: intl.formatMessage(messages.pongGameButtonText), + text: intl.formatMessage({id: 'project.journey.controls.game.pong'}), handleOnClick: () => pickStep(5, 'Pong-Game') } ]} @@ -268,20 +185,20 @@ const EditorJourney = ({onActivateDeck, setCanViewTutorialsHighlight, setShowJou }, { popover: { - title: intl.formatMessage(messages.createStepTitle), + title: intl.formatMessage({id: 'project.journey.controls.create'}), showButtons: ['close'], sectionComponents: { description: pickStep(6, 'Character-Animation') }, { imgSrc: '/images/onboarding-journeys/Fly-Animation.jpg', - text: intl.formatMessage(messages.flyAnimationButtonText), + text: intl.formatMessage({id: 'project.journey.controls.animation.fly'}), handleOnClick: () => pickStep(7, 'Fly-Animation') } ]} @@ -291,20 +208,20 @@ const EditorJourney = ({onActivateDeck, setCanViewTutorialsHighlight, setShowJou }, { popover: { - title: intl.formatMessage(messages.createStepTitle), + title: intl.formatMessage({id: 'project.journey.controls.create'}), showButtons: ['close'], sectionComponents: { description: pickStep(8, 'Record-Music') }, { imgSrc: '/images/onboarding-journeys/Make-Music.jpg', - text: intl.formatMessage(messages.makeMusicButtonText), + text: intl.formatMessage({id: 'project.journey.controls.music.make'}), handleOnClick: () => pickStep(9, 'Make-Music') } ]} diff --git a/src/components/journeys/editor-journey/editor-journey.scss b/src/components/journeys/editor-journey/editor-journey.scss index c20aaf9c9..6ecb5ba12 100644 --- a/src/components/journeys/editor-journey/editor-journey.scss +++ b/src/components/journeys/editor-journey/editor-journey.scss @@ -2,7 +2,6 @@ @import "../../../frameless"; .driver-popover.gui-journey { - font-family: "Helvetica Neue", "Helvetica", Arial, sans-serif; max-width: unset; padding: 0; border-radius: 15px; @@ -11,20 +10,27 @@ transform: translate(-50%, -50%); .driver-popover-close-btn { + display: flex !important; + justify-content: center; + align-items: center; height: 2.5rem; width: 2.5rem; border-radius: 50%; margin: 0.5rem; - font-size: 2rem; - font-weight: bold; color: $type-white; background-color: $ui-aqua-dark; + + .close-btn-img { + height: 1.25rem; + width: 1.25rem; + } } .driver-popover-title { padding: 1rem 0; font-size: 1rem; font-weight: 700; + font-family: "Helvetica Neue", "Helvetica", Arial, sans-serif; text-align: center; color: $type-white; margin: 0; @@ -35,31 +41,33 @@ .driver-popover-title[style*=block]+.driver-popover-description { margin: 0; } -} -.title { - padding: 1rem 0; - font-size: 1.125rem; - font-family: "Helvetica Neue", "Helvetica", Arial, sans-serif; - font-weight: 400; - text-align: center; - color: $type-gray; - background-color: $ui-light-primary; -} - -.description-wrapper { - flex-direction: row; - justify-content: space-evenly; - gap: 3rem; - margin: 3rem 4rem; - - .journey-option { - flex-direction: column; - justify-content: center; - gap: 1rem; - - img { - height: $cols2; + .driver-popover-description { + .title { + padding: 1rem 0; + font-size: 1.125rem; + font-family: "Helvetica Neue", "Helvetica", Arial, sans-serif; + font-weight: 400; + text-align: center; + color: $type-gray; + background-color: $ui-light-primary; + } + + .description-wrapper { + flex-direction: row; + justify-content: space-evenly; + gap: 3rem; + margin: 3rem 4rem; + + .journey-option { + flex-direction: column; + justify-content: center; + gap: 1rem; + + img { + height: $cols2; + } + } } } } diff --git a/src/components/journeys/project-journey/project-journey.jsx b/src/components/journeys/project-journey/project-journey.jsx index e91d67898..3e983bbad 100644 --- a/src/components/journeys/project-journey/project-journey.jsx +++ b/src/components/journeys/project-journey/project-journey.jsx @@ -1,23 +1,10 @@ const React = require('react'); const {driver} = require('driver.js'); const DriverJourney = require('../driver-journey/driver-journey.jsx'); -const {defineMessages, useIntl} = require('react-intl'); +const {useIntl} = require('react-intl'); const {useState} = require('react'); const PropTypes = require('prop-types'); -require('./project-journey.scss'); - -const messages = defineMessages({ - playProject: { - id: 'project.journey.play', - defaultMessage: 'Click the green flag to see what this project does.', - description: 'Play project' - }, - remixProject: { - id: 'project.journey.remix', - defaultMessage: 'Make your own version!', - description: 'Remix project' - } -}); +require('../common-journey.scss'); const ProjectJourney = ({setCanViewProjectJourney, setShouldStopProject}) => { const [driverObj] = useState(() => ( @@ -40,7 +27,7 @@ const ProjectJourney = ({setCanViewProjectJourney, setShouldStopProject}) => { }, 8000); }); }, - description: intl.formatMessage(messages.playProject) + description: intl.formatMessage({id: 'project.journey.play'}) } }, { @@ -53,7 +40,7 @@ const ProjectJourney = ({setCanViewProjectJourney, setShouldStopProject}) => { driverObj.destroy(); }); }, - description: intl.formatMessage(messages.remixProject) + description: intl.formatMessage({id: 'project.journey.remix'}) } }]; diff --git a/src/components/journeys/tutorials-highlight/tutorials-highlight.jsx b/src/components/journeys/tutorials-highlight/tutorials-highlight.jsx index 79c2c7e5a..e16f99c9b 100644 --- a/src/components/journeys/tutorials-highlight/tutorials-highlight.jsx +++ b/src/components/journeys/tutorials-highlight/tutorials-highlight.jsx @@ -1,18 +1,10 @@ const React = require('react'); const {driver} = require('driver.js'); const DriverJourney = require('../driver-journey/driver-journey.jsx'); -const {defineMessages, useIntl} = require('react-intl'); +const {useIntl} = require('react-intl'); const PropTypes = require('prop-types'); const {useState} = require('react'); -require('./tutorials-highlight.scss'); - -const messages = defineMessages({ - tutorialsHighlight: { - id: 'gui.highlight.tutorials', - defaultMessage: 'Click here for tutorials', - description: 'Tutorials highlight' - } -}); +require('../common-journey.scss'); const TutorialsHighlight = ({setCanViewTutorialsHighlight}) => { const [driverObj] = useState(() => ( @@ -33,7 +25,7 @@ const TutorialsHighlight = ({setCanViewTutorialsHighlight}) => { }); }, side: 'bottom', - description: intl.formatMessage(messages.tutorialsHighlight) + description: intl.formatMessage({id: 'project.highlight.tutorials'}) } }]; diff --git a/src/components/journeys/tutorials-highlight/tutorials-highlight.scss b/src/components/journeys/tutorials-highlight/tutorials-highlight.scss deleted file mode 100644 index b329b03f0..000000000 --- a/src/components/journeys/tutorials-highlight/tutorials-highlight.scss +++ /dev/null @@ -1,41 +0,0 @@ -@import "../../../colors"; - -.driver-popover.tutorials-highlight { - display: flex; - flex-direction: column; - background-color: $ui-purple-dark; - - .driver-popover-close-btn { - height: 2.5rem; - width: 2.5rem; - border-radius: 50%; - margin: 0.5rem; - font-size: 2rem; - font-weight: bold; - color: $type-white; - background-color: $ui-purple-dark; - } - - .driver-popover-arrow-side-left.driver-popover-arrow { - border-left-color: $ui-purple-dark;; - } - - .driver-popover-arrow-side-right.driver-popover-arrow { - border-right-color: $ui-purple-dark;; - } - - .driver-popover-arrow-side-top.driver-popover-arrow { - border-top-color: $ui-purple-dark;; - } - - .driver-popover-arrow-side-bottom.driver-popover-arrow { - border-bottom-color: $ui-purple-dark;; - } - - .driver-popover-description { - color: $ui-white; - font-size: 1rem; - font-weight: 700; - font-family: "Helvetica Neue", "Helvetica", Arial, sans-serif; - } -} \ No newline at end of file diff --git a/src/components/welcome/welcome.jsx b/src/components/welcome/welcome.jsx index 2028aea8b..1606a229c 100644 --- a/src/components/welcome/welcome.jsx +++ b/src/components/welcome/welcome.jsx @@ -1,5 +1,6 @@ const PropTypes = require('prop-types'); const React = require('react'); +const {shouldDisplayOnboarding} = require('../../lib/onboarding.js'); const Box = require('../box/box.jsx'); @@ -19,11 +20,23 @@ const Welcome = props => ( >

- + {props.messages['welcome.learn']}

- + Get Started !isBanned(user); const calculateAgeGroup = (birthYear, birthMonth) => { + if (!birthMonth || !birthYear) { + return '[unset]'; + } + const today = new Date(); - let age = today.getFullYear() - parseInt(birthYear, 10); - const monthDiff = today.getMonth() + 1 - parseInt(birthMonth, 10); + let age = today.getFullYear() - birthYear; + const monthDiff = today.getMonth() + 1 - birthMonth; + if (monthDiff < 0) { age--; } @@ -71,6 +76,8 @@ export const triggerAnalyticsEvent = eventVaribles => { }; export const sendUserProperties = (user, permissions) => { + window.dataLayer = window.dataLayer || []; + if (!isUserEligible(user, permissions)) { window.dataLayer.push({ testGroup: null, @@ -80,8 +87,6 @@ export const sendUserProperties = (user, permissions) => { return; } - window.dataLayer = window.dataLayer || []; - const {gender, birthYear, birthMonth} = user; window.dataLayer.push({ diff --git a/src/views/preview/l10n.json b/src/views/preview/l10n.json index e54594781..64febb77c 100644 --- a/src/views/preview/l10n.json +++ b/src/views/preview/l10n.json @@ -48,5 +48,24 @@ "project.usernameBlockAlert": "This project can detect who is using it, through the \"username\" block. To hide your identity, sign out before using the project.", "project.inappropriateUpdate": "Hmm...the bad word detector thinks there is a problem with your text. Please change it and remember to be respectful.", "project.mutedAddToStudio": "You will be able to add to studios again {inDuration}.", - "project.cloudDataAndVideoAlert": "For privacy reasons, cloud variables have been disabled in this project because it contains video sensing blocks." + "project.cloudDataAndVideoAlert": "For privacy reasons, cloud variables have been disabled in this project because it contains video sensing blocks.", + "project.journey.controls.create": "Create", + "project.journey.controls.choose.projectGenre": "What do you want to create?", + "project.journey.controls.choose.type": "Which type?", + "project.journey.controls.choose.start": "How do you want to start?", + "project.journey.controls.game": "Game", + "project.journey.controls.animation": "Animation", + "project.journey.controls.music": "Music", + "project.journey.controls.game.clicker": "Clicker Game", + "project.journey.controls.game.pong": "Pong Game", + "project.journey.controls.animation.character": "Animate a character", + "project.journey.controls.animation.fly": "Make it fly", + "project.journey.controls.music.record": "Record a sound", + "project.journey.controls.music.make": "Make music", + "project.journey.controls.tutorial": "Tutorial", + "project.journey.controls.starterProject": "Starter project", + "project.journey.controls.onMyOwn": "On my own", + "project.highlight.tutorials": "Click here for tutorials", + "project.journey.play": "Click the green flag to see what this project does.", + "project.journey.remix": "Make your own version!" } diff --git a/src/views/splash/presentation.jsx b/src/views/splash/presentation.jsx index 3128b9c50..90296fe91 100644 --- a/src/views/splash/presentation.jsx +++ b/src/views/splash/presentation.jsx @@ -418,6 +418,8 @@ class SplashPresentation extends React.Component { // eslint-disable-line react/ onDismiss={() => { // eslint-disable-line react/jsx-no-bind this.props.onDismiss('welcome'); }} + permissions={this.props.permissions} + user={this.props.user} /> ] : [ ({ isAdmin: state.permissions.admin, isEducator: state.permissions.educator, loved: state.splash.loved.rows, + permissions: state.permissions, sessionStatus: state.session.status, shared: state.splash.shared.rows, studios: state.splash.studios.rows,