Merge branch 'develop' into feature/jobs

This commit is contained in:
Andrew Sliwinski 2016-03-01 10:19:34 -05:00
commit 7511121972
24 changed files with 194 additions and 114 deletions

View file

@ -9,8 +9,8 @@ notifications:
secure: ezESiG7JnuSLZc2/PPhOvWUv5BHBCr+g86MsuLLw+S+zz3DUfzWHMQ1g5tUvkeSDTPmfEIX41EnPkaoWtsD3OGO0PGXgseAfA8+6Z4N1rICNZZrhXZB2s6UdwRK1e+0Jol4W3kHmt96BHyN2scLNgJYeWMgSJllVsuPhMTlKBZIXI9u540NH8Nxjl3f2WvoIg64Q1mZvMxkpPbw4xssx6U4HSFE8kTTE6+EFsSxzombFX0cLGjPiJ9QZgGVUk4UkIjyiFLQQDfQlLllCaUpqJ9+qbuCNoMSKA2yty/qyZ8Y+r4OlMberjmBzR9GRLLyXWWcaAfMIgwlRhjtLYIDAUSsGM1iwUWCgyB9maG2IiXuYLSueuMx8DcDwbpUepoDgnqBYnM2AJmT8gcsxqlKYzJpYpHDgZgBlLZQgMXqjrVJHs/Tf9XVcLS6HAn1Ww0OOT01jThfy4gClpAuqLayYexsXOoL+RaFg25E2NzuTtaFWgRfWZgcAeqYNDiUzwun2D4vZ5I+NtdRP0gzpbG2fxhFz05vAqyf1Kp6ZYb17Li3A38dIm6Lsvv3qawAIAgNaZpIZX3f89+uq6jHU8kJy1Iv823JK2Xac3vEz3SHUKJnuXFF0LO07om9AcNEXhP/JrJ617S8nfvDtZRJODMFhz8qQwie+65Ql1I871goBpVs= secure: ezESiG7JnuSLZc2/PPhOvWUv5BHBCr+g86MsuLLw+S+zz3DUfzWHMQ1g5tUvkeSDTPmfEIX41EnPkaoWtsD3OGO0PGXgseAfA8+6Z4N1rICNZZrhXZB2s6UdwRK1e+0Jol4W3kHmt96BHyN2scLNgJYeWMgSJllVsuPhMTlKBZIXI9u540NH8Nxjl3f2WvoIg64Q1mZvMxkpPbw4xssx6U4HSFE8kTTE6+EFsSxzombFX0cLGjPiJ9QZgGVUk4UkIjyiFLQQDfQlLllCaUpqJ9+qbuCNoMSKA2yty/qyZ8Y+r4OlMberjmBzR9GRLLyXWWcaAfMIgwlRhjtLYIDAUSsGM1iwUWCgyB9maG2IiXuYLSueuMx8DcDwbpUepoDgnqBYnM2AJmT8gcsxqlKYzJpYpHDgZgBlLZQgMXqjrVJHs/Tf9XVcLS6HAn1Ww0OOT01jThfy4gClpAuqLayYexsXOoL+RaFg25E2NzuTtaFWgRfWZgcAeqYNDiUzwun2D4vZ5I+NtdRP0gzpbG2fxhFz05vAqyf1Kp6ZYb17Li3A38dIm6Lsvv3qawAIAgNaZpIZX3f89+uq6jHU8kJy1Iv823JK2Xac3vEz3SHUKJnuXFF0LO07om9AcNEXhP/JrJ617S8nfvDtZRJODMFhz8qQwie+65Ql1I871goBpVs=
env: env:
global: global:
- secure: kXRyOECCfmTmIyibSKyHFz9cC5YGDsLIZJyiSpepvjRvuuJErxpD3yokp++JCJXdj/CRfJKazeMPkgek78zGiI/xnHR2aVxuQraU5ELIVNBCaFDtM4lKxtTVvEAtErwhWrH9zMiJkgXGF/MwID0QgZVlD/hpKI3MoS8sS1dmvDlqlregTvUZWBnlqMnrQuOXFNLPT+/QPgO6myd+nJn+XogSw8HceUo76cOADBphLtxFvE+R3FEbkHOwgJzUR3p8FstNXjmXZocSAYlGEgf1QIAN7M+3fH3wBHUBL2XELlr3w6eFr0qPCT5GCIxc4DNYsNt1360nmhSUqcm+k30HcbGmM5oWiRTmo2NrNpKhCUyF9wKHKmS4JYqGBEBjLxkTZe/zCv18gNVy0s9x/IXP3qP9SoRnlNEt9H6MjaxBc3lWD47UmcDJoLrs7OUdM4HDxgmPJyTzJsg059GEWgHuEMGIGGCYBGdpNlu4ZH6yEgsji73+kAkYbnVzhz4QtfhGNgQv3kEhTmDHW5muca5EMuSyOLW5v4ffpLJgirJQi9lvjZ/pZ+XJU0DSfIHdViqop6hRrsPxo2ewle3RcZrlQuw7lJJp9IoDT5Ku2PU1m8+705CR8S96DrMP8UtbC1Plcv91MMGmwgPwYAQwEcTnj7Fsq9QKReus+CTUXYqaMQM= - secure: A138rYuXDsOmpEwYxZ31WyXEeq5fgr9qyqsQh1nTFsjBKpFtNM+CN9e0QJQFT3PLs4wH/lWTRSyHxakxKQS1sxq828f9gHed+f15REKk/fRUplcCYIexT9xKVtU3D8CRNn/KBFWk75fZyZt20eyOVIv4h3pInKQz7y84J6PWzB1BCrAFvADrzS1X68Z3NJJLyxnz0YEurzz8mC2v4D0s/XifKTWvRtefD4QM6pE0C2iYyk+ThrLwg7i9FDHVfo0MrkgcdX7mz37SnTr7p7mHWnGXrGngi/NiDRQ+Uwwq/sr2UIww0rCwS1xsOcS//dC4NNqrrt1kUTsoC1Yt87Ny+gI0nUplsfEpdKajAkOYdANC5bJUGqPdSlOds1v9aJs9Hx48uGamWkm/3cFmoJ5uA2ZzUwbSGjTkWbnhwzT0YRvcLGhP1WE/EswaIyK5qMp522E79mP1yH6M750iUvi4N39+QW1BNX3ADkOwyAI67ArX5on5gWP83RXcJ15im7XsBpsmVn/KXi6AouWPb8jmSmKCj0QZCzfLY7ivM42IugYpK2NV7kFB38DpXQamJ5eskgwYa3elRmednIFUuwb1QDnONvJogVjk4CLmoSxssC2mJnnrUItM7l8G6As81GMI+6lTtl86hAuXBjUk60FMbgTAQDX9ll26LgpBy8jHSx8=
- secure: D7TVtzhDPvSsipXB9jiokA00rUAENWjK5Lrv+JOgdNe35D9j3tSSgT+iKj2Et5LcSeKXpvC2gMDXakHMflo2tT8uYPx7NI6J9XZMro2VP+ebTHlG57Fuoves9XxwCvHDFk2yW/K7uma8a92rs4PNydJRB6SPm3pWjL29Ih2n9ZFy37ZHCdL26R61EJ9SZh5siOVuXhqB36mu0Z9ANjXeXcLrKzpRf8mmORsK9NT/0A9kg4a0Q9ZKiHhUp3Wh3VKfDlDvqYszdofBNSpUGSyj/J4IlpYld8q+o+husxr3yLbV+FR1xdJ8NS04iXEmd1yOhJKy7ienpNQJ7NLwSOgDQ+Y8VZJUf0ZvSX/acHqNFQC86tW15KTAEVfnY8Js7mqmZrsWoY6+jzC8RyaQoZiD1HQfJLHkG+uqrfPYhWy1BNz+4QtBwnnQO+E/B2CM+fGAmjoJ+UjquWQo+sHWwoatNrG85JumA3GsA1FSlkzEVy3AAcST/CFZ1IyGCDVTar++2VwYCH691DuJy1gyeqSukSbRQIhGTSktArv0FjIiVsoMTCB/Ntg8HcfL6ADTfsijZVL9v5hN2VUXg3BjuF4TEBsrN78WMNI+U3g1+W1UW+036eP09Z7QDxIvLoQdIaQncGBny2KnR2j/Gmgz9eG0eg4dlV+2W+9DqE4y+tmU4Jw= - secure: EX1fyov+f6ytWN2ZSL4dLslwrVkp6Ho/uoSLO38/qNG3XdGmBN4VprxddcQiWfo+Mrg3GdWcfcM/VazhhStBi1uLfZiw3RHZaSGuWbiuD2EtzqtlC+OVvoajgy91QFajh9Zzuwa0rYbEPd/sw01R53NoWJYl0GSteWk7C8Wv6anl4FUJCqgvvTV2ZEcyTtGcVJgUhKi1MfNpTSM6JWBy0DWszcyxj7C8LSs1+l9ZjAtnlUBWY13HsrNu8G5d+FwqGHZLUAjdu2O602wxV897/xLARLduZ+01ALpVefNEEGMB1Wd+xMw4dm2B0Uk86a4TBRCeOgJZ1yoJoPpGPOHTo+dgNXcU8ReszGVoy7uOjFWwu82FQq8gzfcf75yzaRJgG8/BJ6BkJfa0EmFg3iO5CwixQyHR5+CqsedtoLAWVT8zlOfQ/Z6yx4Pm7jXQSOkyvo09YJ2QIn4IFGPvwOVS7Firzi+fLl8GYApeSV9G10e1IzA4pPrKdJMRA4qRMPt9zJGq7ZO1J/d9aW/5KIsJUDnodnl7yXJyDMOyNeljT9I82ciHZcURxRRY080vrW6dgNJE1V9jxBhWEvr2iCeWMMedWaGuC41I7K9L79eW8lmaE+cQ+OZrzpOJP4GbfmIiXrh+0M4ChL/xBpjtiFwpNdkCXXhzWMnjJ4wCrii4yuc=
- EB_REGION=us-east-1 - EB_REGION=us-east-1
- EB_APP=scratch-www - EB_APP=scratch-www
- EB_AWS_BUCKET_NAME=elasticbeanstalk-us-east-1-307680192167 - EB_AWS_BUCKET_NAME=elasticbeanstalk-us-east-1-307680192167
@ -32,7 +32,10 @@ deploy:
env: scratch-www-staging env: scratch-www-staging
on: on:
repo: LLK/scratch-www repo: LLK/scratch-www
branch: develop branch:
- develop
- hotfix/*
- release/*
- provider: elasticbeanstalk - provider: elasticbeanstalk
access_key_id: $EB_AWS_ACCESS_KEY_ID access_key_id: $EB_AWS_ACCESS_KEY_ID
secret_access_key: $EB_AWS_SECRET_ACCESS_KEY secret_access_key: $EB_AWS_SECRET_ACCESS_KEY

View file

@ -1,13 +1,12 @@
### Where am I? ### ## I wanna contribute!
Physically? No idea. Sweet! The transition from existing to new codebase is an ongoing process, and we love to have people in the Scratch and Open Source communities help us along the way, and even afterwards as we develop new features for Scratch here.
Digitally? Youre at Scratchs open source Web Client! Here are some ways you can contribute:
* [Report bugs](https://github.com/LLK/scratch-www/wiki/Reporting-Bugs)
* [Work on bugs and make pull requests](https://github.com/LLK/scratch-www/wiki/Workflow-for-Repo-Contributions)
* Make sure to check out how to [assign yourself bugs](https://github.com/LLK/scratch-www/wiki/Assigning-Yourself-Bugs) too.
At Scratch, were working to update our UI to use a new codebase, which will be contained in this repository. The transition from existing to new codebase is an ongoing process, and we love to have people in the Scratch and Open Source communities help us along the way, and even afterwards as we develop new features for Scratch here. We are always excited to have people join us in working to make Scratch a wonderful place for people of all ages to make projects together. If youre new here, and looking to jump into our wonderful community, we have some resources for you to take a look at:
### Who and what will I find here? ###
We are always excited to have people join us in working to make Scratch a wonderful place for people of all ages to make projects together. If youre new here, and looking to jump into our wonderful community, we have some wonderful resources for you to take a look at:
* [README](https://github.com/LLK/scratch-www/blob/develop/README.md) (if youre to read only one me in this repo, make it this one it has all of the necessary information for getting a local Scratch UI running on your machine!) * [README](https://github.com/LLK/scratch-www/blob/develop/README.md) (if youre to read only one me in this repo, make it this one it has all of the necessary information for getting a local Scratch UI running on your machine!)
* [Community Guidelines](https://github.com/LLK/scratch-www/wiki/Community-Guidelines) (we find it important to maintain a constructive and welcoming community, just like on Scratch) * [Community Guidelines](https://github.com/LLK/scratch-www/wiki/Community-Guidelines) (we find it important to maintain a constructive and welcoming community, just like on Scratch)
@ -21,15 +20,3 @@ Beyond this repo, there are also some other resources that you might want to tak
[Advanced Topics forum](https://scratch.mit.edu/discuss/31/) on Scratch (like Topics, but more complex-y) [Advanced Topics forum](https://scratch.mit.edu/discuss/31/) on Scratch (like Topics, but more complex-y)
### I wanna contribute! ###
Sweet! Here are some ways you can contribute:
* [Report bugs](https://github.com/LLK/scratch-www/wiki/Reporting-Bugs)
* [Work on bugs](https://github.com/LLK/scratch-www/wiki/Workflow-for-Repo-Contributions)
* Make sure to check out how to [assign yourself bugs](https://github.com/LLK/scratch-www/wiki/Assigning-Yourself-Bugs) too.
Were currently building Scratch using [React](https://facebook.github.io/react/) and [SCSS](http://sass-lang.com/documentation/file.SASS_REFERENCE.html). Here are some resources to help you get acquainted with how were working on the Scratch codebase:
* [Style Guide](https://github.com/LLK/scratch-www/wiki/Style-Guide)
* [Testing Guide](https://github.com/LLK/scratch-www/wiki/Testing-Guide)
* [Localization Guide](https://github.com/LLK/scratch-www/wiki/Localization-Guide)
* [Map of the repository](https://github.com/LLK/scratch-www/wiki/Repo-Map)

12
LICENSE Normal file
View file

@ -0,0 +1,12 @@
Copyright (c) 2015, Massachusetts Institute of Technology
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -1,13 +0,0 @@
Copyright 2015 Massachusetts Institute of Technology
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View file

@ -1,7 +1,22 @@
## scratch-www ## scratch-www
#### Standalone web client for Scratch #### Standalone web client for Scratch
[![Build Status](https://magnum.travis-ci.com/LLK/scratch-www.svg?token=xzzHj4ct3SyBTpeqxnx1)](https://magnum.travis-ci.com/LLK/scratch-www) [![Build Status](https://travis-ci.org/LLK/scratch-www.svg)](https://travis-ci.org/LLK/scratch-www)
### Where am I?
Physically? No idea.
Digitally? Youre at Scratchs open source web client!
Were working to update the [Scratch website](https://scratch.mit.edu) to use a new codebase, contained in this repository.
Were currently building Scratch using [React](https://facebook.github.io/react/) and [SCSS](http://sass-lang.com/documentation/file.SASS_REFERENCE.html). Here are some resources to help you get acquainted with how were working on the Scratch codebase:
* [Style Guide](https://github.com/LLK/scratch-www/wiki/Style-Guide)
* [Testing Guide](https://github.com/LLK/scratch-www/wiki/Testing-Guide)
* [Localization Guide](https://github.com/LLK/scratch-www/wiki/Localization-Guide)
* [Map of the repository](https://github.com/LLK/scratch-www/wiki/Repo-Map)
### Before Getting Started ### Before Getting Started
* make sure you have node and npm [installed](https://docs.npmjs.com/getting-started/installing-node) * make sure you have node and npm [installed](https://docs.npmjs.com/getting-started/installing-node)
@ -39,7 +54,7 @@ Use `^C` to stop the node process `npm start` starts.
| `PORT` | `8333` | Port for devserver (http://localhost:XXXX) | | `PORT` | `8333` | Port for devserver (http://localhost:XXXX) |
| `FALLBACK` | `''` | Pass-through location for old site | | `FALLBACK` | `''` | Pass-through location for old site |
**NOTE:** Because by default both `API_HOST=https://api.scratch.mit.edu` and `FALLBACK=https://scratch.mit.edu`, please be aware that, by default, you will be seeing and interacting with real data on the Scratch website. **NOTE:** Because by default `API_HOST=https://api.scratch.mit.edu`, please be aware that, by default, you will be seeing and interacting with real data on the Scratch website.
### To Test ### To Test
```bash ```bash
@ -56,3 +71,5 @@ Most of the issues we have currently revolve around the use of `FALLBACK`. This
Setting `FALLBACK=https://scratch.mit.edu` allows the web client to retrieve data from the Scratch website in your development environment. However, because of security concerns, trying to send data to Scratch through your development environment won't work. This means the following things will be broken for the time being: Setting `FALLBACK=https://scratch.mit.edu` allows the web client to retrieve data from the Scratch website in your development environment. However, because of security concerns, trying to send data to Scratch through your development environment won't work. This means the following things will be broken for the time being:
* Login on the splash page (*In the process of being fixed*) * Login on the splash page (*In the process of being fixed*)
* Some update attempts to production data made through a development version of the web client * Some update attempts to production data made through a development version of the web client
Additionally, if you set `FALLBACK=https://scratch.mit.edu`, be aware that clicking on links to parts of the website not yet migrated over (currently such as `Explore`, `Discuss`, `Profile`, etc.) will take you to the Scratch website itself.

7
TRADEMARK Normal file
View file

@ -0,0 +1,7 @@
The Scratch trademarks, including the Scratch name, logo, the Scratch Cat, Gobo, Pico, Nano, Tera and Giga graphics (the "Marks"), are property of the Massachusetts Institute of Technology (MIT), and the use of the Marks is governed by this policy.
You may use the Marks to refer to Scratch in Substantially Unmodified form.
"Substantially Unmodified" means the source code provided by MIT, possibly with minor modifications including but not limited to: bug fixes (including security), changing the locations of files for better integration with the host operating system, adding documentation, and changes to the dynamic linking of libraries.
A version is not "Substantially Unmodified" if it incorporates features not present in a release of Scratch by MIT. If you do make a substantial modification, to avoid confusion with versions of Scratch produced by MIT you must remove all Marks from your version of the software and refrain from using any of the Marks to refer to your version.

View file

@ -90,6 +90,12 @@ for (var id in generalIds) {
icuWithIds[generalIds[id]] = 'general-' + id; icuWithIds[generalIds[id]] = 'general-' + id;
} }
// start with all views, and remove localized ones as they are iterated over
var views = glob.sync(path.resolve(__dirname, '../src/views/*'));
for (var i = 0; i < views.length; i++) {
views[i] = views[i].split('/').pop();
}
// get view-specific locale strings. // get view-specific locale strings.
var files = glob.sync(path.resolve(__dirname, '../src/views/**/l10n.json')); var files = glob.sync(path.resolve(__dirname, '../src/views/**/l10n.json'));
files.forEach(function (file) { files.forEach(function (file) {
@ -152,10 +158,13 @@ glob(poUiDir + '/*', function (err, files) {
} }
}); });
for (var view in viewLocales) { for (var i in views) {
var viewTranslations = merge(viewLocales[view], generalLocales); var viewTranslations = generalLocales;
if (views[i] in viewLocales) {
viewTranslations = merge(viewLocales[views[i]], viewTranslations);
}
var objectString = JSON.stringify(viewTranslations); var objectString = JSON.stringify(viewTranslations);
var fileString = 'window._messages = ' + objectString + ';'; var fileString = 'window._messages = ' + objectString + ';';
fs.writeFileSync(outputDir + '/' + view + '.intl.js', fileString); fs.writeFileSync(outputDir + '/' + views[i] + '.intl.js', fileString);
} }
}); });

