Compare commits

..
Author SHA1 Message Date
Benjamin Wheeler d0eb28f11c Merge pull request #5362 from benjiwheeler/project-state-tests
refactor onLoadedProject() creator to handle success==false consistently; add tests of project state action creators
2020-03-18 12:04:53 -04:00
DD Liu 731f3bbf5d Merge pull request #5519 from LLK/greenkeeper/scratch-vm-0.2.0-prerelease.20200317155559
Update scratch-vm to the latest version 🚀
2020-03-17 16:08:27 -04:00
greenkeeper[bot] 715e46fe1c chore(package): update lockfile package-lock.json 2020-03-17 16:18:25 +00:00
greenkeeper[bot] cc68eef196 chore(package): update scratch-vm to version 0.2.0-prerelease.20200317155559 2020-03-17 16:18:22 +00:00
picklesrus d20b68c939 Merge pull request #5504 from picklesrus/update-scratch-blocks
Updates scratch-blocks manually
2020-03-11 15:50:55 -04:00
picklesrus 6af3fda54a Updates scratch-blocks manually because https://github.com/LLK/scratch-gui/pull/5501 had package-lock conflicts with the l10n PR 2020-03-11 15:46:32 -04:00
picklesrus 43191504ff Merge pull request #5503 from LLK/greenkeeper/scratch-l10n-3.7.20200310213125
Update scratch-l10n to the latest version 🚀
2020-03-11 15:31:09 -04:00
greenkeeper[bot] 3008feb1de chore(package): update lockfile package-lock.json 2020-03-10 21:33:39 +00:00
greenkeeper[bot] 78c2aea407 chore(package): update scratch-l10n to version 3.7.20200310213125 2020-03-10 21:33:36 +00:00
DD Liu b41b1c11bb Merge pull request #5502 from LLK/greenkeeper/scratch-vm-0.2.0-prerelease.20200310202129
Update scratch-vm to the latest version 🚀
2020-03-10 16:59:00 -04:00
greenkeeper[bot] 8e82c2d1e3 chore(package): update lockfile package-lock.json 2020-03-10 20:29:16 +00:00
greenkeeper[bot] a75e2b0ecf chore(package): update scratch-vm to version 0.2.0-prerelease.20200310202129 2020-03-10 20:29:12 +00:00
Benjamin Wheeler a731370478 Merge pull request #5491 from benjiwheeler/unflakify-blocks-tests
unflakify four blocks integration tests
2020-03-05 22:26:24 -05:00
Ray Schamp f3ced9c9ea Merge pull request #5492 from rschamp/bump-dependencies
Bump scratch-blocks and scratch-l10n versions for release
2020-03-04 16:54:56 -05:00
rschamp dee0320164 Bump scratch-blocks and scratch-l10n 2020-03-04 16:53:51 -05:00
Ray Schamp 942b8d6e6a Merge pull request #5487 from LLK/greenkeeper/initial
Update dependencies to enable Greenkeeper 🌴
2020-03-04 16:48:24 -05:00
rschamp c296732753 Revert "chore(package): update lockfile package-lock.json"
This reverts commit 63bdc80388.
2020-03-04 16:44:20 -05:00
rschamp 212ffb42d3 Revert "chore(package): update dependencies"
This reverts commit a27ddaf4ad.
2020-03-04 16:44:20 -05:00
Ben Wheeler af0088df88 add findByXpath to wait for updated or new items to appear 2020-03-02 13:01:45 -05:00
greenkeeper[bot] 63bdc80388 chore(package): update lockfile package-lock.json 2020-02-28 19:25:19 +00:00
greenkeeper[bot] a27ddaf4ad chore(package): update dependencies 2020-02-28 19:25:15 +00:00
DD Liu 5ee641e70f Merge pull request #5484 from fsih/updateRender
Update render to roll back pen line drawing change
2020-02-28 13:01:11 -05:00
DD Liu e9d16dcd2a Update render to roll back pen line drawing change 2020-02-28 13:00:20 -05:00
DD Liu d156a3d995 Merge pull request #5479 from LLK/updateVm022720
Update vm
2020-02-27 16:58:35 -05:00
DD Liu 1019726bcf Update vm 2020-02-27 16:27:21 -05:00
DD Liu 3fbb7fe8d4 Merge pull request #5478 from fsih/updateRender
Update render
2020-02-27 16:06:06 -05:00
DD Liu 124a6496f5 Update render 2020-02-27 16:05:10 -05:00
Ben Wheeler 2e11787ac5 test resulting projectId; add comments; fix params 2020-02-26 17:05:22 -05:00
chrisgarrity 53bdab3425 Merge pull request #5476 from chrisgarrity/l10n-update-02-25
Update to latest l10n for translations
2020-02-26 16:06:43 -05:00
Chris Garrity 058fd000fa Update to latest l10n for translations 2020-02-26 15:53:25 -05:00
Eric Rosenbaum dc727f1b57 Merge pull request #5469 from ericrosenbaum/bugfix/revert-backdrops
Use 2.0 versions of some svg backdrops
2020-02-20 14:34:04 -05:00
Eric Rosenbaum bab503addb use 2.0 versions of some svg backdrops 2020-02-20 14:21:09 -05:00
Eric Rosenbaum 662726fa52 Merge pull request #5464 from LLK/greenkeeper/scratch-blocks-0.1.0-prerelease.1582033791
Update scratch-blocks to the latest version 🚀
2020-02-19 16:39:27 -05:00
Eric Rosenbaum a0b4aea8a1 Merge branch 'develop' into greenkeeper/scratch-blocks-0.1.0-prerelease.1582033791 2020-02-19 16:39:15 -05:00
Eric Rosenbaum b180dd4c0d Merge pull request #5465 from LLK/greenkeeper/scratch-l10n-3.7.20200218213016
Update scratch-l10n to the latest version 🚀
2020-02-19 16:10:09 -05:00
greenkeeper[bot] 02cdbf68cd chore(package): update lockfile package-lock.json 2020-02-18 22:28:15 +00:00
greenkeeper[bot] f1f1f54ec6 chore(package): update scratch-l10n to version 3.7.20200218213016 2020-02-18 22:28:10 +00:00
greenkeeper[bot] 256bb87858 chore(package): update lockfile package-lock.json 2020-02-18 13:52:38 +00:00
greenkeeper[bot] bdbf99f606 chore(package): update scratch-blocks to version 0.1.0-prerelease.1582033791 2020-02-18 13:52:34 +00:00
Eric Rosenbaum 8e3603aa8b Merge pull request #5395 from ericrosenbaum/feature/full-library-update
Asset library update
2020-02-14 14:02:42 -05:00
Eric Rosenbaum a5baf0cf5f Remove omega symbols from letter names 2020-02-13 15:50:00 -05:00
Ray Schamp 7912e4306c Merge pull request #5459 from LLK/ci-skip-gh-pages
Ignore commits on the gh-pages branch for CI
2020-02-13 15:33:52 -05:00
Ray Schamp 5fa8beb230 Ignore commits on the gh-pages branch for CI
Commits to gh-pages "fail" on CircleCI since there's no config on the branch. Skip these commits using a tag I can't write here because I do want CI to run on this commit :)
2020-02-13 13:14:34 -05:00
Karishma Chadha 9b4b47367b Merge pull request #5457 from LLK/greenkeeper/scratch-paint-0.2.0-prerelease.20200213174123
Update scratch-paint to the latest version 🚀
2020-02-13 12:55:41 -05:00
greenkeeper[bot] f69f4bfe2b chore(package): update lockfile package-lock.json 2020-02-13 17:49:16 +00:00
greenkeeper[bot] 306497c095 chore(package): update scratch-paint to version 0.2.0-prerelease.20200213174123 2020-02-13 17:49:12 +00:00
Karishma Chadha 17cff4775c Merge pull request #5449 from LLK/greenkeeper/scratch-blocks-0.1.0-prerelease.1581428931
Update scratch-blocks to the latest version 🚀
2020-02-12 18:01:33 -05:00
Karishma Chadha 2ee25bcc0f Merge branch 'develop' into greenkeeper/scratch-blocks-0.1.0-prerelease.1581428931 2020-02-12 18:00:54 -05:00
Karishma Chadha 7ed3a6b7c8 Merge pull request #5453 from LLK/greenkeeper/scratch-l10n-3.7.20200212141356
Update scratch-l10n to the latest version 🚀
2020-02-12 17:55:33 -05:00
Eric Rosenbaum 73fad0b7f5 Use title case for all sprite names 2020-02-12 14:34:51 -05:00
Eric Rosenbaum 147a4ed586 fix sprite position randomizer 2020-02-12 14:26:46 -05:00
Eric Rosenbaum b1a3c4b446 update libraries with more 3.0 style properties 2020-02-12 14:23:25 -05:00
DD Liu 4563b41429 Merge pull request #5455 from fsih/updatePaint
Update paint
2020-02-12 13:41:06 -05:00
DD Liu 0c8b982479 Update paint 2020-02-12 13:40:16 -05:00
greenkeeper[bot] e5811f15be chore(package): update lockfile package-lock.json 2020-02-12 14:17:55 +00:00
greenkeeper[bot] a4624da5f2 chore(package): update scratch-l10n to version 3.7.20200212141356 2020-02-12 14:17:51 +00:00
greenkeeper[bot] 5cccd63f6c chore(package): update lockfile package-lock.json 2020-02-11 13:51:34 +00:00
greenkeeper[bot] 33e01c1bdd chore(package): update scratch-blocks to version 0.1.0-prerelease.1581428931 2020-02-11 13:51:30 +00:00
DD Liu 93406fbef7 Merge pull request #5447 from LLK/greenkeeper/scratch-paint-0.2.0-prerelease.20200210174730
Update scratch-paint to the latest version 🚀
2020-02-10 13:21:31 -05:00
greenkeeper[bot] d7cb0126ad chore(package): update lockfile package-lock.json 2020-02-10 17:49:31 +00:00
greenkeeper[bot] 41831eede7 chore(package): update scratch-paint to version 0.2.0-prerelease.20200210174730 2020-02-10 17:49:26 +00:00
Benjamin Wheeler 923b931d90 Merge pull request #5411 from glenpike/glenpike-readme-patch-1
Add note about cloning to README
2020-02-10 10:05:07 -05:00
Bryce Taylor 600172f8fb Merge pull request #5443 from BryceLTaylor/skip-flakey-test
Skip blocks “renaming costume wtih special character” test
2020-02-07 16:50:50 -05:00
BryceLTaylor 41a50b87ab Skip blocks “renaming costume wtih special character” test 2020-02-07 14:05:22 -05:00
DD Liu d99360e021 Merge pull request #5441 from fsih/updateSvgRend
Add back rounded gradient strokes for 2.0 projects
2020-02-07 13:56:01 -05:00
DD Liu 4e4d359d18 Add back rounded gradient strokes for 2.0 projects 2020-02-06 18:08:08 -05:00
DD Liu 92f05792f9 Merge pull request #5439 from fsih/updatePaint
Update paint to roll back centering tool
2020-02-06 12:57:20 -05:00
DD Liu cd9d25ad48 Update paint to roll back centering tool 2020-02-06 12:56:09 -05:00
Benjamin Wheeler e34d5ed67e Merge pull request #5437 from LLK/revert-4809-refactor-file-uploader
Revert "refactor SB* file uploader into top-level HOC"
2020-02-06 11:38:58 -05:00
Benjamin Wheeler af4ad81811 Revert "refactor SB* file uploader into top-level HOC" 2020-02-06 11:33:03 -05:00
Paul Kaplan c368de81fa Merge pull request #5435 from paulkaplan/resync-paint-lock
Resync package-lock for scratch-paint
2020-02-05 19:25:34 -05:00
greenkeeper[bot] 0104f5bec8 chore(package): update lockfile package-lock.json 2020-02-05 19:23:20 -05:00
DD Liu ae8624e7e7 Merge pull request #5433 from fsih/updatePaint
update paint'
2020-02-05 17:42:54 -05:00
DD Liu 7f8b84829e update paint' 2020-02-05 17:42:12 -05:00
DD Liu d4078a795f Merge pull request #5432 from fsih/updateDeps
Update blocks and l10n
2020-02-05 16:41:42 -05:00
DD Liu f381a6a0d8 Update blocks and l10n 2020-02-05 16:40:00 -05:00
Benjamin Wheeler 962ce680c9 Merge pull request #5430 from benjiwheeler/reduce-project-state-file-size
reduce project state machine example image file size
2020-02-05 16:27:40 -05:00
Ben Wheeler 630ba84350 reduce project state image file size 2020-02-05 16:26:21 -05:00
Benjamin Wheeler 51843d6bef Merge pull request #5416 from benjiwheeler/project-state-diagram
Project state diagram
2020-02-05 16:22:04 -05:00
DD Liu 02be2155d9 Merge pull request #5428 from fsih/unUpdateDeps
Revert "Update dependencies"
2020-02-05 15:32:30 -05:00
DD Liu cca695b54e Revert "Update dependencies"
This is to remove the latest svg-renderer change, "add rounded edges to gradient strokes", because we would like to come up with a more comprehensive testing plan before adding it.
2020-02-05 15:13:31 -05:00
Ben Wheeler 4e633cb596 clearer project state example 2020-02-05 13:38:01 -05:00
DD Liu 8dc343c90d Merge pull request #5427 from LLK/greenkeeper/mkdirp-1.0.3
Greenkeeper/mkdirp 1.0.3
2020-02-05 13:03:56 -05:00
DD Liu 369eb8c3cf Merge pull request #5426 from LLK/greenkeeper/chromedriver-80.0.0
Greenkeeper/chromedriver 80.0.0
2020-02-05 11:02:41 -05:00
Eric Rosenbaum a7021e32a4 Default to first costume using sb3 property currentCostume
and remove the sb2 property currentCostumeIndex
2020-02-05 10:10:46 -05:00
Eric Rosenbaum 863276e75d Ballerina costume fixes 2020-02-05 09:44:12 -05:00
DD Liu de9dbe08f4 Merge pull request #5424 from fsih/updateDeps
Update dependencies
2020-02-04 21:38:46 -05:00
DD Liu c050829a75 Update dependencies 2020-02-04 21:28:20 -05:00
greenkeeper[bot] 6e57ea1c91 chore(package): update lockfile package-lock.json 2020-02-05 00:10:26 +00:00
greenkeeper[bot] 53d09e2162 chore(package): update chromedriver to version 80.0.0
Closes #5335
2020-02-05 00:10:22 +00:00
Benjamin Wheeler 5d9afb008a Merge pull request #4809 from benjiwheeler/refactor-file-uploader
refactor SB* file uploader into top-level HOC
2020-02-04 17:32:04 -05:00
Ben Wheeler d19cf91205 removed stale comments 2020-02-04 17:30:33 -05:00
DD Liu 4f70b0f924 Merge pull request #5417 from LLK/greenkeeper/scratch-paint-0.2.0-prerelease.20200204155336
Greenkeeper/scratch paint 0.2.0 prerelease.20200204155336
2020-02-04 16:41:51 -05:00
Ben Wheeler f8a0f46959 added project state example 2020-02-04 13:11:48 -05:00
Ben Wheeler faf0dd2f13 added project state diagram 2020-02-04 13:00:52 -05:00
Ben Wheeler cbb908831d Fixed typo 2020-02-04 11:30:57 -05:00
greenkeeper[bot] b44c0c355a chore(package): update lockfile package-lock.json 2020-02-04 16:09:21 +00:00
greenkeeper[bot] ffa364ed64 chore(package): update scratch-paint to version 0.2.0-prerelease.20200204155336
Closes #5405
2020-02-04 16:09:16 +00:00
Benjamin Wheeler 017de39c3b Added period 2020-02-03 18:04:41 -05:00
Glen Pike 01c7da1965 Add note about cloning to README
Because there are some very large files in the repository history
2020-02-03 21:02:14 +00:00
Ben Wheeler 59f428900c update menu-bar test per refactor 2020-02-03 11:16:42 -05:00
Ben Wheeler 48245be395 reverted project state changes in f2291d96 2020-01-30 14:18:13 -05:00
Eric Rosenbaum ca38789e3f Fix asset names and tags, remove duplicates 2020-01-30 12:34:15 -05:00
Ben Wheeler efed4d3721 file input is dynamically added to DOM, not rendered 2020-01-29 19:38:47 -05:00
DD Liu 95532e147d Merge pull request #5402 from LLK/greenkeeper/scratch-paint-0.2.0-prerelease.20200129174741
Greenkeeper/scratch paint 0.2.0 prerelease.20200129174741
2020-01-29 13:43:31 -05:00
DD Liu 3a56e609a5 Merge branch 'develop' into greenkeeper/scratch-paint-0.2.0-prerelease.20200129174741 2020-01-29 13:05:08 -05:00
Paul Kaplan e63842a336 Merge pull request #5400 from LLK/greenkeeper/scratch-blocks-0.1.0-prerelease.1580309823
Update scratch-blocks to the latest version 🚀
2020-01-29 13:00:34 -05:00
greenkeeper[bot] c9173427b9 chore(package): update lockfile package-lock.json 2020-01-29 17:49:28 +00:00
greenkeeper[bot] 3e5b65072c chore(package): update scratch-paint to version 0.2.0-prerelease.20200129174741
Closes #5401
2020-01-29 17:49:24 +00:00
greenkeeper[bot] 74828b3b09 chore(package): update lockfile package-lock.json 2020-01-29 15:03:07 +00:00
greenkeeper[bot] e77162791f chore(package): update scratch-blocks to version 0.1.0-prerelease.1580309823 2020-01-29 15:03:02 +00:00
Paul Kaplan 0c17cd956d Merge pull request #5399 from LLK/greenkeeper/scratch-l10n-3.7.20200128224436
Update scratch-l10n to the latest version 🚀
2020-01-29 08:46:15 -05:00
Paul Kaplan 287b29019a Merge pull request #5398 from LLK/greenkeeper/scratch-render-0.1.0-prerelease.20200128205403
Update scratch-render to the latest version 🚀
2020-01-29 06:02:37 -05:00
greenkeeper[bot] ed3b58bfb5 chore(package): update lockfile package-lock.json 2020-01-28 22:46:51 +00:00
greenkeeper[bot] c2cd6f21da chore(package): update scratch-l10n to version 3.7.20200128224436 2020-01-28 22:46:47 +00:00
greenkeeper[bot] 066e9dd6bd chore(package): update lockfile package-lock.json 2020-01-28 21:10:45 +00:00
greenkeeper[bot] 5a0860228e chore(package): update scratch-render to version 0.1.0-prerelease.20200128205403 2020-01-28 21:10:41 +00:00
Ben Wheeler f2291d963c continuing sb file uploader refactor into hoc
draft of refactor to make custom confirm modal work for upload; need to further edit sb-file-uploader

