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 625e7a037..b272a080e 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", @@ -103,14 +103,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( @@ -224,7 +231,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); }