diff --git a/.gitignore b/.gitignore
index 0b8a0db40..de7972e5e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
# NPM
/node_modules
npm-*
+/package-lock.json
# Testing
/.nyc_output
diff --git a/package.json b/package.json
index 322e17f85..bfea33120 100644
--- a/package.json
+++ b/package.json
@@ -56,7 +56,7 @@
"eslint": "^5.0.1",
"eslint-config-scratch": "^5.0.0",
"eslint-plugin-import": "^2.8.0",
- "eslint-plugin-react": "^7.5.1",
+ "eslint-plugin-react": "7.11.1",
"file-loader": "2.0.0",
"get-float-time-domain-data": "0.1.0",
"get-user-media-promise": "1.1.4",
@@ -104,14 +104,14 @@
"redux-mock-store": "^1.2.3",
"redux-throttle": "0.1.1",
"rimraf": "^2.6.1",
- "scratch-audio": "0.1.0-prerelease.20181023202904",
+ "scratch-audio": "0.1.0-prerelease.20190108181031",
"scratch-blocks": "0.1.0-prerelease.1545364693",
"scratch-l10n": "3.1.20181220222259",
"scratch-paint": "0.2.0-prerelease.20181220194927",
- "scratch-render": "0.1.0-prerelease.20181226153401",
+ "scratch-render": "0.1.0-prerelease.20190108175224",
"scratch-storage": "1.2.2",
"scratch-svg-renderer": "0.2.0-prerelease.20181220183040",
- "scratch-vm": "0.2.0-prerelease.20181226213940",
+ "scratch-vm": "0.2.0-prerelease.20190107184530",
"selenium-webdriver": "3.6.0",
"startaudiocontext": "1.2.1",
"style-loader": "^0.23.0",
diff --git a/src/components/backpack/backpack.css b/src/components/backpack/backpack.css
index 6c3d9fbc2..ad7644c64 100644
--- a/src/components/backpack/backpack.css
+++ b/src/components/backpack/backpack.css
@@ -57,7 +57,7 @@
width: 100%;
height: 100%;
opacity: 0.75;
- background-color: #8cbcff;
+ background-color: $drop-highlight;
transition: all 0.25s ease;
}
diff --git a/src/components/blocks/blocks.css b/src/components/blocks/blocks.css
index e0b07ce26..fd66c68bd 100644
--- a/src/components/blocks/blocks.css
+++ b/src/components/blocks/blocks.css
@@ -13,7 +13,7 @@
width: 100%;
height: 100%;
opacity: 0.75;
- background-color: #8cbcff;
+ background-color: $drop-highlight;
transition: all 0.25s ease;
}
diff --git a/src/components/browser-modal/browser-modal.jsx b/src/components/browser-modal/browser-modal.jsx
index 9afac0e38..95bfe416e 100644
--- a/src/components/browser-modal/browser-modal.jsx
+++ b/src/components/browser-modal/browser-modal.jsx
@@ -32,7 +32,7 @@ const BrowserModal = ({intl, ...props}) => (
{ /* eslint-disable max-len */ }
diff --git a/src/components/sound-editor/sound-editor.css b/src/components/sound-editor/sound-editor.css
index 4a0e03655..279875fc8 100644
--- a/src/components/sound-editor/sound-editor.css
+++ b/src/components/sound-editor/sound-editor.css
@@ -79,6 +79,7 @@ $border-radius: 0.25rem;
font-size: 0.85rem;
transition: 0.2s;
user-select: none;
+ margin: 0px;
}
.button > img {
diff --git a/src/components/sprite-selector/sprite-list.jsx b/src/components/sprite-selector/sprite-list.jsx
index 17ba2dc21..de727969e 100644
--- a/src/components/sprite-selector/sprite-list.jsx
+++ b/src/components/sprite-selector/sprite-list.jsx
@@ -34,62 +34,68 @@ const SpriteList = function (props) {
return (
- {items.map((sprite, index) => {
+
+ {items.map((sprite, index) => {
- // If the sprite has just received a block drop, used for green highlight
- const receivedBlocks = (
- hoveredTarget.sprite === sprite.id &&
+ // If the sprite has just received a block drop, used for green highlight
+ const receivedBlocks = (
+ hoveredTarget.sprite === sprite.id &&
sprite.id !== editingTarget &&
hoveredTarget.receivedBlocks
- );
+ );
- // If the sprite is indicating it can receive block dropping, used for blue highlight
- let isRaised = !receivedBlocks && raised && sprite.id !== editingTarget;
+ // If the sprite is indicating it can receive block dropping, used for blue highlight
+ let isRaised = !receivedBlocks && raised && sprite.id !== editingTarget;
- // A sprite is also raised if a costume or sound is being dragged.
- // Note the absence of the self-sharing check: a sprite can share assets with itself.
- // This is a quirk of 2.0, but seems worth leaving possible, it
- // allows quick (albeit unusual) duplication of assets.
- isRaised = isRaised || [
- DragConstants.COSTUME,
- DragConstants.SOUND,
- DragConstants.BACKPACK_COSTUME,
- DragConstants.BACKPACK_SOUND,
- DragConstants.BACKPACK_CODE].includes(draggingType);
+ // A sprite is also raised if a costume or sound is being dragged.
+ // Note the absence of the self-sharing check: a sprite can share assets with itself.
+ // This is a quirk of 2.0, but seems worth leaving possible, it
+ // allows quick (albeit unusual) duplication of assets.
+ isRaised = isRaised || [
+ DragConstants.COSTUME,
+ DragConstants.SOUND,
+ DragConstants.BACKPACK_COSTUME,
+ DragConstants.BACKPACK_SOUND,
+ DragConstants.BACKPACK_CODE].includes(draggingType);
- return (
-
-
-
- );
- })}
+ return (
+
+
+
+ );
+ })}
+
);
};
diff --git a/src/components/sprite-selector/sprite-selector.css b/src/components/sprite-selector/sprite-selector.css
index 678f61ef4..ffade4750 100644
--- a/src/components/sprite-selector/sprite-selector.css
+++ b/src/components/sprite-selector/sprite-selector.css
@@ -55,6 +55,10 @@
overflow-y: auto;
}
+.scroll-wrapper-dragging {
+ background-color: $drop-highlight;
+}
+
.items-wrapper {
display: flex;
flex-wrap: wrap;
@@ -80,12 +84,12 @@
}
.raised {
- background-color: #8cbcff;
+ background-color: $drop-highlight;
transition: all 0.25s ease;
}
.raised:hover {
- background-color: #8cbcff;
+ background-color: $drop-highlight;
transform: scale(1.05);
}
@@ -94,7 +98,7 @@
animation-duration: 500ms;
animation-iteration-count: 1;
animation-timing-function: ease-in-out;
- background-color: #8cbcff;
+ background-color: $drop-highlight;
}
@keyframes wiggle {
diff --git a/src/components/sprite-selector/sprite-selector.jsx b/src/components/sprite-selector/sprite-selector.jsx
index 981e44b0f..115eaee95 100644
--- a/src/components/sprite-selector/sprite-selector.jsx
+++ b/src/components/sprite-selector/sprite-selector.jsx
@@ -100,20 +100,18 @@ const SpriteSelectorComponent = function (props) {
onChangeY={onChangeSpriteY}
/>
-
- sprites[id])}
- raised={raised}
- selectedId={selectedId}
- onDeleteSprite={onDeleteSprite}
- onDrop={onDrop}
- onDuplicateSprite={onDuplicateSprite}
- onExportSprite={onExportSprite}
- onSelectSprite={onSelectSprite}
- />
-
+ sprites[id])}
+ raised={raised}
+ selectedId={selectedId}
+ onDeleteSprite={onDeleteSprite}
+ onDrop={onDrop}
+ onDuplicateSprite={onDuplicateSprite}
+ onExportSprite={onExportSprite}
+ onSelectSprite={onSelectSprite}
+ />
{
}}
onDoubleClick={onDoubleClick}
>
-
+ >
+
+
!asset.clean)
.map(
@@ -215,7 +222,7 @@ const ProjectSaverHOC = function (WrappedComponent) {
)
).then(() => {
const opts = {
- body: this.props.vm.toJSON(),
+ body: savedVMState,
// If we set json:true then the body is double-stringified, so don't
headers: {
'Content-Type': 'application/json'
diff --git a/src/lib/screen-utils.js b/src/lib/screen-utils.js
index d61201784..a94a67d5b 100644
--- a/src/lib/screen-utils.js
+++ b/src/lib/screen-utils.js
@@ -69,6 +69,10 @@ const getStageDimensions = (stageSize, isFullScreen) => {
stageDimensions.width = stageDimensions.scale * stageDimensions.widthDefault;
}
+ // Round off dimensions to prevent resampling/blurriness
+ stageDimensions.height = Math.round(stageDimensions.height);
+ stageDimensions.width = Math.round(stageDimensions.width);
+
return stageDimensions;
};
diff --git a/src/lib/supported-browser.js b/src/lib/supported-browser.js
index caeac5fe3..adf449d01 100644
--- a/src/lib/supported-browser.js
+++ b/src/lib/supported-browser.js
@@ -6,11 +6,18 @@ import bowser from 'bowser';
*/
export default function () {
if (bowser.msie ||
- bowser.vivaldi ||
bowser.opera ||
bowser.silk) {
return false;
}
- // @todo Should also test for versions of supported browsers
- return true;
+ // IMPORTANT: If you change versions here, also change them in www
+ // minimum versions for recommended browsers
+ const minVersions = {
+ chrome: '63',
+ msedge: '15',
+ firefox: '57',
+ safari: '11'
+ };
+ // strict mode == false so any browser not mentioned in the min Versions is ok
+ return bowser.check(minVersions, false);
}