diff --git a/src/components/youtube-playlist-item/youtube-playlist-item.jsx b/src/components/youtube-playlist-item/youtube-playlist-item.jsx
new file mode 100644
index 000000000..74ae82456
--- /dev/null
+++ b/src/components/youtube-playlist-item/youtube-playlist-item.jsx
@@ -0,0 +1,61 @@
+import React, {useEffect, useState} from 'react';
+import PropTypes from 'prop-types';
+
+import {FormattedMessage} from 'react-intl';
+import api from '../../lib/api';
+import {YoutubeVideoButton} from '../youtube-video-button/youtube-video-button.jsx';
+import Spinner from '../spinner/spinner.jsx';
+
+import './youtube-playlist-item.scss';
+
+export const YoutubePlaylistItem = ({playlistRequestUri, playlistTitleId, onSelectedVideo}) => {
+ const [loading, setLoading] = useState(true);
+ const [playlistVideos, setPlaylistVideos] = useState([]);
+
+ useEffect(() => {
+ api({
+ host: process.env.ROOT_URL,
+ method: 'GET',
+ uri: playlistRequestUri,
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }, (_err, body, res) => {
+ setLoading(false);
+ if (res.statusCode === 200) {
+ setPlaylistVideos(body);
+ }
+ });
+ }, []);
+
+ return (
+
@@ -194,7 +247,9 @@ const Ideas = () => {
}
/>
diff --git a/src/views/ideas/ideas.scss b/src/views/ideas/ideas.scss
index 0781b98b0..eac7f697e 100644
--- a/src/views/ideas/ideas.scss
+++ b/src/views/ideas/ideas.scss
@@ -52,8 +52,10 @@ $base-bg: $ui-white;
gap: 0.75rem;
.tips-section {
- display: flex;
- justify-content: space-between;
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax($cols3, auto));
+ justify-content: space-around;
+ align-items: center;
.tip {
display: flex;
@@ -68,6 +70,56 @@ $base-bg: $ui-white;
}
}
+.youtube-videos {
+ .inner {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+
+ .section-header {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 2.5rem;
+ padding: 4rem 0;
+
+ div {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ max-width: 25rem;
+
+ .section-title {
+ font-size: 2rem;
+ font-weight: 700;
+ line-height: 2.5rem;
+ text-align: start;
+ }
+
+ .section-description {
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5rem;
+ text-align: start;
+
+ a {
+ font-weight: 400;
+ text-decoration: underline;
+ }
+ }
+ }
+ }
+
+ .playlists {
+ display: flex;
+ flex-direction: column;
+ gap: 3rem;
+ margin-bottom: 3rem;
+ }
+ }
+}
+
.physical-ideas {
.inner {
display: flex;
@@ -152,10 +204,14 @@ $base-bg: $ui-white;
}
}
-.section-header {
- font-size: 2rem;
- font-family: "Helvetica Neue", "Helvetica", Arial, sans-serif;
- font-weight: 700;
+.tips, .physical-ideas {
+ .section-header {
+ display: flex;
+ justify-content: start;
+ font-size: 2rem;
+ font-weight: 700;
+ line-height: 2.5rem;
+ }
}
.tips-button {
@@ -164,7 +220,6 @@ $base-bg: $ui-white;
align-items: center;
gap: 0.5rem;
- font-family: "Helvetica Neue", "Helvetica", Arial, sans-serif;
font-weight: 700;
line-height: 1.25rem;
diff --git a/src/views/ideas/l10n.json b/src/views/ideas/l10n.json
index 1c1038a82..dc5362185 100644
--- a/src/views/ideas/l10n.json
+++ b/src/views/ideas/l10n.json
@@ -32,6 +32,11 @@
"ideas.tryTheTutorial": "Try the tutorial",
"ideas.codingCards": "Coding Cards",
"ideas.educatorGuide": "Educator Guide",
+ "ideas.scratchYouTubeChannel": "ScratchTeam channel",
+ "ideas.scratchYouTubeChannelDescription": "This is the official
Youtube Channel of Scratch. We share resources, tutorials, and stories about Scratch.",
+ "ideas.spritesAndVector": "Sprites & Vector Drawing",
+ "ideas.tipsAndTricks": "Tips & Tricks",
+ "ideas.advancedTopics": "Advanced Topics",
"ideas.physicalPlayIdeas": "Physical Play Ideas",
"ideas.microBitHeader": "Have a micro:bit?",
"ideas.microBitBody": "Connect your Scratch project to the real world.",
diff --git a/static/images/ideas/video-cc-label.svg b/static/images/ideas/video-cc-label.svg
new file mode 100644
index 000000000..c8fb418e2
--- /dev/null
+++ b/static/images/ideas/video-cc-label.svg
@@ -0,0 +1,4 @@
+
diff --git a/static/images/ideas/youtube-icon.svg b/static/images/ideas/youtube-icon.svg
new file mode 100644
index 000000000..6ef5af067
--- /dev/null
+++ b/static/images/ideas/youtube-icon.svg
@@ -0,0 +1,12 @@
+
diff --git a/webpack.config.js b/webpack.config.js
index e62fa08c5..0d8f1078b 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -271,6 +271,7 @@ module.exports = {
new webpack.DefinePlugin({
'process.env.NODE_ENV': `"${process.env.NODE_ENV || 'development'}"`,
'process.env.API_HOST': `"${process.env.API_HOST || 'https://api.scratch.mit.edu'}"`,
+ 'process.env.ROOT_URL': `"${process.env.ROOT_URL || 'https://scratch.mit.edu'}"`,
'process.env.RECAPTCHA_SITE_KEY': `"${
process.env.RECAPTCHA_SITE_KEY || '6Lf6kK4UAAAAABKTyvdSqgcSVASEnMrCquiAkjVW'}"`,
'process.env.ASSET_HOST': `"${process.env.ASSET_HOST || 'https://assets.scratch.mit.edu'}"`,