diff --git a/package.json b/package.json index 23701739cdaa1a70b46a114c96b3c364e8655862..c21c222584305afa8d681cc9ea19e4d476045a4b 100644 --- a/package.json +++ b/package.json @@ -96,13 +96,13 @@ "redux-throttle": "0.1.1", "rimraf": "^2.6.1", "scratch-audio": "0.1.0-prerelease.20180625202813", - "scratch-blocks": "0.1.0-prerelease.1531482946", - "scratch-l10n": "3.0.20180712200642", - "scratch-paint": "0.2.0-prerelease.20180712195436", + "scratch-blocks": "0.1.0-prerelease.1532024291", + "scratch-l10n": "3.0.20180719145856", + "scratch-paint": "0.2.0-prerelease.20180718183615", "scratch-render": "0.1.0-prerelease.20180618173030", "scratch-storage": "0.5.1", "scratch-svg-renderer": "0.2.0-prerelease.20180712223402", - "scratch-vm": "0.1.0-prerelease.1531502959", + "scratch-vm": "0.2.0-prerelease.20180719205147", "selenium-webdriver": "3.6.0", "startaudiocontext": "1.2.1", "style-loader": "^0.21.0", diff --git a/src/components/connection-modal/connecting-step.jsx b/src/components/connection-modal/connecting-step.jsx index 063e67a826c79f4c9f55548e321d499d8c86d6a3..be378b3fdd54773f4a1bf9989364a930f9faf433 100644 --- a/src/components/connection-modal/connecting-step.jsx +++ b/src/components/connection-modal/connecting-step.jsx @@ -28,11 +28,7 @@ const ConnectingStep = props => ( </Box> <Box className={styles.bottomArea}> <Box className={styles.instructions}> - <FormattedMessage - defaultMessage="Connecting" - description="" - id="gui.connection.connecting" - /> + {props.connectingMessage} </Box> <Dots counter={1} @@ -64,6 +60,7 @@ const ConnectingStep = props => ( ); ConnectingStep.propTypes = { + connectingMessage: PropTypes.node.isRequired, deviceImage: PropTypes.string.isRequired, onDisconnect: PropTypes.func }; diff --git a/src/components/connection-modal/connection-modal.css b/src/components/connection-modal/connection-modal.css index b636b4af9cdb5e1d4c44505a12b62f3b405d7ecb..b8ca0634b32c81d1504f6f6bd915e1f2dc6380ea 100644 --- a/src/components/connection-modal/connection-modal.css +++ b/src/components/connection-modal/connection-modal.css @@ -183,8 +183,41 @@ align-items: center; } +.scratch-link-help { + display: flex; + flex-direction: column; + justify-content: space-around; + height: 100%; + padding: 1rem 0; +} + +.scratch-link-help-step { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-left: 3rem; +} + .scratch-link-icon { - max-width: 150px; + max-width: 50px; +} + +.help-step-image { + margin-right: 0.5rem; +} + +.help-step-number { + background: $pen-primary; + border-radius: 100%; + display: flex; + justify-content: center; + align-items: center; + color: $ui-white; + font-weight: bold; + margin-right: 0.5rem; + min-width: 2rem; + height: 2rem; } .button-row { @@ -262,7 +295,7 @@ .instructions { text-align: center; - padding: 1rem; + margin-top: 1rem; } .dots-row { @@ -270,7 +303,7 @@ flex-direction: row; justify-content: center; align-items: center; - padding-bottom: 1rem; + margin: 1rem; } .dots-holder { diff --git a/src/components/connection-modal/connection-modal.jsx b/src/components/connection-modal/connection-modal.jsx index 9a77e92f56ebd4cb439f0c12cbf0cc0a7b46d09e..c6566e954db7c3b5de3b32a8de3a2d6439115838 100644 --- a/src/components/connection-modal/connection-modal.jsx +++ b/src/components/connection-modal/connection-modal.jsx @@ -27,6 +27,7 @@ const ConnectionModalComponent = props => ( contentLabel={props.name} headerClassName={styles.header} headerImage={props.smallDeviceImage} + onHelp={props.onHelp} onRequestClose={props.onCancel} > <Box className={styles.body}> @@ -40,8 +41,10 @@ const ConnectionModalComponent = props => ( ); ConnectionModalComponent.propTypes = { + connectingMessage: PropTypes.node, name: PropTypes.node, onCancel: PropTypes.func.isRequired, + onHelp: PropTypes.func.isRequired, phase: PropTypes.oneOf(Object.keys(PHASES)).isRequired, smallDeviceImage: PropTypes.string, title: PropTypes.string.isRequired diff --git a/src/components/connection-modal/error-step.jsx b/src/components/connection-modal/error-step.jsx index 681d74b72a2b278b13ae23d39d853becf5b4116d..194e95678fed2fae311e583c35f0a676acc58aa8 100644 --- a/src/components/connection-modal/error-step.jsx +++ b/src/components/connection-modal/error-step.jsx @@ -26,7 +26,7 @@ const ErrorStep = props => ( <FormattedMessage defaultMessage="Oops, looks like something went wrong." description="The device connection process has encountered an error." - id="gui.connection.errorMessage" + id="gui.connection.error.errorMessage" /> </div> <Dots @@ -45,7 +45,7 @@ const ErrorStep = props => ( <FormattedMessage defaultMessage="Try again" description="Button to initiate trying the device connection again after an error" - id="gui.connection.tryagainbutton" + id="gui.connection.error.tryagainbutton" /> </button> <button @@ -59,7 +59,7 @@ const ErrorStep = props => ( <FormattedMessage defaultMessage="Help" description="Button to view help content" - id="gui.connection.helpbutton" + id="gui.connection.error.helpbutton" /> </button> </Box> diff --git a/src/components/connection-modal/icons/bluetooth.svg b/src/components/connection-modal/icons/bluetooth.svg new file mode 100644 index 0000000000000000000000000000000000000000..ebec155b4398ed010a30ab4d10ecb4597c52ad8c Binary files /dev/null and b/src/components/connection-modal/icons/bluetooth.svg differ diff --git a/src/components/connection-modal/icons/scratch-link.png b/src/components/connection-modal/icons/scratch-link.png deleted file mode 100644 index af7ceed4baac35730f1b803bc9477aa1b4f208a9..0000000000000000000000000000000000000000 Binary files a/src/components/connection-modal/icons/scratch-link.png and /dev/null differ diff --git a/src/components/connection-modal/icons/scratchlink.svg b/src/components/connection-modal/icons/scratchlink.svg new file mode 100644 index 0000000000000000000000000000000000000000..de2011a5efd5fd213ad0bd269bce6ba9e5d17a93 Binary files /dev/null and b/src/components/connection-modal/icons/scratchlink.svg differ diff --git a/src/components/connection-modal/scanning-step.jsx b/src/components/connection-modal/scanning-step.jsx index 1728e1fd5d55df75790f0301ef00386783d95b15..0b0b4999d11cdb7ee78e0c0ca59a34676cd44dff 100644 --- a/src/components/connection-modal/scanning-step.jsx +++ b/src/components/connection-modal/scanning-step.jsx @@ -30,7 +30,7 @@ const ScanningStep = props => ( </div> </div> ) : ( - <Box className={styles.deviceTilePane}> + <div className={styles.deviceTilePane}> {props.deviceList.map(device => (<DeviceTile key={device.peripheralId} @@ -41,7 +41,7 @@ const ScanningStep = props => ( onConnecting={props.onConnecting} />) )} - </Box> + </div> ) ) : ( <Box className={styles.instructions}> diff --git a/src/components/connection-modal/unavailable-step.jsx b/src/components/connection-modal/unavailable-step.jsx index 2f789cbdb0e1a1d070e0c7e4abbe4d93a6143b18..975a66debe7d0b14b25a87c632c04a494775ac4d 100644 --- a/src/components/connection-modal/unavailable-step.jsx +++ b/src/components/connection-modal/unavailable-step.jsx @@ -6,30 +6,54 @@ import Box from '../box/box.jsx'; import Dots from './dots.jsx'; import helpIcon from './icons/help.svg'; import backIcon from './icons/back.svg'; -import scratchLinkIcon from './icons/scratch-link.png'; +import bluetoothIcon from './icons/bluetooth.svg'; +import scratchLinkIcon from './icons/scratchlink.svg'; import styles from './connection-modal.css'; const UnavailableStep = props => ( <Box className={styles.body}> <Box className={styles.activityArea}> - <Box className={styles.centeredRow}> - <div className={styles.deviceActivity}> - <img - className={styles.scratchLinkIcon} - src={scratchLinkIcon} - /> + <div className={styles.scratchLinkHelp}> + <div className={styles.scratchLinkHelpStep}> + <div className={styles.helpStepNumber}> + {'1'} + </div> + <div className={styles.helpStepImage}> + <img + className={styles.scratchLinkIcon} + src={scratchLinkIcon} + /> + </div> + <div className={styles.helpStepText}> + <FormattedMessage + defaultMessage="Make sure you have Scratch Link installed and running" + description="Message for getting Scratch Link installed" + id="gui.connection.unavailable.installscratchlink" + /> + </div> </div> - </Box> + <div className={styles.scratchLinkHelpStep}> + <div className={styles.helpStepNumber}> + {'2'} + </div> + <div className={styles.helpStepImage}> + <img + className={styles.scratchLinkIcon} + src={bluetoothIcon} + /> + </div> + <div className={styles.helpStepText}> + <FormattedMessage + defaultMessage="Check that Bluetooth is enabled" + description="Message for making sure Bluetooth is enabled" + id="gui.connection.unavailable.enablebluetooth" + /> + </div> + </div> + </div> </Box> <Box className={styles.bottomArea}> - <div className={styles.instructions}> - <FormattedMessage - defaultMessage="Please start Scratch Link and turn on Bluetooth." - description="Scratch link is not installed message" - id="gui.connection.unavailableMessage" - /> - </div> <Dots error total={3} @@ -46,7 +70,7 @@ const UnavailableStep = props => ( <FormattedMessage defaultMessage="Try again" description="Button to initiate trying the device connection again after an error" - id="gui.connection.tryagainbutton" + id="gui.connection.unavailable.tryagainbutton" /> </button> <button @@ -60,7 +84,7 @@ const UnavailableStep = props => ( <FormattedMessage defaultMessage="Help" description="Button to view help content" - id="gui.connection.helpbutton" + id="gui.connection.unavailable.helpbutton" /> </button> </Box> diff --git a/src/components/custom-procedures/custom-procedures.jsx b/src/components/custom-procedures/custom-procedures.jsx index 08131ea5b1de63c406bc32cbede0b45151a54d03..81756e762ee9e8ffd64492a35b59b2849aada0a7 100644 --- a/src/components/custom-procedures/custom-procedures.jsx +++ b/src/components/custom-procedures/custom-procedures.jsx @@ -2,7 +2,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import Modal from '../modal/modal.jsx'; import Box from '../box/box.jsx'; -import {FormattedMessage} from 'react-intl'; +import {defineMessages, injectIntl, intlShape, FormattedMessage} from 'react-intl'; import booleanInputIcon from './icon--boolean-input.svg'; import textInputIcon from './icon--text-input.svg'; @@ -10,10 +10,18 @@ import labelIcon from './icon--label.svg'; import styles from './custom-procedures.css'; +const messages = defineMessages({ + myblockModalTitle: { + defaultMessage: 'Make a Block', + description: 'Title for the modal where you create a custom block.', + id: 'gui.customProcedures.myblockModalTitle' + } +}); + const CustomProcedures = props => ( <Modal className={styles.modalContent} - contentLabel="Make a Block" + contentLabel={props.intl.formatMessage(messages.myblockModalTitle)} onRequestClose={props.onCancel} > <Box @@ -133,6 +141,7 @@ const CustomProcedures = props => ( CustomProcedures.propTypes = { componentRef: PropTypes.func.isRequired, + intl: intlShape, onAddBoolean: PropTypes.func.isRequired, onAddLabel: PropTypes.func.isRequired, onAddTextNumber: PropTypes.func.isRequired, @@ -142,4 +151,4 @@ CustomProcedures.propTypes = { warp: PropTypes.bool.isRequired }; -export default CustomProcedures; +export default injectIntl(CustomProcedures); diff --git a/src/components/gui/gui.css b/src/components/gui/gui.css index b53f17b55ebd42e6cc7cad2dae2d6903dbcb44cb..e40b025735171530f8006dbbfd589e48879a82e3 100644 --- a/src/components/gui/gui.css +++ b/src/components/gui/gui.css @@ -201,7 +201,7 @@ } .extension-button-container { - width: 3.25rem; + width: 3.75rem; height: 3.25rem; position: absolute; bottom: 0; diff --git a/src/components/library/library.jsx b/src/components/library/library.jsx index c58d3608c94b7f74ca2573c0857e18267f7fe88a..2da09f2720deed4e72e02943665175af3cdbe46b 100644 --- a/src/components/library/library.jsx +++ b/src/components/library/library.jsx @@ -9,6 +9,7 @@ import Modal from '../../containers/modal.jsx'; import Divider from '../divider/divider.jsx'; import Filter from '../filter/filter.jsx'; import TagButton from '../../containers/tag-button.jsx'; +import analytics from '../../lib/analytics'; import styles from './library.css'; @@ -28,6 +29,7 @@ class LibraryComponent extends React.Component { super(props); bindAll(this, [ 'handleBlur', + 'handleClose', 'handleFilterChange', 'handleFilterClear', 'handleFocus', @@ -56,9 +58,17 @@ class LibraryComponent extends React.Component { this.handleMouseEnter(id); } handleSelect (id) { - this.props.onRequestClose(); + this.handleClose(); this.props.onItemSelected(this.getFilteredData()[id]); } + handleClose () { + analytics.event({ + category: 'library', + action: `${this.props.id}: close with search`, + label: this.state.filterQuery || '(empty)' + }); + this.props.onRequestClose(); + } handleTagClick (tag) { this.setState({ filterQuery: '', @@ -111,7 +121,7 @@ class LibraryComponent extends React.Component { fullScreen contentLabel={this.props.title} id={this.props.id} - onRequestClose={this.props.onRequestClose} + onRequestClose={this.handleClose} > {(this.props.filterable || this.props.tags) && ( <div className={styles.filterBar}> diff --git a/src/components/menu-bar/menu-bar.jsx b/src/components/menu-bar/menu-bar.jsx index b843e05b45aafbbd4b817b7c097d7d4586315ee2..08bd6b5561446df26a4968c64d559ce1d0d3f2bc 100644 --- a/src/components/menu-bar/menu-bar.jsx +++ b/src/components/menu-bar/menu-bar.jsx @@ -159,8 +159,9 @@ class MenuBar extends React.Component { })} onMouseUp={this.handleLanguageMouseUp} > + {/* @TODO: remove coming soon tooltip wrapper https://github.com/LLK/scratch-gui/issues/2664 */} <MenuBarItemTooltip - enable={window.location.search.indexOf('enable=language') !== -1} + enable id="menubar-selector" place="right" > diff --git a/src/components/modal/modal.css b/src/components/modal/modal.css index 9a5a035a7de18edba2d6d5343fdc4fa97f213878..8bf2b6cb8fab403f28a867468b7d437c5f4de684 100644 --- a/src/components/modal/modal.css +++ b/src/components/modal/modal.css @@ -122,3 +122,14 @@ $sides: 20rem; font-weight: normal; padding-left: 0; } + +.header-item-help { + padding: 0; + margin-right: -4.75rem; +} + +.help-button { + font-weight: normal; + padding-right: 0; + font-size: 0.75rem; +} diff --git a/src/components/modal/modal.jsx b/src/components/modal/modal.jsx index 940af75586f59e05291f9970b5bf972f353ccdb3..acce21993d86b23137104f5f7bddc1215c1d26bf 100644 --- a/src/components/modal/modal.jsx +++ b/src/components/modal/modal.jsx @@ -9,6 +9,7 @@ import Button from '../button/button.jsx'; import CloseButton from '../close-button/close-button.jsx'; import backIcon from '../../lib/assets/icon--back.svg'; +import helpIcon from '../../lib/assets/icon--help.svg'; import styles from './modal.css'; @@ -27,6 +28,26 @@ const ModalComponent = props => ( grow={1} > <div className={classNames(styles.header, props.headerClassName)}> + {props.onHelp ? ( + <div + className={classNames( + styles.headerItem, + styles.headerItemHelp + )} + > + <Button + className={styles.helpButton} + iconSrc={helpIcon} + onClick={props.onHelp} + > + <FormattedMessage + defaultMessage="Help" + description="Help button in modal" + id="gui.modal.help" + /> + </Button> + </div> + ) : null} <div className={classNames( styles.headerItem, @@ -82,6 +103,7 @@ ModalComponent.propTypes = { fullScreen: PropTypes.bool, headerClassName: PropTypes.string, headerImage: PropTypes.string, + onHelp: PropTypes.func, onRequestClose: PropTypes.func }; diff --git a/src/containers/blocks.jsx b/src/containers/blocks.jsx index 1de665e33422b5372322ec02018912b18fd8da29..cd3d4ff5383e60427b86bd11cf4137b93b6b5ee9 100644 --- a/src/containers/blocks.jsx +++ b/src/containers/blocks.jsx @@ -94,7 +94,11 @@ class Blocks extends React.Component { addFunctionListener(this.workspace, 'zoom', this.onWorkspaceMetricsChange); this.attachVM(); - this.setLocale(); + // Only update blocks/vm locale when visible to avoid sizing issues + // If locale changes while not visible it will get handled in didUpdate + if (this.props.isVisible) { + this.setLocale(); + } analytics.pageview('/editors/blocks'); } @@ -117,10 +121,6 @@ class Blocks extends React.Component { this.ScratchBlocks.hideChaff(); } - if (prevProps.locale !== this.props.locale) { - this.setLocale(); - } - if (prevProps.toolboxXML !== this.props.toolboxXML) { // rather than update the toolbox "sync" -- update it in the next frame clearTimeout(this.toolboxUpdateTimeout); @@ -139,9 +139,15 @@ class Blocks extends React.Component { // @todo hack to reload the workspace due to gui bug #413 if (this.props.isVisible) { // Scripts tab this.workspace.setVisible(true); - this.props.vm.refreshWorkspace(); - // Re-enable toolbox refreshes without causing one. See #updateToolbox for more info. - this.workspace.toolboxRefreshEnabled_ = true; + if (prevProps.locale !== this.props.locale || this.props.locale !== this.props.vm.getLocale()) { + // call setLocale if the locale has changed, or changed while the blocks were hidden. + // vm.getLocale() will be out of sync if locale was changed while not visible + this.setLocale(); + } else { + this.props.vm.refreshWorkspace(); + this.updateToolbox(); + } + window.dispatchEvent(new Event('resize')); } else { this.workspace.setVisible(false); @@ -158,8 +164,8 @@ class Blocks extends React.Component { this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale); this.props.vm.setLocale(this.props.locale, this.props.messages) .then(() => { - this.workspace.updateToolbox(this.props.toolboxXML); this.props.vm.refreshWorkspace(); + this.updateToolbox(); this.workspace.getFlyout().setRecyclingEnabled(true); }); } @@ -355,7 +361,9 @@ class Blocks extends React.Component { extensionId: extensionId, deviceImage: extension.deviceImage, smallDeviceImage: extension.smallDeviceImage, - name: extension.name + name: extension.name, + connectingMessage: extension.connectingMessage, + helpLink: extension.helpLink }}); } } @@ -419,8 +427,10 @@ class Blocks extends React.Component { ) : null} {this.state.connectionModal ? ( <ConnectionModal + connectingMessage={this.state.connectionModal.connectingMessage} deviceImage={this.state.connectionModal.deviceImage} extensionId={this.state.connectionModal.extensionId} + helpLink={this.state.connectionModal.helpLink} name={this.state.connectionModal.name} smallDeviceImage={this.state.connectionModal.smallDeviceImage} vm={vm} diff --git a/src/containers/connection-modal.jsx b/src/containers/connection-modal.jsx index 3b1a68b3adc72942123b1275b18484fa12623067..50862fbd2b31e6e830f756484fcd47e0fcbac0e8 100644 --- a/src/containers/connection-modal.jsx +++ b/src/containers/connection-modal.jsx @@ -12,7 +12,8 @@ class ConnectionModal extends React.Component { 'handleConnected', 'handleConnecting', 'handleDisconnect', - 'handleError' + 'handleError', + 'handleHelp' ]); this.state = { phase: PHASES.scanning @@ -76,11 +77,12 @@ class ConnectionModal extends React.Component { }); } handleHelp () { - // @todo: implement the help button + window.open(this.props.helpLink, '_blank'); } render () { return ( <ConnectionModalComponent + connectingMessage={this.props.connectingMessage} deviceImage={this.props.deviceImage} extensionId={this.props.extensionId} name={this.props.name} @@ -100,8 +102,10 @@ class ConnectionModal extends React.Component { } ConnectionModal.propTypes = { + connectingMessage: PropTypes.node.isRequired, deviceImage: PropTypes.string.isRequired, extensionId: PropTypes.string.isRequired, + helpLink: PropTypes.string.isRequired, name: PropTypes.node.isRequired, onCancel: PropTypes.func.isRequired, onStatusButtonUpdate: PropTypes.func.isRequired, diff --git a/src/containers/project-loader.jsx b/src/containers/project-loader.jsx index 7f178b6232416aca90e22d35c36c56af7c53ba92..507b716523796e14fb9b73fbb93cca44df2785f8 100644 --- a/src/containers/project-loader.jsx +++ b/src/containers/project-loader.jsx @@ -2,8 +2,10 @@ import bindAll from 'lodash.bindall'; import PropTypes from 'prop-types'; import React from 'react'; import {connect} from 'react-redux'; +import {defineMessages, injectIntl, intlShape} from 'react-intl'; import analytics from '../lib/analytics'; +import log from '../lib/log'; import { openLoadingProject, @@ -26,6 +28,15 @@ import { * </MyCoolComponent> * )}</ProjectLoader> */ + +const messages = defineMessages({ + loadError: { + id: 'gui.projectLoader.loadError', + defaultMessage: 'The project file that was selected failed to load.', + description: 'An error that displays when a local project file fails to load.' + } +}); + class ProjectLoader extends React.Component { constructor (props) { super(props); @@ -35,10 +46,6 @@ class ProjectLoader extends React.Component { 'handleChange', 'handleClick' ]); - this.state = { - loadingError: false, - errorMessage: '' - }; } handleChange (e) { // Remove the hash if any (without triggering a hash change event or a reload) @@ -58,7 +65,12 @@ class ProjectLoader extends React.Component { thisFileInput.value = null; }) .catch(error => { - this.setState({loadingError: true, errorMessage: error}); + log.warn(error); + alert(this.props.intl.formatMessage(messages.loadError)); // eslint-disable-line no-alert + this.props.closeLoadingState(); + // Reset the file input after project is loaded + // This is necessary in case the user wants to reload a project + thisFileInput.value = null; }); if (thisFileInput.files) { // Don't attempt to load if no file was selected this.props.openLoadingState(); @@ -83,10 +95,6 @@ class ProjectLoader extends React.Component { ); } render () { - if (this.state.loadingError) { - throw new Error( - `Failed to load project from file: ${this.state.errorMessage}`); - } const { /* eslint-disable no-unused-vars */ children, @@ -103,6 +111,7 @@ class ProjectLoader extends React.Component { ProjectLoader.propTypes = { children: PropTypes.func, closeLoadingState: PropTypes.func, + intl: intlShape.isRequired, openLoadingState: PropTypes.func, vm: PropTypes.shape({ loadProject: PropTypes.func @@ -121,4 +130,4 @@ const mapDispatchToProps = dispatch => ({ export default connect( mapStateToProps, mapDispatchToProps -)(ProjectLoader); +)(injectIntl(ProjectLoader)); diff --git a/src/containers/scanning-step.jsx b/src/containers/scanning-step.jsx index ecc19318913845154c248f716dfad6d440147c2e..07595d5266d937c577f2e44634995b7849e3e5fb 100644 --- a/src/containers/scanning-step.jsx +++ b/src/containers/scanning-step.jsx @@ -32,7 +32,10 @@ class ScanningStep extends React.Component { 'PERIPHERAL_SCAN_TIMEOUT', this.handlePeripheralScanTimeout); } handlePeripheralScanTimeout () { - this.setState({scanning: false}); + this.setState({ + scanning: false, + deviceList: [] + }); } handlePeripheralListUpdate (newList) { // TODO: sort peripherals by signal strength? so they don't jump around @@ -53,6 +56,7 @@ class ScanningStep extends React.Component { <ScanningStepComponent deviceList={this.state.deviceList} phase={this.state.phase} + scanning={this.state.scanning} smallDeviceImage={this.props.smallDeviceImage} title={this.props.extensionId} onConnected={this.props.onConnected} diff --git a/src/containers/tips-library.jsx b/src/containers/tips-library.jsx index ebbee3f3022175f797e021e1e0253a0821f5258c..009c8c2fae9f3c9e0f3fd9f0cd3bcac04ca44acc 100644 --- a/src/containers/tips-library.jsx +++ b/src/containers/tips-library.jsx @@ -54,6 +54,7 @@ class TipsLibrary extends React.PureComponent { <LibraryComponent data={decksLibraryThumbnailData} filterable={false} + id="tipsLibrary" title={this.props.intl.formatMessage(messages.tipsLibraryTitle)} visible={this.props.visible} onItemSelected={this.handleItemSelect} diff --git a/src/lib/assets/icon--help.svg b/src/lib/assets/icon--help.svg new file mode 100644 index 0000000000000000000000000000000000000000..2938e8340ebb54dd699f80eaf48794bd383a96a4 Binary files /dev/null and b/src/lib/assets/icon--help.svg differ diff --git a/src/lib/libraries/backdrops.json b/src/lib/libraries/backdrops.json index 14f82655b643c8d84de25d60d768a9115d7b1c62..91e9b1cf4897ce78d19281ae1bdc64cc03525d71 100644 --- a/src/lib/libraries/backdrops.json +++ b/src/lib/libraries/backdrops.json @@ -442,7 +442,7 @@ ] }, { - "name": "Jurrasic", + "name": "Jurassic", "md5": "64025bdca5db4938f65597e3682fddcf.svg", "type": "backdrop", "tags": [ diff --git a/src/lib/libraries/costumes.json b/src/lib/libraries/costumes.json index 88cd587e7ae30e8f7846f57759ffb92e7d6a9f0d..e58f907c3217d1b550898654bec691d7127daea8 100644 --- a/src/lib/libraries/costumes.json +++ b/src/lib/libraries/costumes.json @@ -73,6 +73,82 @@ 2 ] }, + { + "name": "Andie-a", + "md5": "936abdaaac3a3f7d27e5f30b3da00e5f.svg", + "type": "costume", + "tags": [ + "sports", + "basketball", + "people", + "wheelchair", + "handicap", + "handicapable", + "alex eben meyer" + ], + "info": [ + 86, + 77, + 1 + ] + }, + { + "name": "Andie-b", + "md5": "cc2953492b40e231fdee3d8c9994a646.svg", + "type": "costume", + "tags": [ + "sports", + "basketball", + "people", + "wheelchair", + "handicap", + "handicapable", + "alex eben meyer" + ], + "info": [ + 46, + 77, + 1 + ] + }, + { + "name": "Andie-c", + "md5": "76e26ccb79a94d3e89f67e64b4cb9731.svg", + "type": "costume", + "tags": [ + "sports", + "basketball", + "people", + "wheelchair", + "handicap", + "handicapable", + "alex eben meyer" + ], + "info": [ + 52, + 36, + 1 + ] + }, + { + "name": "Andie-d", + "md5": "80fa011244f3e3be56b96ebcb9e40d59.svg", + "type": "costume", + "tags": [ + "sports", + "basketball", + "people", + "wheelchair", + "handicap", + "handicapable", + "alex eben meyer" + ], + "info": [ + 86, + 43, + 1 + ] + }, { "name": "Anina Pop Down", "md5": "e3698b76cb0864df2fbaba80e6bd8067.png", @@ -659,7 +735,7 @@ }, { "name": "Bat-a", - "md5": "a68f7a0b2af7514c729bb083d04dbbde.svg", + "md5": "3b6274510488d5b26447c1c266475801.svg", "type": "costume", "tags": [ "fantasy", @@ -670,14 +746,14 @@ "alex eben meyer" ], "info": [ - 51, - 47, + 65, + 61, 1 ] }, { "name": "Bat-b", - "md5": "4ea5bb61370e189d2eba763312680201.svg", + "md5": "8b20987d450379a445cbfc41ff2a3874.svg", "type": "costume", "tags": [ "fantasy", @@ -688,14 +764,14 @@ "alex eben meyer" ], "info": [ - 51, - 47, + 65, + 61, 1 ] }, { "name": "Bat-c", - "md5": "9ed4deead22db511202f38abadf508c4.svg", + "md5": "c6d6a6892638e489902fbba803050de1.svg", "type": "costume", "tags": [ "fantasy", @@ -706,14 +782,14 @@ "alex eben meyer" ], "info": [ - 51, - 47, + 65, + 61, 1 ] }, { "name": "Bat-d", - "md5": "293a7b03badd2f3b49e50acfb9c242ec.svg", + "md5": "e3da64838b2c74b6dd9a080b030e327e.svg", "type": "costume", "tags": [ "fantasy", @@ -724,8 +800,8 @@ "alex eben meyer" ], "info": [ - 51, - 47, + 65, + 61, 1 ] }, @@ -1698,26 +1774,23 @@ ] }, { - "name": "Cat1", - "md5": "09dc888b0b7df19f70d81588ae73420e.svg", + "name": "Cat 2", + "md5": "01ae57fd339529445cb890978ef8a054.svg", "type": "costume", "tags": [ - "animals", - "cat", - "kitten", "kitty", - "mammal", - "orange", - "scratch cat" + "kitten", + "animals", + "mammal" ], "info": [ - 47, - 55, + 87, + 39, 1 ] }, { - "name": "Cat1 Flying-a", + "name": "Cat Flying-a", "md5": "1e81725d2d2c7de4a2dd4a145198a43c.svg", "type": "costume", "tags": [ @@ -1733,7 +1806,7 @@ ] }, { - "name": "Cat1 Flying-b", + "name": "Cat Flying-b", "md5": "0d192725870ef0eda50d91cab0e3c9c5.svg", "type": "costume", "tags": [ @@ -1750,7 +1823,26 @@ ] }, { - "name": "Cat2", + "name": "Cat-a", + "md5": "09dc888b0b7df19f70d81588ae73420e.svg", + "type": "costume", + "tags": [ + "animals", + "cat", + "kitten", + "kitty", + "mammal", + "orange", + "scratch cat" + ], + "info": [ + 47, + 55, + 1 + ] + }, + { + "name": "Cat-b", "md5": "3696356a03a8d938318876a593572843.svg", "type": "costume", "tags": [ @@ -2839,16 +2931,16 @@ }, { "name": "Dm Stance", - "md5": "b30a60d31aebead577b73affd22bf30f.svg", + "md5": "09dc9d82f097edfc6b2b6e4b5009c5f6.png", "type": "costume", "tags": [ "people", "dance" ], "info": [ - 55, - 119, - 1 + 212, + 476, + 2 ] }, { @@ -2867,7 +2959,7 @@ }, { "name": "Dm Top R Leg", - "md5": "6cea0c29c460e571226cc4cff5b97c28.png", + "md5": "12db59633a1709a2c39534d35263791f.png", "type": "costume", "tags": [ "people", @@ -2892,7 +2984,7 @@ }, { "name": "Dm Top Stand", - "md5": "051c36758b9fd1136b511efc5dd6234a.png", + "md5": "a22da98e5e63de7b2883355afd0184f0.png", "type": "costume", "tags": [ "people", @@ -5254,7 +5346,7 @@ ] }, { - "name": "Jamie-a", + "name": "Jamal-a", "md5": "90f9166fe6500d0c0caad8b1964d6b74.svg", "type": "costume", "tags": [ @@ -5270,7 +5362,7 @@ ] }, { - "name": "Jamie-b", + "name": "Jamal-b", "md5": "c3d96ef7e99440c2fa76effce1235d3f.svg", "type": "costume", "tags": [ @@ -5286,7 +5378,7 @@ ] }, { - "name": "Jamie-c", + "name": "Jamal-c", "md5": "1fb8b9ca79f2c0a327913bd647b53fe5.svg", "type": "costume", "tags": [ @@ -5302,7 +5394,7 @@ ] }, { - "name": "Jamie-d", + "name": "Jamal-d", "md5": "4adb87e6123161fcaf02f7ac022a5757.svg", "type": "costume", "tags": [ @@ -8941,34 +9033,33 @@ ] }, { - "name": "Taco-a", - "md5": "d4a2cea411c6030f017f25184562559d.svg", + "name": "Taco", + "md5": "bc78fb90ed373d56c11d5fafa4203ccd.svg", "type": "costume", "tags": [ "food", - "waffle", - "yum", - "delicious" + "designerd" ], "info": [ - 19, - 15, + 78, + 48, 1 ] }, { - "name": "Taco-b", - "md5": "cef6f6d7c92fc1f008077319ac12dc5e.svg", + "name": "Taco-wizard", + "md5": "5e9e65db20d403b590578ed44b1a3792.svg", "type": "costume", "tags": [ "food", - "waffle", - "yum", - "delicious" + "fantasy", + "abrakadabra", + "alakazam", + "designerd" ], "info": [ - 56, - 15, + 125, + 82, 1 ] }, diff --git a/src/lib/libraries/decks/animate/lib_animate-a-name.jpg b/src/lib/libraries/decks/animate/lib_animate-a-name.jpg index 139f3f98662f6404daa77d45c162779e2f6a5fad..391eb8971e84e8bb6bf9ff4386d644d59c9fe62b 100644 Binary files a/src/lib/libraries/decks/animate/lib_animate-a-name.jpg and b/src/lib/libraries/decks/animate/lib_animate-a-name.jpg differ diff --git a/src/lib/libraries/decks/chase-game/lib-chasegame.jpg b/src/lib/libraries/decks/chase-game/lib-chasegame.jpg index ec9861467d7d1ab4c1b6a3c8ce26275a47299fa4..6e74c21287268cc7670a037df0099da57a77ac78 100644 Binary files a/src/lib/libraries/decks/chase-game/lib-chasegame.jpg and b/src/lib/libraries/decks/chase-game/lib-chasegame.jpg differ diff --git a/src/lib/libraries/decks/game/lib-pop.jpg b/src/lib/libraries/decks/game/lib-pop.jpg index 4392196fe46382e077e323c082f1c4762cd8c4d3..dfe78f637783619f329a01c3a75ac2d7c4c3c38b 100644 Binary files a/src/lib/libraries/decks/game/lib-pop.jpg and b/src/lib/libraries/decks/game/lib-pop.jpg differ diff --git a/src/lib/libraries/decks/index.jsx b/src/lib/libraries/decks/index.jsx index 941ec9c8ff144eca61ade3749e8062d5d7faa7df..290acaca4b6358a22d22e9d9199f3ebba8768e1a 100644 --- a/src/lib/libraries/decks/index.jsx +++ b/src/lib/libraries/decks/index.jsx @@ -42,6 +42,10 @@ import stepScoreWhenTouch from './chase-game/chase-game-change-score.gif'; // Make-A-Game import libraryMakeAGame from './game/lib-pop.jpg'; +import stepGamePickSprite from './game/game-pick-sprite.gif'; +import stepGamePlaySound from './game/game-play-sound.gif'; +import stepGameAddScore from './game/game-add-score.gif'; +import stepGameChangeScore from './game/game-change-score.gif'; import stepRandom from './game/game-random-position.gif'; import stepGameChangeColor from './game/game-change-color.gif'; import stepResetScore from './game/game-reset-score.gif'; @@ -70,7 +74,7 @@ export default { img: libraryIntro, steps: [{ - video: 'https://www.youtube.com/embed/4CexmCCREZw' + video: 'https://www.youtube.com/embed/h9x8IPGN3SI' }, { title: ( <FormattedMessage @@ -108,7 +112,7 @@ export default { ), img: libraryAnimate, steps: [{ - video: 'https://www.youtube.com/embed/q3nnXj6wr5k' + video: 'https://www.youtube.com/embed/RUih6RnEdPg' }, { title: ( <FormattedMessage @@ -182,7 +186,7 @@ export default { ), img: libraryMakeMusic, steps: [{ - video: 'https://www.youtube.com/embed/o3ih7d_4uv0' + video: 'https://www.youtube.com/embed/UQHHAQGuhl8' }, { title: ( @@ -250,14 +254,51 @@ export default { ), img: libraryMakeAGame, steps: [{ - video: 'https://www.youtube.com/embed/XIz32K91vAk' + video: 'https://www.youtube.com/embed/3G2miGV4TbQ' }, { + title: ( + <FormattedMessage + defaultMessage="Pick A Sprite" + description="Step name for 'Pick A Sprite' step" + id="gui.howtos.Make-A-Game.step_GamePickSprite" + /> + ), + image: stepGamePickSprite + }, { + title: ( + <FormattedMessage + defaultMessage="Play Sound When Clicked" + description="Play Sound When Clicked' step" + id="gui.howtos.make-a-game.step_GamePlaySound" + /> + ), + image: stepGamePlaySound + }, { + title: ( + <FormattedMessage + defaultMessage="Create Score Variable" + description="Step name for 'Create Score Variable' step" + id="gui.howtos.make-a-game.step_GameAddScore" + /> + ), + image: stepGameAddScore + }, { + title: ( + <FormattedMessage + defaultMessage="When Clicked Increase Score" + description="Step name for 'When Clicked Increase Score' step" + id="gui.howtos.make-a-game.step_GameChangeScore" + /> + ), + + image: stepGameChangeScore + }, { title: ( <FormattedMessage defaultMessage="Go to a random position" description="Step name for 'Go to a random position' step" - id="gui.howtos.Make-A-Game.step_RandomPosition" + id="gui.howtos.make-a-game.step_Random" /> ), image: stepRandom @@ -266,7 +307,7 @@ export default { <FormattedMessage defaultMessage="Change Color" description="Step name for 'Change Color' step" - id="gui.howtos.make-a-game.step_ChangeColor" + id="gui.howtos.make-music.step_GameChangeColor" /> ), image: stepGameChangeColor @@ -282,8 +323,8 @@ export default { }, { deckIds: [ 'add-a-backdrop', - 'add-effects', - 'move-around-with-arrow-keys' + 'move-around-with-arrow-keys', + 'add-effects' ] } ] @@ -299,7 +340,7 @@ export default { ), img: libraryChaseGame, steps: [{ - video: 'https://www.youtube.com/embed/PoQO35QmlVA' + video: 'https://www.youtube.com/embed/IRf9-P8PiZo' }, { title: ( @@ -430,12 +471,12 @@ export default { ), img: addBackdropThumb, steps: [{ - video: 'https://www.youtube.com/embed/WpV05Q7AbPU' + video: 'https://www.youtube.com/embed/Xv3Z80yy2l0' }, { deckIds: [ - 'add-a-backdrop', + 'change-size', 'switch-costume', - 'change-size' + 'spin-video' ] }] }, @@ -449,12 +490,12 @@ export default { ), img: changeSizeThumb, steps: [{ - video: 'https://www.youtube.com/embed/NiK9KcghZ9s' + video: 'https://www.youtube.com/embed/PJijGbhcT3E' }, { deckIds: [ - 'add-a-backdrop', - 'switch-costume', - 'change-size' + 'glide-around', + 'spin-video', + 'switch-costume' ] }] }, @@ -468,7 +509,7 @@ export default { ), img: glideAroundThumb, steps: [{ - video: 'https://www.youtube.com/embed/WUcmsMEIbGg' + video: 'https://www.youtube.com/embed/KYmbgLX1xDs' }, { deckIds: [ 'add-a-backdrop', @@ -488,7 +529,7 @@ export default { ), img: recordASound, steps: [{ - video: 'https://www.youtube.com/embed/epZQpVdf884' + video: 'https://www.youtube.com/embed/1WaU6e70Zig' }, { deckIds: [ 'Make-Music', @@ -502,7 +543,7 @@ export default { name: 'Make It Spin', img: spinThumb, steps: [{ - video: 'https://www.youtube.com/embed/rHP3aojB_6w' + video: 'https://www.youtube.com/embed/C76V5cuI9XM' }, { deckIds: [ 'add-a-backdrop', @@ -521,7 +562,7 @@ export default { ), img: hideAndShowThumb, steps: [{ - video: 'https://www.youtube.com/embed/jpvqnlfsDTU' + video: 'https://www.youtube.com/embed/6yWUvRU19ms' }, { deckIds: [ 'add-a-backdrop', @@ -541,7 +582,7 @@ export default { ), img: switchCostumeThumb, steps: [{ - video: 'https://www.youtube.com/embed/AUBoFxQDPWA' + video: 'https://www.youtube.com/embed/vppgw1Xiegw' }, { deckIds: [ 'add-a-backdrop', @@ -555,7 +596,7 @@ export default { name: 'Use Arrow Keys', img: moveArrowKeysThumb, steps: [{ - video: 'https://www.youtube.com/embed/7DUA_Yl0B_M' + video: 'https://www.youtube.com/embed/uf6agkKnXJw' }, { deckIds: [ 'add-a-backdrop', @@ -574,7 +615,7 @@ export default { ), img: addEffectsThumb, steps: [{ - video: 'https://www.youtube.com/embed/ORuohhkx15g' + video: 'https://www.youtube.com/embed/w3kGWEzRtxY' }, { deckIds: [ 'add-a-backdrop', diff --git a/src/lib/libraries/decks/intro/lib-getting-started.jpg b/src/lib/libraries/decks/intro/lib-getting-started.jpg index fd081dbd36ffc5e098211d8dcc9d0ce9f71e9a32..553e881d9a3bdd035dfa5063cdf7cdd2af9910f5 100644 Binary files a/src/lib/libraries/decks/intro/lib-getting-started.jpg and b/src/lib/libraries/decks/intro/lib-getting-started.jpg differ diff --git a/src/lib/libraries/decks/make-music/lib-make-music.jpg b/src/lib/libraries/decks/make-music/lib-make-music.jpg index 7fbde54be655be317eb6812c96a04bf74cff10ad..a00248320ac137cac71092d5c4ed2fc17d142ab3 100644 Binary files a/src/lib/libraries/decks/make-music/lib-make-music.jpg and b/src/lib/libraries/decks/make-music/lib-make-music.jpg differ diff --git a/src/lib/libraries/decks/spin/change-color.gif b/src/lib/libraries/decks/spin/change-color.gif deleted file mode 100644 index dca51dad4e1c4b8de89436c025ce38d0f03c45c4..0000000000000000000000000000000000000000 Binary files a/src/lib/libraries/decks/spin/change-color.gif and /dev/null differ diff --git a/src/lib/libraries/decks/spin/click-control.gif b/src/lib/libraries/decks/spin/click-control.gif deleted file mode 100644 index 24128a0edd07854a4415e0c467d273558b70afa5..0000000000000000000000000000000000000000 Binary files a/src/lib/libraries/decks/spin/click-control.gif and /dev/null differ diff --git a/src/lib/libraries/decks/spin/click-forever.gif b/src/lib/libraries/decks/spin/click-forever.gif deleted file mode 100644 index f9d465bc093cb70428ad09e1db37ba2b78057977..0000000000000000000000000000000000000000 Binary files a/src/lib/libraries/decks/spin/click-forever.gif and /dev/null differ diff --git a/src/lib/libraries/decks/spin/click-turn.gif b/src/lib/libraries/decks/spin/click-turn.gif deleted file mode 100644 index af887244849f335a7b29b0abbcac2b96f2db0ef9..0000000000000000000000000000000000000000 Binary files a/src/lib/libraries/decks/spin/click-turn.gif and /dev/null differ diff --git a/src/lib/libraries/decks/spin/drag-forever.gif b/src/lib/libraries/decks/spin/drag-forever.gif deleted file mode 100644 index a51d6b4385d2d4d45d6bc15aca2913f0c4f9b6bc..0000000000000000000000000000000000000000 Binary files a/src/lib/libraries/decks/spin/drag-forever.gif and /dev/null differ diff --git a/src/lib/libraries/decks/spin/drag-turn.gif b/src/lib/libraries/decks/spin/drag-turn.gif deleted file mode 100644 index 8df663eaf9316622017ee86a8d100750e97670f4..0000000000000000000000000000000000000000 Binary files a/src/lib/libraries/decks/spin/drag-turn.gif and /dev/null differ diff --git a/src/lib/libraries/decks/spin/library-spin.gif b/src/lib/libraries/decks/spin/library-spin.gif deleted file mode 100644 index 12e60ecf79b543f77a9840fa687a903d69c3db32..0000000000000000000000000000000000000000 Binary files a/src/lib/libraries/decks/spin/library-spin.gif and /dev/null differ diff --git a/src/lib/libraries/decks/spin/thumb-spin.gif b/src/lib/libraries/decks/spin/thumb-spin.gif deleted file mode 100644 index e151455be735a0a8a65af10a2c85691ff66790f1..0000000000000000000000000000000000000000 Binary files a/src/lib/libraries/decks/spin/thumb-spin.gif and /dev/null differ diff --git a/src/lib/libraries/decks/sprite/cover-add-sprite.jpg b/src/lib/libraries/decks/sprite/cover-add-sprite.jpg index c0a0359e0c4e7918ab5c11126667bf9cf6181d00..e7a13449072b9a9c61e6868799032b06b5242169 100644 Binary files a/src/lib/libraries/decks/sprite/cover-add-sprite.jpg and b/src/lib/libraries/decks/sprite/cover-add-sprite.jpg differ diff --git a/src/lib/libraries/decks/videos/add-backdrop.jpg b/src/lib/libraries/decks/videos/add-backdrop.jpg index ec5062c82d92cee30fcb42256fcf3619aaf4e0bc..f046afb70cca9a66707b74171cec2473ab9030e6 100644 Binary files a/src/lib/libraries/decks/videos/add-backdrop.jpg and b/src/lib/libraries/decks/videos/add-backdrop.jpg differ diff --git a/src/lib/libraries/decks/videos/add-effects.jpg b/src/lib/libraries/decks/videos/add-effects.jpg index 2f266057c6f122b455d49aec35b619820cc7c63d..bb773b2ea6d926c8ac53678ca5df0e709f0f963d 100644 Binary files a/src/lib/libraries/decks/videos/add-effects.jpg and b/src/lib/libraries/decks/videos/add-effects.jpg differ diff --git a/src/lib/libraries/decks/videos/animate-sprite.jpg b/src/lib/libraries/decks/videos/animate-sprite.jpg index e6eb10d67018f2dafa471766c56096130d77b92b..b67c47bbb0f7014dc47d809df376508b3d8eb80e 100644 Binary files a/src/lib/libraries/decks/videos/animate-sprite.jpg and b/src/lib/libraries/decks/videos/animate-sprite.jpg differ diff --git a/src/lib/libraries/decks/videos/change-size.jpg b/src/lib/libraries/decks/videos/change-size.jpg index 6f391b78f0e03784d2ca0238a48948a87b053cd3..e496a7d81fe4ccca1d49578d0a361a89005783d0 100644 Binary files a/src/lib/libraries/decks/videos/change-size.jpg and b/src/lib/libraries/decks/videos/change-size.jpg differ diff --git a/src/lib/libraries/decks/videos/glide-around.jpg b/src/lib/libraries/decks/videos/glide-around.jpg index ee006c3bef02cf0296eec4e9779be06507a3924a..b9e140c452e45ea01f81bf89fe0854c6579ea54c 100644 Binary files a/src/lib/libraries/decks/videos/glide-around.jpg and b/src/lib/libraries/decks/videos/glide-around.jpg differ diff --git a/src/lib/libraries/decks/videos/hide-and-show.jpg b/src/lib/libraries/decks/videos/hide-and-show.jpg index a5e561c61ae84a1ad25968bd3653f6d7948b345e..564d6b958d2579a07c87915470a7ad438ef268b6 100644 Binary files a/src/lib/libraries/decks/videos/hide-and-show.jpg and b/src/lib/libraries/decks/videos/hide-and-show.jpg differ diff --git a/src/lib/libraries/decks/videos/move-arrow-keys.jpg b/src/lib/libraries/decks/videos/move-arrow-keys.jpg index ada61ee67adee18fcfff0fb8484fa00dfa332449..6524b5d6c7416cdf9d6e91041cb4c49987d38bc6 100644 Binary files a/src/lib/libraries/decks/videos/move-arrow-keys.jpg and b/src/lib/libraries/decks/videos/move-arrow-keys.jpg differ diff --git a/src/lib/libraries/decks/videos/record-a-sound.jpg b/src/lib/libraries/decks/videos/record-a-sound.jpg index afc27c0ce8f8a6d07c7d689daf0554957bf8f0d9..355ff325b4aeda571281e99ff43231d91efab2be 100644 Binary files a/src/lib/libraries/decks/videos/record-a-sound.jpg and b/src/lib/libraries/decks/videos/record-a-sound.jpg differ diff --git a/src/lib/libraries/decks/videos/spin.jpg b/src/lib/libraries/decks/videos/spin.jpg index c9c541fc5338103a6e209e63bb2b44f2ae932623..8c7004f39202252f384b452def63595258dcdd0c 100644 Binary files a/src/lib/libraries/decks/videos/spin.jpg and b/src/lib/libraries/decks/videos/spin.jpg differ diff --git a/src/lib/libraries/extensions/index.jsx b/src/lib/libraries/extensions/index.jsx index dfe1416464f6c3a063b68b4a9ee55fbbb39cf65f..316980efe165795e21614439d23e32c29a4679c8 100644 --- a/src/lib/libraries/extensions/index.jsx +++ b/src/lib/libraries/extensions/index.jsx @@ -4,18 +4,15 @@ import {FormattedMessage} from 'react-intl'; import musicImage from './music.png'; import penImage from './pen.png'; import videoImage from './video-sensing.png'; -import speechImage from './speech.png'; +import translateImage from './translate.png'; import microbitImage from './microbit.png'; -import wedoImage from './wedo.png'; import ev3Image from './ev3.png'; -import boostImage from './boost.png'; -import translateImage from './translate.png'; - -import ev3DeviceImage from './device-connection/ev3/ev3-hub-illustration.svg'; -import ev3MenuImage from './device-connection/ev3/ev3-small.svg'; +import wedoImage from './wedo.png'; import microbitDeviceImage from './device-connection/microbit/microbit-illustration.svg'; import microbitMenuImage from './device-connection/microbit/microbit-small.svg'; +import ev3DeviceImage from './device-connection/ev3/ev3-hub-illustration.svg'; +import ev3MenuImage from './device-connection/ev3/ev3-small.svg'; export default [ { @@ -59,37 +56,18 @@ export default [ { name: ( <FormattedMessage - defaultMessage="Google Translate" - description="Name for the 'Google Translate' extension" - id="gui.extension.googletranslate.name" - /> - ), - extensionId: 'translate', - iconURL: translateImage, - description: ( - <FormattedMessage - defaultMessage="Translate text into many languages." - description="Description for the 'Google Translate' extension. Do not translate 'Google'" - id="gui.extension.googletranslate.description" - /> - ), - featured: true - }, - { - name: ( - <FormattedMessage - defaultMessage="Video Motion" - description="Name for the 'Video Motion' extension" - id="gui.extension.videomotion.name" + defaultMessage="Video Sensing" + description="Name for the 'Video Sensing' extension" + id="gui.extension.videosensing.name" /> ), extensionId: 'videoSensing', iconURL: videoImage, description: ( <FormattedMessage - defaultMessage="Detect motion with the camera." - description="Description for the 'Video Motion' extension" - id="gui.extension.videomotion.description" + defaultMessage="Sense motion with the camera." + description="Description for the 'Video Sensing' extension" + id="gui.extension.videosensing.description" /> ), featured: true @@ -97,22 +75,21 @@ export default [ { name: ( <FormattedMessage - defaultMessage="Speech Recognition" - description="Name for the 'Speech Recognition' extension" - id="gui.extension.speechrecognition.name" + defaultMessage="Google Translate" + description="Name for the 'Google Translate' extension. Do not translate 'Google'." + id="gui.extension.googletranslate.name" /> ), - extensionId: 'speech', - iconURL: speechImage, + extensionId: 'translate', + iconURL: translateImage, description: ( <FormattedMessage - defaultMessage="Talk to your projects." - description="Description for the 'Speech Recognition' extension" - id="gui.extension.speechrecognition.description" + defaultMessage="Translate text into many languages." + description="Description for the 'Google Translate' extension" + id="gui.extension.googletranslate.description" /> ), - featured: true, - disabled: true + featured: true }, { name: 'micro:bit', @@ -126,24 +103,18 @@ export default [ /> ), featured: true, - disabled: true, + disabled: false, launchDeviceConnectionFlow: true, deviceImage: microbitDeviceImage, - smallDeviceImage: microbitMenuImage - }, - { - name: 'LEGO WeDo 2.0', - extensionId: 'wedo2', - iconURL: wedoImage, - description: ( + smallDeviceImage: microbitMenuImage, + connectingMessage: ( <FormattedMessage - defaultMessage="Build with motors and sensors." - description="Description for the 'LEGO WeDo 2.0' extension" - id="gui.extension.wedo2.description" + defaultMessage="Connecting" + description="Message to help people connect to their micro:bit." + id="gui.extension.microbit.connectingMessage" /> ), - featured: true, - disabled: true + helpLink: 'https://scratch.mit.edu/microbit' }, { name: 'LEGO MINDSTORMS EV3', @@ -157,20 +128,28 @@ export default [ /> ), featured: true, - disabled: true, + disabled: false, launchDeviceConnectionFlow: true, deviceImage: ev3DeviceImage, - smallDeviceImage: ev3MenuImage + smallDeviceImage: ev3MenuImage, + connectingMessage: ( + <FormattedMessage + defaultMessage="Connecting. Make sure the pin on your EV3 is set to 1234." + description="Message to help people connect to their EV3. Must note the PIN should be 1234." + id="gui.extension.ev3.connectingMessage" + /> + ), + helpLink: 'https://scratch.mit.edu/ev3' }, { - name: 'LEGO Boost', - extensionId: 'boost', - iconURL: boostImage, + name: 'LEGO WeDo 2.0', + extensionId: 'wedo2', + iconURL: wedoImage, description: ( <FormattedMessage defaultMessage="Build with motors and sensors." - description="Description for the 'LEGO Boost' extension" - id="gui.extension.boost.description" + description="Description for the 'LEGO WeDo 2.0' extension" + id="gui.extension.wedo2.description" /> ), featured: true, diff --git a/src/lib/libraries/sounds.json b/src/lib/libraries/sounds.json index f62f90b02916ee36d31ed3be3a5c530cda1d054c..15934e3574340bba9e1b5ce197fa1a9c262e2320 100644 --- a/src/lib/libraries/sounds.json +++ b/src/lib/libraries/sounds.json @@ -1118,6 +1118,14 @@ "electronic" ] }, + { + "name": "Dance Celebrate2", + "md5": "0edb8fb88af19e6e17d0f8cf64c1d136.wav", + "sampleCount": 176401, + "rate": 22050, + "format": "adpcm", + "tags": [] + }, { "name": "Dance Chill Out", "md5": "b235da45581b1f212c9e9cce70d2a2dc.wav", diff --git a/src/lib/libraries/sprites.json b/src/lib/libraries/sprites.json index 904d2ae9387a85b1e53c31708f474dea1e352a1c..0c69aa5ebb741e487114abb5a77cc4554f9c0ea9 100644 --- a/src/lib/libraries/sprites.json +++ b/src/lib/libraries/sprites.json @@ -116,6 +116,81 @@ "spriteInfo": {} } }, + { + "name": "Andie", + "md5": "936abdaaac3a3f7d27e5f30b3da00e5f.svg", + "type": "sprite", + "tags": [ + "sports", + "basketball", + "people", + "wheelchair", + "handicap", + "handicapable", + "alex eben meyer" + ], + "info": [ + 0, + 4, + 1 + ], + "json": { + "objName": "Andie", + "sounds": [ + { + "soundName": "pop", + "soundID": -1, + "md5": "83a9787d4cb6f3b7632b4ddfebf74367.wav", + "sampleCount": 258, + "rate": 11025, + "format": "" + } + ], + "costumes": [ + { + "costumeName": "andie-a", + "baseLayerID": -1, + "baseLayerMD5": "936abdaaac3a3f7d27e5f30b3da00e5f.svg", + "bitmapResolution": 1, + "rotationCenterX": 86, + "rotationCenterY": 77 + }, + { + "costumeName": "andie-b", + "baseLayerID": -1, + "baseLayerMD5": "cc2953492b40e231fdee3d8c9994a646.svg", + "bitmapResolution": 1, + "rotationCenterX": 46, + "rotationCenterY": 77 + }, + { + "costumeName": "andie-c", + "baseLayerID": -1, + "baseLayerMD5": "76e26ccb79a94d3e89f67e64b4cb9731.svg", + "bitmapResolution": 1, + "rotationCenterX": 52, + "rotationCenterY": 36 + }, + { + "costumeName": "andie-d", + "baseLayerID": -1, + "baseLayerMD5": "80fa011244f3e3be56b96ebcb9e40d59.svg", + "bitmapResolution": 1, + "rotationCenterX": 86, + "rotationCenterY": 43 + } + ], + "currentCostumeIndex": 0, + "scratchX": -129, + "scratchY": -73, + "scale": 1, + "direction": 90, + "rotationStyle": "normal", + "isDraggable": false, + "visible": true, + "spriteInfo": {} + } + }, { "name": "Anina Dance", "md5": "9374e067ca4b66427fc64a0822f6e468.png", @@ -810,8 +885,8 @@ } ], "currentCostumeIndex": 0, - "scratchX": 77, - "scratchY": -115, + "scratchX": 202, + "scratchY": -108, "scale": 1, "direction": 90, "rotationStyle": "normal", @@ -822,7 +897,7 @@ }, { "name": "Bat", - "md5": "a68f7a0b2af7514c729bb083d04dbbde.svg", + "md5": "3b6274510488d5b26447c1c266475801.svg", "type": "sprite", "tags": [ "fantasy", @@ -853,39 +928,39 @@ { "costumeName": "bat-a", "baseLayerID": -1, - "baseLayerMD5": "a68f7a0b2af7514c729bb083d04dbbde.svg", + "baseLayerMD5": "3b6274510488d5b26447c1c266475801.svg", "bitmapResolution": 1, - "rotationCenterX": 51, - "rotationCenterY": 47 + "rotationCenterX": 65, + "rotationCenterY": 61 }, { "costumeName": "bat-b", "baseLayerID": -1, - "baseLayerMD5": "4ea5bb61370e189d2eba763312680201.svg", + "baseLayerMD5": "8b20987d450379a445cbfc41ff2a3874.svg", "bitmapResolution": 1, - "rotationCenterX": 51, - "rotationCenterY": 47 + "rotationCenterX": 65, + "rotationCenterY": 61 }, { "costumeName": "bat-c", "baseLayerID": -1, - "baseLayerMD5": "9ed4deead22db511202f38abadf508c4.svg", + "baseLayerMD5": "c6d6a6892638e489902fbba803050de1.svg", "bitmapResolution": 1, - "rotationCenterX": 51, - "rotationCenterY": 47 + "rotationCenterX": 65, + "rotationCenterY": 61 }, { "costumeName": "bat-d", "baseLayerID": -1, - "baseLayerMD5": "293a7b03badd2f3b49e50acfb9c242ec.svg", + "baseLayerMD5": "e3da64838b2c74b6dd9a080b030e327e.svg", "bitmapResolution": 1, - "rotationCenterX": 51, - "rotationCenterY": 47 + "rotationCenterX": 65, + "rotationCenterY": 61 } ], "currentCostumeIndex": 0, - "scratchX": -39, - "scratchY": 121, + "scratchX": -48, + "scratchY": 109, "scale": 1, "direction": 90, "rotationStyle": "normal", @@ -2090,7 +2165,7 @@ "costumes": [ { "costumeName": "cake-a", - "baseLayerID": 0, + "baseLayerID": -1, "baseLayerMD5": "e1e8e8a765b8778d6181035c5c66984d.svg", "bitmapResolution": 1, "rotationCenterX": 64, @@ -2098,7 +2173,7 @@ }, { "costumeName": "cake-b", - "baseLayerID": 1, + "baseLayerID": -1, "baseLayerMD5": "460268a804e7682c9fabf37e4b70071c.svg", "bitmapResolution": 1, "rotationCenterX": 64, @@ -2343,7 +2418,7 @@ ], "costumes": [ { - "costumeName": "cat1", + "costumeName": "cat-a", "baseLayerID": -1, "baseLayerMD5": "09dc888b0b7df19f70d81588ae73420e.svg", "bitmapResolution": 1, @@ -2351,7 +2426,7 @@ "rotationCenterY": 55 }, { - "costumeName": "cat2", + "costumeName": "cat-b", "baseLayerID": -1, "baseLayerMD5": "3696356a03a8d938318876a593572843.svg", "bitmapResolution": 1, @@ -2371,53 +2446,46 @@ } }, { - "name": "Cat1 Flying", - "md5": "1e81725d2d2c7de4a2dd4a145198a43c.svg", + "name": "Cat 2", + "md5": "01ae57fd339529445cb890978ef8a054.svg", "type": "sprite", "tags": [ - "animals", "cat", "kitty", - "kitten" + "kitten", + "animal", + "mammal" ], "info": [ 0, - 2, + 1, 1 ], "json": { - "objName": "Cat1 Flying", + "objName": "Cat 2", "sounds": [ { - "soundName": "pop", + "soundName": "meow2", "soundID": -1, - "md5": "83a9787d4cb6f3b7632b4ddfebf74367.wav", - "sampleCount": 258, + "md5": "cf51a0c4088942d95bcc20af13202710.wav", + "sampleCount": 6512, "rate": 11025, "format": "" } ], "costumes": [ { - "costumeName": "cat1 flying-a", - "baseLayerID": -1, - "baseLayerMD5": "1e81725d2d2c7de4a2dd4a145198a43c.svg", - "bitmapResolution": 1, - "rotationCenterX": 67, - "rotationCenterY": 48 - }, - { - "costumeName": "cat1 flying-b", + "costumeName": "cat 2", "baseLayerID": -1, - "baseLayerMD5": "0d192725870ef0eda50d91cab0e3c9c5.svg", + "baseLayerMD5": "01ae57fd339529445cb890978ef8a054.svg", "bitmapResolution": 1, - "rotationCenterX": 42, - "rotationCenterY": 44 + "rotationCenterX": 87, + "rotationCenterY": 39 } ], "currentCostumeIndex": 0, - "scratchX": -53, - "scratchY": -14, + "scratchX": -71, + "scratchY": 1, "scale": 1, "direction": 90, "rotationStyle": "normal", @@ -2427,46 +2495,53 @@ } }, { - "name": "Cat2", - "md5": "01ae57fd339529445cb890978ef8a054.svg", + "name": "Cat Flying", + "md5": "1e81725d2d2c7de4a2dd4a145198a43c.svg", "type": "sprite", "tags": [ + "animals", "cat", "kitty", - "kitten", - "animal", - "mammal" + "kitten" ], "info": [ 0, - 1, + 2, 1 ], "json": { - "objName": "Cat2", + "objName": "Cat Flying", "sounds": [ { - "soundName": "meow2", + "soundName": "pop", "soundID": -1, - "md5": "cf51a0c4088942d95bcc20af13202710.wav", - "sampleCount": 6512, + "md5": "83a9787d4cb6f3b7632b4ddfebf74367.wav", + "sampleCount": 258, "rate": 11025, "format": "" } ], "costumes": [ { - "costumeName": "cat2", + "costumeName": "cat flying-a", "baseLayerID": -1, - "baseLayerMD5": "01ae57fd339529445cb890978ef8a054.svg", + "baseLayerMD5": "1e81725d2d2c7de4a2dd4a145198a43c.svg", "bitmapResolution": 1, - "rotationCenterX": 87, - "rotationCenterY": 39 + "rotationCenterX": 67, + "rotationCenterY": 48 + }, + { + "costumeName": "cat flying-b", + "baseLayerID": -1, + "baseLayerMD5": "0d192725870ef0eda50d91cab0e3c9c5.svg", + "bitmapResolution": 1, + "rotationCenterX": 42, + "rotationCenterY": 44 } ], "currentCostumeIndex": 0, - "scratchX": -71, - "scratchY": 1, + "scratchX": -53, + "scratchY": -14, "scale": 1, "direction": 90, "rotationStyle": "normal", @@ -3144,7 +3219,7 @@ }, { "name": "D-Money Dance", - "md5": "b30a60d31aebead577b73affd22bf30f.svg", + "md5": "09dc9d82f097edfc6b2b6e4b5009c5f6.png", "type": "sprite", "tags": [ "people", @@ -3171,23 +3246,23 @@ { "costumeName": "dm stance", "baseLayerID": -1, - "baseLayerMD5": "b30a60d31aebead577b73affd22bf30f.svg", - "bitmapResolution": 1, - "rotationCenterX": 55, - "rotationCenterY": 119 + "baseLayerMD5": "09dc9d82f097edfc6b2b6e4b5009c5f6.png", + "bitmapResolution": 2, + "rotationCenterX": 106, + "rotationCenterY": 238 }, { "costumeName": "dm top stand", - "baseLayerID": -1, - "baseLayerMD5": "051c36758b9fd1136b511efc5dd6234a.png", + "baseLayerID": 0, + "baseLayerMD5": "a22da98e5e63de7b2883355afd0184f0.png", "bitmapResolution": 2, "rotationCenterX": 82, "rotationCenterY": 244 }, { "costumeName": "dm top R leg", - "baseLayerID": -1, - "baseLayerMD5": "6cea0c29c460e571226cc4cff5b97c28.png", + "baseLayerID": 1, + "baseLayerMD5": "12db59633a1709a2c39534d35263791f.png", "bitmapResolution": 2, "rotationCenterX": 218, "rotationCenterY": 232 @@ -4177,8 +4252,8 @@ } ], "currentCostumeIndex": 0, - "scratchX": -108, - "scratchY": -61, + "scratchX": -24, + "scratchY": -57, "scale": 1, "direction": 90, "rotationStyle": "normal", @@ -5457,8 +5532,8 @@ } ], "currentCostumeIndex": 0, - "scratchX": -110, - "scratchY": -24, + "scratchX": -115, + "scratchY": -46, "scale": 1, "direction": 90, "rotationStyle": "normal", @@ -7239,7 +7314,7 @@ "costumes": [ { "costumeName": "headband", - "baseLayerID": 0, + "baseLayerID": -1, "baseLayerMD5": "237f77cb3e41c70f714c6d2aa4d38ea1.svg", "bitmapResolution": 1, "rotationCenterX": 53, @@ -7458,7 +7533,7 @@ "costumes": [ { "costumeName": "hedgehog-a", - "baseLayerID": 0, + "baseLayerID": -1, "baseLayerMD5": "32416e6b2ef8e45fb5fd10778c1b9a9f.svg", "bitmapResolution": 1, "rotationCenterX": 71, @@ -7466,7 +7541,7 @@ }, { "costumeName": "hedgehog-b", - "baseLayerID": 1, + "baseLayerID": -1, "baseLayerMD5": "4d3ccc06660e07b55bd38246e1f82f7f.svg", "bitmapResolution": 1, "rotationCenterX": 71, @@ -7474,7 +7549,7 @@ }, { "costumeName": "hedgehog-c", - "baseLayerID": 2, + "baseLayerID": -1, "baseLayerMD5": "2446f79c0f553594cfbcdbe6b1e459a5.svg", "bitmapResolution": 1, "rotationCenterX": 71, @@ -7482,7 +7557,7 @@ }, { "costumeName": "hedgehog-d", - "baseLayerID": 3, + "baseLayerID": -1, "baseLayerMD5": "bdb7c8e86125092da0c4848d1ffd901c.svg", "bitmapResolution": 1, "rotationCenterX": 71, @@ -7490,7 +7565,7 @@ }, { "costumeName": "hedgehog-e", - "baseLayerID": 4, + "baseLayerID": -1, "baseLayerMD5": "78a0e3789f6d778e20f9bf3d308a0b19.svg", "bitmapResolution": 1, "rotationCenterX": 61, @@ -7846,7 +7921,7 @@ } }, { - "name": "Jamie", + "name": "Jamal", "md5": "90f9166fe6500d0c0caad8b1964d6b74.svg", "type": "sprite", "tags": [ @@ -7861,7 +7936,7 @@ 1 ], "json": { - "objName": "Jamie", + "objName": "Jamal", "sounds": [ { "soundName": "pop", @@ -7874,7 +7949,7 @@ ], "costumes": [ { - "costumeName": "jamie-a", + "costumeName": "jamal-a", "baseLayerID": -1, "baseLayerMD5": "90f9166fe6500d0c0caad8b1964d6b74.svg", "bitmapResolution": 1, @@ -7882,7 +7957,7 @@ "rotationCenterY": 105 }, { - "costumeName": "jamie-b", + "costumeName": "jamal-b", "baseLayerID": -1, "baseLayerMD5": "c3d96ef7e99440c2fa76effce1235d3f.svg", "bitmapResolution": 1, @@ -7890,7 +7965,7 @@ "rotationCenterY": 105 }, { - "costumeName": "jamie-c", + "costumeName": "jamal-c", "baseLayerID": -1, "baseLayerMD5": "1fb8b9ca79f2c0a327913bd647b53fe5.svg", "bitmapResolution": 1, @@ -7898,7 +7973,7 @@ "rotationCenterY": 105 }, { - "costumeName": "jamie-d", + "costumeName": "jamal-d", "baseLayerID": -1, "baseLayerMD5": "4adb87e6123161fcaf02f7ac022a5757.svg", "bitmapResolution": 1, @@ -8224,7 +8299,7 @@ }, { "costumeName": "jo top L leg", - "baseLayerID": 0, + "baseLayerID": -1, "baseLayerMD5": "a12f40b18067bb31746f9cf461de88aa.png", "bitmapResolution": 2, "rotationCenterX": 208, @@ -8232,7 +8307,7 @@ }, { "costumeName": "jo top R cross", - "baseLayerID": 1, + "baseLayerID": -1, "baseLayerMD5": "c2d5519e8a0f2214ff757117038c28dc.png", "bitmapResolution": 2, "rotationCenterX": 144, @@ -8240,7 +8315,7 @@ }, { "costumeName": "jo top L cross", - "baseLayerID": 2, + "baseLayerID": -1, "baseLayerMD5": "2e2a6534d33883fdd2f8471a1adbebb7.png", "bitmapResolution": 2, "rotationCenterX": 84, @@ -8248,7 +8323,7 @@ }, { "costumeName": "jo pop front", - "baseLayerID": 3, + "baseLayerID": -1, "baseLayerMD5": "3d3ea804243800981acabc7caba10939.png", "bitmapResolution": 2, "rotationCenterX": 70, @@ -8256,7 +8331,7 @@ }, { "costumeName": "jo pop down", - "baseLayerID": 4, + "baseLayerID": -1, "baseLayerMD5": "a55fbb529c10f70bcb374aef8a63571b.png", "bitmapResolution": 2, "rotationCenterX": 68, @@ -8264,7 +8339,7 @@ }, { "costumeName": "jo pop left", - "baseLayerID": 5, + "baseLayerID": -1, "baseLayerMD5": "ea812b4c2b2405aa2b73158023298f71.png", "bitmapResolution": 2, "rotationCenterX": 196, @@ -8272,7 +8347,7 @@ }, { "costumeName": "jo pop right", - "baseLayerID": 6, + "baseLayerID": -1, "baseLayerMD5": "01dd2f553c7262329ebaba2516e3a2b1.png", "bitmapResolution": 2, "rotationCenterX": 66, @@ -8280,7 +8355,7 @@ }, { "costumeName": "jo pop L arm", - "baseLayerID": 7, + "baseLayerID": -1, "baseLayerMD5": "a9fbc01a4124d555da12630312e46197.png", "bitmapResolution": 2, "rotationCenterX": 108, @@ -8288,7 +8363,7 @@ }, { "costumeName": "jo pop stand", - "baseLayerID": 8, + "baseLayerID": -1, "baseLayerMD5": "75ee2383fd83992b401c8a0730521d94.png", "bitmapResolution": 2, "rotationCenterX": 78, @@ -8296,7 +8371,7 @@ }, { "costumeName": "jo pop R arm", - "baseLayerID": 9, + "baseLayerID": -1, "baseLayerMD5": "a35a3bbc4e21ce2f5de940adb7017fa6.png", "bitmapResolution": 2, "rotationCenterX": 108, @@ -10361,7 +10436,7 @@ "costumes": [ { "costumeName": "panther-a", - "baseLayerID": 0, + "baseLayerID": -1, "baseLayerMD5": "04ca2c122cff11b9bc23834d6f79361e.svg", "bitmapResolution": 1, "rotationCenterX": 125, @@ -10369,7 +10444,7 @@ }, { "costumeName": "panther-b", - "baseLayerID": 1, + "baseLayerID": -1, "baseLayerMD5": "f8c33765d1105f3bb4cd145fad0f717e.svg", "bitmapResolution": 1, "rotationCenterX": 125, @@ -10377,7 +10452,7 @@ }, { "costumeName": "panther-c", - "baseLayerID": 2, + "baseLayerID": -1, "baseLayerMD5": "096bf9cad84def12eef2b5d84736b393.svg", "bitmapResolution": 1, "rotationCenterX": 125, @@ -11333,7 +11408,7 @@ "costumes": [ { "costumeName": "rabbit-a", - "baseLayerID": 5, + "baseLayerID": -1, "baseLayerMD5": "2f42891c3f3d63c0e591aeabc5946533.svg", "bitmapResolution": 1, "rotationCenterX": 84, @@ -11341,7 +11416,7 @@ }, { "costumeName": "rabbit-b", - "baseLayerID": 6, + "baseLayerID": -1, "baseLayerMD5": "80e05ff501040cdc9f52fa6782e06fd2.svg", "bitmapResolution": 1, "rotationCenterX": 84, @@ -11349,7 +11424,7 @@ }, { "costumeName": "rabbit-c", - "baseLayerID": 7, + "baseLayerID": -1, "baseLayerMD5": "88ed8b7925baa025b6c7fc628a64b9b1.svg", "bitmapResolution": 1, "rotationCenterX": 84, @@ -11357,7 +11432,7 @@ }, { "costumeName": "rabbit-d", - "baseLayerID": 8, + "baseLayerID": -1, "baseLayerMD5": "5f3b8df4d6ab8a72e887f89f554db0be.svg", "bitmapResolution": 1, "rotationCenterX": 84, @@ -11365,7 +11440,7 @@ }, { "costumeName": "rabbit-e", - "baseLayerID": 9, + "baseLayerID": -1, "baseLayerMD5": "3003f1135f4aa3b6c361734243621260.svg", "bitmapResolution": 1, "rotationCenterX": 84, @@ -12888,7 +12963,7 @@ "costumes": [ { "costumeName": "snake-a", - "baseLayerID": 3, + "baseLayerID": -1, "baseLayerMD5": "4d06e12d90479461303d828f0970f2d4.svg", "bitmapResolution": 1, "rotationCenterX": 142, @@ -12896,7 +12971,7 @@ }, { "costumeName": "snake-b", - "baseLayerID": 4, + "baseLayerID": -1, "baseLayerMD5": "a8546a5f9ccaa2bdb678a362c50a17ec.svg", "bitmapResolution": 1, "rotationCenterX": 142, @@ -12904,7 +12979,7 @@ }, { "costumeName": "snake-c", - "baseLayerID": 5, + "baseLayerID": -1, "baseLayerMD5": "d993a7d70179777c14ac91a07e711d90.svg", "bitmapResolution": 1, "rotationCenterX": 142, @@ -13598,13 +13673,11 @@ }, { "name": "Taco", - "md5": "d4a2cea411c6030f017f25184562559d.svg", + "md5": "bc78fb90ed373d56c11d5fafa4203ccd.svg", "type": "sprite", "tags": [ "food", - "waffle", - "yum", - "delicious" + "designerd" ], "info": [ 0, @@ -13625,25 +13698,25 @@ ], "costumes": [ { - "costumeName": "taco-a", + "costumeName": "Taco", "baseLayerID": -1, - "baseLayerMD5": "d4a2cea411c6030f017f25184562559d.svg", + "baseLayerMD5": "bc78fb90ed373d56c11d5fafa4203ccd.svg", "bitmapResolution": 1, - "rotationCenterX": 19, - "rotationCenterY": 15 + "rotationCenterX": 78, + "rotationCenterY": 48 }, { - "costumeName": "taco-b", + "costumeName": "Taco-wizard", "baseLayerID": -1, - "baseLayerMD5": "cef6f6d7c92fc1f008077319ac12dc5e.svg", + "baseLayerMD5": "5e9e65db20d403b590578ed44b1a3792.svg", "bitmapResolution": 1, - "rotationCenterX": 56, - "rotationCenterY": 15 + "rotationCenterX": 125, + "rotationCenterY": 82 } ], "currentCostumeIndex": 0, - "scratchX": 7, - "scratchY": -45, + "scratchX": 0, + "scratchY": 0, "scale": 1, "direction": 90, "rotationStyle": "normal", @@ -14017,7 +14090,7 @@ "costumes": [ { "costumeName": "toucan-a", - "baseLayerID": 6, + "baseLayerID": -1, "baseLayerMD5": "6c8798e606abd728b112aecedb5dc249.svg", "bitmapResolution": 1, "rotationCenterX": 80, @@ -14025,7 +14098,7 @@ }, { "costumeName": "toucan-b", - "baseLayerID": 7, + "baseLayerID": -1, "baseLayerMD5": "a3e12be9efa0e7aa83778f6054c9c541.svg", "bitmapResolution": 1, "rotationCenterX": 80, @@ -14033,7 +14106,7 @@ }, { "costumeName": "toucan-c", - "baseLayerID": 8, + "baseLayerID": -1, "baseLayerMD5": "56522b58a9959fd6152060346129f7cb.svg", "bitmapResolution": 1, "rotationCenterX": 80, diff --git a/src/playground/index.ejs b/src/playground/index.ejs index 3d2394d662f8fd3a36b1aef660f568ba4986b4a3..7a8bb16135e376103098b367b098699b2017d320 100644 --- a/src/playground/index.ejs +++ b/src/playground/index.ejs @@ -3,6 +3,7 @@ <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> + <meta name="google" value="notranslate"> <link rel="shortcut icon" href="static/favicon.ico"> <title><%= htmlWebpackPlugin.options.title %></title> <% if (htmlWebpackPlugin.options.sentryConfig) { %> diff --git a/src/reducers/cards.js b/src/reducers/cards.js index 6f4add89d20b6936e55646f46771072d8d0904f9..ba1c50d8e28af9d3e7a3c234417ccdc09e0b3f07 100644 --- a/src/reducers/cards.js +++ b/src/reducers/cards.js @@ -1,3 +1,5 @@ +import analytics from '../lib/analytics'; + import decks from '../lib/libraries/decks/index.jsx'; const CLOSE_CARDS = 'scratch-gui/cards/CLOSE_CARDS'; @@ -38,6 +40,11 @@ const reducer = function (state, action) { }); case NEXT_STEP: if (state.activeDeckId !== null) { + analytics.event({ + category: 'how-to', + action: 'next step', + label: `${state.activeDeckId} - ${state.step}` + }); return Object.assign({}, state, { step: state.step + 1 }); diff --git a/test/integration/localization.test.js b/test/integration/localization.test.js index deaf1a78814631daa00c044bd595fd31bb6c2fa1..101d3ce8613bd27e89b4e69ddfdfdbe483cfae6f 100644 --- a/test/integration/localization.test.js +++ b/test/integration/localization.test.js @@ -4,11 +4,9 @@ import SeleniumHelper from '../helpers/selenium-helper'; const { clickText, clickXpath, - findByText, getDriver, getLogs, - loadUri, - scope + loadUri } = new SeleniumHelper(); const uri = path.resolve(__dirname, '../../build/index.html'); @@ -24,24 +22,21 @@ describe('Localization', () => { await driver.quit(); }); - // Skipped temporarily while the language selector is marked as - // "Coming Soon" - test.skip('Localization', async () => { + test('Localization', async () => { await loadUri(uri); await clickXpath('//button[@title="tryit"]'); - await clickText('Code'); - await clickXpath('//button[@title="Add Extension"]'); - await clickText('Pen', scope.modal); // Modal closes - await new Promise(resolve => setTimeout(resolve, 1000)); // Wait for scroll animation + await clickXpath('//*[@aria-label="language selector"]'); await clickText('English'); await clickText('Deutsch'); await new Promise(resolve => setTimeout(resolve, 1000)); // wait for blocks refresh - await clickText('Pen'); // will need to be updated when 'Pen' is translated - // Make sure "Add Sprite" has changed to "Figur hinzufügen" - await findByText('Figur hinzufügen'); - // Find the stamp block in German - await findByText('Abdruck'); + // Make sure the blocks are translating + await clickText('Fühlen'); // Sensing category in German + await new Promise(resolve => setTimeout(resolve, 1000)); // wait for blocks to scroll + await clickText('Antwort'); // Find the "answer" block in German + + // Change to the costumes tab to confirm other parts of the GUI are translating + await clickText('Kostüme'); const logs = await getLogs(); await expect(logs).toEqual([]); diff --git a/test/smoke/browser.test.js b/test/smoke/browser.test.js index b822cd1b16515de23db8697bf5f7e61e702eba00..aa894a05578bcebb74f335469ed5e6a2d85710f8 100644 --- a/test/smoke/browser.test.js +++ b/test/smoke/browser.test.js @@ -38,8 +38,7 @@ describe('Smoke tests on older browsers', () => { return expect(isDisplayed).toEqual(true); }); - // Safari 9 has always been blank screened due to lack of Intl polyfill - test.skip('Safari 9 should not be unsupported', async () => { + test('Safari 9 should be supported', async () => { const driverConfig = { browserName: 'safari', platform: 'OS X 10.11', @@ -55,7 +54,7 @@ describe('Smoke tests on older browsers', () => { return expect(isDisplayed).toEqual(true); }); - test('Safari 10 should not be unsupported', async () => { + test('Safari 10 should be supported', async () => { const driverConfig = { browserName: 'safari', platform: 'OS X 10.11',