Add support for custom confirm modal to sb-file-uploader

Show custom confirm modal when confirming project upload

got custom upload refactor of file upload working, and tested failure case

cleaned up debug code, make project file upload work

simplified logic around canceling file upload

removed old sb-file-uploader.jsx; fixed linter errors

reverted two components to use old strings, not shared

(can do that refactor another time)

removed unnecessary confirm container

removed stray comment

moved, updated sb file uploader tests, related project state tests

removed custom modal, to reduce scope of changes

sb file uploader test uses intl
2020-01-28 14:57:09 -05:00
Benjamin Wheeler 97885c7518 Merge pull request #5198 from benjiwheeler/block-cloud-on-embed
simplify props of cloud-manager-hoc
2020-01-28 14:13:40 -05:00
Ben Wheeler 3a8fe3f1b2 reorganized switch and conditionals to be clearer; clarified test names 2020-01-27 16:25:26 -05:00
Ben Wheeler a23dd3e349 shouldNotModifyCloudData into prop canModifyCloudData ; add defaultProps 2020-01-27 14:29:56 -05:00
Paul Kaplan 79f3f6f3f8 Merge pull request #5333 from LLK/paulkaplan-patch-2
Do not show unsupported browser modal for googlebot
2020-01-27 11:47:32 -05:00
greenkeeper[bot] 175395cce3 chore(package): update lockfile package-lock.json 2020-01-24 21:10:12 +00:00
greenkeeper[bot] ee67ddf56f chore(package): update mkdirp to version 1.0.3
Closes #5396
2020-01-24 21:10:09 +00:00
Eric Rosenbaum 5c259b70db add tag to marian sprite, fix name of basketball 1 backdrop 2020-01-23 11:46:06 -05:00
Eric Rosenbaum 3dd86c28f9 update costume rotation test 2020-01-23 11:42:59 -05:00
Ray Schamp 4b75bc8f9d Merge pull request #5388 from LLK/greenkeeper/scratch-l10n-3.7.20200114224412
Update scratch-l10n to the latest version 🚀
2020-01-22 16:51:33 -05:00
Eric Rosenbaum 85cd56307d update asset libraries 2020-01-22 15:17:04 -05:00
greenkeeper[bot] 8a4adccae5 chore(package): update lockfile package-lock.json 2020-01-16 00:35:15 +00:00
greenkeeper[bot] 9908d44d81 chore(package): update scratch-l10n to version 3.7.20200114224412 2020-01-16 00:35:10 +00:00
Paul Kaplan d2c74c5198 Merge pull request #5385 from paulkaplan/libraries-3-format
Update library-item to handle 3.0 or 2.0 library formats
2020-01-15 15:32:29 -05:00
Paul Kaplan 80e91a3c5e Update library-item to handle 3.0 or 2.0 library formats 2020-01-14 10:54:30 -05:00
DD Liu 797ce1894b Merge pull request #5384 from fsih/updateRender
Update with render hotfix
2020-01-13 15:37:55 -05:00
DD Liu f41e1c829a Update with render hotfix 2020-01-13 14:59:24 -05:00
Paul Kaplan fa5994abbd Merge pull request #5377 from paulkaplan/fix-long-sound
[fixup] Implement sound downsampler to try to allow more sounds to be edited
2020-01-09 12:19:22 -05:00
Paul Kaplan 76f5cfe1cf Correctly return the sampleRate from the sample dropper 2020-01-09 12:12:41 -05:00
Paul Kaplan fcbf1b051b Make submitNewSamples async and use promises 2020-01-09 12:12:41 -05:00
Paul Kaplan 1dcba6ecd5 Merge pull request #5376 from LLK/revert-5338-fix-long-sound
Revert "Implement sound downsampler to try to allow more sounds to be edited"
2020-01-09 11:47:45 -05:00
Paul Kaplan 79277a1227 Revert "Implement sound downsampler to try to allow more sounds to be edited" 2020-01-09 11:47:08 -05:00
DD Liu e476548c64 Trigger rebuild because my build flaked? 2020-01-09 03:18:32 -05:00
DD Liu 8adb097cd1 Merge pull request #5374 from fsih/updateEmptyPaintBug
Fix empty paint bug
2020-01-09 02:52:28 -05:00
DD Liu 403a7a5883 Update package lock 2020-01-09 02:43:24 -05:00
DD Liu dd5562323e Update svgrenderer deps and renderer 2020-01-09 02:42:34 -05:00
Benjamin Wheeler f261f4614a Merge pull request #5370 from LLK/greenkeeper/scratch-l10n-3.7.20200108141814
Greenkeeper/scratch l10n 3.7.20200108141814
2020-01-08 21:59:19 -05:00
greenkeeper[bot] a93248df31 chore(package): update scratch-l10n to version 3.7.20200108141814
Closes #5354
2020-01-08 21:58:42 -05:00
Benjamin Wheeler 1fa8742dec Merge pull request #5360 from LLK/greenkeeper/scratch-blocks-0.1.0-prerelease.1578322100
Update scratch-blocks to the latest version 🚀
2020-01-08 21:53:40 -05:00
Ben Wheeler 8b0f2c16bc updated package-lock 2020-01-08 21:34:23 -05:00
greenkeeper[bot] 57988d63c2 chore(package): update lockfile package-lock.json 2020-01-08 21:34:23 -05:00
greenkeeper[bot] c3d3a7a464 chore(package): update scratch-blocks to version 0.1.0-prerelease.1578322100 2020-01-08 21:34:23 -05:00
Paul Kaplan e1102f91ef Merge pull request #5369 from LLK/greenkeeper/scratch-paint-0.2.0-prerelease.20200107211248
Update scratch-paint to the latest version 🚀
2020-01-08 10:03:50 -05:00
greenkeeper[bot] e10a3f282f chore(package): update lockfile package-lock.json 2020-01-07 21:59:34 +00:00
greenkeeper[bot] 0ef59001f1 chore(package): update scratch-paint to version 0.2.0-prerelease.20200107211248 2020-01-07 21:59:30 +00:00
DD Liu ad96f2eb30 Merge pull request #5368 from fsih/updateSvgRend
Update SVG Renderer
2020-01-07 16:22:38 -05:00
DD Liu 5fac48acc9 updateSvgRend 2020-01-07 16:04:33 -05:00
DD Liu b19139696b Merge pull request #5367 from LLK/greenkeeper/scratch-paint-0.2.0-prerelease.20200107165446
Update scratch-paint to the latest version 🚀
2020-01-07 14:13:09 -05:00
DD Liu a5ccbfb8b9 Merge branch 'develop' into greenkeeper/scratch-paint-0.2.0-prerelease.20200107165446 2020-01-07 14:12:50 -05:00
DD Liu 7960eed191 Merge pull request #5366 from LLK/greenkeeper/scratch-render-0.1.0-prerelease.20200107165342
Update scratch-render to the latest version 🚀
2020-01-07 14:11:58 -05:00
greenkeeper[bot] cb0e24b5be chore(package): update lockfile package-lock.json 2020-01-07 17:01:55 +00:00
greenkeeper[bot] ccc12a02c3 chore(package): update scratch-paint to version 0.2.0-prerelease.20200107165446 2020-01-07 17:01:50 +00:00
greenkeeper[bot] d505af579a chore(package): update lockfile package-lock.json 2020-01-07 17:01:23 +00:00
greenkeeper[bot] 504097b495 chore(package): update scratch-render to version 0.1.0-prerelease.20200107165342 2020-01-07 17:01:19 +00:00
DD Liu 484eb6bc9f Merge pull request #5358 from LLK/greenkeeper/scratch-svg-renderer-0.2.0-prerelease.20200103191258
Update scratch-svg-renderer to the latest version 🚀
2020-01-07 11:48:59 -05:00
Benjamin Wheeler 96392659fd Merge pull request #5291 from benjiwheeler/standalone-new-project-title-fix
reset title on transitioning to isShowingWithoutId
2020-01-06 15:27:38 -05:00
Ben Wheeler a4e27112ab fixed typo 2020-01-06 15:11:18 -05:00
Ben Wheeler 50265fe843 added tests for project loading states 2020-01-06 15:10:51 -05:00
Ben Wheeler 461877b733 project state loading should error if can’t load default 2020-01-06 15:10:27 -05:00
greenkeeper[bot] 2c16a16da5 chore(package): update lockfile package-lock.json 2020-01-03 19:18:55 +00:00
greenkeeper[bot] ed0db53f36 chore(package): update scratch-svg-renderer to version 0.2.0-prerelease.20200103191258 2020-01-03 19:18:50 +00:00
Ben Wheeler f244da7705 added project-state integration test for new title 2020-01-02 14:29:04 -05:00
Benjamin Wheeler 3d1205e453 Merge pull request #5357 from LLK/greenkeeper/papaparse-5.1.1
Greenkeeper/papaparse 5.1.1
2019-12-30 23:18:50 -05:00
Ben Wheeler 3b1889b941 updated package lock 2019-12-30 23:17:43 -05:00
Paul Kaplan a908345491 Merge pull request #5338 from paulkaplan/fix-long-sound
Implement sound downsampler to try to allow more sounds to be edited
2019-12-30 14:22:34 -05:00
Karishma Chadha 50de01086a Merge pull request #5355 from LLK/greenkeeper/scratch-vm-0.2.0-prerelease.20191227164934
Update scratch-vm to the latest version 🚀
2019-12-27 14:34:16 -05:00
greenkeeper[bot] 57863d99a1 chore(package): update lockfile package-lock.json 2019-12-27 16:52:17 +00:00
greenkeeper[bot] 3e93db7c0b chore(package): update scratch-vm to version 0.2.0-prerelease.20191227164934 2019-12-27 16:52:13 +00:00
Benjamin Wheeler 28f4cc737d Merge pull request #5343 from taybenlor/develop
Fix `doneUpdatingProject` call signature
2019-12-24 21:45:26 -05:00
chrisgarrity fa5cfb495f Merge pull request #5352 from LLK/greenkeeper/scratch-blocks-0.1.0-prerelease.1576850350
Update scratch-blocks to the latest version 🚀
2019-12-20 11:28:06 -05:00
greenkeeper[bot] 5b2e8a29e3 chore(package): update lockfile package-lock.json 2019-12-20 14:01:43 +00:00
greenkeeper[bot] a7fce92b18 chore(package): update scratch-blocks to version 0.1.0-prerelease.1576850350 2019-12-20 14:01:39 +00:00
chrisgarrity 12b8cfbb43 Merge pull request #5349 from LLK/greenkeeper/scratch-l10n-3.7.20191219145348
Update scratch-l10n to the latest version 🚀
2019-12-20 08:06:10 -05:00
Paul Kaplan d1d98337c8 Update docs and tests 2019-12-19 16:01:21 -05:00
greenkeeper[bot] 480f17d872 chore(package): update lockfile package-lock.json 2019-12-19 14:56:10 +00:00
greenkeeper[bot] 274cbbd356 chore(package): update scratch-l10n to version 3.7.20191219145348 2019-12-19 14:56:05 +00:00
Eric Rosenbaum bb80fa49ac Move backupDownSampler into util and add tests 2019-12-18 15:19:47 -05:00
greenkeeper[bot] 38e4c5bbfa chore(package): update lockfile package-lock.json 2019-12-18 11:54:33 +00:00
greenkeeper[bot] b3e5dd88fb chore(package): update papaparse to version 5.1.1
Closes #5018
2019-12-18 11:54:30 +00:00
Ben Taylor 6027bb9011 Fix doneUpdatingProject call signature
ProjectSaverHOC has been using the wrong call signature for `doneUpdatingProject` and `onUpdatedProject`.
2019-12-18 09:59:07 +11:00
picklesrus d62ede33e5 Merge pull request #5346 from LLK/greenkeeper/scratch-paint-0.2.0-prerelease.20191217213717
Update scratch-paint to the latest version 🚀
2019-12-17 17:05:33 -05:00
greenkeeper[bot] 1a479c61b4 chore(package): update lockfile package-lock.json 2019-12-17 21:38:57 +00:00
greenkeeper[bot] 2e8adc7ac7 chore(package): update scratch-paint to version 0.2.0-prerelease.20191217213717 2019-12-17 21:38:53 +00:00
picklesrus 5c377e70c9 Merge pull request #5345 from LLK/greenkeeper/scratch-render-0.1.0-prerelease.20191217212645
Update scratch-render to the latest version 🚀
2019-12-17 16:29:30 -05:00
greenkeeper[bot] 67fdd9bb51 chore(package): update lockfile package-lock.json 2019-12-17 21:28:34 +00:00
greenkeeper[bot] c68ec4ad16 chore(package): update scratch-render to version 0.1.0-prerelease.20191217212645 2019-12-17 21:28:30 +00:00
picklesrus 91e87f7d16 Merge pull request #5344 from LLK/greenkeeper/scratch-svg-renderer-0.2.0-prerelease.20191217211338
Update scratch-svg-renderer to the latest version 🚀
2019-12-17 16:19:48 -05:00
greenkeeper[bot] 762ffe53f0 chore(package): update lockfile package-lock.json 2019-12-17 21:15:45 +00:00
greenkeeper[bot] d63c8b1dbb chore(package): update scratch-svg-renderer to version 0.2.0-prerelease.20191217211338 2019-12-17 21:15:41 +00:00
Eric Rosenbaum e799708707 Use for loop instead of filter (20x faster) 2019-12-16 17:05:29 -05:00
Eric Rosenbaum b699e76972 Use backup down sampler when 22kHz not supported 2019-12-16 13:49:39 -05:00
Paul Kaplan 914ba4910b Use vendor prefixed offline audio context for safari 2019-12-12 15:57:25 -05:00
Paul Kaplan 748f8559e4 Remove the 11khz option because it doesnt work on safari 2019-12-12 15:56:59 -05:00
Paul Kaplan 8fae109811 Add downsampler 2019-12-12 12:30:12 -05:00
Paul Kaplan 7980c23ecc Make submitNewSamples async and use promises 2019-12-12 11:44:15 -05:00
DD Liu 5e4a2b788c Merge pull request #5337 from LLK/greenkeeper/scratch-render-0.1.0-prerelease.20191211203739
Update scratch-render to the latest version 🚀
2019-12-11 15:59:48 -05:00
greenkeeper[bot] 8caff78e08 chore(package): update lockfile package-lock.json 2019-12-11 20:51:43 +00:00
greenkeeper[bot] e1c3bb6d96 chore(package): update scratch-render to version 0.1.0-prerelease.20191211203739 2019-12-11 20:51:39 +00:00
Paul Kaplan aebdcc855c Merge pull request #5336 from LLK/greenkeeper/scratch-l10n-3.6.20191210224141
Update scratch-l10n to the latest version 🚀
2019-12-11 11:17:10 -05:00
greenkeeper[bot] 86fd6ec8bf chore(package): update lockfile package-lock.json 2019-12-10 22:44:02 +00:00
greenkeeper[bot] b351cc599d chore(package): update scratch-l10n to version 3.6.20191210224141 2019-12-10 22:43:57 +00:00
Paul Kaplan 0230546a20 Merge pull request #5332 from LLK/greenkeeper/scratch-paint-0.2.0-prerelease.20191210104711
Update scratch-paint to the latest version 🚀
2019-12-10 10:36:05 -05:00
Paul Kaplan 9638444a49 Do not show unsupported browser modal for googlebot
This modal may be preventing the crawler from correctly indexing pages, because it takes over the whole screen.
2019-12-10 06:47:41 -05:00
greenkeeper[bot] 984b87ead5 chore(package): update lockfile package-lock.json 2019-12-10 10:57:58 +00:00
greenkeeper[bot] 59c4f36b90 chore(package): update scratch-paint to version 0.2.0-prerelease.20191210104711 2019-12-10 10:57:54 +00:00
Paul Kaplan 21a6fe3a27 Merge pull request #5331 from LLK/greenkeeper/scratch-paint-0.2.0-prerelease.20191209210523
Update scratch-paint to the latest version 🚀
2019-12-10 05:40:44 -05:00
greenkeeper[bot] 02f806fc9d chore(package): update lockfile package-lock.json 2019-12-09 21:40:37 +00:00
greenkeeper[bot] d9003c9d56 chore(package): update scratch-paint to version 0.2.0-prerelease.20191209210523 2019-12-09 21:40:33 +00:00
Paul Kaplan c944295140 Merge pull request #5329 from LLK/revert-5328-revert-5319-greenkeeper/scratch-render-0.1.0-prerelease.20191126210304
Bring back in renderer update with mipmap change
2019-12-05 10:29:15 -05:00
Paul Kaplan 2c64a62f23 Revert "Revert "Update scratch-render to the latest version 🚀"" 2019-12-05 10:26:15 -05:00
Paul Kaplan 8639f1838c Merge pull request #5328 from LLK/revert-5319-greenkeeper/scratch-render-0.1.0-prerelease.20191126210304
Revert "Update scratch-render to the latest version 🚀"
2019-12-05 09:33:36 -05:00
Paul Kaplan 4e80510b98 Revert "Update scratch-render to the latest version 🚀" 2019-12-05 09:30:15 -05:00
Paul Kaplan 9f58bd9ee3 Merge pull request #5323 from zoebentley/tutorial-images-es-419
Make Spanish tutorial images also load for Latinamerican Spanish
2019-12-04 09:46:37 -05:00
Paul Kaplan 236cc6f872 Merge pull request #5325 from LLK/greenkeeper/scratch-l10n-3.6.20191204142956
Update scratch-l10n to the latest version 🚀
2019-12-04 09:36:58 -05:00
greenkeeper[bot] b3d336a08f chore(package): update lockfile package-lock.json 2019-12-04 14:35:28 +00:00
greenkeeper[bot] 97fcbf85fc chore(package): update scratch-l10n to version 3.6.20191204142956 2019-12-04 14:35:20 +00:00
DD Liu e3b3bcc963 Merge pull request #5319 from LLK/greenkeeper/scratch-render-0.1.0-prerelease.20191126210304
Update scratch-render to the latest version 🚀
2019-12-04 09:33:20 -05:00
Zoë Bentley 775b805e56 Make Spanish tutorial images also load for Latinamerican Spanish 2019-12-02 15:04:35 -05:00
greenkeeper[bot] a1124807ca chore(package): update lockfile package-lock.json 2019-11-26 21:04:55 +00:00
greenkeeper[bot] b1674c1b0c chore(package): update scratch-render to version 0.1.0-prerelease.20191126210304 2019-11-26 21:04:51 +00:00
Eric Rosenbaum 7148733acb Merge pull request #5315 from LLK/greenkeeper/scratch-l10n-3.6.20191120161253
Greenkeeper/scratch l10n 3.6.20191120161253
2019-11-20 12:50:08 -05:00
DD Liu e98862ef66 Merge pull request #5311 from LLK/greenkeeper/scratch-vm-0.2.0-prerelease.20191119203901
Update scratch-vm to the latest version 🚀
2019-11-20 11:51:59 -05:00
greenkeeper[bot] 53a805026f chore(package): update lockfile package-lock.json 2019-11-20 16:45:02 +00:00
greenkeeper[bot] 84b168f757 chore(package): update scratch-l10n to version 3.6.20191120161253
Closes #5312
2019-11-20 16:44:57 +00:00
chrisgarrity 0a86a769e7 Merge pull request #5310 from LLK/greenkeeper/scratch-blocks-0.1.0-prerelease.1574180945
Translations: Update scratch-blocks to the latest version 🚀
2019-11-19 17:18:32 -05:00
greenkeeper[bot] 816fb10e16 chore(package): update lockfile package-lock.json 2019-11-19 21:43:25 +00:00
greenkeeper[bot] eece6a5f8d chore(package): update scratch-vm to version 0.2.0-prerelease.20191119203901 2019-11-19 21:43:18 +00:00
greenkeeper[bot] 27766042fa chore(package): update lockfile package-lock.json 2019-11-19 16:32:03 +00:00
greenkeeper[bot] 639330b9ce chore(package): update scratch-blocks to version 0.1.0-prerelease.1574180945 2019-11-19 16:31:59 +00:00
zoebentley 6f6a34ec50 Merge pull request #5305 from zoebentley/tutorial-reorder-HOC-2019-fixed
Reorder tutorials for HOC 2019
2019-11-19 11:00:15 -05:00
zoebentley 2560c0736e Merge pull request #5303 from zoebentley/spanish-localization
Add Spanish GIFs/PNGs for HOC 2019 and optimize many EN & ES GIFs/PNGs
2019-11-19 10:48:36 -05:00
Eric Rosenbaum 7a2d7d035e Merge pull request #5306 from ericrosenbaum/feature/update-vm
update vm
2019-11-19 09:56:31 -05:00
Ray Schamp 62ee7e069f Merge pull request #5205 from rschamp/trim-travis
Trim some unused config from the Travis config
2019-11-19 09:49:37 -05:00
Ray Schamp 3b82d52a84 Merge branch 'develop' into trim-travis 2019-11-19 09:37:52 -05:00
Eric Rosenbaum 435f335cff update vm 2019-11-18 17:46:55 -05:00
Zoë Bentley 6822d3b7dd Reorder tutorials for HOC 2019 2019-11-18 13:43:06 -05:00
Zoë Bentley 40e9c07b00 Add Spanish GIFs/PNGs for HOC 2019 and optimize many English and Spanish GIFs/PNGs 2019-11-18 13:22:51 -05:00
chrisgarrity c4bf772dd1 Merge pull request #5296 from LLK/greenkeeper/scratch-l10n-3.6.20191112223853
Greenkeeper/scratch l10n 3.6.20191112223853
2019-11-18 08:20:59 -05:00
DD Liu 886dbca01c Merge pull request #5298 from LLK/greenkeeper/scratch-paint-0.2.0-prerelease.20191114200704
Update scratch-paint to the latest version 🚀
2019-11-14 16:09:46 -05:00
DD Liu 3ee5b44e7e Merge branch 'develop' into greenkeeper/scratch-paint-0.2.0-prerelease.20191114200704 2019-11-14 15:46:48 -05:00
DD Liu 0eb7d3017b Merge pull request #5297 from fsih/updateRender
Update render
2019-11-14 15:44:29 -05:00
greenkeeper[bot] 139c9f8043 chore(package): update lockfile package-lock.json 2019-11-14 20:31:18 +00:00
greenkeeper[bot] 3faedc4301 chore(package): update scratch-paint to version 0.2.0-prerelease.20191114200704 2019-11-14 20:31:13 +00:00
DD Liu faa81e77c7 Update render 2019-11-14 15:06:17 -05:00
DD Liu 58ff2606b3 Merge pull request #5295 from fsih/updateRender
Backing out the render change, because we want the recent render chan…
2019-11-14 11:02:14 -05:00
DD Liu dabdaf00d2 Backing out the render change, because we want the recent render changes to go in together, and they are separated rightn ow 2019-11-14 10:50:10 -05:00
greenkeeper[bot] 3eb56b4e9f chore(package): update lockfile package-lock.json 2019-11-12 23:29:47 +00:00
greenkeeper[bot] 61102e9de8 chore(package): update scratch-l10n to version 3.6.20191112223853
Closes #5285
2019-11-12 23:29:43 +00:00
Karishma Chadha ce164d81d7 Merge pull request #5258 from LLK/greenkeeper/scratch-vm-0.2.0-prerelease.20191018142546
Greenkeeper/scratch vm 0.2.0 prerelease.20191018142546
2019-11-12 17:51:56 -05:00
Ben Wheeler 21d6ce111e added comments 2019-11-12 15:25:07 -05:00
Ben Wheeler fcb6de39f3 more precise case for resetting project title to default 2019-11-12 15:22:40 -05:00
Karishma Chadha e428083da8 Merge branch 'develop' into greenkeeper/scratch-vm-0.2.0-prerelease.20191018142546 2019-11-12 15:12:43 -05:00
Ben Wheeler 3c6e9723e3 reset title on transitioning to isShowingWithoutId 2019-11-12 15:04:55 -05:00
DD Liu 5afd19b1ce Merge pull request #5282 from LLK/greenkeeper/scratch-render-0.1.0-prerelease.20191104214419
Update scratch-render to the latest version 🚀
brings in LLK/scratch-svg-renderer#99 via render
2019-11-04 20:07:58 -05:00
DD Liu 17ba917399 Merge branch 'develop' into greenkeeper/scratch-render-0.1.0-prerelease.20191104214419 2019-11-04 20:06:35 -05:00
greenkeeper[bot] ca06418287 chore(package): update lockfile package-lock.json 2019-11-04 21:49:44 +00:00
greenkeeper[bot] a98562e03c chore(package): update scratch-render to version 0.1.0-prerelease.20191104214419 2019-11-04 21:49:39 +00:00
greenkeeper[bot] 98c1846c12 chore(package): update lockfile package-lock.json 2019-10-18 14:29:49 +00:00
greenkeeper[bot] 03f3f12fcc chore(package): update scratch-vm to version 0.2.0-prerelease.20191018142546
Closes #5254
2019-10-18 14:29:45 +00:00
rschamp 47271e7af5 Remove greenkeeper-lockfile
According to https://blog.greenkeeper.io/announcing-native-lockfile-support-85381a37a0d0 it’s unnecessary since Sept 2018?!

