mirror of
https://github.com/scratchfoundation/scratch-www.git
synced 2024-11-22 23:27:54 -05:00
Merge pull request #3370 from LLK/develop
Update release branch to include develop
This commit is contained in:
commit
de546a2056
23 changed files with 113 additions and 79 deletions
12
package-lock.json
generated
12
package-lock.json
generated
|
@ -15561,15 +15561,15 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scratch-gui": {
|
"scratch-gui": {
|
||||||
"version": "0.1.0-prerelease.20190912180550",
|
"version": "0.1.0-prerelease.20190918163722",
|
||||||
"resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20190912180550.tgz",
|
"resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20190918163722.tgz",
|
||||||
"integrity": "sha512-FPOuX1Za4vNAhOJfViEigGJ5t+dWzebgrUQWAvJDwrkhfKKHD2VE9vtaGH6H+6NNZIdW+2qcSqBPxutevdHlyA==",
|
"integrity": "sha512-2BM65eEvknpgrlkZgYP31H4v4rUsYuacY2NBBLwZ+zBScIsYMrfuxr2zPtvtxOkjYf9yH6TJef8/i/YZmPtfhw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"scratch-l10n": {
|
"scratch-l10n": {
|
||||||
"version": "3.5.20190910223701",
|
"version": "3.5.20190917223712",
|
||||||
"resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.5.20190910223701.tgz",
|
"resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.5.20190917223712.tgz",
|
||||||
"integrity": "sha512-WArZ1OZZz8KcTyEHcUnRJJE6gyh3CDcZ3KYxK8TNoHqzdLi+Gl/1QR/Xs+rJ1U587hnI2JLRfhFfvVPwsdmZag==",
|
"integrity": "sha512-kWkeUD5An4RwbAVZU7OUqS25D1rrdI73ZYhNn3tQhGu545JaITZf37AvVQW4DyZU+wFHQ1G30nWls7bXZLEPbA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/cli": "^7.1.2",
|
"@babel/cli": "^7.1.2",
|
||||||
|
|
|
@ -126,7 +126,7 @@
|
||||||
"redux-mock-store": "^1.2.3",
|
"redux-mock-store": "^1.2.3",
|
||||||
"redux-thunk": "2.0.1",
|
"redux-thunk": "2.0.1",
|
||||||
"sass-loader": "6.0.6",
|
"sass-loader": "6.0.6",
|
||||||
"scratch-gui": "0.1.0-prerelease.20190912180550",
|
"scratch-gui": "0.1.0-prerelease.20190918163722",
|
||||||
"scratch-l10n": "latest",
|
"scratch-l10n": "latest",
|
||||||
"selenium-webdriver": "3.6.0",
|
"selenium-webdriver": "3.6.0",
|
||||||
"slick-carousel": "1.6.0",
|
"slick-carousel": "1.6.0",
|
||||||
|
|
|
@ -56,6 +56,7 @@ $transparent-light-blue: rgba(229, 240, 254, 0);
|
||||||
$header-gray: hsla(225, 15, 40, 1); //#575E75
|
$header-gray: hsla(225, 15, 40, 1); //#575E75
|
||||||
$type-gray: hsla(225, 15, 40, 1); //#575E75
|
$type-gray: hsla(225, 15, 40, 1); //#575E75
|
||||||
$type-gray-75percent: hsla(225, 15, 40, .75);
|
$type-gray-75percent: hsla(225, 15, 40, .75);
|
||||||
|
$type-gray-60percent: hsla(225, 15, 40, .6);
|
||||||
$type-white: hsla(0, 100, 100, 1); //#FFF
|
$type-white: hsla(0, 100, 100, 1); //#FFF
|
||||||
|
|
||||||
$link-blue: $ui-blue;
|
$link-blue: $ui-blue;
|
||||||
|
|
|
@ -103,9 +103,6 @@ const ConferenceFooter = () => (
|
||||||
</li>
|
</li>
|
||||||
</FlexRow>
|
</FlexRow>
|
||||||
</FlexRow>
|
</FlexRow>
|
||||||
<p className="legal">
|
|
||||||
Scratch is a project of the Lifelong Kindergarten Group at the MIT Media Lab.
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="media">
|
<div className="media">
|
||||||
<div className="contact-us">
|
<div className="contact-us">
|
||||||
|
|
|
@ -46,9 +46,6 @@ const ConferenceFooter = props => (
|
||||||
</li>
|
</li>
|
||||||
</FlexRow>
|
</FlexRow>
|
||||||
</FlexRow>
|
</FlexRow>
|
||||||
<p className="legal">
|
|
||||||
<FormattedMessage id="general.copyright" />
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="media">
|
<div className="media">
|
||||||
<div className="contact-us">
|
<div className="contact-us">
|
||||||
|
|
|
@ -145,9 +145,6 @@ const ConferenceFooter = props => (
|
||||||
</li>
|
</li>
|
||||||
</FlexRow>
|
</FlexRow>
|
||||||
</FlexRow>
|
</FlexRow>
|
||||||
<p className="legal">
|
|
||||||
<FormattedMessage id="general.copyright" />
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="media">
|
<div className="media">
|
||||||
<div className="contact-us">
|
<div className="contact-us">
|
||||||
|
|
|
@ -49,9 +49,6 @@ const ConferenceFooter = props => (
|
||||||
</li>
|
</li>
|
||||||
</FlexRow>
|
</FlexRow>
|
||||||
</FlexRow>
|
</FlexRow>
|
||||||
<p className="legal">
|
|
||||||
<FormattedMessage id="general.copyrightDraft" />
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="media">
|
<div className="media">
|
||||||
<div className="contact-us">
|
<div className="contact-us">
|
||||||
|
|
|
@ -209,12 +209,6 @@ const Footer = props => (
|
||||||
</div>
|
</div>
|
||||||
</MediaQuery>
|
</MediaQuery>
|
||||||
<LanguageChooser locale={props.intl.locale} />
|
<LanguageChooser locale={props.intl.locale} />
|
||||||
|
|
||||||
<div className="copyright">
|
|
||||||
<p>
|
|
||||||
<FormattedMessage id="general.copyright" />
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</FooterBox>
|
</FooterBox>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ const FormikInput = ({
|
||||||
>
|
>
|
||||||
<Field
|
<Field
|
||||||
className={classNames(
|
className={classNames(
|
||||||
'input',
|
'formik-input',
|
||||||
{fail: error},
|
{fail: error},
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
@import "../../colors";
|
@import "../../colors";
|
||||||
|
|
||||||
.input {
|
.formik-input {
|
||||||
height: 2.75rem;
|
height: 2.75rem;
|
||||||
border-radius: .5rem;
|
border-radius: .5rem;
|
||||||
background-color: $ui-white;
|
background-color: $ui-white;
|
||||||
margin-bottom: .5rem;
|
margin-bottom: .5rem;
|
||||||
transition: all .5s ease, font-size 0s;
|
transition: all .5s ease, font-size 0s;
|
||||||
border: 1px solid $active-gray;
|
border: 1px solid $active-dark-gray;
|
||||||
padding: 0 1rem;
|
padding: 0 1rem;
|
||||||
color: $type-gray;
|
color: $type-gray;
|
||||||
font-size: .875rem;
|
font-size: .875rem;
|
||||||
|
@ -29,6 +29,6 @@
|
||||||
|
|
||||||
&::placeholder {
|
&::placeholder {
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
color: $type-gray-75percent;
|
color: $type-gray-60percent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,10 +8,10 @@
|
||||||
height: 1rem;
|
height: 1rem;
|
||||||
margin-left: .375rem;
|
margin-left: .375rem;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background-color: $ui-blue;
|
background-color: $type-gray-60percent;
|
||||||
background-image: url("/svgs/info-button/info-button.svg");
|
background-image: url("/svgs/info-button/info-button.svg");
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
top: .125rem;
|
top: .1875rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-button-message {
|
.info-button-message {
|
||||||
|
@ -26,6 +26,7 @@
|
||||||
margin-left: $arrow-border-width;
|
margin-left: $arrow-border-width;
|
||||||
border: 1px solid $active-gray;
|
border: 1px solid $active-gray;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
|
box-shadow: 0 0 4px 2px rgba(0, 0, 0, .15);
|
||||||
padding: .75rem;
|
padding: .75rem;
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
background-color: $ui-blue;
|
background-color: $ui-blue;
|
||||||
|
@ -33,6 +34,7 @@
|
||||||
line-height: 1.25rem;
|
line-height: 1.25rem;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font-size: .875rem;
|
font-size: .875rem;
|
||||||
|
font-weight: 500;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
|
|
||||||
&:before {
|
&:before {
|
||||||
|
|
|
@ -4,14 +4,16 @@ const React = require('react');
|
||||||
const PropTypes = require('prop-types');
|
const PropTypes = require('prop-types');
|
||||||
import {Formik} from 'formik';
|
import {Formik} from 'formik';
|
||||||
const {injectIntl, intlShape} = require('react-intl');
|
const {injectIntl, intlShape} = require('react-intl');
|
||||||
|
const FormattedMessage = require('react-intl').FormattedMessage;
|
||||||
|
|
||||||
const FormikSelect = require('../../components/formik-forms/formik-select.jsx');
|
const FormikSelect = require('../../components/formik-forms/formik-select.jsx');
|
||||||
const JoinFlowStep = require('./join-flow-step.jsx');
|
const JoinFlowStep = require('./join-flow-step.jsx');
|
||||||
|
const InfoButton = require('../info-button/info-button.jsx');
|
||||||
|
|
||||||
require('./join-flow-steps.scss');
|
require('./join-flow-steps.scss');
|
||||||
|
|
||||||
const getBirthMonthOptions = intl => ([
|
const getBirthMonthOptions = intl => ([
|
||||||
{value: 'null', label: intl.formatMessage({id: 'general.month'})},
|
{value: 'null', label: intl.formatMessage({id: 'general.month'}), disabled: true},
|
||||||
{value: '1', label: intl.formatMessage({id: 'general.monthJanuary'})},
|
{value: '1', label: intl.formatMessage({id: 'general.monthJanuary'})},
|
||||||
{value: '2', label: intl.formatMessage({id: 'general.monthFebruary'})},
|
{value: '2', label: intl.formatMessage({id: 'general.monthFebruary'})},
|
||||||
{value: '3', label: intl.formatMessage({id: 'general.monthMarch'})},
|
{value: '3', label: intl.formatMessage({id: 'general.monthMarch'})},
|
||||||
|
@ -35,7 +37,8 @@ const getBirthYearOptions = intl => {
|
||||||
.map((defaultVal, i) => (
|
.map((defaultVal, i) => (
|
||||||
{value: String(curYear - i), label: String(curYear - i)}
|
{value: String(curYear - i), label: String(curYear - i)}
|
||||||
));
|
));
|
||||||
birthYearOptions.unshift({
|
birthYearOptions.unshift({ // set placeholder as first option
|
||||||
|
disabled: true,
|
||||||
value: 'null',
|
value: 'null',
|
||||||
label: intl.formatMessage({id: 'general.year'})
|
label: intl.formatMessage({id: 'general.year'})
|
||||||
});
|
});
|
||||||
|
@ -86,12 +89,10 @@ class BirthDateStep extends React.Component {
|
||||||
} = props;
|
} = props;
|
||||||
return (
|
return (
|
||||||
<JoinFlowStep
|
<JoinFlowStep
|
||||||
description={this.props.intl.formatMessage({id: 'registration.private'})}
|
|
||||||
descriptionClassName="join-flow-birthdate-description"
|
|
||||||
headerImgSrc="/images/join-flow/birthdate-header.png"
|
headerImgSrc="/images/join-flow/birthdate-header.png"
|
||||||
infoMessage={this.props.intl.formatMessage({id: 'registration.birthDateStepInfo'})}
|
|
||||||
innerClassName="join-flow-inner-birthdate-step"
|
innerClassName="join-flow-inner-birthdate-step"
|
||||||
title={this.props.intl.formatMessage({id: 'registration.birthDateStepTitle'})}
|
title={this.props.intl.formatMessage({id: 'registration.birthDateStepTitle'})}
|
||||||
|
titleClassName="join-flow-birthdate-title"
|
||||||
waiting={isSubmitting}
|
waiting={isSubmitting}
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
>
|
>
|
||||||
|
@ -133,6 +134,12 @@ class BirthDateStep extends React.Component {
|
||||||
validationClassName="validation-birthdate-year"
|
validationClassName="validation-birthdate-year"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="join-flow-privacy-message">
|
||||||
|
<FormattedMessage id="registration.private" />
|
||||||
|
<InfoButton
|
||||||
|
message={this.props.intl.formatMessage({id: 'registration.birthDateStepInfo'})}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</JoinFlowStep>
|
</JoinFlowStep>
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -28,7 +28,7 @@ class CountryStep extends React.Component {
|
||||||
setCountryOptions () {
|
setCountryOptions () {
|
||||||
if (this.countryOptions.length === 0) {
|
if (this.countryOptions.length === 0) {
|
||||||
this.countryOptions = [...countryData.registrationCountryOptions];
|
this.countryOptions = [...countryData.registrationCountryOptions];
|
||||||
this.countryOptions.unshift({
|
this.countryOptions.unshift({ // add placeholder as first option
|
||||||
disabled: true,
|
disabled: true,
|
||||||
label: this.props.intl.formatMessage({id: 'general.country'}),
|
label: this.props.intl.formatMessage({id: 'general.country'}),
|
||||||
value: 'null'
|
value: 'null'
|
||||||
|
@ -68,11 +68,10 @@ class CountryStep extends React.Component {
|
||||||
} = props;
|
} = props;
|
||||||
return (
|
return (
|
||||||
<JoinFlowStep
|
<JoinFlowStep
|
||||||
description={this.props.intl.formatMessage({id: 'registration.countryStepDescription'})}
|
|
||||||
descriptionClassName="join-flow-country-description"
|
|
||||||
headerImgSrc="/images/join-flow/country-header.png"
|
headerImgSrc="/images/join-flow/country-header.png"
|
||||||
innerClassName="join-flow-inner-country-step"
|
innerClassName="join-flow-inner-country-step"
|
||||||
title={this.props.intl.formatMessage({id: 'registration.countryStepTitle'})}
|
title={this.props.intl.formatMessage({id: 'registration.countryStepTitle'})}
|
||||||
|
titleClassName="join-flow-country-title"
|
||||||
waiting={isSubmitting}
|
waiting={isSubmitting}
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
>
|
>
|
||||||
|
|
|
@ -10,6 +10,7 @@ const validate = require('../../lib/validate');
|
||||||
const JoinFlowStep = require('./join-flow-step.jsx');
|
const JoinFlowStep = require('./join-flow-step.jsx');
|
||||||
const FormikInput = require('../../components/formik-forms/formik-input.jsx');
|
const FormikInput = require('../../components/formik-forms/formik-input.jsx');
|
||||||
const FormikCheckbox = require('../../components/formik-forms/formik-checkbox.jsx');
|
const FormikCheckbox = require('../../components/formik-forms/formik-checkbox.jsx');
|
||||||
|
const InfoButton = require('../info-button/info-button.jsx');
|
||||||
|
|
||||||
require('./join-flow-steps.scss');
|
require('./join-flow-steps.scss');
|
||||||
|
|
||||||
|
@ -130,7 +131,6 @@ class EmailStep extends React.Component {
|
||||||
} = props;
|
} = props;
|
||||||
return (
|
return (
|
||||||
<JoinFlowStep
|
<JoinFlowStep
|
||||||
description={this.props.intl.formatMessage({id: 'registration.emailStepDescription'})}
|
|
||||||
footerContent={(
|
footerContent={(
|
||||||
<FormattedMessage
|
<FormattedMessage
|
||||||
id="registration.acceptTermsOfUse"
|
id="registration.acceptTermsOfUse"
|
||||||
|
@ -151,6 +151,7 @@ class EmailStep extends React.Component {
|
||||||
innerClassName="join-flow-inner-email-step"
|
innerClassName="join-flow-inner-email-step"
|
||||||
nextButton={this.props.intl.formatMessage({id: 'registration.createAccount'})}
|
nextButton={this.props.intl.formatMessage({id: 'registration.createAccount'})}
|
||||||
title={this.props.intl.formatMessage({id: 'registration.emailStepTitle'})}
|
title={this.props.intl.formatMessage({id: 'registration.emailStepTitle'})}
|
||||||
|
titleClassName="join-flow-email-title"
|
||||||
waiting={this.props.waiting || isSubmitting || this.state.captchaIsLoading}
|
waiting={this.props.waiting || isSubmitting || this.state.captchaIsLoading}
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
>
|
>
|
||||||
|
@ -176,6 +177,12 @@ class EmailStep extends React.Component {
|
||||||
/* eslint-enable react/jsx-no-bind */
|
/* eslint-enable react/jsx-no-bind */
|
||||||
onSetRef={this.handleSetEmailRef}
|
onSetRef={this.handleSetEmailRef}
|
||||||
/>
|
/>
|
||||||
|
<div className="join-flow-privacy-message join-flow-email-privacy">
|
||||||
|
<FormattedMessage id="registration.private" />
|
||||||
|
<InfoButton
|
||||||
|
message={this.props.intl.formatMessage({id: 'registration.emailStepInfo'})}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
<div className="join-flow-email-checkbox-row">
|
<div className="join-flow-email-checkbox-row">
|
||||||
<FormikCheckbox
|
<FormikCheckbox
|
||||||
id="subscribeCheckbox"
|
id="subscribeCheckbox"
|
||||||
|
|
|
@ -4,9 +4,11 @@ const React = require('react');
|
||||||
const PropTypes = require('prop-types');
|
const PropTypes = require('prop-types');
|
||||||
import {Formik} from 'formik';
|
import {Formik} from 'formik';
|
||||||
const {injectIntl, intlShape} = require('react-intl');
|
const {injectIntl, intlShape} = require('react-intl');
|
||||||
|
const FormattedMessage = require('react-intl').FormattedMessage;
|
||||||
|
|
||||||
const FormikRadioButton = require('../../components/formik-forms/formik-radio-button.jsx');
|
const FormikRadioButton = require('../../components/formik-forms/formik-radio-button.jsx');
|
||||||
const JoinFlowStep = require('./join-flow-step.jsx');
|
const JoinFlowStep = require('./join-flow-step.jsx');
|
||||||
|
const InfoButton = require('../info-button/info-button.jsx');
|
||||||
|
|
||||||
require('./join-flow-steps.scss');
|
require('./join-flow-steps.scss');
|
||||||
|
|
||||||
|
@ -91,7 +93,6 @@ class GenderStep extends React.Component {
|
||||||
<JoinFlowStep
|
<JoinFlowStep
|
||||||
description={this.props.intl.formatMessage({id: 'registration.genderStepDescription'})}
|
description={this.props.intl.formatMessage({id: 'registration.genderStepDescription'})}
|
||||||
descriptionClassName="join-flow-gender-description"
|
descriptionClassName="join-flow-gender-description"
|
||||||
infoMessage={this.props.intl.formatMessage({id: 'registration.genderStepInfo'})}
|
|
||||||
innerClassName="join-flow-inner-gender-step"
|
innerClassName="join-flow-inner-gender-step"
|
||||||
title={this.props.intl.formatMessage({id: 'registration.genderStepTitle'})}
|
title={this.props.intl.formatMessage({id: 'registration.genderStepTitle'})}
|
||||||
waiting={isSubmitting}
|
waiting={isSubmitting}
|
||||||
|
@ -157,6 +158,12 @@ class GenderStep extends React.Component {
|
||||||
value="Prefer not to say"
|
value="Prefer not to say"
|
||||||
onSetFieldValue={setFieldValue}
|
onSetFieldValue={setFieldValue}
|
||||||
/>
|
/>
|
||||||
|
<div className="join-flow-privacy-message join-flow-gender-privacy">
|
||||||
|
<FormattedMessage id="registration.private" />
|
||||||
|
<InfoButton
|
||||||
|
message={this.props.intl.formatMessage({id: 'registration.genderStepInfo'})}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</JoinFlowStep>
|
</JoinFlowStep>
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -5,7 +5,6 @@ const PropTypes = require('prop-types');
|
||||||
const NextStepButton = require('./next-step-button.jsx');
|
const NextStepButton = require('./next-step-button.jsx');
|
||||||
const ModalTitle = require('../modal/base/modal-title.jsx');
|
const ModalTitle = require('../modal/base/modal-title.jsx');
|
||||||
const ModalInnerContent = require('../modal/base/modal-inner-content.jsx');
|
const ModalInnerContent = require('../modal/base/modal-inner-content.jsx');
|
||||||
const InfoButton = require('../info-button/info-button.jsx');
|
|
||||||
|
|
||||||
require('./join-flow-step.scss');
|
require('./join-flow-step.scss');
|
||||||
|
|
||||||
|
@ -16,10 +15,10 @@ const JoinFlowStep = ({
|
||||||
descriptionClassName,
|
descriptionClassName,
|
||||||
footerContent,
|
footerContent,
|
||||||
headerImgSrc,
|
headerImgSrc,
|
||||||
infoMessage,
|
|
||||||
nextButton,
|
nextButton,
|
||||||
onSubmit,
|
onSubmit,
|
||||||
title,
|
title,
|
||||||
|
titleClassName,
|
||||||
waiting
|
waiting
|
||||||
}) => (
|
}) => (
|
||||||
<form onSubmit={onSubmit}>
|
<form onSubmit={onSubmit}>
|
||||||
|
@ -41,7 +40,10 @@ const JoinFlowStep = ({
|
||||||
>
|
>
|
||||||
{title && (
|
{title && (
|
||||||
<ModalTitle
|
<ModalTitle
|
||||||
className="join-flow-title"
|
className={classNames(
|
||||||
|
'join-flow-title',
|
||||||
|
titleClassName
|
||||||
|
)}
|
||||||
title={title}
|
title={title}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
@ -53,23 +55,22 @@ const JoinFlowStep = ({
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
{description}
|
{description}
|
||||||
{infoMessage && (
|
|
||||||
<InfoButton message={infoMessage} />
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{children}
|
{children}
|
||||||
</ModalInnerContent>
|
</ModalInnerContent>
|
||||||
</div>
|
</div>
|
||||||
{footerContent && (
|
<div>
|
||||||
<div className="join-flow-footer-message">
|
{footerContent && (
|
||||||
{footerContent}
|
<div className="join-flow-footer-message">
|
||||||
</div>
|
{footerContent}
|
||||||
)}
|
</div>
|
||||||
<NextStepButton
|
)}
|
||||||
content={nextButton}
|
<NextStepButton
|
||||||
waiting={waiting}
|
content={nextButton}
|
||||||
/>
|
waiting={waiting}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
);
|
);
|
||||||
|
@ -80,11 +81,11 @@ JoinFlowStep.propTypes = {
|
||||||
descriptionClassName: PropTypes.string,
|
descriptionClassName: PropTypes.string,
|
||||||
footerContent: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
|
footerContent: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
|
||||||
headerImgSrc: PropTypes.string,
|
headerImgSrc: PropTypes.string,
|
||||||
infoMessage: PropTypes.string,
|
|
||||||
innerClassName: PropTypes.string,
|
innerClassName: PropTypes.string,
|
||||||
nextButton: PropTypes.node,
|
nextButton: PropTypes.node,
|
||||||
onSubmit: PropTypes.func,
|
onSubmit: PropTypes.func,
|
||||||
title: PropTypes.string,
|
title: PropTypes.string,
|
||||||
|
titleClassName: PropTypes.string,
|
||||||
waiting: PropTypes.bool
|
waiting: PropTypes.bool
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
|
|
||||||
.join-flow-footer-message {
|
.join-flow-footer-message {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 1.125rem 1.5rem 1.125rem;
|
padding: 0.875rem 1.5rem;
|
||||||
background-color: $ui-blue-25percent;
|
background-color: $ui-blue-25percent;
|
||||||
font-size: .75rem;
|
font-size: .75rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
|
|
@ -66,11 +66,12 @@
|
||||||
|
|
||||||
.select .join-flow-select {
|
.select .join-flow-select {
|
||||||
height: 3.5rem;
|
height: 3.5rem;
|
||||||
|
margin-bottom: 0; // override default for select
|
||||||
|
padding-right: 3.25rem;
|
||||||
background-color: white;
|
background-color: white;
|
||||||
border-color: $box-shadow-light-gray;
|
border-color: $box-shadow-light-gray;
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
padding-right: 3.25rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.select .join-flow-select-month {
|
.select .join-flow-select-month {
|
||||||
|
@ -96,6 +97,13 @@
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.join-flow-privacy-message {
|
||||||
|
margin: 1rem auto;
|
||||||
|
font-size: .75rem;
|
||||||
|
font-weight: 500;
|
||||||
|
color: $type-gray-60percent;
|
||||||
|
}
|
||||||
|
|
||||||
.join-flow-inner-username-step {
|
.join-flow-inner-username-step {
|
||||||
padding-top: 2.75rem;
|
padding-top: 2.75rem;
|
||||||
}
|
}
|
||||||
|
@ -113,23 +121,31 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.join-flow-inner-country-step {
|
.join-flow-inner-country-step {
|
||||||
padding-top: 1rem;
|
padding-top: 0;
|
||||||
padding-bottom: 2rem;
|
padding-bottom: 2.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.join-flow-inner-email-step {
|
.join-flow-inner-email-step {
|
||||||
padding-top: 3rem;
|
padding-top: 1.25rem;
|
||||||
|
padding-bottom: 0;
|
||||||
|
min-height: 16.625rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.join-flow-inner-welcome-step {
|
.join-flow-inner-welcome-step {
|
||||||
padding-top: 3rem;
|
padding-top: 0;
|
||||||
|
padding-bottom: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.join-flow-birthdate-description {
|
.join-flow-birthdate-title {
|
||||||
margin-top: 1.25rem;
|
margin-bottom: 2.875rem;
|
||||||
margin-right: -.5rem;
|
}
|
||||||
|
|
||||||
|
.join-flow-email-title {
|
||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
margin-left: -.5rem;
|
}
|
||||||
|
|
||||||
|
.join-flow-email-privacy {
|
||||||
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.join-flow-registration-error {
|
.join-flow-registration-error {
|
||||||
|
@ -141,8 +157,21 @@
|
||||||
margin-bottom: 1.25rem;
|
margin-bottom: 1.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.join-flow-country-description {
|
.join-flow-gender-privacy {
|
||||||
margin-top: 1rem;
|
margin-top: .5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.join-flow-country-title {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 1.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.join-flow-welcome-title {
|
||||||
|
margin-bottom: .25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.join-flow-welcome-description {
|
||||||
|
margin-bottom: 1.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.gender-radio-row {
|
.gender-radio-row {
|
||||||
|
@ -178,7 +207,7 @@
|
||||||
|
|
||||||
.join-flow-email-checkbox-row {
|
.join-flow-email-checkbox-row {
|
||||||
font-size: .75rem;
|
font-size: .75rem;
|
||||||
margin: .25rem .125rem;
|
margin: 1.5rem .125rem .25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.join-flow-link:link, a.join-flow-link:visited, a.join-flow-link:active {
|
a.join-flow-link:link, a.join-flow-link:visited, a.join-flow-link:active {
|
||||||
|
|
|
@ -137,9 +137,9 @@ class JoinFlow extends React.Component {
|
||||||
) : (
|
) : (
|
||||||
<Progression step={this.state.step}>
|
<Progression step={this.state.step}>
|
||||||
<UsernameStep onNextStep={this.handleAdvanceStep} />
|
<UsernameStep onNextStep={this.handleAdvanceStep} />
|
||||||
|
<CountryStep onNextStep={this.handleAdvanceStep} />
|
||||||
<BirthDateStep onNextStep={this.handleAdvanceStep} />
|
<BirthDateStep onNextStep={this.handleAdvanceStep} />
|
||||||
<GenderStep onNextStep={this.handleAdvanceStep} />
|
<GenderStep onNextStep={this.handleAdvanceStep} />
|
||||||
<CountryStep onNextStep={this.handleAdvanceStep} />
|
|
||||||
<EmailStep
|
<EmailStep
|
||||||
waiting={this.state.waiting}
|
waiting={this.state.waiting}
|
||||||
onNextStep={this.handlePrepareToRegister}
|
onNextStep={this.handlePrepareToRegister}
|
||||||
|
|
|
@ -42,6 +42,7 @@ class WelcomeStep extends React.Component {
|
||||||
description={this.props.intl.formatMessage({
|
description={this.props.intl.formatMessage({
|
||||||
id: 'registration.welcomeStepDescriptionNonEducator'
|
id: 'registration.welcomeStepDescriptionNonEducator'
|
||||||
})}
|
})}
|
||||||
|
descriptionClassName="join-flow-welcome-description"
|
||||||
headerImgSrc="/images/join-flow/welcome-header.png"
|
headerImgSrc="/images/join-flow/welcome-header.png"
|
||||||
innerClassName="join-flow-inner-welcome-step"
|
innerClassName="join-flow-inner-welcome-step"
|
||||||
nextButton={
|
nextButton={
|
||||||
|
@ -57,6 +58,7 @@ class WelcomeStep extends React.Component {
|
||||||
{id: 'registration.welcomeStepTitleNonEducator'},
|
{id: 'registration.welcomeStepTitleNonEducator'},
|
||||||
{username: this.props.username}
|
{username: this.props.username}
|
||||||
)}`}
|
)}`}
|
||||||
|
titleClassName="join-flow-welcome-title"
|
||||||
waiting={isSubmitting}
|
waiting={isSubmitting}
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
>
|
>
|
||||||
|
|
|
@ -16,8 +16,6 @@
|
||||||
"general.downloadPDF": "Download PDF",
|
"general.downloadPDF": "Download PDF",
|
||||||
"general.emailUs": "Email Us",
|
"general.emailUs": "Email Us",
|
||||||
"general.conferences": "Conferences",
|
"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.country": "Country",
|
||||||
"general.create": "Create",
|
"general.create": "Create",
|
||||||
"general.credits": "Credits",
|
"general.credits": "Credits",
|
||||||
|
@ -154,7 +152,6 @@
|
||||||
"registration.choosePasswordStepTitle": "Create a password",
|
"registration.choosePasswordStepTitle": "Create a password",
|
||||||
"registration.choosePasswordStepTooltip": "Don't use your name or anything that's easy for someone else to guess.",
|
"registration.choosePasswordStepTooltip": "Don't use your name or anything that's easy for someone else to guess.",
|
||||||
"registration.classroomApiGeneralError": "Sorry, we could not find the registration information for this class",
|
"registration.classroomApiGeneralError": "Sorry, we could not find the registration information for this class",
|
||||||
"registration.countryStepDescription": "We’ll display your country on your profile.",
|
|
||||||
"registration.countryStepTitle": "What country do you live in?",
|
"registration.countryStepTitle": "What country do you live in?",
|
||||||
"registration.generalError": "Sorry, an unexpected error occurred.",
|
"registration.generalError": "Sorry, an unexpected error occurred.",
|
||||||
"registration.classroomInviteExistingStudentStepDescription": "you have been invited to join the class:",
|
"registration.classroomInviteExistingStudentStepDescription": "you have been invited to join the class:",
|
||||||
|
@ -165,12 +162,12 @@
|
||||||
"registration.createAccount": "Create Your Account",
|
"registration.createAccount": "Create Your Account",
|
||||||
"registration.createUsername": "Create a username",
|
"registration.createUsername": "Create a username",
|
||||||
"registration.genderStepTitle": "What's your gender?",
|
"registration.genderStepTitle": "What's your gender?",
|
||||||
"registration.genderStepDescription": "Scratch welcomes people of all genders. We will always keep this information private.",
|
"registration.genderStepDescription": "Scratch welcomes people of all genders.",
|
||||||
"registration.genderStepInfo": "This helps us understand who uses Scratch, so that we can broaden participation. This information will not be made public on your account.",
|
"registration.genderStepInfo": "This helps us understand who uses Scratch, so that we can broaden participation. This information will not be made public on your account.",
|
||||||
"registration.genderOptionAnother": "Another gender:",
|
"registration.genderOptionAnother": "Another gender:",
|
||||||
"registration.genderOptionPreferNotToSay": "Prefer not to say",
|
"registration.genderOptionPreferNotToSay": "Prefer not to say",
|
||||||
"registration.emailStepTitle": "What's your email?",
|
"registration.emailStepTitle": "What's your email?",
|
||||||
"registration.emailStepDescription": "We need this to finish creating your account. Scratch will always keep this information private.",
|
"registration.emailStepInfo": "This will help if you forget your password, or if you want to receive email updates. This information will not be made public on your account.",
|
||||||
"registration.goToClass": "Go to Class",
|
"registration.goToClass": "Go to Class",
|
||||||
"registration.invitedBy": "invited by",
|
"registration.invitedBy": "invited by",
|
||||||
"registration.lastStepTitle": "Thank you for requesting a Scratch Teacher Account",
|
"registration.lastStepTitle": "Thank you for requesting a Scratch Teacher Account",
|
||||||
|
@ -185,7 +182,7 @@
|
||||||
"registration.passwordAdviceShort": "Write it down so you remember. Don’t share it with others!",
|
"registration.passwordAdviceShort": "Write it down so you remember. Don’t share it with others!",
|
||||||
"registration.personalStepTitle": "Personal Information",
|
"registration.personalStepTitle": "Personal Information",
|
||||||
"registration.personalStepDescription": "Your individual responses will not be displayed publicly, and will be kept confidential and secure",
|
"registration.personalStepDescription": "Your individual responses will not be displayed publicly, and will be kept confidential and secure",
|
||||||
"registration.private": "Scratch will always keep this information private.",
|
"registration.private": "We will keep this information private.",
|
||||||
"registration.receiveEmails": "I'd like to receive emails from the Scratch Team about project ideas, events, and more.",
|
"registration.receiveEmails": "I'd like to receive emails from the Scratch Team about project ideas, events, and more.",
|
||||||
"registration.selectCountry": "select country",
|
"registration.selectCountry": "select country",
|
||||||
"registration.studentPersonalStepDescription": "This information will not appear on the Scratch website.",
|
"registration.studentPersonalStepDescription": "This information will not appear on the Scratch website.",
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0" fill="#4794FF"/><path d="M9.988 13.388a1.33 1.33 0 1 1-.001 2.662 1.33 1.33 0 0 1 .001-2.662zm2.68-8.768c.83.53 1.335 1.347 1.418 2.305.084.97-.28 1.95-.949 2.56-.596.543-1.148.852-1.59 1.101-.698.39-.698.41-.698.772 0 .553-.014 1.002-1.002 1.002-.918 0-1.002-.449-1.002-1.002 0-1.559.956-2.092 1.722-2.52.391-.22.795-.445 1.22-.833.176-.16.335-.523.302-.906-.029-.332-.196-.597-.496-.788-.845-.537-2.063-.325-2.869.195-.985.637-.819 1.547-1.755 1.291-1.062-.29-.915-1-.529-1.697.418-.756 1.117-1.317 1.898-1.662 1.471-.65 3.13-.58 4.33.182z" fill="#FFF"/></g></svg>
|
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="20" height="20"><g fill-rule="evenodd"><path d="M10 0a10 10 0 1 0 10 10A10 10 0 0 0 10 0" fill="#9a9eac"/><path d="M10 13.39a1.33 1.33 0 1 1-1.33 1.33A1.33 1.33 0 0 1 10 13.39zm2.68-8.77a3 3 0 0 1 1.42 2.31 3.15 3.15 0 0 1-.95 2.56 8.37 8.37 0 0 1-1.59 1.1c-.7.39-.7.41-.7.77 0 .55 0 1-1 1s-1-.45-1-1a2.65 2.65 0 0 1 1.72-2.52A6.61 6.61 0 0 0 11.79 8a1.22 1.22 0 0 0 .3-.91 1 1 0 0 0-.5-.79 2.8 2.8 0 0 0-2.87.2c-.98.64-.81 1.55-1.72 1.3s-.92-1-.53-1.7a3.94 3.94 0 0 1 1.9-1.66 4.67 4.67 0 0 1 4.3.18z" fill="#fff"/></g></svg>
|
Before Width: | Height: | Size: 745 B After Width: | Height: | Size: 593 B |
|
@ -25,12 +25,12 @@ describe('EmailStep test', () => {
|
||||||
// Dive to get past the anonymous component.
|
// Dive to get past the anonymous component.
|
||||||
const joinFlowWrapper = formikWrapper.dive().find(JoinFlowStep);
|
const joinFlowWrapper = formikWrapper.dive().find(JoinFlowStep);
|
||||||
expect(joinFlowWrapper).toHaveLength(1);
|
expect(joinFlowWrapper).toHaveLength(1);
|
||||||
expect(joinFlowWrapper.props().description).toBe('registration.emailStepDescription');
|
|
||||||
expect(joinFlowWrapper.props().footerContent.props.id).toBe('registration.acceptTermsOfUse');
|
expect(joinFlowWrapper.props().footerContent.props.id).toBe('registration.acceptTermsOfUse');
|
||||||
expect(joinFlowWrapper.props().headerImgSrc).toBe('/images/join-flow/email-header.png');
|
expect(joinFlowWrapper.props().headerImgSrc).toBe('/images/join-flow/email-header.png');
|
||||||
expect(joinFlowWrapper.props().innerClassName).toBe('join-flow-inner-email-step');
|
expect(joinFlowWrapper.props().innerClassName).toBe('join-flow-inner-email-step');
|
||||||
expect(joinFlowWrapper.props().nextButton).toBe('registration.createAccount');
|
expect(joinFlowWrapper.props().nextButton).toBe('registration.createAccount');
|
||||||
expect(joinFlowWrapper.props().title).toBe('registration.emailStepTitle');
|
expect(joinFlowWrapper.props().title).toBe('registration.emailStepTitle');
|
||||||
|
expect(joinFlowWrapper.props().titleClassName).toBe('join-flow-email-title');
|
||||||
expect(joinFlowWrapper.props().waiting).toBe(true);
|
expect(joinFlowWrapper.props().waiting).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue