diff --git a/packages/scratch-gui/src/components/cards/card.css b/packages/scratch-gui/src/components/cards/card.css index 523323fff8..38f78d7cf1 100644 --- a/packages/scratch-gui/src/components/cards/card.css +++ b/packages/scratch-gui/src/components/cards/card.css @@ -190,14 +190,14 @@ margin: 0 0.5rem 0.5rem; } -.decks { +.decks, .resources { display: flex; flex-direction: row; justify-content: space-around; padding: 0 1rem 0.5rem; } -.deck { +.deck, .resource { display: flex; flex-direction: column; margin: 0 8px 8px; @@ -207,13 +207,13 @@ overflow: hidden; } -.deck-image { +.deck-image, .resource-image { width: 200px; height: 100px; object-fit: cover; } -.deck-name { +.deck-name, .resource-name { color: $looks-secondary; font-weight: bold; font-size: 0.85rem; diff --git a/packages/scratch-gui/src/components/cards/cards.jsx b/packages/scratch-gui/src/components/cards/cards.jsx index ec0111e1ad..393f7f6301 100644 --- a/packages/scratch-gui/src/components/cards/cards.jsx +++ b/packages/scratch-gui/src/components/cards/cards.jsx @@ -275,6 +275,60 @@ PreviewsStep.propTypes = { onShowAll: PropTypes.func.isRequired }; +const PreviewExternalStep = ({externalResources, onShowAll}) => ( + + + + + + {Object.keys(externalResources).slice(0, 2) + .map(id => ( + + + {externalResources[id].name} + + ))} + + + + + + + +); + +PreviewExternalStep.propTypes = { + externalResources: PropTypes.shape({ + id: PropTypes.shape({ + name: PropTypes.node.isRequired, + img: PropTypes.string.isRequired, + url: PropTypes.string.isRequired + }) + }).isRequired, + onShowAll: PropTypes.func.isRequired +}; + const Cards = props => { const { activeDeckId, @@ -359,26 +413,32 @@ const Cards = props => { onShowAll={onShowAll} /> ) : ( - steps[step].video ? ( - showVideos ? - ( - - ) : ( - - ) - ) : ( - - ) + ) : + steps[step].video ? ( + showVideos ? + ( + + ) : ( + + ) + ) : ( + + ) )} {steps[step].trackingPixel && steps[step].trackingPixel} diff --git a/packages/scratch-gui/src/lib/libraries/decks/en-steps.js b/packages/scratch-gui/src/lib/libraries/decks/en-steps.js index bbc8eee394..506360cf2e 100644 --- a/packages/scratch-gui/src/lib/libraries/decks/en-steps.js +++ b/packages/scratch-gui/src/lib/libraries/decks/en-steps.js @@ -91,6 +91,16 @@ import videoPet from './steps/video-pet.en.png'; import videoAnimate from './steps/video-animate.en.png'; import videoPop from './steps/video-pop.en.png'; +// Face Sensing +import faceAddExtension from './steps/face-add-extension.en.gif'; +import faceAllowCamera from './steps/face-allow-camera.en.png'; +import faceAddFashionSprite from './steps/face-add-fashion-sprite.en.png'; +import faceGoToTopHead from './steps/face-go-to-top-head.en.gif'; +import faceGoToTopHeadForever from './steps/face-go-to-top-head-forever.en.png'; +import faceAdjustSize from './steps/face-adjust-size.en.gif'; +import faceAddAnotherSprite from './steps/face-add-another-sprite.en.png'; +import faceClickerGame from './steps/face-clicker-game.en.png'; + // Make it Fly import flyChooseBackdrop from './steps/fly-choose-backdrop.LTR.gif'; import flyChooseCharacter from './steps/fly-choose-character.LTR.png'; @@ -293,6 +303,16 @@ const enImages = { videoAnimate: videoAnimate, videoPop: videoPop, + // Face Sensing + faceAddExtension: faceAddExtension, + faceAllowCamera: faceAllowCamera, + faceAddFashionSprite: faceAddFashionSprite, + faceGoToTopHead: faceGoToTopHead, + faceGoToTopHeadForever: faceGoToTopHeadForever, + faceAdjustSize: faceAdjustSize, + faceAddAnotherSprite: faceAddAnotherSprite, + faceClickerGame: faceClickerGame, + // Make it Fly flyChooseBackdrop: flyChooseBackdrop, flyChooseCharacter: flyChooseCharacter, diff --git a/packages/scratch-gui/src/lib/libraries/decks/index.jsx b/packages/scratch-gui/src/lib/libraries/decks/index.jsx index b66644c100..07d09a81f1 100644 --- a/packages/scratch-gui/src/lib/libraries/decks/index.jsx +++ b/packages/scratch-gui/src/lib/libraries/decks/index.jsx @@ -39,6 +39,9 @@ import libraryStory from './thumbnails/tell-a-story.jpg'; // Video Sensing import libraryVideoSens from './thumbnails/video-sensing.jpg'; +// Face Sensing +import libraryFaceSens from './thumbnails/face-sensing.jpg'; + // Make-it-Fly import libraryMakeFly from './thumbnails/make-it-fly.jpg'; @@ -65,6 +68,10 @@ import addEffectsThumb from './thumbnails/add-effects.jpg'; import moveArrowKeysThumb from './thumbnails/move-arrow-keys.jpg'; import spinThumb from './thumbnails/spin.jpg'; +// Extrernal Resources +import codingCards from './thumbnails/coding-cards.png'; +import faceSensingGame from './thumbnails/face-sensing-game.png'; + export const CATEGORIES = { gettingStarted: 'gettingStarted', basics: 'basics', @@ -1558,7 +1565,119 @@ export default { ], urlId: 'video-sensing' }, - + 'Face-Sensing': { + name: ( + + ), + img: libraryFaceSens, + category: CATEGORIES.intermediate, + steps: [{ + video: 'fnjds1cjei' + }, + { + title: ( + + ), + image: 'faceAddExtension' + }, { + title: ( + + ), + image: 'faceAllowCamera' + }, { + title: ( + + ), + image: 'faceAddFashionSprite' + }, { + title: ( + + ), + image: 'faceGoToTopHead' + }, { + title: ( + + ), + image: 'faceGoToTopHeadForever' + }, { + title: ( + + ), + image: 'faceAdjustSize' + }, { + title: ( + + ), + image: 'faceAddAnotherSprite' + }, { + title: ( + + ), + image: 'faceClickerGame' + }, { + externalResources: { + 'Face-Sensing-Game': { + name: ( + + ), + img: faceSensingGame, + url: 'https://scratch.mit.edu/projects/1210061611' + }, + 'Coding-Cards': { + name: ( + + ), + img: codingCards, + url: 'https://scratchfoundation.org/learn/learning-library/face-sensing' + } + } + }], + urlId: 'face-sensing' + }, 'talking': { name: (