View file

@ -14,8 +14,8 @@
"type": "git", "type": "git",
"url": "git+ssh://git@github.com/llk/scratch-www.git" "url": "git+ssh://git@github.com/llk/scratch-www.git"
}, },
"author": "MIT", "author": "Massachusetts Institute of Technology",
"license": "MIT", "license": "BSD-3-Clause",
"bugs": { "bugs": {
"url": "https://github.com/llk/scratch-www/issues" "url": "https://github.com/llk/scratch-www/issues"
}, },

View file

@ -3,6 +3,10 @@ var React = require('react');
require('./banner.scss'); require('./banner.scss');
/**
* Container for messages displayed below the nav bar that can be dismissed
* (See: email not confirmed banner)
*/
var Banner = React.createClass({ var Banner = React.createClass({
type: 'Banner', type: 'Banner',
propTypes: { propTypes: {

View file

@ -9,6 +9,9 @@ require('slick-carousel/slick/slick.scss');
require('slick-carousel/slick/slick-theme.scss'); require('slick-carousel/slick/slick-theme.scss');
require('./carousel.scss'); require('./carousel.scss');
/**
* Displays content in horizontal scrolling box. Example usage: splash page rows.
*/
var Carousel = React.createClass({ var Carousel = React.createClass({
type: 'Carousel', type: 'Carousel',
propTypes: { propTypes: {

View file

@ -5,6 +5,7 @@
$button-offset: $icon-size + 5px; $button-offset: $icon-size + 5px;
$box-content-offset: 20px; $box-content-offset: 20px;
margin-bottom: 0;
padding: 12px $button-offset; padding: 12px $button-offset;
.box-content & { .box-content & {
@ -28,8 +29,10 @@
content: ""; content: "";
} }
&.slick-disabled:before { &.slick-disabled {
opacity: 1; &:before {
opacity: 1;
}
} }
} }
@ -38,11 +41,11 @@
&:before { &:before {
background-image: url("/svgs/carousel/prev_ui-dark-gray.svg"); background-image: url("/svgs/carousel/prev_ui-dark-gray.svg");
}
&:hover:before { &:hover {
background-image: url("/svgs/carousel/prev_ui-blue.svg"); background-image: url("/svgs/carousel/prev_ui-blue.svg");
background-size: 90%; background-size: 90%;
}
} }
@ -56,11 +59,11 @@
&:before { &:before {
background-image: url("/svgs/carousel/next_ui-dark-gray.svg"); background-image: url("/svgs/carousel/next_ui-dark-gray.svg");
}
&:hover:before { &:hover {
background-image: url("/svgs/carousel/next_ui-blue.svg"); background-image: url("/svgs/carousel/next_ui-blue.svg");
background-size: 90%; background-size: 90%;
}
} }
.box-content & { .box-content & {

View file

@ -64,10 +64,12 @@ var Intro = React.createClass({
<a className="sprite sprite-1" href="/projects/editor/?tip_bar=getStarted"> <a className="sprite sprite-1" href="/projects/editor/?tip_bar=getStarted">
<img <img
className="costume costume-1" className="costume costume-1"
src="//cdn.scratch.mit.edu/scratchr2/static/images/cat-a.png" /> src="//cdn.scratch.mit.edu/scratchr2/static/images/cat-a.png"
alt="Scratch Cat" />
<img <img
className="costume costume-2" className="costume costume-2"
src="//cdn.scratch.mit.edu/scratchr2/static/images/cat-b.png" /> src="//cdn.scratch.mit.edu/scratchr2/static/images/cat-b.png"
alt="Scratch Cat" />
<div className="circle"></div> <div className="circle"></div>
<div className="text"> <div className="text">
{this.props.messages['intro.tryItOut']} {this.props.messages['intro.tryItOut']}
@ -76,10 +78,12 @@ var Intro = React.createClass({
<a className="sprite sprite-2" href="/starter_projects/"> <a className="sprite sprite-2" href="/starter_projects/">
<img <img
className="costume costume-1" className="costume costume-1"
src="//cdn.scratch.mit.edu/scratchr2/static/images/tera-a.png" /> src="//cdn.scratch.mit.edu/scratchr2/static/images/tera-a.png"
alt="Tera" />
<img <img
className="costume costume-2" className="costume costume-2"
src="//cdn.scratch.mit.edu/scratchr2/static/images/tera-b.png" /> src="//cdn.scratch.mit.edu/scratchr2/static/images/tera-b.png"
alt="Tera" />
<div className="circle"></div> <div className="circle"></div>
<div className="text"> <div className="text">
{this.props.messages['intro.seeExamples']} {this.props.messages['intro.seeExamples']}
@ -88,10 +92,12 @@ var Intro = React.createClass({
<a className="sprite sprite-3" href="#" onClick={this.handleJoinClick}> <a className="sprite sprite-3" href="#" onClick={this.handleJoinClick}>
<img <img
className="costume costume-1" className="costume costume-1"
src="//cdn.scratch.mit.edu/scratchr2/static/images/gobo-a.png" /> src="//cdn.scratch.mit.edu/scratchr2/static/images/gobo-a.png"
alt="Gobo" />
<img <img
className="costume costume-2" className="costume costume-2"
src="//cdn.scratch.mit.edu/scratchr2/static/images/gobo-b.png" /> src="//cdn.scratch.mit.edu/scratchr2/static/images/gobo-b.png"
alt="Gobo" />
<div className="circle"></div> <div className="circle"></div>
<div className="text"> <div className="text">
{this.props.messages['intro.joinScratch']} {this.props.messages['intro.joinScratch']}
@ -122,7 +128,8 @@ var Intro = React.createClass({
</div> </div>
<div className="video"> <div className="video">
<div className="play-button" onClick={this.showVideo}></div> <div className="play-button" onClick={this.showVideo}></div>
<img src="//cdn.scratch.mit.edu/scratchr2/static/images/hp-video-screenshot.png" /> <img src="//cdn.scratch.mit.edu/scratchr2/static/images/hp-video-screenshot.png"
alt="Intro Video" />
</div> </div>
<Modal <Modal
className="video-modal" className="video-modal"

View file

@ -8,6 +8,9 @@ var Select = require('../forms/select.jsx');
require('./languagechooser.scss'); require('./languagechooser.scss');
/**
* Footer dropdown menu that allows one to change their language.
*/
var LanguageChooser = React.createClass({ var LanguageChooser = React.createClass({
type: 'LanguageChooser', type: 'LanguageChooser',
mixins: [ mixins: [

View file

@ -25,6 +25,9 @@ var defaultStyle = {
} }
}; };
/**
* Container for pop up windows (See: registration window)
*/
var Modal = React.createClass({ var Modal = React.createClass({
type: 'Modal', type: 'Modal',
statics: { statics: {

View file

@ -47,14 +47,14 @@ var Navigation = React.createClass({
loginOpen: false, loginOpen: false,
loginError: null, loginError: null,
registrationOpen: false, registrationOpen: false,
unreadMessageCount: 0, unreadMessageCount: 0, // bubble number to display how many notifications someone has.
messageCountIntervalId: -1 messageCountIntervalId: -1 // javascript method interval id for getting messsage count.
}; };
}, },
componentDidMount: function () { componentDidMount: function () {
if (this.state.session.user) { if (this.state.session.user) {
this.getMessageCount(); this.getMessageCount();
var intervalId = setInterval(this.getMessageCount, 120000); var intervalId = setInterval(this.getMessageCount, 120000); // check for new messages every 2 mins.
this.setState({'messageCountIntervalId': intervalId}); this.setState({'messageCountIntervalId': intervalId});
} }
}, },

View file

@ -3,6 +3,10 @@ var React = require('react');
require('./subnavigation.scss'); require('./subnavigation.scss');
/**
* Container for a custom, horizontal list of navigation elements
* that can be displayed within a view or component.
*/
var SubNavigation = React.createClass({ var SubNavigation = React.createClass({
type: 'SubNavigation', type: 'SubNavigation',
render: function () { render: function () {

View file

@ -2,6 +2,9 @@ var ReactIntl = require('react-intl');
var customLanguages = require('../../custom-locales.json'); var customLanguages = require('../../custom-locales.json');
/**
* Add custom locales to react-intl if it doesn't have them.
*/
for (var locale in customLanguages) { for (var locale in customLanguages) {
ReactIntl.addLocaleData(customLanguages[locale]); ReactIntl.addLocaleData(customLanguages[locale]);
} }

View file

@ -1,6 +1,14 @@
var cookie = require('cookie'); var cookie = require('cookie');
var xhr = require('xhr'); var xhr = require('xhr');
/**
* Module that handles coookie interactions.
* (Cookies?!?! Jar?!?! Get it?!?! WE'RE AMAZING!!!!)
*
* get(name, callback) can be sync or async, as callback is optional
* set(name, value) synchronously sets the cookie
* use(name, uri, callback) can by sync or async, gets cookie from the uri if not there.
*/
var Jar = {}; var Jar = {};
Jar.get = function (name, callback) { Jar.get = function (name, callback) {

View file

@ -80,7 +80,7 @@ a:hover {
/* NOTE: Margin should match height in navigation.scss */ /* NOTE: Margin should match height in navigation.scss */
margin-top: 50px; margin-top: 50px;
background-color: $background-color; background-color: $background-color;
padding: 20px 1px; padding: 20px 0;
min-width: 100%; min-width: 100%;
min-height: 768px; min-height: 768px;
} }

View file

@ -6,6 +6,14 @@ var log = require('../lib/log.js');
var CookieMixinFactory = require('./cookieMixinFactory.jsx'); var CookieMixinFactory = require('./cookieMixinFactory.jsx');
/**
* Component mixin that constructs requests to the scratch api.
* Custom arguments:
* - useCsrf [boolean] handles unique csrf token retrieval for POST requests. This prevents
* CSRF forgeries (see: https://www.squarefree.com/securitytips/web-developers.html#CSRF)
*
* It also takes in other arguments specified in the xhr library spec.
*/
var Api = { var Api = {
mixins: [ mixins: [
// Provides useScratchcsrftoken // Provides useScratchcsrftoken
@ -36,7 +44,11 @@ var Api = {
if (err) log.error(err); if (err) log.error(err);
// Legacy API responses come as lists, and indicate to redirect the client like // Legacy API responses come as lists, and indicate to redirect the client like
// [{success: true, redirect: "/location/to/redirect"}] // [{success: true, redirect: "/location/to/redirect"}]
if (body && body[0] && 'redirect' in body[0]) window.location = body[0].redirect; try {
if ('redirect' in body[0]) window.location = body[0].redirect;
} catch (err) {
// do nothing
}
callback(err, body); callback(err, body);
}); });
}.bind(this); }.bind(this);

View file

@ -39,7 +39,7 @@ var About = React.createClass({
<ul> <ul>
<li> <li>
<h2><FormattedMessage id='about.whoUsesScratch' /></h2> <h2><FormattedMessage id='about.whoUsesScratch' /></h2>
<img src="/images/about/who-uses-scratch.jpg" /> <img src="/images/about/who-uses-scratch.jpg" alt="" />
<p><FormattedHTMLMessage id='about.whoUsesScratchDescription' /></p> <p><FormattedHTMLMessage id='about.whoUsesScratchDescription' /></p>
</li> </li>
@ -56,25 +56,25 @@ var About = React.createClass({
<li> <li>
<h2><FormattedMessage id='about.aroundTheWorld' /></h2> <h2><FormattedMessage id='about.aroundTheWorld' /></h2>
<img src="/images/about/around-the-world.png" /> <img src="/images/about/around-the-world.png" alt="" />
<p><FormattedHTMLMessage id='about.aroundTheWorldDescription' /></p> <p><FormattedHTMLMessage id='about.aroundTheWorldDescription' /></p>
</li> </li>
<li> <li>
<h2><FormattedMessage id='about.schools' /></h2> <h2><FormattedMessage id='about.schools' /></h2>
<img src="/images/about/scratch-in-schools.jpg" /> <img src="/images/about/scratch-in-schools.jpg" alt="" />
<p><FormattedHTMLMessage id='about.schoolsDescription' /></p> <p><FormattedHTMLMessage id='about.schoolsDescription' /></p>
</li> </li>
<li> <li>
<h2><FormattedMessage id='about.quotes' /></h2> <h2><FormattedMessage id='about.quotes' /></h2>
<img src="/images/about/quotes.gif" /> <img src="/images/about/quotes.gif" alt="Quotes about Scratch" />
<p><FormattedHTMLMessage id='about.quotesDescription' /></p> <p><FormattedHTMLMessage id='about.quotesDescription' /></p>
</li> </li>
<li> <li>
<h2><FormattedMessage id='about.research' /></h2> <h2><FormattedMessage id='about.research' /></h2>
<img src="/images/about/research-remix.png" /> <img src="/images/about/research-remix.png" alt="" />
<p><FormattedHTMLMessage id='about.researchDescription' /></p> <p><FormattedHTMLMessage id='about.researchDescription' /></p>
</li> </li>

View file

@ -14,112 +14,112 @@ var Credits = React.createClass({
<ul> <ul>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/167_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/167_170x170.png" alt="Mitchel Avatar" />
<span className="name">Mitchel Resnick</span> <span className="name">Mitchel Resnick</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/169_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/169_170x170.png" alt="Natalie Avatar" />
<span className="name">Natalie Rusk</span> <span className="name">Natalie Rusk</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/573207_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/573207_170x170.png" alt="Sayamindu Avatar" />
<span className="name">Sayamindu Dasgupta</span> <span className="name">Sayamindu Dasgupta</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/13682_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/13682_170x170.png" alt="Ricarose Avatar" />
<span className="name">Ricarose Roque</span> <span className="name">Ricarose Roque</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/2584924_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/2584924_170x170.png" alt="Ray Avatar" />
<span className="name">Ray Schamp</span> <span className="name">Ray Schamp</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/3484484_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/3484484_170x170.png" alt="Eric Avatar" />
<span className="name">Eric Schilling</span> <span className="name">Eric Schilling</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/3532363_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/3532363_170x170.png" alt="Chris Avatar" />
<span className="name">Chris Willis-Ford</span> <span className="name">Chris Willis-Ford</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/3581881_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/3581881_170x170.png" alt="Carl Avatar" />
<span className="name">Carl Bowman</span> <span className="name">Carl Bowman</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/4373707_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/4373707_170x170.png" alt="Matthew Avatar" />
<span className="name">Matthew Taylor</span> <span className="name">Matthew Taylor</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/4598206_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/4598206_170x170.png" alt="Kasia Avatar" />
<span className="name">Kasia Chmielinski</span> <span className="name">Kasia Chmielinski</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/703844_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/703844_170x170.png" alt="Tim Avatar" />
<span className="name">Tim Mickel</span> <span className="name">Tim Mickel</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/2752403_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/2752403_170x170.png" alt="Saskia Avatar" />
<span className="name">Saskia Leggett</span> <span className="name">Saskia Leggett</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/2755634_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/2755634_170x170.png" alt="Christan Avatar" />
<span className="name">Christan Balch</span> <span className="name">Christan Balch</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/5721684_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/5721684_170x170.png" alt="Randy Avatar" />
<span className="name">Randy Jou</span> <span className="name">Randy Jou</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/10866958_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/10866958_170x170.png" alt="Colby Avatar" />
<span className="name">Colby Gutierrez-Kraybill</span> <span className="name">Colby Gutierrez-Kraybill</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/1709047_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/1709047_170x170.png" alt="Andrew Avatar" />
<span className="name">Andrew Sliwinski</span> <span className="name">Andrew Sliwinski</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/default_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/default_170x170.png" alt="Ben Avatar" />
<span className="name">Ben Berg</span> <span className="name">Ben Berg</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/2286560_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/2286560_170x170.png" alt="Carmelo Avatar" />
<span className="name">Carmelo Presicce</span> <span className="name">Carmelo Presicce</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/default_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/default_170x170.png" alt="Moran Avatar" />
<span className="name">Moran Tsur</span> <span className="name">Moran Tsur</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/3661900_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/3661900_170x170.png" alt="Juanita Avatar" />
<span className="name">Juanita Buitrago</span> <span className="name">Juanita Buitrago</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/default_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/default_170x170.png" alt="Shruti Avatar" />
<span className="name">Shruti Mohnot</span> <span className="name">Shruti Mohnot</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/1915915_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/1915915_170x170.png" alt="Hannah Avatar" />
<span className="name">Hannah Cole</span> <span className="name">Hannah Cole</span>
</li> </li>
</ul> </ul>
@ -128,49 +128,54 @@ var Credits = React.createClass({
<ul> <ul>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/49156_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/49156_170x170.png" alt="Mark Avatar" />
<span className="name">Mark Goff</span> <span className="name">Mark Goff</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/159139_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/159139_170x170.png" alt="Franchette Avatar" />
<span className="name">Franchette Viloria</span> <span className="name">Franchette Viloria</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/246290_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/246290_170x170.png" alt="Sarah Avatar" />
<span className="name">Sarah Otts</span> <span className="name">Sarah Otts</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/2496866_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/2496866_170x170.png" alt="Jolie Avatar" />
<span className="name">Jolie Castellucci</span> <span className="name">Jolie Castellucci</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/3087865_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/3087865_170x170.png" alt="Andrea Avatar" />
<span className="name">Andrea Saxman</span> <span className="name">Andrea Saxman</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/373646_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/373646_170x170.png" alt="Dalton Avatar" />
<span className="name">Dalton Miner</span> <span className="name">Dalton Miner</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/586054_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/4836354_170x170.png" alt="Christina Avatar" />
<span className="name">Megan Haddadi</span>
</li>
<li>
<img src="//cdn.scratch.mit.edu/get_image/user/4836354_170x170.png" />
<span className="name">Christina Huang</span> <span className="name">Christina Huang</span>
</li> </li>
<li> <li>
<img src="//cdn.scratch.mit.edu/get_image/user/4747093_170x170.png" /> <img src="//cdn.scratch.mit.edu/get_image/user/4747093_170x170.png" alt="Annie Avatar" />
<span className="name">Annie Whitehouse</span> <span className="name">Annie Whitehouse</span>
</li> </li>
<li>
<img src="//cdn.scratch.mit.edu/get_image/user/1048810_170x170.png" alt="Linda Avatar" />
<span className="name">Linda Fernsel</span>
</li>
<li>
<img src="//cdn.scratch.mit.edu/get_image/user/14110644_170x170.png" alt="Lily Avatar" />
<span className="name">Lily Kim</span>
</li>
</ul> </ul>
<h2>Previous MIT Scratch Team Members</h2> <h2>Previous MIT Scratch Team Members</h2>
@ -180,8 +185,8 @@ var Credits = React.createClass({
Andrés Monroy-Hernández (who led the development of the first Scratch community website), Andrés Monroy-Hernández (who led the development of the first Scratch community website),
Amos Blanton, Champika Fernando, Shane Clements, Abdulrahman idlbi, Evelyn Eastmond, Amos Blanton, Champika Fernando, Shane Clements, Abdulrahman idlbi, Evelyn Eastmond,
Amon Millner, Eric Rosenbaum, Jay Silver, Karen Brennan, Leo Burd, Oren Zuckerman, Gaia Carini, Amon Millner, Eric Rosenbaum, Jay Silver, Karen Brennan, Leo Burd, Oren Zuckerman, Gaia Carini,
Michelle Chung, Margarita Dekoli, Dave Feinberg, Chris Graves, Tony Hwang, Di Liu, Tammy Stern, Michelle Chung, Margarita Dekoli, Dave Feinberg, Megan Haddadi, Chris Graves, Tony Hwang, Di Liu,
Lis Sylvan, and Claudia Urrea. Tammy Stern, Lis Sylvan, and Claudia Urrea.
</p> </p>
<h2>Design and Development Partners</h2> <h2>Design and Development Partners</h2>

View file

@ -3,8 +3,11 @@
#view { #view {
p { p {
line-height: 1.5rem; line-height: 1.5rem;
a {
word-wrap: break-word; /* Overrides: https://github.com/LLK/scratch-www/blob/develop/src/main.scss#L43-L47 */
}
} }
ul { ul {
display: flex; display: flex;
margin: 0; margin: 0;

View file

@ -27,12 +27,12 @@ var Splash = injectIntl(React.createClass({
], ],
getInitialState: function () { getInitialState: function () {
return { return {
projectCount: 10569070, projectCount: 'over 13 million', // gets the shared project count
activity: [], activity: [], // recent social actions taken by users someone is following
news: [], news: [], // gets news posts from the scratch Tumblr
featuredCustom: {}, featuredCustom: {}, // custom homepage rows, such as "Projects by Scratchers I'm Following"
featuredGlobal: {}, featuredGlobal: {}, // global homepage rows, such as "Featured Projects"
showEmailConfirmationModal: false, showEmailConfirmationModal: false, // flag that determines whether to show banner to request email conf.
refreshCacheStatus: 'notrequested' refreshCacheStatus: 'notrequested'
}; };
}, },