Compare commits

...

553 Commits

Author SHA1 Message Date
Ricky
b252e807be Update CNAME (#32413)
Fixes https://github.com/reactjs/react.dev/issues/7250
Fixes https://github.com/reactjs/react.dev/issues/7476
2025-02-17 23:38:08 -05:00
Jan Kassens
3b7b50f51f Update CNAME in gh-pages (#28983)
Fixes #28968
2024-05-03 10:05:51 -04:00
Brian Vaughn
d027eca037 Re-added CNAME 2017-09-29 08:37:03 -07:00
Brian Vaughn
c96fbd43c4 Removing CNAME file 2017-09-29 08:36:36 -07:00
Brian Vaughn
2f696fb289 Reprocess CNAME 2017-09-29 08:32:55 -07:00
Brian Vaughn
887ccf2534 Redirect users from the old gh-pages (Jekyll website) to reactjs.org (#10941)
* Deleted old Jekyll website
* Added CNAME that points to reactjs.org
2017-09-29 08:26:47 -07:00
facts-tracker
a34c28aaf9 Rebuild website 2017-09-27 11:44:51 -07:00
facts-tracker
f428b39aa1 Rebuild website 2017-09-27 09:24:15 -07:00
facts-tracker
32b3646202 Rebuild website 2017-09-27 09:14:32 -07:00
facts-tracker
cee6c8d54b Rebuild website 2017-09-27 05:39:53 -07:00
facts-tracker
a359efcd68 Rebuild website 2017-09-27 03:27:42 -07:00
facts-tracker
84506e9473 Rebuild website 2017-09-27 03:26:03 -07:00
facts-tracker
44485824f7 Rebuild website 2017-09-27 03:03:00 -07:00
facts-tracker
2586adb41c Rebuild website 2017-09-27 02:40:32 -07:00
facts-tracker
cff02339dd Rebuild website 2017-09-26 14:52:39 -07:00
Dan Abramov
a7ba8745cb Rebuild website 2017-09-26 22:13:51 +01:00
facts-tracker
4b8c8bfa7e Rebuild website 2017-09-26 14:02:13 -07:00
facts-tracker
e3dbfcd19d Rebuild website 2017-09-26 12:10:32 -07:00
facts-tracker
2cb3e9060f Rebuild website 2017-09-26 12:09:23 -07:00
facts-tracker
1daac009b3 Rebuild website 2017-09-26 11:55:58 -07:00
facts-tracker
546b9f6d59 Rebuild website 2017-09-26 11:18:35 -07:00
facts-tracker
37639a7c87 Rebuild website 2017-09-26 10:53:58 -07:00
Dan Abramov
eb0967749c Rebuild 2017-09-26 18:18:22 +01:00
Andrew Clark
9d80600b63 React 16 blog post and docs 2017-09-26 09:12:41 -07:00
Circle CI
021abead6f Rebuild website 2017-09-26 03:49:42 -07:00
Circle CI
383128d3d0 Rebuild website 2017-09-26 03:43:32 -07:00
Circle CI
f1ae286b15 Rebuild website 2017-09-25 17:26:53 -07:00
Dan Abramov
62b34d3573 Update error codes 2017-09-14 13:43:40 +01:00
Circle CI
56b0878f8c Rebuild website 2017-09-10 14:59:03 -07:00
Circle CI
eb38eace01 Rebuild website 2017-09-10 12:50:20 -07:00
Dan Abramov
af98484233 Rebuild website 2017-09-08 20:33:36 +01:00
Flarnie Marchan
cbf4858b39 Update error codes (#10622)
**what is the change?:**
This just updated the error codes on the docs.

For my future self, recording the steps it took to get here:
- On master, run `npm run build -- --extract-errors`
- Create a commit with those changes, and open a PR
  (https://github.com/facebook/react/pull/10619)
- Cherry-pick that commit onto 15-stable, and open a PR
  (https://github.com/facebook/react/pull/10621)
- Update the error codes on the `gh-pages branch` by doing the
  following based on docs
  (https://github.com/facebook/react/tree/master/docs#updating-facebookgithubioreact):
  - Set up a sister directory to `react` with `gh-pages` checked out,
    and call it `react-gh-pages`
  - In your `react` repo, with `15-stable` checked out and the
    error-codes update cherry-picked, run:
    `cd docs && bundle rake exec && bundle exec rake fetch_remotes && bundle exec rake release`
  - `cd ../react-gh-pages` and check in those changes, create a
    commit/PR
  - Manually test running the docs

**why make this change?:**
Even though this is just an RC, and not a final major release, we still
want the docs to be as up-to-date as possible.

**test plan:**
Run the docs locally and make sure things work.
(Flarnie will insert screenshots.)

**issue:**
https://github.com/facebook/react/issues/8854
2017-09-06 11:14:17 -07:00
Brian Vaughn
4221082c8e Cache-bust 404 for cross-origin-errors page 2017-08-14 14:21:57 -07:00
Brian Vaughn
2f89ee4cd5 Adding new page for cross-origin errors 2017-08-14 14:00:10 -07:00
Circle CI
c26241e8a1 Rebuild website 2017-08-05 05:25:59 -07:00
Circle CI
d62013bfe1 Rebuild website 2017-08-04 06:54:12 -07:00
Dan Abramov
c4efcecd98 Update error map 2017-08-04 00:38:15 +01:00
Dan Abramov
d6d0a17359 Rebuild 2017-08-03 16:15:30 +01:00
Circle CI
b26ebafdef Rebuild website 2017-07-27 16:00:49 -07:00
Circle CI
ea72bd2f92 Rebuild website 2017-07-27 15:52:00 -07:00
Dan Abramov
e2317870f1 Rebuild 2017-07-27 23:45:59 +01:00
Dan Abramov
7dc3b723cd Rebuild 2017-07-27 23:27:28 +01:00
Circle CI
dfa0f402d4 Rebuild website 2017-07-27 07:25:37 -07:00
Dan Abramov
c4aaff43f6 Rebuild 2017-07-27 10:50:56 +01:00
Dan Abramov
ae2fa05da5 Rebuild 2017-07-27 10:25:17 +01:00
Dan Abramov
5f47b8370c Rebuild website 2017-07-26 21:22:38 +01:00
Flarnie Marchan
8faba4cb2f Update error codes (#10292)
* Update error codes

A result of https://github.com/facebook/react/pull/10288

* Update the codes again
2017-07-26 12:50:19 -07:00
Circle CI
0be0c9ca72 Rebuild website 2017-07-26 12:43:31 -07:00
Dan Abramov
5f0258bc04 Rebuild 2017-07-11 14:09:11 +01:00
Circle CI
6941c84de2 Rebuild website 2017-06-29 08:13:33 -07:00
Dan Abramov
7bc32d9148 Rebuild 2017-06-26 18:29:28 +01:00
Circle CI
b1e6227e67 Rebuild website 2017-06-15 07:55:51 -07:00
Circle CI
f3f308ffaf Rebuild website 2017-06-14 16:18:51 -07:00
Circle CI
e7020c6106 Rebuild website 2017-06-13 16:05:17 -07:00
Circle CI
dc204718f0 Rebuild website 2017-06-13 10:18:57 -07:00
Circle CI
e4a9af594f Rebuild website 2017-06-13 07:42:06 -07:00
Dan Abramov
c22c398cec Rebuild 2017-06-10 00:06:12 +01:00
Dan Abramov
8862cb0e35 rebuild 2017-05-19 05:45:28 +01:00
Dan Abramov
4f3eb847b3 Rebuild manually 2017-05-10 08:25:57 +01:00
Dan Abramov
f11140a0a6 Rebuild website 2017-05-05 18:06:15 +01:00
Dan Abramov
c653f07ca8 Rebuild manually 2017-05-04 00:30:57 +01:00
Dan Abramov
7ceb3fdff9 Rebuild manually 2017-05-03 15:43:35 +01:00
Dan Abramov
3e9af29f7f Fix mobile layout 2017-05-03 15:39:38 +01:00
Dan Abramov
4eccc7696e Typo 2017-05-03 15:05:54 +01:00
Dan Abramov
788d9c8678 Rebuild manually 2017-05-03 11:06:23 +01:00
Dan Abramov
900ce3cc5f Rebuild manually 2017-05-01 17:25:07 +01:00
Dan Abramov
4b6a66900f Rebuild website 2017-04-26 17:34:36 +01:00
Dan Abramov
651edfe54d Rebuild website 2017-04-20 11:55:14 +01:00
Dan Abramov
636d515e62 Rebuild website 2017-04-19 12:34:25 +01:00
Dan Abramov
a3b3125c5c Rebuild website 2017-04-18 18:20:18 +01:00
Dan Abramov
d6ab9fde20 Rebuild website 2017-04-18 18:07:51 +01:00
Dan Abramov
99f82d7243 Rebuild website 2017-04-18 18:00:18 +01:00
Dan Abramov
3f2c6bebc0 Rebuild website 2017-04-18 17:54:28 +01:00
Dan Abramov
002af59ea3 Rebuild website 2017-04-18 17:45:07 +01:00
Dan Abramov
3ec1319427 Rebuild website 2017-04-18 17:42:29 +01:00
Dan Abramov
2fefe1edce Add CDN section back 2017-04-14 00:59:17 +01:00
Dan Abramov
784e29fd65 Temporarily remove CDN section
See https://twitter.com/amorgner/status/852660573364002816, there are issues with unpkg right now.
2017-04-14 00:51:22 +01:00
Dan Abramov
74d10acb03 Rebuild manually 2017-04-13 21:52:17 +01:00
Dan Abramov
0a7d248cc5 Rebuild website 2017-04-13 20:57:29 +01:00
Dan Abramov
0a095d55f4 Rebuild 2017-04-13 15:28:37 +01:00
Dan Abramov
08f6e2f603 Rebuild manually 2017-04-12 00:06:02 +01:00
Dan Abramov
a1457be82f Rebuild manually 2017-04-11 22:10:02 +01:00
Dan Abramov
724d87ea40 Update manually 2017-04-08 04:11:46 +01:00
Andrew Clark
87384331e8 Rebuild the website for 15.5.0 2017-04-07 14:48:05 -07:00
Circle CI
0db185e5d7 Rebuild website 2017-03-12 08:49:40 -07:00
Circle CI
9774f127f8 Rebuild website 2017-03-09 19:08:17 -08:00
Dan Abramov
53970c95be Rebuild 2017-02-19 12:12:06 +00:00
Dan Abramov
3842de7f5f Rebuild 2017-02-19 11:14:33 +00:00
Dan Abramov
a941c9928e Rebuild 2017-02-06 17:16:37 +00:00
Circle CI
a0924bb67a Rebuild website 2017-02-02 05:33:01 -08:00
Circle CI
ac6c3d3eae Rebuild website 2017-01-23 15:58:27 -08:00
Circle CI
9c7bb68d01 Rebuild website 2017-01-23 10:35:15 -08:00
Circle CI
451cb4c623 Rebuild website 2017-01-23 09:27:21 -08:00
Dan Abramov
e8ea302025 Rebuild the website manually 2017-01-12 16:06:32 +00:00
Dan Abramov
6bb7a6c60e Rebuild docs 2017-01-06 20:28:00 +00:00
Dan Abramov
1a60ccde97 Rebuild docs 2017-01-04 18:21:44 +00:00
Ben Alpert
ed3c401c9e Rebuild docs with 17f8e94 2016-12-07 15:46:53 -08:00
Dan Abramov
be1d6848f0 Rebuild the website manually 2016-11-19 18:29:23 +00:00
Dan Abramov
5934242b7e Rebuild website 2016-11-16 14:53:46 +00:00
Travis CI
e19372d5f4 Rebuild website 2016-11-09 02:58:31 +00:00
Travis CI
58c129dff9 Rebuild website 2016-11-09 01:00:46 +00:00
Travis CI
f5b5d9a5f3 Rebuild website 2016-10-27 12:18:24 +00:00
Dan Abramov
cd443ca3da Rebuild website manually 2016-10-27 02:14:19 +01:00
Travis CI
5b7af23023 Rebuild website 2016-10-24 14:55:58 +00:00
Travis CI
2039cf87ee Rebuild website 2016-10-23 14:51:57 +00:00
Travis CI
7149218fa4 Rebuild website 2016-10-23 13:40:12 +00:00
Travis CI
cb8283877a Rebuild website 2016-10-23 12:54:32 +00:00
Travis CI
107c74cd7a Rebuild website 2016-10-22 21:11:05 +00:00
Ben Alpert
5cef4e9780 Revert "Rebuild website"
This reverts commit 4aaf555d80.
2016-10-21 14:29:03 -07:00
Travis CI
4aaf555d80 Rebuild website 2016-10-21 21:17:00 +00:00
Dan Abramov
dc84614b0c Rebuild website manually 2016-10-21 22:01:35 +01:00
Dan Abramov
625fc71ebb Rebuild website manually 2016-10-21 21:51:45 +01:00
Dan Abramov
659cef8a98 Rebuild website manually 2016-10-21 21:37:29 +01:00
Travis CI
6cc07e595a Rebuild website 2016-10-11 18:14:29 +00:00
Travis CI
fec4df7150 Rebuild website 2016-10-10 16:32:22 +00:00
Travis CI
88fbe7cc58 Rebuild website 2016-10-05 02:09:02 +00:00
Travis CI
7eb00d77e9 Rebuild website 2016-10-04 21:03:41 +00:00
Dan Abramov
6784bf841e Rebuild the website by hand 2016-10-04 19:44:42 +01:00
Travis CI
7268e9423f Rebuild website 2016-10-04 11:54:07 +00:00
Travis CI
309de75dc5 Rebuild website 2016-10-04 11:25:53 +00:00
Travis CI
3dc13b49b9 Rebuild website 2016-10-04 11:23:12 +00:00
Travis CI
96540f5afd Rebuild website 2016-10-03 22:58:27 +00:00
Travis CI
6b504aa08b Rebuild website 2016-10-03 21:35:05 +00:00
Travis CI
e0d718e49c Rebuild website 2016-10-03 21:07:11 +00:00
Travis CI
01651c2f14 Rebuild website 2016-10-03 20:56:41 +00:00
Travis CI
f647c99f0a Rebuild website 2016-10-03 20:28:46 +00:00
Travis CI
1e4e30f9a2 Rebuild website 2016-10-03 18:25:57 +00:00
Travis CI
139a6d9f9c Rebuild website 2016-09-29 10:36:55 +00:00
Travis CI
742ad40cec Rebuild website 2016-09-28 20:47:00 +00:00
Dan Abramov
d161c0a805 Rebuild website manually 2016-09-28 10:24:22 +01:00
Travis CI
9b6bedc109 Rebuild website 2016-09-28 02:50:29 +00:00
Dan Abramov
887c2a7386 Rebuild website manually 2016-09-27 23:19:47 +01:00
Travis CI
86561ea4e6 Rebuild website 2016-09-26 23:11:46 +00:00
Travis CI
760706b92b Rebuild website 2016-09-19 22:47:11 +00:00
Travis CI
92ffaf51d5 Rebuild website 2016-09-19 18:01:08 +00:00
Travis CI
57e56e8175 Rebuild website 2016-09-06 22:51:52 +00:00
Travis CI
8a6f8eddde Rebuild website 2016-09-03 17:17:43 +00:00
Paul O’Shannessy
2d90a5ba61 Rebuild website 2016-08-19 11:57:12 -07:00
Travis CI
7c78a4d0d4 Rebuild website 2016-08-19 17:44:40 +00:00
Travis CI
d3fe28ccd0 Rebuild website 2016-08-05 22:03:32 +00:00
Paul O’Shannessy
aac960738a Rebuild website 2016-08-05 11:08:49 -07:00
Travis CI
d3e0241469 Rebuild website 2016-08-02 20:54:26 +00:00
Travis CI
22e6d6a6d2 Rebuild website 2016-07-29 23:33:35 +00:00
Travis CI
1a1d339466 Rebuild website 2016-07-29 23:25:43 +00:00
Paul O’Shannessy
3ac0f9fc9a Rebuild website 2016-07-29 14:49:58 -07:00
Travis CI
e71c772d12 Rebuild website 2016-07-29 18:42:31 +00:00
Travis CI
00b883302c Rebuild website 2016-07-28 18:44:47 +00:00
Travis CI
e33d5e7bb1 Rebuild website 2016-07-22 20:26:56 +00:00
Travis CI
7217ae2671 Rebuild website 2016-07-22 16:01:45 +00:00
Travis CI
994651f5f9 Rebuild website 2016-07-20 18:55:19 +00:00
Travis CI
f23fd9c145 Rebuild website 2016-07-16 14:04:32 +00:00
Dan Abramov
b12a61d7c6 Rebuild website 2016-07-14 21:31:55 +01:00
Travis CI
f40e975f3f Rebuild website 2016-07-14 20:09:03 +00:00
Dan Abramov
017cc60cf3 Rebuild website 2016-07-14 20:43:11 +01:00
Travis CI
b0e883b4dc Rebuild website 2016-07-14 13:28:45 +00:00
Travis CI
9cbc399916 Rebuild website 2016-07-14 02:10:06 +00:00
Travis CI
ecf1fa5827 Rebuild website 2016-07-14 02:06:29 +00:00
Travis CI
cf707bc9f7 Rebuild website 2016-07-14 01:32:51 +00:00
Dan Abramov
b9cae83735 Rebuild website 2016-07-13 18:48:38 +01:00
Dan Abramov
a622002aed Rebuild website 2016-07-13 18:01:36 +01:00
Dan Abramov
f5b00d332a Rebuild website 2016-07-13 17:48:17 +01:00
Travis CI
188230ed62 Rebuild website 2016-07-12 01:57:29 +00:00
Travis CI
a5c102546b Rebuild website 2016-07-08 22:46:54 +00:00
Travis CI
ee785cea3a Rebuild website 2016-07-05 21:42:54 +00:00
Travis CI
e6b4020059 Rebuild website 2016-07-01 19:00:57 +00:00
Travis CI
aa50560d83 Rebuild website 2016-06-30 07:18:49 +00:00
Travis CI
1f48f2a157 Rebuild website 2016-06-21 03:24:52 +00:00
Travis CI
4c213db337 Rebuild website 2016-06-14 22:07:50 +00:00
Travis CI
7327d9fc5f Rebuild website 2016-06-13 19:42:24 +00:00
Travis CI
c636a24ab6 Rebuild website 2016-06-11 02:49:21 +00:00
Travis CI
064d1cf34a Rebuild website 2016-06-09 02:33:04 +00:00
Paul O’Shannessy
35ebcd3c55 Rebuild website 2016-06-07 16:35:54 -07:00
Travis CI
1c8c0bb99e Rebuild website 2016-06-03 21:48:37 +00:00
Travis CI
d6d06c6ecc Rebuild website 2016-06-03 21:43:52 +00:00
Travis CI
bd8054ef05 Rebuild website 2016-06-01 18:44:10 +00:00
Travis CI
725a0679b2 Rebuild website 2016-05-31 19:17:40 +00:00
Travis CI
c7e6ff57f6 Rebuild website 2016-05-24 19:07:03 +00:00
Travis CI
ea4f9ef2c6 Rebuild website 2016-05-20 23:10:59 +00:00
Travis CI
bbc2a37ab8 Rebuild website 2016-05-16 20:06:23 +00:00
Travis CI
d23d35d15a Rebuild website 2016-05-10 01:29:04 +00:00
Travis CI
eef19d1a04 Rebuild website 2016-05-09 23:47:37 +00:00
Travis CI
92ec06b65c Rebuild website 2016-04-30 00:43:29 +00:00
Travis CI
e2d954d1e7 Rebuild website 2016-04-22 20:15:55 +00:00
Travis CI
1d9e1aaf2d Rebuild website 2016-04-22 17:42:50 +00:00
Travis CI
a92c60c8cc Rebuild website 2016-04-14 22:59:44 +00:00
Travis CI
1ecf70469d Rebuild website 2016-04-09 01:26:52 +00:00
Travis CI
73ee739d02 Rebuild website 2016-04-08 19:19:28 +00:00
Travis CI
fadd204d35 Rebuild website 2016-04-08 19:02:14 +00:00
Paul O’Shannessy
dd653e305d Update website for 15.0.1 2016-04-08 11:30:23 -07:00
Travis CI
13a7fc0d07 Rebuild website 2016-04-08 01:17:20 +00:00
Travis CI
4f9905e4d3 Rebuild website 2016-04-07 23:56:47 +00:00
Travis CI
42979fa4ff Rebuild website 2016-04-07 23:40:07 +00:00
Paul O’Shannessy
db8498e15c rebuild website 2016-04-07 15:29:14 -07:00
Paul O’Shannessy
1b94dd8f40 Update site for v15 2016-04-07 14:33:54 -07:00
Travis CI
181b8454b1 Rebuild website 2016-03-29 22:26:28 +00:00
Travis CI
01ac4e13d3 Rebuild website 2016-03-29 21:26:34 +00:00
Travis CI
bf916998f2 Rebuild website 2016-03-29 20:05:41 +00:00
Travis CI
7ccf5eebc0 Rebuild website 2016-03-29 17:36:50 +00:00
Paul O’Shannessy
fec4d82416 Add 0.14.8 download 2016-03-29 10:27:07 -07:00
Travis CI
6d2cc9121a Rebuild website 2016-03-29 17:02:28 +00:00
Paul O’Shannessy
853784bc3f revert js 2016-03-21 18:05:21 -07:00
Travis CI
612ab8f7bd Rebuild website 2016-03-22 00:54:32 +00:00
Paul O’Shannessy
29d9a13ffb revert JS again
I donn't have insight into the queue and don't want to leave the site
broken forever.
2016-03-21 16:27:40 -07:00
Travis CI
4c2ff9ca34 Rebuild website 2016-03-21 19:38:37 +00:00
Paul O’Shannessy
63dff641cf Update website 2016-03-21 11:28:34 -07:00
Dan Abramov
f918eaa38c Restore JS yet again 2016-03-17 00:02:43 +00:00
Travis CI
49f47947c5 Rebuild website 2016-03-16 23:30:40 +00:00
Paul O’Shannessy
bde2c2905b restore js again 2016-03-09 12:09:30 -08:00
Travis CI
781cb6db90 Rebuild website 2016-03-09 19:43:03 +00:00
Paul O’Shannessy
c4c17f4f4f re-add removed JS again 2016-03-08 18:55:09 -08:00
Travis CI
6aa47d0ebf Rebuild website 2016-03-08 02:16:50 +00:00
Travis CI
81c8a0732d Rebuild website 2016-03-08 01:55:35 +00:00
Paul O’Shannessy
dfbee7f109 Update website 2016-03-07 17:17:10 -08:00
Paul O’Shannessy
2714c5d6f2 Restore deleted JS files 2016-03-07 13:37:08 -08:00
Travis CI
2402eb5a99 Rebuild website 2016-03-07 20:28:40 +00:00
Travis CI
d957c00dca Rebuild website 2016-02-25 07:41:47 +00:00
Travis CI
0845e3efae Rebuild website 2016-02-19 20:54:06 +00:00
Travis CI
3806959a6d Rebuild website 2016-02-19 19:41:35 +00:00
Travis CI
0b18dbc001 Rebuild website 2016-02-13 02:51:01 +00:00
Travis CI
f788099ab7 Rebuild website 2016-02-08 22:24:32 +00:00
Travis CI
e52a41c7be Rebuild website 2016-02-08 21:59:07 +00:00
Paul O’Shannessy
45efe53fd2 Rebuild website 2016-01-28 12:24:39 -08:00
Travis CI
7610b39759 Rebuild website 2016-01-28 18:43:23 +00:00
Travis CI
94a04746c2 Rebuild website 2016-01-12 17:49:07 +00:00
Travis CI
b6a74e8abe Rebuild website 2016-01-12 17:34:35 +00:00
Travis CI
58ccca7f75 Rebuild website 2016-01-08 18:33:53 +00:00
Travis CI
e97536deb5 Rebuild website 2016-01-06 23:57:13 +00:00
Travis CI
6851ef63b7 Rebuild website 2015-12-29 22:43:14 +00:00
Travis CI
e559120849 Rebuild website 2015-12-29 22:20:21 +00:00
Travis CI
c9cf3bb0c5 Rebuild website 2015-12-29 22:03:15 +00:00
Travis CI
b1a1e1440b Rebuild website 2015-12-29 22:01:57 +00:00
Travis CI
89789f974b Rebuild website 2015-12-23 20:55:57 +00:00
Travis CI
e4e3cb9125 Rebuild website 2015-12-21 20:22:57 +00:00
Travis CI
d94efdaa96 Rebuild website 2015-12-18 20:46:52 +00:00
Travis CI
507c52b220 Rebuild website 2015-12-16 17:59:48 +00:00
Travis CI
330a594d4b Rebuild website 2015-12-04 22:53:51 +00:00
Travis CI
13b86c3220 Rebuild website 2015-12-04 21:04:39 +00:00
Paul O’Shannessy
ce88118f88 Rebuild website 2015-12-04 12:05:14 -08:00
Travis CI
e6e5795dab Rebuild website 2015-12-01 20:05:27 +00:00
Travis CI
b12825dee9 Rebuild website 2015-11-19 02:21:12 +00:00
Travis CI
9bd86524e2 Rebuild website 2015-11-18 18:42:37 +00:00
Travis CI
609ba0776b Rebuild website 2015-11-13 00:15:47 +00:00
Travis CI
31f223fc9e Rebuild website 2015-11-12 23:05:29 +00:00
Travis CI
8b569f5573 Rebuild website 2015-11-10 18:56:55 +00:00
Travis CI
0ea0bd7d2d Rebuild website 2015-11-03 01:24:38 +00:00
Travis CI
83ba002377 Rebuild website 2015-11-02 19:57:29 +00:00
Travis CI
99a02b92d7 Rebuild website 2015-10-31 19:23:04 +00:00
Travis CI
8fd061c819 Rebuild website 2015-10-28 21:34:43 +00:00
Travis CI
9bc9c80617 Rebuild website 2015-10-27 22:48:54 +00:00
Travis CI
3c2848d785 Rebuild website 2015-10-20 23:23:15 +00:00
Travis CI
c022e0f61b Rebuild website 2015-10-19 19:56:43 +00:00
Travis CI
49711c27aa Rebuild website 2015-10-19 18:19:13 +00:00
Travis CI
47d9b441d4 Rebuild website 2015-10-19 14:46:15 +00:00
Travis CI
d9b99c2d6f Rebuild website 2015-10-13 17:58:19 +00:00
Travis CI
b06a057dd4 Rebuild website 2015-10-12 22:16:53 +00:00
Travis CI
a5ea866492 Rebuild website 2015-10-11 02:27:59 +00:00
Travis CI
2eb3bdb7a3 Rebuild website 2015-10-09 23:03:30 +00:00
Travis CI
19c9ec1544 Rebuild website 2015-10-09 22:56:16 +00:00
Travis CI
3ead8e3d11 Rebuild website 2015-10-09 19:35:31 +00:00
Travis CI
6d6208a7fa Rebuild website 2015-10-08 20:26:17 +00:00
Travis CI
15707df9bc Rebuild website 2015-10-08 00:18:24 +00:00
Travis CI
a0b2f21987 Rebuild website 2015-10-07 20:06:38 +00:00
Travis CI
ea47c6c9f3 Rebuild website 2015-10-07 19:28:51 +00:00
Travis CI
76c780f3a9 Rebuild website 2015-10-07 17:31:12 +00:00
Travis CI
556dfa96c5 Rebuild website 2015-10-02 19:13:37 +00:00
Travis CI
ea6b0b9e56 Rebuild website 2015-09-26 03:34:40 +00:00
Travis CI
547c811365 Rebuild website 2015-09-22 18:15:43 +00:00
Travis CI
d26a0ceb1a Rebuild website 2015-09-15 03:44:46 +00:00
Travis CI
9ce9d5913b Rebuild website 2015-09-15 02:47:29 +00:00
Travis CI
83e53e59de Rebuild website 2015-09-14 15:38:09 +00:00
Travis CI
30dec0b6a0 Rebuild website 2015-09-10 20:30:20 +00:00
Travis CI
fa87fc1234 Rebuild website 2015-09-10 17:07:37 +00:00
Travis CI
3f52012b40 Rebuild website 2015-09-10 16:52:05 +00:00
Travis CI
b0091b516c Rebuild website 2015-09-02 22:20:42 +00:00
Travis CI
1f0e950538 Rebuild website 2015-08-31 18:29:13 +00:00
Travis CI
a42b28ff58 Rebuild website 2015-08-25 16:57:28 +00:00
Travis CI
fbeace0f81 Rebuild website 2015-08-25 16:48:55 +00:00
Travis CI
7a99d421c9 Rebuild website 2015-08-20 20:35:14 +00:00
Travis CI
5724abb1ed Rebuild website 2015-08-20 20:17:23 +00:00
Travis CI
0898f44329 Rebuild website 2015-08-19 23:37:02 +00:00
Travis CI
24a6ed9201 Rebuild website 2015-08-14 00:17:16 +00:00
Travis CI
3ee0f9c321 Rebuild website 2015-08-12 19:11:47 +00:00
Jim
f9b2f3f53e Merge pull request #4617 from marcuswhybrow/patch-1
Fix grammar in "Why Relay"
2015-08-12 07:51:22 -07:00
Marcus Whybrow
ed7f3299fd Fix grammar in "Why Relay" 2015-08-12 15:29:26 +01:00
Travis CI
562937ce28 Rebuild website 2015-08-11 19:33:03 +00:00
Travis CI
abb04d53f4 Rebuild website 2015-08-08 02:33:17 +00:00
Travis CI
083c2fa33f Rebuild website 2015-08-03 22:19:54 +00:00
Travis CI
eae015d0ee Rebuild website 2015-07-25 00:42:17 +00:00
Travis CI
e46589f784 Rebuild website 2015-07-20 15:34:11 +00:00
Travis CI
0b5cb01d2f Rebuild website 2015-07-17 21:25:35 +00:00
Travis CI
0c788b272f Rebuild website 2015-07-15 14:37:34 +00:00
Travis CI
9aa593096e Rebuild website 2015-07-08 17:26:34 +00:00
Travis CI
cef5a9d791 Rebuild website 2015-07-04 15:27:40 +00:00
Travis CI
480d599895 Rebuild website 2015-07-03 08:56:34 +00:00
Travis CI
813a536d0f Rebuild website 2015-06-30 13:59:44 +00:00
Travis CI
33ac4ccc76 Rebuild website 2015-06-27 10:03:17 +00:00
Travis CI
f409f18c0f Rebuild website 2015-06-25 03:26:43 +00:00
Travis CI
658bd6a67d Rebuild website 2015-06-23 05:42:46 +00:00
Travis CI
d284e50900 Rebuild website 2015-06-20 23:52:34 +00:00
Ben Alpert
459e68f93b Merge pull request #4183 from jstoja/patch-1
Update graphql-introduction.html
2015-06-20 16:47:58 -07:00
Julien Bordellier
5bdd8f8640 Update graphql-introduction.html
There was a tiny mistake line 170 s/and/an/ :)
2015-06-20 16:50:01 +02:00
Travis CI
23c85e45b7 Rebuild website 2015-06-16 17:59:43 +00:00
Travis CI
e3aea2ee0c Rebuild website 2015-06-13 04:53:37 +00:00
Travis CI
33c1227063 Rebuild website 2015-06-12 23:49:59 +00:00
Travis CI
0fdb244c6d Rebuild website 2015-06-10 23:02:35 +00:00
Travis CI
fed91d4a82 Rebuild website 2015-06-09 03:18:41 +00:00
Travis CI
7f80adf253 Rebuild website 2015-06-01 21:34:08 +00:00
Travis CI
c24c9e602c Rebuild website 2015-05-22 20:22:20 +00:00
Travis CI
d8cfaf830f Rebuild website 2015-05-21 18:51:57 +00:00
Travis CI
a7c4734802 Rebuild website 2015-05-13 22:21:23 +00:00
Travis CI
8e14fbdc0e Rebuild website 2015-05-11 05:17:12 +00:00
Travis CI
5b5b7d100d Rebuild website 2015-05-08 23:40:41 +00:00
Travis CI
431525248b Rebuild website 2015-05-02 00:02:59 +00:00
Travis CI
248d304421 Rebuild website 2015-05-01 19:37:36 +00:00
Travis CI
4ff6c8ad51 Rebuild website 2015-05-01 18:25:24 +00:00
Travis CI
e3075c6cbc Rebuild website 2015-05-01 18:11:09 +00:00
Travis CI
be7d5de803 Rebuild website 2015-04-23 00:09:10 +00:00
Travis CI
bf961b2c2a Rebuild website 2015-04-20 18:14:12 +00:00
Travis CI
c002957436 Rebuild website 2015-04-18 23:10:25 +00:00
Travis CI
fddf68752e Rebuild website 2015-04-18 22:40:10 +00:00
Travis CI
55c84b449e Rebuild website 2015-04-18 01:15:06 +00:00
Christopher Chedeau
bcf765dcf3 React Native v0.4 2015-04-17 09:15:26 -07:00
Travis CI
9424d2be52 Rebuild website 2015-04-14 21:49:45 +00:00
Travis CI
c9767eaae4 Rebuild website 2015-04-14 00:11:27 +00:00
Travis CI
52f253cfc8 Rebuild website 2015-04-13 23:17:59 +00:00
Travis CI
f9acc6517a Rebuild website 2015-04-08 18:16:02 +00:00
Travis CI
75bb7f7355 Rebuild website 2015-04-03 17:54:56 +00:00
Travis CI
0e591c19ca Rebuild website 2015-04-03 16:17:27 +00:00
Travis CI
c9d8f02c8e Rebuild website 2015-04-01 00:11:10 +00:00
Travis CI
0640447cb3 Rebuild website 2015-03-30 18:27:44 +00:00
Christopher Chedeau
d4eed6320c Round-up 26 2015-03-30 08:05:58 -07:00
Ben Alpert
237cdbb2fc Rebuild docs 2015-03-26 12:31:15 -07:00
Ben Alpert
75bdef3e45 Rebuild docs 2015-03-26 10:11:35 -07:00
Ben Alpert
4eee8efbae Rebuild docs 2015-03-26 10:09:34 -07:00
Paul O’Shannessy
043584fc6c Update for relay blog post 2015-03-19 13:07:03 -07:00
Paul O’Shannessy
8e5f7ea1d1 v0.13.1 2015-03-16 16:53:07 -07:00
Paul O’Shannessy
0a779234d2 Includes #3419, #3422, #3394 2015-03-16 16:26:40 -07:00
Paul O’Shannessy
de204315c6 v0.13.0 2015-03-10 14:54:21 -07:00
Jim
37d795f9bc Merge pull request #3319 from rynclark/patch-2
Fix typo (Clark not Clarke)
2015-03-05 03:04:21 -08:00
Ryan Clark
e3ff7dfab3 Update index.html
Fixed my name again - didn't realise it was on this page too.
2015-03-05 10:04:55 +00:00
Paul O’Shannessy
18b46dbb62 Merge pull request #3311 from rynclark/patch-1
Update community-roundup-25.html
2015-03-04 12:28:04 -08:00
Ryan Clark
88b3ce1e7d Update community-roundup-25.html
Fixed my name!
2015-03-04 19:11:55 +00:00
Christopher Chedeau
fd857723bd update of round-up 25 2015-03-04 09:26:09 -08:00
Christopher Chedeau
4c96ea3517 roundup 25 2015-03-04 09:11:05 -08:00
Paul O’Shannessy
e3d9944ed0 Facebook, not FaceBook 2015-03-03 12:48:43 -08:00
Paul O’Shannessy
d3d258ba5b v0.13 rc2 blog post 2015-03-03 12:44:50 -08:00
Paul O’Shannessy
e1fd23515a v0.13 RC blog post 2015-02-24 14:11:54 -08:00
Paul O’Shannessy
33f553da2c 4d90b9bdf3 and #3255 2015-02-24 12:48:57 -08:00
Paul O’Shannessy
331320b80b Streamlining React Elements blog post (#3250) 2015-02-24 11:29:56 -08:00
Paul O’Shannessy
2e578d1f64 Relay blog post (#3174) 2015-02-20 09:48:30 -08:00
Paul O’Shannessy
cfb998a906 Add #3190 2015-02-18 21:42:56 -08:00
Paul O’Shannessy
2af1bffce1 Update to latest
Includes #3168, #3167, #3134, #3089, #3082, #3078, #3074, #3073, #3046, #3166
2015-02-18 13:44:53 -08:00
Christopher Chedeau
738e33cd7f update image perf 2015-02-11 12:46:43 -08:00
Christopher Chedeau
0febbe14de Tweaks on advanced performance 2015-02-11 11:15:31 -08:00
Christopher Chedeau
3b45fd540f advanced performance 2015-02-11 10:57:48 -08:00
Paul O’Shannessy
4c758f484e Update to latest
Includes #3036, #3032, #3016, #3013, #3011, #3007, #3001, #2999, #2997, #2987, #2969, #2965, #2962, #2961
2015-02-04 15:36:53 -08:00
Paul O’Shannessy
0a207cc1f1 Merge pull request #2971 from koistya/patch-1
Fix a typo in 2015/01/27 blog post
2015-01-29 16:11:10 -08:00
Konstantin Tarkus
6102e015c3 Fix a typo in 2015/01/27 blog post 2015-01-28 15:50:23 +03:00
Paul O’Shannessy
20700b9e67 A couple small updates to the 0.13 beta blog post 2015-01-28 00:01:32 -08:00
Paul O’Shannessy
780f01a993 0.13 beta blog post 2015-01-27 23:08:27 -08:00
Paul O’Shannessy
3d4afaaa5d Update to latest
Includes 92e361709c (not #2874), #2875, #2881, #2890, #2902, #2903
2015-01-22 13:20:10 -08:00
Paul O’Shannessy
870def7781 Update to latest
Includes #2859, #2824, #2801, #2795, #2791, #2788, #2773, #2760, #2759, #2734, #2733, #2707, #2675, #2360, #2297
2015-01-16 16:40:06 -08:00
Paul O’Shannessy
5ab16ba05d Fix typo in blog post - #2752 2014-12-19 14:31:54 -08:00
Paul O’Shannessy
f1b8acc7b5 Diversity Scholarship blog post 2014-12-19 13:24:03 -08:00
Paul O’Shannessy
dd499fdee2 v0.12.2 2014-12-18 12:33:48 -08:00
Paul O’Shannessy
2fb27e9598 Update to latest
Includes #2718, #2705, #2694, #2689, #2679, #2672, #2671
2014-12-16 12:41:09 -08:00
Paul O’Shannessy
1dcaad3f8e Update to latest
Includes: #2630, #2633, #2616, #2623, #2622, #2636, #2615, #2649, #2639, #2635
2014-12-03 15:01:13 -08:00
Steven Luscher
6fe2c0c425 Community #24: Regenerated for the correct spelling of prism, a better Carousel link, and less whale-talk. 2014-11-24 18:31:27 -08:00
Steven Luscher
58d3bf0352 Generated Community Roundup #24 2014-11-24 18:04:00 -08:00
Christopher Chedeau
f271ce3b03 add recorded 2014-11-24 11:29:58 +00:00
Christopher Chedeau
0a9b79096b react conf updates 2014-11-24 10:35:33 +00:00
Paul O’Shannessy
12b8de2861 Update to latest
Includes #2473, #2475, #2498, #2514, #2544, #2554, #2555
2014-11-19 15:37:29 +00:00
Paul O’Shannessy
de16bd5883 0.12.1 2014-11-18 09:11:02 +01:00
Christopher Chedeau
93572503dd JSXTransformer build with stripping type annotations 2014-11-15 17:32:36 -08:00
Paul O’Shannessy
23d90ff554 Update to latest
Includes #2463, #2434
2014-11-05 16:22:36 -08:00
Paul O’Shannessy
ffa032b146 Update to latest
Includes #2419, #2428, #2418, #2443, #2433
2014-10-31 11:24:54 -07:00
Paul O’Shannessy
654b347d58 v0.12.0 2014-10-28 11:36:52 -07:00
Paul O’Shannessy
868c19523d React.js conf blog post 2014-10-27 10:16:01 -07:00
Paul O’Shannessy
252b153e86 Update to latest
* 90d1aeb
* be468c2
2014-10-20 16:23:06 -07:00
Christopher Chedeau
9220805ebf rename roundup 2014-10-17 08:18:00 -07:00
Christopher Chedeau
324d956969 round-up 23 2014-10-17 08:10:32 -07:00
Paul O’Shannessy
32525e5797 Update docs
* move React Elements post to right place
* 0.12 rc1
2014-10-16 15:37:25 -07:00
Paul O’Shannessy
76c5058590 React Elements blog post 2014-10-14 11:04:27 -07:00
Paul O’Shannessy
c149e9594d Update to latest.
* c8d5106
* 8c7cf04
* ce03543
* 995d0e5
2014-09-29 13:47:15 -07:00
Paul O’Shannessy
023e79f085 Update to latest
99a45a59cc...e179f7b19e
2014-09-24 16:59:54 -07:00
fisherwebdev
5eca790f0a publishing Testing Flux Applications blog post
GitHub154
[react] fisherwebdev closed pull request #2234: [blog] testing flux applications (master...master) https://github.com/facebook/react/pull/2234
GitHub183
[react] fisherwebdev pushed 2 new commits to master: 67eeed601b...6f54ed71da
GitHub183
react/master 9952a54 fisherwebdev: [blog] testing flux applications
GitHub183
react/master 6f54ed7 Bill Fisher: Merge pull request #2234 from fisherwebdev/master...
ChanServ has changed mode: +o yungsters
GitHub16
[react] fisherwebdev pushed 1 new commit to 0.11-stable: 99a45a59cc
GitHub16
react/0.11-stable 99a45a5 fisherwebdev: [blog] testing flux applications
2014-09-24 13:39:13 -07:00
Paul O’Shannessy
7fa746f7c8 v0.11.2 2014-09-16 11:12:31 -07:00
Christopher Chedeau
37843c4706 roundup 22 2014-09-12 11:37:40 -07:00
Paul O’Shannessy
f60002cd14 pull in #2147 2014-09-04 16:28:27 -07:00
Paul O’Shannessy
c031dd3b10 JSX blog post 2014-09-03 16:04:15 -07:00
Paul O’Shannessy
4bb397d6e5 Latest sync of docs 2014-09-03 15:58:17 -07:00
Paul O’Shannessy
118e64c400 Update Jekyll (#2035) 2014-08-13 13:15:29 -07:00
Paul O’Shannessy
62c4231389 Sync latest changes
Use `bundle exec rake release` to make sure the right gem versions are
used, which reverts some of the trivial markdown related changes from last time.
2014-08-13 13:10:08 -07:00
Paul O’Shannessy
741eea6c73 Sync latest changes to docs
Also removes stray es5-shim/sham files (and perhaps a slightly different
redcarpet version resulting in different markdown parsing...)
2014-08-12 15:26:53 -07:00
Christopher Chedeau
4ca56fea73 typo "refere"->"ence" 2014-08-03 18:52:46 +02:00
Christopher Chedeau
b63c215ac9 community round-up #21 2014-08-03 18:31:51 +02:00
Vjeux
a99bc749cb backgorund image + typo 2014-07-30 21:08:04 +02:00
Vjeux
63a6f74321 link issue 2014-07-30 19:50:01 +02:00
Vjeux
b18fb3b74d flux blog post 2014-07-30 19:33:27 +02:00
Vjeux
b394c5a833 oops, remove copy of #20 2014-07-28 12:04:30 +02:00
Vjeux
910464838a wording roundup #20 2014-07-28 11:56:44 +02:00
Ben Alpert
f39ed9ee25 Rebuild docs 2014-07-27 16:05:56 -07:00
Ben Alpert
14bac3b37a Rebuild docs 2014-07-27 13:30:48 -07:00
Ben Alpert
e9de762c45 Rebuild docs 2014-07-27 13:08:15 -07:00
Vjeux
4ea5b1d20b Community Roundup #20 2014-07-27 14:29:26 +02:00
Paul O’Shannessy
2aa83f71cc v0.11.1 2014-07-25 11:25:07 -07:00
Ben Alpert
4bc42dfe73 Rebuild docs 2014-07-17 15:59:24 -07:00
Ben Alpert
ddf7a5b5f6 Rebuild docs 2014-07-17 15:23:39 -07:00
Paul O’Shannessy
f6b0e9d59b v0.11.0 2014-07-17 13:53:28 -07:00
Paul O’Shannessy
fbc70acf2d 0.11 RC blog post 2014-07-13 13:12:54 -07:00
Ben Alpert
5720d80e67 Rebuild docs to fix link 2014-06-30 10:49:37 -07:00
Ben Alpert
08656fec3f Rebuild docs 2014-06-30 01:08:56 -07:00
Cheng Lou
0751a8f0a1 Add --harmony option and update tutorial 2014-06-29 22:09:26 -07:00
Cheng Lou
b189a7a9c0 [Blog] Update round-up 19 to include more credit 2014-06-27 10:19:18 -07:00
Ben Alpert
88348f8c85 Fix typo in blog post 2014-06-26 15:20:01 -07:00
Paul O’Shannessy
d4aced0b21 Update author of react-bootstrap (#1748) 2014-06-26 15:16:31 -07:00
Cheng Lou
2b7ef84999 Community round-up #19 2014-06-26 14:06:35 -07:00
Paul O’Shannessy
0d18bee5f3 Sync to latest 2014-06-24 15:18:05 -07:00
Paul O’Shannessy
6bcf1e5790 Sync latest changes out
2d66fc4518
d8a2f12498
7172b1d5da
f1a5a4c58e
2f61996ec3
cfdc884582
00037b3ec2
121b290899
c91f95a092
2496757364
2014-06-24 14:26:05 -07:00
Ben Alpert
02d18739d6 Fix ClojureScript typo 2014-05-29 13:22:20 -07:00
Ben Alpert
a30ccf5583 Actually add post 2014-05-29 11:45:32 -07:00
Ben Alpert
7c08596f40 Rebuild docs for one-year post 2014-05-29 11:44:34 -07:00
Ben Alpert
02ea1c044c Rebuild docs for test utils docs change 2014-05-14 21:40:02 -07:00
Ben Alpert
ced25b13a4 Rebuild docs to fix code sample 2014-05-10 18:01:57 -03:00
Ben Alpert
597c4bca44 Rebuild docs to fix link 2014-05-09 15:43:26 -03:00
Paul O’Shannessy
07ea77092d fix flux link typo 2014-05-08 20:05:09 -07:00
Vjeux
5613670284 flux blog post and tutorial 2014-05-09 01:39:33 +02:00
Paul O’Shannessy
59fe162fe5 Update to latest docs. Biggest change: no more fb comments
Commits synced:
009be62906
af79caf1aa
5167b7a5b2
f728846712
af7ea7c999
287db7017e
14580fb012
f27175d166
663dd6f5b3
df72bd76be
05cc7b635c
fbbace6b69
6323db7c18
cdac160439
dea228e4ae
b360ed80dd
67c68612c0
c4ed2c1c90
2014-05-08 11:57:43 -07:00
Paul O’Shannessy
eecc70cf96 Sync latest changes 2014-04-07 17:59:48 -07:00
Ben Alpert
431706a330 React.NET blog post 2014-04-04 13:25:30 -07:00
Ben Alpert
cf7532a1d6 Update acknowledgements page 2014-04-03 07:35:52 -07:00
Paul O’Shannessy
eaa87d8b5b fix pit of success 2014-03-28 14:43:57 -07:00
Paul O’Shannessy
9c4fea0d1c https://github.com/facebook/react/pull/1319 2014-03-28 14:33:46 -07:00
Paul O’Shannessy
69f231639d road to 1.0 blog post 2014-03-28 14:00:35 -07:00
Paul O’Shannessy
8a98319d58 0.10 blog post 2014-03-21 14:55:09 -07:00
Paul O’Shannessy
7e16bb70b1 v0.10.0 2014-03-21 13:37:35 -07:00
Paul O’Shannessy
774d877518 0.10rc1 2014-03-19 11:32:48 -07:00
Paul O’Shannessy
029dd9bb77 Community Round-up #18 2014-03-14 20:17:58 -07:00
Ben Alpert
645a32032a Add file I forgot
Fixes #1238.
2014-03-10 11:45:55 -07:00
Ben Alpert
6cfdfa8636 Rebuild docs 2014-03-09 13:46:26 -07:00
Paul O’Shannessy
4c37b3f818 Bring in recent docs changes
* 25cafec4a9
* ba78edbed8
2014-02-26 15:15:08 -08:00
Ben Alpert
c2e3735ffb Rebuild docs for clearer propTypes 2014-02-26 15:04:30 -08:00
Ben Alpert
24c909502d Actually add acknowledgements page 2014-02-24 17:25:13 -08:00
Ben Alpert
77f045ccdc Rebuild with acknowledgements 2014-02-24 17:19:49 -08:00
Ben Alpert
36aeb76e5f Rebuild docs for typo fix 2014-02-24 15:28:49 -08:00
Paul O’Shannessy
300374d9a8 Update to latest 2014-02-24 14:41:42 -08:00
Ben Alpert
b6d4923fb0 Rebuild docs 2014-02-21 12:17:45 -08:00
Paul O’Shannessy
4658413aea Context in breaking changes too. see #1141 2014-02-20 10:35:02 -08:00
Paul O’Shannessy
2221fe1132 v0.9.0 2014-02-20 09:42:59 -08:00
Paul O’Shannessy
07ac1ea11f 0.9.0-rc1 2014-02-16 19:39:16 -08:00
Ben Alpert
f1d5e0421b Fix typo in latest round-up 2014-02-15 22:57:42 -08:00
Paul O’Shannessy
8ac8f35db4 Community Roundup 16 2014-02-15 15:59:02 -08:00
Paul O’Shannessy
2d42e44128 update css 2014-02-05 16:24:55 -08:00
Paul O’Shannessy
f414b96c03 Community roundup 15 2014-02-05 16:09:46 -08:00
Ben Alpert
5af1ac1836 Rebuild docs
Somehow ee5805d included an unintended update to JSXTransformer.js and react.min.js.
2014-02-04 00:37:11 -08:00
Vjeux
9afcad69d1 Pete Hunt petehunt Add link to meteor talk c06ca23
Pete Hunt	petehunt	Update videos.md	7467b1f
Pete Hunt	petehunt	Add a complementary tools page	3c19f62
Pete Hunt	petehunt	add example apps page	9209207
Pete Hunt	petehunt	Update example-apps.md	 7f22f43
2014-02-02 04:03:21 +01:00
Vjeux
ee5805da65 Christopher Chedeau vjeux Document isMounted … 30e16e4
Nick Thompson	nick-thompson	Clarify componentWillMount behavior	542f20b
Cheng Lou	chenglou	docs fix back link in Examples	6b15ad5
Cheng Lou	chenglou	docs add jsx->js tab to live editors	7ac5f3c
Paul O’Shannessy	zpao	Normalize line endings	6b1c6be
Ben Alpert	spicyj	Update homepage for new JSX/JS editor	761e1c8
Ben Alpert	spicyj	Properly clear live editor on JSX compile failure	d3fc5ad
Ben Alpert	spicyj	Simplify live editor execution logic	c7f0663
Cheng Lou	chenglou	[docs] Tweak frontpage first example and jsx-compiler example	8c8841c
Christoph Pojer	cpojer	Update propTypes documentation.	b66fbde
Jean Lauliac	jeanlauliac	Update broken link in 'why react' article	341d292
Jean Lauliac	jeanlauliac	Normalize internal links in 'why react' article	0681d13
aymanosman	aymanosman	Fix typo	09650e1
Bob Eagan	bobeagan	fix incorrect link	2edb76f
Bob Eagan	bobeagan	add hash link for lifecycle section of working with the browser page	3db3460
Pete Hunt	petehunt	remove references to react-page	3120192
Ben Alpert	spicyj	Fix docs typo	6e4ddfd
Paul O’Shannessy	zpao	Fix animation example code …	dd66223
Eric Schoffstall	Contra	fix grammar mistake	64ac427
Kunal Mehta	kmeht	Add documentation about React.renderComponent …	f970453
Christopher Chedeau	vjeux	s/Mock DOM/Virtual DOM/ …	22772c9
Ben Alpert	spicyj	Disable CodeMirror smart indentation …	571d173
Ben Alpert	spicyj	[docs] Fix comma splice	3810c83
2014-02-02 03:58:18 +01:00
Paul O’Shannessy
e82227b698 Updated to latest changes
7c4c0cd [docs] Remove commented out ghbtns
92102ac Add info about dev vs. prod builds
277cbf0 [docs] Add timezone to _config
b0b7717 Remove stray "117", combine lines in polyfill docs
8d63dad Rewrite Older Browsers polyfill section for clarity.
edd61ed Fix "Uncontrolled Components" documentation
d99cafa Fix typo in docs.
190f373 Update docs to mention that you need both es5-shim.js and
es5-sham.js to use React with IE8.
1873e1d Add dataType to all $.ajax calls for consistency
27ac8a3 Fix #845, Trivial year change
97f2441 Fix #874: Edit thinking-in-react
ce72e84 Document return value of unmountComponentAtNode
52ad24f Remove two more react.min.js references
7efdb43 Don't use the min build in getting started guide
51e7a6b Fix URL in displayName description
f44e8cc Add charCode/keyCode/which to key event docs
2014-01-15 11:42:32 -08:00
Christoph Pojer
bf82413930 Merge pull request #874 from chantastic/patch-1
Edit thinking-in-react, remove repeated word
2014-01-13 08:43:41 -08:00
Michael Chan
58deb56ca1 Edit thinking-in-react, remove repeated word
- removed repeated word 'building'
2014-01-13 08:27:42 -08:00
Christopher Chedeau
4b90c16c15 Merge pull request #845 from hariharan-uno/patch-1
Trivial year change
2014-01-08 10:07:53 -08:00
Hari haran
4bd2bfef69 Trivial year change 2014-01-08 23:31:55 +05:30
Vjeux
c4a2717796 fabiomcosta adding warning about the lack of support for onScroll on IE8 … 8615ade
philix	Add jsx-requirejs-plugin to the tooling-integration page	978a8f5
philix	Remove the require-jsx plugin from the tooling-integration page …	e23e627
spicyj	Mention react-art where we talk about SVG	13c211a
spicyj	Fix typo	3afe6de
passy	Add gulp-react to Helpful OSS Projects …	8ef2cec
xixixao	Document displayName	ee90857
Daniel15	Add link to HTML to JSX converter to “JSX In Depth” page	5cbc727
Daniel15	Change “not allowed” back to “discouraged” since you technically *can… …	ea41991
vjeux	Community Round-up #14	658aa45
2014-01-06 18:17:14 +01:00
Vjeux
ea32d3659c chenglou docs tips fix small typo and code 8dc36e3
chenglou	docs better error display for live editor and JSX compiler	8d37f7d
vjeux	React Chrome Developer Tools	dbae31d
2014-01-02 21:07:09 +01:00
Vjeux
d786436367 spicyj Upgrade codemirror and enable line wrapping … 32753c5
chenglou	docs remove link to wiki page …	 c5a2ca9
2013-12-31 06:02:08 +01:00
Vjeux
1b7b3bd006 Making 'native DOM' nodes more explicit in documentation 2013-12-31 01:39:46 +01:00
Vjeux
84a9d1821b IE8 style fixes 2013-12-31 01:27:34 +01:00
Vjeux
f8c5781102 chenglou docs tips small refactorings 1671efb 2013-12-31 00:14:10 +01:00
Vjeux
777f999db5 chenglou docs tips expose component function cdb328b
wincent	Fix a typo in the working-with-the-browser docs	0e95e8e
spicyj	Make React website work in IE8	30178d4baf
2013-12-30 23:50:58 +01:00
Vjeux
a276e32f51 jhiswin live_editor.js using deprecated function
petehunt Update parent/child communication tip
2013-12-30 19:58:39 +01:00
Vjeux
80dc66474d chenglou docs add warning to add jsx pragma c68b972
ivan	Use explicit $.ajax dataType and add error callback	0ae26fe
ivan	Add a warning about the @jsx declaration	838589c
ivan	console.log -> console.error	880951f
spicyj	Move initial $.ajax out of getInitialState …	12b94b0
vjeux	Community Round-up #13	3a370b8
2013-12-30 18:33:01 +01:00
Vjeux
0e32f3669e navigation wasn't properly pushed for videos 2013-12-24 17:50:36 +01:00
Vjeux
4cb8bc68ba Remove video from home 2013-12-24 07:50:46 +01:00
petehunt
65d56feeeb Add a talks section to the docs
91780d1c58 Browse code
vjeux authored 35 minutes ago
2013-12-24 01:33:59 -05:00
petehunt
a4a466dd26 trying it again 2013-12-24 01:07:14 -05:00
petehunt
3323ba8f0d Revert "language update as suggested by @petehunt"
This reverts commit fb3bd7f583.
2013-12-24 00:56:52 -05:00
petehunt
fb3bd7f583 language update as suggested by @petehunt
c211767d47 Browse code
fabiomcosta authored 5 hours ago

updating text as suggested by @petehunt
34660eccf9 Browse code
fabiomcosta authored 5 hours ago

Adding note about onScroll on IE8
874122bad4 Browse code
fabiomcosta authored 6 hours ago

Note about react's version on the talk, since somethings have already… …
d22874d039 Browse code
fabiomcosta authored 6 hours ago
2013-12-24 00:51:02 -05:00
Vjeux
1235527398 typo 2013-12-23 18:56:06 +01:00
Vjeux
15e8c64633 html-jsx compiler with the fix 2013-12-23 18:34:41 +01:00
Vjeux
b4d07a679a vjeux Community Round-up #12 d1e955c 2013-12-23 18:06:13 +01:00
Vjeux
72296a4385 revert html-jsx 2013-12-23 07:03:04 +01:00
Vjeux
8c153e6427 fix up javascript for jsx-compiler 2013-12-23 06:43:38 +01:00
Vjeux
97ec6b66d0 chenglou docs section for non-dom attributes … 94c100c
vjeux	Document the Diff algorithm …	8f24fca

vjeux	Add video at the bottom of the front page	0993b61

bricooke	Update highlighted lines in tutorial …	38d68fd

jaredly	rename this tip to be less confusing …	9686487

jaredly	fixing capitalization	1a9b213

nicholasbs	Fix typo (ot -> to)	18410bf

jaredly	adding note about initializing state w/ props	4f71ddf

jaredly	changes as requested	cb0cbcc

jaredly	one liner	cd2fd80

squidsoup	Tutorial template markup needs a reference to jquery for the ajax calls …	37e544d

chenglou	docs add input attrs for Dom Differences	7eae8d3

chenglou	docs make all link start with /react/docs	dbc8563

Daniel15	Simple HTML to JSX converter, built during Hackathon 40 at Facebook. …	 2308f95
2013-12-23 06:37:00 +01:00
Paul O’Shannessy
ef762b50a7 v0.8.0 2013-12-19 10:44:05 -08:00
Paul O’Shannessy
4b46fb97a8 Add 0.4.2 starter kit 2013-12-19 10:30:52 -08:00
Paul O’Shannessy
e7c875bda8 Reformat post 2013-12-18 16:03:50 -08:00
Paul O’Shannessy
b0305f8b7e Blog post for 0.5.2, 0.4.2 2013-12-18 15:42:48 -08:00
Paul O’Shannessy
404810aba8 v0.5.2 2013-12-18 12:04:10 -08:00
Paul O’Shannessy
fd93cfb229 Merge in latest docs changes 2013-12-02 15:51:23 -08:00
Vjeux
6d37c780ed merging a lot of stuff
- splitting addons into 3 pages
- add docs for classSet
- classSet semicolon missing
- className htmlFor
- anchors for links
2013-11-19 23:30:01 +01:00
Vjeux
3ce19cdfb3 Community Round-up #11 2013-11-19 23:10:49 +01:00
Paul O’Shannessy
c4ed771b1f Tips! See #362 for details 2013-11-14 15:19:53 -08:00
Paul O’Shannessy
7ec2988c71 Latest docs changes
* fb1a072 - fix doc & example transition opacity from .99 to 1
* c1c7a60 - Added clearfix to blog content holder
* adad0d7 - Fixes the name of the component on documentation
* e7f48a6 - Prevents header anchors from interfering with clickable content.
2013-11-13 17:56:22 -08:00
Paul O’Shannessy
499a3324b1 move docs tooling, immutable state
* d47d509637
* d3cee1ee2e
2013-11-08 13:32:38 -08:00
Paul O’Shannessy
cf1a728e21 Community Roundup #10 and ridealongs 2013-11-06 12:45:43 -08:00
Paul O’Shannessy
a07e3ad0b5 Fix blog post formatting 2013-11-05 16:17:16 -08:00
Paul O’Shannessy
faada22274 fix header link styling (1553bad) 2013-11-05 15:07:24 -08:00
Paul O’Shannessy
4c00e8f69a Thinking in React blog post, jQuery cleanup in tutorial 2013-11-05 14:43:49 -08:00
Paul O’Shannessy
0ac7832631 Updated with latest changes, mostly to fix tutorial 2013-11-04 17:23:48 -08:00
Paul O’Shannessy
7a8977d175 0.5.1 blog post 2013-10-29 12:52:15 -07:00
Paul O’Shannessy
7dd0009c60 v0.5.1 2013-10-29 11:51:20 -07:00
Paul O’Shannessy
c7b896be20 Updated API docs 2013-10-26 17:49:23 -07:00
Paul O’Shannessy
97654abcaa Latest changes
* 2c35ed8068
* c994cc24c3
2013-10-25 18:27:03 -07:00
Paul O’Shannessy
7e99f8eec3 remove OUTLINE, make header links clickable 2013-10-21 15:22:09 -07:00
Paul O’Shannessy
7938338441 Update live editor 2013-10-16 18:12:14 -07:00
Paul O’Shannessy
fdb12c2ea3 v0.5.0 2013-10-16 11:53:27 -07:00
Paul O’Shannessy
4686b1361a Update polyfill phrasing 2013-10-08 16:34:26 -07:00
Paul O’Shannessy
d424c06a99 Remove 0.5-alpha download - shouldn't have been added 2013-10-08 11:14:12 -07:00
Paul O’Shannessy
079a983672 fixed broken link on Community Round-up #9 blog post 2013-10-08 11:13:31 -07:00
Paul O’Shannessy
ffa4af3be0 use fb app id for comments, community roundup #9 2013-10-03 15:22:29 -07:00
Paul O’Shannessy
caf773d5a6 NEW API DOCS! 2013-09-24 16:07:14 -07:00
Paul O’Shannessy
b80668577d Updates (header ids, blog post, typos) 2013-09-24 14:34:40 -07:00
Paul O’Shannessy
0495462ad5 Update wording 2013-09-14 13:53:33 +02:00
Paul O’Shannessy
30d40aa15f Various updates, primarily pagination on the blog 2013-09-04 15:35:39 -07:00
Paul O’Shannessy
bacf855ed8 Community Roundup 7, Tooling Integration fixes 2013-08-26 14:58:42 -07:00
Paul O’Shannessy
33669c1390 Fix 404s, link to CDNJS 2013-08-22 11:15:42 -07:00
Paul O’Shannessy
3a3aa47d32 Typo fix and PyReact blog post 2013-08-19 14:56:01 -07:00
Paul O’Shannessy
b6526e70d6 Community Roundup #6 2013-08-05 16:59:01 -07:00
Paul O’Shannessy
8af4fbb0f0 Updated 0.4.1 zip
* README changes (point to 0.4.1)
* Python server corrected
* links to github repo corrected
2013-08-05 09:44:33 -07:00
Paul O’Shannessy
84d945f7da Fix typo in get started page 2013-08-05 09:38:58 -07:00
Paul O’Shannessy
171d3e64a0 some docs updates, react-rails blog post 2013-07-30 15:27:56 -07:00
Paul O’Shannessy
e1d7e0bece Blog post for v0.4.1 2013-07-26 15:53:45 -07:00
Paul O’Shannessy
59ce7e4a8f v0.4.1 2013-07-26 15:32:59 -07:00
Paul O’Shannessy
9f6e8e466a Pick up all of recent docs fixes, latest blog post 2013-07-23 09:31:02 -07:00
Paul O’Shannessy
9bc285b67e Fix errors and example code for the homepage, small blog typo 2013-07-17 13:36:13 -07:00
Paul O’Shannessy
6ec7c79cf7 Small update to v0.4 blog post 2013-07-17 11:55:12 -07:00
Paul O’Shannessy
3dd6235041 v0.4.0 2013-07-17 11:35:48 -07:00
Paul O’Shannessy
3ce6c88952 A couple docs updates, new blog post 2013-07-11 15:59:51 -07:00
Paul O’Shannessy
688c56d79c Community Roundup #4 2013-07-03 18:41:25 -07:00
Paul O’Shannessy
aa7ea0637e New blog post 2013-07-02 13:08:24 -07:00
Paul O’Shannessy
b3aa6ba924 Sync to latest 2013-06-28 09:50:26 -07:00
Paul O’Shannessy
be61bebd92 Community Roundup 3 2013-06-27 13:49:58 -07:00
Paul O’Shannessy
6c74abe0ed Blogpost & changelog for v0.3.3 2013-06-21 11:02:33 -07:00
Paul O’Shannessy
83fe3ddaee v0.3.3 2013-06-20 15:12:41 -07:00
Paul O’Shannessy
a7b717162f New blog post, fix bug in JSX docs 2013-06-19 12:37:34 -07:00
Paul O’Shannessy
7332a0fe8a Use absolute URLs for FB comments box 2013-06-18 10:22:22 -07:00
Paul O’Shannessy
4f23af6a15 Update site to latest 2013-06-18 09:23:45 -07:00
Paul O’Shannessy
30e65b2ba7 Update to latest, including communnity roundup blog post 2013-06-12 14:12:30 -07:00
Paul O’Shannessy
edaa7881bd Updated Todo example on the home page 2013-06-07 15:54:21 -07:00
Paul O’Shannessy
ff542ff7d7 Fix a typo 2013-06-05 11:53:14 -07:00
Paul O’Shannessy
7203dcb145 Fix broken link in blog post 2013-06-05 10:02:52 -07:00
Paul O’Shannessy
4346b10363 Update to latest master, including blog posts 2013-06-05 09:08:04 -07:00
Paul O’Shannessy
d06a7ef606 v0.3.2 2013-05-31 17:02:37 -07:00
Paul O’Shannessy
8571e6814b Updated tutorial 2013-05-31 16:25:53 -07:00
Paul O’Shannessy
1d628ef207 v0.3.1 2013-05-30 15:02:20 -07:00
Paul O’Shannessy
cff20b7a4c Roll up latest changes to master 2013-05-30 11:49:38 -07:00
Paul O’Shannessy
7a92c4bf95 Update docs to latest master 2013-05-29 18:43:04 -07:00
Paul O’Shannessy
8e76af2192 Cleanup pages branch. 2013-05-29 15:18:56 -07:00
Paul O’Shannessy
ddb56ac56a Analytics 2013-05-29 14:10:20 -07:00
Paul O’Shannessy
6c61658bba Updated to latest master build 2013-05-29 17:07:32 -04:00
Paul O’Shannessy
757022d229 Updated to lastest master build 2013-05-29 17:07:32 -04:00
Paul O’Shannessy
b0e208a155 v0.3.0 2013-05-29 17:07:32 -04:00
Paul O’Shannessy
6de0ab3293 v0.3.0 2013-05-29 17:07:32 -04:00
318 changed files with 1 additions and 43299 deletions

View File

@@ -1,12 +0,0 @@
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false

21
.gitignore vendored
View File

@@ -1,21 +0,0 @@
.DS_STORE
node_modules
*~
*.pyc
static
.grunt
_SpecRunner.html
build/
*.gem
docs/code
docs/_site
docs/.sass-cache
docs/css/react.css
docs/js/JSXTransformer.js
docs/js/react.min.js
docs/js/docs.js
docs/js/live_editor.js
docs/js/examples
docs/downloads
examples/shared/*.js

View File

@@ -1,20 +0,0 @@
{
"node": true,
"boss": true,
"curly": true,
"devel": true,
"eqnull": true,
"expr": true,
"funcscope": true,
"globalstrict": true,
"loopfunc": true,
"newcap": false,
"noempty": true,
"nonstandard": true,
"onecase": true,
"regexdash": true,
"trailing": true,
"undef": true,
"unused": "vars"
}

1
CNAME Normal file
View File

@@ -0,0 +1 @@
legacy.reactjs.org

View File

@@ -1,63 +0,0 @@
# Contributing to React
React is one of Facebook's first open source projects that is both under very active development and is also being used to ship code to everybody on facebook.com. We're still working out the kinks to make contributing to this project as easy and transparent as possible, but we're not quite there yet. Hopefully this document makes the process for contributing clear and preempts some questions you may have.
## Our Development Process
Some of the core team will be working directly on GitHub. These changes will be public from the beginning. Other changesets will come via a bridge with Facebook's internal source control. This is a necessity as it allows engineers at Facebook outside of the core team to move fast and contribute from an environment they are comfortable in.
### `master` is unsafe
We will do our best to keep `master` in good shape, with tests passing at all times. But in order to move fast, we will make API changes that your application might not be compatible with. We will do our best to communicate these changes and always version appropriately so you can lock into a specific version if need be.
### Pull Requests
The core team will be monitoring for pull requests. When we get one, we'll run some Facebook-specific integration tests on it first. From here, we'll need to get another person to sign off on the changes and then merge the pull request. For API changes we may need to fix internal uses, which could cause some delay. We'll do our best to provide updates and feedback throughout the process.
*Before* submitting a pull request, please make sure the following is done…
1. Fork the repo and create your branch from `master`.
2. If you've added code that should be tested, add tests!
3. If you've changed APIs, update the documentation.
4. Ensure the test suite passes (`grunt test`).
5. Make sure your code lints (`grunt lint`) - we've done our best to make sure these rules match our internal linting guidelines.
6. If you haven't already, complete the CLA.
### Contributor License Agreement ("CLA")
In order to accept your pull request, we need you to submit a CLA. You only need to do this once, so if you've done this for another Facebook open source project, you're good to go. If you are submitting a pull request for the first time, just let us know that you have completed the CLA and we can cross-check with your GitHub username.
Complete your CLA here: <https://developers.facebook.com/opensource/cla>
## Bugs
### Where to Find Known Issues
We will be using GitHub Issues for our public bugs. We will keep a close eye on this and try to make it clear when we have an internal fix in progress. Before filing a new task, try to make sure your problem doesn't already exist.
### Reporting New Issues
The best way to get your bug fixed is to provide a reduced test case. jsFiddle, jsBin, and other sites provide a way to give live examples. Those are especially helpful though may not work for `JSX`-based code.
### Security Bugs
Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe disclosure of security bugs. With that in mind, please do not file public issues and go through the process outlined on that page.
## How to Get in Touch
* IRC - [#reactjs on freenode](http://webchat.freenode.net/?channels=reactjs)
* Mailing list - [reactjs on Google Groups](http://groups.google.com/group/reactjs)
## Coding Style
* Use semicolons;
* Commas last,
* 2 spaces for indentation (no tabs)
* Prefer `'` over `"`
* `"use strict";`
* 80 character line length
* "Attractive"
## License
By contributing to React, you agree that your contributions will be licensed under the [Apache License Version 2.0 (APLv2)](LICENSE).

View File

@@ -1,99 +0,0 @@
'use strict';
var exec = require('child_process').exec;
var jsxTask = require('./grunt/tasks/jsx');
var browserifyTask = require('./grunt/tasks/browserify');
var wrapupTask = require('./grunt/tasks/wrapup');
var phantomTask = require('./grunt/tasks/phantom');
var releaseTasks = require('./grunt/tasks/release');
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
copy: require('./grunt/config/copy'),
jsx: require('./grunt/config/jsx/jsx'),
browserify: require('./grunt/config/browserify'),
wrapup: require('./grunt/config/wrapup'),
phantom: require('./grunt/config/phantom'),
clean: ['./build', './*.gem', './docs/_site', './examples/shared/*.js'],
jshint: require('./grunt/config/jshint'),
compare_size: require('./grunt/config/compare_size')
});
grunt.config.set('compress', require('./grunt/config/compress'));
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-compare-size');
grunt.loadNpmTasks('grunt-contrib-compress');
// Alias 'jshint' to 'lint' to better match the workflow we know
grunt.registerTask('lint', ['jshint']);
// Register jsx:debug and :release tasks.
grunt.registerMultiTask('jsx', jsxTask);
// Our own browserify-based tasks to build a single JS file build
grunt.registerMultiTask('browserify', browserifyTask);
// Similar to Browserify, use WrapUp to generate single JS file that
// defines global variables instead of using require.
grunt.registerMultiTask('wrapup', wrapupTask);
grunt.registerMultiTask('phantom', phantomTask);
grunt.registerTask('build:basic', ['jsx:debug', 'browserify:basic']);
grunt.registerTask('build:transformer', ['jsx:debug', 'browserify:transformer']);
grunt.registerTask('build:min', ['jsx:release', 'browserify:min']);
grunt.registerTask('build:test', [
'jsx:debug',
'jsx:test',
'browserify:test'
]);
grunt.registerTask('test', ['build:test', 'phantom:run']);
// Optimized build task that does all of our builds. The subtasks will be run
// in order so we can take advantage of that and only run jsx:debug once.
grunt.registerTask('build', [
'jsx:debug',
'browserify:basic',
'browserify:transformer',
'jsx:release',
'browserify:min',
'copy:react_docs',
'compare_size'
]);
// Automate the release!
grunt.registerTask('release:setup', releaseTasks.setup);
grunt.registerTask('release:bower', releaseTasks.bower);
grunt.registerTask('release:docs', releaseTasks.docs);
grunt.registerTask('release:msg', releaseTasks.msg);
grunt.registerTask('release:starter', releaseTasks.starter);
grunt.registerTask('release', [
'release:setup',
'clean',
'build',
'gem:only',
'release:bower',
'release:starter',
'compress',
'release:docs',
'release:msg'
]);
// `gem` task to build the react-source gem
grunt.registerTask('gem', ['build', 'gem:only']);
grunt.registerTask('gem:only', function() {
var done = this.async();
exec('gem build react-source.gemspec', done);
});
// The default task - build - to keep setup easy
grunt.registerTask('default', ['build']);
};

201
LICENSE
View File

@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
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,96 +0,0 @@
# [React](http://facebook.github.io/react)
React is a JavaScript library for building user interfaces.
* **Declarative:** React uses a declarative paradigm that makes it easier to reason about your application.
* **Efficient:** React minimizes interactions with the DOM by using a mock representation of the DOM.
* **Flexible:** React works with the libraries and frameworks that you already know.
[Learn how to use React in your own project.](http://facebook.github.io/react/docs/getting-started.html)
## Examples
We have several examples [on the website](http://facebook.github.io/react). Here is the first one to get you started:
```js
/** @jsx React.DOM */
var HelloMessage = React.createClass({
render: function() {
return <div>{'Hello ' + this.props.name}</div>;
}
});
React.renderComponent(
<HelloMessage name="John" />,
document.getElementById('container')
);
```
This example will render "Hello John" into a container on the page.
You'll notice that we used an XML-like syntax; [we call it JSX](http://facebook.github.io/react/docs/syntax.html). JSX is not required to use React, but it makes code more readable, and writing it feels like writing HTML. A simple transform is included with React that allows converting JSX into native JavaScript for browsers to digest.
## Installation
The fastest way to get started is to serve JavaScript from the CDN:
```html
<!-- The core React library -->
<script src="http://fb.me/react-0.3.0.min.js"></script>
<!-- In-browser JSX transformer, remove when pre-compiling JSX. -->
<script src="http://fb.me/JSXTransformer-0.3.0.js"></script>
```
We've also built a [starter kit](http://facebook.github.io/react/downloads/react-0.3.0.zip) which might be useful if this is your first time using React. It includes a webpage with an example of using React with live code.
If you'd like to use [bower](http://bower.io), it's as easy as:
```sh
bower install react
```
## Contribute
The main purpose of this repository is to continue to evolve React core, making it faster and easier to use. If you're interested in helping with that, then keep reading. If you're not interested in helping right now that's ok too :) Any feedback you have about using React would be greatly appreciated.
### Building Your Copy of React
The process to build `react.js` is built entirely on top of node.js, using many libraries you may already be familiar with.
#### Prerequisites
* You have `node` installed at v0.10.0+ (it might work at lower versions, we just haven't tested).
* You are familiar with `npm` and know whether or not you need to use `sudo` when installing packages globally.
* You are familiar with `git`.
#### Build
Once you have the repository cloned, building a copy of `react.js` is really easy.
```sh
# grunt-cli is needed by grunt; you might have this installed already
npm install -g grunt-cli
npm install
grunt build
```
At this point, you should now have a `build/` directory populated with everything you need to use React. The examples should all work.
### Grunt
We use grunt to automate many tasks. Run `grunt -h` to see a mostly complete listing. The important ones to know:
```sh
# Create test build & run tests with PhantomJS
grunt test
# Lint the core library code with JSHint
grunt lint
# Lint package code
grunt lint:package
# Wipe out build directory
grunt clean
```
### More…
There's only so much we can cram in here. To read more about the community and guidelines for submitting pull requests, please read the [Contributing document](CONTRIBUTING.md).

42
bin/jsx
View File

@@ -1,42 +0,0 @@
#!/usr/bin/env node
"use strict";
var visitors = require('../vendor/fbtransform/visitors').transformVisitors;
var transform = require('../vendor/fbtransform/lib/transform').transform;
var debranch = require("../vendor/woodchipper").debranch;
require("commoner").resolve(function(id) {
var context = this;
// Note that the result of context.getProvidedP() is cached for the
// duration of the build, so it is both consistent and cheap to
// evaluate multiple times.
return context.getProvidedP().then(function(idToPath) {
// If a module declares its own identifier using @providesModule
// then that identifier will be a key in the idToPath object.
if (idToPath.hasOwnProperty(id)) {
return context.readFileP(idToPath[id]);
}
// Otherwise assume the identifier maps directly to a path in the
// filesystem.
return context.readModuleP(id);
});
}).process(function(id, source) {
var context = this;
// This is where JSX, ES6, etc. desugaring happens.
source = transform(visitors.react, source).code;
return context.makePromise(function(callback) {
var constants = context.config.constants || {};
// Debranching means removing any obviously dead code after
// replacing constant conditional expressions with literal
// (boolean) values.
debranch(constants, source, function(source) {
callback(null, source);
});
});
});

View File

@@ -1,16 +0,0 @@
source 'https://rubygems.org'
# jekyll, which builds it all
gem 'jekyll', '~>1.0'
# JSON
gem 'json'
# SASS for CSS
gem 'sass'
# For `rake watch`
gem 'rb-fsevent'
# Redcarpet for Markdown
gem 'redcarpet'

View File

@@ -1,46 +0,0 @@
GEM
remote: https://rubygems.org/
specs:
classifier (1.3.3)
fast-stemmer (>= 1.0.0)
colorator (0.1)
commander (4.1.3)
highline (~> 1.6.11)
directory_watcher (1.4.1)
fast-stemmer (1.0.2)
highline (1.6.19)
jekyll (1.0.2)
classifier (~> 1.3)
colorator (~> 0.1)
commander (~> 4.1.3)
directory_watcher (~> 1.4.1)
kramdown (~> 1.0.2)
liquid (~> 2.3)
maruku (~> 0.5)
pygments.rb (~> 0.5.0)
safe_yaml (~> 0.7.0)
json (1.8.0)
kramdown (1.0.2)
liquid (2.5.0)
maruku (0.6.1)
syntax (>= 1.0.0)
posix-spawn (0.3.6)
pygments.rb (0.5.0)
posix-spawn (~> 0.3.6)
yajl-ruby (~> 1.1.0)
rb-fsevent (0.9.3)
redcarpet (2.2.2)
safe_yaml (0.7.1)
sass (3.2.9)
syntax (1.0.0)
yajl-ruby (1.1.0)
PLATFORMS
ruby
DEPENDENCIES
jekyll (~> 1.0)
json
rb-fsevent
redcarpet
sass

View File

@@ -1,61 +0,0 @@
# React Documentation & Website
We use [Jekyll](http://jekyllrb.com/) to build the site using ([mostly](http://zpao.com/posts/adding-line-highlights-to-markdown-code-fences/)) Markdown, and we host it by pushing HTML to [GitHub Pages](http://pages.github.com/).
## Installation
If you are working on the site, you will want to install and run a local copy of it.
### Dependencies
In order to use Jekyll, you will need to have Ruby installed.
- [Ruby](http://www.ruby-lang.org/) (version >= 1.8.7)
- [RubyGems](http://rubygems.org/) (version >= 1.3.7)
- [Bundler](http://gembundler.com/)
Mac OS X comes pre-installed with Ruby, but you may need to update RubyGems (via `gem update --system`).
Otherwise, [RVM](https://rvm.io/) and [rbenv](https://github.com/sstephenson/rbenv) are popular ways to install Ruby.
Once you have RubyGems and installed Bundler (via `gem install bundler`), use it to install the dependencies:
```sh
$ cd react/docs
$ bundle install # Might need sudo.
```
### Instructions
The site requires React, so first make sure you've built the project (via `grunt`).
Use Jekyll to serve the website locally (by default, at `http://localhost:4000`):
```sh
$ cd react/docs
$ rake
$ jekyll serve -w
$ open http://localhost:4000/react/
```
We use [SASS](http://sass-lang.com/) (with [Bourbon](http://bourbon.io/)) for our CSS, and we use JSX to transform some of our JS.
If you only want to modify the HTML or Markdown, you do not have to do anything because we package pre-compiled copies of the CSS and JS.
If you want to modify the CSS or JS, use [Rake](http://rake.rubyforge.org/) to compile them:
```sh
$ cd react/docs
$ rake watch # Automatically compiles as needed.
# rake Manually compile CSS and JS.
# rake css Manually compile CSS, only.
# rake js Manually compile JS, only.
```
## Afterthoughts
### Updating `facebook.github.io/react`
The easiest way to do this is to have a separate clone of this repository, checked out to the `gh-pages` branch. We have a build step that expects this to be in a directory named `react-gh-pages` at the same depth as `react`. Then it's just a matter of running `grunt docs`, which will compile the site and copy it out to this repository. From there you can check it in.
**Note:** This should only be done for new releases. You should create a tag corresponding to the relase tag in the main repository.
### Removing the Jekyll / Ruby Dependency
In an ideal world, we would not be adding a Ruby dependency on part of our project. We would like to move towards a point where we are using React to render the website.

View File

@@ -1,35 +0,0 @@
require('rubygems')
require('json')
require('yaml')
desc "generate css from sass"
task :css do
system "sass --style=compressed _css/react.scss css/react.css"
end
desc "generate js from jsx"
task :js do
system "../bin/jsx _js js"
end
desc "watch css & js"
task :watch => [:update_version] do
Process.spawn "sass --style=compressed --watch _css/react.scss:css/react.css"
Process.spawn "../bin/jsx --watch _js js"
Process.waitall
end
desc "update version to match ../package.json"
task :update_version do
react_version = JSON.parse(File.read('../package.json'))['version']
site_config = YAML.load_file('_config.yml')
site_config['react_version'] = react_version
File.open('_config.yml', 'w+') { |f| f.write(site_config.to_yaml) }
end
desc "build into ../../react-gh-pages"
task :release => [:default] do
system "jekyll build -d ../../react-gh-pages"
end
task :default => [:update_version, :css, :js]

View File

@@ -1,14 +0,0 @@
---
name: React
markdown: redcarpet
baseurl: /react
react_version: 0.3.0
redcarpet:
extensions:
- fenced_code_blocks
pygments: true
exclude:
- Gemfile
- Gemfile.lock
- README.md
- Rakefile

View File

@@ -1,173 +0,0 @@
html * {
color-profile: sRGB;
rendering-intent: auto;
}
.cm-s-solarized-light {
background-color: #f8f5ec;
color: #637c84;
}
.cm-s-solarized-light .emphasis {
font-weight: bold;
}
.cm-s-solarized-light .dotted {
border-bottom: 1px dotted #cb4b16;
}
.cm-s-solarized-light .CodeMirror-gutter {
background-color: #eee8d5;
border-right: 3px solid #eee8d5;
}
.cm-s-solarized-light .CodeMirror-gutter .CodeMirror-gutter-text {
color: #93a1a1;
}
.cm-s-solarized-light .CodeMirror-cursor {
border-left-color: #002b36 !important;
}
.cm-s-solarized-light .CodeMirror-matchingbracket {
color: #002b36;
background-color: #eee8d5;
box-shadow: 0 0 10px #eee8d5;
font-weight: bold;
}
.cm-s-solarized-light .CodeMirror-nonmatchingbracket {
color: #002b36;
background-color: #eee8d5;
box-shadow: 0 0 10px #eee8d5;
font-weight: bold;
color: #dc322f;
border-bottom: 1px dotted #cb4b16;
}
.cm-s-solarized-light span.cm-keyword {
color: #268bd2;
}
.cm-s-solarized-light span.cm-atom {
color: #2aa198;
}
.cm-s-solarized-light span.cm-number {
color: #586e75;
}
.cm-s-solarized-light span.cm-def {
color: #637c84;
}
.cm-s-solarized-light span.cm-variable {
color: #637c84;
}
.cm-s-solarized-light span.cm-variable-2 {
color: #b58900;
}
.cm-s-solarized-light span.cm-variable-3 {
color: #cb4b16;
}
.cm-s-solarized-light span.cm-comment {
color: #93a1a1;
}
.cm-s-solarized-light span.cm-property {
color: #637c84;
}
.cm-s-solarized-light span.cm-operator {
color: #657b83;
}
.cm-s-solarized-light span.cm-string {
color: #36958e;
}
.cm-s-solarized-light span.cm-error {
font-weight: bold;
border-bottom: 1px dotted #cb4b16;
}
.cm-s-solarized-light span.cm-bracket {
color: #cb4b16;
}
.cm-s-solarized-light span.cm-tag {
color: #657b83;
}
.cm-s-solarized-light span.cm-attribute {
color: #586e75;
font-weight: bold;
}
.cm-s-solarized-light span.cm-meta {
color: #268bd2;
}
.cm-s-solarized-dark {
background-color: #002b36;
color: #839496;
}
.cm-s-solarized-dark .emphasis {
font-weight: bold;
}
.cm-s-solarized-dark .dotted {
border-bottom: 1px dotted #cb4b16;
}
.cm-s-solarized-dark .CodeMirror-gutter {
background-color: #073642;
border-right: 3px solid #073642;
}
.cm-s-solarized-dark .CodeMirror-gutter .CodeMirror-gutter-text {
color: #586e75;
}
.cm-s-solarized-dark .CodeMirror-cursor {
border-left-color: #fdf6e3 !important;
}
.cm-s-solarized-dark .CodeMirror-matchingbracket {
color: #fdf6e3;
background-color: #073642;
box-shadow: 0 0 10px #073642;
font-weight: bold;
}
.cm-s-solarized-dark .CodeMirror-nonmatchingbracket {
color: #fdf6e3;
background-color: #073642;
box-shadow: 0 0 10px #073642;
font-weight: bold;
color: #dc322f;
border-bottom: 1px dotted #cb4b16;
}
.cm-s-solarized-dark span.cm-keyword {
color: #839496;
font-weight: bold;
}
.cm-s-solarized-dark span.cm-atom {
color: #2aa198;
}
.cm-s-solarized-dark span.cm-number {
color: #93a1a1;
}
.cm-s-solarized-dark span.cm-def {
color: #268bd2;
}
.cm-s-solarized-dark span.cm-variable {
color: #cb4b16;
}
.cm-s-solarized-dark span.cm-variable-2 {
color: #cb4b16;
}
.cm-s-solarized-dark span.cm-variable-3 {
color: #cb4b16;
}
.cm-s-solarized-dark span.cm-comment {
color: #586e75;
}
.cm-s-solarized-dark span.cm-property {
color: #b58900;
}
.cm-s-solarized-dark span.cm-operator {
color: #839496;
}
.cm-s-solarized-dark span.cm-string {
color: #6c71c4;
}
.cm-s-solarized-dark span.cm-error {
font-weight: bold;
border-bottom: 1px dotted #cb4b16;
}
.cm-s-solarized-dark span.cm-bracket {
color: #cb4b16;
}
.cm-s-solarized-dark span.cm-tag {
color: #839496;
}
.cm-s-solarized-dark span.cm-attribute {
color: #93a1a1;
font-weight: bold;
}
.cm-s-solarized-dark span.cm-meta {
color: #268bd2;
}

View File

@@ -1,136 +0,0 @@
@import 'variables.scss';
$textColor: $mediumColor;
$textColorLight: lighten($textColor, 20%);
html {
font-family: $helvetica;
font-family: proxima-nova, $helvetica;
font-weight: 300;
color: $textColor;
line-height: 1.28;
}
p {
margin: 0 0 10px;
}
.subHeader {
font-size: 21px;
font-weight: 200;
line-height: 30px;
margin-bottom: 10px;
}
em {
font-style: italic;
}
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 10px 0;
font-family: inherit;
font-weight: bold;
line-height: 20px;
color: inherit;
text-rendering: optimizelegibility;
}
h1 small,
h2 small,
h3 small,
h4 small,
h5 small,
h6 small {
font-weight: normal;
color: $textColorLight
}
h1,
h2,
h3 {
line-height: 40px;
}
h1 {
font-size: 39px;
}
h2 {
font-size: 31px;
}
h3 {
font-size: 23px;
}
h4 {
font-size: 17px;
}
h5 {
font-size: 14px;
}
h6 {
font-size: 11px;
}
h1 small {
font-size: 24px;
}
h2 small {
font-size: 18px;
}
h3 small {
font-size: 16px;
}
h4 small {
font-size: 14px;
}
ul,
ol {
margin: 0 0 10px 25px;
padding: 0;
}
ul ul,
ul ol,
ol ol,
ol ul {
margin-bottom: 0;
}
li {
line-height: 20px;
}
a {
color: $linkColor;
text-decoration: none;
&:hover,
&:focus {
color: $linkInteract;
text-decoration: underline;
}
&:focus {
outline: thin dotted #333;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
}
.center {
text-align: center;
}

View File

@@ -1,22 +0,0 @@
$primary: #cc7a6f;
$linkColor: darken($primary, 9%);
$linkInteract: darken($linkColor, 9%);
$pageBg: #f9f9f9;
$lightColor: #e9e9e9;
$mediumestColor: #666;
$mediumColor: #484848;
$darkColor: #2d2d2d;
$darkestColor: #222222;
$blueColor: #61dafb;
$orangeColor: complement($blueColor);
$lightTextColor: #fafafa;
$mediumTextColor: #aaa;
$darkTextColor: $mediumColor;
$buttonBlueTop: #77a3d2;
$buttonBlueBottom: #4783c2;
$buttonGreyTop: #9a9a9a;
$buttonGreyBottom: #646464;

View File

@@ -1,13 +0,0 @@
//************************************************************************//
// These mixins/functions are deprecated
// They will be removed in the next MAJOR version release
//************************************************************************//
@mixin box-shadow ($shadows...) {
@include prefixer(box-shadow, $shadows, spec);
@warn "box-shadow is deprecated and will be removed in the next major version release";
}
@mixin background-size ($lengths...) {
@include prefixer(background-size, $lengths, spec);
@warn "background-size is deprecated and will be removed in the next major version release";
}

View File

@@ -1,59 +0,0 @@
// Custom Helpers
@import "helpers/deprecated-webkit-gradient";
@import "helpers/gradient-positions-parser";
@import "helpers/linear-positions-parser";
@import "helpers/radial-arg-parser";
@import "helpers/radial-positions-parser";
@import "helpers/render-gradients";
@import "helpers/shape-size-stripper";
// Custom Functions
@import "functions/compact";
@import "functions/flex-grid";
@import "functions/grid-width";
@import "functions/linear-gradient";
@import "functions/modular-scale";
@import "functions/px-to-em";
@import "functions/radial-gradient";
@import "functions/tint-shade";
@import "functions/transition-property-name";
// CSS3 Mixins
@import "css3/animation";
@import "css3/appearance";
@import "css3/backface-visibility";
@import "css3/background";
@import "css3/background-image";
@import "css3/border-image";
@import "css3/border-radius";
@import "css3/box-sizing";
@import "css3/columns";
@import "css3/flex-box";
@import "css3/font-face";
@import "css3/hidpi-media-query";
@import "css3/image-rendering";
@import "css3/inline-block";
@import "css3/keyframes";
@import "css3/linear-gradient";
@import "css3/perspective";
@import "css3/radial-gradient";
@import "css3/transform";
@import "css3/transition";
@import "css3/user-select";
@import "css3/placeholder";
// Addons & other mixins
@import "addons/button";
@import "addons/clearfix";
@import "addons/font-family";
@import "addons/hide-text";
@import "addons/html5-input-types";
@import "addons/position";
@import "addons/prefixer";
@import "addons/retina-image";
@import "addons/size";
@import "addons/timing-functions";
@import "addons/triangle";
// Soon to be deprecated Mixins
@import "bourbon-deprecated-upcoming";

View File

@@ -1,273 +0,0 @@
@mixin button ($style: simple, $base-color: #4294f0) {
@if type-of($style) == color {
$base-color: $style;
$style: simple;
}
// Grayscale button
@if $base-color == grayscale($base-color) {
@if $style == simple {
@include simple($base-color, $grayscale: true);
}
@else if $style == shiny {
@include shiny($base-color, $grayscale: true);
}
@else if $style == pill {
@include pill($base-color, $grayscale: true);
}
}
// Colored button
@else {
@if $style == simple {
@include simple($base-color);
}
@else if $style == shiny {
@include shiny($base-color);
}
@else if $style == pill {
@include pill($base-color);
}
}
&:disabled {
opacity: 0.5;
cursor: not-allowed;
}
}
// Simple Button
//************************************************************************//
@mixin simple($base-color, $grayscale: false) {
$color: hsl(0, 0, 100%);
$border: adjust-color($base-color, $saturation: 9%, $lightness: -14%);
$inset-shadow: adjust-color($base-color, $saturation: -8%, $lightness: 15%);
$stop-gradient: adjust-color($base-color, $saturation: 9%, $lightness: -11%);
$text-shadow: adjust-color($base-color, $saturation: 15%, $lightness: -18%);
@if lightness($base-color) > 70% {
$color: hsl(0, 0, 20%);
$text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%);
}
@if $grayscale == true {
$border: grayscale($border);
$inset-shadow: grayscale($inset-shadow);
$stop-gradient: grayscale($stop-gradient);
$text-shadow: grayscale($text-shadow);
}
border: 1px solid $border;
border-radius: 3px;
box-shadow: inset 0 1px 0 0 $inset-shadow;
color: $color;
display: inline-block;
font-size: 11px;
font-weight: bold;
@include linear-gradient ($base-color, $stop-gradient);
padding: 7px 18px;
text-decoration: none;
text-shadow: 0 1px 0 $text-shadow;
background-clip: padding-box;
&:hover:not(:disabled) {
$base-color-hover: adjust-color($base-color, $saturation: -4%, $lightness: -5%);
$inset-shadow-hover: adjust-color($base-color, $saturation: -7%, $lightness: 5%);
$stop-gradient-hover: adjust-color($base-color, $saturation: 8%, $lightness: -14%);
@if $grayscale == true {
$base-color-hover: grayscale($base-color-hover);
$inset-shadow-hover: grayscale($inset-shadow-hover);
$stop-gradient-hover: grayscale($stop-gradient-hover);
}
box-shadow: inset 0 1px 0 0 $inset-shadow-hover;
cursor: pointer;
@include linear-gradient ($base-color-hover, $stop-gradient-hover);
}
&:active:not(:disabled) {
$border-active: adjust-color($base-color, $saturation: 9%, $lightness: -14%);
$inset-shadow-active: adjust-color($base-color, $saturation: 7%, $lightness: -17%);
@if $grayscale == true {
$border-active: grayscale($border-active);
$inset-shadow-active: grayscale($inset-shadow-active);
}
border: 1px solid $border-active;
box-shadow: inset 0 0 8px 4px $inset-shadow-active, inset 0 0 8px 4px $inset-shadow-active, 0 1px 1px 0 #eee;
}
}
// Shiny Button
//************************************************************************//
@mixin shiny($base-color, $grayscale: false) {
$color: hsl(0, 0, 100%);
$border: adjust-color($base-color, $red: -117, $green: -111, $blue: -81);
$border-bottom: adjust-color($base-color, $red: -126, $green: -127, $blue: -122);
$fourth-stop: adjust-color($base-color, $red: -79, $green: -70, $blue: -46);
$inset-shadow: adjust-color($base-color, $red: 37, $green: 29, $blue: 12);
$second-stop: adjust-color($base-color, $red: -56, $green: -50, $blue: -33);
$text-shadow: adjust-color($base-color, $red: -140, $green: -141, $blue: -114);
$third-stop: adjust-color($base-color, $red: -86, $green: -75, $blue: -48);
@if lightness($base-color) > 70% {
$color: hsl(0, 0, 20%);
$text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%);
}
@if $grayscale == true {
$border: grayscale($border);
$border-bottom: grayscale($border-bottom);
$fourth-stop: grayscale($fourth-stop);
$inset-shadow: grayscale($inset-shadow);
$second-stop: grayscale($second-stop);
$text-shadow: grayscale($text-shadow);
$third-stop: grayscale($third-stop);
}
border: 1px solid $border;
border-bottom: 1px solid $border-bottom;
border-radius: 5px;
box-shadow: inset 0 1px 0 0 $inset-shadow;
color: $color;
display: inline-block;
font-size: 14px;
font-weight: bold;
@include linear-gradient(top, $base-color 0%, $second-stop 50%, $third-stop 50%, $fourth-stop 100%);
padding: 8px 20px;
text-align: center;
text-decoration: none;
text-shadow: 0 -1px 1px $text-shadow;
&:hover:not(:disabled) {
$first-stop-hover: adjust-color($base-color, $red: -13, $green: -15, $blue: -18);
$second-stop-hover: adjust-color($base-color, $red: -66, $green: -62, $blue: -51);
$third-stop-hover: adjust-color($base-color, $red: -93, $green: -85, $blue: -66);
$fourth-stop-hover: adjust-color($base-color, $red: -86, $green: -80, $blue: -63);
@if $grayscale == true {
$first-stop-hover: grayscale($first-stop-hover);
$second-stop-hover: grayscale($second-stop-hover);
$third-stop-hover: grayscale($third-stop-hover);
$fourth-stop-hover: grayscale($fourth-stop-hover);
}
cursor: pointer;
@include linear-gradient(top, $first-stop-hover 0%,
$second-stop-hover 50%,
$third-stop-hover 50%,
$fourth-stop-hover 100%);
}
&:active:not(:disabled) {
$inset-shadow-active: adjust-color($base-color, $red: -111, $green: -116, $blue: -122);
@if $grayscale == true {
$inset-shadow-active: grayscale($inset-shadow-active);
}
box-shadow: inset 0 0 20px 0 $inset-shadow-active, 0 1px 0 #fff;
}
}
// Pill Button
//************************************************************************//
@mixin pill($base-color, $grayscale: false) {
$color: hsl(0, 0, 100%);
$border-bottom: adjust-color($base-color, $hue: 8, $saturation: -11%, $lightness: -26%);
$border-sides: adjust-color($base-color, $hue: 4, $saturation: -21%, $lightness: -21%);
$border-top: adjust-color($base-color, $hue: -1, $saturation: -30%, $lightness: -15%);
$inset-shadow: adjust-color($base-color, $hue: -1, $saturation: -1%, $lightness: 7%);
$stop-gradient: adjust-color($base-color, $hue: 8, $saturation: 14%, $lightness: -10%);
$text-shadow: adjust-color($base-color, $hue: 5, $saturation: -19%, $lightness: -15%);
@if lightness($base-color) > 70% {
$color: hsl(0, 0, 20%);
$text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%);
}
@if $grayscale == true {
$border-bottom: grayscale($border-bottom);
$border-sides: grayscale($border-sides);
$border-top: grayscale($border-top);
$inset-shadow: grayscale($inset-shadow);
$stop-gradient: grayscale($stop-gradient);
$text-shadow: grayscale($text-shadow);
}
border: 1px solid $border-top;
border-color: $border-top $border-sides $border-bottom;
border-radius: 16px;
box-shadow: inset 0 1px 0 0 $inset-shadow, 0 1px 2px 0 #b3b3b3;
color: $color;
display: inline-block;
font-size: 11px;
font-weight: normal;
line-height: 1;
@include linear-gradient ($base-color, $stop-gradient);
padding: 5px 16px;
text-align: center;
text-decoration: none;
text-shadow: 0 -1px 1px $text-shadow;
background-clip: padding-box;
&:hover:not(:disabled) {
$base-color-hover: adjust-color($base-color, $lightness: -4.5%);
$border-bottom: adjust-color($base-color, $hue: 8, $saturation: 13.5%, $lightness: -32%);
$border-sides: adjust-color($base-color, $hue: 4, $saturation: -2%, $lightness: -27%);
$border-top: adjust-color($base-color, $hue: -1, $saturation: -17%, $lightness: -21%);
$inset-shadow-hover: adjust-color($base-color, $saturation: -1%, $lightness: 3%);
$stop-gradient-hover: adjust-color($base-color, $hue: 8, $saturation: -4%, $lightness: -15.5%);
$text-shadow-hover: adjust-color($base-color, $hue: 5, $saturation: -5%, $lightness: -22%);
@if $grayscale == true {
$base-color-hover: grayscale($base-color-hover);
$border-bottom: grayscale($border-bottom);
$border-sides: grayscale($border-sides);
$border-top: grayscale($border-top);
$inset-shadow-hover: grayscale($inset-shadow-hover);
$stop-gradient-hover: grayscale($stop-gradient-hover);
$text-shadow-hover: grayscale($text-shadow-hover);
}
border: 1px solid $border-top;
border-color: $border-top $border-sides $border-bottom;
box-shadow: inset 0 1px 0 0 $inset-shadow-hover;
cursor: pointer;
@include linear-gradient ($base-color-hover, $stop-gradient-hover);
text-shadow: 0 -1px 1px $text-shadow-hover;
background-clip: padding-box;
}
&:active:not(:disabled) {
$active-color: adjust-color($base-color, $hue: 4, $saturation: -12%, $lightness: -10%);
$border-active: adjust-color($base-color, $hue: 6, $saturation: -2.5%, $lightness: -30%);
$border-bottom-active: adjust-color($base-color, $hue: 11, $saturation: 6%, $lightness: -31%);
$inset-shadow-active: adjust-color($base-color, $hue: 9, $saturation: 2%, $lightness: -21.5%);
$text-shadow-active: adjust-color($base-color, $hue: 5, $saturation: -12%, $lightness: -21.5%);
@if $grayscale == true {
$active-color: grayscale($active-color);
$border-active: grayscale($border-active);
$border-bottom-active: grayscale($border-bottom-active);
$inset-shadow-active: grayscale($inset-shadow-active);
$text-shadow-active: grayscale($text-shadow-active);
}
background: $active-color;
border: 1px solid $border-active;
border-bottom: 1px solid $border-bottom-active;
box-shadow: inset 0 0 6px 3px $inset-shadow-active, 0 1px 0 0 #fff;
text-shadow: 0 -1px 1px $text-shadow-active;
}
}

View File

@@ -1,29 +0,0 @@
// Micro clearfix provides an easy way to contain floats without adding additional markup
//
// Example usage:
//
// // Contain all floats within .wrapper
// .wrapper {
// @include clearfix;
// .content,
// .sidebar {
// float : left;
// }
// }
@mixin clearfix {
*zoom: 1;
&:before,
&:after {
content: " ";
display: table;
}
&:after {
clear: both;
}
}
// Acknowledgements
// Micro clearfix: [Nicolas Gallagher](http://nicolasgallagher.com/micro-clearfix-hack/)

View File

@@ -1,5 +0,0 @@
$georgia: Georgia, Cambria, "Times New Roman", Times, serif;
$helvetica: "Helvetica Neue", Helvetica, Arial, sans-serif;
$lucida-grande: "Lucida Grande", Tahoma, Verdana, Arial, sans-serif;
$monospace: "Bitstream Vera Sans Mono", Consolas, Courier, monospace;
$verdana: Verdana, Geneva, sans-serif;

View File

@@ -1,5 +0,0 @@
@mixin hide-text {
color: transparent;
font: 0/0 a;
text-shadow: none;
}

View File

@@ -1,56 +0,0 @@
//************************************************************************//
// Generate a variable ($all-text-inputs) with a list of all html5
// input types that have a text-based input, excluding textarea.
// http://diveintohtml5.org/forms.html
//************************************************************************//
$inputs-list: 'input[type="email"]',
'input[type="number"]',
'input[type="password"]',
'input[type="search"]',
'input[type="tel"]',
'input[type="text"]',
'input[type="url"]',
// Webkit & Gecko may change the display of these in the future
'input[type="color"]',
'input[type="date"]',
'input[type="datetime"]',
'input[type="datetime-local"]',
'input[type="month"]',
'input[type="time"]',
'input[type="week"]';
$unquoted-inputs-list: ();
@each $input-type in $inputs-list {
$unquoted-inputs-list: append($unquoted-inputs-list, unquote($input-type), comma);
}
$all-text-inputs: $unquoted-inputs-list;
// Hover Pseudo-class
//************************************************************************//
$all-text-inputs-hover: ();
@each $input-type in $unquoted-inputs-list {
$input-type-hover: $input-type + ":hover";
$all-text-inputs-hover: append($all-text-inputs-hover, $input-type-hover, comma);
}
// Focus Pseudo-class
//************************************************************************//
$all-text-inputs-focus: ();
@each $input-type in $unquoted-inputs-list {
$input-type-focus: $input-type + ":focus";
$all-text-inputs-focus: append($all-text-inputs-focus, $input-type-focus, comma);
}
// You must use interpolation on the variable:
// #{$all-text-inputs}
// #{$all-text-inputs-hover}
// #{$all-text-inputs-focus}
// Example
//************************************************************************//
// #{$all-text-inputs}, textarea {
// border: 1px solid red;
// }

View File

@@ -1,42 +0,0 @@
@mixin position ($position: relative, $coordinates: 0 0 0 0) {
@if type-of($position) == list {
$coordinates: $position;
$position: relative;
}
$top: nth($coordinates, 1);
$right: nth($coordinates, 2);
$bottom: nth($coordinates, 3);
$left: nth($coordinates, 4);
position: $position;
@if $top == auto {
top: $top;
}
@else if not(unitless($top)) {
top: $top;
}
@if $right == auto {
right: $right;
}
@else if not(unitless($right)) {
right: $right;
}
@if $bottom == auto {
bottom: $bottom;
}
@else if not(unitless($bottom)) {
bottom: $bottom;
}
@if $left == auto {
left: $left;
}
@else if not(unitless($left)) {
left: $left;
}
}

View File

@@ -1,49 +0,0 @@
//************************************************************************//
// Example: @include prefixer(border-radius, $radii, webkit ms spec);
//************************************************************************//
$prefix-for-webkit: true !default;
$prefix-for-mozilla: true !default;
$prefix-for-microsoft: true !default;
$prefix-for-opera: true !default;
$prefix-for-spec: true !default; // required for keyframe mixin
@mixin prefixer ($property, $value, $prefixes) {
@each $prefix in $prefixes {
@if $prefix == webkit {
@if $prefix-for-webkit {
-webkit-#{$property}: $value;
}
}
@else if $prefix == moz {
@if $prefix-for-mozilla {
-moz-#{$property}: $value;
}
}
@else if $prefix == ms {
@if $prefix-for-microsoft {
-ms-#{$property}: $value;
}
}
@else if $prefix == o {
@if $prefix-for-opera {
-o-#{$property}: $value;
}
}
@else if $prefix == spec {
@if $prefix-for-spec {
#{$property}: $value;
}
}
@else {
@warn "Unrecognized prefix: #{$prefix}";
}
}
}
@mixin disable-prefix-for-all() {
$prefix-for-webkit: false;
$prefix-for-mozilla: false;
$prefix-for-microsoft: false;
$prefix-for-opera: false;
$prefix-for-spec: false;
}

View File

@@ -1,32 +0,0 @@
@mixin retina-image($filename, $background-size, $extension: png, $retina-filename: null, $asset-pipeline: false) {
@if $asset-pipeline {
background-image: image_url($filename + "." + $extension);
}
@else {
background-image: url($filename + "." + $extension);
}
@include hidpi {
@if $asset-pipeline {
@if $retina-filename {
background-image: image_url($retina-filename + "." + $extension);
}
@else {
background-image: image_url($filename + "@2x" + "." + $extension);
}
}
@else {
@if $retina-filename {
background-image: url($retina-filename + "." + $extension);
}
@else {
background-image: url($filename + "@2x" + "." + $extension);
}
}
background-size: $background-size;
}
}

View File

@@ -1,44 +0,0 @@
@mixin size($size) {
@if length($size) == 1 {
@if $size == auto {
width: $size;
height: $size;
}
@else if unitless($size) {
width: $size + px;
height: $size + px;
}
@else if not(unitless($size)) {
width: $size;
height: $size;
}
}
// Width x Height
@if length($size) == 2 {
$width: nth($size, 1);
$height: nth($size, 2);
@if $width == auto {
width: $width;
}
@else if not(unitless($width)) {
width: $width;
}
@else if unitless($width) {
width: $width + px;
}
@if $height == auto {
height: $height;
}
@else if not(unitless($height)) {
height: $height;
}
@else if unitless($height) {
height: $height + px;
}
}
}

View File

@@ -1,32 +0,0 @@
// CSS cubic-bezier timing functions. Timing functions courtesy of jquery.easie (github.com/jaukia/easie)
// Timing functions are the same as demo'ed here: http://jqueryui.com/demos/effect/easing.html
// EASE IN
$ease-in-quad: cubic-bezier(0.550, 0.085, 0.680, 0.530);
$ease-in-cubic: cubic-bezier(0.550, 0.055, 0.675, 0.190);
$ease-in-quart: cubic-bezier(0.895, 0.030, 0.685, 0.220);
$ease-in-quint: cubic-bezier(0.755, 0.050, 0.855, 0.060);
$ease-in-sine: cubic-bezier(0.470, 0.000, 0.745, 0.715);
$ease-in-expo: cubic-bezier(0.950, 0.050, 0.795, 0.035);
$ease-in-circ: cubic-bezier(0.600, 0.040, 0.980, 0.335);
$ease-in-back: cubic-bezier(0.600, -0.280, 0.735, 0.045);
// EASE OUT
$ease-out-quad: cubic-bezier(0.250, 0.460, 0.450, 0.940);
$ease-out-cubic: cubic-bezier(0.215, 0.610, 0.355, 1.000);
$ease-out-quart: cubic-bezier(0.165, 0.840, 0.440, 1.000);
$ease-out-quint: cubic-bezier(0.230, 1.000, 0.320, 1.000);
$ease-out-sine: cubic-bezier(0.390, 0.575, 0.565, 1.000);
$ease-out-expo: cubic-bezier(0.190, 1.000, 0.220, 1.000);
$ease-out-circ: cubic-bezier(0.075, 0.820, 0.165, 1.000);
$ease-out-back: cubic-bezier(0.175, 0.885, 0.320, 1.275);
// EASE IN OUT
$ease-in-out-quad: cubic-bezier(0.455, 0.030, 0.515, 0.955);
$ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1.000);
$ease-in-out-quart: cubic-bezier(0.770, 0.000, 0.175, 1.000);
$ease-in-out-quint: cubic-bezier(0.860, 0.000, 0.070, 1.000);
$ease-in-out-sine: cubic-bezier(0.445, 0.050, 0.550, 0.950);
$ease-in-out-expo: cubic-bezier(1.000, 0.000, 0.000, 1.000);
$ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.150, 0.860);
$ease-in-out-back: cubic-bezier(0.680, -0.550, 0.265, 1.550);

View File

@@ -1,45 +0,0 @@
@mixin triangle ($size, $color, $direction) {
height: 0;
width: 0;
@if ($direction == up) or ($direction == down) or ($direction == right) or ($direction == left) {
border-color: transparent;
border-style: solid;
border-width: $size / 2;
@if $direction == up {
border-bottom-color: $color;
} @else if $direction == right {
border-left-color: $color;
} @else if $direction == down {
border-top-color: $color;
} @else if $direction == left {
border-right-color: $color;
}
}
@else if ($direction == up-right) or ($direction == up-left) {
border-top: $size solid $color;
@if $direction == up-right {
border-left: $size solid transparent;
} @else if $direction == up-left {
border-right: $size solid transparent;
}
}
@else if ($direction == down-right) or ($direction == down-left) {
border-bottom: $size solid $color;
@if $direction == down-right {
border-left: $size solid transparent;
} @else if $direction == down-left {
border-right: $size solid transparent;
}
}
}

View File

@@ -1,52 +0,0 @@
// http://www.w3.org/TR/css3-animations/#the-animation-name-property-
// Each of these mixins support comma separated lists of values, which allows different transitions for individual properties to be described in a single style rule. Each value in the list corresponds to the value at that same position in the other properties.
// Official animation shorthand property.
@mixin animation ($animations...) {
@include prefixer(animation, $animations, webkit moz spec);
}
// Individual Animation Properties
@mixin animation-name ($names...) {
@include prefixer(animation-name, $names, webkit moz spec);
}
@mixin animation-duration ($times...) {
@include prefixer(animation-duration, $times, webkit moz spec);
}
@mixin animation-timing-function ($motions...) {
// ease | linear | ease-in | ease-out | ease-in-out
@include prefixer(animation-timing-function, $motions, webkit moz spec);
}
@mixin animation-iteration-count ($values...) {
// infinite | <number>
@include prefixer(animation-iteration-count, $values, webkit moz spec);
}
@mixin animation-direction ($directions...) {
// normal | alternate
@include prefixer(animation-direction, $directions, webkit moz spec);
}
@mixin animation-play-state ($states...) {
// running | paused
@include prefixer(animation-play-state, $states, webkit moz spec);
}
@mixin animation-delay ($times...) {
@include prefixer(animation-delay, $times, webkit moz spec);
}
@mixin animation-fill-mode ($modes...) {
// none | forwards | backwards | both
@include prefixer(animation-fill-mode, $modes, webkit moz spec);
}

View File

@@ -1,3 +0,0 @@
@mixin appearance ($value) {
@include prefixer(appearance, $value, webkit moz ms o spec);
}

View File

@@ -1,6 +0,0 @@
//************************************************************************//
// Backface-visibility mixin
//************************************************************************//
@mixin backface-visibility($visibility) {
@include prefixer(backface-visibility, $visibility, webkit spec);
}

View File

@@ -1,48 +0,0 @@
//************************************************************************//
// Background-image property for adding multiple background images with
// gradients, or for stringing multiple gradients together.
//************************************************************************//
@mixin background-image($images...) {
background-image: _add-prefix($images, webkit);
background-image: _add-prefix($images);
}
@function _add-prefix($images, $vendor: false) {
$images-prefixed: ();
$gradient-positions: false;
@for $i from 1 through length($images) {
$type: type-of(nth($images, $i)); // Get type of variable - List or String
// If variable is a list - Gradient
@if $type == list {
$gradient-type: nth(nth($images, $i), 1); // linear or radial
$gradient-pos: null;
$gradient-args: null;
@if ($gradient-type == linear) or ($gradient-type == radial) {
$gradient-pos: nth(nth($images, $i), 2); // Get gradient position
$gradient-args: nth(nth($images, $i), 3); // Get actual gradient (red, blue)
}
@else {
$gradient-args: nth(nth($images, $i), 2); // Get actual gradient (red, blue)
}
$gradient-positions: _gradient-positions-parser($gradient-type, $gradient-pos);
$gradient: _render-gradients($gradient-positions, $gradient-args, $gradient-type, $vendor);
$images-prefixed: append($images-prefixed, $gradient, comma);
}
// If variable is a string - Image
@else if $type == string {
$images-prefixed: join($images-prefixed, nth($images, $i), comma);
}
}
@return $images-prefixed;
}
//Examples:
//@include background-image(linear-gradient(top, orange, red));
//@include background-image(radial-gradient(50% 50%, cover circle, orange, red));
//@include background-image(url("/images/a.png"), linear-gradient(orange, red));
//@include background-image(url("image.png"), linear-gradient(orange, red), url("image.png"));
//@include background-image(linear-gradient(hsla(0, 100%, 100%, 0.25) 0%, hsla(0, 100%, 100%, 0.08) 50%, transparent 50%), linear-gradient(orange, red));

View File

@@ -1,103 +0,0 @@
//************************************************************************//
// Background property for adding multiple backgrounds using shorthand
// notation.
//************************************************************************//
@mixin background(
$background-1 , $background-2: false,
$background-3: false, $background-4: false,
$background-5: false, $background-6: false,
$background-7: false, $background-8: false,
$background-9: false, $background-10: false,
$fallback: false
) {
$backgrounds: compact($background-1, $background-2,
$background-3, $background-4,
$background-5, $background-6,
$background-7, $background-8,
$background-9, $background-10);
$fallback-color: false;
@if (type-of($fallback) == color) or ($fallback == "transparent") {
$fallback-color: $fallback;
}
@else {
$fallback-color: _extract-background-color($backgrounds);
}
@if $fallback-color {
background-color: $fallback-color;
}
background: _background-add-prefix($backgrounds, webkit);
background: _background-add-prefix($backgrounds);
}
@function _extract-background-color($backgrounds) {
$final-bg-layer: nth($backgrounds, length($backgrounds));
@if type-of($final-bg-layer) == list {
@for $i from 1 through length($final-bg-layer) {
$value: nth($final-bg-layer, $i);
@if type-of($value) == color {
@return $value;
}
}
}
@return false;
}
@function _background-add-prefix($backgrounds, $vendor: false) {
$backgrounds-prefixed: ();
@for $i from 1 through length($backgrounds) {
$shorthand: nth($backgrounds, $i); // Get member for current index
$type: type-of($shorthand); // Get type of variable - List (gradient) or String (image)
// If shorthand is a list (gradient)
@if $type == list {
$first-member: nth($shorthand, 1); // Get first member of shorthand
// Linear Gradient
@if index(linear radial, nth($first-member, 1)) {
$gradient-type: nth($first-member, 1); // linear || radial
$gradient-args: false;
$gradient-positions: false;
$shorthand-start: false;
@if type-of($first-member) == list { // Linear gradient plus additional shorthand values - lg(red,orange)repeat,...
$gradient-positions: nth($first-member, 2);
$gradient-args: nth($first-member, 3);
$shorthand-start: 2;
}
@else { // Linear gradient only - lg(red,orange),...
$gradient-positions: nth($shorthand, 2);
$gradient-args: nth($shorthand, 3); // Get gradient (red, blue)
}
$gradient-positions: _gradient-positions-parser($gradient-type, $gradient-positions);
$gradient: _render-gradients($gradient-positions, $gradient-args, $gradient-type, $vendor);
// Append any additional shorthand args to gradient
@if $shorthand-start {
@for $j from $shorthand-start through length($shorthand) {
$gradient: join($gradient, nth($shorthand, $j), space);
}
}
$backgrounds-prefixed: append($backgrounds-prefixed, $gradient, comma);
}
// Image with additional properties
@else {
$backgrounds-prefixed: append($backgrounds-prefixed, $shorthand, comma);
}
}
// If shorthand is a simple string (color or image)
@else if $type == string {
$backgrounds-prefixed: join($backgrounds-prefixed, $shorthand, comma);
}
}
@return $backgrounds-prefixed;
}
//Examples:
//@include background(linear-gradient(top, orange, red));
//@include background(radial-gradient(circle at 40% 40%, orange, red));
//@include background(url("/images/a.png") no-repeat, linear-gradient(orange, red));
//@include background(url("image.png") center center, linear-gradient(orange, red), url("image.png"));

View File

@@ -1,55 +0,0 @@
@mixin border-image($images) {
-webkit-border-image: _border-add-prefix($images, webkit);
-moz-border-image: _border-add-prefix($images, moz);
-o-border-image: _border-add-prefix($images, o);
border-image: _border-add-prefix($images);
}
@function _border-add-prefix($images, $vendor: false) {
$border-image: null;
$images-type: type-of(nth($images, 1));
$first-var: nth(nth($images, 1), 1); // Get type of Gradient (Linear || radial)
// If input is a gradient
@if $images-type == string {
@if ($first-var == "linear") or ($first-var == "radial") {
$gradient-type: nth($images, 1); // Get type of gradient (linear || radial)
$gradient-pos: nth($images, 2); // Get gradient position
$gradient-args: nth($images, 3); // Get actual gradient (red, blue)
$gradient-positions: _gradient-positions-parser($gradient-type, $gradient-pos);
$border-image: _render-gradients($gradient-positions, $gradient-args, $gradient-type, $vendor);
}
// If input is a URL
@else {
$border-image: $images;
}
}
// If input is gradient or url + additional args
@else if $images-type == list {
$type: type-of(nth($images, 1)); // Get type of variable - List or String
// If variable is a list - Gradient
@if $type == list {
$gradient: nth($images, 1);
$gradient-type: nth($gradient, 1); // Get type of gradient (linear || radial)
$gradient-pos: nth($gradient, 2); // Get gradient position
$gradient-args: nth($gradient, 3); // Get actual gradient (red, blue)
$gradient-positions: _gradient-positions-parser($gradient-type, $gradient-pos);
$border-image: _render-gradients($gradient-positions, $gradient-args, $gradient-type, $vendor);
@for $i from 2 through length($images) {
$border-image: append($border-image, nth($images, $i));
}
}
}
@return $border-image;
}
//Examples:
// @include border-image(url("image.png"));
// @include border-image(url("image.png") 20 stretch);
// @include border-image(linear-gradient(45deg, orange, yellow));
// @include border-image(linear-gradient(45deg, orange, yellow) stretch);
// @include border-image(linear-gradient(45deg, orange, yellow) 20 30 40 50 stretch round);
// @include border-image(radial-gradient(top, cover, orange, yellow, orange));

View File

@@ -1,22 +0,0 @@
//************************************************************************//
// Shorthand Border-radius mixins
//************************************************************************//
@mixin border-top-radius($radii) {
@include prefixer(border-top-left-radius, $radii, spec);
@include prefixer(border-top-right-radius, $radii, spec);
}
@mixin border-bottom-radius($radii) {
@include prefixer(border-bottom-left-radius, $radii, spec);
@include prefixer(border-bottom-right-radius, $radii, spec);
}
@mixin border-left-radius($radii) {
@include prefixer(border-top-left-radius, $radii, spec);
@include prefixer(border-bottom-left-radius, $radii, spec);
}
@mixin border-right-radius($radii) {
@include prefixer(border-top-right-radius, $radii, spec);
@include prefixer(border-bottom-right-radius, $radii, spec);
}

View File

@@ -1,4 +0,0 @@
@mixin box-sizing ($box) {
// content-box | border-box | inherit
@include prefixer(box-sizing, $box, webkit moz spec);
}

View File

@@ -1,47 +0,0 @@
@mixin columns($arg: auto) {
// <column-count> || <column-width>
@include prefixer(columns, $arg, webkit moz spec);
}
@mixin column-count($int: auto) {
// auto || integer
@include prefixer(column-count, $int, webkit moz spec);
}
@mixin column-gap($length: normal) {
// normal || length
@include prefixer(column-gap, $length, webkit moz spec);
}
@mixin column-fill($arg: auto) {
// auto || length
@include prefixer(columns-fill, $arg, webkit moz spec);
}
@mixin column-rule($arg) {
// <border-width> || <border-style> || <color>
@include prefixer(column-rule, $arg, webkit moz spec);
}
@mixin column-rule-color($color) {
@include prefixer(column-rule-color, $color, webkit moz spec);
}
@mixin column-rule-style($style: none) {
// none | hidden | dashed | dotted | double | groove | inset | inset | outset | ridge | solid
@include prefixer(column-rule-style, $style, webkit moz spec);
}
@mixin column-rule-width ($width: none) {
@include prefixer(column-rule-width, $width, webkit moz spec);
}
@mixin column-span($arg: none) {
// none || all
@include prefixer(column-span, $arg, webkit moz spec);
}
@mixin column-width($length: auto) {
// auto || length
@include prefixer(column-width, $length, webkit moz spec);
}

View File

@@ -1,52 +0,0 @@
// CSS3 Flexible Box Model and property defaults
// Custom shorthand notation for flexbox
@mixin box($orient: inline-axis, $pack: start, $align: stretch) {
@include display-box;
@include box-orient($orient);
@include box-pack($pack);
@include box-align($align);
}
@mixin display-box {
display: -webkit-box;
display: -moz-box;
display: box;
}
@mixin box-orient($orient: inline-axis) {
// horizontal|vertical|inline-axis|block-axis|inherit
@include prefixer(box-orient, $orient, webkit moz spec);
}
@mixin box-pack($pack: start) {
// start|end|center|justify
@include prefixer(box-pack, $pack, webkit moz spec);
}
@mixin box-align($align: stretch) {
// start|end|center|baseline|stretch
@include prefixer(box-align, $align, webkit moz spec);
}
@mixin box-direction($direction: normal) {
// normal|reverse|inherit
@include prefixer(box-direction, $direction, webkit moz spec);
}
@mixin box-lines($lines: single) {
// single|multiple
@include prefixer(box-lines, $lines, webkit moz spec);
}
@mixin box-ordinal-group($int: 1) {
@include prefixer(box-ordinal-group, $int, webkit moz spec);
}
@mixin box-flex($value: 0.0) {
@include prefixer(box-flex, $value, webkit moz spec);
}
@mixin box-flex-group($int: 1) {
@include prefixer(box-flex-group, $int, webkit moz spec);
}

View File

@@ -1,23 +0,0 @@
// Order of the includes matters, and it is: normal, bold, italic, bold+italic.
@mixin font-face($font-family, $file-path, $weight: normal, $style: normal, $asset-pipeline: false ) {
@font-face {
font-family: $font-family;
font-weight: $weight;
font-style: $style;
@if $asset-pipeline == true {
src: font-url('#{$file-path}.eot');
src: font-url('#{$file-path}.eot?#iefix') format('embedded-opentype'),
font-url('#{$file-path}.woff') format('woff'),
font-url('#{$file-path}.ttf') format('truetype'),
font-url('#{$file-path}.svg##{$font-family}') format('svg');
} @else {
src: url('#{$file-path}.eot');
src: url('#{$file-path}.eot?#iefix') format('embedded-opentype'),
url('#{$file-path}.woff') format('woff'),
url('#{$file-path}.ttf') format('truetype'),
url('#{$file-path}.svg##{$font-family}') format('svg');
}
}
}

View File

@@ -1,10 +0,0 @@
// HiDPI mixin. Default value set to 1.3 to target Google Nexus 7 (http://bjango.com/articles/min-device-pixel-ratio/)
@mixin hidpi($ratio: 1.3) {
@media only screen and (-webkit-min-device-pixel-ratio: $ratio),
only screen and (min--moz-device-pixel-ratio: $ratio),
only screen and (-o-min-device-pixel-ratio: #{$ratio}/1),
only screen and (min-resolution: #{round($ratio*96)}dpi),
only screen and (min-resolution: #{$ratio}dppx) {
@content;
}
}

View File

@@ -1,13 +0,0 @@
@mixin image-rendering ($mode:optimizeQuality) {
@if ($mode == optimize-contrast) {
image-rendering: -moz-crisp-edges;
image-rendering: -o-crisp-edges;
image-rendering: -webkit-optimize-contrast;
image-rendering: optimize-contrast;
}
@else {
image-rendering: $mode;
}
}

View File

@@ -1,8 +0,0 @@
// Legacy support for inline-block in IE7 (maybe IE6)
@mixin inline-block {
display: inline-block;
vertical-align: baseline;
zoom: 1;
*display: inline;
*vertical-align: auto;
}

View File

@@ -1,43 +0,0 @@
// Adds keyframes blocks for supported prefixes, removing redundant prefixes in the block's content
@mixin keyframes($name) {
$original-prefix-for-webkit: $prefix-for-webkit;
$original-prefix-for-mozilla: $prefix-for-mozilla;
$original-prefix-for-microsoft: $prefix-for-microsoft;
$original-prefix-for-opera: $prefix-for-opera;
$original-prefix-for-spec: $prefix-for-spec;
@if $original-prefix-for-webkit {
@include disable-prefix-for-all();
$prefix-for-webkit: true;
@-webkit-keyframes #{$name} {
@content;
}
}
@if $original-prefix-for-mozilla {
@include disable-prefix-for-all();
$prefix-for-mozilla: true;
@-moz-keyframes #{$name} {
@content;
}
}
@if $original-prefix-for-opera {
@include disable-prefix-for-all();
$prefix-for-opera: true;
@-o-keyframes #{$name} {
@content;
}
}
@if $original-prefix-for-spec {
@include disable-prefix-for-all();
$prefix-for-spec: true;
@keyframes #{$name} {
@content;
}
}
$prefix-for-webkit: $original-prefix-for-webkit;
$prefix-for-mozilla: $original-prefix-for-mozilla;
$prefix-for-microsoft: $original-prefix-for-microsoft;
$prefix-for-opera: $original-prefix-for-opera;
$prefix-for-spec: $original-prefix-for-spec;
}

View File

@@ -1,41 +0,0 @@
@mixin linear-gradient($pos, $G1, $G2: false,
$G3: false, $G4: false,
$G5: false, $G6: false,
$G7: false, $G8: false,
$G9: false, $G10: false,
$deprecated-pos1: left top,
$deprecated-pos2: left bottom,
$fallback: false) {
// Detect what type of value exists in $pos
$pos-type: type-of(nth($pos, 1));
$pos-spec: null;
$pos-degree: null;
// If $pos is missing from mixin, reassign vars and add default position
@if ($pos-type == color) or (nth($pos, 1) == "transparent") {
$G10: $G9; $G9: $G8; $G8: $G7; $G7: $G6; $G6: $G5;
$G5: $G4; $G4: $G3; $G3: $G2; $G2: $G1; $G1: $pos;
$pos: null;
}
@if $pos {
$positions: _linear-positions-parser($pos);
$pos-degree: nth($positions, 1);
$pos-spec: nth($positions, 2);
}
$full: compact($G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10);
// Set $G1 as the default fallback color
$fallback-color: nth($G1, 1);
// If $fallback is a color use that color as the fallback color
@if (type-of($fallback) == color) or ($fallback == "transparent") {
$fallback-color: $fallback;
}
background-color: $fallback-color;
background-image: _deprecated-webkit-gradient(linear, $deprecated-pos1, $deprecated-pos2, $full); // Safari <= 5.0
background-image: -webkit-linear-gradient($pos-degree $full); // Safari 5.1+, Chrome
background-image: unquote("linear-gradient(#{$pos-spec}#{$full})");
}

View File

@@ -1,8 +0,0 @@
@mixin perspective($depth: none) {
// none | <length>
@include prefixer(perspective, $depth, webkit moz spec);
}
@mixin perspective-origin($value: 50% 50%) {
@include prefixer(perspective-origin, $value, webkit moz spec);
}

View File

@@ -1,29 +0,0 @@
$placeholders: '-webkit-input-placeholder',
'-moz-placeholder',
'-ms-input-placeholder';
@mixin placeholder {
@each $placeholder in $placeholders {
@if $placeholder == "-webkit-input-placeholder" {
&::#{$placeholder} {
@content;
}
}
@else if $placeholder == "-moz-placeholder" {
// FF 18-
&:#{$placeholder} {
@content;
}
// FF 19+
&::#{$placeholder} {
@content;
}
}
@else {
&:#{$placeholder} {
@content;
}
}
}
}

View File

@@ -1,44 +0,0 @@
// Requires Sass 3.1+
@mixin radial-gradient($G1, $G2,
$G3: false, $G4: false,
$G5: false, $G6: false,
$G7: false, $G8: false,
$G9: false, $G10: false,
$pos: null,
$shape-size: null,
$deprecated-pos1: center center,
$deprecated-pos2: center center,
$deprecated-radius1: 0,
$deprecated-radius2: 460,
$fallback: false) {
$data: _radial-arg-parser($G1, $G2, $pos, $shape-size);
$G1: nth($data, 1);
$G2: nth($data, 2);
$pos: nth($data, 3);
$shape-size: nth($data, 4);
$full: compact($G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10);
// Strip deprecated cover/contain for spec
$shape-size-spec: _shape-size-stripper($shape-size);
// Set $G1 as the default fallback color
$first-color: nth($full, 1);
$fallback-color: nth($first-color, 1);
@if (type-of($fallback) == color) or ($fallback == "transparent") {
$fallback-color: $fallback;
}
// Add Commas and spaces
$shape-size: if($shape-size, '#{$shape-size}, ', null);
$pos: if($pos, '#{$pos}, ', null);
$pos-spec: if($pos, 'at #{$pos}', null);
$shape-size-spec: if(($shape-size-spec != ' ') and ($pos == null), '#{$shape-size-spec}, ', '#{$shape-size-spec} ');
background-color: $fallback-color;
background-image: _deprecated-webkit-gradient(radial, $deprecated-pos1, $deprecated-pos2, $full, $deprecated-radius1, $deprecated-radius2); // Safari <= 5.0 && IOS 4
background-image: -webkit-radial-gradient(unquote(#{$pos}#{$shape-size}#{$full}));
background-image: unquote("radial-gradient(#{$shape-size-spec}#{$pos-spec}#{$full})");
}

View File

@@ -1,15 +0,0 @@
@mixin transform($property: none) {
// none | <transform-function>
@include prefixer(transform, $property, webkit moz ms o spec);
}
@mixin transform-origin($axes: 50%) {
// x-axis - left | center | right | length | %
// y-axis - top | center | bottom | length | %
// z-axis - length
@include prefixer(transform-origin, $axes, webkit moz ms o spec);
}
@mixin transform-style ($style: flat) {
@include prefixer(transform-style, $style, webkit moz ms o spec);
}

View File

@@ -1,34 +0,0 @@
// Shorthand mixin. Supports multiple parentheses-deliminated values for each variable.
// Example: @include transition (all, 2.0s, ease-in-out);
// @include transition ((opacity, width), (1.0s, 2.0s), ease-in, (0, 2s));
// @include transition ($property:(opacity, width), $delay: (1.5s, 2.5s));
@mixin transition ($properties...) {
@if length($properties) >= 1 {
@include prefixer(transition, $properties, webkit moz spec);
}
@else {
$properties: all 0.15s ease-out 0;
@include prefixer(transition, $properties, webkit moz spec);
}
}
@mixin transition-property ($properties...) {
-webkit-transition-property: transition-property-names($properties, 'webkit');
-moz-transition-property: transition-property-names($properties, 'moz');
transition-property: transition-property-names($properties, false);
}
@mixin transition-duration ($times...) {
@include prefixer(transition-duration, $times, webkit moz spec);
}
@mixin transition-timing-function ($motions...) {
// ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier()
@include prefixer(transition-timing-function, $motions, webkit moz spec);
}
@mixin transition-delay ($times...) {
@include prefixer(transition-delay, $times, webkit moz spec);
}

View File

@@ -1,3 +0,0 @@
@mixin user-select($arg: none) {
@include prefixer(user-select, $arg, webkit moz ms spec);
}

View File

@@ -1,11 +0,0 @@
// Remove `false` values from a list
@function compact($vars...) {
$list: ();
@each $var in $vars {
@if $var {
$list: append($list, $var, comma);
}
}
@return $list;
}

View File

@@ -1,39 +0,0 @@
// Flexible grid
@function flex-grid($columns, $container-columns: $fg-max-columns) {
$width: $columns * $fg-column + ($columns - 1) * $fg-gutter;
$container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;
@return percentage($width / $container-width);
}
// Flexible gutter
@function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) {
$container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;
@return percentage($gutter / $container-width);
}
// The $fg-column, $fg-gutter and $fg-max-columns variables must be defined in your base stylesheet to properly use the flex-grid function.
// This function takes the fluid grid equation (target / context = result) and uses columns to help define each.
//
// The calculation presumes that your column structure will be missing the last gutter:
//
// -- column -- gutter -- column -- gutter -- column
//
// $fg-column: 60px; // Column Width
// $fg-gutter: 25px; // Gutter Width
// $fg-max-columns: 12; // Total Columns For Main Container
//
// div {
// width: flex-grid(4); // returns (315px / 995px) = 31.65829%;
// margin-left: flex-gutter(); // returns (25px / 995px) = 2.51256%;
//
// p {
// width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%;
// float: left;
// margin: flex-gutter(4); // returns (25px / 315px) = 7.936508%;
// }
//
// blockquote {
// float: left;
// width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%;
// }
// }

View File

@@ -1,13 +0,0 @@
@function grid-width($n) {
@return $n * $gw-column + ($n - 1) * $gw-gutter;
}
// The $gw-column and $gw-gutter variables must be defined in your base stylesheet to properly use the grid-width function.
//
// $gw-column: 100px; // Column Width
// $gw-gutter: 40px; // Gutter Width
//
// div {
// width: grid-width(4); // returns 520px;
// margin-left: $gw-gutter; // returns 40px;
// }

View File

@@ -1,13 +0,0 @@
@function linear-gradient($pos, $gradients...) {
$type: linear;
$pos-type: type-of(nth($pos, 1));
// if $pos doesn't exist, fix $gradient
@if ($pos-type == color) or (nth($pos, 1) == "transparent") {
$gradients: zip($pos $gradients);
$pos: false;
}
$type-gradient: $type, $pos, $gradients;
@return $type-gradient;
}

View File

@@ -1,40 +0,0 @@
@function modular-scale($value, $increment, $ratio) {
@if $increment > 0 {
@for $i from 1 through $increment {
$value: ($value * $ratio);
}
}
@if $increment < 0 {
$increment: abs($increment);
@for $i from 1 through $increment {
$value: ($value / $ratio);
}
}
@return $value;
}
// div {
// Increment Up GR with positive value
// font-size: modular-scale(14px, 1, 1.618); // returns: 22.652px
//
// Increment Down GR with negative value
// font-size: modular-scale(14px, -1, 1.618); // returns: 8.653px
//
// Can be used with ceil(round up) or floor(round down)
// font-size: floor( modular-scale(14px, 1, 1.618) ); // returns: 22px
// font-size: ceil( modular-scale(14px, 1, 1.618) ); // returns: 23px
// }
//
// modularscale.com
@function golden-ratio($value, $increment) {
@return modular-scale($value, $increment, 1.618)
}
// div {
// font-size: golden-ratio(14px, 1); // returns: 22.652px
// }
//
// goldenratiocalculator.com

View File

@@ -1,8 +0,0 @@
// Convert pixels to ems
// eg. for a relational value of 12px write em(12) when the parent is 16px
// if the parent is another value say 24px write em(12, 24)
@function em($pxval, $base: 16) {
@return ($pxval / $base) * 1em;
}

View File

@@ -1,23 +0,0 @@
// This function is required and used by the background-image mixin.
@function radial-gradient($G1, $G2,
$G3: false, $G4: false,
$G5: false, $G6: false,
$G7: false, $G8: false,
$G9: false, $G10: false,
$pos: null,
$shape-size: null) {
$data: _radial-arg-parser($G1, $G2, $pos, $shape-size);
$G1: nth($data, 1);
$G2: nth($data, 2);
$pos: nth($data, 3);
$shape-size: nth($data, 4);
$type: radial;
$gradient: compact($G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10);
$type-gradient: $type, $shape-size $pos, $gradient;
@return $type-gradient;
}

View File

@@ -1,9 +0,0 @@
// Add percentage of white to a color
@function tint($color, $percent){
@return mix(white, $color, $percent);
}
// Add percentage of black to a color
@function shade($color, $percent){
@return mix(black, $color, $percent);
}

View File

@@ -1,22 +0,0 @@
// Return vendor-prefixed property names if appropriate
// Example: transition-property-names((transform, color, background), moz) -> -moz-transform, color, background
//************************************************************************//
@function transition-property-names($props, $vendor: false) {
$new-props: ();
@each $prop in $props {
$new-props: append($new-props, transition-property-name($prop, $vendor), comma);
}
@return $new-props;
}
@function transition-property-name($prop, $vendor: false) {
// put other properties that need to be prefixed here aswell
@if $vendor and $prop == transform {
@return unquote('-'+$vendor+'-'+$prop);
}
@else {
@return $prop;
}
}

View File

@@ -1,39 +0,0 @@
// Render Deprecated Webkit Gradient - Linear || Radial
//************************************************************************//
@function _deprecated-webkit-gradient($type,
$deprecated-pos1, $deprecated-pos2,
$full,
$deprecated-radius1: false, $deprecated-radius2: false) {
$gradient-list: ();
$gradient: false;
$full-length: length($full);
$percentage: false;
$gradient-type: $type;
@for $i from 1 through $full-length {
$gradient: nth($full, $i);
@if length($gradient) == 2 {
$color-stop: color-stop(nth($gradient, 2), nth($gradient, 1));
$gradient-list: join($gradient-list, $color-stop, comma);
}
@else if $gradient != null {
@if $i == $full-length {
$percentage: 100%;
}
@else {
$percentage: ($i - 1) * (100 / ($full-length - 1)) + "%";
}
$color-stop: color-stop(unquote($percentage), $gradient);
$gradient-list: join($gradient-list, $color-stop, comma);
}
}
@if $type == radial {
$gradient: -webkit-gradient(radial, $deprecated-pos1, $deprecated-radius1, $deprecated-pos2, $deprecated-radius2, $gradient-list);
}
@else if $type == linear {
$gradient: -webkit-gradient(linear, $deprecated-pos1, $deprecated-pos2, $gradient-list);
}
@return $gradient;
}

View File

@@ -1,13 +0,0 @@
@function _gradient-positions-parser($gradient-type, $gradient-positions) {
@if $gradient-positions
and ($gradient-type == linear)
and (type-of($gradient-positions) != color) {
$gradient-positions: _linear-positions-parser($gradient-positions);
}
@else if $gradient-positions
and ($gradient-type == radial)
and (type-of($gradient-positions) != color) {
$gradient-positions: _radial-positions-parser($gradient-positions);
}
@return $gradient-positions;
}

View File

@@ -1,61 +0,0 @@
@function _linear-positions-parser($pos) {
$type: type-of(nth($pos, 1));
$spec: null;
$degree: null;
$side: null;
$corner: null;
$length: length($pos);
// Parse Side and corner positions
@if ($length > 1) {
@if nth($pos, 1) == "to" { // Newer syntax
$side: nth($pos, 2);
@if $length == 2 { // eg. to top
// Swap for backwards compatability
$degree: _position-flipper(nth($pos, 2));
}
@else if $length == 3 { // eg. to top left
$corner: nth($pos, 3);
}
}
@else if $length == 2 { // Older syntax ("top left")
$side: _position-flipper(nth($pos, 1));
$corner: _position-flipper(nth($pos, 2));
}
@if ("#{$side} #{$corner}" == "left top") or ("#{$side} #{$corner}" == "top left") {
$degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
}
@else if ("#{$side} #{$corner}" == "right top") or ("#{$side} #{$corner}" == "top right") {
$degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
}
@else if ("#{$side} #{$corner}" == "right bottom") or ("#{$side} #{$corner}" == "bottom right") {
$degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
}
@else if ("#{$side} #{$corner}" == "left bottom") or ("#{$side} #{$corner}" == "bottom left") {
$degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
}
$spec: to $side $corner;
}
@else if $length == 1 {
// Swap for backwards compatability
@if $type == string {
$degree: $pos;
$spec: to _position-flipper($pos);
}
@else {
$degree: -270 - $pos; //rotate the gradient opposite from spec
$spec: $pos;
}
}
$degree: unquote($degree + ",");
$spec: unquote($spec + ",");
@return $degree $spec;
}
@function _position-flipper($pos) {
@return if($pos == left, right, null)
if($pos == right, left, null)
if($pos == top, bottom, null)
if($pos == bottom, top, null);
}

View File

@@ -1,69 +0,0 @@
@function _radial-arg-parser($G1, $G2, $pos, $shape-size) {
@each $value in $G1, $G2 {
$first-val: nth($value, 1);
$pos-type: type-of($first-val);
$spec-at-index: null;
// Determine if spec was passed to mixin
@if type-of($value) == list {
$spec-at-index: if(index($value, at), index($value, at), false);
}
@if $spec-at-index {
@if $spec-at-index > 1 {
@for $i from 1 through ($spec-at-index - 1) {
$shape-size: $shape-size nth($value, $i);
}
@for $i from ($spec-at-index + 1) through length($value) {
$pos: $pos nth($value, $i);
}
}
@else if $spec-at-index == 1 {
@for $i from ($spec-at-index + 1) through length($value) {
$pos: $pos nth($value, $i);
}
}
$G1: false;
}
// If not spec calculate correct values
@else {
@if ($pos-type != color) or ($first-val != "transparent") {
@if ($pos-type == number)
or ($first-val == "center")
or ($first-val == "top")
or ($first-val == "right")
or ($first-val == "bottom")
or ($first-val == "left") {
$pos: $value;
@if $pos == $G1 {
$G1: false;
}
}
@else if
($first-val == "ellipse")
or ($first-val == "circle")
or ($first-val == "closest-side")
or ($first-val == "closest-corner")
or ($first-val == "farthest-side")
or ($first-val == "farthest-corner")
or ($first-val == "contain")
or ($first-val == "cover") {
$shape-size: $value;
@if $value == $G1 {
$G1: false;
}
@else if $value == $G2 {
$G2: false;
}
}
}
}
}
@return $G1, $G2, $pos, $shape-size;
}

View File

@@ -1,18 +0,0 @@
@function _radial-positions-parser($gradient-pos) {
$shape-size: nth($gradient-pos, 1);
$pos: nth($gradient-pos, 2);
$shape-size-spec: _shape-size-stripper($shape-size);
$pre-spec: unquote(if($pos, "#{$pos}, ", null))
unquote(if($shape-size, "#{$shape-size},", null));
$pos-spec: if($pos, "at #{$pos}", null);
$spec: "#{$shape-size-spec} #{$pos-spec}";
// Add comma
@if ($spec != ' ') {
$spec: "#{$spec},"
}
@return $pre-spec $spec;
}

View File

@@ -1,26 +0,0 @@
// User for linear and radial gradients within background-image or border-image properties
@function _render-gradients($gradient-positions, $gradients, $gradient-type, $vendor: false) {
$pre-spec: null;
$spec: null;
$vendor-gradients: null;
@if $gradient-type == linear {
@if $gradient-positions {
$pre-spec: nth($gradient-positions, 1);
$spec: nth($gradient-positions, 2);
}
}
@else if $gradient-type == radial {
$pre-spec: nth($gradient-positions, 1);
$spec: nth($gradient-positions, 2);
}
@if $vendor {
$vendor-gradients: -#{$vendor}-#{$gradient-type}-gradient(#{$pre-spec} $gradients);
}
@else if $vendor == false {
$vendor-gradients: "#{$gradient-type}-gradient(#{$spec} #{$gradients})";
$vendor-gradients: unquote($vendor-gradients);
}
@return $vendor-gradients;
}

View File

@@ -1,10 +0,0 @@
@function _shape-size-stripper($shape-size) {
$shape-size-spec: null;
@each $value in $shape-size {
@if ($value == "cover") or ($value == "contain") {
$value: null;
}
$shape-size-spec: "#{$shape-size-spec} #{$value}";
}
@return $shape-size-spec;
}

View File

@@ -1,630 +0,0 @@
@import 'bourbon/bourbon';
@import '_variables';
@import '_typography';
@import '_solarized';
$skinnyContentWidth: 650px;
$contentWidth: 920px;
$contentPadding: 20px;
$columnWidth: 280px;
$columnGutter: 40px;
$twoColumnWidth: 2 * $columnWidth + $columnGutter;
// basic reset
* {
@include box-sizing(border-box);
border: none;
margin: 0;
padding: 0;
}
html {
background: $pageBg;
}
.left {
float: left;
}
.right {
float: right;
}
.container {
padding-top: 50px;
min-width: $contentWidth + (2 * $contentPadding);
}
.wrap {
width: $contentWidth + (2 * $contentPadding);
margin-left: auto;
margin-right: auto;
padding-left: 20px;
padding-right: 20px;
}
.skinnyWrap {
width: $skinnyContentWidth + (2 * $contentPadding);
margin-left: auto;
margin-right: auto;
padding-left: 20px;
padding-right: 20px;
}
hr {
height: 0;
border-top: 1px solid #ccc;
border-bottom: 1px solid #eee;
}
ul,
li {
margin-left: 20px;
}
// Main Nav
.nav-main {
@include clearfix;
background: $darkestColor;
color: $lightTextColor;
position: fixed;
top: 0;
height: 50px;
box-shadow: 0 0 5px rgba(0, 0, 0, .5);
width: 100%;
z-index: 100;
a {
color: $lightColor;
text-decoration: none;
}
.nav-site {
float: right;
margin: 0;
li {
margin: 0;
}
a {
padding: 0 8px;
text-transform: uppercase;
letter-spacing: 1px;
line-height: 50px;
display: inline-block;
height: 50px;
color: $mediumTextColor;
&:hover {
color: $lightTextColor;
}
&.active {
color: $lightTextColor;
border-bottom: 3px solid $primary;
background: #333;
}
}
}
.nav-home {
color: #00d8ff;
font-size: 24px;
line-height: 50px;
}
.nav-logo {
@include retina-image('../img/logo_small', 38px 38px);
vertical-align: middle;
}
ul {
display: inline;
}
li {
display: inline;
}
}
// Hero!
.hero {
height: 300px;
// background: $darkColor url(../img/header.png) no-repeat center;
background: $darkColor;
padding-top: 50px;
color: $lightColor;
font-weight: 300;
.text {
font-size: 64px;
text-align: center;
}
.minitext {
font-size: 16px;
text-align: center;
text-transform: uppercase;
}
strong {
color: $blueColor;
font-weight: 400;
}
}
.buttons-unit {
margin-top: 60px;
text-align: center;
a {
color: $blueColor;
}
.button {
font-size: 24px;
background: $primary;
color: $lightTextColor;
&:active {
background: darken($primary, 5%);
}
}
}
// Downloads
.buttons-unit.downloads {
margin: 30px 0;
}
// Docs Nav
.nav-docs {
color: $darkColor;
font-size: 14px;
// position: fixed;
float: left;
top: 100px;
width: 180px;
ul {
list-style: none;
margin: 0;
}
li {
margin: 0;
}
h3 {
text-transform: uppercase;
font-size: 14px;
}
a {
color: $mediumestColor;
display: block;
&:hover {
text-decoration: none;
color: $primary;
}
&.active {
color: $primary;
}
}
.nav-docs-section {
border-bottom: 1px solid #ccc;
border-top: 1px solid #eee;
padding: 12px 0;
&:first-child {
padding-top: 0;
border-top: 0;
}
&:last-child {
padding-bottom: 0;
border-bottom: 0;
}
}
}
// Home Page specifics
.home-section {
margin: 50px 0;
}
.home-divider {
border-top-color: #bbb;
margin: 0 auto;
width: 400px;
}
.marketing-row {
@include clearfix;
margin: 50px 0;
}
.marketing-col {
float: left;
margin-right: 40px;
width: $columnWidth;
h3 {
color: $darkColor;
font-size: 24px;
font-weight: normal;
text-transform: uppercase;
}
p {
font-size: 16px;
}
}
.marketing-col:last-child {
margin-right: 0;
}
#examples {
h3 {
color: $darkColor;
font-size: 24px;
font-weight: normal;
margin-bottom: 5px;
}
p {
margin: 0 0 25px 0;
max-width: $twoColumnWidth;
}
.example {
margin-top: 60px;
}
#todoExample {
font-size: 14px;
ul {
list-style-type: square;
margin: 0 0 10px 0;
}
input {
border: 1px solid #ccc;
font: 14px proxima-nova, $helvetica;
padding: 3px;
width: 150px;
}
button {
font: 14px proxima-nova, $helvetica;
margin-left: 5px;
padding: 4px 10px;
}
}
#markdownExample {
textarea {
border: 1px solid #ccc;
font: 14px proxima-nova, $helvetica;
margin-bottom: 10px;
padding: 5px;
}
}
}
.home-bottom-section {
margin-bottom: 100px;
}
.docs-nextprev {
@include clearfix;
}
.docs-prev {
float: left;
}
.docs-next {
float: right;
}
footer {
font-size: 13px;
font-weight: 600;
margin-top: 36px;
margin-bottom: 18px;
overflow: auto;
}
section.black content {
padding-bottom: 18px;
}
/**
* Docs
*/
.documentationContent {
@include clearfix;
.subHeader {
font-size: 24px;
}
// H2s form documentation topic dividers. Extra space helps.
h2 {
margin-top: 30px;
}
padding-top: 20px;
// Make a notice box out of blockquotes in the documetation:
blockquote {
padding: 15px 30px 15px 15px;
margin: 20px 0;
background-color: rgba(204, 122, 111, 0.09999999999999998);
border-left: 5px solid rgba(191, 87, 73, 0.19999999999999996);
h4 {
margin-top: 0;
}
p:last-child {
margin-bottom: 0;
}
// Treat first child as the title - promote to H4.
p:first-child {
font-weight: bold;
font-size: 17.5px;
line-height: 20px;
margin-top: 0;
text-rendering: optimizelegibility;
}
}
}
.docs-prevnext {
padding-top: 40px;
padding-bottom: 40px;
}
/* Button */
.button {
@include background(linear-gradient($buttonGreyTop, $buttonGreyBottom));
// border: 1px solid $darkestColor;
border-radius: 4px;
padding: 8px 16px;
font-size: 18px;
font-weight: 400;
margin: 0 12px;
// word-spacing: -2px;
// letter-spacing: 1px;
display: inline-block;
color: $lightTextColor;
text-decoration: none;
text-shadow: 0 1px 3px rgba(0, 0, 0, .3);
box-shadow: 0 1px 1px rgba(0, 0, 0, .2);
text-decoration: none;
&:hover {
text-decoration: none;
}
&:active {
box-shadow: none;
}
}
.hero {
.button {
box-shadow: 1px 3px 3px rgba(0, 0, 0, .3);
}
}
.button.blue {
@include background(linear-gradient($buttonBlueTop, $buttonBlueBottom));
}
/* Row */
.row {
padding-bottom: 4px;
}
.row .span4 {
width: 33.33%;
display: table-cell;
}
.row .span8 {
width: 66.66%;
display: table-cell;
}
.row .span6 {
width: 50%;
display: table-cell;
}
/* Content */
p {
margin: 10px 0;
}
.highlight {
padding: 10px;
margin-bottom: 20px;
}
.inner-content {
float: right;
width: $skinnyContentWidth;
}
.nosidebar .inner-content {
float: none;
margin: 0 auto;
}
/* Code Mirror */
div.CodeMirror pre, div.CodeMirror-linenumber, code {
font-family: 'source-code-pro', Menlo, 'Courier New', Consolas, monospace;
font-size: 13px;
line-height: 20px;
}
div.CodeMirror-linenumber:after {
content: '.';
}
.CodeMirror, div.CodeMirror-gutters, div.highlight {
border: none;
}
small code,
li code,
p code {
color: #555;
background-color: rgba(0, 0, 0, .04);
padding: 1px 3px;
}
.cm-s-default span.cm-string-2 {
color: inherit;
}
.playground {
@include clearfix;
}
.playground::before {
border-bottom: none !important;
border-radius: 3px 3px 0 0;
padding: 3px 7px;
font-size: 12px;
font-weight: bold;
color: #c2c0bc;
background-color: #f1ede4;
content: 'Live editor';
}
.playground::before,
.playgroundCode,
.playgroundPreview {
border: 1px solid rgba(16,16,16,0.1);
}
.playgroundCode {
border-radius: 0 3px 3px 3px;
float: left;
overflow: hidden;
width: $twoColumnWidth;
}
.playgroundPreview {
background-color: white;
border-radius: 3px;
float: right;
padding: 15px 20px;
width: $columnWidth;
}
.MarkdownEditor textarea {
width: 100%;
height: 100px
}
.hll {
background-color: #f7ebc6;
border-left: 5px solid #f7d87c;
display: block;
margin-left: -14px;
margin-right: -14px;
padding-left: 9px;
}
/* Codemirror doesn't support <jsx> syntax. Instead of highlighting it
as error, just ignore it */
.highlight .javascript .err {
background-color: transparent;
color: inherit;
}
.highlight {
position: relative;
margin-bottom: 14px;
padding: 30px 14px 14px;
border: none;
border-radius: 0;
overflow: auto;
}
.highlight pre {
padding: 0;
margin-top: 0;
margin-bottom: 0;
background-color: transparent;
border: 0;
}
.highlight pre code {
font-size: inherit;
}
.highlight pre .lineno {
display: inline-block;
width: 22px;
padding-right: 5px;
margin-right: 10px;
color: #bebec5;
text-align: right;
}
/* Echo out a label for the example */
.highlight:after {
position: absolute;
top: 0;
right: 0;
left: 0;
padding: 3px 7px;
font-size: 12px;
font-weight: bold;
color: #c2c0bc;
background-color: #f1ede4;
content: "Code";
}
.downloadCenter {
text-align: center;
margin-top: 20px;
margin-bottom: 25px;
}
.downloadSection:hover {
text-decoration: none !important;
}
@media screen and (max-width: 960px) {
.nav-main {
position: static;
}
.container {
padding-top: 0;
}
}

View File

@@ -1,23 +0,0 @@
<div class="nav-docs">
<div class="nav-docs-section">
<h3>Getting started</h3>
<ul>
<li><a href="/react/docs/getting-started.html"{% if page.id == 'docs-getting-started' %} class="active"{% endif %}>Getting Started</a></li>
<li><a href="/react/docs/tutorial.html"{% if page.id == 'docs-tutorial' %} class="active"{% endif %}>Tutorial</a></li>
<li><a href="/react/docs/common-questions.html"{% if page.id == 'docs-common-questions' %} class="active"{% endif %}>Common Questions</a></li>
</ul>
</div>
<div class="nav-docs-section">
<h3>Reference</h3>
<ul>
<li><a href="/react/docs/syntax.html"{% if page.id == 'docs-syntax' %} class="active"{% endif %}>JSX Syntax</a></li>
<li><a href="/react/docs/component-basics.html"{% if page.id == 'docs-component-basics' %} class="active"{% endif %}>Component Basics</a></li>
<li><a href="/react/docs/component-data.html"{% if page.id == 'docs-component-data' %} class="active"{% endif %}>Component Data</a></li>
<li><a href="/react/docs/component-lifecycle.html"{% if page.id == 'docs-component-lifecycle' %} class="active"{% endif %}>Component Lifecycle</a></li>
<li><a href="/react/docs/event-handling.html"{% if page.id == 'docs-event-handling' %} class="active"{% endif %}>Event Handling</a></li>
<li><a href="/react/docs/advanced-components.html"{% if page.id == 'docs-advanced-components' %} class="active"{% endif %}>Advanced Components</a></li>
<li><a href="/react/docs/api.html"{% if page.id == 'docs-api' %} class="active"{% endif %}>API</a></li>
</ul>
</div>
</div>

View File

@@ -1,19 +0,0 @@
/**
* @jsx React.DOM
*/
var HELLO_COMPONENT = "\
/** @jsx React.DOM */\n\
var HelloMessage = React.createClass({\n\
render: function() {\n\
return <div>{'Hello ' + this.props.name}</div>;\n\
}\n\
});\n\
\n\
React.renderComponent(<HelloMessage name=\"John\" />, mountNode);\
";
React.renderComponent(
<ReactPlayground codeText={HELLO_COMPONENT} />,
document.getElementById('helloExample')
);

View File

@@ -1,42 +0,0 @@
/**
* @jsx React.DOM
*/
var MARKDOWN_COMPONENT = "\
/** @jsx React.DOM */\n\
\n\
var converter = new Showdown.converter();\n\
\n\
var MarkdownEditor = React.createClass({\n\
getInitialState: function() {\n\
return {value: 'Type some *markdown* here!'};\n\
},\n\
handleKeyUp: React.autoBind(function() {\n\
this.setState({value: this.refs.textarea.getDOMNode().value});\n\
}),\n\
render: function() {\n\
return (\n\
<div className=\"MarkdownEditor\">\n\
<h3>Input</h3>\n\
<textarea onKeyUp={this.handleKeyUp} ref=\"textarea\">\n\
{this.state.value}\n\
</textarea>\n\
<h3>Output</h3>\n\
<div\n\
className=\"content\"\n\
dangerouslySetInnerHTML={{\n\
__html: converter.makeHtml(this.state.value)\n\
}}\n\
/>\n\
</div>\n\
);\n\
}\n\
});\n\
\n\
React.renderComponent(<MarkdownEditor />, mountNode);\
";
React.renderComponent(
<ReactPlayground codeText={MARKDOWN_COMPONENT} />,
document.getElementById('markdownExample')
);

View File

@@ -1,32 +0,0 @@
/**
* @jsx React.DOM
*/
var TIMER_COMPONENT = "\
/** @jsx React.DOM */\n\
var Timer = React.createClass({\n\
getInitialState: function() {\n\
return {secondsElapsed: 0};\n\
},\n\
tick: React.autoBind(function() {\n\
this.setState({secondsElapsed: this.state.secondsElapsed + 1});\n\
}),\n\
componentDidMount: function() {\n\
setInterval(this.tick, 1000);\n\
},\n\
render: function() {\n\
return (\n\
<div>\n\
{'Seconds Elapsed: ' + this.state.secondsElapsed}\n\
</div>\n\
);\n\
}\n\
});\n\
\n\
React.renderComponent(<Timer />, mountNode);\
";
React.renderComponent(
<ReactPlayground codeText={TIMER_COMPONENT} />,
document.getElementById('timerExample')
);

View File

@@ -1,57 +0,0 @@
/**
* @jsx React.DOM
*/
var TODO_COMPONENT = "\
/** @jsx React.DOM */\n\
var TodoList = React.createClass({\n\
render: function() {\n\
var items = this.props.items.map(function(item) {\n\
return <li>{item}</li>;\n\
});\n\
return <ul>{items}</ul>;\n\
}\n\
});\n\
\n\
var TodoCreate = React.createClass({\n\
handleSubmit: function() {\n\
var textInput = this.refs.textInput.getDOMNode();\n\
this.props.onCreate(textInput.value);\n\
textInput.value = '';\n\
return false;\n\
},\n\
render: function() {\n\
return (\n\
<form onSubmit={this.handleSubmit.bind(this)}>\n\
<input type=\"text\" ref=\"textInput\" />\n\
<button>Add</button>\n\
</form>\n\
);\n\
}\n\
});\n\
\n\
var TodoApp = React.createClass({\n\
getInitialState: function() {\n\
return {items: []};\n\
},\n\
onItemCreate: function(value) {\n\
this.setState({items: this.state.items.concat([value])});\n\
},\n\
render: function() {\n\
return (\n\
<div>\n\
<h3>TODO</h3>\n\
<TodoList items={this.state.items} />\n\
<TodoCreate onCreate={this.onItemCreate.bind(this)} />\n\
</div>\n\
);\n\
}\n\
});\n\
\n\
React.renderComponent(<TodoApp />, mountNode);\
";
React.renderComponent(
<ReactPlayground codeText={TODO_COMPONENT} />,
document.getElementById('todoExample')
);

View File

@@ -1,120 +0,0 @@
/**
* @jsx React.DOM
*/
var IS_MOBILE = (
navigator.userAgent.match(/Android/i)
|| navigator.userAgent.match(/webOS/i)
|| navigator.userAgent.match(/iPhone/i)
|| navigator.userAgent.match(/iPad/i)
|| navigator.userAgent.match(/iPod/i)
|| navigator.userAgent.match(/BlackBerry/i)
|| navigator.userAgent.match(/Windows Phone/i)
);
var CodeMirrorEditor = React.createClass({
componentDidMount: function(root) {
if (IS_MOBILE) {
return;
}
this.editor = CodeMirror.fromTextArea(this.refs.editor.getDOMNode(), {
mode: 'javascript',
lineNumbers: false,
matchBrackets: true,
theme: 'solarized-light'
});
this.editor.on('change', this.onChange.bind(this));
this.onChange();
},
onChange: function() {
if (this.props.onChange) {
var content = this.editor.getValue();
this.props.onChange(content);
}
},
render: function() {
// wrap in a div to fully contain CodeMirror
var editor;
if (IS_MOBILE) {
editor = <pre style={{overflow: 'scroll'}}>{this.props.codeText}</pre>;
} else {
editor = <textarea ref="editor">{this.props.codeText}</textarea>;
}
return (
<div class={this.props.className}>
{editor}
</div>
);
}
});
var ReactPlayground = React.createClass({
MODES: {XJS: 'XJS', JS: 'JS'}, //keyMirror({XJS: true, JS: true}),
getInitialState: function() {
return {mode: this.MODES.XJS, code: this.props.codeText};
},
bindState: function(name) {
return function(value) {
var newState = {};
newState[name] = value;
this.setState(newState);
}.bind(this);
},
getDesugaredCode: function() {
return JSXTransformer.transform(this.state.code).code;
},
render: function() {
var content;
if (this.state.mode === this.MODES.XJS) {
content =
<CodeMirrorEditor
onChange={this.bindState('code')}
class="playgroundStage"
codeText={this.state.code}
/>;
} else if (this.state.mode === this.MODES.JS) {
content =
<div class={{playgroundJS: true, playgroundStage: true}}>
{this.getDesugaredCode()}
</div>;
}
return (
<div class="playground">
<div class="playgroundCode">
{content}
</div>
<div class="playgroundPreview">
<div ref="mount" />
</div>
</div>
);
},
componentDidMount: function() {
this.executeCode();
},
componentDidUpdate: function() {
this.executeCode();
},
executeCode: function() {
var mountNode = this.refs.mount.getDOMNode();
try {
React.unmountAndReleaseReactRootNode(mountNode);
} catch (e) { }
try {
eval(this.getDesugaredCode());
} catch (e) {
React.renderComponent(<div content={e.toString()} class={{playgroundError: true}} />, mountNode);
}
}
});

View File

@@ -1,83 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>React | {{ page.title }}</title>
<meta name="viewport" content="width=device-width">
<meta property="og:title" content="React | {{ page.title }}" />
<meta property="og:type" content="website" />
<meta property="og:url" content="http://facebook.github.io/react{{ page.url }}" />
<meta property="og:image" content="http://facebook.github.io/react/img/logo_og.png" />
<meta property="og:description" content="A JavaScript library for building user interfaces" />
<link rel="shortcut icon" href="/react/favicon.ico">
<link rel="stylesheet" href="/react/css/react.css">
<link rel="stylesheet" href="/react/css/syntax.css">
<link rel="stylesheet" href="/react/css/codemirror.css">
<script type="text/javascript" src="//use.typekit.net/vqa1hcx.js"></script>
<script type="text/javascript">try{Typekit.load();}catch(e){}</script>
<script type="text/javascript" src="/react/js/codemirror.js"></script>
<script type="text/javascript" src="/react/js/javascript.js"></script>
<script type="text/javascript" src="/react/js/react.min.js"></script>
<script type="text/javascript" src="/react/js/JSXTransformer.js"></script>
<script type="text/javascript" src="/react/js/live_editor.js"></script>
<script type="text/javascript" src="/react/js/showdown.js"></script>
</head>
<body>
<div class="container">
<div class="nav-main">
<div class="wrap">
<a class="nav-home" href="/react/index.html">
<img class="nav-logo" alt="" src="/react/img/logo_small.png">
React
</a>
<ul class="nav-site">
<li><a href="/react/docs/getting-started.html"{% if page.sectionid == 'docs' %} class="active"{% endif %}>docs</a></li>
<li><a href="/react/support.html"{% if page.id == 'support' %} class="active"{% endif %}>support</a></li>
<li><a href="/react/downloads.html"{% if page.id == 'downloads' %} class="active"{% endif %}>download</a></li>
<li><a href="http://github.com/facebook/react">github</a>
</ul>
<!-- <iframe src="http://ghbtns.com/github&#45;btn.html?user=facebook&#38;repo=react.js&#38;type=fork"allowtransparency="true" frameborder="0" scrolling="0" width="62" height="20"></iframe> -->
</div>
</div>
{% if page.id == 'home' %}
<div class="hero">
<div class="wrap">
<div class="text"><strong>React</strong></div>
<div class="minitext">
A JavaScript library for building user interfaces
</div>
<div class="buttons-unit">
<a href="/react/docs/getting-started.html" class="button">Get Started</a>
<a href="/react/downloads.html" class="button">Download React v{{site.react_version}}</a>
</div>
</div>
</div>
{% endif %}
{{ content }}
<footer class="wrap">
<div class="left">A Facebook &amp; Instagram collaboration.</div>
<div class="right">&copy; 2013 Facebook Inc.</div>
</footer>
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-41298772-1', 'facebook.github.io');
ga('send', 'pageview');
</script>
</body>
</html>

View File

@@ -1,23 +0,0 @@
---
layout: default
sectionid: docs
---
<section class="content wrap documentationContent">
{% include nav_docs.html %}
<div class="inner-content">
<h1>{{ page.title }}</h1>
<div class="subHeader">{{ page.description }}</div>
{{ content }}
<div class="docs-prevnext">
{% if page.prev %}
<a class="docs-prev" href="/react/docs/{{ page.prev }}">&larr; Prev</a>
{% endif %}
{% if page.next %}
<a class="docs-next" href="/react/docs/{{ page.next }}">Next &rarr;</a>
{% endif %}
</div>
</div>
</section>

View File

@@ -1,7 +0,0 @@
---
layout: default
---
<section class="content wrap">
{{ content }}
</section>

View File

@@ -1,12 +0,0 @@
---
layout: default
---
<section class="content wrap">
<h2>{{ page.title }}</h2>
<p class="meta">{{ page.date | date_to_string }}</p>
<div id="post">
{{ content }}
</div>
</section>

View File

@@ -1,20 +0,0 @@
---
layout: default
---
<section class="content wrap documentationContent nosidebar">
<div class="inner-content">
<h1>{{ page.title }}</h1>
<div class="subHeader">{{ page.description }}</div>
{{ content }}
<div class="docs-prevnext">
{% if page.prev %}
<a class="docs-prev" href="/react/docs/{{ page.prev }}">&larr; Prev</a>
{% endif %}
{% if page.next %}
<a class="docs-next" href="/react/docs/{{ page.next }}">Next &rarr;</a>
{% endif %}
</div>
</div>
</section>

View File

@@ -1,39 +0,0 @@
# Replace Jekyll's handling of the Redcarpet code_block (which already adds
# support for highlighting, but needs support for the very non-standard
# "code fences with line highlights" extension).
# Since this is currently depending on Redcarpet to cooperate, we are going to
# be naive, and only allow line highlighting when a language is specified. If
# you don't want any syntax highlighting but want to highlight lines, then you
# need to specify text as your language, like:
# ```text{4}
module Jekyll
module Converters
class Markdown
class RedcarpetParser
module WithPygments
def block_code(code, lang)
require 'pygments'
lang_parts = lang && lang.split('{')
lang = lang_parts && !lang_parts[0].empty? && lang_parts[0] || 'text'
hl_lines = ''
if lang_parts && lang_parts.size >= 2
hl_lines = lang_parts[1].gsub(/[{}]/, '').split(',').map do |ln|
if matches = /(\d+)-(\d+)/.match(ln)
ln = Range.new(matches[1], matches[2]).to_a.join(' ')
end
ln
end.join(' ')
end
output = add_code_tags(
Pygments.highlight(code, :lexer => lang,
:options => { :encoding => 'utf-8', :hl_lines => hl_lines }),
lang
)
end
end
end
end
end
end

View File

@@ -1,239 +0,0 @@
/* BASICS */
.CodeMirror {
/* Set height, width, borders, and global font properties here */
font-family: monospace;
}
.CodeMirror-scroll {
/* Set scrolling behaviour here */
overflow: auto;
}
/* PADDING */
.CodeMirror-lines {
padding: 14px 0; /* Vertical padding around content */
}
.CodeMirror pre {
padding: 0 14px; /* Horizontal padding of content */
}
.CodeMirror-scrollbar-filler {
background-color: white; /* The little square between H and V scrollbars */
}
/* GUTTER */
.CodeMirror-gutters {
border-right: 1px solid #ddd;
background-color: #f7f7f7;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
padding: 0 3px 0 5px;
min-width: 20px;
text-align: right;
color: #999;
}
/* CURSOR */
.CodeMirror div.CodeMirror-cursor {
border-left: 1px solid black;
}
/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
border-left: 1px solid silver;
}
.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
width: auto;
border: 0;
background: transparent;
background: rgba(0, 200, 0, .4);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#6600c800, endColorstr=#4c00c800);
}
/* Kludge to turn off filter in ie9+, which also accepts rgba */
.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor:not(#nonsense_id) {
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
}
/* Can style cursor different in overwrite (non-insert) mode */
.CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {}
/* DEFAULT THEME */
.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable {color: black;}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3 {color: #085;}
.cm-s-default .cm-property {color: black;}
.cm-s-default .cm-operator {color: black;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-error {color: #f00;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-header {color: blue;}
.cm-s-default .cm-quote {color: #090;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}
.cm-negative {color: #d44;}
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;}
.cm-em {font-style: italic;}
.cm-emstrong {font-style: italic; font-weight: bold;}
.cm-link {text-decoration: underline;}
.cm-invalidchar {color: #f00;}
div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
/* STOP */
/* The rest of this file contains styles related to the mechanics of
the editor. You probably shouldn't touch them. */
.CodeMirror {
line-height: 1;
position: relative;
overflow: hidden;
}
.CodeMirror-scroll {
/* 30px is the magic margin used to hide the element's real scrollbars */
/* See overflow: hidden in .CodeMirror, and the paddings in .CodeMirror-sizer */
margin-bottom: -30px; margin-right: -30px;
padding-bottom: 30px; padding-right: 30px;
height: 100%;
outline: none; /* Prevent dragging from highlighting the element */
position: relative;
}
.CodeMirror-sizer {
position: relative;
}
/* The fake, visible scrollbars. Used to force redraw during scrolling
before actuall scrolling happens, thus preventing shaking and
flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler {
position: absolute;
z-index: 6;
display: none;
}
.CodeMirror-vscrollbar {
right: 0; top: 0;
overflow-x: hidden;
overflow-y: scroll;
}
.CodeMirror-hscrollbar {
bottom: 0; left: 0;
overflow-y: hidden;
overflow-x: scroll;
}
.CodeMirror-scrollbar-filler {
right: 0; bottom: 0;
z-index: 6;
}
.CodeMirror-gutters {
position: absolute; left: 0; top: 0;
height: 100%;
z-index: 3;
}
.CodeMirror-gutter {
height: 100%;
display: inline-block;
/* Hack to make IE7 behave */
*zoom:1;
*display:inline;
}
.CodeMirror-gutter-elt {
position: absolute;
cursor: default;
z-index: 4;
}
.CodeMirror-lines {
cursor: text;
}
.CodeMirror pre {
/* Reset some styles that the rest of the page might have set */
-moz-border-radius: 0; -webkit-border-radius: 0; -o-border-radius: 0; border-radius: 0;
border-width: 0;
background: transparent;
font-family: inherit;
font-size: inherit;
margin: 0;
white-space: pre;
word-wrap: normal;
line-height: inherit;
color: inherit;
z-index: 2;
position: relative;
overflow: visible;
}
.CodeMirror-wrap pre {
word-wrap: break-word;
white-space: pre-wrap;
word-break: normal;
}
.CodeMirror-linebackground {
position: absolute;
left: 0; right: 0; top: 0; bottom: 0;
z-index: 0;
}
.CodeMirror-linewidget {
position: relative;
z-index: 2;
overflow: auto;
}
.CodeMirror-wrap .CodeMirror-scroll {
overflow-x: hidden;
}
.CodeMirror-measure {
position: absolute;
width: 100%; height: 0px;
overflow: hidden;
visibility: hidden;
}
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor {
position: absolute;
visibility: hidden;
border-right: none;
width: 0;
}
.CodeMirror-focused div.CodeMirror-cursor {
visibility: visible;
}
.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
.cm-searching {
background: #ffa;
background: rgba(255, 255, 0, .4);
}
/* IE7 hack to prevent it from returning funny offsetTops on the spans */
.CodeMirror span { *vertical-align: text-bottom; }
@media print {
/* Hide the cursor when printing */
.CodeMirror div.CodeMirror-cursor {
visibility: hidden;
}
}

View File

@@ -1,165 +0,0 @@
/*****************************************************************************/
/*
/* Common
/*
/*****************************************************************************/
/* Global Reset */
* {
margin: 0;
padding: 0;
}
html, body { height: 100%; }
body {
background-color: #FFF;
font: 13.34px Helvetica, Arial, sans-serif;
font-size: small;
text-align: center;
}
h1, h2, h3, h4, h5, h6 {
font-size: 100%; }
h1 { margin-bottom: 1em; }
p { margin: 1em 0; }
a { color: #00a; }
a:hover { color: #000; }
a:visited { color: #a0a; }
table {
font-size: inherit;
font: 100%;
}
/*****************************************************************************/
/*
/* Home
/*
/*****************************************************************************/
ul.posts {
list-style-type: none;
margin-bottom: 2em;
}
ul.posts li {
line-height: 1.75em;
}
ul.posts span {
color: #aaa;
font-family: Monaco, "Courier New", monospace;
font-size: 80%;
}
/*****************************************************************************/
/*
/* Site
/*
/*****************************************************************************/
.site {
font-size: 115%;
text-align: justify;
width: 42em;
margin: 3em auto 2em;
line-height: 1.5em;
}
.site .header a {
font-weight: bold;
text-decoration: none;
}
.site .header h1.title {
display: inline-block;
margin-bottom: 2em;
}
.site .header h1.title a {
color: #a00;
}
.site .header h1.title a:hover {
color: #000;
}
.site .header a.extra {
color: #aaa;
margin-left: 1em;
}
.site .header a.extra:hover {
color: #000;
}
.site .meta {
color: #aaa;
}
.site .footer {
font-size: 80%;
color: #666;
border-top: 4px solid #eee;
margin-top: 2em;
overflow: hidden;
}
.site .footer .contact {
float: left;
margin-right: 3em;
}
.site .footer .contact a {
color: #8085C1;
}
.site .footer .rss {
margin-top: 1.1em;
margin-right: -.2em;
float: right;
}
.site .footer .rss img {
border: 0;
}
/*****************************************************************************/
/*
/* Posts
/*
/*****************************************************************************/
/* standard */
#post pre {
border: 1px solid #ddd;
background-color: #eef;
padding: 0 .4em;
}
#post ul, #post ol {
margin-left: 1.35em;
}
#post code {
border: 1px solid #ddd;
background-color: #eef;
padding: 0 .2em;
}
#post pre code {
border: none;
}
/* terminal */
#post pre.terminal {
border: 1px solid #000;
background-color: #333;
color: #FFF;
}
#post pre.terminal code {
background-color: #333;
}

View File

@@ -1,409 +0,0 @@
.highlight pre code {
color: #637c84;
}
.highlight {
color: #333333;
background: #f8f5ec;
}
.highlight .c {
color: #93a1a1;
}
.highlight .g {
color: #637c84;
}
/* Generic */
.highlight .k {
color: #859900;
}
/* Keyword */
.highlight .l {
color: #637c84;
}
/* Literal */
.highlight .n {
color: #637c84;
}
/* Name */
.highlight .o {
color: #859900;
}
/* Operator */
.highlight .x {
color: #cc7a6f;
}
/* Other */
.highlight .p {
color: #637c84;
}
/* Punctuation */
.highlight .cm {
color: #93a1a1;
}
/* Comment.Multiline */
.highlight .cp {
color: #859900;
}
/* Comment.Preproc */
.highlight .c1 {
color: #93a1a1;
}
/* Comment.Single */
.highlight .cs {
color: #859900;
}
/* Comment.Special */
.highlight .gd {
color: #36958e;
}
/* Generic.Deleted */
.highlight .ge {
font-style: italic;
color: #637c84;
}
/* Generic.Emph */
.highlight .gr {
color: #dc322f;
}
/* Generic.Error */
.highlight .gh {
color: #cc7a6f;
}
/* Generic.Heading */
.highlight .gi {
color: #859900;
}
/* Generic.Inserted */
.highlight .go {
color: #637c84;
}
/* Generic.Output */
.highlight .gp {
color: #637c84;
}
/* Generic.Prompt */
.highlight .gs {
font-weight: bold;
color: #637c84;
}
/* Generic.Strong */
.highlight .gu {
color: #cc7a6f;
}
/* Generic.Subheading */
.highlight .gt {
color: #637c84;
}
/* Generic.Traceback */
.highlight .kc {
color: #cc7a6f;
}
/* Keyword.Constant */
.highlight .kd {
color: #268bd2;
}
/* Keyword.Declaration */
.highlight .kn {
color: #859900;
}
/* Keyword.Namespace */
.highlight .kp {
color: #859900;
}
/* Keyword.Pseudo */
.highlight .kr {
color: #268bd2;
}
/* Keyword.Reserved */
.highlight .kt {
color: #dc322f;
}
/* Keyword.Type */
.highlight .ld {
color: #637c84;
}
/* Literal.Date */
.highlight .m {
color: #36958e;
}
/* Literal.Number */
.highlight .s {
color: #36958e;
}
/* Literal.String */
.highlight .na {
color: #637c84;
}
/* Name.Attribute */
.highlight .nb {
color: #b58900;
}
/* Name.Builtin */
.highlight .nc {
color: #268bd2;
}
/* Name.Class */
.highlight .no {
color: #cc7a6f;
}
/* Name.Constant */
.highlight .nd {
color: #268bd2;
}
/* Name.Decorator */
.highlight .ni {
color: #cc7a6f;
}
/* Name.Entity */
.highlight .ne {
color: #cc7a6f;
}
/* Name.Exception */
.highlight .nf {
color: #268bd2;
}
/* Name.Function */
.highlight .nl {
color: #637c84;
}
/* Name.Label */
.highlight .nn {
color: #637c84;
}
/* Name.Namespace */
.highlight .nx {
color: #637c84;
}
/* Name.Other */
.highlight .py {
color: #637c84;
}
/* Name.Property */
.highlight .nt {
color: #268bd2;
}
/* Name.Tag */
.highlight .nv {
color: #268bd2;
}
/* Name.Variable */
.highlight .ow {
color: #859900;
}
/* Operator.Word */
.highlight .w {
color: #637c84;
}
/* Text.Whitespace */
.highlight .mf {
color: #36958e;
}
/* Literal.Number.Float */
.highlight .mh {
color: #36958e;
}
/* Literal.Number.Hex */
.highlight .mi {
color: #36958e;
}
/* Literal.Number.Integer */
.highlight .mo {
color: #36958e;
}
/* Literal.Number.Oct */
.highlight .sb {
color: #93a1a1;
}
/* Literal.String.Backtick */
.highlight .sc {
color: #36958e;
}
/* Literal.String.Char */
.highlight .sd {
color: #637c84;
}
/* Literal.String.Doc */
.highlight .s2 {
color: #36958e;
}
/* Literal.String.Double */
.highlight .se {
color: #cc7a6f;
}
/* Literal.String.Escape */
.highlight .sh {
color: #637c84;
}
/* Literal.String.Heredoc */
.highlight .si {
color: #36958e;
}
/* Literal.String.Interpol */
.highlight .sx {
color: #36958e;
}
/* Literal.String.Other */
.highlight .sr {
color: #dc322f;
}
/* Literal.String.Regex */
.highlight .s1 {
color: #36958e;
}
/* Literal.String.Single */
.highlight .ss {
color: #36958e;
}
/* Literal.String.Symbol */
.highlight .bp {
color: #268bd2;
}
/* Name.Builtin.Pseudo */
.highlight .vc {
color: #268bd2;
}
/* Name.Variable.Class */
.highlight .vg {
color: #268bd2;
}
/* Name.Variable.Global */
.highlight .vi {
color: #268bd2;
}
/* Name.Variable.Instance */
.highlight .il {
color: #36958e;
}

View File

@@ -1,119 +0,0 @@
---
id: docs-advanced-components
title: Advanced Components
description: How to build advanced composite components.
layout: docs
prev: event-handling.html
next: api.html
---
Composite components extend a `ReactCompositeComponent` base class that provides
a very powerful API that makes React flexible and able to easily work with other
libraries and frameworks.
## Lifecycle Methods
Composite components can optionally implement lifecycle methods that are invoked
at various stages in the [component lifecycle](component-lifecycle.html) that
each have unique guarantees.
### Mounting
- `getInitialState(): object` is invoked before a component is mounted.
Stateful components should implement this and return the initial state data.
- `componentWillMount()` is invoked immediately before mounting occurs.
- `componentDidMount(DOMElement rootNode)` is invoked immediately after
mounting occurs. Initialization that requires DOM nodes should go here.
### Updating
- `componentWillReceiveProps(object nextProps)` is invoked when a mounted
component receives new props. This method should be used to compare
`this.props` and `nextProps` to perform state transitions using
`this.setState()`.
- `shouldComponentUpdate(object nextProps, object nextState): boolean` is
invoked when a component decides whether any changes warrant an update to the
DOM. Implement this as an optimization to compare `this.props` with
`nextProps` and `this.state` with `nextState` and return false if React
should skip updating.
- `componentWillUpdate(object nextProps, object nextState)` is invoked
immediately before updating occurs. You cannot call `this.setState()` here.
- `componentDidUpdate(object prevProps, object prevState, DOMElement rootNode)`
is invoked immediately after updating occurs.
### Unmounting
- `componentWillUnmount()` is invoked immediately before a component is
unmounted and destroyed. Cleanup should go here.
## Mounted Methods
_Mounted_ composite components also support the following methods:
- `getDOMNode(): DOMElement` can be invoked on any mounted component in order
to obtain a reference to its rendered DOM node.
- `forceUpdate()` can be invoked on any mounted component when you know that
some deeper aspect of the component's state has changed without using
`this.setState()`.
> Note:
>
> The `DOMElement rootNode` argument of `componentDidMount()` and
> `componentDidUpdate()` is a convenience. The same node can be obtained by
> calling `this.getDOMNode()`.
## Component Refs
A common use case of event callbacks or the lifecycle methods is to operate on a
component returned by `render()`. For example, consider a search component that
should auto-focus the input once mounted:
```javascript
var SearchForm = React.createClass({
render: function() {
return (
<form action={this.props.action}>
<input type="search" placeholder="Search..." />
</form>
);
},
componentDidMount: function(rootNode) {
var searchInput = rootNode.firstChild;
searchInput.focus();
}
});
```
Although this implementation works, it is fragile because `componentDidMount()`
now relies on `render()` returning a particular DOM structure.
React provides a better way for composite components to reference components
that it constructs in its `render()` method through the use of refs. A component
can assign a `ref` to any component it constructs. This will create a reference
to those components on `this.refs`. For example:
```javascript{5,10}
var SearchForm = React.createClass({
render: function() {
return (
<form action={this.props.action}>
<input type="search" placeholder="Search..." ref="searchInput" />
</form>
);
},
componentDidMount: function(rootNode) {
var searchInput = this.refs.searchInput.getDOMNode();
searchInput.focus();
}
});
```
In this example, `this.refs.searchInput` will reference the `<input>` component
and is available in most lifecycle methods and event callbacks. We obtain a
reference to the `<input>`'s DOM node using `getDOMNode()`.
> Note:
>
> If you want to preserve compatibility with Google Closure Compiler's
> property crushing in `ADVANCED_OPTIMIZATIONS` mode, make sure to use string
> literals with `this.refs`.

View File

@@ -1,150 +0,0 @@
---
id: docs-api
title: React API
layout: docs
prev: advanced-components.html
---
## React
`React` is the entry point to the React framework. If you're using one of the prebuilt packages it's available as a global; if you're using CommonJS modules you can `require()` it.
#### React.DOM
`React.DOM` provides all of the standard HTML tags needed to build a React app. You generally don't use it directly; instead, just include it as part of the `/** @jsx React.DOM */` docblock.
#### React.initializeTouchEvents
```javascript
initializeTouchEvents(boolean shouldUseTouch)
```
Configure React's event system to handle touch events on mobile devices.
#### React.autoBind
```javascript
function autoBind(function method)
```
Marks the provided function to be automatically bound to each React component instance created. This allows React components to define automatically bound methods and ensure that when called they will always reference their current instance.
Example:
```javascript
React.createClass({
click: React.autoBind(function(evt) {
this.setState({jumping: true});
}),
render: function() {
// Look: no bind!
return <a onClick={this.click}>Jump</a>;
}
});
```
#### React.createClass
```javascript
function createClass(object specification)
```
Creates a component given a specification. A component implements a `render` method which returns a single child. That child may have an arbitrarily deep child structure. One thing that makes components different than a standard prototypal classes is that you don't need to call new on them. They are convenience wrappers that construct backing instances (via new) for you.
#### React.renderComponent
```javascript
ReactComponent renderComponent(ReactComponent container, DOMElement mountPoint)
```
Renders a React component into the DOM in the supplied `container`.
If the React component was previously rendered into `container`, this will perform an update on it and only mutate the DOM as necessary to reflect the latest React component.
## AbstractEvent
Your event handlers will be passed instances of `AbstractEvent`, a cross-browser wrapper around the browser's native event. It has the same interface as the browser's native event (such as `stopPropagation()` and `preventDefault()`) except they work exactly the same across all browsers.
If you find that you need the underlying browser event for some reason, simply use the `nativeEvent` attribute to get it.
## ReactComponent
Component classses created by `createClass()` return instances of `ReactComponent` when called. Most of the time when you're using React you're either creating or consuming `ReactComponent`s.
#### getDOMNode
```javascript
DOMElement getDOMNode()
```
If this component has been mounted into the DOM, this returns the corresponding native browser DOM element. This method is useful for reading values out of the DOM, such as form field values and performing DOM measurements.
#### setProps
```javascript
setProps(object nextProps)
```
When you're integrating with an external JavaScript application you may want to signal a change to a React component rendered with `renderComponent()`. Simply call `setProps()` to change its properties and trigger a re-render.
**Note:** This method can only be called on a root-level component. That is, it's only available on the component passed directly to `renderComponent()` and none of its children. If you're inclined to use `setProps()` on a child component, instead take advantage of reactive updates and pass the new prop to the child component when it's created in `render()`.
#### replaceProps
```javascript
replaceProps(object nextProps)
```
Like `setProps()` but deletes any pre-existing props that are not in nextProps.
#### transferPropsTo
```javascript
ReactComponent transferPropsTo(ReactComponent targetComponent)
```
Transfer properties from this component to a target component that have not already been set on the target component. This is usually used to pass down properties to the returned root component. `targetComponent`, now updated with some new props is returned as a convenience.
#### setState
```javascript
setState(object nextState)
```
Merges nextState with the current state. This is the primary method you use to trigger UI updates from event handlers and server request callbacks.
**Note:** *NEVER* mutate `this.state` directly. As calling `setState()` afterwards may replace the mutation you made. Treat `this.state` as if it were immutable.
**Note:** `setState()` does not immediately mutate `this.state` but creates a pending state transition. Accessing `this.state` after calling this method can potentially return the existing value.
#### replaceState
```javascript
replaceState(object nextState)
```
Like `setState()` but deletes any pre-existing state keys that are not in nextState.
#### forceUpdate()
```javascript
forceUpdate()
```
If your `render()` method reads from something other than `this.props` or `this.state` you'll need to tell React when it needs to re-run `render()`. Use `forceUpdate()` to cause React to automatically re-render. This will cause `render()` to be called on the component and all of its children but React will only update the DOM if the markup changes.
Normally you should try to avoid all uses of `forceUpdate()` and only read from `this.props` and `this.state` in `render()`. This makes your application much simpler and more efficient.
```javascript
object getInitialState()
componentWillMount()
componentDidMount(DOMElement domNode)
componentWillReceiveProps(object nextProps)
boolean shouldComponentUpdate(object nextProps, object nextState)
componentWillUpdate(object nextProps, object nextState)
ReactComponent render()
componentDidUpdate(object prevProps, object prevState, DOMElement domNode)
componentWillUnmount()
```
See the [advanced components](advanced-components.html) documentation for more details on these lifecycle methods.

View File

@@ -1,22 +0,0 @@
---
id: docs-common-questions
title: Common Questions
layout: docs
prev: tutorial.html
next: syntax.html
---
### What browsers does React support?
React supports the latest two Chrome, Firefox, Safari, and Internet Explorer versions. React can work with Internet Explorer 8 with polyfills.
### How do I get React to support Internet Explorer 8?
React requires ES5 JavaScript shims to run in Internet Explorer 8. Include the [ES5 Shims](https://github.com/kriskowal/es5-shim) to implement these shims.
### Who uses React?
The [Instagram](http://instagram.com/) website is built entirely in React. The [Facebook](https://www.facebook.com/) website is also increasingly using React, including the common commenting plugin across the site.
### Can I integrate with other JavaScript libraries?
Absolutely! In fact, we encourage it! See [our GitHub repo](http://github.com/facebook/react/) for a [TodoMVC example using Backbone](https://github.com/facebook/react/tree/master/examples/todomvc-backbone) and a [jQuery + Bootstrap modal demo](https://github.com/facebook/react/tree/master/examples/jquery-bootstrap).

View File

@@ -1,73 +0,0 @@
---
id: docs-component-basics
title: Component Basics
description: What are components?
layout: docs
next: component-data.html
prev: syntax.html
---
_Components_ are the basic units of composition in React. Components encapsulate
the logic necessary to take input parameters and render markup. Components can
be rendered into an existing DOM element on the page by using
`React.renderComponent`:
```javascript
// Replaces everything in `document.body` with <div>Hello, world!</div>;
React.renderComponent(<div>Hello, world!</div>, document.body);
```
Keep in mind that `<div>` is **not** a DOM element! Keep reading...
## Types of Components
There are two types of components:
- **Composite Components**
- **DOM Components**
### Composite Components <small>such as `TodoApp` and `Typeahead`.</small>
The majority of your React code will be implementing composite components.
Composite components are higher-level components with custom rendering logic
that may compose other composite components or DOM components.
```javascript
/** @jsx React.DOM */
var LinkButton = React.createClass({
render: function() {
return <a className="btn" />;
}
});
var myButton = <LinkButton />;
```
This example defines a `LinkButton` component class using `React.createClass()`,
and its `render()` method composes the `<a>` DOM component.
### DOM Components <small>such as `div` and `span`.</small>
DOM components are the set of classes that correspond to browser DOM elements.
They are defined in `React.DOM` and can be brought "into scope" by setting
`@jsx React.DOM` in the docblock. See [JSX Syntax](syntax.html) for more
details.
Although `React.DOM` components look like browser DOM elements, they differ in a
few ways:
- All property names, including event handlers, are camelCased.
- JavaScript identifiers should be used, namely `className` and `htmlFor`.
- The `style` prop expects an object instead of a string. The object should map
camelCased style properties to values, e.g. `{backgroundColor: '#fff'}`.
Here is an example of a React link styled as a button with a click handler:
```javascript
/** @jsx React.DOM */
var handleClick = function() {alert('Clicked!');};
var inlineStyle = {textDecoration: 'none'};
var myLink = <a className="btn" onClick={handleClick} style={inlineStyle} />;
```

View File

@@ -1,145 +0,0 @@
---
id: docs-component-data
title: Component Data
description: How is data passed into a component?
layout: docs
prev: component-basics.html
next: component-lifecycle.html
---
## Props
Components use data to determine what should be rendered. For example:
```javascript
var LikeLink = React.createClass({
render: function() {
var text = this.props.liked ? 'Liked' : 'Like';
return <a>{text}</a>;
}
});
var myLikeLink = <LikeLink liked={false} />;
```
In this example, `LikeLink` takes `liked` as boolean data. This type of data
that is passed in is called a "prop". Examples of props on DOM components
include `className` and `onClick`.
Whenever a component's props change, its `render()` function will be
re-evaluated and the DOM will be updated. React will ensure that the DOM is
always kept up-to-date.
## State
Let's build a small `LikeApp` application that makes use of the `<LikeLink>`
component from above. It should start off unliked and we should be able to like
it by clicking the link:
```javascript
var LikeApp = React.createClass({
render: function() {
var isClicked = false;
return <LikeLink liked={isClicked} onClick={this.handleClick.bind(this)} />;
},
handleClick: function() {
// Somehow update `isClicked`.
}
});
```
This renders a `<LikeLink>` with a click listener. However, it is not clear how
`handleClick` should update `isClicked` to true. `LikeApp` needs a way to store
**state** about whether or not it has been clicked.
### State vs. Props
State is data that is managed _internally_ by a composite component. Like props,
the `render()` function will be re-evaluated whenever state changes. Props and
state differ in that:
- Props are passed in from the creator.
- State is private to and managed by the component.
### Managing State
Let's update our `LikeApp` component using state:
```javascript{2-4,6,10}
var LikeApp = React.createClass({
getInitialState: function() {
return {isClicked: false};
},
render: function() {
var isClicked = this.state.isClicked;
return <LikeLink liked={isClicked} onClick={this.handleClick.bind(this)} />;
},
handleClick: function() {
this.setState({isClicked: true});
}
});
```
There's a lot going on here, so let's work our way from top to bottom:
- `getInitialState()` describes what state data looks like when the component
is created.
- In `render()`, state data can be accessed via `this.state`.
- When the link is clicked, we update state using `setState()`.
Now when we click the link, the `<LikeLink>` will get updated, right? Wrong.
## Transferring Props
If you have been following carefully, you may have noticed that although we pass
a click handler into `<LikeLink>` as a prop, `LikeLink` does not do anything
with `this.props.onClick`! Let's fix that.
```javascript{4}
var LikeLink = React.createClass({
render: function() {
var text = this.props.liked ? 'Liked' : 'Like';
return <a onClick={this.props.onClick}>{text}</a>;
}
});
```
Although this works, realize that this would quickly become tedious if we wanted
to also transfer `href`, `title`, `target`, and other events from `this` to the
rendered `<a>`. React provides a convenience method, `transferPropsTo()`, for
transferring props:
```javascript{4}
var LikeLink = React.createClass({
render: function() {
var text = this.props.liked ? 'Liked' : 'Like';
return this.transferPropsTo(<a>{text}</a>);
}
});
```
This will transfer all props from `this` to the specified component (including
`onClick`).
## Summary
Now we are done. `LikeApp` renders an unliked link which, when clicked, will:
1. Update the internal state of `LikeApp`.
2. Change the props passed into `LikeLink`.
3. Change the return value of `render()`.
4. Trigger an update to the DOM.
It's worth noting that React will handle new return values of `render()` by
making the mininal set of mutations necessary to bring the DOM up-to-date. In
this case, only the `textContent` of the rendered link will be mutated.
In summary:
- Props are passed in whereas state is managed internally by a component.
- Never mutate `this.props` or `this.state`. You should pass props into other
components and mutate state using `setState()`.
- State is private. Never read `state` or call `setState()` on
anything but `this`.
- Whenever props or state changes, `render()` will be re-evaluated and the DOM
updated. Also, `render()` should not depend on anything besides `this.props`
and `this.state`.

View File

@@ -1,85 +0,0 @@
---
id: docs-component-lifecycle
title: Component Lifecycle
description: What happens when I render a React component?
layout: docs
prev: component-data.html
next: event-handling.html
---
## Mounting
[We have previously seen](component-basics.html) how to render components into
existing DOM elements on the page:
```javascript
React.renderComponent(<div>Hello, world!</div>, document.body);
```
In this one simple line, we have accomplished the following:
- A `<div>` (defined by `React.DOM.div`) component is instantiated.
- The component is **mounted** into `document.body`.
**Mounting** is the process of initializing a React component by creating its
DOM nodes and inserting the them into a supplied container node.
At this point, the entire page consists of a single `<div>` with "Hello,
world!".
## Updating
Let's add a second call to `React.renderComponent()` after three
seconds:
```javascript{2-4}
React.renderComponent(<div>Hello, world!</div>, document.body);
setTimeout(function() {
React.renderComponent(<div>Goodbye, world.</div>, document.body);
}, 3000);
```
The second call to `React.renderComponent()` will trigger the following:
- The `<div>` component will check the new props to see if anything changed.
- The set of changes are used to **update** the DOM node as necessary.
**Updating** is the process of mutating the rendered DOM nodes and occurs
whenever either props or state has changed. This ensures that the rendered DOM
is consistent with the data.
## Unmounting
Let's add one final call to `React.renderComponent()` after another three
seconds:
```javascript{5-7}
React.renderComponent(<div>Hello, world!</div>, document.body);
setTimeout(function() {
React.renderComponent(<div>Goodbye, world.</div>, document.body);
}, 3000);
setTimeout(function() {
React.renderComponent(<img src="/images/fin.png" />, document.body);
}, 6000);
```
The third call to `React.renderComponent()` will trigger the following:
- An `<img>` (defined by `React.DOM.img`) component is instantiated.
- React will compare the `<div>` component with the `<img>` component.
- Since the component class is different, the `<div>` component will be
**unmounted**.
- The `<img>` component will then be mounted into `document.body`.
**Unmounting** is the process of releasing resources that have been allocated by
a component. This allows user interfaces built with React to live long without
memory leaks.
Components can also be unmounted using
`React.unmountAndReleaseReactRootNode()`:
```javascript
React.unmountAndReleaseReactRootNode(document.body);
```
This will unmount any components mounted immediately within `document.body`.

View File

@@ -1,224 +0,0 @@
---
id: docs-event-handling
title: Event Handling
description: How do events work with React components?
layout: docs
prev: component-lifecycle.html
next: advanced-components.html
---
Events in React work the way they do with HTML, except the event names are
camelCased.
```javascript
var Clicker = React.createClass({
render: function() {
return <span onClick={this.handleClick}>Click me!</span>;
},
handleClick: function(event) {
alert('You clicked me!');
}
});
```
When `<Clicker>` is clicked, the `handleClick()` function will get fired. Under
the hood, React uses top-level event delegation to achieve high performance.
## Automatically Binding Callbacks
Just like any callback in JavaScript, if you want to refer to the component as
`this` from the callback, you need to bind the callback to the component:
```javascript{3}
var Clicker = React.createClass({
render: function() {
var handleClick = this.handleClick.bind(this);
return <span onClick={handleClick}>Click me!</span>;
},
handleClick: function(event) {
alert(this.ALERT_MESSAGE);
},
ALERT_MESSAGE: 'You clicked me!'
});
```
React provides a convenient and _efficient_ way to bind methods using
`React.autoBind()`:
```javascript{3,5-7}
var Clicker = React.createClass({
render: function() {
return <span onClick={this.handleClick}>Click me!</span>;
},
handleClick: React.autoBind(function(event) {
alert(this.ALERT_MESSAGE);
}),
ALERT_MESSAGE: 'You clicked me!'
});
```
> Note:
>
> Binding a function allocates memory to create a new bound function. Since
> `render()` may be invoked many times, it is a bad place to bind functions.
> `React.autoBind()` sidesteps this issue by only binding once at instantiation
> time.
## DOM Events
React uses [top-level event delegation](http://davidwalsh.name/event-delegate)
to achieve high performance when implementing DOM events. For each type of DOM
event, React adds a single top-level listener and determines which event
handlers to execute by simulating event capturing and bubbling.
DOM event handlers are called with a normalized `AbstractEvent` object that has
cross-browser compatible implementations of `stopPropagation` and
`preventDefault()`. If you need access to the raw browser event, you can use the
`nativeEvent` property.
> Note:
>
> The `AbstractEvent` object is JSON serializable so that React applications can
> be executed inside web workers.
### Touch Events
If you want to use touch events, you must configure React's event system to
initialize them:
```javascript
// Invoke before calling `React.renderComponent()`.
React.initializeTouchEvents(true);
```
## Custom Events
Notice that event listeners are attached by simply passing them into components
as props. For DOM components, events are handled using top-level event
delegation. For composite components, event handling is up to the component's
implementation.
Here is an example of a toggle link that fires a custom `onToggle` event:
```javascript
var ToggleLink = React.createClass({
getInitialState: function() {
return {isEnabled: false};
},
render: function() {
return <a onClick={this.handleClick}>Toggle</a>;
},
handleClick: React.autoBind(function() {
var willEnable = !this.state.isEnabled;
if (this.props.onToggle) {
this.props.onToggle(willEnable)
}
this.setState({isEnabled: willEnable});
})
});
var handleToggle = function(enabled) {
alert(enabled ? 'Enabled.' : 'Disabled.');
};
var myToggleLink = <ToggleLink onToggle={handleToggle} />;
```
### Common Patterns
With React your event handlers should be quite small. Large event handlers may
be symptomatic of code that should be moved into helpers or into `render()`.
Here are some common usage patterns for event handlers.
#### Updating State
The most common thing to do in response to a user action is to call
`this.setState()` to update the component's state, which will in turn trigger
an update to the rendered component.
#### Server Requests
Many event handlers will issue a server request to read or write some data in
response to an event. The response handler for the request will often call
`this.setState()`.
#### Invoke a Callback
Your component will often be a small, reusable building block that does not know
how to respond to a user action. In these situations, we delegate the
responsibility to the owner by exposing a handler on `this.props`. This is what
the `ToggleLink` example above is doing.
#### Inter-component Communication
A common scenario involves communicating to **Component A** that a user action
has occurred on **Component B**. To solve this problem, a common parent to
both components should listen for the event on **Component B**, update its
internal state, and pass that data into **Component A**.
For example, say we have two components: **Clicker**, a component that fires an
`onCountChange` custom event, and **ClickCountLabel**, a component that displays
the number of clicks that have happened:
```javascript
var Clicker = React.createClass({
getInitialState: function() {
return {count: 0};
},
render: function() {
return <span onClick={this.handleClick}>Click me!</span>;
},
handleClick: React.autoBind(function() {
this.setState({count: this.state.count + 1});
if (this.props.onCountChange) {
this.props.onCountChange(this.state.count);
}
})
});
var ClickCountLabel = React.createClass({
render: function() {
return <p>You have clicked <strong>{this.props.count}</strong> times.</p>;
}
});
var ClickApp = React.createClass({
render: function() {
var count = 0;
return (
<div>
<Clicker onCountChange={this.handleCountChange} />
<ClickCountLabel count={count} />
</div>
);
},
handleCountChange: React.autoBind(function(count) {
// Somehow update `count`.
})
});
```
In order to communicate the click count from `Clicker` to `ClickCountLabel`, we
modify `ClickApp` to maintain state that will be passed into `ClickCountLabel`:
```javascript{2-4,6,15}
var ClickApp = React.createClass({
getInitialState: function() {
return {count: 0};
},
render: function() {
var count = this.state.count;
return (
<div>
<Clicker onCountChange={this.handleCountChange} />
<ClickCountLabel count={count} />
</div>
);
},
handleCountChange: React.autoBind(function(count) {
this.setState({count: count});
})
});
```
Now when `Clicker` fires the `onCountChange` event, the `ClickCountLabel` will
get updated!

View File

@@ -1,106 +0,0 @@
---
id: docs-getting-started
title: Getting Started
layout: docs
next: tutorial.html
---
Download the starter kit to get started.
<div class="buttons-unit downloads">
<a href="/react/downloads/react-{{site.react_version}}.zip" class="button">
Download Starter Kit {{site.react_version}}
</a>
</div>
## Hello, world!
In the root directory of the starter kit, create a `helloworld.html` with the following contents.
```html
<!DOCTYPE html>
<html>
<head>
<script src="build/react.min.js"></script>
<script src="build/JSXTransformer.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/jsx">
/** @jsx React.DOM */
React.renderComponent(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
</script>
</body>
</html>
```
The XML syntax inside of JavaScript is called JSX; check out the [JSX syntax](syntax.html) to learn more about it. In order to translate it to vanilla JavaScript we use `<script type="text/jsx">` and include `JSXTransformer.js` to actually perform the transformation in the browser.
### Separate File
Your React JSX file can live in a separate file. Create the following `src/helloworld.js`.
```javascript
/** @jsx React.DOM */
React.renderComponent(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
```
Then reference it from `helloworld.html`:
```html{10}
<script type="text/jsx" src="src/helloworld.js"></script>
```
### Offline Transform
First install the command-line tools (requires [npm](http://npmjs.org/)):
```
npm install -g react-tools
```
Then, translate your `src/helloworld.js` file to plain JavaScript:
```
jsx --watch src/ build/
```
The file `build/helloworld.js` is autogenerated whenever you make a change.
```javascript{3}
/** @jsx React.DOM */
React.renderComponent(
React.DOM.h1(null, 'Hello, world!'),
document.getElementyById('example')
);
```
Update your HTML file as below:
```html{6,10}
<!DOCTYPE html>
<html>
<head>
<title>Hello React!</title>
<script src="build/react.min.js"></script>
<!-- No need for JSXTransformer! -->
</head>
<body>
<div id="example"></div>
<script src="build/helloworld.js"></script>
</body>
</html>
```
## Want CommonJS?
If you want to use React within a module system, [fork our repo](http://github.com/facebook/react), `npm install` and run `grunt`. A nice set of CommonJS modules will be generated. Our `jsx` build tool can be integrated into most packaging systems (not just CommonJS) quite easily.
## Next Steps
Check out [the tutorial](tutorial.html) and the other examples in the `/examples` directory to learn more. Good luck, and welcome!

View File

@@ -1,151 +0,0 @@
---
id: docs-syntax
title: JSX Syntax
description: Writing JavaScript with XML syntax.
layout: docs
prev: common-questions.html
next: component-basics.html
---
JSX is a JavaScript XML syntax extension recommended (but not required) for use
with React.
JSX makes code that deeply nests React components more readable, and writing it
feels like writing HTML. React documentation examples make use of JSX.
## The Transform
JSX transforms XML-like syntax into native JavaScript. It turns XML elements and
attributes into function calls and objects, respectively.
```javascript
var Nav;
// Input (JSX):
var app = <Nav color="blue" />;
// Output (JS):
var app = Nav({color:'blue'});
```
Notice that in order to use `<Nav />`, the `Nav` variable must be in scope.
JSX also allows specifying children using XML syntax:
```javascript
var Nav, Profile;
// Input (JSX):
var app = <Nav color="blue"><Profile>click</Profile></Nav>;
// Output (JS):
var app = Nav({color:'blue'}, Profile({}, 'click'));
```
The [Getting Started](getting-started.html) guide shows how to setup JSX
compilation.
> Note:
>
> Details about the code transform are given here to increase understanding, but
> your code should not rely on these implementation details.
## React and JSX
React and JSX are independent technologies, but JSX was primarily built with
React in mind. The two valid uses of JSX are:
- To construct instances of React DOM components (`React.DOM.*`).
- To construct instances of composite components created with
`React.createClass()`.
**React DOM Components**
To construct a `<div>` is to create a variable that refers to `React.DOM.div`.
```javascript
var div = React.DOM.div;
var app = <div className="appClass">Hello, React!</div>;
```
**React Component Components**
To construct an instance of a composite component, create a variable that
references the class.
```javascript
var MyComponent = React.createClass({/*...*/});
var app = <MyComponent someProperty={true} />;
```
See [Component Basics](component-basics.html) to learn more about components.
> Note:
>
> Since JSX is JavaScript, identifiers such as `class` and `for` are discouraged
> as XML attribute names. Instead, React DOM components expect attributes like
> `className` and `htmlFor`, respectively.
## DOM Convenience
Having to define variables for every type of DOM element can get tedious
(e.g. `var div, span, h1, h2, ...`). JSX provides a convenience to address this
problem by allowing you to specify a variable in an `@jsx` docblock field. JSX
will use that field to find DOM components.
```javascript
/**
* @jsx React.DOM
*/
var Nav;
// Input (JSX):
var tree = <Nav><span /></Nav>;
// Output (JS):
var tree = Nav({}, React.DOM.span({}));
```
> Remember:
>
> JSX simply transforms elements into function calls and has no notion of the
> DOM. The docblock parameter is only a convenience to resolve the most commonly
> used elements. In general, JSX has no notion of the DOM.
## JavaScript Expressions
#### Attribute Expressions
To use a JavaScript expression as an attribute value, wrap the expression in a
pair of curly braces (`{}`) instead of quotes (`""`).
```javascript
// Input (JSX):
var person = <Person name={window.isLoggedIn ? window.name : ''} />;
// Output (JS):
var person = Person({name: window.isLoggedIn ? window.name : ''});
```
#### Child Expressions
Likewise, JavaScript expressions may be used to express children:
```javascript
// Input (JSX):
var content = <Container>{window.isLoggedIn ? <Nav /> : <Login />}</Container>;
// Output (JS):
var content = Container({}, window.isLoggedIn ? <Nav /> : <Login />);
```
## Tooling
Beyond the compilation step, JSX does not require any special tools.
- Many editors already include reasonable support for JSX (Vim, Emacs js2-mode).
- Linting provides accurate line numbers after compiling without sourcemaps.
- Elements use standard scoping so linters can find usage of out-of-scope
components.
## Prior Work
JSX is similar to several other JavaScript embedded XML language
proposals/projects. Some of the features of JSX that distinguish it from similar
efforts include:
- JSX is a simple syntactic transform.
- JSX neither provides nor requires a runtime library.
- JSX does not alter or add to the semantics of JavaScript.

View File

@@ -1,674 +0,0 @@
---
id: docs-tutorial
title: Tutorial
layout: docs
prev: getting-started.html
next: common-questions.html
---
We'll be building a simple, but realistic comments box that you can drop into a blog, similar to Disqus, LiveFyre or Facebook comments.
We'll provide:
* A view of all of the comments
* A form to submit a comment
* Hooks for you to provide a custom backend
It'll also have a few neat features:
* **Optimistic commenting:** comments appear in the list before they're saved on the server so it feels fast.
* **Live updates:** as other users comment we'll pop them into the comment view in real time
* **Markdown formatting:** users can use Markdown to format their text
## Getting started
For this tutorial we'll use prebuilt JavaScript files on a CDN. Open up your favorite editor and create a new HTML document:
```html
<!-- template.html -->
<html>
<head>
<title>Hello React</title>
<script src="http://fb.me/react-{{site.react_version}}.js"></script>
<script src="http://fb.me/JSXTransformer-{{site.react_version}}.js"></script>
</head>
<body>
<div id="content"></div>
<script type="text/jsx">
/**
* @jsx React.DOM
*/
// Your code here
</script>
</body>
</html>
```
For the remainder of this tutorial, we'll be writing our JavaScript code in this script tag.
## Your first component
React is all about modular, composable components. For our comment box example, we'll have the following component structure:
```
- CommentBox
- CommentList
- Comment
- CommentForm
```
Let's build the `CommentBox` component, which is just a simple `<div>`:
```javascript
// tutorial1.js
var CommentBox = React.createClass({
render: function() {
return (
<div class="commentBox">
Hello, world! I am a CommentBox.
</div>
);
}
});
React.renderComponent(
<CommentBox />,
document.getElementById('content')
);
```
### JSX Syntax
The first thing you'll notice is the XML-ish syntax in your JavaScript. We have a simple precompiler that translates the syntactic sugar to this plain JavaScript:
```javascript
// tutorial1-raw.js
var CommentBox = React.createClass({
render: function() {
return (
ReactDOM.div({
className: 'commentBox',
children: 'Hello, world! I am a CommentBox.'
})
);
}
});
React.renderComponent(
CommentBox({}),
document.getElementById('content')
);
```
Its use is optional but we've found JSX syntax easier to use than plain JavaScript. Read more on the [JSX Syntax article](syntax.html).
### What's going on
We pass some methods in a JavaScript object to `React.createClass()` to create a new React component. The most important of these methods is called `render` which returns a tree of React components that will eventually render to HTML.
The `<div>` tags are not actual DOM nodes; they are instantiations of React `div` components. You can think of these as markers or pieces of data that React knows how to handle. React is **safe**. We are not generating HTML strings so XSS protection is the default.
You do not have to return basic HTML. You can return a tree of components that you (or someone else built). This is what makes React **composable**: a key tenet of maintainable frontends.
`React.renderComponent()` instantiates the root component, starts the framework, and injects the markup into a raw DOM element, provided as the second argument.
# Composing components
Let's build skeletons for `CommentList` and `CommentForm` which will, again, be simple `<div>`s:
```javascript
// tutorial2.js
var CommentList = React.createClass({
render: function() {
return (
<div class="commentList">
Hello, world! I am a CommentList.
</div>
);
}
});
var CommentForm = React.createClass({
render: function() {
return (
<div class="commentForm">
Hello, world! I am a CommentForm.
</div>
);
}
});
```
Next, update the `CommentBox` component to use its new friends:
```javascript{6-8}
// tutorial3.js
var CommentBox = React.createClass({
render: function() {
return (
<div class="commentBox">
<h1>Comments</h1>
<CommentList />
<CommentForm />
</div>
);
}
});
```
Notice how we're mixing HTML tags and components we've built. HTML components are regular React components, just like the ones you define, with one difference. The JSX compiler will automatically rewrite HTML tags to "ReactDOM.tagName" expressions and leave everything else alone. This is to prevent the pollution of the global namespace.
## Component Properties
Let's create our third component, `Comment`. We will want to pass it the author name and comment text so we can reuse the same code for each unique comment. First let's add some comments to the `CommentList`:
```javascript{6-7}
// tutorial4.js
var CommentList = React.createClass({
render: function() {
return (
<div class="commentList">
<Comment author="Pete Hunt">This is one comment</Comment>
<Comment author="Jordan Walke">This is *another* comment</Comment>
</div>
);
}
});
```
Note that we have passed some data from the parent `CommentList` component to the child `Comment` component as both XML-like children and attributes. Data passed from parent to child is called **props**, short for properties.
## Using props
Let's create the Comment component. It will read the data passed to it from the CommentList and render some markup:
```javascript
// tutorial5.js
var Comment = React.createClass({
render: function() {
return (
<div class="comment">
<h2 class="commentAuthor">
{this.props.author}
</h2>
{this.props.children}
</div>
);
}
});
```
By surrounding a JavaScript expression in braces inside JSX (as either an attribute or child), you can drop text or React components into the tree. We access named attributes passed to the component as keys on `this.props` and any nested elements as `this.props.children`.
## Adding Markdown
Markdown is a simple way to format your text inline. For example, surrounding text with asterisks will make it emphasized.
First, add the third-party **Showdown** library to your application. This is a JavaScript library which takes Markdown text and converts it to raw HTML. This requires a script tag in your head (which we have already included in the React playground).
Next, let's convert the comment text to Markdown and output it:
```javascript{2,10}
// tutorial6.js
var converter = new Showdown.converter();
var Comment = React.createClass({
render: function() {
return (
<div class="comment">
<h2 class="commentAuthor">
{this.props.author}
</h2>
{converter.makeHtml(this.props.children.toString())}
</div>
);
}
});
```
All we're doing here is calling the Showdown library. We need to convert `this.props.children` from React's wrapped text to a raw string that Showdown will understand so we explicitly call `toString()`.
But there's a problem! Our rendered comments look like this in the browser: "`<p>`This is `<em>`another`</em>` comment`</p>`". We want those tags to actually render as HTML.
That's React protecting you from an XSS attack. There's a way to get around it but the framework warns you not to use it:
```javascript{5,11}
// tutorial7.js
var converter = new Showdown.converter();
var Comment = React.createClass({
render: function() {
var rawMarkup = converter.makeHtml(this.props.children.toString());
return (
<div class="comment">
<h2 class="commentAuthor">
{this.props.author}
</h2>
<span dangerouslySetInnerHTML={{"{{"}}__html: rawMarkup}} />
</div>
);
}
});
```
This is a special API that intentionally makes it difficult to insert raw HTML, but for Showdown we'll take advantage of this backdoor.
**Remember:** by using this feature you're relying on Showdown to be secure.
## Hook up the data model
So far we've been inserting the comments directly in the source code. Instead, let's render a blob of JSON data into the comment list. Eventually this will come from the server, but for now, write it in your source:
```javascript
// tutorial8.js
var data = [
{author: 'Pete Hunt', text: 'This is one comment'},
{author: 'Jordan Walke', text: 'This is *another* comment'}
];
```
We need to get this data into `CommentList` in a modular way. Modify `CommentBox` and the `renderComponent()` call to pass this data into the `CommentList` via props:
```javascript{7,15}
// tutorial9.js
var CommentBox = React.createClass({
render: function() {
return (
<div class="commentBox">
<h1>Comments</h1>
<CommentList data={this.props.data} />
<CommentForm />
</div>
);
}
});
React.renderComponent(
<CommentBox data={data} />,
document.getElementById('content')
);
```
Now that the data is available in the `CommentList`, let's render the comments dynamically:
```javascript{4-6}
// tutorial10.js
var CommentList = React.createClass({
render: function() {
var commentNodes = this.props.data.map(function (comment) {
return <Comment author={comment.author}>{comment.text}</Comment>;
});
return (
<div class="commentList">
{commentNodes}
</div>
);
}
});
```
That's it!
## Fetching from the server
Let's replace the hard-coded data with some dynamic data from the server. We will remove the data prop and replace it with a URL to fetch:
```javascript{2}
// tutorial11.js
React.renderComponent(
<CommentBox url="comments.json" />,
document.getElementById('example')
);
```
This component is different from the prior components because it will have to re-render itself. The component won't have any data until the request from the server comes back, at which point the component may need to render some new comments.
## Reactive state
So far, each component has rendered itself once based on its props. `props` are immutable: they are passed from the parent and are "owned" by the parent. To implement interactions, we introduce mutable **state** to the component. `this.state` is private to the component and can be changed by calling `this.setState()`. When the state is updated, the component re-renders itself.
`render()` methods are written declaratively as functions of `this.props` and `this.state`. The framework guarantees the UI is always consistent with the inputs.
When the server fetches data, we will be changing the comment data we have. Let's add an array of comment data to the `CommentBox` component as its state:
```javascript{3-5}
// tutorial12.js
var CommentBox = React.createClass({
getInitialState: function() {
return {data: []};
},
render: function() {
return (
<div class="commentBox">
<h1>Comments</h1>
<CommentList data={this.state.data} />
<CommentForm />
</div>
);
}
});
```
`getInitialState()` executes exactly once during the lifecycle of the component and sets up the initial state of the component.
### Updating state
When the component is first created, we want to GET some JSON from the server and update the state to reflect the latest data. In a real application this would be a dynamic endpoint, but for this example, we will use a static JSON file to keep things simple:
```javascript
// tutorial13.json
[
{'author': 'Pete Hunt', 'text': 'This is one comment'},
{'author': 'Jordan Walke', 'text': 'This is *another* comment'}
]
```
We will use jQuery 1.5 to help make an asynchronous request to the server.
Note: because this is becoming an AJAX application you'll need to develop your app using a web server rather than as a file sitting on your file system. The easiest way to do this is to run `python -m SimpleHTTPServer` in your application's directory.
```javascript{4-11}
// tutorial13.js
var CommentBox = React.createClass({
getInitialState: function() {
$.ajax({
url: 'comments.json',
dataType: 'json',
mimeType: 'textPlain',
success: function(data) {
this.setState({data: data});
}.bind(this)
});
return {data: []};
},
render: function() {
return (
<div class="commentBox">
<h1>Comments</h1>
<CommentList data={this.state.data} />
<CommentForm />
</div>
);
}
});
```
The key is the call to `this.setState()`. We replace the old array of comments with the new one from the server and the UI automatically updates itself. Because of this reactivity, it is trivial to add live updates. We will use simple polling here but you could easily use WebSockets or other technologies.
```javascript{3,17-21,35}
// tutorial14.js
var CommentBox = React.createClass({
loadCommentsFromServer: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
mimeType: 'textPlain',
success: function(data) {
this.setState({data: data});
}.bind(this)
});
},
getInitialState: function() {
return {data: []};
},
componentWillMount: function() {
this.loadCommentsFromServer();
setInterval(
this.loadCommentsFromServer.bind(this),
this.props.pollInterval
);
},
render: function() {
return (
<div class="commentBox">
<h1>Comments</h1>
<CommentList data={this.state.data} />
<CommentForm />
</div>
);
}
});
React.renderComponent(
<CommentBox url="comments.json" pollInterval={5000} />,
document.getElementById('content')
);
```
All we have done here is move the AJAX call to a separate method and call it when the component is first loaded and every 60 seconds after that. Try running this in your browser and changing the `comments.json` file; within 5 seconds, the changes will show!
## Adding new comments
Now it's time to build the form. Our `CommentForm` component should ask the user for their name and comment text and send a request to the server to save the comment.
```javascript{5-8}
// tutorial15.js
var CommentForm = React.createClass({
render: function() {
return (
<form class="commentForm">
<input type="text" placeholder="Your name" />
<input type="text" placeholder="Say something..." />
</form>
);
}
});
```
Let's make the form interactive. When the user presses enter, we should clear the form, submit a request to the server, and refresh the list of comments. To start, let's listen for this event and just clear the form.
```javascript{3-12,15,20}
// tutorial16.js
var CommentForm = React.createClass({
handleSubmit: React.autoBind(function() {
var author = this.refs.author.getDOMNode().value.trim();
var text = this.refs.text.getDOMNode().value.trim();
if (!text || !author) {
return;
}
// TODO: send request to the server
this.refs.author.getDOMNode().value = '';
this.refs.text.getDOMNode().value = '';
}),
render: function() {
return (
<form class="commentForm" onSubmit={this.handleSubmit}>
<input type="text" placeholder="Your name" ref="author" />
<input
type="text"
placeholder="Say something..."
ref="text"
/>
</form>
);
}
});
```
#### Events
React attaches event handlers to components using a camelCase naming convention. We attach an onKeyUp handler to the text field, check if the user has entered text and pressed the enter key and then clear the form fields.
`React.autoBind()` is a simple way to ensure that a method is always bound to its component. Inside the method, `this` will be bound to the component instance.
#### Refs
We use the `ref` attribute to assign a name to a child component and `this.refs` to reference the component. We can call `getDOMNode()` on a component to get the native browser DOM element.
#### Callbacks as props
When a user submits a comment, we will need to refresh the list of comments to include the new one. It makes sense to do all of this logic in `CommentBox` since `CommentBox` owns the state that represents the list of comments.
We need to pass data from the child component to its parent. We do this by passing a `callback` in props from parent to child:
```javascript{13-15,30}
// tutorial17.js
var CommentBox = React.createClass({
loadCommentsFromServer: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
mimeType: 'textPlain',
success: function(data) {
this.setState({data: data});
}.bind(this)
});
},
handleCommentSubmit: React.autoBind(function(comment) {
// TODO: submit to the server and refresh the list
}),
getInitialState: function() {
return {data: []};
},
componentWillMount: function() {
this.loadCommentsFromServer();
setInterval(
this.loadCommentsFromServer.bind(this),
this.props.pollInterval
);
},
render: function() {
return (
<div class="commentBox">
<h1>Comments</h1>
<CommentList data={this.state.data} />
<CommentForm
onCommentSubmit={this.handleCommentSubmit}
/>
</div>
);
}
});
```
Let's call the callback from the `CommentForm` when the user presses enter:
```javascript{6}
// tutorial18.js
var CommentForm = React.createClass({
handleSubmit: React.autoBind(function() {
var author = this.refs.author.getDOMNode().value.trim();
var text = this.refs.text.getDOMNode().value.trim();
this.props.onCommentSubmit({author: author, text: text});
this.refs.author.getDOMNode().value = '';
this.refs.text.getDOMNode().value = '';
}),
render: function() {
return (
<form class="commentForm" onSubmit={this.handleSubmit}>
<input type="text" placeholder="Your name" ref="author" />
<input
type="text"
placeholder="Say something..."
ref="text"
/>
</form>
);
}
});
```
Now that the callbacks are in place, all we have to do is submit to the server and refresh the list:
```javascript{14-22}
// tutorial19.js
var CommentBox = React.createClass({
loadCommentsFromServer: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
mimeType: 'textPlain',
success: function(data) {
this.setState({data: data});
}.bind(this)
});
},
handleCommentSubmit: React.autoBind(function(comment) {
$.ajax({
url: this.props.url,
data: comment,
dataType: 'json',
mimeType: 'textPlain',
success: function(data) {
this.setState({data: data});
}.bind(this)
});
}),
getInitialState: function() {
return {data: []};
},
componentWillMount: function() {
this.loadCommentsFromServer();
setInterval(
this.loadCommentsFromServer.bind(this),
this.props.pollInterval
);
},
render: function() {
return (
<div class="commentBox">
<h1>Comments</h1>
<CommentList data={this.state.data} />
<CommentForm
onCommentSubmit={this.handleCommentSubmit}
/>
</div>
);
}
});
```
## Optimization: optimistic updates
Our application is now feature complete but it feels slow to have to wait for the request to complete before your comment appears in the list. We can optimistically add this comment to the list to make the app feel faster.
```javascript{14-16}
// tutorial20.js
var CommentBox = React.createClass({
loadCommentsFromServer: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
mimeType: 'textPlain',
success: function(data) {
this.setState({data: data});
}.bind(this)
});
},
handleCommentSubmit: React.autoBind(function(comment) {
var comments = this.state.data;
comments.push(comment);
this.setState({data: comments});
$.ajax({
url: this.props.url,
data: comment,
dataType: 'json',
mimeType: 'textPlain',
success: function(data) {
this.setState({data: data});
}.bind(this)
});
}),
getInitialState: function() {
return {data: []};
},
componentWillMount: function() {
this.loadCommentsFromServer();
setInterval(
this.loadCommentsFromServer.bind(this),
this.props.pollInterval
);
},
render: function() {
return (
<div class="commentBox">
<h1>Comments</h1>
<CommentList data={this.state.data} />
<CommentForm
onCommentSubmit={this.handleCommentSubmit}
/>
</div>
);
}
});
```
## Congrats!
You have just built a comment box in a few simple steps. Learn more about React in the [reference](syntax.html) or start hacking! Good luck!

View File

@@ -1,44 +0,0 @@
---
id: downloads
title: Downloads
layout: single
---
Download the starter kit to get everything you need to
[get started with React](/react/docs/getting-started.html).
<div class="buttons-unit downloads">
<a href="/react/downloads/react-{{site.react_version}}.zip" class="button">
Download Starter Kit {{site.react_version}}
</a>
</div>
## Individual Downloads
#### <a href="http://fb.me/react-{{site.react_version}}.min.js">React Core {{site.react_version}} (production)</a>
The compressed, production version of React core
#### <a href="http://fb.me/react-{{site.react_version}}.js">React Core {{site.react_version}} (development)</a>
The uncompressed, development version of React core with inline documentation.
#### <a href="http://fb.me/JSXTransformer-{{site.react_version}}.js">JSX Transform</a>
The JSX transformer used to support [XML syntax](/react/docs/syntax.html) in JavaScript.
## Bower
```sh
$ bower install react
```
## NPM
```sh
$ npm install -g react-tools
```
## Release Notes
**0.3** Initial public release.
**0.2** Standardize API & refactor component lifecycle. Normalize DOM interactions.
**0.1** Initial release.

View File

@@ -1,37 +0,0 @@
var argv = require('optimist').argv;
var fs = require('fs');
var CODE_SAMPLE = /```[\S]+\s*[\s\S]*?```/g;
var PARTS = /```[\S]+\s*\/\/\s+(.+?)\n([\s\S]*?)```/;
function truncate(s, n) {
n = n || 256
if (s.length < n) {
return s;
}
return s.substring(0, n) + '...';
}
function main(dest, filenames) {
if (!dest) {
throw new Error('no dest provided');
}
filenames.map(function (filename) {
var content = fs.readFileSync(filename).toString('utf8');
var codeSamples = content.match(CODE_SAMPLE);
codeSamples.map(function (codeSample) {
// Do a little jank preprocessing
codeSample = codeSample.replace('<!--', '//').replace(' -->', '');
var extracted = codeSample.match(PARTS);
if (!extracted) {
throw new Error('Code sample did not match correct format in ' + filename + ': ' + truncate(codeSample));
}
var filename = extracted[1];
var content = extracted[2].replace(/\*\*/g, '');
fs.writeFileSync(argv.dest + '/' + filename, content);
});
});
}
main(argv.dest, argv._);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Some files were not shown because too many files have changed in this diff Show More