Also remove the update step, it hasn’t been necessary since we began pinning the scratch-* packages.
2019-09-23 15:35:09 -04:00
rschamp b02e5140b9 Trim some unused config from the Travis config
We no longer use the “smoke” branch, nor do we push to master in order to deploy to S3. So remove these from the Travis config so it’s clearer what we actually use.
2019-09-23 13:50:59 -04:00
306 changed files with 17121 additions and 12668 deletions

No files matched your search

+1 -1
View File
@@ -14,6 +14,6 @@ npm-*
/dist
/.opt-in
# generated translation files
# Generated translation files
/translations
/locale
-24
View File
@@ -12,22 +12,13 @@ env:
- NODE_OPTIONS=--max-old-space-size=7250
- NPM_TAG=latest
- RELEASE_VERSION="0.1.0-prerelease.$(date +'%Y%m%d%H%M%S')"
- SMOKE_URL=https://llk.github.io/scratch-gui/$TRAVIS_PULL_REQUEST_BRANCH
cache:
directories:
- node_modules
before_install:
# package-lock.json was introduced in npm@5
- '[[ $(node -v) =~ ^v9.*$ ]] || npm install -g npm@latest' # skipped when using node 9
- npm install -g greenkeeper-lockfile
install:
- npm --production=false install
- npm --production=false update
before_script: greenkeeper-lockfile-update
script:
- npm test
- if [ "$TRAVIS_EVENT_TYPE" == "pull_request" ] && [ "$TRAVIS_BRANCH" == "master" ]; then npm run test:smoke; fi
after_script: greenkeeper-lockfile-upload
before_deploy:
- >
if [ -z "$BEFORE_DEPLOY_RAN" ]; then
@@ -44,7 +35,6 @@ deploy:
branch:
- master
- develop
- smoke
- hotfix/*
condition: $TRAVIS_EVENT_TYPE != cron
skip_cleanup: true
@@ -61,18 +51,6 @@ deploy:
condition: $TRAVIS_EVENT_TYPE != cron
skip_cleanup: true
script: if npm info scratch-gui | grep -q $RELEASE_VERSION; then git tag $RELEASE_VERSION && git push https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git $RELEASE_VERSION; fi
- provider: s3
on:
branch:
- master
- $PREVIEW_BRANCH
condition: $TRAVIS_EVENT_TYPE != cron
access_key_id: $AWS_ACCESS_KEY_ID
secret_access_key: $AWS_SECRET_ACCESS_KEY
bucket: $AWS_BUCKET_NAME
acl: public_read
skip_cleanup: true
local_dir: build
- provider: script
on:
all_branches: true
@@ -86,5 +64,3 @@ deploy:
condition: $TRAVIS_EVENT_TYPE == cron
skip_cleanup: true
script: npm run i18n:src && npm run i18n:push
after_deploy:
- 'curl -X POST -H "Fastly-Key: $FASTLY_TOKEN" -H "Accept: application/json" https://api.fastly.com/service/$FASTLY_SERVICE_ID/purge_all'
+58 -1
View File
@@ -18,6 +18,8 @@ cd scratch-gui
npm install
```
**You may want to add `--depth=1` to the `git clone` command because there are some [large files in the git repository history](https://github.com/LLK/scratch-gui/issues/5140).**
## Getting started
Running the project requires Node.js to be installed.
@@ -74,7 +76,7 @@ See [jest cli docs](https://facebook.github.io/jest/docs/en/cli.html#content) fo
*NOTE: If you're a windows user, please run these scripts in Windows `cmd.exe` instead of Git Bash/MINGW64.*
Before running any test, make sure you have run `npm install` from this (scratch-gui) repository's top level.
Before running any tests, make sure you have run `npm install` from this (scratch-gui) repository's top level.
#### Main testing command
@@ -194,5 +196,60 @@ Further reading: [Stack Overflow](https://stackoverflow.com/questions/46602286/n
You can publish the GUI to github.io so that others on the Internet can view it.
[Read the wiki for a step-by-step guide.](https://github.com/LLK/scratch-gui/wiki/Publishing-to-GitHub-Pages)
## Understanding the project state machine
Since so much code throughout scratch-gui depends on the state of the project, which goes through many different phases of loading, displaying and saving, we created a "finite state machine" to make it clear which state it is in at any moment. This is contained in the file src/reducers/project-state.js .
It can be hard to understand the code in src/reducers/project-state.js . There are several types of data and functions used, which relate to each other:
### Loading states
These include state constant strings like:
* `NOT_LOADED` (the default state),
* `ERROR`,
* `FETCHING_WITH_ID`,
* `LOADING_VM_WITH_ID`,
* `REMIXING`,
* `SHOWING_WITH_ID`,
* `SHOWING_WITHOUT_ID`,
* etc.
### Transitions
These are names for the action which causes a state change. Some examples are:
* `START_FETCHING_NEW`,
* `DONE_FETCHING_WITH_ID`,
* `DONE_LOADING_VM_WITH_ID`,
* `SET_PROJECT_ID`,
* `START_AUTO_UPDATING`,
### How transitions relate to loading states
As this diagram of the project state machine shows, various transition actions can move us from one loading state to another:
![Project state diagram](docs/project_state_diagram.svg)
_Note: for clarity, the diagram above excludes states and transitions relating to error handling._
#### Example
Here's an example of how states transition.
Suppose a user clicks on a project, and the page starts to load with url https://scratch.mit.edu/projects/123456 .
Here's what will happen in the project state machine:
![Project state example](docs/project_state_example.png)
1. When the app first mounts, the project state is `NOT_LOADED`.
2. The `SET_PROJECT_ID` redux action is dispatched (from src/lib/project-fetcher-hoc.jsx), with `projectId` set to `123456`. This transitions the state from `NOT_LOADED` to `FETCHING_WITH_ID`.
3. The `FETCHING_WITH_ID` state. In src/lib/project-fetcher-hoc.jsx, the `projectId` value `123456` is used to request the data for that project from the server.
4. When the server responds with the data, src/lib/project-fetcher-hoc.jsx dispatches the `DONE_FETCHING_WITH_ID` action, with `projectData` set. This transitions the state from `FETCHING_WITH_ID` to `LOADING_VM_WITH_ID`.
5. The `LOADING_VM_WITH_ID` state. In src/lib/vm-manager-hoc.jsx, we load the `projectData` into Scratch's virtual machine ("the vm").
6. When loading is done, src/lib/vm-manager-hoc.jsx dispatches the `DONE_LOADING_VM_WITH_ID` action. This transitions the state from `LOADING_VM_WITH_ID` to `SHOWING_WITH_ID`
7. The `SHOWING_WITH_ID` state. Now the project appears normally and is playable and editable.
## Donate
We provide [Scratch](https://scratch.mit.edu) free of charge, and want to keep it that way! Please consider making a [donation](https://secure.donationpay.org/scratchfoundation/) to support our continued engineering, design, community, and resource development efforts. Donations of any size are appreciated. Thank you!
+3
View File
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1381px" height="1012px" viewBox="-0.5 -0.5 1381 1012" content="&lt;mxfile host=&quot;www.draw.io&quot; modified=&quot;2020-02-04T16:31:44.889Z&quot; agent=&quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36&quot; etag=&quot;8a2X5Jj65jOGG04xBBh1&quot; version=&quot;12.6.4&quot; type=&quot;device&quot;&gt;&lt;diagram name=&quot;Page-1&quot; id=&quot;58cdce13-f638-feb5-8d6f-7d28b1aa9fa0&quot;&gt;7V1Zd6O4Ev41OffJHImdRydxujOT7XSSXuYlh9g4YcY2GUw6yfz6KxYBEqtBErjbeYkthMCo9FXVV6XiSDlZv3/y7ZfnS2/hrI5ksHg/Uk6PZBmqEKJ/YctH0gKBFrc8+e4iacsabt3/nKQRJK2v7sLZEh0Dz1sF7gvZOPc2G2ceEG2273tvZLeltyKv+mI/JVcEWcPt3F45hW7f3EXwnP6MXPfPjvv0nFza1JIDj/b8nyffe90k1zuSlWX0Fx9e23ispP/22V54b7kmZXaknPieF8Sf1u8nzip8uPixxeedVRxN79t3NkGbExRTfrTgo6ZB+LgAS2OSjPDTXr06+CdENxp84IeDRkDzgL4cPwfrFWqD6CP6IS/h8W1g+8FtYAfh8aW7Wp14K8+PTlRA9Bd2DnzvHyd3ZLlMjkSPzllkg8ZPJzw099buPPm8sh+d1XH6rPFIG28TXdbbBGf22l2F4vfV8Rf2xk6aE1GDcvK97O7slfu0QW1z9AwddPB44fpIyFwvbNx6r+EUHhcfNH5yjh8477mm5MF/cry1E/gfqEtyVMeLIlklE6gnUvGWyZySND3npA232YmUP6VDZzONPiSTXT7x/z3CCw98/uv8z5/G2fftuxxsLieqWZzsBVoYyVfPD569J29jr2ZZ6/H81f+ZzljW5cLzXpLGv50g+EievP0aeKTkOO9u8D2cV0lLvv3IHTl9T6Y8+vKBv2zQz82dFH79kT+WnRZ9w+dVzhqaVn/uVKyJZJqQZD85Qc3jS55e+Mhq5993Vnbg/iSxps9knn9Tzq//Mh+Xp856onvw6uz934lSspL1VZAIPjHL+r+vHj4w2UYTNUUdIHh5zw6iT0/h/9Prq9nDxfX09Pzq08PXy4dv53efH85P8eDoXuPx494FgUKLIyAFoLDewiXkIjCeJgfW7mIRiZrvoJuzH6Ohwul88dxNED037fhIO60GhgyG8R0VlmmqTJLx87ohE5eaZVO5zidAUlVFjQdrPffJcDfhT8zGope+t1xukUzSspLeRCvxqRL4StHBUxu3bV/sTStxgmXiVCtJ8dDk5R59uqWtPFtl11959mIbzrLv/Y1m/9QO7PDRbBBMoSewrhTrqptpkn9Sw709u4Fz+2JH2POGrClqafjzBDdltahPQ4Ge1+vTkWhQBtoyXY4f1PecskwVaF5b6ry0JSzMbbOy7KUfIdDzGlICWGGyVZKEQg9HvHF8Fz2ycCZ7aFG9qEULfQzWGjQ6der79keuQ6I2KkFW0wxC1CBlQxcwGdR0Rx/i63dF51LZM3RG2j2eT7ByN84Er5roaLi8tCJc3s7uHm6+XP8xO7nLQXUGg28uWowpmp4vwivIur0OgS0BxPBxdUXPkVgPjSZBFbxVWRl1xoNpQtJPMJiYEhMKUHUOlkXps1E64CapNQV5GcxwrvQxyEN5C+WAUub4jxVQ0E2E97HXQIJM27m7eUKtentYwT5db1hBLommkvSDzAZVVBKrhKGKJsgaY2VUxWOYxg6kB09TrNyx5WKOFWTG1EmhgbpGDhHfaHJWJjq72nW6SbkQ9XadpdZ152TXyYxguACzd9Mvd3na5uz8YvZwfxO27A1mtkRJTF+wML5kA1DCyQYmddLFmMgWB6CsWvjMpevqOpatWWtZOtAg3WgQjQKlSRqTGowHMfbFnhcbNTCKSraKaB1JxICX7okiBmezu5PPoe6hWN7MdEd4VyBi90oxsYwpGE2KSVGxrZAiQT/NxFfzGA2yxTKkUCVqYgIKTyViDJa+tw5HdJAX4B9iCiNRpnRMQbMGVqVQeEyhk/ZUCO0pAWjs5P2Gh9g4sjhfqNGTxR25u7IK6S0otF1f4cp2gNhSFW7ygdnWiQDX93ddALffjZCGQ0oR5vjB1jfidlUFZtmNIRNi4wVJD3SXQUj4kTf67PhOOKnbzf/C6yBjwdlubSQDWrUrlTYX7nYPeVD2phOsB31kO2mqbpJOPWDi1dNxGgnIVv5PhIuPfwpzKz630q9m3x5OZ2fT+4u7/mu6Z1ZGu3V9sKDE0BFCszJkW3mcyxqw50ugQ2MxsTpYT7l5rX/6zmYxDVOLw5FenE3ckjx3s3a6W84bnp+VswzqZqfeImrBOuhDsQ6lcK13mLTxhoPrQr21k8LeQu3FBbEKB9dzQZVKpJoLOpg4eM3UWjgQ9qSDsEvMwWapWyNCPJdU/koMGaEk0cJZ2q+roCXreTBuhjVuBqeHtC700C+3P6MuVWEAIqhf7Kwp1Z4fOVOlbMv4k71Vus25AiwzNTUyIiP308BpqgBJK1ADMNHI5eHAIXeDwRzWAMmoz3QvXdI9cIQdLYxza4FMnsIoowlCi/K/k9Spqpymwgl452rhhPLjvbOeyiXNEoSCd9cPt9Ovsz0DsY6eQ82irgMxS4MWISITyAbIdIlKeoKKKOdCrZSvfo5EYz6dAFeCySAU3xq6JhTlKu3slrCNpVylgRSSE/Yekxt2w/vfOFF8HURyJCB8cnCturlWpj4gb1zuGHThIflYO2239RGeVeZoMfetzJa+lczatepkE6kGKVpqw/Y9ur9p8Td4qvXRXm22QVAhowcA4uTyPKu2944j04B0I11r6NhZxHkjChOTS5MlqsaIbIiyubQu+/x+D7KqNaCOq6IIbEri7Lc55f7mdHoX4sfx7Oz6y+zh5Mss/n5yffPjN4aPeCFVwgeSWquUIerJWfDgmcqDWYOy2oTlBRWlHVRACQCTtL+Sc2sAo2wDX/dkyF7Igl38sSALK4OoHFkup1f304sUYPYGS7I9wnJ6gucvHD/X+Sz64wI8emMiHTAU0m7BPkBfzlshRwWSZYL8nyoMnIa1YgAgXUNdV9vaMqZMARQAewRQeMCxAFR1nK4fgxgD1PT+7roMnkj6cGzwJB6Q6i2hsNCabJDQwahWClQhWlC5VF4yf1hXJCis0oHepdQBO0gKK8VkkBQqgYg9bGM07UZYda530M8yYl6Dqh/wVJdxZAE8X2aX598PmNO42uq8L6iRkMOm0qMmqSTGTFS00oRhTJdN3b0xJjNeZDZMTLOZwdwPKp9NhdppqKpUHCPGr94JAfR1tAbyWzNr+/Nhv3E8WTSPlOOlR+/6cQCyxi3lumlSLLTOBMp0XbLIyL/Ox1wqlbYucT1moTy5ZSyPMo2MJtuIgNpSCGNmJZVv5Rce1VNIoFKs+kQnuj9MKAOuwMaNH2dZdPPXhr5qCKh1Gy1QWvK1fzU8HvW6y5UqKMykSK/QVOUc8IX0eEuiikI+ubtXyAsA+eWJ7mzdaWQ0VwP11h1M5bjrCeiSAuxBXpvNfqGidyzhEDaXHFYBmQPKiEfT0AKnCoRaEhCWBtpUHaNrwaHbz9ffyusNHZIHBZTtUbATO9zGrC7Kt4e+jVjXPA2LlqzSkoUFkmVRBXySc2u0biaqlTGhneha3nyLphiSSiKNKsuSBXMMPrW1tYKBKSphw5TMXDRS2e0yjHZ+aJR/o8pK7V039Oe0r4NXLZJoX0cZr1O3qW1vMxKFc95ac1lcgHc0Mao+iIkhUaZA044jlvUIKwhIAXtDts6mfFtHtKkDVyM8KV6dLGIYP8zDtvRxmD/0tvThzR+1S+GdvuYPnRhj1Js/JdYJadRUzkwjZyCquKCB43+pDqcmlJFtUXUdvrYCr53wMQmwl0Eg4Yo/XsiVyEPVt4Ogp9LHm8Go/aZAMpR82TwML/ytAmPYbD/iZSCgHs8yd84gYuUpn8p810LrYqsqazjsV2KDb27xL8EuNpcjZ/jmIRz6ZeQ54CAzRViaHDCjXHENsnG0R05dcdtDQ5S6dDmzwxA+AeailqFSXRSDsp4YpeAYNDvZEKku9K+qyJFy6P36i9jfKh8i4eMM/cjNW1Flk0xnZAPPikZX/5hwKf9R/ir0YeumQbmDXbdrRhDnuHhr409mAd67Ym4B2xsw0TD69ReSTYS3VnFK/S7brj/69G/2iKjUk21o9aoGm+A3lVqhwBQR+Tu2LKrCN4a+Cy9/ONC/AkrnDE//6uMpndNQKDDHmuS2a7fZYsB4GyQseTtcXcrKSHYjydVcCoN3yTRuRsqs/a7XYXO3VbHl0atP8bunGv0NXQEUH6SxcTiIQXmwQbULu88KKVW0OywOsmXh/mxzVX61BXcMQlfEl1Fz9EtG9uN2D5TTP+RgFjExi7IX4WIGePCSgro8pF2EX8uX2kZKhxB5DwtH0M5KOhlUbVlqmRnVWb1Bm0GO296VrBFvYVQQTpmFAS2TTNHsyWgKMCKqs9P6GRFxIaQGE6IfIVAQWcZvhmtnTRxeDzdOpTwCskIdUCkDyQL5WECYyAa6lfs1x1BurnWdhZHRGNXMOgedvYcZ5xzUdMWGyVzgUaNSOLDQ9CUCoCQT42qSQtSSE1ZUJcVP1mo9LB92UOoLine truncated

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

+432 -404
View File
File diff suppressed because it is too large. Load diff
+10 -10
View File
@@ -6,7 +6,7 @@
"scripts": {
"build": "npm run clean && webpack --progress --colors --bail",
"clean": "rimraf ./build && mkdirp build && rimraf ./dist && mkdirp dist",
"deploy": "touch build/.nojekyll && gh-pages -t -d build -m \"Build for $(git log --pretty=format:%H -n1)\"",
"deploy": "touch build/.nojekyll && gh-pages -t -d build -m \"Build for $(git log --pretty=format:%H -n1) [skip ci]\"",
"prune": "./prune-gh-pages.sh",
"i18n:push": "tx-push-src scratch-editor interface translations/en.json",
"i18n:src": "rimraf ./translations/messages/src && babel src > tmp.js && rimraf tmp.js && build-i18n-src ./translations/messages/src ./translations/ && npm run i18n:push",
@@ -44,7 +44,7 @@
"babel-loader": "^8.0.4",
"base64-loader": "1.0.0",
"bowser": "1.9.4",
"chromedriver": "78.0.1",
"chromedriver": "80.0.0",
"classnames": "2.2.6",
"computed-style-to-inline-style": "3.0.0",
"copy-webpack-plugin": "^4.5.1",
@@ -78,9 +78,9 @@
"lodash.pick": "4.4.0",
"lodash.throttle": "4.0.1",
"minilog": "3.1.0",
"mkdirp": "^0.5.1",
"mkdirp": "^1.0.3",
"omggif": "1.0.9",
"papaparse": "4.6.2",
"papaparse": "5.1.1",
"postcss-import": "^12.0.0",
"postcss-loader": "^3.0.0",
"postcss-simple-vars": "^5.0.1",
@@ -108,13 +108,13 @@
"redux-throttle": "0.1.1",
"rimraf": "^2.6.1",
"scratch-audio": "0.1.0-prerelease.20190925183642",
"scratch-l10n": "3.6.20191029224007",
"scratch-blocks": "0.1.0-prerelease.1572384380",
"scratch-paint": "0.2.0-prerelease.20191104214909",
"scratch-render": "0.1.0-prerelease.20191101193213",
"scratch-blocks": "0.1.0-prerelease.1583868812",
"scratch-l10n": "3.7.20200310213125",
"scratch-paint": "0.2.0-prerelease.20200213174123",
"scratch-render": "0.1.0-prerelease.20200228152431",
"scratch-storage": "1.3.2",
"scratch-svg-renderer": "0.2.0-prerelease.20191104164753",
"scratch-vm": "0.2.0-prerelease.20191017151616",
"scratch-svg-renderer": "0.2.0-prerelease.20200205003400",
"scratch-vm": "0.2.0-prerelease.20200317155559",
"selenium-webdriver": "3.6.0",
"startaudiocontext": "1.2.1",
"style-loader": "^0.23.0",
+9 -6
View File
@@ -92,14 +92,16 @@ class LibraryItem extends React.PureComponent {
this.setState({iconIndex: nextIconIndex});
}
curIconMd5 () {
const iconMd5Prop = this.props.iconMd5;
if (this.props.icons &&
this.state.isRotatingIcon &&
this.state.iconIndex < this.props.icons.length &&
this.props.icons[this.state.iconIndex] &&
this.props.icons[this.state.iconIndex].baseLayerMD5) {
return this.props.icons[this.state.iconIndex].baseLayerMD5;
this.state.iconIndex < this.props.icons.length) {
const icon = this.props.icons[this.state.iconIndex] || {};
return icon.md5ext || // 3.0 library format
icon.baseLayerMD5 || // 2.0 library format, TODO GH-5084
iconMd5Prop;
}
return this.props.iconMd5;
return iconMd5Prop;
}
render () {
const iconMd5 = this.curIconMd5();
@@ -151,7 +153,8 @@ LibraryItem.propTypes = {
iconRawURL: PropTypes.string,
icons: PropTypes.arrayOf(
PropTypes.shape({
baseLayerMD5: PropTypes.string
baseLayerMD5: PropTypes.string, // 2.0 library format, TODO GH-5084
md5ext: PropTypes.string // 3.0 library format
})
),
id: PropTypes.number.isRequired,
+109 -84
View File
@@ -6,7 +6,12 @@ import VM from 'scratch-vm';
import {connect} from 'react-redux';
import {computeChunkedRMS, encodeAndAddSoundToVM, SOUND_BYTE_LIMIT} from '../lib/audio/audio-util.js';
import {
computeChunkedRMS,
encodeAndAddSoundToVM,
downsampleIfNeeded,
dropEveryOtherSample
} from '../lib/audio/audio-util.js';
import AudioEffects from '../lib/audio/audio-effects.js';
import SoundEditorComponent from '../components/sound-editor/sound-editor.jsx';
import AudioBufferPlayer from '../lib/audio/audio-buffer-player.js';
@@ -39,7 +44,8 @@ class SoundEditor extends React.Component {
'paste',
'handleKeyPress',
'handleContainerClick',
'setRef'
'setRef',
'resampleBufferToRate'
]);
this.state = {
copyBuffer: null,
@@ -132,45 +138,32 @@ class SoundEditor extends React.Component {
});
}
submitNewSamples (samples, sampleRate, skipUndo) {
// Encode the new sound into a wav so that it can be stored
let wavBuffer = null;
try {
wavBuffer = WavEncoder.encode.sync({
sampleRate: sampleRate,
channelData: [samples]
return downsampleIfNeeded({samples, sampleRate}, this.resampleBufferToRate)
.then(({samples: newSamples, sampleRate: newSampleRate}) =>
WavEncoder.encode({
sampleRate: newSampleRate,
channelData: [newSamples]
}).then(wavBuffer => {
if (!skipUndo) {
this.redoStack = [];
if (this.undoStack.length >= UNDO_STACK_SIZE) {
this.undoStack.shift(); // Drop the first element off the array
}
this.undoStack.push(this.getUndoItem());
}
this.resetState(newSamples, newSampleRate);
this.props.vm.updateSoundBuffer(
this.props.soundIndex,
this.audioBufferPlayer.buffer,
new Uint8Array(wavBuffer));
return true; // Edit was successful
})
)
.catch(e => {
// Encoding failed, or the sound was too large to save so edit is rejected
log.error(`Encountered error while trying to encode sound update: ${e}`);
return false; // Edit was not applied
});
if (wavBuffer.byteLength > SOUND_BYTE_LIMIT) {
// Cancel the sound update by setting to null
wavBuffer = null;
log.error(`Refusing to encode sound larger than ${SOUND_BYTE_LIMIT} bytes`);
}
} catch (e) {
// This error state is mostly for the mock sounds used during testing.
// Any incorrect sound buffer trying to get interpretd as a Wav file
// should yield this error.
// This can also happen if the sound is too be allocated in memory.
log.error(`Encountered error while trying to encode sound update: ${e}`);
}
// Do not submit sound if it could not be encoded (i.e. if too large)
if (wavBuffer) {
if (!skipUndo) {
this.redoStack = [];
if (this.undoStack.length >= UNDO_STACK_SIZE) {
this.undoStack.shift(); // Drop the first element off the array
}
this.undoStack.push(this.getUndoItem());
}
this.resetState(samples, sampleRate);
this.props.vm.updateSoundBuffer(
this.props.soundIndex,
this.audioBufferPlayer.buffer,
new Uint8Array(wavBuffer));
return true; // Update succeeded
}
return false; // Update failed
}
handlePlay () {
this.audioBufferPlayer.stop();
@@ -209,13 +202,15 @@ class SoundEditor extends React.Component {
newSamples.set(firstPart, 0);
newSamples.set(secondPart, firstPart.length);
}
this.submitNewSamples(newSamples, sampleRate);
this.setState({
trimStart: null,
trimEnd: null
this.submitNewSamples(newSamples, sampleRate).then(() => {
this.setState({
trimStart: null,
trimEnd: null
});
});
}
handleDeleteInverse () {
// Delete everything outside of the trimmers
const {samples, sampleRate} = this.copyCurrentBuffer();
const sampleCount = samples.length;
const startIndex = Math.floor(this.state.trimStart * sampleCount);
@@ -224,10 +219,13 @@ class SoundEditor extends React.Component {
if (clippedSamples.length === 0) {
clippedSamples = new Float32Array(1);
}
this.submitNewSamples(clippedSamples, sampleRate);
this.setState({
trimStart: null,
trimEnd: null
this.submitNewSamples(clippedSamples, sampleRate).then(success => {
if (success) {
this.setState({
trimStart: null,
trimEnd: null
});
}
});
}
handleUpdateTrim (trimStart, trimEnd) {
@@ -257,14 +255,15 @@ class SoundEditor extends React.Component {
effects.process((renderedBuffer, adjustedTrimStart, adjustedTrimEnd) => {
const samples = renderedBuffer.getChannelData(0);
const sampleRate = renderedBuffer.sampleRate;
const success = this.submitNewSamples(samples, sampleRate);
if (success) {
if (this.state.trimStart === null) {
this.handlePlay();
} else {
this.setState({trimStart: adjustedTrimStart, trimEnd: adjustedTrimEnd}, this.handlePlay);
this.submitNewSamples(samples, sampleRate).then(success => {
if (success) {
if (this.state.trimStart === null) {
this.handlePlay();
} else {
this.setState({trimStart: adjustedTrimStart, trimEnd: adjustedTrimEnd}, this.handlePlay);
}
}
}
});
});
}
tooLoud () {
@@ -287,16 +286,22 @@ class SoundEditor extends React.Component {
this.redoStack.push(this.getUndoItem());
const {samples, sampleRate, trimStart, trimEnd} = this.undoStack.pop();
if (samples) {
this.submitNewSamples(samples, sampleRate, true);
this.setState({trimStart: trimStart, trimEnd: trimEnd}, this.handlePlay);
return this.submitNewSamples(samples, sampleRate, true).then(success => {
if (success) {
this.setState({trimStart: trimStart, trimEnd: trimEnd}, this.handlePlay);
}
});
}
}
handleRedo () {
const {samples, sampleRate, trimStart, trimEnd} = this.redoStack.pop();
if (samples) {
this.undoStack.push(this.getUndoItem());
this.submitNewSamples(samples, sampleRate, true);
this.setState({trimStart: trimStart, trimEnd: trimEnd}, this.handlePlay);
return this.submitNewSamples(samples, sampleRate, true).then(success => {
if (success) {
this.setState({trimStart: trimStart, trimEnd: trimEnd}, this.handlePlay);
}
});
}
}
handleCopy () {
@@ -322,25 +327,39 @@ class SoundEditor extends React.Component {
});
}
resampleBufferToRate (buffer, newRate) {
return new Promise(resolve => {
if (window.OfflineAudioContext) {
const sampleRateRatio = newRate / buffer.sampleRate;
const newLength = sampleRateRatio * buffer.samples.length;
const offlineContext = new window.OfflineAudioContext(1, newLength, newRate);
const source = offlineContext.createBufferSource();
const audioBuffer = offlineContext.createBuffer(1, buffer.samples.length, buffer.sampleRate);
audioBuffer.getChannelData(0).set(buffer.samples);
source.buffer = audioBuffer;
source.connect(offlineContext.destination);
source.start();
offlineContext.startRendering();
offlineContext.oncomplete = ({renderedBuffer}) => {
resolve({
samples: renderedBuffer.getChannelData(0),
sampleRate: newRate
});
};
return new Promise((resolve, reject) => {
const sampleRateRatio = newRate / buffer.sampleRate;
const newLength = sampleRateRatio * buffer.samples.length;
let offlineContext;
// Try to use either OfflineAudioContext or webkitOfflineAudioContext to resample
// The constructors will throw if trying to resample at an unsupported rate
// (e.g. Safari/webkitOAC does not support lower than 44khz).
try {
if (window.OfflineAudioContext) {
offlineContext = new window.OfflineAudioContext(1, newLength, newRate);
} else if (window.webkitOfflineAudioContext) {
offlineContext = new window.webkitOfflineAudioContext(1, newLength, newRate);
}
} catch {
// If no OAC available and downsampling by 2, downsample by dropping every other sample.
if (newRate === buffer.sampleRate / 2) {
return resolve(dropEveryOtherSample(buffer));
}
return reject('Could not resample');
}
const source = offlineContext.createBufferSource();
const audioBuffer = offlineContext.createBuffer(1, buffer.samples.length, buffer.sampleRate);
audioBuffer.getChannelData(0).set(buffer.samples);
source.buffer = audioBuffer;
source.connect(offlineContext.destination);
source.start();
offlineContext.startRendering();
offlineContext.oncomplete = ({renderedBuffer}) => {
resolve({
samples: renderedBuffer.getChannelData(0),
sampleRate: newRate
});
};
});
}
paste () {
@@ -351,8 +370,11 @@ class SoundEditor extends React.Component {
const newSamples = new Float32Array(newLength);
newSamples.set(samples, 0);
newSamples.set(this.state.copyBuffer.samples, samples.length);
this.submitNewSamples(newSamples, this.props.sampleRate, false);
this.handlePlay();
this.submitNewSamples(newSamples, this.props.sampleRate, false).then(success => {
if (success) {
this.handlePlay();
}
});
} else {
// else replace the selection with the pasted sound
const trimStartSamples = this.state.trimStart * samples.length;
@@ -371,11 +393,14 @@ class SoundEditor extends React.Component {
const newDurationSeconds = newSamples.length / this.state.copyBuffer.sampleRate;
const adjustedTrimStart = trimStartSeconds / newDurationSeconds;
const adjustedTrimEnd = trimEndSeconds / newDurationSeconds;
this.submitNewSamples(newSamples, this.props.sampleRate, false);
this.setState({
trimStart: adjustedTrimStart,
trimEnd: adjustedTrimEnd
}, this.handlePlay);
this.submitNewSamples(newSamples, this.props.sampleRate, false).then(success => {
if (success) {
this.setState({
trimStart: adjustedTrimStart,
trimEnd: adjustedTrimEnd
}, this.handlePlay);
}
});
}
}
handlePaste () {
+49 -1
View File
@@ -59,9 +59,57 @@ const encodeAndAddSoundToVM = function (vm, samples, sampleRate, name, callback)
});
};
/**
@typedef SoundBuffer
@type {Object}
@property {Float32Array} samples Array of audio samples
@property {number} sampleRate Audio sample rate
*/
/**
* Downsample the given buffer to try to reduce file size below SOUND_BYTE_LIMIT
* @param {SoundBuffer} buffer - Buffer to resample
* @param {function(SoundBuffer):Promise<SoundBuffer>} resampler - resampler function
* @returns {SoundBuffer} Downsampled buffer with half the sample rate
*/
const downsampleIfNeeded = (buffer, resampler) => {
const {samples, sampleRate} = buffer;
const duration = samples.length / sampleRate;
const encodedByteLength = samples.length * 2; /* bitDepth 16 bit */
// Resolve immediately if already within byte limit
if (encodedByteLength < SOUND_BYTE_LIMIT) {
return Promise.resolve({samples, sampleRate});
}
// If encodeable at 22khz, resample and call submitNewSamples again
if (duration * 22050 * 2 < SOUND_BYTE_LIMIT) {
return resampler({samples, sampleRate}, 22050);
}
// Cannot save this sound at 22khz, refuse to edit
// In the future we could introduce further compression here
return Promise.reject('Sound too large to save, refusing to edit');
};
/**
* Drop every other sample of an audio buffer as a last-resort way of downsampling.
* @param {SoundBuffer} buffer - Buffer to resample
* @returns {SoundBuffer} Downsampled buffer with half the sample rate
*/
const dropEveryOtherSample = buffer => {
const newLength = Math.floor(buffer.samples.length / 2);
const newSamples = new Float32Array(newLength);
for (let i = 0; i < newLength; i++) {
newSamples[i] = buffer.samples[i * 2];
}
return {
samples: newSamples,
sampleRate: buffer.sampleRate / 2
};
};
export {
computeRMS,
computeChunkedRMS,
encodeAndAddSoundToVM,
SOUND_BYTE_LIMIT
downsampleIfNeeded,
dropEveryOtherSample
};
+16 -12
View File
@@ -54,13 +54,10 @@ const cloudManagerHOC = function (WrappedComponent) {
canUseCloud (props) {
return !!(props.cloudHost && props.username && props.vm && props.projectId && props.hasCloudPermission);
}
shouldNotModifyCloudData (props) {
return (props.hasEverEnteredEditor && !props.canSave);
}
shouldConnect (props) {
return !this.isConnected() && this.canUseCloud(props) &&
props.isShowingWithId && props.vm.runtime.hasCloudData() &&
!this.shouldNotModifyCloudData(props);
props.canModifyCloudData;
}
shouldDisconnect (props, prevProps) {
return this.isConnected() &&
@@ -70,7 +67,7 @@ const cloudManagerHOC = function (WrappedComponent) {
(props.projectId !== prevProps.projectId) ||
(props.username !== prevProps.username) ||
// Editing someone else's project
this.shouldNotModifyCloudData(props)
!props.canModifyCloudData
);
}
isConnected () {
@@ -102,11 +99,11 @@ const cloudManagerHOC = function (WrappedComponent) {
render () {
const {
/* eslint-disable no-unused-vars */
canModifyCloudData,
cloudHost,
projectId,
username,
hasCloudPermission,
hasEverEnteredEditor,
isShowingWithId,
onShowCloudInfo,
/* eslint-enable no-unused-vars */
@@ -124,23 +121,30 @@ const cloudManagerHOC = function (WrappedComponent) {
}
CloudManager.propTypes = {
canSave: PropTypes.bool.isRequired,
canModifyCloudData: PropTypes.bool.isRequired,
cloudHost: PropTypes.string,
hasCloudPermission: PropTypes.bool,
hasEverEnteredEditor: PropTypes.bool,
isShowingWithId: PropTypes.bool,
isShowingWithId: PropTypes.bool.isRequired,
onShowCloudInfo: PropTypes.func,
projectId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
username: PropTypes.string,
vm: PropTypes.instanceOf(VM).isRequired
};
const mapStateToProps = state => {
CloudManager.defaultProps = {
cloudHost: null,
hasCloudPermission: false,
onShowCloudInfo: () => {},
username: null
};
const mapStateToProps = (state, ownProps) => {
const loadingState = state.scratchGui.projectState.loadingState;
return {
hasEverEnteredEditor: state.scratchGui.mode.hasEverEnteredEditor,
isShowingWithId: getIsShowingWithId(loadingState),
projectId: state.scratchGui.projectState.projectId
projectId: state.scratchGui.projectState.projectId,
// if you're editing someone else's project, you can't modify cloud data
canModifyCloudData: (!state.scratchGui.mode.hasEverEnteredEditor || ownProps.canSave)
};
};
+6 -6
View File
@@ -178,7 +178,7 @@
},
{
"name": "Blue Sky 2 ",
"md5": "5a906c2f272b77f59f0ef207857a8b3a.svg",
"md5": "8eb8790be5507fdccf73e7c1570bbbab.svg",
"type": "backdrop",
"tags": [
"outdoors",
@@ -286,7 +286,7 @@
},
{
"name": "Circles",
"md5": "4e29033ec2b891a8f1ca21242811d403.svg",
"md5": "c9847be305920807c5597d81576dd0c4.svg",
"type": "backdrop",
"tags": [
"patterns"
@@ -491,7 +491,7 @@
},
{
"name": "Hearts",
"md5": "26d3418b2fbc1af2c5fea82e1c3df1db.svg",
"md5": "f98526ccb0eec3ac7d6c8f8ab502825e.svg",
"type": "backdrop",
"tags": [
"patterns"
@@ -1050,7 +1050,7 @@
},
{
"name": "Underwater 1",
"md5": "fb907f72b310acc8b95cbf2d2cccabc9.svg",
"md5": "d3344650f594bcecdf46aa4a9441badd.svg",
"type": "backdrop",
"tags": [
"ocean",
@@ -1175,7 +1175,7 @@
},
{
"name": "Witch House",
"md5": "597b9a9813fe5d8d387283138a0b8f2b.svg",
"md5": "30085b2d27beb5acdbe895d8b3e64b04.svg",
"type": "backdrop",
"tags": [
"fantasy",
@@ -1190,7 +1190,7 @@
},
{
"name": "Woods",
"md5": "d26cfd278999c9e37d6af75c296a58df.svg",
"md5": "f3eb165d6f3fd23370f97079f2e631bf.svg",
"type": "backdrop",
"tags": [
"fantasy",
File diff suppressed because it is too large. Load diff
+24 -24
View File
@@ -3,7 +3,7 @@ import introMove from './steps/intro-move.en.gif';
import introSayHello from './steps/intro-say-hello.en.gif';
// Text to Speech
import speechAddExtension from './steps/speech-add-extension.en.gif';
import speechAddExtension from './steps/talking-1-add-extension.en.gif';
import speechSaySomething from './steps/speech-say-something.en.gif';
import speechSetVoice from './steps/speech-set-voice.en.gif';
import speechMoveAround from './steps/speech-move-around.en.gif';
@@ -15,12 +15,12 @@ import speechSpin from './steps/speech-spin.en.gif';
import speechGrowShrink from './steps/speech-grow-shrink.en.gif';
// Cartoon Network
import cnShowCharacter from './steps/cn-show-character.en.gif';
import cnShowCharacter from './steps/cn-show-character.gif';
import cnSay from './steps/cn-say.en.gif';
import cnGlide from './steps/cn-glide.en.gif';
import cnPickSprite from './steps/cn-pick-sprite.en.gif';
import cnPickSprite from './steps/cn-pick-sprite.gif';
import cnCollect from './steps/cn-collect.en.gif';
import cnVariable from './steps/cn-variable.en.gif';
import cnVariable from './steps/add-variable.en.gif';
import cnScore from './steps/cn-score.en.gif';
import cnBackdrop from './steps/cn-backdrop.en.gif';
@@ -43,20 +43,20 @@ import musicMakeBeat from './steps/music-make-beat.en.gif';
import musicMakeBeatbox from './steps/music-make-beatbox.en.gif';
// Chase-Game
import chaseGameAddBackdrop from './steps/chase-game-add-backdrop.en.gif';
import chaseGameAddBackdrop from './steps/chase-game-add-backdrop.gif';
import chaseGameAddSprite1 from './steps/chase-game-add-sprite1.en.gif';
import chaseGameRightLeft from './steps/chase-game-right-left.en.gif';
import chaseGameUpDown from './steps/chase-game-up-down.en.gif';
import chaseGameAddSprite2 from './steps/chase-game-add-sprite2.en.gif';
import chaseGameMoveRandomly from './steps/chase-game-move-randomly.en.gif';
import chaseGamePlaySound from './steps/chase-game-play-sound.en.gif';
import chaseGameAddVariable from './steps/chase-game-add-variable.en.gif';
import chaseGameAddVariable from './steps/add-variable.en.gif';
import chaseGameChangeScore from './steps/chase-game-change-score.en.gif';
// Clicker-Game (Pop Game)
import popGamePickSprite from './steps/pop-game-pick-sprite.en.gif';
import popGamePlaySound from './steps/pop-game-play-sound.en.gif';
import popGameAddScore from './steps/pop-game-add-score.en.gif';
import popGameAddScore from './steps/add-variable.en.gif';
import popGameChangeScore from './steps/pop-game-change-score.en.gif';
import popGameRandomPosition from './steps/pop-game-random-position.en.gif';
import popGameChangeColor from './steps/pop-game-change-color.en.gif';
@@ -73,22 +73,22 @@ import animateCharJump from './steps/animate-char-jump.en.gif';
import animateCharChangeColor from './steps/animate-char-change-color.en.gif';
// Tell A Story
import storyPickBackdrop from './steps/story-pick-backdrop.en.gif';
import storyPickSprite from './steps/story-pick-sprite.en.gif';
import storyPickBackdrop from './steps/story-pick-backdrop.gif';
import storyPickSprite from './steps/story-pick-sprite.gif';
import storySaySomething from './steps/story-say-something.en.gif';
import storyPickSprite2 from './steps/story-pick-sprite2.en.gif';
import storyPickSprite2 from './steps/story-pick-sprite2.gif';
import storyFlip from './steps/story-flip.en.gif';
import storyConversation from './steps/story-conversation.en.gif';
import storyPickBackdrop2 from './steps/story-pick-backdrop2.en.gif';
import storyPickBackdrop2 from './steps/story-pick-backdrop2.gif';
import storySwitchBackdrop from './steps/story-switch-backdrop.en.gif';
import storyHideCharacter from './steps/story-hide-character.en.gif';
import storyShowCharacter from './steps/story-show-character.en.gif';
// Video Sensing
import videoAddExtension from './steps/video-add-extension.en.gif';
import videoPet from './steps/video-pet.en.gif';
import videoAnimate from './steps/video-animate.en.gif';
import videoPop from './steps/video-pop.en.gif';
import videoPet from './steps/video-pet.en.png';
import videoAnimate from './steps/video-animate.en.png';
import videoPop from './steps/video-pop.en.png';
// Make it Fly
import flyChooseBackdrop from './steps/fly-choose-backdrop.en.gif';
@@ -98,7 +98,7 @@ import flyMoveArrows from './steps/fly-make-interactive.en.gif';
import flyChooseObject from './steps/fly-object-to-collect.en.gif';
import flyFlyingObject from './steps/fly-flying-heart.en.gif';
import flySelectFlyingSprite from './steps/fly-select-flyer.en.jpg';
import flyAddScore from './steps/fly-add-score.en.gif';
import flyAddScore from './steps/add-variable.en.gif';
import flyKeepScore from './steps/fly-keep-score.en.gif';
import flyAddScenery from './steps/fly-choose-scenery.en.gif';
import flyMoveScenery from './steps/fly-move-scenery.en.gif';
@@ -106,13 +106,13 @@ import flySwitchLooks from './steps/fly-switch-costume.en.gif';
// Pong
import pongAddBackdrop from './steps/pong-add-backdrop.en.png';
import pongAddBallSprite from './steps/pong-add-ball-sprite.en.png';
import pongAddBallSprite from './steps/pong-add-ball-sprite.png';
import pongBounceAround from './steps/pong-bounce-around.en.gif';
import pongAddPaddle from './steps/pong-add-a-paddle.en.gif';
import pongMoveThePaddle from './steps/pong-move-the-paddle.en.gif';
import pongSelectBallSprite from './steps/pong-select-ball.en.png';
import pongSelectBallSprite from './steps/pong-select-ball.png';
import pongAddMoreCodeToBall from './steps/pong-add-code-to-ball.en.png';
import pongAddAScore from './steps/pong-add-score.en.gif';
import pongAddAScore from './steps/add-variable.en.gif';
import pongChooseScoreFromMenu from './steps/pong-choose-score.en.png';
import pongInsertChangeScoreBlock from './steps/pong-insert-change-score.en.png';
import pongResetScore from './steps/pong-reset-score.en.png';
@@ -122,16 +122,16 @@ import pongGameOver from './steps/pong-game-over.en.png';
// Imagine a World
import imagineTypeWhatYouWant from './steps/imagine-type-what-you-want.en.png';
import imagineClickGreenFlag from './steps/imagine-click-green-flag.en.png';
import imagineChooseBackdrop from './steps/imagine-choose-backdrop.en.png';
import imagineChooseSprite from './steps/imagine-choose-any-sprite.en.png';
import imagineChooseBackdrop from './steps/imagine-choose-backdrop.png';
import imagineChooseSprite from './steps/imagine-choose-any-sprite.png';
import imagineFlyAround from './steps/imagine-fly-around.en.png';
import imagineChooseAnotherSprite from './steps/imagine-choose-another-sprite.en.png';
import imagineChooseAnotherSprite from './steps/imagine-choose-another-sprite.png';
import imagineLeftRight from './steps/imagine-left-right.en.png';
import imagineUpDown from './steps/imagine-up-down.en.png';
import imagineChangeCostumes from './steps/imagine-change-costumes.en.png';
import imagineGlideToPoint from './steps/imagine-glide-to-point.en.png';
import imagineGrowShrink from './steps/imagine-grow-shrink.en.png';
import imagineChooseAnotherBackdrop from './steps/imagine-choose-another-backdrop.en.png';
import imagineChooseAnotherBackdrop from './steps/imagine-choose-another-backdrop.png';
import imagineSwitchBackdrops from './steps/imagine-switch-backdrops.en.gif';
import imagineRecordASound from './steps/imagine-record-a-sound.en.gif';
import imagineChooseSound from './steps/imagine-choose-sound.en.png';
@@ -173,10 +173,10 @@ import glideAroundPoint from './steps/glide-around-point.en.png';
// Code a Cartoon
import codeCartoonSaySomething from './steps/code-cartoon-01-say-something.en.png';
import codeCartoonAnimate from './steps/code-cartoon-02-animate.en.gif';
import codeCartoonSelectDifferentCharacter from './steps/code-cartoon-03-select-different-character.en.gif';
import codeCartoonSelectDifferentCharacter from './steps/code-cartoon-03-select-different-character.png';
import codeCartoonUseMinusSign from './steps/code-cartoon-04-use-minus-sign.en.gif';
import codeCartoonGrowShrink from './steps/code-cartoon-05-grow-shrink.en.gif';
import codeCartoonSelectDifferentCharacter2 from './steps/code-cartoon-06-select-another-different-character.en.gif';
import codeCartoonSelectDifferentCharacter2 from './steps/code-cartoon-06-select-another-different-character.png';
import codeCartoonJump from './steps/code-cartoon-07-jump.en.gif';
import codeCartoonChangeScenes from './steps/code-cartoon-08-change-scenes.en.gif';
import codeCartoonGlideAround from './steps/code-cartoon-09-glide-around.en.gif';
+306 -91
View File
@@ -3,119 +3,227 @@ import introMove from './steps/intro-move.es.gif';
import introSayHello from './steps/intro-say-hello.es.gif';
// Text to Speech
// import speechAddExtension from './steps/speech-add-extension.es.gif';
// import speechSaySomething from './steps/speech-say-something.es.gif';
// import speechSetVoice from './steps/speech-set-voice.es.gif';
// import speechMoveAround from './steps/speech-move-around.es.gif';
// import speechAddBackdrop from './steps/speech-add-backdrop.es.gif';
// import speechAddSprite from './steps/speech-add-sprite.es.gif';
// import speechSong from './steps/speech-song.es.gif';
// import speechChangeColor from './steps/speech-change-color.es.gif';
// import speechSpin from './steps/speech-spin.es.gif';
// import speechGrowShrink from './steps/speech-grow-shrink.es.gif';
//
// // Cartoon Network
// import cnShowCharacter from './steps/cn-show-character.es.gif';
// import cnSay from './steps/cn-say.es.gif';
// import cnGlide from './steps/cn-glide.es.gif';
// import cnPickSprite from './steps/cn-pick-sprite.es.gif';
// import cnCollect from './steps/cn-collect.es.gif';
// import cnVariable from './steps/cn-variable.es.gif';
// import cnScore from './steps/cn-score.es.gif';
// import cnBackdrop from './steps/cn-backdrop.es.gif';
import speechAddExtension from './steps/speech-add-extension.es.gif';
import speechSaySomething from './steps/speech-say-something.es.png';
import speechSetVoice from './steps/speech-set-voice.es.png';
import speechMoveAround from './steps/speech-move-around.es.png';
import speechAddBackdrop from './steps/speech-add-backdrop.gif';
import speechAddSprite from './steps/speech-add-sprite.gif';
import speechSong from './steps/speech-song.es.png';
import speechChangeColor from './steps/speech-change-color.es.png';
import speechSpin from './steps/speech-spin.es.png';
import speechGrowShrink from './steps/speech-grow-shrink.es.png';
// Cartoon Network
import cnShowCharacter from './steps/cn-show-character.gif';
import cnSay from './steps/cn-say.es.png';
import cnGlide from './steps/cn-glide.es.png';
import cnPickSprite from './steps/cn-pick-sprite.gif';
import cnCollect from './steps/cn-collect.es.png';
import cnVariable from './steps/add-variable.es.gif';
import cnScore from './steps/cn-score.es.png';
import cnBackdrop from './steps/cn-backdrop.es.png';
// Add sprite
import addSprite from './steps/add-sprite.es.gif';
import addSprite from './steps/add-sprite.gif';
// Animate a name
import namePickLetter from './steps/name-pick-letter.es.gif';
import namePlaySound from './steps/name-play-sound.es.gif';
import namePickLetter2 from './steps/name-pick-letter2.es.gif';
import nameChangeColor from './steps/name-change-color.es.gif';
import nameSpin from './steps/name-spin.es.gif';
import nameGrow from './steps/name-grow.es.gif';
import namePickLetter from './steps/name-pick-letter.gif';
import namePlaySound from './steps/name-play-sound.es.png';
import namePickLetter2 from './steps/name-pick-letter2.gif';
import nameChangeColor from './steps/name-change-color.es.png';
import nameSpin from './steps/name-spin.es.png';
import nameGrow from './steps/name-grow.es.png';
// Make-Music
import musicPickInstrument from './steps/music-pick-instrument.es.gif';
import musicPlaySound from './steps/music-play-sound.es.gif';
import musicMakeSong from './steps/music-make-song.es.gif';
import musicMakeBeat from './steps/music-make-beat.es.gif';
import musicMakeBeatbox from './steps/music-make-beatbox.es.gif';
// Make Music
import musicPickInstrument from './steps/music-pick-instrument.gif';
import musicPlaySound from './steps/music-play-sound.es.png';
import musicMakeSong from './steps/music-make-song.es.png';
import musicMakeBeat from './steps/music-make-beat.es.png';
import musicMakeBeatbox from './steps/music-make-beatbox.es.png';
// Chase-Game
import chaseGameAddBackdrop from './steps/chase-game-add-backdrop.es.gif';
import chaseGameAddSprite1 from './steps/chase-game-add-sprite1.es.gif';
import chaseGameRightLeft from './steps/chase-game-right-left.es.gif';
import chaseGameUpDown from './steps/chase-game-up-down.es.gif';
import chaseGameAddSprite2 from './steps/chase-game-add-sprite2.es.gif';
import chaseGameMoveRandomly from './steps/chase-game-move-randomly.es.gif';
import chaseGamePlaySound from './steps/chase-game-play-sound.es.gif';
import chaseGameAddVariable from './steps/chase-game-add-variable.es.gif';
import chaseGameChangeScore from './steps/chase-game-change-score.es.gif';
import chaseGameAddBackdrop from './steps/chase-game-add-backdrop.gif';
import chaseGameAddSprite1 from './steps/chase-game-add-sprite1.gif';
import chaseGameRightLeft from './steps/chase-game-right-left.es.png';
import chaseGameUpDown from './steps/chase-game-up-down.es.png';
import chaseGameAddSprite2 from './steps/chase-game-add-sprite2.gif';
import chaseGameMoveRandomly from './steps/chase-game-move-randomly.es.png';
import chaseGamePlaySound from './steps/chase-game-play-sound.es.png';
import chaseGameAddVariable from './steps/add-variable.es.gif';
import chaseGameChangeScore from './steps/chase-game-change-score.es.png';
// Clicker-Game (Pop Game)
import popGamePickSprite from './steps/pop-game-pick-sprite.es.gif';
import popGamePlaySound from './steps/pop-game-play-sound.es.gif';
import popGameAddScore from './steps/pop-game-add-score.es.gif';
import popGameChangeScore from './steps/pop-game-change-score.es.gif';
import popGameRandomPosition from './steps/pop-game-random-position.es.gif';
import popGameChangeColor from './steps/pop-game-change-color.es.gif';
import popGameResetScore from './steps/pop-game-reset-score.es.gif';
import popGamePickSprite from './steps/pop-game-pick-sprite.gif';
import popGamePlaySound from './steps/pop-game-play-sound.es.png';
import popGameAddScore from './steps/add-variable.es.gif';
import popGameChangeScore from './steps/pop-game-change-score.es.png';
import popGameRandomPosition from './steps/pop-game-random-position.es.png';
import popGameChangeColor from './steps/pop-game-change-color.es.png';
import popGameResetScore from './steps/pop-game-reset-score.es.png';
// Animate A Character
import animateCharPickBackdrop from './steps/animate-char-pick-backdrop.es.gif';
import animateCharPickSprite from './steps/animate-char-pick-sprite.es.gif';
import animateCharSaySomething from './steps/animate-char-say-something.es.gif';
import animateCharAddSound from './steps/animate-char-add-sound.es.gif';
import animateCharTalk from './steps/animate-char-talk.es.gif';
import animateCharMove from './steps/animate-char-move.es.gif';
import animateCharJump from './steps/animate-char-jump.es.gif';
import animateCharChangeColor from './steps/animate-char-change-color.es.gif';
import animateCharPickBackdrop from './steps/animate-char-pick-backdrop.gif';
import animateCharPickSprite from './steps/animate-char-pick-sprite.gif';
import animateCharSaySomething from './steps/animate-char-say-something.es.png';
import animateCharAddSound from './steps/animate-char-add-sound.es.png';
import animateCharTalk from './steps/animate-char-talk.es.png';
import animateCharMove from './steps/animate-char-move.es.png';
import animateCharJump from './steps/animate-char-jump.es.png';
import animateCharChangeColor from './steps/animate-char-change-color.es.png';
// Tell A Story
import storyPickBackdrop from './steps/story-pick-backdrop.es.gif';
import storyPickSprite from './steps/story-pick-sprite.es.gif';
import storySaySomething from './steps/story-say-something.es.gif';
import storyPickSprite2 from './steps/story-pick-sprite2.es.gif';
import storyPickBackdrop from './steps/story-pick-backdrop.gif';
import storyPickSprite from './steps/story-pick-sprite.gif';
import storySaySomething from './steps/story-say-something.es.png';
import storyPickSprite2 from './steps/story-pick-sprite2.gif';
import storyFlip from './steps/story-flip.es.gif';
import storyConversation from './steps/story-conversation.es.gif';
import storyPickBackdrop2 from './steps/story-pick-backdrop2.es.gif';
import storySwitchBackdrop from './steps/story-switch-backdrop.es.gif';
import storyHideCharacter from './steps/story-hide-character.es.gif';
import storyShowCharacter from './steps/story-show-character.es.gif';
import storyConversation from './steps/story-conversation.es.png';
import storyPickBackdrop2 from './steps/story-pick-backdrop2.gif';
import storySwitchBackdrop from './steps/story-switch-backdrop.es.png';
import storyHideCharacter from './steps/story-hide-character.es.png';
import storyShowCharacter from './steps/story-show-character.es.png';
// Video Sensing
import videoAddExtension from './steps/video-add-extension.es.gif';
import videoPet from './steps/video-pet.es.gif';
import videoAnimate from './steps/video-animate.es.gif';
import videoPop from './steps/video-pop.es.gif';
import videoPet from './steps/video-pet.es.png';
import videoAnimate from './steps/video-animate.es.png';
import videoPop from './steps/video-pop.es.png';
// Make it Fly
import flyChooseBackdrop from './steps/fly-choose-backdrop.gif';
import flyChooseCharacter from './steps/fly-choose-character.png';
import flySaySomething from './steps/fly-say-something.es.png';
import flyMoveArrows from './steps/fly-make-interactive.es.png';
import flyChooseObject from './steps/fly-object-to-collect.png';
import flyFlyingObject from './steps/fly-flying-heart.es.png';
import flySelectFlyingSprite from './steps/fly-select-flyer.png';
import flyAddScore from './steps/add-variable.es.gif';
import flyKeepScore from './steps/fly-keep-score.es.png';
import flyAddScenery from './steps/fly-choose-scenery.gif';
import flyMoveScenery from './steps/fly-move-scenery.es.png';
import flySwitchLooks from './steps/fly-switch-costume.es.png';
// Pong
import pongAddBackdrop from './steps/pong-add-backdrop.png';
import pongAddBallSprite from './steps/pong-add-ball-sprite.png';
import pongBounceAround from './steps/pong-bounce-around.es.png';
import pongAddPaddle from './steps/pong-add-a-paddle.gif';
import pongMoveThePaddle from './steps/pong-move-the-paddle.es.png';
import pongSelectBallSprite from './steps/pong-select-ball.png';
import pongAddMoreCodeToBall from './steps/pong-add-code-to-ball.es.png';
import pongAddAScore from './steps/add-variable.es.gif';
import pongChooseScoreFromMenu from './steps/pong-choose-score.es.png';
import pongInsertChangeScoreBlock from './steps/pong-insert-change-score.es.png';
import pongResetScore from './steps/pong-reset-score.es.png';
import pongAddLineSprite from './steps/pong-add-line.gif';
import pongGameOver from './steps/pong-game-over.es.png';
// Imagine a World
import imagineTypeWhatYouWant from './steps/imagine-type-what-you-want.es.png';
import imagineClickGreenFlag from './steps/imagine-click-green-flag.es.png';
import imagineChooseBackdrop from './steps/imagine-choose-backdrop.png';
import imagineChooseSprite from './steps/imagine-choose-any-sprite.png';
import imagineFlyAround from './steps/imagine-fly-around.es.png';
import imagineChooseAnotherSprite from './steps/imagine-choose-another-sprite.png';
import imagineLeftRight from './steps/imagine-left-right.es.png';
import imagineUpDown from './steps/imagine-up-down.es.png';
import imagineChangeCostumes from './steps/imagine-change-costumes.es.png';
import imagineGlideToPoint from './steps/imagine-glide-to-point.es.png';
import imagineGrowShrink from './steps/imagine-grow-shrink.es.png';
import imagineChooseAnotherBackdrop from './steps/imagine-choose-another-backdrop.png';
import imagineSwitchBackdrops from './steps/imagine-switch-backdrops.es.png';
import imagineRecordASound from './steps/imagine-record-a-sound.es.gif';
import imagineChooseSound from './steps/imagine-choose-sound.es.png';
// Add a Backdrop
import addBackdrop from './steps/add-backdrop.png';
// Add Effects
import addEffects from './steps/add-effects.es.png';
// Hide and Show
import hideAndShow from './steps/hide-show.es.png';
// Switch Costumes
import switchCostumes from './steps/switch-costumes.es.png';
// Change Size
import changeSize from './steps/change-size.es.png';
// Spin
import spinTurn from './steps/spin-turn.es.png';
import spinPointInDirection from './steps/spin-point-in-direction.es.png';
// Record a Sound
import recordASoundSoundsTab from './steps/record-a-sound-sounds-tab.es.png';
import recordASoundClickRecord from './steps/record-a-sound-click-record.es.png';
import recordASoundPressRecordButton from './steps/record-a-sound-press-record-button.es.png';
import recordASoundChooseSound from './steps/record-a-sound-choose-sound.es.png';
import recordASoundPlayYourSound from './steps/record-a-sound-play-your-sound.es.png';
// Use Arrow Keys
import moveArrowKeysLeftRight from './steps/move-arrow-keys-left-right.es.png';
import moveArrowKeysUpDown from './steps/move-arrow-keys-up-down.es.png';
// Glide Around
import glideAroundBackAndForth from './steps/glide-around-back-and-forth.es.png';
import glideAroundPoint from './steps/glide-around-point.es.png';
// Code a Cartoon
import codeCartoonSaySomething from './steps/code-cartoon-01-say-something.es.png';
import codeCartoonAnimate from './steps/code-cartoon-02-animate.es.png';
import codeCartoonSelectDifferentCharacter from './steps/code-cartoon-03-select-different-character.png';
import codeCartoonUseMinusSign from './steps/code-cartoon-04-use-minus-sign.es.png';
import codeCartoonGrowShrink from './steps/code-cartoon-05-grow-shrink.es.png';
import codeCartoonSelectDifferentCharacter2 from './steps/code-cartoon-06-select-another-different-character.png';
import codeCartoonJump from './steps/code-cartoon-07-jump.es.png';
import codeCartoonChangeScenes from './steps/code-cartoon-08-change-scenes.es.png';
import codeCartoonGlideAround from './steps/code-cartoon-09-glide-around.es.png';
import codeCartoonChangeCostumes from './steps/code-cartoon-10-change-costumes.es.png';
import codeCartoonChooseMoreCharacters from './steps/code-cartoon-11-choose-more-characters.png';
// Talking Tales
import talesAddExtension from './steps/speech-add-extension.es.gif';
import talesChooseSprite from './steps/talking-2-choose-sprite.png';
import talesSaySomething from './steps/talking-3-say-something.es.png';
import talesChooseBackdrop from './steps/talking-4-choose-backdrop.png';
import talesSwitchBackdrop from './steps/talking-5-switch-backdrop.es.png';
import talesChooseAnotherSprite from './steps/talking-6-choose-another-sprite.png';
import talesMoveAround from './steps/talking-7-move-around.es.png';
import talesChooseAnotherBackdrop from './steps/talking-8-choose-another-backdrop.png';
import talesAnimateTalking from './steps/talking-9-animate.es.png';
import talesChooseThirdBackdrop from './steps/talking-10-choose-third-backdrop.png';
import talesChooseSound from './steps/talking-11-choose-sound.es.gif';
import talesDanceMoves from './steps/talking-12-dance-moves.es.png';
import talesAskAnswer from './steps/talking-13-ask-and-answer.es.png';
const esImages = {
// Intro
introMove: introMove,
introSayHello: introSayHello,
// // Text to Speech
// speechAddExtension: speechAddExtension,
// speechSaySomething: speechSaySomething,
// speechSetVoice: speechSetVoice,
// speechMoveAround: speechMoveAround,
// speechAddBackdrop: speechAddBackdrop,
// speechAddSprite: speechAddSprite,
// speechSong: speechSong,
// speechChangeColor: speechChangeColor,
// speechSpin: speechSpin,
// speechGrowShrink: speechGrowShrink,
//
// // Cartoon Network
// cnShowCharacter: cnShowCharacter,
// cnSay: cnSay,
// cnGlide: cnGlide,
// cnPickSprite: cnPickSprite,
// cnCollect: cnCollect,
// cnVariable: cnVariable,
// cnScore: cnScore,
// cnBackdrop: cnBackdrop,
// Text to Speech
speechAddExtension: speechAddExtension,
speechSaySomething: speechSaySomething,
speechSetVoice: speechSetVoice,
speechMoveAround: speechMoveAround,
speechAddBackdrop: speechAddBackdrop,
speechAddSprite: speechAddSprite,
speechSong: speechSong,
speechChangeColor: speechChangeColor,
speechSpin: speechSpin,
speechGrowShrink: speechGrowShrink,
// Cartoon Network
cnShowCharacter: cnShowCharacter,
cnSay: cnSay,
cnGlide: cnGlide,
cnPickSprite: cnPickSprite,
cnCollect: cnCollect,
cnVariable: cnVariable,
cnScore: cnScore,
cnBackdrop: cnBackdrop,
// Add sprite
addSprite: addSprite,
@@ -181,8 +289,115 @@ const esImages = {
videoAddExtension: videoAddExtension,
videoPet: videoPet,
videoAnimate: videoAnimate,
videoPop: videoPop
videoPop: videoPop,
// Make it Fly
flyChooseBackdrop: flyChooseBackdrop,
flyChooseCharacter: flyChooseCharacter,
flySaySomething: flySaySomething,
flyMoveArrows: flyMoveArrows,
flyChooseObject: flyChooseObject,
flyFlyingObject: flyFlyingObject,
flySelectFlyingSprite: flySelectFlyingSprite,
flyAddScore: flyAddScore,
flyKeepScore: flyKeepScore,
flyAddScenery: flyAddScenery,
flyMoveScenery: flyMoveScenery,
flySwitchLooks: flySwitchLooks,
// Pong
pongAddBackdrop: pongAddBackdrop,
pongAddBallSprite: pongAddBallSprite,
pongBounceAround: pongBounceAround,
pongAddPaddle: pongAddPaddle,
pongMoveThePaddle: pongMoveThePaddle,
pongSelectBallSprite: pongSelectBallSprite,
pongAddMoreCodeToBall: pongAddMoreCodeToBall,
pongAddAScore: pongAddAScore,
pongChooseScoreFromMenu: pongChooseScoreFromMenu,
pongInsertChangeScoreBlock: pongInsertChangeScoreBlock,
pongResetScore: pongResetScore,
pongAddLineSprite: pongAddLineSprite,
pongGameOver: pongGameOver,
// Imagine a World
imagineTypeWhatYouWant: imagineTypeWhatYouWant,
imagineClickGreenFlag: imagineClickGreenFlag,
imagineChooseBackdrop: imagineChooseBackdrop,
imagineChooseSprite: imagineChooseSprite,
imagineFlyAround: imagineFlyAround,
imagineChooseAnotherSprite: imagineChooseAnotherSprite,
imagineLeftRight: imagineLeftRight,
imagineUpDown: imagineUpDown,
imagineChangeCostumes: imagineChangeCostumes,
imagineGlideToPoint: imagineGlideToPoint,
imagineGrowShrink: imagineGrowShrink,
imagineChooseAnotherBackdrop: imagineChooseAnotherBackdrop,
imagineSwitchBackdrops: imagineSwitchBackdrops,
imagineRecordASound: imagineRecordASound,
imagineChooseSound: imagineChooseSound,
// Add a Backdrop
addBackdrop: addBackdrop,
// Add Effects
addEffects: addEffects,
// Hide and Show
hideAndShow: hideAndShow,
// Switch Costumes
switchCostumes: switchCostumes,
// Change Size
changeSize: changeSize,
// Spin
spinTurn: spinTurn,
spinPointInDirection: spinPointInDirection,
// Record a Sound
recordASoundSoundsTab: recordASoundSoundsTab,
recordASoundClickRecord: recordASoundClickRecord,
recordASoundPressRecordButton: recordASoundPressRecordButton,
recordASoundChooseSound: recordASoundChooseSound,
recordASoundPlayYourSound: recordASoundPlayYourSound,
// Use Arrow Keys
moveArrowKeysLeftRight: moveArrowKeysLeftRight,
moveArrowKeysUpDown: moveArrowKeysUpDown,
// Glide Around
glideAroundBackAndForth: glideAroundBackAndForth,
glideAroundPoint: glideAroundPoint,
// Code a Cartoon
codeCartoonSaySomething: codeCartoonSaySomething,
codeCartoonAnimate: codeCartoonAnimate,
codeCartoonSelectDifferentCharacter: codeCartoonSelectDifferentCharacter,
codeCartoonUseMinusSign: codeCartoonUseMinusSign,
codeCartoonGrowShrink: codeCartoonGrowShrink,
codeCartoonSelectDifferentCharacter2: codeCartoonSelectDifferentCharacter2,
codeCartoonJump: codeCartoonJump,
codeCartoonChangeScenes: codeCartoonChangeScenes,
codeCartoonGlideAround: codeCartoonGlideAround,
codeCartoonChangeCostumes: codeCartoonChangeCostumes,
codeCartoonChooseMoreCharacters: codeCartoonChooseMoreCharacters,
// Talking Tales
talesAddExtension: talesAddExtension,
talesChooseSprite: talesChooseSprite,
talesSaySomething: talesSaySomething,
talesAskAnswer: talesAskAnswer,
talesChooseBackdrop: talesChooseBackdrop,
talesSwitchBackdrop: talesSwitchBackdrop,
talesChooseAnotherSprite: talesChooseAnotherSprite,
talesMoveAround: talesMoveAround,
talesChooseAnotherBackdrop: talesChooseAnotherBackdrop,
talesAnimateTalking: talesAnimateTalking,
talesChooseThirdBackdrop: talesChooseThirdBackdrop,
talesChooseSound: talesChooseSound,
talesDanceMoves: talesDanceMoves
};
export {esImages};
+451 -451
View File
@@ -104,82 +104,6 @@ export default {
urlId: 'getStarted'
},
'animate-a-name': {
name: (
<FormattedMessage
defaultMessage="Animate a Name"
description="Name for the 'Animate a Name' how-to"
id="gui.howtos.animate-a-name.name"
/>
),
img: libraryAnimate,
tags: ['animation', 'art', 'spin', 'grow'],
steps: [{
video: 'animate-a-name'
}, {
title: (
<FormattedMessage
defaultMessage="Pick a Letter Sprite"
description="Step name for 'Pick a Letter Sprite' step"
id="gui.howtos.animate-a-name.step_AnimatePickLetter"
/>
),
image: 'namePickLetter'
}, {
title: (
<FormattedMessage
defaultMessage="Play a Sound When Clicked"
description="Step name for 'Play a Sound When Clicked' step"
id="gui.howtos.animate-a-name.step_AnimatePlaySound"
/>
),
image: 'namePlaySound'
}, {
title: (
<FormattedMessage
defaultMessage="Pick Another Letter Sprite"
description="Step name for 'Pick Another Letter Sprite"
id="gui.howtos.animate-a-name.step_AnimatePickLetter2"
/>
),
image: 'namePickLetter2'
}, {
title: (
<FormattedMessage
defaultMessage="Change color"
description="Step name for 'Change color' step"
id="gui.howtos.animate-a-name.step_AnimateChangeColor"
/>
),
image: 'nameChangeColor'
}, {
title: (
<FormattedMessage
defaultMessage="Pick Another Letter Sprite & Make It Spin"
description="Step name for 'Pick Another Letter Sprite & Make It Spin' step"
id="gui.howtos.animate-a-name.step_AnimateSpin"
/>
),
image: 'nameSpin'
}, {
title: (
<FormattedMessage
defaultMessage="Pick Another Letter Sprite & Make It Grow"
description="Step name for 'Pick Another Letter Sprite & Make It Grow!' step"
id="gui.howtos.animate-a-name.step_AnimateGrow"
/>
),
image: 'nameGrow'
}, {
deckIds: [
'add-a-backdrop',
'glide-around'
]
}
],
urlId: 'name'
},
'imagine': {
name: (
<FormattedMessage
@@ -337,6 +261,457 @@ export default {
urlId: 'imagine'
},
'code-cartoon': {
name: (
<FormattedMessage
defaultMessage="Code a Cartoon"
description="Name for the 'Code a Cartoon' how-to"
id="gui.howtos.code-cartoon"
/>
),
tags: ['code-cartoon'],
requiredProjectId: '331474033',
img: libraryCodeCartoon,
steps: [{
video: 'code-cartoon'
}, {
title: (
<FormattedMessage
defaultMessage="Say Something When You Click the Green Flag"
description="Step name for 'Say Something When You Click the Green Flag' step"
id="gui.howtos.code-cartoon.step_codeCartoonSaySomething"
/>
),
image: 'codeCartoonSaySomething'
}, {
title: (
<FormattedMessage
defaultMessage="Animate a Character When You Click It"
description="Step name for 'Animate a Character When You Click It' step"
id="gui.howtos.code-cartoon.step_codeCartoonAnimate"
/>
),
image: 'codeCartoonAnimate'
}, {
title: (
<FormattedMessage
defaultMessage="Select a Different Character"
description="Step name for 'Select a Different Character' step"
id="gui.howtos.code-cartoon.step_codeCartoonSelectDifferentCharacter"
/>
),
image: 'codeCartoonSelectDifferentCharacter'
}, {
title: (
<FormattedMessage
defaultMessage="Use a Minus Sign to Get Smaller"
description="Step name for 'Use a Minus Sign to Get Smaller' step"
id="gui.howtos.code-cartoon.step_codeCartoonUseMinusSign"
/>
),
image: 'codeCartoonUseMinusSign'
}, {
title: (
<FormattedMessage
defaultMessage="Make a Character Grow and Shrink"
description="Step name for 'Make a Character Grow and Shrink' step"
id="gui.howtos.code-cartoon.step_codeCartoonGrowShrink"
/>
),
image: 'codeCartoonGrowShrink'
}, {
title: (
<FormattedMessage
defaultMessage="Select a Different Character"
description="Step name for 'Select a Different Character' step"
id="gui.howtos.code-cartoon.step_codeCartoonSelectDifferentCharacter2"
/>
),
image: 'codeCartoonSelectDifferentCharacter2'
}, {
title: (
<FormattedMessage
defaultMessage="Jump Up and Down"
description="Step name for 'Jump Up and Down' step"
id="gui.howtos.code-cartoon.step_codeCartoonJump"
/>
),
image: 'codeCartoonJump'
}, {
title: (
<FormattedMessage
defaultMessage="Click a Character to Change Scenes"
description="Step name for 'Click a Character to Change Scenes' step"
id="gui.howtos.code-cartoon.step_codeCartoonChangeScenes"
/>
),
image: 'codeCartoonChangeScenes'
}, {
title: (
<FormattedMessage
defaultMessage="Glide Around"
description="Step name for 'Glide Around' step"
id="gui.howtos.code-cartoon.step_codeCartoonGlideAround"
/>
),
image: 'codeCartoonGlideAround'
}, {
title: (
<FormattedMessage
defaultMessage="Change Costumes"
description="Step name for 'Change Costumes' step"
id="gui.howtos.code-cartoon.step_codeCartoonChangeCostumes"
/>
),
image: 'codeCartoonChangeCostumes'
}, {
title: (
<FormattedMessage
defaultMessage="Choose More Characters to Add to Your Cartoon"
description="Step name for 'Choose More Characters to Add to Your Cartoon' step"
id="gui.howtos.code-cartoon.step_codeCartoonChooseMoreCharacters"
/>
),
image: 'codeCartoonChooseMoreCharacters'
}, {
deckIds: [
'Chase-Game',
'Tell-A-Story'
]
}
],
urlId: 'code-cartoon'
},
'say-it-out-loud': {
name: (
<FormattedMessage
defaultMessage="Create Animations That Talk"
description="Name for the 'Create Animations That Talk' how-to"
id="gui.howtos.say-it-out-loud"
/>
),
img: libraryTXTSpeech,
steps: [{
video: 'k54n8uwcty',
trackingPixel: (
<img src="https://code.org/api/hour/begin_scratch_talk.png" />
)
}, {
title: (
<FormattedMessage
defaultMessage="Add the Text to Speech blocks"
description="Step name for 'Add the Text to Speech blocks' step"
id="gui.howtos.say-it-out-loud.step_AddTXTextension"
/>
),
image: 'speechAddExtension'
}, {
title: (
<FormattedMessage
defaultMessage="Say Something"
description="Step name for 'Say Something' step"
id="gui.howtos.say-it-out-loud.step_TXTSpeech"
/>
),
image: 'speechSaySomething'
}, {
title: (
<FormattedMessage
defaultMessage="Set a Voice"
description="Step name for 'Set a Voice"
id="gui.howtos.say-it-out-loud_TXTSetVoice"
/>
),
image: 'speechSetVoice'
}, {
title: (
<FormattedMessage
defaultMessage="Move Around"
description="Step name for 'Move Around' step"
id="gui.howtos.say-it-out-loud.step_TXTMove"
/>
),
image: 'speechMoveAround'
}, {
title: (
<FormattedMessage
defaultMessage="Add a Backdrop"
description="Step name for 'Add a Backdrop' step"
id="gui.howtos.say-it-out-loud.step_TXTBackdrop"
/>
),
image: 'speechAddBackdrop'
}, {
title: (
<FormattedMessage
defaultMessage="Add Another Character"
description="Step name for 'Add Another Character' step"
id="gui.howtos.say-it-out-loud.step_TXTAddSprite"
/>
),
image: 'speechAddSprite'
}, {
title: (
<FormattedMessage
defaultMessage="Perform a Song"
description="Step name for 'Perform a Song' step"
id="gui.howtos.say-it-out-loud.step_TXTSong"
/>
),
image: 'speechSong'
}, {
title: (
<FormattedMessage
defaultMessage="Change Color"
description="Step name for 'Change Color' step"
id="gui.howtos.say-it-out-loud.step_TXTColor"
/>
),
image: 'speechChangeColor'
}, {
title: (
<FormattedMessage
defaultMessage="Spin Around"
description="Step name for 'Spin Around"
id="gui.howtos.say-it-out-loud.step_TXTSpin"
/>
),
image: 'speechSpin'
}, {
title: (
<FormattedMessage
defaultMessage="Grow and Shrink"
description="Step name for 'Grow and Shrink' step"
id="gui.howtos.say-it-out-loud.step_TXTGrow"
/>
),
image: 'speechGrowShrink'
}, {
deckIds: [
'animate-a-name',
'Make-Music'
]
}
],
urlId: 'animations-that-talk'
},
'talking': {
name: (
<FormattedMessage
defaultMessage="Talking Tales"
description="Name for the 'Talking Tales' how-to"
id="gui.howtos.talking"
/>
),
tags: ['talking'],
img: libraryTalking,
steps: [{
video: 'talking'
}, {
title: (
<FormattedMessage
defaultMessage="Click to Add the Text-to-Speech Blocks"
description="Step name for 'Click to Add the Text-to-Speech Blocks' step"
id="gui.howtos.talking.step_talesAddExtension"
/>
),
image: 'talesAddExtension'
}, {
title: (
<FormattedMessage
defaultMessage="Choose a Sprite"
description="Step name for 'Choose a Sprite' step"
id="gui.howtos.talking.step_talesChooseSprite"
/>
),
image: 'talesChooseSprite'
}, {
title: (
<FormattedMessage
defaultMessage="Make a Character Speak"
description="Step name for 'Make a Character Speak' step"
id="gui.howtos.talking.step_talesSaySomething"
/>
),
image: 'talesSaySomething'
}, {
title: (
<FormattedMessage
defaultMessage="Choose a Backdrop"
description="Step name for 'Choose a Backdrop' step"
id="gui.howtos.talking.step_talesChooseBackdrop"
/>
),
image: 'talesChooseBackdrop'
}, {
title: (
<FormattedMessage
defaultMessage="Click a Character to Go to the Next Backdrop"
description="Step name for 'Click a Character to Go to the Next Backdrop' step"
id="gui.howtos.talking.step_talesSwitchBackdrop"
/>
),
image: 'talesSwitchBackdrop'
}, {
title: (
<FormattedMessage
defaultMessage="Choose Another Sprite"
description="Step name for 'Choose Another Sprite' step"
id="gui.howtos.talking.step_talesChooseAnotherSprite"
/>
),
image: 'talesChooseAnotherSprite'
}, {
title: (
<FormattedMessage
defaultMessage="Move Around"
description="Step name for 'Move Around' step"
id="gui.howtos.talking.step_talesMoveAround"
/>
),
image: 'talesMoveAround'
}, {
title: (
<FormattedMessage
defaultMessage="Choose Another Backdrop"
description="Step name for 'Choose Another Backdrop' step"
id="gui.howtos.talking.step_talesChooseAnotherBackdrop"
/>
),
image: 'talesChooseAnotherBackdrop'
}, {
title: (
<FormattedMessage
defaultMessage="Animate Talking"
description="Step name for 'Animate Talking' step"
id="gui.howtos.talking.step_talesAnimateTalking"
/>
),
image: 'talesAnimateTalking'
}, {
title: (
<FormattedMessage
defaultMessage="Choose Another Backdrop"
description="Step name for 'Choose Another Backdrop' step"
id="gui.howtos.talking.step_talesChooseThirdBackdrop"
/>
),
image: 'talesChooseThirdBackdrop'
}, {
title: (
<FormattedMessage
defaultMessage="Choose a Song to Dance To"
description="Step name for 'Choose a Song to Dance To' step"
id="gui.howtos.talking.step_talesChooseSound"
/>
),
image: 'talesChooseSound'
}, {
title: (
<FormattedMessage
defaultMessage="Dance Moves"
description="Step name for 'Dance Moves' step"
id="gui.howtos.talking.step_talesDanceMoves"
/>
),
image: 'talesDanceMoves'
}, {
title: (
<FormattedMessage
defaultMessage="Get the Ask and Answer Blocks from the Sensing Category"
description="Step name for 'Get the Ask and Answer Blocks from the Sensing Category' step"
id="gui.howtos.talking.step_talesAskAnswer"
/>
),
image: 'talesAskAnswer'
}, {
deckIds: [
'Tell-A-Story',
'Animate-A-Character'
]
}
],
urlId: 'talking'
},
'animate-a-name': {
name: (
<FormattedMessage
defaultMessage="Animate a Name"
description="Name for the 'Animate a Name' how-to"
id="gui.howtos.animate-a-name.name"
/>
),
img: libraryAnimate,
tags: ['animation', 'art', 'spin', 'grow'],
steps: [{
video: 'animate-a-name'
}, {
title: (
<FormattedMessage
defaultMessage="Pick a Letter Sprite"
description="Step name for 'Pick a Letter Sprite' step"
id="gui.howtos.animate-a-name.step_AnimatePickLetter"
/>
),
image: 'namePickLetter'
}, {
title: (
<FormattedMessage
defaultMessage="Play a Sound When Clicked"
description="Step name for 'Play a Sound When Clicked' step"
id="gui.howtos.animate-a-name.step_AnimatePlaySound"
/>
),
image: 'namePlaySound'
}, {
title: (
<FormattedMessage
defaultMessage="Pick Another Letter Sprite"
description="Step name for 'Pick Another Letter Sprite"
id="gui.howtos.animate-a-name.step_AnimatePickLetter2"
/>
),
image: 'namePickLetter2'
}, {
title: (
<FormattedMessage
defaultMessage="Change color"
description="Step name for 'Change color' step"
id="gui.howtos.animate-a-name.step_AnimateChangeColor"
/>
),
image: 'nameChangeColor'
}, {
title: (
<FormattedMessage
defaultMessage="Pick Another Letter Sprite & Make It Spin"
description="Step name for 'Pick Another Letter Sprite & Make It Spin' step"
id="gui.howtos.animate-a-name.step_AnimateSpin"
/>
),
image: 'nameSpin'
}, {
title: (
<FormattedMessage
defaultMessage="Pick Another Letter Sprite & Make It Grow"
description="Step name for 'Pick Another Letter Sprite & Make It Grow!' step"
id="gui.howtos.animate-a-name.step_AnimateGrow"
/>
),
image: 'nameGrow'
}, {
deckIds: [
'add-a-backdrop',
'glide-around'
]
}
],
urlId: 'name'
},
'Make-Music': {
name: (
<FormattedMessage
@@ -1075,128 +1450,6 @@ export default {
urlId: 'pong'
},
'code-cartoon': {
name: (
<FormattedMessage
defaultMessage="Code a Cartoon"
description="Name for the 'Code a Cartoon' how-to"
id="gui.howtos.code-cartoon"
/>
),
tags: ['code-cartoon'],
requiredProjectId: '331474033',
img: libraryCodeCartoon,
steps: [{
video: 'code-cartoon'
}, {
title: (
<FormattedMessage
defaultMessage="Say Something When You Click the Green Flag"
description="Step name for 'Say Something When You Click the Green Flag' step"
id="gui.howtos.code-cartoon.step_codeCartoonSaySomething"
/>
),
image: 'codeCartoonSaySomething'
}, {
title: (
<FormattedMessage
defaultMessage="Animate a Character When You Click It"
description="Step name for 'Animate a Character When You Click It' step"
id="gui.howtos.code-cartoon.step_codeCartoonAnimate"
/>
),
image: 'codeCartoonAnimate'
}, {
title: (
<FormattedMessage
defaultMessage="Select a Different Character"
description="Step name for 'Select a Different Character' step"
id="gui.howtos.code-cartoon.step_codeCartoonSelectDifferentCharacter"
/>
),
image: 'codeCartoonSelectDifferentCharacter'
}, {
title: (
<FormattedMessage
defaultMessage="Use a Minus Sign to Get Smaller"
description="Step name for 'Use a Minus Sign to Get Smaller' step"
id="gui.howtos.code-cartoon.step_codeCartoonUseMinusSign"
/>
),
image: 'codeCartoonUseMinusSign'
}, {
title: (
<FormattedMessage
defaultMessage="Make a Character Grow and Shrink"
description="Step name for 'Make a Character Grow and Shrink' step"
id="gui.howtos.code-cartoon.step_codeCartoonGrowShrink"
/>
),
image: 'codeCartoonGrowShrink'
}, {
title: (
<FormattedMessage
defaultMessage="Select a Different Character"
description="Step name for 'Select a Different Character' step"
id="gui.howtos.code-cartoon.step_codeCartoonSelectDifferentCharacter2"
/>
),
image: 'codeCartoonSelectDifferentCharacter2'
}, {
title: (
<FormattedMessage
defaultMessage="Jump Up and Down"
description="Step name for 'Jump Up and Down' step"
id="gui.howtos.code-cartoon.step_codeCartoonJump"
/>
),
image: 'codeCartoonJump'
}, {
title: (
<FormattedMessage
defaultMessage="Click a Character to Change Scenes"
description="Step name for 'Click a Character to Change Scenes' step"
id="gui.howtos.code-cartoon.step_codeCartoonChangeScenes"
/>
),
image: 'codeCartoonChangeScenes'
}, {
title: (
<FormattedMessage
defaultMessage="Glide Around"
description="Step name for 'Glide Around' step"
id="gui.howtos.code-cartoon.step_codeCartoonGlideAround"
/>
),
image: 'codeCartoonGlideAround'
}, {
title: (
<FormattedMessage
defaultMessage="Change Costumes"
description="Step name for 'Change Costumes' step"
id="gui.howtos.code-cartoon.step_codeCartoonChangeCostumes"
/>
),
image: 'codeCartoonChangeCostumes'
}, {
title: (
<FormattedMessage
defaultMessage="Choose More Characters to Add to Your Cartoon"
description="Step name for 'Choose More Characters to Add to Your Cartoon' step"
id="gui.howtos.code-cartoon.step_codeCartoonChooseMoreCharacters"
/>
),
image: 'codeCartoonChooseMoreCharacters'
}, {
deckIds: [
'Chase-Game',
'Tell-A-Story'
]
}
],
urlId: 'code-cartoon'
},
'cartoon-network': {
name: (
<FormattedMessage
@@ -1356,259 +1609,6 @@ export default {
urlId: 'video-sensing'
},
'say-it-out-loud': {
name: (
<FormattedMessage
defaultMessage="Create Animations That Talk"
description="Name for the 'Create Animations That Talk' how-to"
id="gui.howtos.say-it-out-loud"
/>
),
img: libraryTXTSpeech,
steps: [{
video: 'k54n8uwcty',
trackingPixel: (
<img src="https://code.org/api/hour/begin_scratch_talk.png" />
)
}, {
title: (
<FormattedMessage
defaultMessage="Add the Text to Speech blocks"
description="Step name for 'Add the Text to Speech blocks' step"
id="gui.howtos.say-it-out-loud.step_AddTXTextension"
/>
),
image: 'speechAddExtension'
}, {
title: (
<FormattedMessage
defaultMessage="Say Something"
description="Step name for 'Say Something' step"
id="gui.howtos.say-it-out-loud.step_TXTSpeech"
/>
),
image: 'speechSaySomething'
}, {
title: (
<FormattedMessage
defaultMessage="Set a Voice"
description="Step name for 'Set a Voice"
id="gui.howtos.say-it-out-loud_TXTSetVoice"
/>
),
image: 'speechSetVoice'
}, {
title: (
<FormattedMessage
defaultMessage="Move Around"
description="Step name for 'Move Around' step"
id="gui.howtos.say-it-out-loud.step_TXTMove"
/>
),
image: 'speechMoveAround'
}, {
title: (
<FormattedMessage
defaultMessage="Add a Backdrop"
description="Step name for 'Add a Backdrop' step"
id="gui.howtos.say-it-out-loud.step_TXTBackdrop"
/>
),
image: 'speechAddBackdrop'
}, {
title: (
<FormattedMessage
defaultMessage="Add Another Character"
description="Step name for 'Add Another Character' step"
id="gui.howtos.say-it-out-loud.step_TXTAddSprite"
/>
),
image: 'speechAddSprite'
}, {
title: (
<FormattedMessage
defaultMessage="Perform a Song"
description="Step name for 'Perform a Song' step"
id="gui.howtos.say-it-out-loud.step_TXTSong"
/>
),
image: 'speechSong'
}, {
title: (
<FormattedMessage
defaultMessage="Change Color"
description="Step name for 'Change Color' step"
id="gui.howtos.say-it-out-loud.step_TXTColor"
/>
),
image: 'speechChangeColor'
}, {
title: (
<FormattedMessage
defaultMessage="Spin Around"
description="Step name for 'Spin Around"
id="gui.howtos.say-it-out-loud.step_TXTSpin"
/>
),
image: 'speechSpin'
}, {
title: (
<FormattedMessage
defaultMessage="Grow and Shrink"
description="Step name for 'Grow and Shrink' step"
id="gui.howtos.say-it-out-loud.step_TXTGrow"
/>
),
image: 'speechGrowShrink'
}, {
deckIds: [
'animate-a-name',
'Make-Music'
]
}
],
urlId: 'animations-that-talk'
},
'talking': {
name: (
<FormattedMessage
defaultMessage="Talking Tales"
description="Name for the 'Talking Tales' how-to"
id="gui.howtos.talking"
/>
),
tags: ['talking'],
img: libraryTalking,
steps: [{
video: 'talking'
}, {
title: (
<FormattedMessage
defaultMessage="Click to Add the Text-to-Speech Blocks"
description="Step name for 'Click to Add the Text-to-Speech Blocks' step"
id="gui.howtos.talking.step_talesAddExtension"
/>
),
image: 'talesAddExtension'
}, {
title: (
<FormattedMessage
defaultMessage="Choose a Sprite"
description="Step name for 'Choose a Sprite' step"
id="gui.howtos.talking.step_talesChooseSprite"
/>
),
image: 'talesChooseSprite'
}, {
title: (
<FormattedMessage
defaultMessage="Make a Character Speak"
description="Step name for 'Make a Character Speak' step"
id="gui.howtos.talking.step_talesSaySomething"
/>
),
image: 'talesSaySomething'
}, {
title: (
<FormattedMessage
defaultMessage="Choose a Backdrop"
description="Step name for 'Choose a Backdrop' step"
id="gui.howtos.talking.step_talesChooseBackdrop"
/>
),
image: 'talesChooseBackdrop'
}, {
title: (
<FormattedMessage
defaultMessage="Click a Character to Go to the Next Backdrop"
description="Step name for 'Click a Character to Go to the Next Backdrop' step"
id="gui.howtos.talking.step_talesSwitchBackdrop"
/>
),
image: 'talesSwitchBackdrop'
}, {
title: (
<FormattedMessage
defaultMessage="Choose Another Sprite"
description="Step name for 'Choose Another Sprite' step"
id="gui.howtos.talking.step_talesChooseAnotherSprite"
/>
),
image: 'talesChooseAnotherSprite'
}, {
title: (
<FormattedMessage
defaultMessage="Move Around"
description="Step name for 'Move Around' step"
id="gui.howtos.talking.step_talesMoveAround"
/>
),
image: 'talesMoveAround'
}, {
title: (
<FormattedMessage
defaultMessage="Choose Another Backdrop"
description="Step name for 'Choose Another Backdrop' step"
id="gui.howtos.talking.step_talesChooseAnotherBackdrop"
/>
),
image: 'talesChooseAnotherBackdrop'
}, {
title: (
<FormattedMessage
defaultMessage="Animate Talking"
description="Step name for 'Animate Talking' step"
id="gui.howtos.talking.step_talesAnimateTalking"
/>
),
image: 'talesAnimateTalking'
}, {
title: (
<FormattedMessage
defaultMessage="Choose Another Backdrop"
description="Step name for 'Choose Another Backdrop' step"
id="gui.howtos.talking.step_talesChooseThirdBackdrop"
/>
),
image: 'talesChooseThirdBackdrop'
}, {
title: (
<FormattedMessage
defaultMessage="Choose a Song to Dance To"
description="Step name for 'Choose a Song to Dance To' step"
id="gui.howtos.talking.step_talesChooseSound"
/>
),
image: 'talesChooseSound'
}, {
title: (
<FormattedMessage
defaultMessage="Dance Moves"
description="Step name for 'Dance Moves' step"
id="gui.howtos.talking.step_talesDanceMoves"
/>
),
image: 'talesDanceMoves'
}, {
title: (
<FormattedMessage
defaultMessage="Get the Ask and Answer Blocks from the Sensing Category"
description="Step name for 'Get the Ask and Answer Blocks from the Sensing Category' step"
id="gui.howtos.talking.step_talesAskAnswer"
/>
),
image: 'talesAskAnswer'
}, {
deckIds: [
'Tell-A-Story',
'Animate-A-Character'
]
}
],
urlId: 'talking'
},
'add-sprite': {
name: (
<FormattedMessage
Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 652 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 802 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 520 KiB

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 KiB

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 718 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 487 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 872 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 669 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 487 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 541 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 354 KiB

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 710 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 297 KiB

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 283 KiB

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 308 KiB

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 373 KiB

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 KiB

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 291 KiB

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 415 KiB

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 409 KiB

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 913 KiB

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 247 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Loaded 100 of 306 files, more files were not shown because too many files have changed in this diff. Show more