+);
+
+render(, document.getElementById('app'));
diff --git a/src/views/conference/2019/index/index.scss b/src/views/conference/2019/index/index.scss
new file mode 100644
index 000000000..300d342d1
--- /dev/null
+++ b/src/views/conference/2019/index/index.scss
@@ -0,0 +1,350 @@
+@import "../../../../colors";
+@import "../../../../frameless";
+
+h1.title-banner-h1.mod-2019 {
+ position: absolute;
+ z-index: 1;
+ text-align: center;
+ left: 0;
+ right: 0;
+ padding-top: 5rem;
+ font-size: 3rem;
+}
+
+.title-banner.mod-conference.mod-2019 {
+ padding-top: 0;
+ padding-bottom: 0;
+ margin-bottom: 2.5rem;
+}
+
+.title-banner-image.mod-2019 {
+ position: relative;
+ z-index: 0;
+ margin-bottom: 1.75rem;
+ width: 100%;
+ height: 17rem;
+ background-image: url("/images/conference/index/2019/title-banner-3.jpg");
+ background-position: center;
+ background-size: cover;
+ opacity: .4;
+}
+
+.conf2019-panel {
+ margin: auto 5rem;
+}
+
+.conf2019-panel,
+.title-banner-h3.mod-2019 {
+}
+
+.title-banner-h3.mod-2019 {
+ text-align: left;
+ font-size: 1rem;
+}
+
+.conf2019-title-band {
+ background-color: $ui-blue;
+ text-align: center;
+}
+
+.conf2019-title-band.conf2019-schedule-band {
+ padding-top: 1rem;
+ padding-bottom: 2rem;
+ margin-top: 2rem;
+}
+
+.conf2019-title-band.conf2019-mailing-list {
+ padding-top: 2.25rem;
+ padding-bottom: 3rem;
+ margin-top: 2rem;
+}
+
+.conf2019-title-band>h3 {
+ width: 48.75rem;
+ color: $type-white;
+ margin: auto;
+}
+
+.conf2019-title-band>h3.conf2019-schedule {
+ font-weight: bold;
+ font-size: 1.6rem;
+}
+
+.conf2019-title-band>h3.conf2019-mailing-list {
+ font-weight: normal;
+ font-size: 1.15rem;
+}
+
+.conf2019-panel-title-text>h3 {
+ line-height: 1.7rem;
+}
+
+.conf2019-description.conf2019-band {
+ margin-bottom: 2.5rem;
+ width: 48.75rem;
+}
+
+.conf2019-description {
+ line-height: 1.9rem;
+ // width: 60%;
+ font-weight: normal;
+ font-size: 1rem;
+ color: $type-gray;
+ margin: 0 auto 1.6rem;
+}
+
+.conf2019-panel {
+ border-bottom: 1px solid $ui-border;
+}
+
+.conf2019-panel.mod-last {
+ border-bottom: 0;
+}
+
+.flex-row.conf2019-panel-title {
+ justify-content: flex-start;
+ align-items: center;
+}
+
+.conf2019-panel-flag {
+ margin-right: 6.25rem;
+ border: 1px solid $ui-border;
+ border-radius: 1px;
+ background-color: $ui-border;
+ width: 3.75rem;
+}
+
+.conf2019-panel-desc {
+ margin: 2rem 0;
+}
+
+.conf2019-mailing-list {
+ font-weight: normal;
+}
+
+td {
+ padding: .75rem 1.25rem;
+ vertical-align: top;
+}
+
+.conf2019-panel-row-icon-image {
+ margin-top: .125rem;
+ height: 1rem;
+}
+
+.conf2019-large-icon-image {
+ height: 2.5rem;
+ margin: 1rem;
+}
+
+.button.mod-2019-conf {
+ display: block;
+ margin: 2rem auto 0;
+ padding: 1rem 0;
+ width: 13.75rem;
+ text-align: center;
+ font-size: .9rem;
+}
+
+.button.mod-2019-conf-website-button {
+ background-color: $ui-orange;
+ color: $type-white;
+}
+
+.button.mod-2019-conf-maillist-button {
+ background-color: $ui-white;
+ color: $ui-blue-dark;
+}
+
+@media #{$small} {
+ .index.mod-2019 {
+ text-align: left;
+ }
+
+ h1.title-banner-h1.mod-2019 {
+ padding-top: 3.25rem;
+ font-size: 1.75rem;
+ }
+
+ .title-banner.mod-conference.mod-2019 {
+ }
+
+ .title-banner-image.mod-2019 {
+ height: 10rem;
+ }
+
+ .conf2019-title-band>h3 {
+ width: initial;
+ margin: 0 1rem;
+ }
+
+ .conf2019-panel {
+ margin: auto 1rem;
+ }
+
+ .title-banner-h3.mod-2019 {
+ margin: 1rem .5rem .5rem;
+ font-size: 1rem;
+ line-height: 1.6rem;
+ }
+
+ .conf2019-title-band>h3.conf2019-schedule {
+ font-size: 1.6rem;
+ }
+
+ .conf2019-title-band>h3.conf2019-mailing-list {
+ font-size: 1.15rem;
+ }
+
+ .conf2019-description.conf2019-band {
+ width: initial;
+ margin: 0 .5rem;
+ }
+
+ .conf2019-description {
+ line-height: 1.9rem;
+ font-size: 1rem;
+ margin: 0 .5rem 1.6rem;
+ }
+
+ .flex-row.conf2019-panel-title {
+ flex-direction: row;
+ }
+
+ .conf2019-panel-flag {
+ margin-right: 1.25rem;
+ }
+
+ .conf2019-panel-title-text {
+ max-width: 14rem;
+ }
+
+ .conf2019-panel-row > td {
+ padding: .75rem .375rem .75rem 0;
+ }
+
+ .conf2019-large-icon-image {
+ height: 2.5rem;
+ margin: 1rem;
+ }
+}
+
+@media #{$medium} {
+ .index.mod-2019 {
+ text-align: left;
+ }
+
+ h1.title-banner-h1.mod-2019 {
+ padding-top: 2.75rem;
+ font-size: 2.25rem;
+ }
+
+ .title-banner.mod-conference.mod-2019 {
+ }
+
+ .title-banner-image.mod-2019 {
+ height: 10rem;
+ }
+
+ .conf2019-title-band>h3 {
+ margin: auto .5rem ;
+ width: initial;
+ }
+
+ .conf2019-title-band>h3.conf2019-schedule {
+ font-size: 1.6rem;
+ }
+
+ .conf2019-title-band>h3.conf2019-mailing-list {
+ font-size: 1.15rem;
+ }
+
+ .conf2019-description.conf2019-band {
+ width: 464px;
+ margin: auto;
+ }
+
+ .conf2019-description {
+ line-height: 1.9rem;
+ font-size: 1rem;
+ margin: 0 auto 1.6rem;
+ }
+
+ .flex-row.conf2019-panel-title {
+ flex-direction: row;
+ }
+
+ .conf2019-panel {
+ margin: auto .5rem;
+ }
+
+ .conf2019-panel-flag {
+ margin-right: 2rem;
+ }
+
+ .conf2019-panel-title-text {
+ max-width: 18.75rem;
+ }
+
+ .button.mod-2019-panel {
+ width: 5.75rem;
+ }
+
+ .conf2019-large-icon-image {
+ height: 2.5rem;
+ margin: 1rem;
+ }
+}
+
+@media #{$intermediate} {
+ .index.mod-2019 {
+ text-align: left;
+ }
+
+ h1.title-banner-h1.mod-2019 {
+ padding-top: 4.75rem;
+ font-size: 2.75rem;
+ }
+
+ .title-banner.mod-conference.mod-2019 {
+ }
+
+ .title-banner-image.mod-2019 {
+ height: 15rem;
+ }
+
+ .conf2019-title-band>h3 {
+ width: 38.75rem;
+ }
+
+ .conf2019-panel {
+ margin: auto 4.5rem;
+ }
+
+ .conf2019-title-band>h3.conf2019-schedule {
+ font-size: 1.6rem;
+ }
+
+ .conf2019-title-band>h3.conf2019-mailing-list {
+ font-size: 1.15rem;
+ }
+
+ .conf2019-description.conf2019-band {
+ width: 38.75rem;
+ }
+
+ .conf2019-description {
+ line-height: 1.9rem;
+ font-size: 1rem;
+ margin: 0 auto 1.6rem;
+ }
+
+ .button.mod-2019-panel {
+ width: 8.75rem;
+ }
+
+ .conf2019-large-icon-image {
+ height: 2.5rem;
+ margin: 1rem;
+ }
+}
diff --git a/src/views/conference/2019/index/l10n.json b/src/views/conference/2019/index/l10n.json
new file mode 100644
index 000000000..e2bf39d61
--- /dev/null
+++ b/src/views/conference/2019/index/l10n.json
@@ -0,0 +1,31 @@
+{
+ "conference-2019.title": "Scratch Conferences 2019",
+ "conference-2019.descA": "Scratch conferences are playful gatherings of educators, researchers, developers, and other members of the worldwide Scratch community.",
+ "conference-2019.descB": "These events, held in various locations around the world, provide opportunities for people of diverse backgrounds and practices to discuss how they support children using Scratch, to collaborate and share ideas with one another, and to bring new creative-learning strategies and activities back to their own communities.",
+ "conference-2019.descC": "The first Scratch conference was held at MIT in 2008, and the Scratch Team has continued to organize a Scratch conference every other year. The next Scratch@MIT conference will be held in the summer of 2020 (in Cambridge, Massachusetts, USA).",
+ "conference-2019.descD": "In 2019, there will be several Scratch conferences held in other locations around the world (see below).",
+
+ "conference-2019.seeBelow": "Schedule & Locations",
+ "conference-2019.joinMailingListButtonText": "Join Mailing List",
+ "conference-2019.joinMailingList": "To learn more about 2020’s Scratch@MIT conference in Cambridge, Massachusetts, and to receive updates about regional conferences around the world, join our mailing list.",
+
+ "conference-2019.date": "Date",
+ "conference-2019.location": "Location",
+ "conference-2019.audience": "Audience",
+ "conference-2019.language": "Language",
+ "conference-2019.hashtag": "Hashtag",
+ "conference-2019.website": "Visit Website",
+
+ "conference-2019.ukTitle": "Scratch Conference Europe",
+ "conference-2019.ukDesc": "Hosted by Raspberry Pi, the 2019 Scratch Conference Europe will take place in Cambridge, UK, from Friday 23 August to Sunday 25 August. The schedule is full of exciting participatory activities led by members of the Scratch community. Participants can look forward to workshops, talks, and keynotes across a range of topics, including the new Scratch 3.0, as well as plenty of informal opportunities to chat and connect!",
+ "conference-2019.ukAudience": "Education professionals and volunteers",
+
+ "conference-2019.kenyaTitle": "Scratch2019NBO",
+ "conference-2019.kenyaSubTitle": "Waves of Innovation",
+ "conference-2019.kenyaDesc": "In recognition of Africa's technological contributions to the world and the potential of the youth of Africa, Scratch2019NBO will be held in Nairobi, Kenya. Join educators from around the world to share lessons, empower young people, and celebrate accomplishments in creative coding.",
+ "conference-2019.kenyaAudience": "Educators, students, and enthusiasts",
+
+ "conference-2019.chileDesc": "Scratch al Sur is a gathering for teachers and policy makers to learn about the importance of introducing programming languages in schools. All lectures and workshops will provide an opportunity to share different experiences, from higher levels to those who are beginning to participate in Scratch's global community.",
+ "conference-2019.chileAudience": "Teachers and policy makers",
+ "conference-2019.spanishWithSimultaneous": "Spanish - simultaneous translation into English during plenary sessions"
+}
diff --git a/src/views/faq/faq.jsx b/src/views/faq/faq.jsx
index a7fb6b9f3..557969351 100644
--- a/src/views/faq/faq.jsx
+++ b/src/views/faq/faq.jsx
@@ -147,7 +147,14 @@ const Faq = injectIntl(props => (
/>
-
+
+
+ )}}
+ />
+
diff --git a/src/views/faq/l10n.json b/src/views/faq/l10n.json
index 33348b2d1..731614e75 100644
--- a/src/views/faq/l10n.json
+++ b/src/views/faq/l10n.json
@@ -55,7 +55,7 @@
"faq.languagesScratch3Body2":"All of our translations are done by volunteers. The Scratch 3.0 editor has already been translated into 40+ languages. You can view all the languages currently being translated and reviewed on our {transifexLink}. If you want to help with translation or review, please contact {emailLink}.",
"faq.transifexLinkText":"translation server",
"faq.removedBlocksScratch3Title":"Does Scratch 3.0 remove any coding blocks from earlier versions of Scratch?",
- "faq.removedBlocksScratch3Body":"No coding blocks have been removed in Scratch 3.0, but some have changed a bit and others have moved into \"Extensions\" (as described below, under \"Where did the Pen blocks go?..\").",
+ "faq.removedBlocksScratch3Body":"No coding blocks have been removed in Scratch 3.0, but some have changed a bit and others have moved into \"Extensions\" (as described below, in the {extensionsFAQLink} section).",
"faq.newBlocksScratch3Title":"Does Scratch 3.0 introduce new blocks?",
"faq.newBlocksScratch3Body":"Yes! In Scratch 3.0 you’ll find:",
"faq.newBlocksSoundEffect":"New \"sound effect\" blocks",
diff --git a/src/views/preview/presentation.jsx b/src/views/preview/presentation.jsx
index d6cae775a..e0234396a 100644
--- a/src/views/preview/presentation.jsx
+++ b/src/views/preview/presentation.jsx
@@ -106,6 +106,7 @@ const PreviewPresentation = ({
onRestoreComment,
onSeeAllComments,
onSeeInside,
+ onSetProjectThumbnailer,
onShare,
onToggleComments,
onToggleStudio,
@@ -341,6 +342,7 @@ const PreviewPresentation = ({
onGreenFlag={onGreenFlag}
onProjectLoaded={onProjectLoaded}
onRemixing={onRemixing}
+ onSetProjectThumbnailer={onSetProjectThumbnailer}
onUpdateProjectId={onUpdateProjectId}
onUpdateProjectThumbnail={onUpdateProjectThumbnail}
/>
@@ -709,6 +711,7 @@ PreviewPresentation.propTypes = {
onRestoreComment: PropTypes.func,
onSeeAllComments: PropTypes.func,
onSeeInside: PropTypes.func,
+ onSetProjectThumbnailer: PropTypes.func,
onShare: PropTypes.func,
onToggleComments: PropTypes.func,
onToggleStudio: PropTypes.func,
diff --git a/src/views/preview/project-view.jsx b/src/views/preview/project-view.jsx
index 75a3b1f89..abcd8971e 100644
--- a/src/views/preview/project-view.jsx
+++ b/src/views/preview/project-view.jsx
@@ -79,6 +79,7 @@ class Preview extends React.Component {
'handleRemix',
'handleSeeAllComments',
'handleSeeInside',
+ 'handleSetProjectThumbnailer',
'handleShare',
'handleUpdateProjectId',
'handleUpdateProjectTitle',
@@ -381,7 +382,18 @@ class Preview extends React.Component {
this.setState({addToStudioOpen: false});
}
handleReportSubmit (formData) {
- this.props.reportProject(this.state.projectId, formData, this.props.user.token);
+ const submit = data => this.props.reportProject(this.state.projectId, data, this.props.user.token);
+ if (this.getProjectThumbnail) {
+ this.getProjectThumbnail(thumbnail => {
+ const data = Object.assign({}, formData, {thumbnail});
+ submit(data);
+ });
+ } else {
+ submit(formData);
+ }
+ }
+ handleSetProjectThumbnailer (fn) {
+ this.getProjectThumbnail = fn;
}
handleGreenFlag () {
if (!this.state.greenFlagRecorded) {
@@ -690,6 +702,7 @@ class Preview extends React.Component {
onRestoreComment={this.handleRestoreComment}
onSeeAllComments={this.handleSeeAllComments}
onSeeInside={this.handleSeeInside}
+ onSetProjectThumbnailer={this.handleSetProjectThumbnailer}
onShare={this.handleShare}
onToggleComments={this.handleToggleComments}
onToggleStudio={this.handleToggleStudio}
diff --git a/src/views/privacypolicy/privacypolicy.jsx b/src/views/privacypolicy/privacypolicy.jsx
index a7f82e44d..1591fecef 100644
--- a/src/views/privacypolicy/privacypolicy.jsx
+++ b/src/views/privacypolicy/privacypolicy.jsx
@@ -11,7 +11,7 @@ const Privacypolicy = () => (
- The Scratch Privacy Policy was last updated: May 23, 2018
+ The Scratch Privacy Policy was last updated: February 14, 2019
@@ -384,12 +384,13 @@ const Privacypolicy = () => (
unauthorized alteration, unauthorized disclosure or access,
misuse, and any other unlawful form of processing of the
Personal Information in our possession. For example, we
- strictly limit access to the Scratch servers and the data we
- store on them. However, as effective as these measures are,
- no security system is impenetrable. We cannot completely
- guarantee the security of our databases, nor can we
- guarantee that the information you supply will not be
- intercepted while being transmitted to us over the Internet.
+ use SSL/TLS for all data transfer and strictly limit access
+ to the Scratch servers and the data we store on them. However,
+ as effective as these measures are, no security system is
+ impenetrable. We cannot completely guarantee the security of
+ our databases, nor can we guarantee that the information you
+ supply will not be intercepted while being transmitted to us
+ over the Internet.
diff --git a/static/images/conference/footer/instagram.png b/static/images/conference/footer/instagram.png
new file mode 100644
index 000000000..e75a56f64
Binary files /dev/null and b/static/images/conference/footer/instagram.png differ
diff --git a/static/images/conference/index/2019/title-banner-2.jpg b/static/images/conference/index/2019/title-banner-2.jpg
new file mode 100644
index 000000000..0026a051a
Binary files /dev/null and b/static/images/conference/index/2019/title-banner-2.jpg differ
diff --git a/static/images/conference/index/2019/title-banner-3.jpg b/static/images/conference/index/2019/title-banner-3.jpg
new file mode 100644
index 000000000..1c19318de
Binary files /dev/null and b/static/images/conference/index/2019/title-banner-3.jpg differ
diff --git a/static/images/conference/index/2019/title-banner.jpg b/static/images/conference/index/2019/title-banner.jpg
new file mode 100644
index 000000000..d8519d72a
Binary files /dev/null and b/static/images/conference/index/2019/title-banner.jpg differ
diff --git a/static/svgs/conference/flags/cl.svg b/static/svgs/conference/flags/cl.svg
index 63ee47c09..265de9b29 100644
--- a/static/svgs/conference/flags/cl.svg
+++ b/static/svgs/conference/flags/cl.svg
@@ -1,13 +1 @@
-
+
\ No newline at end of file
diff --git a/static/svgs/conference/flags/eu.svg b/static/svgs/conference/flags/eu.svg
new file mode 100644
index 000000000..8e67cb66e
--- /dev/null
+++ b/static/svgs/conference/flags/eu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/svgs/conference/flags/ke.svg b/static/svgs/conference/flags/ke.svg
new file mode 100644
index 000000000..17fcb99e5
--- /dev/null
+++ b/static/svgs/conference/flags/ke.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/svgs/conference/index/audience-icon-solid.svg b/static/svgs/conference/index/audience-icon-solid.svg
new file mode 100644
index 000000000..d69b0ae62
--- /dev/null
+++ b/static/svgs/conference/index/audience-icon-solid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/svgs/conference/index/calendar-icon-color.svg b/static/svgs/conference/index/calendar-icon-color.svg
new file mode 100644
index 000000000..6b1972f76
--- /dev/null
+++ b/static/svgs/conference/index/calendar-icon-color.svg
@@ -0,0 +1,22 @@
+
+
\ No newline at end of file
diff --git a/static/svgs/conference/index/calendar-icon-solid.svg b/static/svgs/conference/index/calendar-icon-solid.svg
new file mode 100644
index 000000000..07a4b9da4
--- /dev/null
+++ b/static/svgs/conference/index/calendar-icon-solid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/svgs/conference/index/envelope-icon.svg b/static/svgs/conference/index/envelope-icon.svg
new file mode 100644
index 000000000..02c7120e2
--- /dev/null
+++ b/static/svgs/conference/index/envelope-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/svgs/conference/index/hashtag-icon-solid.svg b/static/svgs/conference/index/hashtag-icon-solid.svg
new file mode 100644
index 000000000..3916eb1ad
--- /dev/null
+++ b/static/svgs/conference/index/hashtag-icon-solid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/svgs/conference/index/language-icon-solid.svg b/static/svgs/conference/index/language-icon-solid.svg
new file mode 100644
index 000000000..8b1c84b7b
--- /dev/null
+++ b/static/svgs/conference/index/language-icon-solid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/svgs/conference/index/map-icon-solid.svg b/static/svgs/conference/index/map-icon-solid.svg
new file mode 100644
index 000000000..5fb66f3be
--- /dev/null
+++ b/static/svgs/conference/index/map-icon-solid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file