diff --git a/package.json b/package.json
index 6ed991f38..eb74d9f47 100644
--- a/package.json
+++ b/package.json
@@ -102,12 +102,12 @@
"rimraf": "^2.6.1",
"scratch-audio": "0.1.0-prerelease.20181023202904",
"scratch-blocks": "0.1.0-prerelease.1542722191",
- "scratch-l10n": "3.0.20181115134359",
- "scratch-paint": "0.2.0-prerelease.20181120191526",
- "scratch-render": "0.1.0-prerelease.20181126213837",
+ "scratch-l10n": "3.0.20181121224721",
+ "scratch-paint": "0.2.0-prerelease.20181128182047",
+ "scratch-render": "0.1.0-prerelease.20181127194508",
"scratch-storage": "1.2.0",
"scratch-svg-renderer": "0.2.0-prerelease.20181126212715",
- "scratch-vm": "0.2.0-prerelease.20181121182825",
+ "scratch-vm": "0.2.0-prerelease.20181128224414",
"selenium-webdriver": "3.6.0",
"startaudiocontext": "1.2.1",
"style-loader": "^0.23.0",
diff --git a/src/components/action-menu/action-menu.jsx b/src/components/action-menu/action-menu.jsx
index 01070b27f..36cf5d444 100644
--- a/src/components/action-menu/action-menu.jsx
+++ b/src/components/action-menu/action-menu.jsx
@@ -78,6 +78,9 @@ class ActionMenu extends React.Component {
return event => {
ReactTooltip.hide();
if (fn) fn(event);
+ // Blur the button so it does not keep focus after being clicked
+ // This prevents keyboard events from triggering the button
+ this.buttonRef.blur();
this.setState({forceHide: true, isOpen: false}, () => {
setTimeout(() => this.setState({forceHide: false}));
});
diff --git a/src/components/alerts/alert.css b/src/components/alerts/alert.css
index 938d04b61..2f5b8bd6c 100644
--- a/src/components/alerts/alert.css
+++ b/src/components/alerts/alert.css
@@ -7,7 +7,7 @@
display: flex;
flex-direction: row;
overflow: hidden;
- align-items: left;
+ justify-content: space-between;
border-radius: $space;
padding: $space;
margin-bottom: 7px;
@@ -37,13 +37,17 @@
font-weight: bold;
font-size: .75rem;
line-height: 14px;
- width: 100%;
display: flex;
align-items: center;
padding-left: .5rem;
padding-right: .5rem;
}
+.alert-buttons {
+ display: flex;
+ flex-direction: row;
+}
+
.alert-close-button {
outline-style:none;
}
@@ -55,7 +59,7 @@
align-self: center;
}
-.connection-button {
+.alert-connection-button {
min-height: 2rem;
padding: 0.55rem 0.9rem;
border-radius: 0.35rem;
@@ -68,6 +72,13 @@
display: flex;
align-items: center;
align-self: center;
- margin-right: 13px;
outline-style:none;
}
+
+[dir="ltr"] .alert-connection-button {
+ margin-right: 13px;
+}
+
+[dir="rtl"] .alert-connection-button {
+ margin-left: 13px;
+}
diff --git a/src/components/alerts/alert.jsx b/src/components/alerts/alert.jsx
index e38816723..4b6bdf493 100644
--- a/src/components/alerts/alert.jsx
+++ b/src/components/alerts/alert.jsx
@@ -22,7 +22,11 @@ const AlertComponent = ({
iconSpinner,
iconURL,
level,
+ showDownload,
+ showSaveNow,
onCloseAlert,
+ onDownload,
+ onSaveNow,
onReconnect,
showReconnect
}) => (
@@ -42,7 +46,7 @@ const AlertComponent = ({
{extensionName ? (
) : content}
- {showReconnect && (
-
- )}
- {closeButton && (
-
-
-
- )}
+
+ {showSaveNow && (
+
+ )}
+ {showDownload && (
+
+ )}
+ {showReconnect && (
+
+ )}
+ {closeButton && (
+
+
+
+ )}
+
);
@@ -88,8 +118,12 @@ AlertComponent.propTypes = {
iconURL: PropTypes.string,
level: PropTypes.string,
onCloseAlert: PropTypes.func.isRequired,
+ onDownload: PropTypes.func,
onReconnect: PropTypes.func,
- showReconnect: PropTypes.bool
+ onSaveNow: PropTypes.func,
+ showDownload: PropTypes.func,
+ showReconnect: PropTypes.bool,
+ showSaveNow: PropTypes.bool
};
AlertComponent.defaultProps = {
diff --git a/src/components/alerts/alerts.jsx b/src/components/alerts/alerts.jsx
index b2b14a638..21d6c01c4 100644
--- a/src/components/alerts/alerts.jsx
+++ b/src/components/alerts/alerts.jsx
@@ -25,7 +25,9 @@ const AlertsComponent = ({
key={index}
level={a.level}
message={a.message}
+ showDownload={a.showDownload}
showReconnect={a.showReconnect}
+ showSaveNow={a.showSaveNow}
onCloseAlert={onCloseAlert}
/>
))}
diff --git a/src/components/connection-modal/auto-scanning-step.jsx b/src/components/connection-modal/auto-scanning-step.jsx
index a73c0b58d..b6f0dd813 100644
--- a/src/components/connection-modal/auto-scanning-step.jsx
+++ b/src/components/connection-modal/auto-scanning-step.jsx
@@ -63,7 +63,7 @@ const AutoScanningStep = props => (
-
+
{props.phase === PHASES.prescan && (
(
)}
- {props.phase === PHASES.prescan && (
-
- )}
- {props.phase === PHASES.pressbutton && (
-
+
+ {props.phase === PHASES.prescan && (
+ )}
+ {props.phase === PHASES.pressbutton && (
+
+
+
+
+ )}
+ {props.phase === PHASES.notfound && (
-
- )}
- {props.phase === PHASES.notfound && (
-
- )}
+ )}
+
);
diff --git a/src/components/connection-modal/connected-step.jsx b/src/components/connection-modal/connected-step.jsx
index aa71c63c8..f71b3556e 100644
--- a/src/components/connection-modal/connected-step.jsx
+++ b/src/components/connection-modal/connected-step.jsx
@@ -25,7 +25,7 @@ const ConnectedStep = props => (
-
+
(
-
+