diff --git a/.travis.yml b/.travis.yml
index 13ccbc30b..522cedab5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,5 +1,5 @@
language: node_js
-sudo: false
+sudo: required
dist: trusty
addons:
chrome: stable
diff --git a/package.json b/package.json
index 13a4b8c1f..3346febc8 100644
--- a/package.json
+++ b/package.json
@@ -7,7 +7,7 @@
"build": "npm run clean && webpack --progress --colors --bail",
"clean": "rimraf ./build && mkdirp build",
"deploy": "touch build/.nojekyll && gh-pages -t -d build -m \"Build for $(git log --pretty=format:%H -n1)\"",
- "i18n:src": "babel src > tmp.js && rimraf tmp.js && ./scripts/build-i18n-source.js ./translations/messages/ ./translations/",
+ "i18n:src": "babel src > tmp.js && rimraf tmp.js && build-i18n-src ./translations/messages/ ./translations/",
"start": "webpack-dev-server",
"test": "npm run test:lint && npm run test:unit && NODE_ENV=production npm run build && npm run test:integration",
"test:integration": "jest --runInBand test[\\\\/]integration",
@@ -28,11 +28,9 @@
},
"devDependencies": {
"autoprefixer": "^7.1.3",
- "babel-cli": "^6.26.0",
"babel-core": "^6.23.1",
"babel-eslint": "^8.0.1",
"babel-loader": "^7.1.0",
- "babel-plugin-react-intl": "^2.3.1",
"babel-plugin-syntax-dynamic-import": "^6.18.0",
"babel-plugin-transform-async-to-generator": "^6.24.1",
"babel-plugin-transform-object-rest-spread": "^6.22.0",
@@ -41,14 +39,14 @@
"buffer-loader": "0.0.1",
"chromedriver": "2.33.1",
"classnames": "2.2.5",
- "copy-webpack-plugin": "^4.0.1",
+ "copy-webpack-plugin": "^4.2.3",
"css-loader": "^0.28.7",
"enzyme": "^3.1.0",
- "enzyme-adapter-react-16": "1.0.3",
+ "enzyme-adapter-react-16": "1.1.0",
"eslint": "^4.7.1",
"eslint-config-scratch": "^5.0.0",
"eslint-plugin-import": "^2.7.0",
- "eslint-plugin-react": "^7.2.1",
+ "eslint-plugin-react": "^7.5.1",
"file-loader": "1.1.5",
"get-float-time-domain-data": "0.1.0",
"gh-pages": "github:rschamp/gh-pages#publish-branch-to-subfolder",
@@ -69,29 +67,29 @@
"prop-types": "^15.5.10",
"raf": "^3.4.0",
"raw-loader": "0.5.1",
- "react": "16.0.0",
- "react-contextmenu": "2.8.0",
- "react-dom": "16.0.0",
- "react-draggable": "3.0.3",
+ "react": "16.2.0",
+ "react-contextmenu": "2.9.1",
+ "react-dom": "16.2.0",
+ "react-draggable": "3.0.4",
"react-intl": "2.4.0",
"react-intl-redux": "0.6.0",
- "react-modal": "3.0.2",
+ "react-modal": "3.1.7",
"react-redux": "5.0.6",
- "react-responsive": "3.0.0",
- "react-style-proptype": "3.0.0",
- "react-tabs": "2.1.0",
- "react-test-renderer": "16.0.0",
+ "react-responsive": "4.0.3",
+ "react-style-proptype": "3.1.0",
+ "react-tabs": "2.1.1",
+ "react-test-renderer": "16.2.0",
"redux": "3.7.0",
"redux-mock-store": "^1.2.3",
"redux-throttle": "0.1.1",
"rimraf": "^2.6.1",
- "scratch-audio": "latest",
- "scratch-blocks": "latest",
- "scratch-l10n": "^2.0.0",
- "scratch-paint": "latest",
- "scratch-render": "latest",
- "scratch-storage": "^0.3.0",
- "scratch-vm": "latest",
+ "scratch-audio": "0.1.0-prerelease.1511362862",
+ "scratch-blocks": "0.1.0-prerelease.1512689011",
+ "scratch-l10n": "2.0.20171127165917",
+ "scratch-paint": "0.1.0-prerelease.20171206013751",
+ "scratch-render": "0.1.0-prerelease.1513001977",
+ "scratch-storage": "0.3.0",
+ "scratch-vm": "0.1.0-prerelease.1512751561-prerelease.1512751574",
"selenium-webdriver": "3.5.0",
"startaudiocontext": "1.2.1",
"style-loader": "^0.19.0",
@@ -100,7 +98,7 @@
"wav-encoder": "1.3.0",
"web-audio-test-api": "^0.5.2",
"webpack": "^3.6.0",
- "webpack-dev-server": "^2.8.2",
+ "webpack-dev-server": "^2.9.7",
"xhr": "2.4.0"
},
"jest": {
diff --git a/scripts/build-i18n-source.js b/scripts/build-i18n-source.js
deleted file mode 100755
index 9f6571c1c..000000000
--- a/scripts/build-i18n-source.js
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env node
-
-const fs = require('fs');
-const glob = require('glob');
-const path = require('path');
-const mkdirp = require('mkdirp');
-
-var args = process.argv.slice(2);
-
-if (!args.length) {
- process.stdout.write('You must specify the messages dir generated by babel-plugin-react-intl.\n');
- process.exit(1);
-}
-
-const MESSAGES_PATTERN = args.shift() + '/**/*.json';
-
-if (!args.length) {
- process.stdout.write('A destination directory must be specified.\n');
- process.exit(1);
-}
-
-const LANG_DIR = args.shift();
-
-// Aggregates the default messages that were extracted from the example app's
-// React components via the React Intl Babel plugin. An error will be thrown if
-// there are messages in different components that use the same `id`. The result
-// is a chromei18n format collection of `id: {message: defaultMessage,
-// description: description}` pairs for the app's default locale.
-let defaultMessages = glob.sync(MESSAGES_PATTERN)
- .map((filename) => fs.readFileSync(filename, 'utf8'))
- .map((file) => JSON.parse(file))
- .reduce((collection, descriptors) => {
- descriptors.forEach(({id, defaultMessage, description}) => {
- if (collection.hasOwnProperty(id)) {
- throw new Error(`Duplicate message id: ${id}`);
- }
-
- collection[id] = {message: defaultMessage, description: description};
- });
-
- return collection;
- }, {});
-
-mkdirp.sync(LANG_DIR);
-fs.writeFileSync(path.join(LANG_DIR, 'en.json'), JSON.stringify(defaultMessages, null, 2));
diff --git a/src/components/asset-panel/selector.css b/src/components/asset-panel/selector.css
index 2a4de1a25..63e686832 100644
--- a/src/components/asset-panel/selector.css
+++ b/src/components/asset-panel/selector.css
@@ -1,4 +1,5 @@
@import "../../css/colors.css";
+@import "../../css/units.css";
.wrapper {
width: 150px;
@@ -51,3 +52,14 @@
min-height: 5rem;
margin: 1rem auto;
}
+
+@media only screen and (max-width: $full-size-paint) {
+ .wrapper {
+ width: 80px;
+ }
+
+ .list-item {
+ width: 4rem;
+ min-height: 4rem;
+ }
+}
diff --git a/src/components/close-button/close-button.jsx b/src/components/close-button/close-button.jsx
index 416adec8e..039a8750b 100644
--- a/src/components/close-button/close-button.jsx
+++ b/src/components/close-button/close-button.jsx
@@ -7,6 +7,7 @@ import closeIcon from './icon--close.svg';
const CloseButton = props => (
(
[styles.large]: props.size === CloseButton.SIZE_LARGE
}
)}
+ role="button"
+ tabIndex="0"
onClick={props.onClick}
>
![]()
(
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+ {/* @todo (#993) Implement "run without screen refresh" */}
+ {/* */}
+
+
+
+
+
+
+
+);
+
+CustomProcedures.propTypes = {
+ componentRef: PropTypes.func.isRequired,
+ onAddBoolean: PropTypes.func.isRequired,
+ onAddLabel: PropTypes.func.isRequired,
+ onAddTextNumber: PropTypes.func.isRequired,
+ onCancel: PropTypes.func.isRequired,
+ onOk: PropTypes.func.isRequired
+};
+
+export default CustomProcedures;
diff --git a/src/components/custom-procedures/icon--boolean-input.svg b/src/components/custom-procedures/icon--boolean-input.svg
new file mode 100644
index 000000000..49a4d919f
--- /dev/null
+++ b/src/components/custom-procedures/icon--boolean-input.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/components/custom-procedures/icon--label.svg b/src/components/custom-procedures/icon--label.svg
new file mode 100644
index 000000000..2c2d52a66
--- /dev/null
+++ b/src/components/custom-procedures/icon--label.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/components/custom-procedures/icon--text-input.svg b/src/components/custom-procedures/icon--text-input.svg
new file mode 100644
index 000000000..a6dfbe5eb
--- /dev/null
+++ b/src/components/custom-procedures/icon--text-input.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/components/gui/gui.css b/src/components/gui/gui.css
index 9f9b84743..3d08cadf6 100644
--- a/src/components/gui/gui.css
+++ b/src/components/gui/gui.css
@@ -68,13 +68,15 @@
display: flex;
justify-content: center;
align-items: center;
+
+ user-select: none;
}
.tab.is-selected {
z-index: 1;
color: #40B9F5;
background-color: #FFFFFF;
- border-bottom: white 1px solid;
+ border-bottom: $ui-background-blue 1px solid;
}
.tabs {
diff --git a/src/components/icon-button/icon-button.jsx b/src/components/icon-button/icon-button.jsx
index 50d5557e5..c6f9ae3d0 100644
--- a/src/components/icon-button/icon-button.jsx
+++ b/src/components/icon-button/icon-button.jsx
@@ -11,6 +11,7 @@ const IconButton = ({
}) => (