Merge pull request #2811 from LLK/release/02-28-2019

[Master] Release 02/28/2019
This commit is contained in:
Ray Schamp 2019-02-28 15:26:32 -05:00 committed by GitHub
commit 11ce158f95
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
31 changed files with 1056 additions and 39 deletions

View file

@ -98,7 +98,7 @@
"react-responsive": "3.0.0",
"react-slick": "0.16.0",
"react-string-replace": "0.4.1",
"scratch-gui": "0.1.0-prerelease.20190215143519",
"scratch-gui": "0.1.0-prerelease.20190228140239",
"react-telephone-input": "4.3.4",
"redux": "3.5.2",
"redux-thunk": "2.0.1",

View file

@ -0,0 +1,121 @@
const injectIntl = require('react-intl').injectIntl;
const intlShape = require('react-intl').intlShape;
const FormattedMessage = require('react-intl').FormattedMessage;
const React = require('react');
const FlexRow = require('../../../flex-row/flex-row.jsx');
const FooterBox = require('../../container/footer.jsx');
const LanguageChooser = require('../../../languagechooser/languagechooser.jsx');
require('../footer.scss');
const ConferenceFooter = props => (
<FooterBox>
<FlexRow className="scratch-links">
<div className="family">
<h4><FormattedMessage id="footer.scratchFamily" /></h4>
<FlexRow>
<FlexRow
as="ul"
className="column"
>
<li>
<a href="https://scratch.mit.edu">Scratch</a>
</li>
<li>
<a href="https://www.scratchjr.org/">ScratchJr</a>
</li>
</FlexRow>
<FlexRow
as="ul"
className="column"
>
<li>
<a href="http://www.scratchfoundation.org/">Scratch Foundation</a>
</li>
<li>
<a href="http://scratched.gse.harvard.edu/">ScratchEd</a>
</li>
</FlexRow>
<FlexRow
as="ul"
className="column"
>
<li>
<a href="http://day.scratch.mit.edu">Scratch Day</a>
</li>
<li>
<a href="http://sip.scratch.mit.edu">Scratch In Practice</a>
</li>
</FlexRow>
</FlexRow>
<p className="legal">
<FormattedMessage id="general.copyrightDraft" />
</p>
</div>
<div className="media">
<div className="contact-us">
<h4>
<FormattedMessage id="general.contact" />
</h4>
<p>
<a href="mailto:help@scratch.mit.edu">
<FormattedMessage id="general.emailUs" />
</a>
</p>
</div>
<div className="social">
<FlexRow as="ul">
<li>
<a href="//www.twitter.com/scratch">
<img
alt="scratch twitter"
src="/images/conference/footer/twitter.png"
/>
</a>
</li>
<li>
<a href="//www.facebook.com/scratchteam">
<img
alt="scratch facebook"
src="/images/conference/footer/facebook.png"
/>
</a>
</li>
<li>
<a href="https://medium.com/scratchteam-blog">
<img
alt="scratch foundation blog"
src="/images/conference/footer/medium.png"
/>
</a>
</li>
<li>
<a href="https://www.instagram.com/mitscratchteam/">
<img
alt="scratch instagram"
src="/images/conference/footer/instagram.png"
/>
</a>
</li>
<li>
<a href="https://scratch-foundation.myshopify.com/ ">
<img
alt="scratch shopify"
src="/images/conference/footer/shopify-white.svg"
/>
</a>
</li>
</FlexRow>
</div>
</div>
</FlexRow>
<LanguageChooser locale={props.intl.locale} />
</FooterBox>
);
ConferenceFooter.propTypes = {
intl: intlShape
};
module.exports = injectIntl(ConferenceFooter);

View file

@ -57,7 +57,7 @@
}
.family {
width: $cols8;
width: $cols6;
.flex-row {
justify-content: space-between;
@ -74,7 +74,7 @@
}
.media {
width: $cols3;
width: $cols4;
text-align: center;
.contact-us {

View file

@ -0,0 +1,38 @@
const injectIntl = require('react-intl').injectIntl;
const React = require('react');
const FormattedMessage = require('react-intl').FormattedMessage;
const NavigationBox = require('../../base/navigation.jsx');
require('./navigation.scss');
const Navigation = () => (
<NavigationBox>
<ul className="ul mod-2019">
<li className="li-left mod-logo mod-2019">
<a
className="logo-a"
href="https://scratch.mit.edu"
>
<img
alt="Scratch Logo"
className="logo-a-image"
src="/images/logo_sm.png"
/>
</a>
</li>
<li className="li-left mod-logo mod-2019">
<a
className="logo-a"
href="/conference/2019"
>
<p className="logo-a-title">
<FormattedMessage id="general.conferences" />
</p>
</a>
</li>
</ul>
</NavigationBox>
);
module.exports = injectIntl(Navigation);

View file

@ -0,0 +1,39 @@
@import "../../../../colors";
@import "../../../../frameless";
#navigation {
.ul.2019 {
display: flex;
justify-content: space-between;
flex-flow: row nowrap;
align-items: center;
list-style-type: none;
}
.li-left.2019 {
margin-top: 0;
margin-right: 10px;
color: $type-white;
}
.logo-a {
display: flex;
height: 100%;
align-items: center;
}
.logo-a-image {
margin-right: 10px;
border-right: 2px solid $active-gray;
padding-right: 10px;
width: 80px;
}
.logo-a-title {
text-decoration: none;
white-space: nowrap;
color: $type-white;
font-size: .85rem;
font-weight: bold;
}
}

View file

@ -0,0 +1,27 @@
const PropTypes = require('prop-types');
const React = require('react');
const Navigation = require('../../../navigation/conference/2019/navigation.jsx');
const Footer = require('../../../footer/conference/2019/footer.jsx');
require('../page.scss');
const Page = props => (
<div className="page mod-conference">
<div id="navigation">
<Navigation />
</div>
<div id="view">
{props.children}
</div>
<div id="footer">
<Footer />
</div>
</div>
);
Page.propTypes = {
children: PropTypes.node
};
module.exports = Page;

View file

@ -11,12 +11,17 @@
"general.community": "Community",
"general.confirmEmail": "Confirm Email",
"general.contactUs": "Contact Us",
"general.contact": "Contact",
"general.emailUs": "Email Us",
"general.conferences": "Conferences",
"general.copyright": "Scratch is a project of the Lifelong Kindergarten Group at the MIT Media Lab",
"general.copyrightDraft": "Scratch is a project of the Scratch Foundation in collaboration with the Lifelong Kindergarten Group at the MIT Media Lab.",
"general.country": "Country",
"general.create": "Create",
"general.credits": "Credits",
"general.dmca": "DMCA",
"general.emailAddress": "Email Address",
"general.english": "English",
"general.error": "Oops! Something went wrong",
"general.errorIdentifier": "Your error was logged with id {errorId}",
"general.explore": "Explore",

View file

@ -954,9 +954,8 @@ module.exports.shareProject = (projectId, token) => (dispatch => {
module.exports.reportProject = (id, jsonData, token) => (dispatch => {
dispatch(module.exports.setFetchStatus('report', module.exports.Status.FETCHING));
// scratchr2 will fail if no thumbnail base64 string provided. We don't yet have
// a way to get the actual project thumbnail in www/gui, so for now just submit
// a minimal base64 png string.
// scratchr2 will fail if no thumbnail base64 string provided. If there is not one
// included for any reason, include this minimal blank image.
defaults(jsonData, {
thumbnail: 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC' +
'0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII='

View file

@ -23,15 +23,13 @@
{
"name": "conference-index",
"pattern": "^/conference/?(\\?.*)?$",
"routeAlias": "/conference(?!/201[4-5])",
"view": "conference/2018/index/index",
"title": "Scratch Conference",
"viewportWidth": "device-width"
"routeAlias": "/conference(?!/201[4-9])",
"redirect": "/conference/2019"
},
{
"name": "conference-index-2017",
"pattern": "^/conference/2017/?$",
"routeAlias": "/conference(?!/201[4-5])",
"routeAlias": "/conference(?!/201[4-9])",
"view": "conference/2017/index/index",
"title": "Scratch Conference",
"viewportWidth": "device-width"
@ -39,21 +37,21 @@
{
"name": "conference-details-2018",
"pattern": "^/conference/2018/:id/details/?$",
"routeAlias": "/conference(?!/201[4-5])",
"routeAlias": "/conference(?!/201[4-9])",
"view": "conference/2018/details/details",
"title": "Event Details"
},
{
"name": "conference-expectations-2018",
"pattern": "^/conference/2018/expect/?$",
"routeAlias": "/conference(?!/201[4-5])",
"routeAlias": "/conference(?!/201[4-9])",
"view": "conference/2018/expect/expect",
"title": "What to Expect"
},
{
"name": "conference-index-2018",
"pattern": "^/conference/2018/?$",
"routeAlias": "/conference(?!/201[4-5])",
"routeAlias": "/conference(?!/201[4-9])",
"view": "conference/2018/index/index",
"title": "Scratch Conference",
"viewportWidth": "device-width"
@ -61,17 +59,25 @@
{
"name": "conference-plan-2018",
"pattern": "^/conference/2018/plan/?$",
"routeAlias": "/conference(?!/201[4-5])",
"routeAlias": "/conference(?!/201[4-9])",
"view": "conference/2018/plan/plan",
"title": "Plan Your Visit"
},
{
"name": "conference-schedule-2018",
"pattern": "^/conference/2018/schedule/?$",
"routeAlias": "/conference(?!/201[4-5])",
"routeAlias": "/conference(?!/201[4-9])",
"view": "conference/2018/schedule/schedule",
"title": "Conference Schedule"
},
{
"name": "conference-index-2019",
"pattern": "^/conference/2019/?$",
"routeAlias": "/conference(?!/201[4-9])",
"view": "conference/2019/index/index",
"title": "Scratch Conferences",
"viewportWidth": "device-width"
},
{
"name": "connect",
"pattern": "^/connect/?$",

View file

@ -0,0 +1,359 @@
const FormattedDate = require('react-intl').FormattedDate;
const FormattedMessage = require('react-intl').FormattedMessage;
const React = require('react');
const render = require('../../../../lib/render.jsx');
const FlexRow = require('../../../../components/flex-row/flex-row.jsx');
const Page = require('../../../../components/page/conference/2019/page.jsx');
const TitleBanner = require('../../../../components/title-banner/title-banner.jsx');
require('../../../../components/forms/button.scss');
require('./index.scss');
const ConferenceSplash = () => (
<div className="index mod-2019">
<TitleBanner className="mod-conference mod-2019">
<div>
<h1 className="title-banner-h1 mod-2019">
<FormattedMessage id="conference-2019.title" />
</h1>
<div className="title-banner-image mod-2019" />
</div>
</TitleBanner>
<div className="conf2019-description conf2019-band">
<h3 className="conf2019-description title-banner-h3 mod-2019">
<FormattedMessage id="conference-2019.descA" />
</h3>
<h3 className="conf2019-description title-banner-h3 mod-2019">
<FormattedMessage id="conference-2019.descB" />
</h3>
<h3 className="conf2019-description title-banner-h3 mod-2019">
<FormattedMessage id="conference-2019.descC" />
</h3>
<h3 className="conf2019-description title-banner-h3 mod-2019">
<FormattedMessage id="conference-2019.descD" />
</h3>
</div>
<div className="conf2019-title-band conf2019-schedule-band">
<img
alt="Envelope Icon"
className="conf2019-large-icon-image"
src="/svgs/conference/index/calendar-icon-color.svg"
/>
<h3 className="conf2019-title-band">
<FormattedMessage id="conference-2019.seeBelow" />
</h3>
</div>
<div className="inner">
<section className="conf2019-panel mod-chile">
<FlexRow className="conf2019-panel-title">
<img
alt="Chile Flag"
className="conf2019-panel-flag"
src="/svgs/conference/flags/cl.svg"
/>
<div className="conf2019-panel-title-text">
<h3>Conferencia Scratch al Sur</h3>
</div>
</FlexRow>
<p className="conf2019-panel-desc">
<FormattedMessage id="conference-2019.chileDesc" />
</p>
<table className="conf2019-panel-details">
<tbody>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Calendar Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/calendar-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.date" /></td>
<td>
<FormattedDate
day="2-digit"
month="long"
value={new Date(2019, 4, 30)}
year="numeric"
/>
{' - '}
<FormattedDate
day="2-digit"
month="long"
value={new Date(2019, 4, 31)}
year="numeric"
/>
</td>
</tr>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Map Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/map-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.location" /></td>
<td>{'Santiago, Chile'}</td>
</tr>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Audience Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/audience-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.audience" /></td>
<td><FormattedMessage id="conference-2019.chileAudience" /></td>
</tr>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Language Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/language-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.language" /></td>
<td><FormattedMessage id="conference-2019.spanishWithSimultaneous" /></td>
</tr>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Language Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/hashtag-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.hashtag" /></td>
<td>{'#ScratchalSur'}</td>
</tr>
</tbody>
</table>
<a
className="button mod-2019-conf mod-2019-conf-website-button"
href="http://www.scratchalsur.org"
rel="noopener noreferrer"
target="_blank"
>
<FormattedMessage id="conference-2019.website" />
</a>
</section>
<section className="conf2019-panel mod-kenya">
<FlexRow className="conf2019-panel-title">
<img
alt="Kenya Flag"
className="conf2019-panel-flag"
src="/svgs/conference/flags/ke.svg"
/>
<div className="conf2019-panel-title-text">
<h3><FormattedMessage id="conference-2019.kenyaTitle" /></h3>
<h4><FormattedMessage id="conference-2019.kenyaSubTitle" /></h4>
</div>
</FlexRow>
<p className="conf2019-panel-desc">
<FormattedMessage id="conference-2019.kenyaDesc" />
</p>
<table className="conf2019-panel-details">
<tbody>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Calendar Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/calendar-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.date" /></td>
<td>
<FormattedDate
day="2-digit"
month="long"
value={new Date(2019, 6, 8)}
year="numeric"
/>
{' - '}
<FormattedDate
day="2-digit"
month="long"
value={new Date(2019, 6, 13)}
year="numeric"
/>
</td>
</tr>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Map Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/map-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.location" /></td>
<td>{'Nairobi, Kenya'}</td>
</tr>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Audience Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/audience-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.audience" /></td>
<td><FormattedMessage id="conference-2019.kenyaAudience" /></td>
</tr>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Language Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/language-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.language" /></td>
<td><FormattedMessage id="general.english" /></td>
</tr>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Language Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/hashtag-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.hashtag" /></td>
<td>{'#Scratch2019AFR'}</td>
</tr>
</tbody>
</table>
<a
className="button mod-2019-conf mod-2019-conf-website-button"
href="https://www.scratchafrica.com"
rel="noopener noreferrer"
target="_blank"
>
<FormattedMessage id="conference-2019.website" />
</a>
</section>
<section className="conf2019-panel mod-uk mod-last">
<FlexRow className="conf2019-panel-title">
<img
alt="EU Flag"
className="conf2019-panel-flag"
src="/svgs/conference/flags/eu.svg"
/>
<div className="conf2019-panel-title-text">
<h3><FormattedMessage id="conference-2019.ukTitle" /></h3>
</div>
</FlexRow>
<p className="conf2019-panel-desc">
<FormattedMessage id="conference-2019.ukDesc" />
</p>
<table className="conf2019-panel-details">
<tbody>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Calendar Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/calendar-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.date" /></td>
<td>
<FormattedDate
day="2-digit"
month="long"
value={new Date(2019, 7, 23)}
year="numeric"
/>
{' - '}
<FormattedDate
day="2-digit"
month="long"
value={new Date(2019, 7, 25)}
year="numeric"
/>
</td>
</tr>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Map Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/map-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.location" /></td>
<td>{'Cambridge, United Kingdom'}</td>
</tr>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Audience Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/audience-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.audience" /></td>
<td><FormattedMessage id="conference-2019.ukAudience" /></td>
</tr>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Language Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/language-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.language" /></td>
<td><FormattedMessage id="general.english" /></td>
</tr>
<tr className="conf2019-panel-row">
<td className="conf2019-panel-row-icon">
<img
alt="Language Icon"
className="conf2019-panel-row-icon-image"
src="/svgs/conference/index/hashtag-icon-solid.svg"
/>
</td>
<td><FormattedMessage id="conference-2019.hashtag" /></td>
<td>{'#ScratchEurope'}</td>
</tr>
</tbody>
</table>
<a
className="button mod-2019-conf mod-2019-conf-website-button"
href="https://www.raspberrypi.org/blog/announcing-scratch-conference-europe-2019/"
rel="noopener noreferrer"
target="_blank"
>
<FormattedMessage id="conference-2019.website" />
</a>
</section>
</div>
<div className="conf2019-title-band conf2019-mailing-list">
<img
alt="Envelope Icon"
className="conf2019-large-icon-image"
src="/svgs/conference/index/envelope-icon.svg"
/>
<h3 className="conf2019-mailing-list">
<FormattedMessage id="conference-2019.joinMailingList" />
</h3>
<a
className="button mod-2019-conf mod-2019-conf-maillist-button"
href="https://us9.list-manage.com/subscribe?u=96e741c12c99f46f1f3e95e09&id=149bd1a4c2"
rel="noopener noreferrer"
target="_blank"
>
<FormattedMessage id="conference-2019.joinMailingListButtonText" />
</a>
</div>
</div>
);
render(<Page><ConferenceSplash /></Page>, document.getElementById('app'));

View file

@ -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;
}
}

View file

@ -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 2020s 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"
}

View file

@ -147,7 +147,14 @@ const Faq = injectIntl(props => (
/>
</dd>
<dt><FormattedMessage id="faq.removedBlocksScratch3Title" /></dt>
<dd><FormattedMessage id="faq.removedBlocksScratch3Body" /></dd>
<dd>
<FormattedMessage
id="faq.removedBlocksScratch3Body"
values={{extensionsFAQLink: (
<a href="#scratch-extensions"><FormattedMessage id="faq.scratchExtensionsTitle" /></a>
)}}
/>
</dd>
<dt><FormattedMessage id="faq.newBlocksScratch3Title" /></dt>
<dd><FormattedMessage id="faq.newBlocksScratch3Body" /></dd>
<ul>

View file

@ -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 youll find:",
"faq.newBlocksSoundEffect":"New \"sound effect\" blocks",

View file

@ -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,

View file

@ -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}

View file

@ -11,7 +11,7 @@ const Privacypolicy = () => (
<section>
<p className="lastupdate">
<i>
The Scratch Privacy Policy was last updated: May 23, 2018
The Scratch Privacy Policy was last updated: February 14, 2019
</i>
</p>
<p className="intro">
@ -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.
</p>
</section>
<section id="changes">

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 789 KiB

View file

@ -1,13 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="480" width="640" viewBox="0 0 640 480">
<defs>
<clipPath id="a">
<path fill-opacity=".67" d="M0 0h682.67v512H0z"/>
</clipPath>
</defs>
<g fill-rule="evenodd" clip-path="url(#a)" transform="scale(.9375)" fill-opacity=".996">
<path fill="#fff" d="M255.99 0H768v256H255.99z"/>
<path fill="#0039a6" d="M0 0h256v256H0z"/>
<path d="M167.82 191.71l-39.653-29.737-39.458 30.03 14.674-48.8-39.386-30.133 48.728-.42L127.84 64l15.437 48.537 48.728.064-39.184 30.418 15 48.69z" fill="#fff"/>
<path fill="#d52b1e" d="M0 256h768v256H0z"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" height="480" width="640"><defs><clipPath id="a"><path fill-opacity=".67" d="M0 0h682.67v512H0z"/></clipPath></defs><g fill-rule="evenodd" clip-path="url(#a)" transform="scale(.9375)" fill-opacity=".996"><path fill="#fff" d="M255.99 0H768v256H255.99z"/><path fill="#0039a6" d="M0 0h256v256H0z"/><path d="M167.82 191.71l-39.653-29.737-39.458 30.03 14.674-48.8-39.386-30.133 48.728-.42L127.84 64l15.437 48.537 48.728.064-39.184 30.418 15 48.69z" fill="#fff"/><path fill="#d52b1e" d="M0 256h768v256H0z"/></g></svg>

Before

Width:  |  Height:  |  Size: 623 B

After

Width:  |  Height:  |  Size: 550 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="810" height="540"><defs><g id="d"><g id="b"><path id="a" d="M0 0v1h.5z" transform="rotate(18 3.157 -.5)"/><use xlink:href="#a" transform="scale(-1 1)"/></g><g id="c"><use xlink:href="#b" transform="rotate(72)"/><use xlink:href="#b" transform="rotate(144)"/></g><use xlink:href="#c" transform="scale(-1 1)"/></g></defs><path fill="#039" d="M0 0h810v540H0z"/><g fill="#fc0" transform="matrix(30 0 0 30 405 270)"><use xlink:href="#d" y="-6"/><use xlink:href="#d" y="6"/><g id="e"><use xlink:href="#d" x="-6"/><use xlink:href="#d" transform="rotate(-144 -2.344 -2.11)"/><use xlink:href="#d" transform="rotate(144 -2.11 -2.344)"/><use xlink:href="#d" transform="rotate(72 -4.663 -2.076)"/><use xlink:href="#d" transform="rotate(72 -5.076 .534)"/></g><use xlink:href="#e" transform="scale(-1 1)"/></g></svg>

After

Width:  |  Height:  |  Size: 891 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="900" height="600"><defs><path id="a" d="M-1 55.426h2V-38c2-2 2-5 2-8 0-2 0-10-3-18.663C-3-56-3-48-3-46c0 3 0 6 2 8z" stroke-miterlimit="10" transform="rotate(30)"/></defs><path fill="#fff" d="M0 0h900v600H0z"/><path d="M0 0h900v180H0z"/><path fill="#b00" d="M0 210h900v180H0z"/><path fill="#060" d="M0 420h900v180H0z"/><g transform="matrix(3.75 0 0 3.75 450 300)"><g id="b"><use xlink:href="#a"/><use xlink:href="#a" fill="#fff"/></g><use xlink:href="#b" transform="scale(-1 1)"/><path d="M-19 24c3 8 13 24 19 24s16-16 19-24v-48C16-32 6-48 0-48s-16 16-19 24z" fill="#b00"/><path id="c" d="M19 24c3-8 5-16 5-24s-2-16-5-24c-3 8-5 16-5 24s2 16 5 24z"/><use xlink:href="#c" transform="scale(-1 1)"/><g fill="#fff"><ellipse rx="4" ry="6"/><path id="d" d="M1 5.85s4 8 4 21-4 21-4 21z"/><use xlink:href="#d" transform="scale(-1)"/><use xlink:href="#d" transform="scale(-1 1)"/><use xlink:href="#d" transform="scale(1 -1)"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1,020 B

View file

@ -0,0 +1 @@
<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path d="M6.403 11.673C7.312 10.715 8.588 10 10 10s2.688.715 3.597 1.673c.63-.91 1.695-1.673 2.903-1.673 1.933 0 3.5 1.953 3.5 3.333C20 14.714 18.433 15 16.5 15c-.542 0-1.055-.022-1.513-.085C14.801 16.635 12.639 17 10 17c-2.639 0-4.8-.366-4.987-2.085-.458.063-.971.085-1.513.085-1.933 0-3.5-.286-3.5-1.667C0 11.953 1.567 10 3.5 10c1.208 0 2.274.763 2.903 1.673zM3.66 9a2 2 0 1 1 0-4 2 2 0 0 1 0 4zm13 0a2 2 0 1 1 0-4 2 2 0 0 1 0 4zM10 9a3 3 0 1 1 0-6 3 3 0 0 1 0 6z" id="a"/></defs><g fill="none" fill-rule="evenodd"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><use fill="#575E75" xlink:href="#a"/><g mask="url(#b)" fill="#4D97FF"><path d="M0 0h20v20H0z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 792 B

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="62px" height="56px" viewBox="0 0 62 56" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->
<title>Calendar</title>
<desc>Created with Sketch.</desc>
<defs>
<rect id="path-1" x="0" y="0" width="54" height="48" rx="8"></rect>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Artboard-Copy-7" transform="translate(-688.000000, -721.000000)">
<g id="Calendar" transform="translate(692.000000, 725.000000)">
<path d="M8,0 C3.581722,8.8817842e-16 -4.4408921e-16,3.581722 0,8 L0,40 C8.8817842e-16,44.418278 3.581722,48 8,48 L46,48 C50.418278,48 54,44.418278 54,40 L54,8 C54,3.581722 50.418278,-8.8817842e-16 46,0 L8,0 Z M8,-4 L46,-4 C52.627417,-4 58,1.372583 58,8 L58,40 C58,46.627417 52.627417,52 46,52 L8,52 C1.372583,52 -4,46.627417 -4,40 L-4,8 C-4,1.372583 1.372583,-4 8,-4 Z" id="Background" fill-opacity="0.5" fill="#4280D7" fill-rule="nonzero"></path>
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Mask" fill="#FFFFFF" xlink:href="#path-1"></use>
<path d="M18.3392857,32.62 L35.1785714,32.62 L35.1785714,17.74 L36.1785714,17.74 L36.1785714,32.62 L54.5,32.62 L54.5,33.62 L36.1785714,33.62 L36.1785714,48.5 L35.1785714,48.5 L35.1785714,33.62 L18.3392857,33.62 L18.3392857,48.5 L17.3392857,48.5 L17.3392857,33.62 L-0.5,33.62 L-0.5,32.62 L17.3392857,32.62 L17.3392857,17.74 L18.3392857,17.74 L18.3392857,32.62 Z" id="Combined-Shape" fill="#D9D9D9" fill-rule="nonzero" mask="url(#mask-2)"></path>
<path d="M8,0 L46,0 C50.418278,-8.11624501e-16 54,3.581722 54,8 L54,18.24 L0,18.24 L0,8 C-5.41083001e-16,3.581722 3.581722,8.11624501e-16 8,0 Z" id="Top-part" fill="#FF8000"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2 KiB

View file

@ -0,0 +1 @@
<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path d="M16 2a3 3 0 0 1 3 3v11a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3v1a2 2 0 1 0 4 0V2h4v1a2 2 0 1 0 4 0V2zM3 8v7.6a1.5 1.5 0 0 0 1.5 1.5h11a1.5 1.5 0 0 0 1.5-1.5V8H3zm3-7a1 1 0 0 1 1 1v1a1 1 0 1 1-2 0V2a1 1 0 0 1 1-1zm8 0a1 1 0 0 1 1 1v1a1 1 0 0 1-2 0V2a1 1 0 0 1 1-1z" id="a"/></defs><g fill="none" fill-rule="evenodd"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><use fill="#575E75" fill-rule="nonzero" xlink:href="#a"/><g mask="url(#b)" fill="#4D97FF"><path d="M0 0h20v20H0z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 625 B

View file

@ -0,0 +1 @@
<svg width="107" height="50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><rect id="a" x="24" width="56" height="40" rx="8"/><filter x="-13.4%" y="-18.8%" width="126.8%" height="137.5%" filterUnits="objectBoundingBox" id="b"><feMorphology radius="2.5" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"/><feOffset in="shadowSpreadOuter1" result="shadowOffsetOuter1"/><feColorMatrix values="0 0 0 0 0.258823529 0 0 0 0 0.501960784 0 0 0 0 0.843137255 0 0 0 0.5 0" in="shadowOffsetOuter1"/></filter></defs><g transform="translate(2 5)" fill="none" fill-rule="evenodd"><mask id="c" fill="#fff"><use xlink:href="#a"/></mask><use fill="#000" filter="url(#b)" xlink:href="#a"/><use fill="#FFF" xlink:href="#a"/><path d="M22.207 7.212l24.762 19.102a8 8 0 0 0 9.778-.004L81.462 7.212V6.123a8 8 0 0 0-8-8H30.207a8 8 0 0 0-8 8v1.09z" fill-opacity=".55" fill="#4D97FF" mask="url(#c)"/><g stroke="#FFBF00" stroke-linecap="round" stroke-width="4"><path d="M11.664 14L.334 10M11.667 23.5H.333M12 33L0 37"/></g><g stroke="#FFBF00" stroke-linecap="round" stroke-width="4"><path d="M91.336 14l11.33-4M91.333 23.5h11.334M91 33l11.667 4"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1 @@
<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path d="M8.3 11.5h2.97l.43-3H8.73l-.43 3zm-.428 3l-.387 2.712a1.5 1.5 0 0 1-2.97-.424l.327-2.288H3a1.5 1.5 0 0 1 0-3h2.27l.43-3H3a1.5 1.5 0 0 1 0-3h3.128l.387-2.712a1.5 1.5 0 1 1 2.97.424L9.158 5.5h2.97l.387-2.712a1.5 1.5 0 1 1 2.97.424L15.158 5.5H17a1.5 1.5 0 0 1 0 3h-2.27l-.43 3H17a1.5 1.5 0 0 1 0 3h-3.128l-.387 2.712a1.5 1.5 0 1 1-2.97-.424l.327-2.288h-2.97z" id="a"/></defs><g fill="none" fill-rule="evenodd"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><use fill="#575E75" fill-rule="nonzero" xlink:href="#a"/><g mask="url(#b)" fill="#4D97FF"><path d="M0 0h20v20H0z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 711 B

View file

@ -0,0 +1 @@
<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path d="M9 16c-1 1-3.5 2.5-4 2s0-1 0-2H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H9zm-3-6a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2H6zm0-4a1 1 0 1 0 0 2h8a1 1 0 0 0 0-2H6z" id="a"/></defs><g fill="none" fill-rule="evenodd"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><use fill="#575E75" xlink:href="#a"/><g mask="url(#b)" fill="#4D97FF"><path d="M0 0h20v20H0z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 510 B

View file

@ -0,0 +1 @@
<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path d="M15.303 3.184a7.425 7.425 0 0 1 0 10.544l-3.893 3.87a2 2 0 0 1-2.82 0l-3.893-3.87a7.425 7.425 0 0 1 0-10.544c2.929-2.912 7.677-2.912 10.606 0zM10 12.5a4 4 0 1 0 0-8 4 4 0 0 0 0 8z" id="a"/></defs><g fill="none" fill-rule="evenodd"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><use fill="#575E75" xlink:href="#a"/><g mask="url(#b)" fill="#4D97FF"><path d="M0 0h20v20H0z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 515 B