You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by be...@apache.org on 2016/02/01 18:40:20 UTC

[1/6] fauxton commit: updated refs/heads/master to e6450a0

Repository: couchdb-fauxton
Updated Branches:
  refs/heads/master 574af6a8b -> e6450a0d0


http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/index-editor/tests/viewIndex.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/index-editor/tests/viewIndex.componentsSpec.react.jsx b/app/addons/documents/index-editor/tests/viewIndex.componentsSpec.react.jsx
index 67df4e5..e217d3c 100644
--- a/app/addons/documents/index-editor/tests/viewIndex.componentsSpec.react.jsx
+++ b/app/addons/documents/index-editor/tests/viewIndex.componentsSpec.react.jsx
@@ -16,8 +16,9 @@ define([
   'addons/documents/index-editor/actions',
   'addons/documents/resources',
   'testUtils',
-  "react"
-], function (FauxtonAPI, Views, Stores, Actions, Documents, utils, React) {
+  "react",
+  'react-dom'
+], function (FauxtonAPI, Views, Stores, Actions, Documents, utils, React, ReactDOM) {
   FauxtonAPI.router = new FauxtonAPI.Router([]);
 
   var assert = utils.assert;
@@ -53,7 +54,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     describe('getReduceValue', function () {
@@ -169,12 +170,12 @@ define([
     afterEach(function () {
       restore(Actions.newDesignDoc);
       restore(Actions.designDocChange);
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('calls new design doc on new selected', function () {
       var spy = sinon.spy(Actions, 'newDesignDoc');
-      TestUtils.Simulate.change($(selectorEl.getDOMNode()).find('#ddoc')[0], {
+      TestUtils.Simulate.change($(ReactDOM.findDOMNode(selectorEl)).find('#ddoc')[0], {
         target: {
           value: 'new'
         }
@@ -185,7 +186,7 @@ define([
 
     it('calls design doc changed on a different design doc selected', function () {
       var spy = sinon.spy(Actions, 'designDocChange');
-      TestUtils.Simulate.change($(selectorEl.getDOMNode()).find('#ddoc')[0], {
+      TestUtils.Simulate.change($(ReactDOM.findDOMNode(selectorEl)).find('#ddoc')[0], {
         target: {
           value: 'another-doc'
         }
@@ -197,7 +198,7 @@ define([
     it('calls design doc changed on new design doc entered', function () {
       var spy = sinon.spy(Actions, 'designDocChange');
       Actions.newDesignDoc();
-      TestUtils.Simulate.change($(selectorEl.getDOMNode()).find('#new-ddoc')[0], {
+      TestUtils.Simulate.change($(ReactDOM.findDOMNode(selectorEl)).find('#new-ddoc')[0], {
         target: {
           value: 'new-doc-entered'
         }
@@ -207,12 +208,12 @@ define([
     });
 
     it('does not filter usual design docs', function () {
-      assert.ok(/_design\/test-doc/.test($(selectorEl.getDOMNode()).text()));
+      assert.ok(/_design\/test-doc/.test($(ReactDOM.findDOMNode(selectorEl)).text()));
     });
 
     it('filters mango docs', function () {
       selectorEl = TestUtils.renderIntoDocument(<Views.DesignDocSelector/>, container);
-      assert.notOk(/_design\/123mango/.test($(selectorEl.getDOMNode()).text()));
+      assert.notOk(/_design\/123mango/.test($(ReactDOM.findDOMNode(selectorEl)).text()));
     });
   });
 
@@ -228,7 +229,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
       sandbox.restore();
     });
 
@@ -253,7 +254,7 @@ define([
     it('calls changeViewName on view name change', function () {
       var viewName = 'new-name';
       var spy = sandbox.spy(Actions, 'changeViewName');
-      var el = $(editorEl.getDOMNode()).find('#index-name')[0];
+      var el = $(ReactDOM.findDOMNode(editorEl)).find('#index-name')[0];
       TestUtils.Simulate.change(el, {
         target: {
           value: viewName

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/index-results/index-results.components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/index-results/index-results.components.react.jsx b/app/addons/documents/index-results/index-results.components.react.jsx
index 40af4e2..f809883 100644
--- a/app/addons/documents/index-results/index-results.components.react.jsx
+++ b/app/addons/documents/index-results/index-results.components.react.jsx
@@ -423,7 +423,7 @@ function (app, FauxtonAPI, React, Stores, Actions, Components, Documents, Fauxto
               disabled={this.props.isLoading}
               title="Select all docs that can be..." /> : null}
 
-            <ReactCSSTransitionGroup transitionName="slow-fade">
+            <ReactCSSTransitionGroup transitionName="slow-fade" transitionEnterTimeout={500} transitionLeaveTimeout={300}>
               {this.getDocumentList()}
             </ReactCSSTransitionGroup>
           </div>

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/index-results/tests/index-results.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/index-results/tests/index-results.componentsSpec.react.jsx b/app/addons/documents/index-results/tests/index-results.componentsSpec.react.jsx
index 7182cb6..7bde20b 100644
--- a/app/addons/documents/index-results/tests/index-results.componentsSpec.react.jsx
+++ b/app/addons/documents/index-results/tests/index-results.componentsSpec.react.jsx
@@ -16,11 +16,11 @@ define([
   'addons/documents/index-results/stores',
   'addons/documents/resources',
   'addons/databases/resources',
-
   'addons/documents/tests/document-test-helper',
   'testUtils',
-  "react"
-], function (FauxtonAPI, Views, IndexResultsActions, Stores, Documents, Databases, documentTestHelper, utils, React) {
+  "react",
+  'react-dom'
+], function (FauxtonAPI, Views, IndexResultsActions, Stores, Documents, Databases, documentTestHelper, utils, React, ReactDOM) {
   FauxtonAPI.router = new FauxtonAPI.Router([]);
 
   var assert = utils.assert;
@@ -39,7 +39,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(React.findDOMNode(instance).parentNode);
+        ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(instance).parentNode);
         store.reset();
       });
 
@@ -51,7 +51,7 @@ define([
         IndexResultsActions.resultsListReset();
 
         instance = TestUtils.renderIntoDocument(<Views.List />, container);
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
         assert.equal($el.text(), 'No Index Created Yet!');
       });
 
@@ -74,7 +74,7 @@ define([
 
 
         instance = TestUtils.renderIntoDocument(<Views.List />, container);
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
         assert.equal($el.text(), 'I <3 Hamburg');
       });
     });
@@ -93,7 +93,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(React.findDOMNode(instance).parentNode);
+        ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(instance).parentNode);
         store.reset();
       });
 
@@ -112,7 +112,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.tableview-checkbox-cell input').length === 0);
       });
@@ -143,7 +143,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.tableview-checkbox-cell input').length > 0);
       });
@@ -168,7 +168,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.tableview-checkbox-cell input').length === 0);
       });
@@ -188,7 +188,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.tableview-checkbox-cell input').length === 0);
       });
@@ -208,7 +208,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.tableview-checkbox-cell input').length > 0);
       });
@@ -228,7 +228,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
         assert.ok($el.find('.js-row-select').length > 0);
       });
 
@@ -247,7 +247,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.notOk($el.hasClass('show-select'));
       });
@@ -261,7 +261,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(React.findDOMNode(instance).parentNode);
+        ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(instance).parentNode);
         store.reset();
       });
 
@@ -282,7 +282,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
         var $targetNode = $el.find('td.tableview-el-last').prev();
 
         var formattedDoc = JSON.stringify(doc.object, null, '  ');
@@ -300,7 +300,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.equal($el.find('.icon-filter').length, 0);
 
@@ -318,7 +318,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(React.findDOMNode(instance).parentNode);
+        ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(instance).parentNode);
         store.reset();
       });
 
@@ -329,7 +329,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.loading-lines').length === 1);
       });
@@ -341,7 +341,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.loading-lines').length === 0);
       });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/mango/tests/mango.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/mango/tests/mango.componentsSpec.react.jsx b/app/addons/documents/mango/tests/mango.componentsSpec.react.jsx
index 2c126ad..5b276f9 100644
--- a/app/addons/documents/mango/tests/mango.componentsSpec.react.jsx
+++ b/app/addons/documents/mango/tests/mango.componentsSpec.react.jsx
@@ -16,13 +16,12 @@ define([
   'addons/documents/mango/mango.stores',
   'addons/documents/mango/mango.actions',
   'addons/documents/mango/mango.actiontypes',
-
   'addons/documents/resources',
   'addons/databases/resources',
-
   'testUtils',
-  'react'
-], function (FauxtonAPI, Views, Stores, MangoActions, ActionTypes, Resources, Databases, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, Views, Stores, MangoActions, ActionTypes, Resources, Databases, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -40,7 +39,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('renders a default index definition', function () {
@@ -58,7 +57,7 @@ define([
         <Views.MangoIndexEditorController description="foo" />,
         container
       );
-      var $el = $(editor.getDOMNode());
+      var $el = $(ReactDOM.findDOMNode(editor));
 
       assert.equal($el.find('.db-title').text(), 'testdb');
     });
@@ -68,7 +67,7 @@ define([
         <Views.MangoIndexEditorController description="CouchDB Query is great!" />,
         container
       );
-      var $el = $(editor.getDOMNode());
+      var $el = $(ReactDOM.findDOMNode(editor));
 
       assert.equal($el.find('.editor-description').text(), 'CouchDB Query is great!');
     });
@@ -123,7 +122,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('lists our available indexes', function () {
@@ -131,7 +130,7 @@ define([
         <Views.MangoQueryEditorController description="foo" />,
         container
       );
-      var $el = $(editor.getDOMNode());
+      var $el = $(ReactDOM.findDOMNode(editor));
       assert.equal($el.find('.mango-available-indexes').length, 1);
 
       assert.include(
@@ -145,7 +144,7 @@ define([
     });
 
     it('has a default query', function () {
-      editor = React.render(
+      editor = ReactDOM.render(
         <Views.MangoQueryEditorController description="foo" />,
         container
       );
@@ -183,7 +182,7 @@ define([
         <Views.MangoQueryEditorController description="foo" />,
         container
       );
-      var $el = $(editor.getDOMNode());
+      var $el = $(ReactDOM.findDOMNode(editor));
       assert.equal($el.find('.info-changed-query').length, 1);
     });
 
@@ -192,7 +191,7 @@ define([
         <Views.MangoQueryEditorController description="foo" />,
         container
       );
-      var $el = $(editor.getDOMNode());
+      var $el = $(ReactDOM.findDOMNode(editor));
 
       assert.equal($el.find('.db-title').text(), 'testdb');
     });
@@ -202,7 +201,7 @@ define([
         <Views.MangoQueryEditorController description="CouchDB Query is great!" />,
         container
       );
-      var $el = $(editor.getDOMNode());
+      var $el = $(ReactDOM.findDOMNode(editor));
 
       assert.equal($el.find('.editor-description').text(), 'CouchDB Query is great!');
     });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/pagination/tests/pagination.componentSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/pagination/tests/pagination.componentSpec.react.jsx b/app/addons/documents/pagination/tests/pagination.componentSpec.react.jsx
index 7c6c07e..afeaaac 100644
--- a/app/addons/documents/pagination/tests/pagination.componentSpec.react.jsx
+++ b/app/addons/documents/pagination/tests/pagination.componentSpec.react.jsx
@@ -14,8 +14,8 @@ define([
   'addons/documents/pagination/pagination.react',
   'testUtils',
   'react',
-
-], function (FauxtonAPI, Views, utils, React) {
+  'react-dom'
+], function (FauxtonAPI, Views, utils, React, ReactDOM) {
 
   FauxtonAPI.router = new FauxtonAPI.Router([]);
 
@@ -39,11 +39,11 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(React.findDOMNode(selectorEl).parentNode);
+        ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(selectorEl).parentNode);
       });
 
       it('on new select calls callback with new page size', function () {
-        var selectEl = $(selectorEl.getDOMNode()).find('#select-per-page')[0];
+        var selectEl = $(ReactDOM.findDOMNode(selectorEl)).find('#select-per-page')[0];
         var perPage = 5;
         TestUtils.Simulate.change(selectEl, {
           target: {
@@ -63,7 +63,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(React.findDOMNode(selectorEl).parentNode);
+        ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(selectorEl).parentNode);
       });
 
       it('shows the amount of fields, none hidden', function () {
@@ -73,7 +73,7 @@ define([
           container
         );
 
-        var text = $(selectorEl.getDOMNode()).find('.shown-fields').text();
+        var text = $(ReactDOM.findDOMNode(selectorEl)).find('.shown-fields').text();
 
         assert.equal('Showing 7 columns.', text);
       });
@@ -85,7 +85,7 @@ define([
           container
         );
 
-        var text = $(selectorEl.getDOMNode()).find('.shown-fields').text();
+        var text = $(ReactDOM.findDOMNode(selectorEl)).find('.shown-fields').text();
 
         assert.equal('Showing 5 of 7 columns.', text);
       });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/queryoptions/queryoptions.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/queryoptions/queryoptions.react.jsx b/app/addons/documents/queryoptions/queryoptions.react.jsx
index 977edba..ff8b76c 100644
--- a/app/addons/documents/queryoptions/queryoptions.react.jsx
+++ b/app/addons/documents/queryoptions/queryoptions.react.jsx
@@ -14,12 +14,13 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/documents/queryoptions/stores',
   'addons/documents/queryoptions/actions',
-  'addons/components/react-components.react',
+  'addons/components/react-components.react'
 ],
 
-function (app, FauxtonAPI, React, Stores, Actions, Components) {
+function (app, FauxtonAPI, React, ReactDOM, Stores, Actions, Components) {
   var store = Stores.queryOptionsStore;
   var Tray = Components.Tray;
   var TrayContents = Components.TrayContents;
@@ -127,8 +128,8 @@ function (app, FauxtonAPI, React, Stores, Actions, Components) {
 
     updateBetweenKeys: function () {
       this.props.updateBetweenKeys({
-        startkey: React.findDOMNode(this.refs.startkey).value,
-        endkey: React.findDOMNode(this.refs.endkey).value,
+        startkey: ReactDOM.findDOMNode(this.refs.startkey).value,
+        endkey: ReactDOM.findDOMNode(this.refs.endkey).value,
         include: this.props.betweenKeys.include
       });
     },
@@ -390,7 +391,7 @@ A key value is the first parameter emitted in a map function. For example emit("
     KeySearchFields: KeySearchFields,
     AdditionalParams: AdditionalParams,
     render: function (el) {
-      React.render(<QueryOptionsController />, $(el)[0]);
+      ReactDOM.render(<QueryOptionsController />, $(el)[0]);
     }
   };
 });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/queryoptions/tests/queryoptions.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/queryoptions/tests/queryoptions.componentsSpec.react.jsx b/app/addons/documents/queryoptions/tests/queryoptions.componentsSpec.react.jsx
index b782d48..47ed9c8 100644
--- a/app/addons/documents/queryoptions/tests/queryoptions.componentsSpec.react.jsx
+++ b/app/addons/documents/queryoptions/tests/queryoptions.componentsSpec.react.jsx
@@ -16,8 +16,9 @@ define([
   'addons/documents/queryoptions/actions',
   'addons/documents/resources',
   'testUtils',
-  "react"
-], function (FauxtonAPI, Views, Stores, Actions, Documents, utils, React) {
+  "react",
+  'react-dom'
+], function (FauxtonAPI, Views, Stores, Actions, Documents, utils, React, ReactDOM) {
   FauxtonAPI.router = new FauxtonAPI.Router([]);
 
   var assert = utils.assert;
@@ -32,7 +33,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     describe('MainFieldsView', function () {
@@ -52,7 +53,7 @@ define([
       it('updates group level', function () {
         var spy = sinon.spy();
         mainFieldsEl = TestUtils.renderIntoDocument(<Views.MainFieldsView updateGroupLevel={spy} reduce={true} includeDocs={false} showReduce={true}/>, container);
-        var el = $(mainFieldsEl.getDOMNode()).find('#qoGroupLevel')[0];
+        var el = $(ReactDOM.findDOMNode(mainFieldsEl)).find('#qoGroupLevel')[0];
         TestUtils.Simulate.change(el, {target: {value: 'exact'}});
 
         assert.ok(spy.calledOnce);
@@ -61,7 +62,7 @@ define([
       it('toggles include docs on change', function () {
         var spy = sinon.spy();
         mainFieldsEl = TestUtils.renderIntoDocument(<Views.MainFieldsView toggleIncludeDocs={spy} reduce={false} includeDocs={false} showReduce={false}/>, container);
-        var el = $(mainFieldsEl.getDOMNode()).find('#qoIncludeDocs')[0];
+        var el = $(ReactDOM.findDOMNode(mainFieldsEl)).find('#qoIncludeDocs')[0];
         TestUtils.Simulate.change(el);
 
         assert.ok(spy.calledOnce);
@@ -72,7 +73,7 @@ define([
         mainFieldsEl = TestUtils.renderIntoDocument(
           <Views.MainFieldsView reduce={false} includeDocs={false} showReduce={false} docURL={customDocURL} />,
           container);
-        assert.equal($(React.findDOMNode(mainFieldsEl)).find('.help-link').attr('href'), customDocURL);
+        assert.equal($(ReactDOM.findDOMNode(mainFieldsEl)).find('.help-link').attr('href'), customDocURL);
       });
 
     });
@@ -88,7 +89,7 @@ define([
           toggleByKeys={spy}
           />, container);
 
-        var el = $(keysEl.getDOMNode()).find('#byKeys')[0];
+        var el = $(ReactDOM.findDOMNode(keysEl)).find('#byKeys')[0];
         TestUtils.Simulate.click(el);
         assert.ok(spy.calledOnce);
       });
@@ -102,7 +103,7 @@ define([
           betweenKeys={{}}
           />, container);
 
-        var el = $(keysEl.getDOMNode()).find('#betweenKeys')[0];
+        var el = $(ReactDOM.findDOMNode(keysEl)).find('#betweenKeys')[0];
         TestUtils.Simulate.click(el);
         assert.ok(spy.calledOnce);
       });
@@ -116,7 +117,7 @@ define([
           betweenKeys={{}}
           />, container);
 
-        var el = $(keysEl.getDOMNode()).find('#keys-input')[0];
+        var el = $(ReactDOM.findDOMNode(keysEl)).find('#keys-input')[0];
         TestUtils.Simulate.change(el, {target: {value: 'boom'}});
         assert.ok(spy.calledWith('boom'));
       });
@@ -135,7 +136,7 @@ define([
           betweenKeys={betweenKeys}
           />, container);
 
-        var el = $(keysEl.getDOMNode()).find('#endkey')[0];
+        var el = $(ReactDOM.findDOMNode(keysEl)).find('#endkey')[0];
         TestUtils.Simulate.change(el, {target: {value: 'boom'}});
         assert.ok(spy.calledOnce);
       });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/sidebar/sidebar.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/sidebar/sidebar.react.jsx b/app/addons/documents/sidebar/sidebar.react.jsx
index 660fff5..dd5abc2 100644
--- a/app/addons/documents/sidebar/sidebar.react.jsx
+++ b/app/addons/documents/sidebar/sidebar.react.jsx
@@ -14,16 +14,16 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/documents/sidebar/stores',
   'addons/documents/sidebar/actions',
   'addons/components/react-components.react',
   'addons/documents/views',
   'addons/documents/helpers',
-
   'plugins/prettify'
 ],
 
-function (app, FauxtonAPI, React, Stores, Actions, Components, DocumentViews, DocumentHelper) {
+function (app, FauxtonAPI, React, ReactDOM, Stores, Actions, Components, DocumentViews, DocumentHelper) {
   var DeleteDBModal = DocumentViews.Views.DeleteDBModal;
   var store = Stores.sidebarStore;
   var LoadLines = Components.LoadLines;
@@ -135,7 +135,7 @@ function (app, FauxtonAPI, React, Stores, Actions, Components, DocumentViews, Do
       e.preventDefault();
       var newToggleState = !this.props.contentVisible;
       var state = newToggleState ? 'show' : 'hide';
-      $(React.findDOMNode(this)).find('.accordion-body').collapse(state);
+      $(ReactDOM.findDOMNode(this)).find('.accordion-body').collapse(state);
       this.props.toggle(this.props.designDocName, this.props.title);
     },
 
@@ -221,7 +221,7 @@ function (app, FauxtonAPI, React, Stores, Actions, Components, DocumentViews, Do
       e.preventDefault();
       var newToggleState = !this.props.contentVisible;
       var state = newToggleState ? 'show' : 'hide';
-      $(React.findDOMNode(this)).find('#' + this.props.designDocName).collapse(state);
+      $(ReactDOM.findDOMNode(this)).find('#' + this.props.designDocName).collapse(state);
       this.props.toggle(this.props.designDocName);
     },
 
@@ -326,7 +326,7 @@ function (app, FauxtonAPI, React, Stores, Actions, Components, DocumentViews, Do
       this.dbModal = new DeleteDBModal({
         database: this.props.database,
         isSystemDatabase: (/^_/).test(this.props.database.id),
-        el: React.findDOMNode(this)
+        el: ReactDOM.findDOMNode(this)
       });
 
       this.dbModal.render();

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/sidebar/tests/sidebar.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/sidebar/tests/sidebar.componentsSpec.react.jsx b/app/addons/documents/sidebar/tests/sidebar.componentsSpec.react.jsx
index ec3a046..a57fc28 100644
--- a/app/addons/documents/sidebar/tests/sidebar.componentsSpec.react.jsx
+++ b/app/addons/documents/sidebar/tests/sidebar.componentsSpec.react.jsx
@@ -12,9 +12,10 @@
 define([
   'api',
   'react',
+  'react-dom',
   'testUtils',
   'addons/documents/sidebar/sidebar.react'
-], function (FauxtonAPI, React, utils, Components) {
+], function (FauxtonAPI, React, ReactDOM, utils, Components) {
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
   var DesignDoc = Components.DesignDoc;
@@ -28,7 +29,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('confirm only single sub-option is shown by default (metadata link)', function () {
@@ -41,7 +42,7 @@ define([
         designDoc={{}}
         designDocName="id"
         databaseName="db-name" />, container);
-      var subOptions = $(React.findDOMNode(el)).find('.accordion-body li');
+      var subOptions = $(ReactDOM.findDOMNode(el)).find('.accordion-body li');
       assert.equal(subOptions.length, 1);
    });
 
@@ -64,7 +65,7 @@ define([
         }}
         designDocName="id"
         databaseName="db-name" />, container);
-      var subOptions = $(React.findDOMNode(el)).find('.accordion-body li');
+      var subOptions = $(ReactDOM.findDOMNode(el)).find('.accordion-body li');
       assert.equal(subOptions.length, 3); // 1 for "Metadata" row, 1 for Type List row ("search indexes") and one for the index itself
     });
 
@@ -83,7 +84,7 @@ define([
         designDoc={{}} // note that this is empty
         designDocName="id"
         databaseName="db-name" />, container);
-      var subOptions = $(React.findDOMNode(el)).find('.accordion-body li');
+      var subOptions = $(ReactDOM.findDOMNode(el)).find('.accordion-body li');
       assert.equal(subOptions.length, 1);
     });
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/tests/helpersSpec.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/tests/helpersSpec.js b/app/addons/documents/tests/helpersSpec.js
new file mode 100644
index 0000000..0f2ba29
--- /dev/null
+++ b/app/addons/documents/tests/helpersSpec.js
@@ -0,0 +1,31 @@
+// 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.
+define([
+  'api',
+  'addons/documents/helpers',
+  'testUtils'
+], function (FauxtonAPI, Helpers, testUtils) {
+  var assert = testUtils.assert;
+
+  describe('Helpers', function () {
+
+    describe('parseJSON', function () {
+      it('replaces "\\n" with actual newlines', function () {
+        var string = 'I am a string\\nwith\\nfour\\nlinebreaks\\nin';
+        var result = Helpers.parseJSON(string);
+        assert.equal(result.match(/\n/g).length, 4);
+      });
+    });
+
+  });
+
+});

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/fauxton/components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/components.react.jsx b/app/addons/fauxton/components.react.jsx
index 1eecb46..7847f0a 100644
--- a/app/addons/fauxton/components.react.jsx
+++ b/app/addons/fauxton/components.react.jsx
@@ -14,6 +14,7 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'ZeroClipboard',
   'libs/react-bootstrap',
 
@@ -21,7 +22,7 @@ define([
   'velocity.ui'
 ],
 
-function (app, FauxtonAPI, React, ZeroClipboard, ReactBootstrap) {
+function (app, FauxtonAPI, React, ReactDOM, ZeroClipboard, ReactBootstrap) {
 
   var Modal = ReactBootstrap.Modal;
 
@@ -60,7 +61,7 @@ function (app, FauxtonAPI, React, ZeroClipboard, ReactBootstrap) {
     },
 
     componentDidMount: function () {
-      var el = React.findDOMNode(this);
+      var el = ReactDOM.findDOMNode(this);
       this.clipboard = new ZeroClipboard(el);
       this.clipboard.on('load', function () {
         this.clipboard.on('mouseup', function () {
@@ -94,7 +95,7 @@ function (app, FauxtonAPI, React, ZeroClipboard, ReactBootstrap) {
     },
 
     componentDidMount: function () {
-      var el = React.findDOMNode(this.refs["copy-text-" + this.props.uniqueKey]);
+      var el = ReactDOM.findDOMNode(this.refs["copy-text-" + this.props.uniqueKey]);
       this.clipboard = new ZeroClipboard(el);
       this.clipboard.on('load', function () {
         this.clipboard.on('mouseup', function () {
@@ -215,7 +216,7 @@ function (app, FauxtonAPI, React, ZeroClipboard, ReactBootstrap) {
 
     show: function (done) {
       this.setState({show: true});
-      $(React.findDOMNode(this.refs.myself)).velocity('transition.slideDownIn', FauxtonAPI.constants.MISC.TRAY_TOGGLE_SPEED, function () {
+      $(ReactDOM.findDOMNode(this.refs.myself)).velocity('transition.slideDownIn', FauxtonAPI.constants.MISC.TRAY_TOGGLE_SPEED, function () {
         if (done) {
           done(true);
         }
@@ -223,7 +224,7 @@ function (app, FauxtonAPI, React, ZeroClipboard, ReactBootstrap) {
     },
 
     hide: function (done) {
-      $(React.findDOMNode(this.refs.myself)).velocity('reverse', FauxtonAPI.constants.MISC.TRAY_TOGGLE_SPEED, function () {
+      $(ReactDOM.findDOMNode(this.refs.myself)).velocity('reverse', FauxtonAPI.constants.MISC.TRAY_TOGGLE_SPEED, function () {
         this.setState({show: false});
         if (done) {
           done(false);

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/fauxton/navigation/components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/navigation/components.react.jsx b/app/addons/fauxton/navigation/components.react.jsx
index 0310530..bc06215 100644
--- a/app/addons/fauxton/navigation/components.react.jsx
+++ b/app/addons/fauxton/navigation/components.react.jsx
@@ -13,11 +13,12 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/fauxton/navigation/stores',
   'addons/fauxton/navigation/actions'
 ],
 
-function (app, FauxtonAPI, React, Stores, Actions) {
+function (app, FauxtonAPI, React, ReactDOM, Stores, Actions) {
   var navBarStore = Stores.navBarStore;
 
   var Footer = React.createClass({
@@ -152,7 +153,7 @@ function (app, FauxtonAPI, React, Stores, Actions) {
 
   return {
     renderNavBar: function (el) {
-      React.render(<NavBar/>, el);
+      ReactDOM.render(<NavBar/>, el);
     },
     NavBar: NavBar,
     Burger: Burger

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/fauxton/navigation/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/navigation/tests/componentsSpec.react.jsx b/app/addons/fauxton/navigation/tests/componentsSpec.react.jsx
index 2820ef4..2b4708c 100644
--- a/app/addons/fauxton/navigation/tests/componentsSpec.react.jsx
+++ b/app/addons/fauxton/navigation/tests/componentsSpec.react.jsx
@@ -16,8 +16,9 @@ define([
   'core/auth',
   'addons/auth/base',
   'testUtils',
-  "react"
-], function (FauxtonAPI, Views, Actions, Auth, BaseAuth, utils, React) {
+  "react",
+  'react-dom'
+], function (FauxtonAPI, Views, Actions, Auth, BaseAuth, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -34,11 +35,11 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
       });
 
       it('dispatch TOGGLE_NAVBAR_MENU on click', function () {
-        TestUtils.Simulate.click(burgerEl.getDOMNode());
+        TestUtils.Simulate.click(ReactDOM.findDOMNode(burgerEl));
         assert.ok(toggleMenu.calledOnce);
       });
 
@@ -57,13 +58,13 @@ define([
       FauxtonAPI.session.trigger('change');
 
       // confirm the logout link is present
-      var matches = React.findDOMNode(el).outerHTML.match(/Logout/);
+      var matches = ReactDOM.findDOMNode(el).outerHTML.match(/Logout/);
       assert.equal(matches.length, 1);
 
       // now confirm there's still only a single logout link after publishing multiple
       FauxtonAPI.session.trigger('change');
       FauxtonAPI.session.trigger('change');
-      matches = React.findDOMNode(el).outerHTML.match(/Logout/);
+      matches = ReactDOM.findDOMNode(el).outerHTML.match(/Logout/);
       assert.equal(matches.length, 1);
 
       FauxtonAPI.session.isLoggedIn.restore();

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/fauxton/notifications/notifications.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/notifications/notifications.react.jsx b/app/addons/fauxton/notifications/notifications.react.jsx
index 443e687..2991a6f 100644
--- a/app/addons/fauxton/notifications/notifications.react.jsx
+++ b/app/addons/fauxton/notifications/notifications.react.jsx
@@ -14,6 +14,7 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/fauxton/notifications/actions',
   'addons/fauxton/notifications/stores',
   'addons/fauxton/components.react',
@@ -22,7 +23,7 @@ define([
   'velocity.ui'
 ],
 
-function (app, FauxtonAPI, React, Actions, Stores, Components) {
+function (app, FauxtonAPI, React, ReactDOM, Actions, Stores, Components) {
 
   var notificationStore = Stores.notificationStore;
   var Clipboard = Components.Clipboard;
@@ -197,18 +198,18 @@ function (app, FauxtonAPI, React, Actions, Stores, Components) {
         show = this.props.item.type === this.props.filter;
       }
       if (show) {
-        $(React.findDOMNode(this)).velocity({ opacity: 1, height: this.state.elementHeight }, this.props.transitionSpeed);
+        $(ReactDOM.findDOMNode(this)).velocity({ opacity: 1, height: this.state.elementHeight }, this.props.transitionSpeed);
         return;
       }
       this.hide();
     },
 
     getHeight: function () {
-      return $(React.findDOMNode(this)).outerHeight(true);
+      return $(ReactDOM.findDOMNode(this)).outerHeight(true);
     },
 
     hide: function (onHidden) {
-      $(React.findDOMNode(this)).velocity({ opacity: 0, height: 0 }, this.props.transitionSpeed, function () {
+      $(ReactDOM.findDOMNode(this)).velocity({ opacity: 0, height: 0 }, this.props.transitionSpeed, function () {
         if (onHidden) {
           onHidden();
         }
@@ -255,7 +256,7 @@ function (app, FauxtonAPI, React, Actions, Stores, Components) {
     NotificationRow: NotificationRow,
 
     renderNotificationCenter: function (el) {
-      return React.render(<NotificationCenterPanel />, el);
+      return ReactDOM.render(<NotificationCenterPanel />, el);
     }
   };
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/fauxton/notifications/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/notifications/tests/componentsSpec.react.jsx b/app/addons/fauxton/notifications/tests/componentsSpec.react.jsx
index b72eac5..ab8d432 100644
--- a/app/addons/fauxton/notifications/tests/componentsSpec.react.jsx
+++ b/app/addons/fauxton/notifications/tests/componentsSpec.react.jsx
@@ -15,8 +15,9 @@ define([
   'addons/fauxton/notifications/stores',
   'testUtils',
   'react',
+  'react-dom',
   'moment'
-], function (FauxtonAPI, Views, Stores, utils, React, moment) {
+], function (FauxtonAPI, Views, Stores, utils, React, ReactDOM, moment) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -52,7 +53,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('shows all notification types when "all" filter applied', function () {
@@ -60,22 +61,22 @@ define([
         <Views.NotificationRow filter="all" item={notifications.success} />,
         container
       );
-      assert.equal($(row1.getDOMNode()).attr('aria-hidden'), 'false');
-      React.unmountComponentAtNode(container);
+      assert.equal($(ReactDOM.findDOMNode(row1)).attr('aria-hidden'), 'false');
+      ReactDOM.unmountComponentAtNode(container);
 
       var row2 = TestUtils.renderIntoDocument(
         <Views.NotificationRow filter="all" item={notifications.error} />,
         container
       );
-      assert.equal($(row2.getDOMNode()).attr('aria-hidden'), 'false');
-      React.unmountComponentAtNode(container);
+      assert.equal($(ReactDOM.findDOMNode(row2)).attr('aria-hidden'), 'false');
+      ReactDOM.unmountComponentAtNode(container);
 
       var row3 = TestUtils.renderIntoDocument(
         <Views.NotificationRow filter="all" item={notifications.info} />,
         container
       );
-      assert.equal($(row3.getDOMNode()).attr('aria-hidden'), 'false');
-      React.unmountComponentAtNode(container);
+      assert.equal($(ReactDOM.findDOMNode(row3)).attr('aria-hidden'), 'false');
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('hides notification when filter doesn\'t match', function () {
@@ -83,7 +84,7 @@ define([
         <Views.NotificationRow filter="success" item={notifications.info} />,
         container
       );
-      assert.equal($(rowEl.getDOMNode()).attr('aria-hidden'), 'true');
+      assert.equal($(ReactDOM.findDOMNode(rowEl)).attr('aria-hidden'), 'true');
     });
 
     it('shows notification when filter exact match', function () {
@@ -91,7 +92,7 @@ define([
         <Views.NotificationRow filter="info" item={notifications.info} />,
         container
       );
-      assert.equal($(rowEl.getDOMNode()).attr('aria-hidden'), 'false');
+      assert.equal($(ReactDOM.findDOMNode(rowEl)).attr('aria-hidden'), 'false');
     });
 
   });
@@ -106,7 +107,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('shows all notifications by default', function () {
@@ -118,7 +119,7 @@ define([
       store.addNotification({ type: 'error', msg: 'Error #3' });
 
       var panelEl = TestUtils.renderIntoDocument(<Views.NotificationCenterPanel />, container);
-      assert.equal($(panelEl.getDOMNode()).find('.notification-list li[aria-hidden=false]').length, 6);
+      assert.equal($(ReactDOM.findDOMNode(panelEl)).find('.notification-list li[aria-hidden=false]').length, 6);
     });
 
     it('clicking on a filter icon filters applies appropriate filter', function () {
@@ -132,16 +133,16 @@ define([
       var panelEl = TestUtils.renderIntoDocument(<Views.NotificationCenterPanel />, container);
 
       // there are 2 success messages
-      TestUtils.Simulate.click($(panelEl.getDOMNode()).find('.notification-filter li[data-filter="success"]')[0]);
-      assert.equal($(panelEl.getDOMNode()).find('.notification-list li[aria-hidden=false]').length, 2);
+      TestUtils.Simulate.click($(ReactDOM.findDOMNode(panelEl)).find('.notification-filter li[data-filter="success"]')[0]);
+      assert.equal($(ReactDOM.findDOMNode(panelEl)).find('.notification-list li[aria-hidden=false]').length, 2);
 
       // 3 errors
-      TestUtils.Simulate.click($(panelEl.getDOMNode()).find('.notification-filter li[data-filter="error"]')[0]);
-      assert.equal($(panelEl.getDOMNode()).find('.notification-list li[aria-hidden=false]').length, 3);
+      TestUtils.Simulate.click($(ReactDOM.findDOMNode(panelEl)).find('.notification-filter li[data-filter="error"]')[0]);
+      assert.equal($(ReactDOM.findDOMNode(panelEl)).find('.notification-list li[aria-hidden=false]').length, 3);
 
       // 1 info
-      TestUtils.Simulate.click($(panelEl.getDOMNode()).find('.notification-filter li[data-filter="info"]')[0]);
-      assert.equal($(panelEl.getDOMNode()).find('.notification-list li[aria-hidden=false]').length, 1);
+      TestUtils.Simulate.click($(ReactDOM.findDOMNode(panelEl)).find('.notification-filter li[data-filter="info"]')[0]);
+      assert.equal($(ReactDOM.findDOMNode(panelEl)).find('.notification-list li[aria-hidden=false]').length, 1);
     });
 
     it('clear all clears all notifications', function () {
@@ -151,10 +152,10 @@ define([
       store.addNotification({ type: 'error', msg: 'Error #3' });
 
       var panelEl = TestUtils.renderIntoDocument(<Views.NotificationCenterPanel />, container);
-      assert.equal($(panelEl.getDOMNode()).find('.notification-list li[aria-hidden=false]').length, 4);
-      TestUtils.Simulate.click($(panelEl.getDOMNode()).find('footer input')[0]);
+      assert.equal($(ReactDOM.findDOMNode(panelEl)).find('.notification-list li[aria-hidden=false]').length, 4);
+      TestUtils.Simulate.click($(ReactDOM.findDOMNode(panelEl)).find('footer input')[0]);
 
-      assert.equal($(panelEl.getDOMNode()).find('.notification-list li[aria-hidden=false]').length, 0);
+      assert.equal($(ReactDOM.findDOMNode(panelEl)).find('.notification-list li[aria-hidden=false]').length, 0);
     });
 
   });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/fauxton/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/tests/componentsSpec.react.jsx b/app/addons/fauxton/tests/componentsSpec.react.jsx
index 3c7870f..fe77e8a 100644
--- a/app/addons/fauxton/tests/componentsSpec.react.jsx
+++ b/app/addons/fauxton/tests/componentsSpec.react.jsx
@@ -13,8 +13,9 @@ define([
   'api',
   'addons/fauxton/components.react',
   'testUtils',
-  'react'
-], function (FauxtonAPI, Views, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, Views, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -37,7 +38,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
       FauxtonAPI.constants.MISC.TRAY_TOGGLE_SPEED = oldToggleSpeed;
     });
 
@@ -94,7 +95,7 @@ define([
           var trayEl = this.refs.tray;
           var externalEl = this.refs.externalElement;
           trayEl.show(function () {
-            TestUtils.Simulate.click(React.findDOMNode(externalEl));
+            TestUtils.Simulate.click(ReactDOM.findDOMNode(externalEl));
             assert.ok(spy.calledOnce);
           });
         },
@@ -112,7 +113,7 @@ define([
       var reactEl = TestUtils.renderIntoDocument(React.createElement(wrapper), container);
       reactEl.runTest();
 
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
   });
@@ -131,7 +132,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('renders 20-wise pages per default', function () {
@@ -218,7 +219,7 @@ define([
         <Views.Pagination page={1} total={100} onClick={spy} />,
         container
       );
-      var links = React.findDOMNode(pageEl).getElementsByTagName("a");
+      var links = ReactDOM.findDOMNode(pageEl).getElementsByTagName("a");
 
       TestUtils.Simulate.click(links[3]);
 
@@ -237,7 +238,7 @@ define([
         <Views.Pagination page={currentPage} total={200} onClick={spy} />,
         container
       );
-      var links = React.findDOMNode(pageEl).getElementsByTagName("a");
+      var links = ReactDOM.findDOMNode(pageEl).getElementsByTagName("a");
 
       TestUtils.Simulate.click(links[0]);
       assert.ok(spy.calledWith(currentPage - 1));
@@ -256,22 +257,22 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('shows a clipboard icon by default', function () {
       var clipboard = TestUtils.renderIntoDocument(<Views.Clipboard text="copy me" />, container);
-      assert.equal($(clipboard.getDOMNode()).find('.icon-paste').length, 1);
+      assert.equal($(ReactDOM.findDOMNode(clipboard)).find('.icon-paste').length, 1);
     });
 
     it('shows text if specified', function () {
       var clipboard = TestUtils.renderIntoDocument(<Views.Clipboard displayType="text" text="copy me" />, container);
-      assert.equal($(clipboard.getDOMNode()).find('.icon-paste').length, 0);
+      assert.equal($(ReactDOM.findDOMNode(clipboard)).find('.icon-paste').length, 0);
     });
 
     it('shows custom text if specified ', function () {
       var clipboard = TestUtils.renderIntoDocument(<Views.Clipboard displayType="text" textDisplay='booyah!' text="copy me" />, container);
-      assert.ok(/booyah!/.test($(clipboard.getDOMNode())[0].outerHTML));
+      assert.ok(/booyah!/.test($(ReactDOM.findDOMNode(clipboard))[0].outerHTML));
     });
 
   });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/permissions/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/permissions/tests/componentsSpec.react.jsx b/app/addons/permissions/tests/componentsSpec.react.jsx
index 795f4cb..2b2feb6 100644
--- a/app/addons/permissions/tests/componentsSpec.react.jsx
+++ b/app/addons/permissions/tests/componentsSpec.react.jsx
@@ -16,8 +16,9 @@ define([
   'addons/permissions/components.react',
   'addons/permissions/actions',
   'testUtils',
-  "react"
-  ], function (FauxtonAPI, Databases, Permissions, Views, Actions, utils, React) {
+  "react",
+  'react-dom'
+  ], function (FauxtonAPI, Databases, Permissions, Views, Actions, utils, React, ReactDOM) {
     var assert = utils.assert;
     var restore = utils.restore;
     var TestUtils = React.addons.TestUtils;
@@ -50,7 +51,7 @@ define([
         });
 
         afterEach(function () {
-          React.unmountComponentAtNode(container);
+          ReactDOM.unmountComponentAtNode(container);
         });
 
         it('on Add triggers add action', function () {
@@ -81,17 +82,17 @@ define([
         });
 
         afterEach(function () {
-          React.unmountComponentAtNode(container);
+          ReactDOM.unmountComponentAtNode(container);
         });
 
         it('adds user on submit', function () {
-          var input = $(el.getDOMNode()).find('input')[0];
+          var input = $(ReactDOM.findDOMNode(el)).find('input')[0];
           TestUtils.Simulate.change(input, {
             target: {
               value: 'newusername'
             }
           });
-          var form = $(el.getDOMNode()).find('.permission-item-form')[0];
+          var form = $(ReactDOM.findDOMNode(el)).find('.permission-item-form')[0];
           TestUtils.Simulate.submit(form);
 
           var options = addSpy.args[0][0];
@@ -101,13 +102,13 @@ define([
         });
 
         it('adds role on submit', function () {
-          var input = $(el.getDOMNode()).find('input')[1];
+          var input = $(ReactDOM.findDOMNode(el)).find('input')[1];
           TestUtils.Simulate.change(input, {
             target: {
               value: 'newrole'
             }
           });
-          var form = $(el.getDOMNode()).find('.permission-item-form')[1];
+          var form = $(ReactDOM.findDOMNode(el)).find('.permission-item-form')[1];
           TestUtils.Simulate.submit(form);
 
           var options = addSpy.args[0][0];
@@ -118,7 +119,7 @@ define([
 
         it('stores new name on change', function () {
           var newName = 'newName';
-          var dom = $(el.getDOMNode()).find('.item')[0];
+          var dom = $(ReactDOM.findDOMNode(el)).find('.item')[0];
 
           TestUtils.Simulate.change(dom, {
             target: {
@@ -131,7 +132,7 @@ define([
 
         it('stores new role on change', function () {
           var newRole = 'newRole';
-          var dom = $(el.getDOMNode()).find('.item')[1];
+          var dom = $(ReactDOM.findDOMNode(el)).find('.item')[1];
 
           TestUtils.Simulate.change(dom, {
             target: {
@@ -153,11 +154,11 @@ define([
         });
 
         afterEach(function () {
-          React.unmountComponentAtNode(container);
+          ReactDOM.unmountComponentAtNode(container);
         });
 
         it('triggers remove on click', function () {
-          var dom = $(el.getDOMNode()).find('.close')[0];
+          var dom = $(ReactDOM.findDOMNode(el)).find('.close')[0];
           TestUtils.Simulate.click(dom);
 
           assert.ok(removeSpy.calledOnce);

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/setup/tests/setupComponentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/setup/tests/setupComponentsSpec.react.jsx b/app/addons/setup/tests/setupComponentsSpec.react.jsx
index ead1f98..b6a8b86 100644
--- a/app/addons/setup/tests/setupComponentsSpec.react.jsx
+++ b/app/addons/setup/tests/setupComponentsSpec.react.jsx
@@ -14,8 +14,9 @@ define([
   'addons/setup/setup.react',
   'addons/setup/setup.stores',
   'testUtils',
-  'react'
-], function (FauxtonAPI, Views, Stores, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, Views, Stores, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -31,7 +32,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
       });
 
       it('fires callbacks on change, ip', function () {
@@ -40,7 +41,7 @@ define([
           container
         );
 
-        var node = $(optSettings.getDOMNode()).find('.setup-input-ip')[0];
+        var node = $(ReactDOM.findDOMNode(optSettings)).find('.setup-input-ip')[0];
         TestUtils.Simulate.change(node, {target: {value: 'Hello, world'}});
 
         assert.ok(changeHandler.calledOnce);
@@ -52,7 +53,7 @@ define([
           container
         );
 
-        var node = $(optSettings.getDOMNode()).find('.setup-input-port')[0];
+        var node = $(ReactDOM.findDOMNode(optSettings)).find('.setup-input-port')[0];
         TestUtils.Simulate.change(node, {target: {value: 'Hello, world'}});
 
         assert.ok(changeHandler.calledOnce);
@@ -74,12 +75,12 @@ define([
 
       afterEach(function () {
         utils.restore(Stores.setupStore.getIsAdminParty);
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
         Stores.setupStore.reset();
       });
 
       it('changes the values in the store for additional nodes', function () {
-        var $addNodesSection = $(controller.getDOMNode()).find('.setup-add-nodes-section');
+        var $addNodesSection = $(ReactDOM.findDOMNode(controller)).find('.setup-add-nodes-section');
         TestUtils.Simulate.change($addNodesSection.find('.setup-input-ip')[0], {target: {value: '192.168.13.37'}});
         TestUtils.Simulate.change($addNodesSection.find('.setup-input-port')[0], {target: {value: '1337'}});
         TestUtils.Simulate.change($addNodesSection.find('.input-remote-node')[0], {target: {value: 'node2.local'}});
@@ -91,7 +92,7 @@ define([
       });
 
       it('changes the values in the store for the setup node', function () {
-        var $setupNodesSection = $(controller.getDOMNode()).find('.setup-setupnode-section');
+        var $setupNodesSection = $(ReactDOM.findDOMNode(controller)).find('.setup-setupnode-section');
         TestUtils.Simulate.change($setupNodesSection.find('.setup-input-ip')[0], {target: {value: '192.168.42.42'}});
         TestUtils.Simulate.change($setupNodesSection.find('.setup-input-port')[0], {target: {value: '4242'}});
         TestUtils.Simulate.change($setupNodesSection.find('.setup-username')[0], {target: {value: 'tester'}});
@@ -120,12 +121,12 @@ define([
 
       afterEach(function () {
         utils.restore(Stores.setupStore.getIsAdminParty);
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
         Stores.setupStore.reset();
       });
 
       it('changes the values in the store for the setup node', function () {
-        var $setupNodesSection = $(controller.getDOMNode()).find('.setup-setupnode-section');
+        var $setupNodesSection = $(ReactDOM.findDOMNode(controller)).find('.setup-setupnode-section');
         TestUtils.Simulate.change($setupNodesSection.find('.setup-input-ip')[0], {target: {value: '192.168.13.42'}});
         TestUtils.Simulate.change($setupNodesSection.find('.setup-input-port')[0], {target: {value: '1342'}});
         TestUtils.Simulate.change($setupNodesSection.find('.setup-username')[0], {target: {value: 'tester'}});

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/verifyinstall/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/verifyinstall/tests/componentsSpec.react.jsx b/app/addons/verifyinstall/tests/componentsSpec.react.jsx
index e345a70..b0a48bc 100644
--- a/app/addons/verifyinstall/tests/componentsSpec.react.jsx
+++ b/app/addons/verifyinstall/tests/componentsSpec.react.jsx
@@ -14,11 +14,12 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'testUtils',
   'addons/verifyinstall/constants',
   'addons/verifyinstall/components.react'
 
-], function (app, FauxtonAPI, React, testUtils, Constants, Components) {
+], function (app, FauxtonAPI, React, ReactDOM, testUtils, Constants, Components) {
   FauxtonAPI.router = new FauxtonAPI.Router([]);
 
   var assert = testUtils.assert;
@@ -43,7 +44,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('confirm all result fields blank before tests ran', function () {
@@ -51,7 +52,7 @@ define([
       el = ReactTestUtils.renderIntoDocument(<Components.VerifyInstallResults testResults={testResults} />, container);
 
       tests.forEach(function (test) {
-        assert.equal($(el.getDOMNode()).find('#' + test.id).html(), '');
+        assert.equal($(ReactDOM.findDOMNode(el)).find('#' + test.id).html(), '');
       });
     });
 
@@ -68,7 +69,7 @@ define([
         el = ReactTestUtils.renderIntoDocument(<Components.VerifyInstallResults testResults={copy} />, container);
 
         // now look at the DOM for that element. It should contain a tick char
-        assert.equal($(el.getDOMNode()).find('#' + test.id + ' span').html(), '✓');
+        assert.equal($(ReactDOM.findDOMNode(el)).find('#' + test.id + ' span').html(), '✓');
       });
     });
 
@@ -85,7 +86,7 @@ define([
         el = ReactTestUtils.renderIntoDocument(<Components.VerifyInstallResults testResults={copy} />, container);
 
         // now look at the DOM for that element. It should contain an error char
-        assert.equal($(el.getDOMNode()).find('#' + test.id + ' span').html(), '✗');
+        assert.equal($(ReactDOM.findDOMNode(el)).find('#' + test.id + ' span').html(), '✗');
       });
     });
   });
@@ -99,14 +100,14 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('calls verify function on click', function () {
       var stub = { func: function () { } };
       var spy = sinon.spy(stub, 'func');
       el = ReactTestUtils.renderIntoDocument(<Components.VerifyInstallButton verify={stub.func} isVerifying={false} />, container);
-      ReactTestUtils.Simulate.click($(el.getDOMNode())[0]);
+      ReactTestUtils.Simulate.click($(ReactDOM.findDOMNode(el))[0]);
       assert.ok(spy.calledOnce);
     });
 
@@ -114,20 +115,20 @@ define([
       var stub = { func: function () { } };
       var spy = sinon.spy(stub, 'func');
       el = ReactTestUtils.renderIntoDocument(<Components.VerifyInstallButton verify={stub.func} isVerifying={true} />, container);
-      ReactTestUtils.Simulate.click($(el.getDOMNode())[0]);
+      ReactTestUtils.Simulate.click($(ReactDOM.findDOMNode(el))[0]);
       assert.notOk(spy.calledOnce);
     });
 
     it('shows appropriate default label', function () {
       var stub = { func: function () { } };
       el = ReactTestUtils.renderIntoDocument(<Components.VerifyInstallButton verify={stub.func} isVerifying={false} />, container);
-      assert.equal($(el.getDOMNode()).html(), 'Verify Installation');
+      assert.equal($(ReactDOM.findDOMNode(el)).html(), 'Verify Installation');
     });
 
     it('shows appropriate label during verification', function () {
       var stub = { func: function () { } };
       el = ReactTestUtils.renderIntoDocument(<Components.VerifyInstallButton verify={stub.func} isVerifying={true} />, container);
-      assert.equal($(el.getDOMNode()).html(), 'Verifying');
+      assert.equal($(ReactDOM.findDOMNode(el)).html(), 'Verifying');
     });
 
   });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/config.js
----------------------------------------------------------------------
diff --git a/app/config.js b/app/config.js
index 8f289e6..8097509 100644
--- a/app/config.js
+++ b/app/config.js
@@ -35,6 +35,7 @@ require.config({
     "velocity.ui": "../assets/js/plugins/velocity.ui",
     "react-autocomplete": "../assets/js/plugins/react-autocomplete",
     react: "../assets/js/libs/react",
+    'react-dom': "../assets/js/libs/react-dom",
     flux: "../assets/js/libs/flux",
     "es5-shim": "../assets/js/libs/es5-shim",
     "css.escape": "../assets/js/libs/css.escape",

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/core/routeObject.js
----------------------------------------------------------------------
diff --git a/app/core/routeObject.js b/app/core/routeObject.js
index 79f6f28..7e82dc1 100644
--- a/app/core/routeObject.js
+++ b/app/core/routeObject.js
@@ -13,9 +13,10 @@
 define([
   'core/base',
   'react',
+  'react-dom',
   'backbone'
 ],
-function (FauxtonAPI, React, Backbone) {
+function (FauxtonAPI, React, ReactDOM, Backbone) {
 
   var RouteObject = function (options) {
     this._options = options;
@@ -135,7 +136,7 @@ function (FauxtonAPI, React, Backbone) {
     renderReactComponents: function () {
       _.each(this.reactComponents, function (componentInfo, selector) {
         if ($(selector)[0]) {
-          React.render(React.createElement(componentInfo.component, componentInfo.props), $(selector)[0]);
+          ReactDOM.render(React.createElement(componentInfo.component, componentInfo.props), $(selector)[0]);
         }
       });
     },
@@ -260,7 +261,7 @@ function (FauxtonAPI, React, Backbone) {
     removeComponent: function (selector) {
       if (_.has(this.reactComponents, selector)) {
         if ($(selector)[0]) {
-          React.unmountComponentAtNode($(selector)[0]);
+          ReactDOM.unmountComponentAtNode($(selector)[0]);
         }
         this.reactComponents[selector] = null;
         delete this.reactComponents[selector];

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/core/tests/routeObjectSpec.js
----------------------------------------------------------------------
diff --git a/app/core/tests/routeObjectSpec.js b/app/core/tests/routeObjectSpec.js
index bcb8760..d32de12 100644
--- a/app/core/tests/routeObjectSpec.js
+++ b/app/core/tests/routeObjectSpec.js
@@ -12,8 +12,9 @@
 define([
   'api',
   'react',
+  'react-dom',
   'testUtils'
-], function (FauxtonAPI, React, testUtils) {
+], function (FauxtonAPI, React, ReactDOM, testUtils) {
   var assert = testUtils.assert,
       restore = testUtils.restore,
       RouteObject = FauxtonAPI.RouteObject,
@@ -196,11 +197,11 @@ define([
       describe('removeComponent', function () {
 
         afterEach(function () {
-          restore(React.unmountComponentAtNode);
+          restore(ReactDOM.unmountComponentAtNode);
         });
 
         it('removes existing components via React', function () {
-          var spy = sinon.stub(React, 'unmountComponentAtNode');
+          var spy = sinon.stub(ReactDOM, 'unmountComponentAtNode');
           var fakeSelector = 'remove-selector';
 
           var container = document.createElement('div');
@@ -220,7 +221,7 @@ define([
         });
 
         it('removes existing components key', function () {
-          var spy = sinon.stub(React, 'unmountComponentAtNode');
+          var spy = sinon.stub(ReactDOM, 'unmountComponentAtNode');
           var fakeSelector = 'remove-selector';
           testRouteObject.reactComponents[fakeSelector] = React.createElement('div');
 
@@ -231,7 +232,7 @@ define([
         });
 
         it('does nothing for non existing component', function () {
-          var spy = sinon.spy(React, 'unmountComponentAtNode');
+          var spy = sinon.spy(ReactDOM, 'unmountComponentAtNode');
           var fakeSelector = 'remove-selector';
 
           testRouteObject.removeComponent(fakeSelector);


[4/6] fauxton commit: updated refs/heads/master to e6450a0

Posted by be...@apache.org.
react-bootstrap updated to 0.28.2


Project: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/commit/cab6fc2d
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/tree/cab6fc2d
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/diff/cab6fc2d

Branch: refs/heads/master
Commit: cab6fc2d364edd26b49bac3a5572530fe292c39f
Parents: d0cb3d8
Author: Ben Keen <be...@gmail.com>
Authored: Tue Jan 19 10:48:53 2016 -0800
Committer: Ben Keen <be...@gmail.com>
Committed: Mon Feb 1 08:39:35 2016 -0800

----------------------------------------------------------------------
 assets/js/libs/react-bootstrap.js | 27366 ++++++++++++++++---------------
 1 file changed, 14092 insertions(+), 13274 deletions(-)
----------------------------------------------------------------------



[3/6] fauxton commit: updated refs/heads/master to e6450a0

Posted by be...@apache.org.
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/cab6fc2d/assets/js/libs/react-bootstrap.js
----------------------------------------------------------------------
diff --git a/assets/js/libs/react-bootstrap.js b/assets/js/libs/react-bootstrap.js
index caef22b..e02b0bf 100644
--- a/assets/js/libs/react-bootstrap.js
+++ b/assets/js/libs/react-bootstrap.js
@@ -1,16265 +1,17083 @@
 (function webpackUniversalModuleDefinition(root, factory) {
-  if(typeof exports === 'object' && typeof module === 'object')
-    module.exports = factory(require("react"));
-  else if(typeof define === 'function' && define.amd)
-    define(["react"], factory);
-  else if(typeof exports === 'object')
-    exports["ReactBootstrap"] = factory(require("react"));
-  else
-    root["ReactBootstrap"] = factory(root["React"]);
-})(this, function(__WEBPACK_EXTERNAL_MODULE_4__) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory(require("react"), require("react-dom"));
+	else if(typeof define === 'function' && define.amd)
+		define(["react", "react-dom"], factory);
+	else if(typeof exports === 'object')
+		exports["ReactBootstrap"] = factory(require("react"), require("react-dom"));
+	else
+		root["ReactBootstrap"] = factory(root["React"], root["ReactDOM"]);
+})(this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_63__) {
 return /******/ (function(modules) { // webpackBootstrap
-/******/  // The module cache
-/******/  var installedModules = {};
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
 
-/******/  // The require function
-/******/  function __webpack_require__(moduleId) {
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
 
-/******/    // Check if module is in cache
-/******/    if(installedModules[moduleId])
-/******/      return installedModules[moduleId].exports;
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId])
+/******/ 			return installedModules[moduleId].exports;
 
-/******/    // Create a new module (and put it into the cache)
-/******/    var module = installedModules[moduleId] = {
-/******/      exports: {},
-/******/      id: moduleId,
-/******/      loaded: false
-/******/    };
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			exports: {},
+/******/ 			id: moduleId,
+/******/ 			loaded: false
+/******/ 		};
 
-/******/    // Execute the module function
-/******/    modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
 
-/******/    // Flag the module as loaded
-/******/    module.loaded = true;
+/******/ 		// Flag the module as loaded
+/******/ 		module.loaded = true;
 
-/******/    // Return the exports of the module
-/******/    return module.exports;
-/******/  }
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
 
 
-/******/  // expose the modules object (__webpack_modules__)
-/******/  __webpack_require__.m = modules;
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
 
-/******/  // expose the module cache
-/******/  __webpack_require__.c = installedModules;
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
 
-/******/  // __webpack_public_path__
-/******/  __webpack_require__.p = "";
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
 
-/******/  // Load entry module and return exports
-/******/  return __webpack_require__(0);
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(0);
 /******/ })
 /************************************************************************/
 /******/ ([
 /* 0 */
 /***/ function(module, exports, __webpack_require__) {
 
-  'use strict';
+	'use strict';
 
-  var _interopRequireDefault = __webpack_require__(1)['default'];
+	var _interopRequireDefault = __webpack_require__(1)['default'];
 
-  var _interopRequireWildcard = __webpack_require__(2)['default'];
+	var _interopRequireWildcard = __webpack_require__(2)['default'];
 
-  exports.__esModule = true;
+	exports.__esModule = true;
 
-  var _utilsChildrenValueInputValidation = __webpack_require__(3);
+	var _utilsChildrenValueInputValidation = __webpack_require__(3);
 
-  var _utilsChildrenValueInputValidation2 = _interopRequireDefault(_utilsChildrenValueInputValidation);
+	var _utilsChildrenValueInputValidation2 = _interopRequireDefault(_utilsChildrenValueInputValidation);
 
-  var _utilsCreateChainedFunction = __webpack_require__(6);
+	var _utilsCreateChainedFunction = __webpack_require__(6);
 
-  var _utilsCreateChainedFunction2 = _interopRequireDefault(_utilsCreateChainedFunction);
+	var _utilsCreateChainedFunction2 = _interopRequireDefault(_utilsCreateChainedFunction);
 
-  var _utilsValidComponentChildren = __webpack_require__(7);
+	var _utilsValidComponentChildren = __webpack_require__(7);
 
-  var _utilsValidComponentChildren2 = _interopRequireDefault(_utilsValidComponentChildren);
+	var _utilsValidComponentChildren2 = _interopRequireDefault(_utilsValidComponentChildren);
 
-  var _Accordion2 = __webpack_require__(8);
+	var _utilsBootstrapUtils = __webpack_require__(8);
 
-  var _Accordion3 = _interopRequireDefault(_Accordion2);
+	var _utilsBootstrapUtils2 = _interopRequireDefault(_utilsBootstrapUtils);
 
-  exports.Accordion = _Accordion3['default'];
+	var _Accordion2 = __webpack_require__(34);
 
-  var _Affix2 = __webpack_require__(32);
+	var _Accordion3 = _interopRequireDefault(_Accordion2);
 
-  var _Affix3 = _interopRequireDefault(_Affix2);
+	exports.Accordion = _Accordion3['default'];
 
-  exports.Affix = _Affix3['default'];
+	var _Alert2 = __webpack_require__(38);
 
-  var _AffixMixin2 = __webpack_require__(33);
+	var _Alert3 = _interopRequireDefault(_Alert2);
 
-  var _AffixMixin3 = _interopRequireDefault(_AffixMixin2);
+	exports.Alert = _Alert3['default'];
 
-  exports.AffixMixin = _AffixMixin3['default'];
+	var _Badge2 = __webpack_require__(39);
 
-  var _Alert2 = __webpack_require__(43);
+	var _Badge3 = _interopRequireDefault(_Badge2);
 
-  var _Alert3 = _interopRequireDefault(_Alert2);
+	exports.Badge = _Badge3['default'];
 
-  exports.Alert = _Alert3['default'];
+	var _Breadcrumb2 = __webpack_require__(40);
 
-  var _Badge2 = __webpack_require__(44);
+	var _Breadcrumb3 = _interopRequireDefault(_Breadcrumb2);
 
-  var _Badge3 = _interopRequireDefault(_Badge2);
+	exports.Breadcrumb = _Breadcrumb3['default'];
 
-  exports.Badge = _Badge3['default'];
+	var _BreadcrumbItem2 = __webpack_require__(41);
 
-  var _BootstrapMixin2 = __webpack_require__(28);
+	var _BreadcrumbItem3 = _interopRequireDefault(_BreadcrumbItem2);
 
-  var _BootstrapMixin3 = _interopRequireDefault(_BootstrapMixin2);
+	exports.BreadcrumbItem = _BreadcrumbItem3['default'];
 
-  exports.BootstrapMixin = _BootstrapMixin3['default'];
+	var _Button2 = __webpack_require__(51);
 
-  var _Breadcrumb2 = __webpack_require__(45);
+	var _Button3 = _interopRequireDefault(_Button2);
 
-  var _Breadcrumb3 = _interopRequireDefault(_Breadcrumb2);
+	exports.Button = _Button3['default'];
 
-  exports.Breadcrumb = _Breadcrumb3['default'];
+	var _ButtonGroup2 = __webpack_require__(54);
 
-  var _BreadcrumbItem2 = __webpack_require__(46);
+	var _ButtonGroup3 = _interopRequireDefault(_ButtonGroup2);
 
-  var _BreadcrumbItem3 = _interopRequireDefault(_BreadcrumbItem2);
+	exports.ButtonGroup = _ButtonGroup3['default'];
 
-  exports.BreadcrumbItem = _BreadcrumbItem3['default'];
+	var _ButtonInput2 = __webpack_require__(56);
 
-  var _Button2 = __webpack_require__(62);
+	var _ButtonInput3 = _interopRequireDefault(_ButtonInput2);
 
-  var _Button3 = _interopRequireDefault(_Button2);
+	exports.ButtonInput = _ButtonInput3['default'];
 
-  exports.Button = _Button3['default'];
+	var _ButtonToolbar2 = __webpack_require__(60);
 
-  var _ButtonGroup2 = __webpack_require__(68);
+	var _ButtonToolbar3 = _interopRequireDefault(_ButtonToolbar2);
 
-  var _ButtonGroup3 = _interopRequireDefault(_ButtonGroup2);
+	exports.ButtonToolbar = _ButtonToolbar3['default'];
 
-  exports.ButtonGroup = _ButtonGroup3['default'];
+	var _Carousel2 = __webpack_require__(61);
 
-  var _ButtonInput2 = __webpack_require__(64);
+	var _Carousel3 = _interopRequireDefault(_Carousel2);
 
-  var _ButtonInput3 = _interopRequireDefault(_ButtonInput2);
+	exports.Carousel = _Carousel3['default'];
 
-  exports.ButtonInput = _ButtonInput3['default'];
+	var _CarouselItem2 = __webpack_require__(62);
 
-  var _ButtonToolbar2 = __webpack_require__(70);
+	var _CarouselItem3 = _interopRequireDefault(_CarouselItem2);
 
-  var _ButtonToolbar3 = _interopRequireDefault(_ButtonToolbar2);
+	exports.CarouselItem = _CarouselItem3['default'];
 
-  exports.ButtonToolbar = _ButtonToolbar3['default'];
+	var _Col2 = __webpack_require__(65);
 
-  var _Carousel2 = __webpack_require__(71);
+	var _Col3 = _interopRequireDefault(_Col2);
 
-  var _Carousel3 = _interopRequireDefault(_Carousel2);
+	exports.Col = _Col3['default'];
 
-  exports.Carousel = _Carousel3['default'];
+	var _CollapsibleNav2 = __webpack_require__(66);
 
-  var _CarouselItem2 = __webpack_require__(72);
+	var _CollapsibleNav3 = _interopRequireDefault(_CollapsibleNav2);
 
-  var _CarouselItem3 = _interopRequireDefault(_CarouselItem2);
+	exports.CollapsibleNav = _CollapsibleNav3['default'];
 
-  exports.CarouselItem = _CarouselItem3['default'];
+	var _Dropdown2 = __webpack_require__(82);
 
-  var _Col2 = __webpack_require__(74);
+	var _Dropdown3 = _interopRequireDefault(_Dropdown2);
 
-  var _Col3 = _interopRequireDefault(_Col2);
+	exports.Dropdown = _Dropdown3['default'];
 
-  exports.Col = _Col3['default'];
+	var _DropdownButton2 = __webpack_require__(168);
 
-  var _CollapsibleNav2 = __webpack_require__(79);
+	var _DropdownButton3 = _interopRequireDefault(_DropdownButton2);
 
-  var _CollapsibleNav3 = _interopRequireDefault(_CollapsibleNav2);
+	exports.DropdownButton = _DropdownButton3['default'];
 
-  exports.CollapsibleNav = _CollapsibleNav3['default'];
+	var _Glyphicon2 = __webpack_require__(59);
 
-  var _Dropdown2 = __webpack_require__(92);
+	var _Glyphicon3 = _interopRequireDefault(_Glyphicon2);
 
-  var _Dropdown3 = _interopRequireDefault(_Dropdown2);
+	exports.Glyphicon = _Glyphicon3['default'];
 
-  exports.Dropdown = _Dropdown3['default'];
+	var _Grid2 = __webpack_require__(170);
 
-  var _DropdownButton2 = __webpack_require__(177);
+	var _Grid3 = _interopRequireDefault(_Grid2);
 
-  var _DropdownButton3 = _interopRequireDefault(_DropdownButton2);
+	exports.Grid = _Grid3['default'];
 
-  exports.DropdownButton = _DropdownButton3['default'];
+	var _Image2 = __webpack_require__(171);
 
-  var _Glyphicon2 = __webpack_require__(67);
+	var _Image3 = _interopRequireDefault(_Image2);
 
-  var _Glyphicon3 = _interopRequireDefault(_Glyphicon2);
+	exports.Image = _Image3['default'];
 
-  exports.Glyphicon = _Glyphicon3['default'];
+	var _Input2 = __webpack_require__(172);
 
-  var _Grid2 = __webpack_require__(178);
+	var _Input3 = _interopRequireDefault(_Input2);
 
-  var _Grid3 = _interopRequireDefault(_Grid2);
+	exports.Input = _Input3['default'];
 
-  exports.Grid = _Grid3['default'];
+	var _Interpolate2 = __webpack_require__(175);
 
-  var _Image2 = __webpack_require__(179);
+	var _Interpolate3 = _interopRequireDefault(_Interpolate2);
 
-  var _Image3 = _interopRequireDefault(_Image2);
+	exports.Interpolate = _Interpolate3['default'];
 
-  exports.Image = _Image3['default'];
+	var _Jumbotron2 = __webpack_require__(176);
 
-  var _Input2 = __webpack_require__(180);
+	var _Jumbotron3 = _interopRequireDefault(_Jumbotron2);
 
-  var _Input3 = _interopRequireDefault(_Input2);
+	exports.Jumbotron = _Jumbotron3['default'];
 
-  exports.Input = _Input3['default'];
+	var _Label2 = __webpack_require__(177);
 
-  var _Interpolate2 = __webpack_require__(183);
+	var _Label3 = _interopRequireDefault(_Label2);
 
-  var _Interpolate3 = _interopRequireDefault(_Interpolate2);
+	exports.Label = _Label3['default'];
 
-  exports.Interpolate = _Interpolate3['default'];
+	var _ListGroup2 = __webpack_require__(178);
 
-  var _Jumbotron2 = __webpack_require__(184);
+	var _ListGroup3 = _interopRequireDefault(_ListGroup2);
 
-  var _Jumbotron3 = _interopRequireDefault(_Jumbotron2);
+	exports.ListGroup = _ListGroup3['default'];
 
-  exports.Jumbotron = _Jumbotron3['default'];
+	var _ListGroupItem2 = __webpack_require__(179);
 
-  var _Label2 = __webpack_require__(185);
+	var _ListGroupItem3 = _interopRequireDefault(_ListGroupItem2);
 
-  var _Label3 = _interopRequireDefault(_Label2);
+	exports.ListGroupItem = _ListGroupItem3['default'];
 
-  exports.Label = _Label3['default'];
+	var _MenuItem2 = __webpack_require__(180);
 
-  var _ListGroup2 = __webpack_require__(186);
+	var _MenuItem3 = _interopRequireDefault(_MenuItem2);
 
-  var _ListGroup3 = _interopRequireDefault(_ListGroup2);
+	exports.MenuItem = _MenuItem3['default'];
 
-  exports.ListGroup = _ListGroup3['default'];
+	var _Modal2 = __webpack_require__(181);
 
-  var _ListGroupItem2 = __webpack_require__(187);
+	var _Modal3 = _interopRequireDefault(_Modal2);
 
-  var _ListGroupItem3 = _interopRequireDefault(_ListGroupItem2);
+	exports.Modal = _Modal3['default'];
 
-  exports.ListGroupItem = _ListGroupItem3['default'];
+	var _ModalBody2 = __webpack_require__(188);
 
-  var _MenuItem2 = __webpack_require__(188);
+	var _ModalBody3 = _interopRequireDefault(_ModalBody2);
 
-  var _MenuItem3 = _interopRequireDefault(_MenuItem2);
+	exports.ModalBody = _ModalBody3['default'];
 
-  exports.MenuItem = _MenuItem3['default'];
+	var _ModalFooter2 = __webpack_require__(191);
 
-  var _Modal2 = __webpack_require__(189);
+	var _ModalFooter3 = _interopRequireDefault(_ModalFooter2);
 
-  var _Modal3 = _interopRequireDefault(_Modal2);
+	exports.ModalFooter = _ModalFooter3['default'];
 
-  exports.Modal = _Modal3['default'];
+	var _ModalHeader2 = __webpack_require__(189);
 
-  var _ModalBody2 = __webpack_require__(200);
+	var _ModalHeader3 = _interopRequireDefault(_ModalHeader2);
 
-  var _ModalBody3 = _interopRequireDefault(_ModalBody2);
+	exports.ModalHeader = _ModalHeader3['default'];
 
-  exports.ModalBody = _ModalBody3['default'];
+	var _ModalTitle2 = __webpack_require__(190);
 
-  var _ModalFooter2 = __webpack_require__(203);
+	var _ModalTitle3 = _interopRequireDefault(_ModalTitle2);
 
-  var _ModalFooter3 = _interopRequireDefault(_ModalFooter2);
+	exports.ModalTitle = _ModalTitle3['default'];
 
-  exports.ModalFooter = _ModalFooter3['default'];
+	var _Nav2 = __webpack_require__(207);
 
-  var _ModalHeader2 = __webpack_require__(201);
+	var _Nav3 = _interopRequireDefault(_Nav2);
 
-  var _ModalHeader3 = _interopRequireDefault(_ModalHeader2);
+	exports.Nav = _Nav3['default'];
 
-  exports.ModalHeader = _ModalHeader3['default'];
+	var _Navbar2 = __webpack_require__(208);
 
-  var _ModalTitle2 = __webpack_require__(202);
+	var _Navbar3 = _interopRequireDefault(_Navbar2);
 
-  var _ModalTitle3 = _interopRequireDefault(_ModalTitle2);
+	exports.Navbar = _Navbar3['default'];
 
-  exports.ModalTitle = _ModalTitle3['default'];
+	var _NavBrand2 = __webpack_require__(210);
 
-  var _Nav2 = __webpack_require__(204);
+	var _NavBrand3 = _interopRequireDefault(_NavBrand2);
 
-  var _Nav3 = _interopRequireDefault(_Nav2);
+	exports.NavBrand = _NavBrand3['default'];
 
-  exports.Nav = _Nav3['default'];
+	var _NavbarBrand2 = __webpack_require__(211);
 
-  var _Navbar2 = __webpack_require__(205);
+	var _NavbarBrand3 = _interopRequireDefault(_NavbarBrand2);
 
-  var _Navbar3 = _interopRequireDefault(_Navbar2);
+	exports.NavbarBrand = _NavbarBrand3['default'];
 
-  exports.Navbar = _Navbar3['default'];
+	var _NavDropdown2 = __webpack_require__(215);
 
-  var _NavBrand2 = __webpack_require__(206);
+	var _NavDropdown3 = _interopRequireDefault(_NavDropdown2);
 
-  var _NavBrand3 = _interopRequireDefault(_NavBrand2);
+	exports.NavDropdown = _NavDropdown3['default'];
 
-  exports.NavBrand = _NavBrand3['default'];
+	var _NavItem2 = __webpack_require__(216);
 
-  var _NavDropdown2 = __webpack_require__(207);
+	var _NavItem3 = _interopRequireDefault(_NavItem2);
 
-  var _NavDropdown3 = _interopRequireDefault(_NavDropdown2);
+	exports.NavItem = _NavItem3['default'];
 
-  exports.NavDropdown = _NavDropdown3['default'];
+	var _Overlay2 = __webpack_require__(217);
 
-  var _NavItem2 = __webpack_require__(208);
+	var _Overlay3 = _interopRequireDefault(_Overlay2);
 
-  var _NavItem3 = _interopRequireDefault(_NavItem2);
+	exports.Overlay = _Overlay3['default'];
 
-  exports.NavItem = _NavItem3['default'];
+	var _OverlayTrigger2 = __webpack_require__(226);
 
-  var _Overlay2 = __webpack_require__(209);
+	var _OverlayTrigger3 = _interopRequireDefault(_OverlayTrigger2);
 
-  var _Overlay3 = _interopRequireDefault(_Overlay2);
+	exports.OverlayTrigger = _OverlayTrigger3['default'];
 
-  exports.Overlay = _Overlay3['default'];
+	var _PageHeader2 = __webpack_require__(227);
 
-  var _OverlayTrigger2 = __webpack_require__(218);
+	var _PageHeader3 = _interopRequireDefault(_PageHeader2);
 
-  var _OverlayTrigger3 = _interopRequireDefault(_OverlayTrigger2);
+	exports.PageHeader = _PageHeader3['default'];
 
-  exports.OverlayTrigger = _OverlayTrigger3['default'];
+	var _PageItem2 = __webpack_require__(228);
 
-  var _PageHeader2 = __webpack_require__(221);
+	var _PageItem3 = _interopRequireDefault(_PageItem2);
 
-  var _PageHeader3 = _interopRequireDefault(_PageHeader2);
+	exports.PageItem = _PageItem3['default'];
 
-  exports.PageHeader = _PageHeader3['default'];
+	var _Pager2 = __webpack_require__(229);
 
-  var _PageItem2 = __webpack_require__(222);
+	var _Pager3 = _interopRequireDefault(_Pager2);
 
-  var _PageItem3 = _interopRequireDefault(_PageItem2);
+	exports.Pager = _Pager3['default'];
 
-  exports.PageItem = _PageItem3['default'];
+	var _Pagination2 = __webpack_require__(230);
 
-  var _Pager2 = __webpack_require__(223);
+	var _Pagination3 = _interopRequireDefault(_Pagination2);
 
-  var _Pager3 = _interopRequireDefault(_Pager2);
+	exports.Pagination = _Pagination3['default'];
 
-  exports.Pager = _Pager3['default'];
+	var _Panel2 = __webpack_require__(233);
 
-  var _Pagination2 = __webpack_require__(224);
+	var _Panel3 = _interopRequireDefault(_Panel2);
 
-  var _Pagination3 = _interopRequireDefault(_Pagination2);
+	exports.Panel = _Panel3['default'];
 
-  exports.Pagination = _Pagination3['default'];
+	var _PanelGroup2 = __webpack_require__(35);
 
-  var _Panel2 = __webpack_require__(227);
+	var _PanelGroup3 = _interopRequireDefault(_PanelGroup2);
 
-  var _Panel3 = _interopRequireDefault(_Panel2);
+	exports.PanelGroup = _PanelGroup3['default'];
 
-  exports.Panel = _Panel3['default'];
+	var _Popover2 = __webpack_require__(234);
 
-  var _PanelGroup2 = __webpack_require__(25);
+	var _Popover3 = _interopRequireDefault(_Popover2);
 
-  var _PanelGroup3 = _interopRequireDefault(_PanelGroup2);
+	exports.Popover = _Popover3['default'];
 
-  exports.PanelGroup = _PanelGroup3['default'];
+	var _ProgressBar2 = __webpack_require__(235);
 
-  var _Popover2 = __webpack_require__(228);
+	var _ProgressBar3 = _interopRequireDefault(_ProgressBar2);
 
-  var _Popover3 = _interopRequireDefault(_Popover2);
+	exports.ProgressBar = _ProgressBar3['default'];
 
-  exports.Popover = _Popover3['default'];
+	var _ResponsiveEmbed2 = __webpack_require__(236);
 
-  var _ProgressBar2 = __webpack_require__(229);
+	var _ResponsiveEmbed3 = _interopRequireDefault(_ResponsiveEmbed2);
 
-  var _ProgressBar3 = _interopRequireDefault(_ProgressBar2);
+	exports.ResponsiveEmbed = _ResponsiveEmbed3['default'];
 
-  exports.ProgressBar = _ProgressBar3['default'];
+	var _Row2 = __webpack_require__(237);
 
-  var _ResponsiveEmbed2 = __webpack_require__(230);
+	var _Row3 = _interopRequireDefault(_Row2);
 
-  var _ResponsiveEmbed3 = _interopRequireDefault(_ResponsiveEmbed2);
+	exports.Row = _Row3['default'];
 
-  exports.ResponsiveEmbed = _ResponsiveEmbed3['default'];
+	var _SafeAnchor2 = __webpack_require__(42);
 
-  var _Row2 = __webpack_require__(231);
+	var _SafeAnchor3 = _interopRequireDefault(_SafeAnchor2);
 
-  var _Row3 = _interopRequireDefault(_Row2);
+	exports.SafeAnchor = _SafeAnchor3['default'];
 
-  exports.Row = _Row3['default'];
+	var _SplitButton3 = __webpack_require__(238);
 
-  var _SafeAnchor2 = __webpack_require__(47);
+	var _SplitButton4 = _interopRequireDefault(_SplitButton3);
 
-  var _SafeAnchor3 = _interopRequireDefault(_SafeAnchor2);
+	exports.SplitButton = _SplitButton4['default'];
 
-  exports.SafeAnchor = _SafeAnchor3['default'];
+	var _SplitButton5 = _interopRequireDefault(_SplitButton3);
 
-  var _SplitButton3 = __webpack_require__(232);
+	exports.SplitButton = _SplitButton5['default'];
 
-  var _SplitButton4 = _interopRequireDefault(_SplitButton3);
+	var _Tab2 = __webpack_require__(240);
 
-  exports.SplitButton = _SplitButton4['default'];
+	var _Tab3 = _interopRequireDefault(_Tab2);
 
-  var _SplitButton5 = _interopRequireDefault(_SplitButton3);
+	exports.Tab = _Tab3['default'];
 
-  exports.SplitButton = _SplitButton5['default'];
+	var _Table2 = __webpack_require__(241);
 
-  var _styleMaps2 = __webpack_require__(29);
+	var _Table3 = _interopRequireDefault(_Table2);
 
-  var _styleMaps3 = _interopRequireDefault(_styleMaps2);
+	exports.Table = _Table3['default'];
 
-  exports.styleMaps = _styleMaps3['default'];
+	var _Tabs2 = __webpack_require__(242);
 
-  var _SubNav2 = __webpack_require__(234);
+	var _Tabs3 = _interopRequireDefault(_Tabs2);
 
-  var _SubNav3 = _interopRequireDefault(_SubNav2);
+	exports.Tabs = _Tabs3['default'];
 
-  exports.SubNav = _SubNav3['default'];
+	var _Thumbnail2 = __webpack_require__(243);
 
-  var _Tab2 = __webpack_require__(235);
+	var _Thumbnail3 = _interopRequireDefault(_Thumbnail2);
 
-  var _Tab3 = _interopRequireDefault(_Tab2);
+	exports.Thumbnail = _Thumbnail3['default'];
 
-  exports.Tab = _Tab3['default'];
+	var _Tooltip2 = __webpack_require__(244);
 
-  var _Table2 = __webpack_require__(236);
+	var _Tooltip3 = _interopRequireDefault(_Tooltip2);
 
-  var _Table3 = _interopRequireDefault(_Table2);
+	exports.Tooltip = _Tooltip3['default'];
 
-  exports.Table = _Table3['default'];
+	var _Well2 = __webpack_require__(245);
 
-  var _Tabs2 = __webpack_require__(237);
+	var _Well3 = _interopRequireDefault(_Well2);
 
-  var _Tabs3 = _interopRequireDefault(_Tabs2);
+	exports.Well = _Well3['default'];
 
-  exports.Tabs = _Tabs3['default'];
+	var _Collapse2 = __webpack_require__(67);
 
-  var _Thumbnail2 = __webpack_require__(238);
+	var _Collapse3 = _interopRequireDefault(_Collapse2);
 
-  var _Thumbnail3 = _interopRequireDefault(_Thumbnail2);
+	exports.Collapse = _Collapse3['default'];
 
-  exports.Thumbnail = _Thumbnail3['default'];
+	var _Fade2 = __webpack_require__(186);
 
-  var _Tooltip2 = __webpack_require__(239);
+	var _Fade3 = _interopRequireDefault(_Fade2);
 
-  var _Tooltip3 = _interopRequireDefault(_Tooltip2);
+	exports.Fade = _Fade3['default'];
 
-  exports.Tooltip = _Tooltip3['default'];
+	var _FormControls2 = __webpack_require__(173);
 
-  var _Well2 = __webpack_require__(240);
+	var _FormControls = _interopRequireWildcard(_FormControls2);
 
-  var _Well3 = _interopRequireDefault(_Well2);
-
-  exports.Well = _Well3['default'];
-
-  var _Collapse2 = __webpack_require__(80);
-
-  var _Collapse3 = _interopRequireDefault(_Collapse2);
-
-  exports.Collapse = _Collapse3['default'];
-
-  var _Fade2 = __webpack_require__(198);
-
-  var _Fade3 = _interopRequireDefault(_Fade2);
-
-  exports.Fade = _Fade3['default'];
-
-  var _FormControls2 = __webpack_require__(181);
-
-  var _FormControls = _interopRequireWildcard(_FormControls2);
-
-  exports.FormControls = _FormControls;
-  var utils = {
-    childrenValueInputValidation: _utilsChildrenValueInputValidation2['default'],
-    createChainedFunction: _utilsCreateChainedFunction2['default'],
-    ValidComponentChildren: _utilsValidComponentChildren2['default']
-  };
-  exports.utils = utils;
+	exports.FormControls = _FormControls;
+	var utils = {
+	  bootstrapUtils: _utilsBootstrapUtils2['default'],
+	  childrenValueInputValidation: _utilsChildrenValueInputValidation2['default'],
+	  createChainedFunction: _utilsCreateChainedFunction2['default'],
+	  ValidComponentChildren: _utilsValidComponentChildren2['default']
+	};
+	exports.utils = utils;
 
 /***/ },
 /* 1 */
 /***/ function(module, exports) {
 
-  "use strict";
+	"use strict";
 
-  exports["default"] = function (obj) {
-    return obj && obj.__esModule ? obj : {
-      "default": obj
-    };
-  };
+	exports["default"] = function (obj) {
+	  return obj && obj.__esModule ? obj : {
+	    "default": obj
+	  };
+	};
 
-  exports.__esModule = true;
+	exports.__esModule = true;
 
 /***/ },
 /* 2 */
 /***/ function(module, exports) {
 
-  "use strict";
+	"use strict";
 
-  exports["default"] = function (obj) {
-    if (obj && obj.__esModule) {
-      return obj;
-    } else {
-      var newObj = {};
+	exports["default"] = function (obj) {
+	  if (obj && obj.__esModule) {
+	    return obj;
+	  } else {
+	    var newObj = {};
 
-      if (obj != null) {
-        for (var key in obj) {
-          if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];
-        }
-      }
+	    if (obj != null) {
+	      for (var key in obj) {
+	        if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];
+	      }
+	    }
 
-      newObj["default"] = obj;
-      return newObj;
-    }
-  };
+	    newObj["default"] = obj;
+	    return newObj;
+	  }
+	};
 
-  exports.__esModule = true;
+	exports.__esModule = true;
 
 /***/ },
 /* 3 */
 /***/ function(module, exports, __webpack_require__) {
 
-  'use strict';
+	'use strict';
 
-  var _interopRequireDefault = __webpack_require__(1)['default'];
+	var _interopRequireDefault = __webpack_require__(1)['default'];
 
-  exports.__esModule = true;
-  exports['default'] = valueValidation;
+	exports.__esModule = true;
+	exports['default'] = valueValidation;
 
-  var _react = __webpack_require__(4);
+	var _react = __webpack_require__(4);
 
-  var _react2 = _interopRequireDefault(_react);
+	var _react2 = _interopRequireDefault(_react);
 
-  var _reactPropTypesLibSinglePropFrom = __webpack_require__(5);
+	var _reactPropTypesLibSinglePropFrom = __webpack_require__(5);
 
-  var _reactPropTypesLibSinglePropFrom2 = _interopRequireDefault(_reactPropTypesLibSinglePropFrom);
+	var _reactPropTypesLibSinglePropFrom2 = _interopRequireDefault(_reactPropTypesLibSinglePropFrom);
 
-  function valueValidation(props, propName, componentName) {
-    var error = _reactPropTypesLibSinglePropFrom2['default']('children', 'value')(props, propName, componentName);
+	function valueValidation(props, propName, componentName) {
+	  var error = _reactPropTypesLibSinglePropFrom2['default']('children', 'value')(props, propName, componentName);
 
-    if (!error) {
-      error = _react2['default'].PropTypes.node(props, propName, componentName);
-    }
+	  if (!error) {
+	    error = _react2['default'].PropTypes.node(props, propName, componentName);
+	  }
 
-    return error;
-  }
+	  return error;
+	}
 
-  module.exports = exports['default'];
+	module.exports = exports['default'];
 
 /***/ },
 /* 4 */
 /***/ function(module, exports) {
 
-  module.exports = __WEBPACK_EXTERNAL_MODULE_4__;
+	module.exports = __WEBPACK_EXTERNAL_MODULE_4__;
 
 /***/ },
 /* 5 */
 /***/ function(module, exports) {
 
-  /**
-   * Checks if only one of the listed properties is in use. An error is given
-   * if multiple have a value
-   *
-   * @param props
-   * @param propName
-   * @param componentName
-   * @returns {Error|undefined}
-   */
-  'use strict';
-
-  exports.__esModule = true;
-  exports['default'] = createSinglePropFromChecker;
-
-  function createSinglePropFromChecker() {
-    for (var _len = arguments.length, arrOfProps = Array(_len), _key = 0; _key < _len; _key++) {
-      arrOfProps[_key] = arguments[_key];
-    }
-
-    function validate(props, propName, componentName) {
-      var usedPropCount = arrOfProps.map(function (listedProp) {
-        return props[listedProp];
-      }).reduce(function (acc, curr) {
-        return acc + (curr !== undefined ? 1 : 0);
-      }, 0);
-
-      if (usedPropCount > 1) {
-        var first = arrOfProps[0];
-        var others = arrOfProps.slice(1);
-
-        var message = others.join(', ') + ' and ' + first;
-        return new Error('Invalid prop \'' + propName + '\', only one of the following ' + ('may be provided: ' + message));
-      }
-    }
-    return validate;
-  }
-
-  module.exports = exports['default'];
+	/**
+	 * Checks if only one of the listed properties is in use. An error is given
+	 * if multiple have a value
+	 *
+	 * @param props
+	 * @param propName
+	 * @param componentName
+	 * @returns {Error|undefined}
+	 */
+	'use strict';
+
+	exports.__esModule = true;
+	exports['default'] = createSinglePropFromChecker;
+
+	function createSinglePropFromChecker() {
+	  for (var _len = arguments.length, arrOfProps = Array(_len), _key = 0; _key < _len; _key++) {
+	    arrOfProps[_key] = arguments[_key];
+	  }
+
+	  function validate(props, propName, componentName) {
+	    var usedPropCount = arrOfProps.map(function (listedProp) {
+	      return props[listedProp];
+	    }).reduce(function (acc, curr) {
+	      return acc + (curr !== undefined ? 1 : 0);
+	    }, 0);
+
+	    if (usedPropCount > 1) {
+	      var first = arrOfProps[0];
+	      var others = arrOfProps.slice(1);
+
+	      var message = others.join(', ') + ' and ' + first;
+	      return new Error('Invalid prop \'' + propName + '\', only one of the following ' + ('may be provided: ' + message));
+	    }
+	  }
+	  return validate;
+	}
+
+	module.exports = exports['default'];
 
 /***/ },
 /* 6 */
 /***/ function(module, exports) {
 
-  /**
-   * Safe chained function
-   *
-   * Will only create a new function if needed,
-   * otherwise will pass back existing functions or null.
-   *
-   * @param {function} functions to chain
-   * @returns {function|null}
-   */
-  'use strict';
-
-  exports.__esModule = true;
-  function createChainedFunction() {
-    for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
-      funcs[_key] = arguments[_key];
-    }
-
-    return funcs.filter(function (f) {
-      return f != null;
-    }).reduce(function (acc, f) {
-      if (typeof f !== 'function') {
-        throw new Error('Invalid Argument Type, must only provide functions, undefined, or null.');
-      }
-
-      if (acc === null) {
-        return f;
-      }
-
-      return function chainedFunction() {
-        for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
-          args[_key2] = arguments[_key2];
-        }
-
-        acc.apply(this, args);
-        f.apply(this, args);
-      };
-    }, null);
-  }
-
-  exports['default'] = createChainedFunction;
-  module.exports = exports['default'];
+	/**
+	 * Safe chained function
+	 *
+	 * Will only create a new function if needed,
+	 * otherwise will pass back existing functions or null.
+	 *
+	 * @param {function} functions to chain
+	 * @returns {function|null}
+	 */
+	'use strict';
+
+	exports.__esModule = true;
+	function createChainedFunction() {
+	  for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
+	    funcs[_key] = arguments[_key];
+	  }
+
+	  return funcs.filter(function (f) {
+	    return f != null;
+	  }).reduce(function (acc, f) {
+	    if (typeof f !== 'function') {
+	      throw new Error('Invalid Argument Type, must only provide functions, undefined, or null.');
+	    }
+
+	    if (acc === null) {
+	      return f;
+	    }
+
+	    return function chainedFunction() {
+	      for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+	        args[_key2] = arguments[_key2];
+	      }
+
+	      acc.apply(this, args);
+	      f.apply(this, args);
+	    };
+	  }, null);
+	}
+
+	exports['default'] = createChainedFunction;
+	module.exports = exports['default'];
 
 /***/ },
 /* 7 */
 /***/ function(module, exports, __webpack_require__) {
 
-  'use strict';
-
-  var _interopRequireDefault = __webpack_require__(1)['default'];
-
-  exports.__esModule = true;
-
-  var _react = __webpack_require__(4);
-
-  var _react2 = _interopRequireDefault(_react);
-
-  /**
-   * Maps children that are typically specified as `props.children`,
-   * but only iterates over children that are "valid components".
-   *
-   * The mapFunction provided index will be normalised to the components mapped,
-   * so an invalid component would not increase the index.
-   *
-   * @param {?*} children Children tree container.
-   * @param {function(*, int)} mapFunction.
-   * @param {*} mapContext Context for mapFunction.
-   * @return {object} Object containing the ordered map of results.
-   */
-  function mapValidComponents(children, func, context) {
-    var index = 0;
-
-    return _react2['default'].Children.map(children, function (child) {
-      if (_react2['default'].isValidElement(child)) {
-        var lastIndex = index;
-        index++;
-        return func.call(context, child, lastIndex);
-      }
-
-      return child;
-    });
-  }
-
-  /**
-   * Iterates through children that are typically specified as `props.children`,
-   * but only iterates over children that are "valid components".
-   *
-   * The provided forEachFunc(child, index) will be called for each
-   * leaf child with the index reflecting the position relative to "valid components".
-   *
-   * @param {?*} children Children tree container.
-   * @param {function(*, int)} forEachFunc.
-   * @param {*} forEachContext Context for forEachContext.
-   */
-  function forEachValidComponents(children, func, context) {
-    var index = 0;
-
-    return _react2['default'].Children.forEach(children, function (child) {
-      if (_react2['default'].isValidElement(child)) {
-        func.call(context, child, index);
-        index++;
-      }
-    });
-  }
-
-  /**
-   * Count the number of "valid components" in the Children container.
-   *
-   * @param {?*} children Children tree container.
-   * @returns {number}
-   */
-  function numberOfValidComponents(children) {
-    var count = 0;
-
-    _react2['default'].Children.forEach(children, function (child) {
-      if (_react2['default'].isValidElement(child)) {
-        count++;
-      }
-    });
-
-    return count;
-  }
-
-  /**
-   * Determine if the Child container has one or more "valid components".
-   *
-   * @param {?*} children Children tree container.
-   * @returns {boolean}
-   */
-  function hasValidComponent(children) {
-    var hasValid = false;
-
-    _react2['default'].Children.forEach(children, function (child) {
-      if (!hasValid && _react2['default'].isValidElement(child)) {
-        hasValid = true;
-      }
-    });
-
-    return hasValid;
-  }
-
-  function find(children, finder) {
-    var child = undefined;
-
-    forEachValidComponents(children, function (c, idx) {
-      if (!child && finder(c, idx, children)) {
-        child = c;
-      }
-    });
-
-    return child;
-  }
-
-  /**
-   * Finds children that are typically specified as `props.children`,
-   * but only iterates over children that are "valid components".
-   *
-   * The provided forEachFunc(child, index) will be called for each
-   * leaf child with the index reflecting the position relative to "valid components".
-   *
-   * @param {?*} children Children tree container.
-   * @param {function(*, int)} findFunc.
-   * @param {*} findContext Context for findContext.
-   * @returns {array} of children that meet the findFunc return statement
-   */
-  function findValidComponents(children, func, context) {
-    var index = 0;
-    var returnChildren = [];
-
-    _react2['default'].Children.forEach(children, function (child) {
-      if (_react2['default'].isValidElement(child)) {
-        if (func.call(context, child, index)) {
-          returnChildren.push(child);
-        }
-        index++;
-      }
-    });
-
-    return returnChildren;
-  }
-
-  exports['default'] = {
-    map: mapValidComponents,
-    forEach: forEachValidComponents,
-    numberOf: numberOfValidComponents,
-    find: find,
-    findValidComponents: findValidComponents,
-    hasValidComponent: hasValidComponent
-  };
-  module.exports = exports['default'];
+	'use strict';
+
+	var _interopRequireDefault = __webpack_require__(1)['default'];
+
+	exports.__esModule = true;
+
+	var _react = __webpack_require__(4);
+
+	var _react2 = _interopRequireDefault(_react);
+
+	/**
+	 * Maps children that are typically specified as `props.children`,
+	 * but only iterates over children that are "valid components".
+	 *
+	 * The mapFunction provided index will be normalised to the components mapped,
+	 * so an invalid component would not increase the index.
+	 *
+	 * @param {?*} children Children tree container.
+	 * @param {function(*, int)} mapFunction.
+	 * @param {*} mapContext Context for mapFunction.
+	 * @return {object} Object containing the ordered map of results.
+	 */
+	function mapValidComponents(children, func, context) {
+	  var index = 0;
+
+	  return _react2['default'].Children.map(children, function (child) {
+	    if (_react2['default'].isValidElement(child)) {
+	      var lastIndex = index;
+	      index++;
+	      return func.call(context, child, lastIndex);
+	    }
+
+	    return child;
+	  });
+	}
+
+	/**
+	 * Iterates through children that are typically specified as `props.children`,
+	 * but only iterates over children that are "valid components".
+	 *
+	 * The provided forEachFunc(child, index) will be called for each
+	 * leaf child with the index reflecting the position relative to "valid components".
+	 *
+	 * @param {?*} children Children tree container.
+	 * @param {function(*, int)} forEachFunc.
+	 * @param {*} forEachContext Context for forEachContext.
+	 */
+	function forEachValidComponents(children, func, context) {
+	  var index = 0;
+
+	  return _react2['default'].Children.forEach(children, function (child) {
+	    if (_react2['default'].isValidElement(child)) {
+	      func.call(context, child, index);
+	      index++;
+	    }
+	  });
+	}
+
+	/**
+	 * Count the number of "valid components" in the Children container.
+	 *
+	 * @param {?*} children Children tree container.
+	 * @returns {number}
+	 */
+	function numberOfValidComponents(children) {
+	  var count = 0;
+
+	  _react2['default'].Children.forEach(children, function (child) {
+	    if (_react2['default'].isValidElement(child)) {
+	      count++;
+	    }
+	  });
+
+	  return count;
+	}
+
+	/**
+	 * Determine if the Child container has one or more "valid components".
+	 *
+	 * @param {?*} children Children tree container.
+	 * @returns {boolean}
+	 */
+	function hasValidComponent(children) {
+	  var hasValid = false;
+
+	  _react2['default'].Children.forEach(children, function (child) {
+	    if (!hasValid && _react2['default'].isValidElement(child)) {
+	      hasValid = true;
+	    }
+	  });
+
+	  return hasValid;
+	}
+
+	function find(children, finder) {
+	  var child = undefined;
+
+	  forEachValidComponents(children, function (c, idx) {
+	    if (!child && finder(c, idx, children)) {
+	      child = c;
+	    }
+	  });
+
+	  return child;
+	}
+
+	/**
+	 * Finds children that are typically specified as `props.children`,
+	 * but only iterates over children that are "valid components".
+	 *
+	 * The provided forEachFunc(child, index) will be called for each
+	 * leaf child with the index reflecting the position relative to "valid components".
+	 *
+	 * @param {?*} children Children tree container.
+	 * @param {function(*, int)} findFunc.
+	 * @param {*} findContext Context for findContext.
+	 * @returns {array} of children that meet the findFunc return statement
+	 */
+	function findValidComponents(children, func, context) {
+	  var index = 0;
+	  var returnChildren = [];
+
+	  _react2['default'].Children.forEach(children, function (child) {
+	    if (_react2['default'].isValidElement(child)) {
+	      if (func.call(context, child, index)) {
+	        returnChildren.push(child);
+	      }
+	      index++;
+	    }
+	  });
+
+	  return returnChildren;
+	}
+
+	exports['default'] = {
+	  map: mapValidComponents,
+	  forEach: forEachValidComponents,
+	  numberOf: numberOfValidComponents,
+	  find: find,
+	  findValidComponents: findValidComponents,
+	  hasValidComponent: hasValidComponent
+	};
+	module.exports = exports['default'];
 
 /***/ },
 /* 8 */
 /***/ function(module, exports, __webpack_require__) {
 
-  'use strict';
+	'use strict';
+
+	var _extends = __webpack_require__(9)['default'];
+
+	var _interopRequireDefault = __webpack_require__(1)['default'];
+
+	exports.__esModule = true;
+
+	var _react = __webpack_require__(4);
+
+	var _styleMaps = __webpack_require__(25);
+
+	var _styleMaps2 = _interopRequireDefault(_styleMaps);
 
-  var _extends = __webpack_require__(9)['default'];
+	var _invariant = __webpack_require__(32);
 
-  var _interopRequireDefault = __webpack_require__(1)['default'];
+	var _invariant2 = _interopRequireDefault(_invariant);
 
-  exports.__esModule = true;
+	var _warning = __webpack_require__(33);
 
-  var _react = __webpack_require__(4);
+	var _warning2 = _interopRequireDefault(_warning);
 
-  var _react2 = _interopRequireDefault(_react);
+	function curry(fn) {
+	  return function () {
+	    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+	      args[_key] = arguments[_key];
+	    }
 
-  var _PanelGroup = __webpack_require__(25);
+	    var last = args[args.length - 1];
+	    if (typeof last === 'function') {
+	      return fn.apply(undefined, args);
+	    }
+	    return function (Component) {
+	      return fn.apply(undefined, args.concat([Component]));
+	    };
+	  };
+	}
 
-  var _PanelGroup2 = _interopRequireDefault(_PanelGroup);
+	function prefix(props, variant) {
+	  if (props === undefined) props = {};
 
-  var Accordion = _react2['default'].createClass({
-    displayName: 'Accordion',
+	  !(props.bsClass || '').trim() ?  true ? _invariant2['default'](false, 'A `bsClass` prop is required for this component') : _invariant2['default'](false) : undefined;
+	  return props.bsClass + (variant ? '-' + variant : '');
+	}
 
-    render: function render() {
-      return _react2['default'].createElement(
-        _PanelGroup2['default'],
-        _extends({}, this.props, { accordion: true }),
-        this.props.children
-      );
-    }
-  });
+	var bsClass = curry(function (defaultClass, Component) {
+	  var propTypes = Component.propTypes || (Component.propTypes = {});
+	  var defaultProps = Component.defaultProps || (Component.defaultProps = {});
 
-  exports['default'] = Accordion;
-  module.exports = exports['default'];
+	  propTypes.bsClass = _react.PropTypes.string;
+	  defaultProps.bsClass = defaultClass;
+
+	  return Component;
+	});
+
+	exports.bsClass = bsClass;
+	var bsStyles = curry(function (styles, defaultStyle, Component) {
+	  if (typeof defaultStyle !== 'string') {
+	    Component = defaultStyle;
+	    defaultStyle = undefined;
+	  }
+
+	  var existing = Component.STYLES || [];
+	  var propTypes = Component.propTypes || {};
+
+	  styles.forEach(function (style) {
+	    if (existing.indexOf(style) === -1) {
+	      existing.push(style);
+	    }
+	  });
+
+	  var propType = _react.PropTypes.oneOf(existing);
+
+	  // expose the values on the propType function for documentation
+	  Component.STYLES = propType._values = existing;
+
+	  Component.propTypes = _extends({}, propTypes, {
+	    bsStyle: propType
+	  });
+
+	  if (defaultStyle !== undefined) {
+	    var defaultProps = Component.defaultProps || (Component.defaultProps = {});
+	    defaultProps.bsStyle = defaultStyle;
+	  }
+
+	  return Component;
+	});
+
+	exports.bsStyles = bsStyles;
+	var bsSizes = curry(function (sizes, defaultSize, Component) {
+	  if (typeof defaultSize !== 'string') {
+	    Component = defaultSize;
+	    defaultSize = undefined;
+	  }
+
+	  var existing = Component.SIZES || [];
+	  var propTypes = Component.propTypes || {};
+
+	  sizes.forEach(function (size) {
+	    if (existing.indexOf(size) === -1) {
+	      existing.push(size);
+	    }
+	  });
+
+	  var values = existing.reduce(function (result, size) {
+	    if (_styleMaps2['default'].SIZES[size] && _styleMaps2['default'].SIZES[size] !== size) {
+	      result.push(_styleMaps2['default'].SIZES[size]);
+	    }
+	    return result.concat(size);
+	  }, []);
+
+	  var propType = _react.PropTypes.oneOf(values);
+
+	  propType._values = values;
+
+	  // expose the values on the propType function for documentation
+	  Component.SIZES = existing;
+
+	  Component.propTypes = _extends({}, propTypes, {
+	    bsSize: propType
+	  });
+
+	  if (defaultSize !== undefined) {
+	    var defaultProps = Component.defaultProps || (Component.defaultProps = {});
+	    defaultProps.bsSize = defaultSize;
+	  }
+
+	  return Component;
+	});
+
+	exports.bsSizes = bsSizes;
+	exports['default'] = {
+
+	  prefix: prefix,
+
+	  getClassSet: function getClassSet(props) {
+	    var classes = {};
+	    var bsClassName = prefix(props);
+
+	    if (bsClassName) {
+	      var bsSize = undefined;
+
+	      classes[bsClassName] = true;
+
+	      if (props.bsSize) {
+	        bsSize = _styleMaps2['default'].SIZES[props.bsSize] || bsSize;
+	      }
+
+	      if (bsSize) {
+	        classes[prefix(props, bsSize)] = true;
+	      }
+
+	      if (props.bsStyle) {
+	        if (props.bsStyle.indexOf(prefix(props)) === 0) {
+	           true ? _warning2['default'](false, // small migration convenience, since the old method required manual prefixing
+	          'bsStyle will automatically prefix custom values with the bsClass, so there is no ' + 'need to append it manually. (bsStyle: ' + props.bsStyle + ', bsClass: ' + prefix(props) + ')') : undefined;
+	          classes[props.bsStyle] = true;
+	        } else {
+	          classes[prefix(props, props.bsStyle)] = true;
+	        }
+	      }
+	    }
+
+	    return classes;
+	  },
+
+	  /**
+	   * Add a style variant to a Component. Mutates the propTypes of the component
+	   * in order to validate the new variant.
+	   */
+	  addStyle: function addStyle(Component, styleVariant) {
+	    bsStyles(styleVariant, Component);
+	  }
+	};
+	var _curry = curry;
+	exports._curry = _curry;
 
 /***/ },
 /* 9 */
 /***/ function(module, exports, __webpack_require__) {
 
-  "use strict";
+	"use strict";
 
-  var _Object$assign = __webpack_require__(10)["default"];
+	var _Object$assign = __webpack_require__(10)["default"];
 
-  exports["default"] = _Object$assign || function (target) {
-    for (var i = 1; i < arguments.length; i++) {
-      var source = arguments[i];
+	exports["default"] = _Object$assign || function (target) {
+	  for (var i = 1; i < arguments.length; i++) {
+	    var source = arguments[i];
 
-      for (var key in source) {
-        if (Object.prototype.hasOwnProperty.call(source, key)) {
-          target[key] = source[key];
-        }
-      }
-    }
+	    for (var key in source) {
+	      if (Object.prototype.hasOwnProperty.call(source, key)) {
+	        target[key] = source[key];
+	      }
+	    }
+	  }
 
-    return target;
-  };
+	  return target;
+	};
 
-  exports.__esModule = true;
+	exports.__esModule = true;
 
 /***/ },
 /* 10 */
 /***/ function(module, exports, __webpack_require__) {
 
-  module.exports = { "default": __webpack_require__(11), __esModule: true };
+	module.exports = { "default": __webpack_require__(11), __esModule: true };
 
 /***/ },
 /* 11 */
 /***/ function(module, exports, __webpack_require__) {
 
-  __webpack_require__(12);
-  module.exports = __webpack_require__(15).Object.assign;
+	__webpack_require__(12);
+	module.exports = __webpack_require__(15).Object.assign;
 
 /***/ },
 /* 12 */
 /***/ function(module, exports, __webpack_require__) {
 
-  // 19.1.3.1 Object.assign(target, source)
-  var $def = __webpack_require__(13);
+	// 19.1.3.1 Object.assign(target, source)
+	var $export = __webpack_require__(13);
 
-  $def($def.S + $def.F, 'Object', {assign: __webpack_require__(16)});
+	$export($export.S + $export.F, 'Object', {assign: __webpack_require__(18)});
 
 /***/ },
 /* 13 */
 /***/ function(module, exports, __webpack_require__) {
 
-  var global    = __webpack_require__(14)
-    , core      = __webpack_require__(15)
-    , PROTOTYPE = 'prototype';
-  var ctx = function(fn, that){
-    return function(){
-      return fn.apply(that, arguments);
-    };
-  };
-  var $def = function(type, name, source){
-    var key, own, out, exp
-      , isGlobal = type & $def.G
-      , isProto  = type & $def.P
-      , target   = isGlobal ? global : type & $def.S
-          ? global[name] : (global[name] || {})[PROTOTYPE]
-      , exports  = isGlobal ? core : core[name] || (core[name] = {});
-    if(isGlobal)source = name;
-    for(key in source){
-      // contains in native
-      own = !(type & $def.F) && target && key in target;
-      if(own && key in exports)continue;
-      // export native or passed
-      out = own ? target[key] : source[key];
-      // prevent global pollution for namespaces
-      if(isGlobal && typeof target[key] != 'function')exp = source[key];
-      // bind timers to global for call from export context
-      else if(type & $def.B && own)exp = ctx(out, global);
-      // wrap global constructors for prevent change them in library
-      else if(type & $def.W && target[key] == out)!function(C){
-        exp = function(param){
-          return this instanceof C ? new C(param) : C(param);
-        };
-        exp[PROTOTYPE] = C[PROTOTYPE];
-      }(out);
-      else exp = isProto && typeof out == 'function' ? ctx(Function.call, out) : out;
-      // export
-      exports[key] = exp;
-      if(isProto)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out;
-    }
-  };
-  // type bitmap
-  $def.F = 1;  // forced
-  $def.G = 2;  // global
-  $def.S = 4;  // static
-  $def.P = 8;  // proto
-  $def.B = 16; // bind
-  $def.W = 32; // wrap
-  module.exports = $def;
+	var global    = __webpack_require__(14)
+	  , core      = __webpack_require__(15)
+	  , ctx       = __webpack_require__(16)
+	  , PROTOTYPE = 'prototype';
+
+	var $export = function(type, name, source){
+	  var IS_FORCED = type & $export.F
+	    , IS_GLOBAL = type & $export.G
+	    , IS_STATIC = type & $export.S
+	    , IS_PROTO  = type & $export.P
+	    , IS_BIND   = type & $export.B
+	    , IS_WRAP   = type & $export.W
+	    , exports   = IS_GLOBAL ? core : core[name] || (core[name] = {})
+	    , target    = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]
+	    , key, own, out;
+	  if(IS_GLOBAL)source = name;
+	  for(key in source){
+	    // contains in native
+	    own = !IS_FORCED && target && key in target;
+	    if(own && key in exports)continue;
+	    // export native or passed
+	    out = own ? target[key] : source[key];
+	    // prevent global pollution for namespaces
+	    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
+	    // bind timers to global for call from export context
+	    : IS_BIND && own ? ctx(out, global)
+	    // wrap global constructors for prevent change them in library
+	    : IS_WRAP && target[key] == out ? (function(C){
+	      var F = function(param){
+	        return this instanceof C ? new C(param) : C(param);
+	      };
+	      F[PROTOTYPE] = C[PROTOTYPE];
+	      return F;
+	    // make static versions for prototype methods
+	    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+	    if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out;
+	  }
+	};
+	// type bitmap
+	$export.F = 1;  // forced
+	$export.G = 2;  // global
+	$export.S = 4;  // static
+	$export.P = 8;  // proto
+	$export.B = 16; // bind
+	$export.W = 32; // wrap
+	module.exports = $export;
 
 /***/ },
 /* 14 */
 /***/ function(module, exports) {
 
-  // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
-  var UNDEFINED = 'undefined';
-  var global = module.exports = typeof window != UNDEFINED && window.Math == Math
-    ? window : typeof self != UNDEFINED && self.Math == Math ? self : Function('return this')();
-  if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
+	// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+	var global = module.exports = typeof window != 'undefined' && window.Math == Math
+	  ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
+	if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
 
 /***/ },
 /* 15 */
 /***/ function(module, exports) {
 
-  var core = module.exports = {version: '1.2.1'};
-  if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
+	var core = module.exports = {version: '1.2.6'};
+	if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
 
 /***/ },
 /* 16 */
 /***/ function(module, exports, __webpack_require__) {
 
-  // 19.1.2.1 Object.assign(target, source, ...)
-  var toObject = __webpack_require__(17)
-    , IObject  = __webpack_require__(19)
-    , enumKeys = __webpack_require__(21)
-    , has      = __webpack_require__(23);
-
-  // should work with symbols and should have deterministic property order (V8 bug)
-  module.exports = __webpack_require__(24)(function(){
-    var a = Object.assign
-      , A = {}
-      , B = {}
-      , S = Symbol()
-      , K = 'abcdefghijklmnopqrst';
-    A[S] = 7;
-    K.split('').forEach(function(k){ B[k] = k; });
-    return a({}, A)[S] != 7 || Object.keys(a({}, B)).join('') != K;
-  }) ? function assign(target, source){   // eslint-disable-line no-unused-vars
-    var T = toObject(target)
-      , l = arguments.length
-      , i = 1;
-    while(l > i){
-      var S      = IObject(arguments[i++])
-        , keys   = enumKeys(S)
-        , length = keys.length
-        , j      = 0
-        , key;
-      while(length > j)if(has(S, key = keys[j++]))T[key] = S[key];
-    }
-    return T;
-  } : Object.assign;
+	// optional / simple context binding
+	var aFunction = __webpack_require__(17);
+	module.exports = function(fn, that, length){
+	  aFunction(fn);
+	  if(that === undefined)return fn;
+	  switch(length){
+	    case 1: return function(a){
+	      return fn.call(that, a);
+	    };
+	    case 2: return function(a, b){
+	      return fn.call(that, a, b);
+	    };
+	    case 3: return function(a, b, c){
+	      return fn.call(that, a, b, c);
+	    };
+	  }
+	  return function(/* ...args */){
+	    return fn.apply(that, arguments);
+	  };
+	};
 
 /***/ },
 /* 17 */
-/***/ function(module, exports, __webpack_require__) {
+/***/ function(module, exports) {
 
-  // 7.1.13 ToObject(argument)
-  var defined = __webpack_require__(18);
-  module.exports = function(it){
-    return Object(defined(it));
-  };
+	module.exports = function(it){
+	  if(typeof it != 'function')throw TypeError(it + ' is not a function!');
+	  return it;
+	};
 
 /***/ },
 /* 18 */
-/***/ function(module, exports) {
+/***/ function(module, exports, __webpack_require__) {
 
-  // 7.2.1 RequireObjectCoercible(argument)
-  module.exports = function(it){
-    if(it == undefined)throw TypeError("Can't call method on  " + it);
-    return it;
-  };
+	// 19.1.2.1 Object.assign(target, source, ...)
+	var $        = __webpack_require__(19)
+	  , toObject = __webpack_require__(20)
+	  , IObject  = __webpack_require__(22);
+
+	// should work with symbols and should have deterministic property order (V8 bug)
+	module.exports = __webpack_require__(24)(function(){
+	  var a = Object.assign
+	    , A = {}
+	    , B = {}
+	    , S = Symbol()
+	    , K = 'abcdefghijklmnopqrst';
+	  A[S] = 7;
+	  K.split('').forEach(function(k){ B[k] = k; });
+	  return a({}, A)[S] != 7 || Object.keys(a({}, B)).join('') != K;
+	}) ? function assign(target, source){ // eslint-disable-line no-unused-vars
+	  var T     = toObject(target)
+	    , $$    = arguments
+	    , $$len = $$.length
+	    , index = 1
+	    , getKeys    = $.getKeys
+	    , getSymbols = $.getSymbols
+	    , isEnum     = $.isEnum;
+	  while($$len > index){
+	    var S      = IObject($$[index++])
+	      , keys   = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S)
+	      , length = keys.length
+	      , j      = 0
+	      , key;
+	    while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key];
+	  }
+	  return T;
+	} : Object.assign;
 
 /***/ },
 /* 19 */
-/***/ function(module, exports, __webpack_require__) {
+/***/ function(module, exports) {
 
-  // indexed object, fallback for non-array-like ES3 strings
-  var cof = __webpack_require__(20);
-  module.exports = 0 in Object('z') ? Object : function(it){
-    return cof(it) == 'String' ? it.split('') : Object(it);
-  };
+	var $Object = Object;
+	module.exports = {
+	  create:     $Object.create,
+	  getProto:   $Object.getPrototypeOf,
+	  isEnum:     {}.propertyIsEnumerable,
+	  getDesc:    $Object.getOwnPropertyDescriptor,
+	  setDesc:    $Object.defineProperty,
+	  setDescs:   $Object.defineProperties,
+	  getKeys:    $Object.keys,
+	  getNames:   $Object.getOwnPropertyNames,
+	  getSymbols: $Object.getOwnPropertySymbols,
+	  each:       [].forEach
+	};
 
 /***/ },
 /* 20 */
-/***/ function(module, exports) {
-
-  var toString = {}.toString;
+/***/ function(module, exports, __webpack_require__) {
 
-  module.exports = function(it){
-    return toString.call(it).slice(8, -1);
-  };
+	// 7.1.13 ToObject(argument)
+	var defined = __webpack_require__(21);
+	module.exports = function(it){
+	  return Object(defined(it));
+	};
 
 /***/ },
 /* 21 */
-/***/ function(module, exports, __webpack_require__) {
+/***/ function(module, exports) {
 
-  // all enumerable object keys, includes symbols
-  var $ = __webpack_require__(22);
-  module.exports = function(it){
-    var keys       = $.getKeys(it)
-      , getSymbols = $.getSymbols;
-    if(getSymbols){
-      var symbols = getSymbols(it)
-        , isEnum  = $.isEnum
-        , i       = 0
-        , key;
-      while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))keys.push(key);
-    }
-    return keys;
-  };
+	// 7.2.1 RequireObjectCoercible(argument)
+	module.exports = function(it){
+	  if(it == undefined)throw TypeError("Can't call method on  " + it);
+	  return it;
+	};
 
 /***/ },
 /* 22 */
-/***/ function(module, exports) {
+/***/ function(module, exports, __webpack_require__) {
 
-  var $Object = Object;
-  module.exports = {
-    create:     $Object.create,
-    getProto:   $Object.getPrototypeOf,
-    isEnum:     {}.propertyIsEnumerable,
-    getDesc:    $Object.getOwnPropertyDescriptor,
-    setDesc:    $Object.defineProperty,
-    setDescs:   $Object.defineProperties,
-    getKeys:    $Object.keys,
-    getNames:   $Object.getOwnPropertyNames,
-    getSymbols: $Object.getOwnPropertySymbols,
-    each:       [].forEach
-  };
+	// fallback for non-array-like ES3 and non-enumerable old V8 strings
+	var cof = __webpack_require__(23);
+	module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){
+	  return cof(it) == 'String' ? it.split('') : Object(it);
+	};
 
 /***/ },
 /* 23 */
 /***/ function(module, exports) {
 
-  var hasOwnProperty = {}.hasOwnProperty;
-  module.exports = function(it, key){
-    return hasOwnProperty.call(it, key);
-  };
+	var toString = {}.toString;
+
+	module.exports = function(it){
+	  return toString.call(it).slice(8, -1);
+	};
 
 /***/ },
 /* 24 */
 /***/ function(module, exports) {
 
-  module.exports = function(exec){
-    try {
-      return !!exec();
-    } catch(e){
-      return true;
-    }
-  };
+	module.exports = function(exec){
+	  try {
+	    return !!exec();
+	  } catch(e){
+	    return true;
+	  }
+	};
 
 /***/ },
 /* 25 */
 /***/ function(module, exports, __webpack_require__) {
 
-  /* eslint react/prop-types: [2, {ignore: "bsStyle"}] */
-  /* BootstrapMixin contains `bsStyle` type validation */
-
-  'use strict';
-
-  var _objectWithoutProperties = __webpack_require__(26)['default'];
-
-  var _extends = __webpack_require__(9)['default'];
-
-  var _interopRequireDefault = __webpack_require__(1)['default'];
+	'use strict';
+
+	var _Object$assign = __webpack_require__(10)['default'];
+
+	var _Object$create = __webpack_require__(26)['default'];
+
+	var _Object$keys = __webpack_require__(28)['default'];
+
+	exports.__esModule = true;
+
+	var constant = function constant(obj) {
+	  return _Object$assign(_Object$create({
+	    values: function values() {
+	      var _this = this;
+
+	      return _Object$keys(this).map(function (k) {
+	        return _this[k];
+	      });
+	    }
+	  }), obj);
+	};
+
+	var styleMaps = {
+
+	  SIZES: {
+	    'large': 'lg',
+	    'medium': 'md',
+	    'small': 'sm',
+	    'xsmall': 'xs',
+	    'lg': 'lg',
+	    'md': 'md',
+	    'sm': 'sm',
+	    'xs': 'xs'
+	  },
+	  GRID_COLUMNS: 12
+	};
+
+	var Sizes = constant({
+	  LARGE: 'large',
+	  MEDIUM: 'medium',
+	  SMALL: 'small',
+	  XSMALL: 'xsmall'
+	});
+
+	exports.Sizes = Sizes;
+	var State = constant({
+	  SUCCESS: 'success',
+	  WARNING: 'warning',
+	  DANGER: 'danger',
+	  INFO: 'info'
+	});
+
+	exports.State = State;
+	var DEFAULT = 'default';
+	exports.DEFAULT = DEFAULT;
+	var PRIMARY = 'primary';
+	exports.PRIMARY = PRIMARY;
+	var LINK = 'link';
+	exports.LINK = LINK;
+	var INVERSE = 'inverse';
+
+	exports.INVERSE = INVERSE;
+	exports['default'] = styleMaps;
 
-  exports.__esModule = true;
-
-  var _react = __webpack_require__(4);
-
-  var _react2 = _interopRequireDefault(_react);
-
-  var _classnames = __webpack_require__(27);
+/***/ },
+/* 26 */
+/***/ function(module, exports, __webpack_require__) {
 
-  var _classnames2 = _interopRequireDefault(_classnames);
+	module.exports = { "default": __webpack_require__(27), __esModule: true };
 
-  var _BootstrapMixin = __webpack_require__(28);
+/***/ },
+/* 27 */
+/***/ function(module, exports, __webpack_require__) {
 
-  var _BootstrapMixin2 = _interopRequireDefault(_BootstrapMixin);
+	var $ = __webpack_require__(19);
+	module.exports = function create(P, D){
+	  return $.create(P, D);
+	};
 
-  var _utilsValidComponentChildren = __webpack_require__(7);
+/***/ },
+/* 28 */
+/***/ function(module, exports, __webpack_require__) {
 
-  var _utilsValidComponentChildren2 = _interopRequireDefault(_utilsValidComponentChildren);
+	module.exports = { "default": __webpack_require__(29), __esModule: true };
 
-  var PanelGroup = _react2['default'].createClass({
-    displayName: 'PanelGroup',
+/***/ },
+/* 29 */
+/***/ function(module, exports, __webpack_require__) {
 
-    mixins: [_BootstrapMixin2['default']],
+	__webpack_require__(30);
+	module.exports = __webpack_require__(15).Object.keys;
 
-    propTypes: {
-      accordion: _react2['default'].PropTypes.bool,
-      activeKey: _react2['default'].PropTypes.any,
-      className: _react2['default'].PropTypes.string,
-      children: _react2['default'].PropTypes.node,
-      defaultActiveKey: _react2['default'].PropTypes.any,
-      onSelect: _react2['default'].PropTypes.func
-    },
+/***/ },
+/* 30 */
+/***/ function(module, exports, __webpack_require__) {
 
-    getDefaultProps: function getDefaultProps() {
-      return {
-        accordion: false,
-        bsClass: 'panel-group'
-      };
-    },
+	// 19.1.2.14 Object.keys(O)
+	var toObject = __webpack_require__(20);
 
-    getInitialState: function getInitialState() {
-      var defaultActiveKey = this.props.defaultActiveKey;
+	__webpack_require__(31)('keys', function($keys){
+	  return function keys(it){
+	    return $keys(toObject(it));
+	  };
+	});
 
-      return {
-        activeKey: defaultActiveKey
-      };
-    },
+/***/ },
+/* 31 */
+/***/ function(module, exports, __webpack_require__) {
 
-    render: function render() {
-      var classes = this.getBsClassSet();
-      var _props = this.props;
-      var className = _props.className;
+	// most Object methods by ES6 should accept primitives
+	var $export = __webpack_require__(13)
+	  , core    = __webpack_require__(15)
+	  , fails   = __webpack_require__(24);
+	module.exports = function(KEY, exec){
+	  var fn  = (core.Object || {})[KEY] || Object[KEY]
+	    , exp = {};
+	  exp[KEY] = exec(fn);
+	  $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);
+	};
 
-      var props = _objectWithoutProperties(_props, ['className']);
+/***/ },
+/* 32 */
+/***/ function(module, exports, __webpack_require__) {
 
-      if (this.props.accordion) {
-        props.role = 'tablist';
-      }
-      return _react2['default'].createElement(
-        'div',
-        _extends({}, props, { className: _classnames2['default'](className, classes), onSelect: null }),
-        _utilsValidComponentChildren2['default'].map(props.children, this.renderPanel)
-      );
-    },
+	/**
+	 * Copyright 2013-2015, Facebook, Inc.
+	 * All rights reserved.
+	 *
+	 * This source code is licensed under the BSD-style license found in the
+	 * LICENSE file in the root directory of this source tree. An additional grant
+	 * of patent rights can be found in the PATENTS file in the same directory.
+	 */
+
+	'use strict';
+
+	/**
+	 * Use invariant() to assert state which your program assumes to be true.
+	 *
+	 * Provide sprintf-style format (only %s is supported) and arguments
+	 * to provide information about what broke and what you were
+	 * expecting.
+	 *
+	 * The invariant message will be stripped in production, but the invariant
+	 * will remain to ensure logic does not differ in production.
+	 */
+
+	var invariant = function(condition, format, a, b, c, d, e, f) {
+	  if (true) {
+	    if (format === undefined) {
+	      throw new Error('invariant requires an error message argument');
+	    }
+	  }
+
+	  if (!condition) {
+	    var error;
+	    if (format === undefined) {
+	      error = new Error(
+	        'Minified exception occurred; use the non-minified dev environment ' +
+	        'for the full error message and additional helpful warnings.'
+	      );
+	    } else {
+	      var args = [a, b, c, d, e, f];
+	      var argIndex = 0;
+	      error = new Error(
+	        format.replace(/%s/g, function() { return args[argIndex++]; })
+	      );
+	      error.name = 'Invariant Violation';
+	    }
+
+	    error.framesToPop = 1; // we don't care about invariant's own frame
+	    throw error;
+	  }
+	};
+
+	module.exports = invariant;
 
-    renderPanel: function renderPanel(child, index) {
-      var activeKey = this.props.activeKey != null ? this.props.activeKey : this.state.activeKey;
 
-      var props = {
-        bsStyle: child.props.bsStyle || this.props.bsStyle,
-        key: child.key ? child.key : index,
-        ref: child.ref
-      };
+/***/ },
+/* 33 */
+/***/ function(module, exports, __webpack_require__) {
 
-      if (this.props.accordion) {
-        props.headerRole = 'tab';
-        props.panelRole = 'tabpanel';
-        props.collapsible = true;
-        props.expanded = child.props.eventKey === activeKey;
-        props.onSelect = this.handleSelect;
-      }
+	/**
+	 * Copyright 2014-2015, Facebook, Inc.
+	 * All rights reserved.
+	 *
+	 * This source code is licensed under the BSD-style license found in the
+	 * LICENSE file in the root directory of this source tree. An additional grant
+	 * of patent rights can be found in the PATENTS file in the same directory.
+	 */
+
+	'use strict';
+
+	/**
+	 * Similar to invariant but only logs a warning if the condition is not met.
+	 * This can be used to log issues in development environments in critical
+	 * paths. Removing the logging code for production environments will keep the
+	 * same logic and follow the same code paths.
+	 */
+
+	var warning = function() {};
+
+	if (true) {
+	  warning = function(condition, format, args) {
+	    var len = arguments.length;
+	    args = new Array(len > 2 ? len - 2 : 0);
+	    for (var key = 2; key < len; key++) {
+	      args[key - 2] = arguments[key];
+	    }
+	    if (format === undefined) {
+	      throw new Error(
+	        '`warning(condition, format, ...args)` requires a warning ' +
+	        'message argument'
+	      );
+	    }
+
+	    if (format.length < 10 || (/^[s\W]*$/).test(format)) {
+	      throw new Error(
+	        'The warning format should be able to uniquely identify this ' +
+	        'warning. Please, use a more descriptive format than: ' + format
+	      );
+	    }
+
+	    if (!condition) {
+	      var argIndex = 0;
+	      var message = 'Warning: ' +
+	        format.replace(/%s/g, function() {
+	          return args[argIndex++];
+	        });
+	      if (typeof console !== 'undefined') {
+	        console.error(message);
+	      }
+	      try {
+	        // This error was thrown as a convenience so that you can use this stack
+	        // to find the callsite that caused this warning to fire.
+	        throw new Error(message);
+	      } catch(x) {}
+	    }
+	  };
+	}
+
+	module.exports = warning;
 
-      return _react.cloneElement(child, props);
-    },
 
-    shouldComponentUpdate: function shouldComponentUpdate() {
-      // Defer any updates to this component during the `onSelect` handler.
-      return !this._isChanging;
-    },
+/***/ },
+/* 34 */
+/***/ function(module, exports, __webpack_require__) {
 
-    handleSelect: function handleSelect(e, key) {
-      e.preventDefault();
+	'use strict';
 
-      if (this.props.onSelect) {
-        this._isChanging = true;
-        this.props.onSelect(key);
-        this._isChanging = false;
-      }
+	var _extends = __webpack_require__(9)['default'];
 
-      if (this.state.activeKey === key) {
-        key = null;
-      }
+	var _interopRequireDefault = __webpack_require__(1)['default'];
 
-      this.setState({
-        activeKey: key
-      });
-    }
-  });
+	exports.__esModule = true;
 
-  exports['default'] = PanelGroup;
-  module.exports = exports['default'];
+	var _react = __webpack_require__(4);
 
-/***/ },
-/* 26 */
-/***/ function(module, exports) {
+	var _react2 = _interopRequireDefault(_react);
 
-  "use strict";
+	var _PanelGroup = __webpack_require__(35);
 
-  exports["default"] = function (obj, keys) {
-    var target = {};
+	var _PanelGroup2 = _interopRequireDefault(_PanelGroup);
 
-    for (var i in obj) {
-      if (keys.indexOf(i) >= 0) continue;
-      if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;
-      target[i] = obj[i];
-    }
+	var Accordion = _react2['default'].createClass({
+	  displayName: 'Accordion',
 
-    return target;
-  };
+	  render: function render() {
+	    return _react2['default'].createElement(
+	      _PanelGroup2['default'],
+	      _extends({}, this.props, { accordion: true }),
+	      this.props.children
+	    );
+	  }
+	});
 
-  exports.__esModule = true;
+	exports['default'] = Accordion;
+	module.exports = exports['default'];
 
 /***/ },
-/* 27 */
+/* 35 */
 /***/ function(module, exports, __webpack_require__) {
 
-  var __WEBPACK_AMD_DEFINE_RESULT__;/*!
-    Copyright (c) 2015 Jed Watson.
-    Licensed under the MIT License (MIT), see
-    http://jedwatson.github.io/classnames
-  */
-  /* global define */
-
-  (function () {
-    'use strict';
+	'use strict';
 
-    var hasOwn = {}.hasOwnProperty;
+	var _objectWithoutProperties = __webpack_require__(36)['default'];
 
-    function classNames () {
-      var classes = '';
+	var _extends = __webpack_require__(9)['default'];
 
-      for (var i = 0; i < arguments.length; i++) {
-        var arg = arguments[i];
-        if (!arg) continue;
+	var _interopRequireDefault = __webpack_require__(1)['default'];
 
-        var argType = typeof arg;
+	exports.__esModule = true;
 
-        if (argType === 'string' || argType === 'number') {
-          classes += ' ' + arg;
-        } else if (Array.isArray(arg)) {
-          classes += ' ' + classNames.apply(null, arg);
-        } else if (argType === 'object') {
-          for (var key in arg) {
-            if (hasOwn.call(arg, key) && arg[key]) {
-              classes += ' ' + key;
-            }
-          }
-        }
-      }
+	var _react = __webpack_require__(4);
 
-      return classes.substr(1);
-    }
+	var _react2 = _interopRequireDefault(_react);
 
-    if (typeof module !== 'undefined' && module.exports) {
-      module.exports = classNames;
-    } else if (true) {
-      // register as 'classnames', consistent with npm package name
-      !(__WEBPACK_AMD_DEFINE_RESULT__ = function () {
-        return classNames;
-      }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
-    } else {
-      window.classNames = classNames;
-    }
-  }());
+	var _classnames = __webpack_require__(37);
 
+	var _classnames2 = _interopRequireDefault(_classnames);
 
-/***/ },
-/* 28 */
-/***/ function(module, exports, __webpack_require__) {
+	var _utilsBootstrapUtils = __webpack_require__(8);
 
-  'use strict';
+	var _utilsBootstrapUtils2 = _interopRequireDefault(_utilsBootstrapUtils);
 
-  var _interopRequireDefault = __webpack_require__(1)['default'];
+	var _utilsValidComponentChildren = __webpack_require__(7);
 
-  exports.__esModule = true;
+	var _utilsValidComponentChildren2 = _interopRequireDefault(_utilsValidComponentChildren);
 
-  var _react = __webpack_require__(4);
+	var PanelGroup = _react2['default'].createClass({
+	  displayName: 'PanelGroup',
 
-  var _react2 = _interopRequireDefault(_react);
+	  propTypes: {
+	    accordion: _react2['default'].PropTypes.bool,
+	    activeKey: _react2['default'].PropTypes.any,
+	    className: _react2['default'].PropTypes.string,
+	    children: _react2['default'].PropTypes.node,
+	    defaultActiveKey: _react2['default'].PropTypes.any,
+	    onSelect: _react2['default'].PropTypes.func
+	  },
 
-  var _styleMaps = __webpack_require__(29);
+	  getDefaultProps: function getDefaultProps() {
+	    return {
+	      accordion: false
+	    };
+	  },
 
-  var _styleMaps2 = _interopRequireDefault(_styleMaps);
+	  getInitialState: function getInitialState() {
+	    var defaultActiveKey = this.props.defaultActiveKey;
 
-  var _reactPropTypesLibKeyOf = __webpack_require__(30);
+	    return {
+	      activeKey: defaultActiveKey
+	    };
+	  },
 
-  var _reactPropTypesLibKeyOf2 = _interopRequireDefault(_reactPropTypesLibKeyOf);
+	  render: function render() {
+	    var classes = _utilsBootstrapUtils2['default'].getClassSet(this.props);
+	    var _props = this.props;
+	    var className = _props.className;
 
-  var BootstrapMixin = {
-    propTypes: {
-      /**
-       * bootstrap className
-       * @private
-       */
-      bsClass: _reactPropTypesLibKeyOf2['default'](_styleMaps2['default'].CLASSES),
-      /**
-       * Style variants
-       * @type {("default"|"primary"|"success"|"info"|"warning"|"danger"|"link")}
-       */
-      bsStyle: _react2['default'].PropTypes.oneOf(_styleMaps2['default'].STYLES),
-      /**
-       * Size variants
-       * @type {("xsmall"|"small"|"medium"|"large"|"xs"|"sm"|"md"|"lg")}
-       */
-      bsSize: _reactPropTypesLibKeyOf2['default'](_styleMaps2['default'].SIZES)
-    },
+	    var props = _objectWithoutProperties(_props, ['className']);
 
-    getBsClassSet: function getBsClassSet() {
-      var classes = {};
+	    if (this.props.accordion) {
+	      props.role = 'tablist';
+	    }
+	    return _react2['default'].createElement(
+	      'div',
+	      _extends({}, props, { className: _classnames2['default'](className, classes), onSelect: null }),
+	      _utilsValidComponentChildren2['default'].map(props.children, this.renderPanel)
+	    );
+	  },
 
-      var bsClass = this.props.bsClass && _styleMaps2['default'].CLASSES[this.props.bsClass];
-      if (bsClass) {
-        classes[bsClass] = true;
+	  renderPanel: function renderPanel(child, index) {
+	    var activeKey = this.props.activeKey != null ? this.props.activeKey : this.state.activeKey;
 
-        var prefix = bsClass + '-';
+	    var props = {
+	      bsStyle: child.props.bsStyle || this.props.bsStyle,
+	      key: child.key ? child.key : index,
+	      ref: child.ref
+	    };
 
-        var bsSize = this.props.bsSize && _styleMaps2['default'].SIZES[this.props.bsSize];
-        if (bsSize) {
-          classes[prefix + bsSize] = true;
-        }
+	    if (this.props.accordion) {
+	      props.headerRole = 'tab';
+	      props.panelRole = 'tabpanel';
+	      props.collapsible = true;
+	      props.expanded = child.props.eventKey === activeKey;
+	      props.onSelect = this.handleSelect;
+	    }
 
-        if (this.props.bsStyle) {
-          if (_styleMaps2['default'].STYLES.indexOf(this.props.bsStyle) >= 0) {
-            classes[prefix + this.props.bsStyle] = true;
-          } else {
-            classes[this.props.bsStyle] = true;
-          }
-        }
-      }
+	    return _react.cloneElement(child, props);
+	  },
 
-      return classes;
-    },
+	  shouldComponentUpdate: function shouldComponentUpdate() {
+	    // Defer any updates to this component during the `onSelect` handler.
+	    return !this._isChanging;
+	  },
 
-    prefixClass: function prefixClass(subClass) {
-      return _styleMaps2['default'].CLASSES[this.props.bsClass] + '-' + subClass;
-    }
-  };
+	  handleSelect: function handleSelect(e, key) {
+	    e.preventDefault();
 
-  exports['default'] = BootstrapMixin;
-  module.exports = exports['default'];
+	    if (this.props.onSelect) {
+	      this._isChanging = true;
+	      this.props.onSelect(key);
+	      this._isChanging = false;
+	    }
 
-/***/ },
-/* 29 */
-/***/ function(module, exports) {
+	    if (this.state.activeKey === key) {
+	      key = null;
+	    }
 
-  'use strict';
-
-  exports.__esModule = true;
-  var styleMaps = {
-    CLASSES: {
-      'alert': 'alert',
-      'button': 'btn',
-      'button-group': 'btn-group',
-      'button-toolbar': 'btn-toolbar',
-      'column': 'col',
-      'input-group': 'input-group',
-      'form': 'form',
-      'glyphicon': 'glyphicon',
-      'label': 'label',
-      'thumbnail': 'thumbnail',
-      'list-group-item': 'list-group-item',
-      'panel': 'panel',
-      'panel-group': 'panel-group',
-      'pagination': 'pagination',
-      'progress-bar': 'progress-bar',
-      'nav': 'nav',
-      'navbar': 'navbar',
-      'modal': 'modal',
-      'row': 'row',
-      'well': 'well'
-    },
-    STYLES: ['default', 'primary', 'success', 'info', 'warning', 'danger', 'link', 'inline', 'tabs', 'pills'],
-    addStyle: function addStyle(name) {
-      styleMaps.STYLES.push(name);
-    },
-    SIZES: {
-      'large': 'lg',
-      'medium': 'md',
-      'small': 'sm',
-      'xsmall': 'xs',
-      'lg': 'lg',
-      'md': 'md',
-      'sm': 'sm',
-      'xs': 'xs'
-    },
-    GRID_COLUMNS: 12
-  };
-
-  exports['default'] = styleMaps;
-  module.exports = exports['default'];
+	    this.setState({
+	      activeKey: key
+	    });
+	  }
+	});
+
+	exports['default'] = _utilsBootstrapUtils.bsClass('panel-group', PanelGroup);
+	module.exports = exports['default'];
 
 /***/ },
-/* 30 */
-/***/ function(module, exports, __webpack_require__) {
-
-  'use strict';
+/* 36 */
+/***/ function(module, exports) {
 
-  exports.__esModule = true;
-  exports['default'] = keyOf;
+	"use strict";
 
-  var _common = __webpack_require__(31);
+	exports["default"] = function (obj, keys) {
+	  var target = {};
 
-  /**
-   * Checks whether a prop matches a key of an associated object
-   *
-   * @param props
-   * @param propName
-   * @param componentName
-   * @returns {Error|undefined}
-   */
+	  for (var i in obj) {
+	    if (keys.indexOf(i) >= 0) continue;
+	    if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;
+	    target[i] = obj[i];
+	  }
 
-  function keyOf(obj) {
-    function validate(props, propName, componentName) {
-      var propValue = props[propName];
-      if (!obj.hasOwnProperty(propValue)) {
-        var valuesString = JSON.stringify(Object.keys(obj));
-        return new Error(_common.errMsg(props, propName, componentName, ', expected one of ' + valuesString + '.'));
-      }
-    }
-    return _common.createChainableTypeChecker(validate);
-  }
+	  return target;
+	};
 
-  module.exports = exports['default'];
+	exports.__esModule = true;
 
 /***/ },
-/* 31 */
-/***/ function(module, exports) {
-
-  'use strict';
-
-  exports.__esModule = true;
-  exports.errMsg = errMsg;
-  exports.createChainableTypeChecker = createChainableTypeChecker;
-
-  function errMsg(props, propName, componentName, msgContinuation) {
-    return 'Invalid prop \'' + propName + '\' of value \'' + props[propName] + '\'' + (' supplied to \'' + componentName + '\'' + msgContinuation);
-  }
-
-  /**
-   * Create chain-able isRequired validator
-   *
-   * Largely copied directly from:
-   *  https://github.com/facebook/react/blob/0.11-stable/src/core/ReactPropTypes.js#L94
-   */
-
-  function createChainableTypeChecker(validate) {
-    function checkType(isRequired, props, propName, componentName) {
-      componentName = componentName || '<<anonymous>>';
-      if (props[propName] == null) {
-        if (isRequired) {
-          return new Error('Required prop \'' + propName + '\' was not specified in \'' + componentName + '\'.');
-        }
-      } else {
-        return validate(props, propName, componentName);
-      }
-    }
+/* 37 */
+/***/ function(module, exports, __webpack_require__) {
 
-    var chainedCheckType = checkType.bind(null, false);
-    chainedCheckType.isRequired = checkType.bind(null, true);
+	var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
+	  Copyright (c) 2016 Jed Watson.
+	  Licensed under the MIT License (MIT), see
+	  http://jedwatson.github.io/classnames
+	*/
+	/* global define */
+
+	(function () {
+		'use strict';
+
+		var hasOwn = {}.hasOwnProperty;
+
+		function classNames () {
+			var classes = [];
+
+			for (var i = 0; i < arguments.length; i++) {
+				var arg = arguments[i];
+				if (!arg) continue;
+
+				var argType = typeof arg;
+
+				if (argType === 'string' || argType === 'number') {
+					classes.push(arg);
+				} else if (Array.isArray(arg)) {
+					classes.push(classNames.apply(null, arg));
+				} else if (argType === 'object') {
+					for (var key in arg) {
+						if (hasOwn.call(arg, key) && arg[key]) {
+							classes.push(key);
+						}
+					}
+				}
+			}
+
+			return classes.join(' ');
+		}
+
+		if (typeof module !== 'undefined' && module.exports) {
+			module.exports = classNames;
+		} else if (true) {
+			// register as 'classnames', consistent with npm package name
+			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () {
+				return classNames;
+			}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+		} else {
+			window.classNames = classNames;
+		}
+	}());
 
-    return chainedCheckType;
-  }
 
 /***/ },
-/* 32 */
+/* 38 */
 /***/ function(module, exports, __webpack_require__) {
 
-  'use strict';
+	'use strict';
 
-  var _extends = __webpack_require__(9)['default'];
+	var _extends = __webpack_require__(9)['default'];
 
-  var _interopRequireDefault = __webpack_require__(1)['default'];
+	var _interopRequireDefault = __webpack_require__(1)['default'];
 
-  exports.__esModule = true;
+	exports.__esModule = true;
 
-  var _react = __webpack_require__(4);
+	var _react = __webpack_require__(4);
 
-  var _react2 = _interopRequireDefault(_react);
+	var _react2 = _interopRequireDefault(_react);
 
-  var _classnames = __webpack_require__(27);
+	var _classnames = __webpack_require__(37);
 
-  var _classnames2 = _interopRequireDefault(_classnames);
+	var _classnames2 = _interopRequireDefault(_classnames);
 
-  var _AffixMixin = __webpack_require__(33);
+	var _utilsBootstrapUtils = __webpack_require__(8);
 
-  var _AffixMixin2 = _interopRequireDefault(_AffixMixin);
+	var _utilsBootstrapUtils2 = _interopRequireDefault(_utilsBootstrapUtils);
 
-  var Affix = _react2['default'].createClass({
-    displayName: 'Affix',
+	var _styleMaps = __webpack_require__(25);
 
-    mixins: [_AffixMixin2['default']],
+	var Alert = _react2['default'].createClass({
+	  displayName: 'Alert',
 
-    render: function render() {
-      var holderStyle = _extends({
-        top: this.state.affixPositionTop
-      }, this.props.style);
+	  propTypes: {
+	    onDismiss: _react2['default'].PropTypes.func,
+	    dismissAfter: _react2['default'].PropTypes.number,
+	    closeLabel: _react2['default'].PropTypes.string
+	  },
 
-      // eslint-disable-line react/prop-types
-      return _react2['default'].createElement(
-        'div',
-        _extends({}, this.props, {
-          className: _classnames2['default'](this.props.className, this.state.affixClass),
-          style: holderStyle }),
-        this.props.children
-      );
-    }
-  });
+	  getDefaultProps: function getDefaultProps() {
+	    return {
+	      closeLabel: 'Close Alert'
+	    };
+	  },
 
-  exports['default'] = Affix;
-  module.exports = exports['default'];
-  // we don't want to expose the `style` property
-
-/***/ },
-/* 33 */
-/***/ function(module, exports, __webpack_require__) {
+	  renderDismissButton: function renderDismissButton() {
+	    return _react2['default'].createElement(
+	      'button',
+	      {
+	        type: 'button',
+	        className: 'close',
+	        onClick: this.props.onDismiss,
+	        'aria-hidden': 'true',
+	        tabIndex: '-1' },
+	      _react2['default'].createElement(
+	        'span',
+	        null,
+	        '×'
+	      )
+	    );
+	  },
 
-  'use strict';
+	  renderSrOnlyDismissButton: function renderSrOnlyDismissButton() {
+	    return _react2['default'].createElement(
+	      'button',
+	      {
+	        type: 'button',
+	        className: 'close sr-only',
+	        onClick: this.props.onDismiss },
+	      this.props.closeLabel
+	    );
+	  },
 
-  var _interopRequireDefault = __webpack_require__(1)['default'];
+	  render: function render() {
+	    var classes = _utilsBootstrapUtils2['default'].getClassSet(this.props);
+	    var isDismissable = !!this.props.onDismiss;
 
-  exports.__esModule = true;
+	    classes[_utilsBootstrapUtils2['default'].prefix(this.props, 'dismissable')] = isDismissable;
 
-  var _react = __webpack_require__(4);
+	    return _react2['default'].createElement(
+	      'div',
+	      _extends({}, this.props, { role: 'alert', className: _classnames2['default'](this.props.className, classes) }),
+	      isDismissable ? this.renderDismissButton() : null,
+	      this.props.children,
+	      isDismissable ? this.renderSrOnlyDismissButton() : null
+	    );
+	  },
 
-  var _react2 = _interopRequireDefault(_react);
+	  componentDidMount: function componentDidMount() {
+	    if (this.props.dismissAfter && this.props.onDismiss) {
+	      this.dismissTimer = setTimeout(this.props.onDismiss, this.props.dismissAfter);
+	    }
+	  },
 
-  var _utilsDomUtils = __webpack_require__(34);
+	  componentWillUnmount: function componentWillUnmount() {
+	    clearTimeout(this.dismissTimer);
+	  }
+	});
 
-  var _utilsDomUtils2 = _interopRequireDefault(_utilsDomUtils);
+	exports['default'] = _utilsBootstrapUtils.bsStyles(_styleMaps.State.values(), _styleMaps.State.INFO, _utilsBootstrapUtils.bsClass('alert', Alert));
+	module.exports = exports['default'];
 
-  var _domHelpersQueryOffset = __webpack_require__(38);
+/***/ },
+/* 39 */
+/***/ function(module, exports, __webpack_require__) {
 
-  var _domHelpersQueryOffset2 = _interopRequireDefault(_domHelpersQueryOffset);
+	'use strict';
 
-  var _utilsEventListener = __webpack_require__(42);
+	var _extends = __webpack_require__(9)['default'];
 
-  var _utilsEventListener2 = _interopRequireDefault(_utilsEventListener);
+	var _interopRequireDefault = __webpack_require__(1)['default'];
 
-  var AffixMixin = {
-    propTypes: {
-      offset: _react2['default'].PropTypes.number,
-      offsetTop: _react2['default'].PropTypes.number,
-      offsetBottom: _react2['default'].PropTypes.number
-    },
+	exports.__esModule = true;
 
-    getInitialState: function getInitialState() {
-      return {
-        affixClass: 'affix-top'
-      };
-    },
+	var _react = __webpack_require__(4);
 
-    getPinnedOffset: function getPinnedOffset(DOMNode) {
-      if (this.pinnedOffset) {
-        return this.pinnedOffset;
-      }
+	var _react2 = _interopRequireDefault(_react);
 
-      DOMNode.className = DOMNode.className.replace(/affix-top|affix-bottom|affix/, '');
-      DOMNode.className += DOMNode.className.length ? ' affix' : 'affix';
+	var _utilsValidComponentChildren = __webpack_require__(7);
 
-      this.pinnedOffset = _domHelpersQueryOffset2['default'](DOMNode).top - window.pageYOffset;
+	var _utilsValidComponentChildren2 = _interopRequireDefault(_utilsValidComponentChildren);
 
-      return this.pinnedOffset;
-    },
+	var _classnames = __webpack_require__(37);
 
-    checkPosition: function checkPosition() {
-      var DOMNode = undefined,
-          scrollHeight = undefined,
-          scrollTop = undefined,
-          position = undefined,
-          offsetTop = undefined,
-          offsetBottom = und

<TRUNCATED>

[5/6] fauxton commit: updated refs/heads/master to e6450a0

Posted by be...@apache.org.
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/d0cb3d81/assets/js/libs/react.js
----------------------------------------------------------------------
diff --git a/assets/js/libs/react.js b/assets/js/libs/react.js
index c1578b7..eb71587 100644
--- a/assets/js/libs/react.js
+++ b/assets/js/libs/react.js
@@ -1,8862 +1,7992 @@
 /**
- * React (with addons) v0.13.3
+ * React (with addons) v0.14.6
  */
 (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.React = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule ReactWithAddons
- */
+  /**
+   * Copyright 2013-2015, Facebook, Inc.
+   * All rights reserved.
+   *
+   * This source code is licensed under the BSD-style license found in the
+   * LICENSE file in the root directory of this source tree. An additional grant
+   * of patent rights can be found in the PATENTS file in the same directory.
+   *
+   * @providesModule ReactWithAddons
+   */
 
-/**
- * This module exists purely in the open source project, and is meant as a way
- * to create a separate standalone build of React. This build has "addons", or
- * functionality we've built and think might be useful but doesn't have a good
- * place to live inside React core.
- */
+  /**
+   * This module exists purely in the open source project, and is meant as a way
+   * to create a separate standalone build of React. This build has "addons", or
+   * functionality we've built and think might be useful but doesn't have a good
+   * place to live inside React core.
+   */
 
-'use strict';
-
-var LinkedStateMixin = _dereq_(25);
-var React = _dereq_(31);
-var ReactComponentWithPureRenderMixin =
-  _dereq_(42);
-var ReactCSSTransitionGroup = _dereq_(34);
-var ReactFragment = _dereq_(69);
-var ReactTransitionGroup = _dereq_(98);
-var ReactUpdates = _dereq_(100);
-
-var cx = _dereq_(127);
-var cloneWithProps = _dereq_(122);
-var update = _dereq_(170);
-
-React.addons = {
-  CSSTransitionGroup: ReactCSSTransitionGroup,
-  LinkedStateMixin: LinkedStateMixin,
-  PureRenderMixin: ReactComponentWithPureRenderMixin,
-  TransitionGroup: ReactTransitionGroup,
-
-  batchedUpdates: ReactUpdates.batchedUpdates,
-  classSet: cx,
-  cloneWithProps: cloneWithProps,
-  createFragment: ReactFragment.create,
-  update: update
-};
-
-if ("production" !== "development") {
-  React.addons.Perf = _dereq_(61);
-  React.addons.TestUtils = _dereq_(95);
-}
-
-module.exports = React;
-
-},{"100":100,"122":122,"127":127,"170":170,"25":25,"31":31,"34":34,"42":42,"61":61,"69":69,"95":95,"98":98}],2:[function(_dereq_,module,exports){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule AutoFocusMixin
- * @typechecks static-only
- */
+  'use strict';
+
+  var LinkedStateMixin = _dereq_(22);
+  var React = _dereq_(26);
+  var ReactComponentWithPureRenderMixin = _dereq_(37);
+  var ReactCSSTransitionGroup = _dereq_(29);
+  var ReactFragment = _dereq_(64);
+  var ReactTransitionGroup = _dereq_(94);
+  var ReactUpdates = _dereq_(96);
+
+  var cloneWithProps = _dereq_(118);
+  var shallowCompare = _dereq_(140);
+  var update = _dereq_(143);
+  var warning = _dereq_(173);
+
+  var warnedAboutBatchedUpdates = false;
+
+  React.addons = {
+    CSSTransitionGroup: ReactCSSTransitionGroup,
+    LinkedStateMixin: LinkedStateMixin,
+    PureRenderMixin: ReactComponentWithPureRenderMixin,
+    TransitionGroup: ReactTransitionGroup,
+
+    batchedUpdates: function () {
+      if ("development" !== 'production') {
+        "development" !== 'production' ? warning(warnedAboutBatchedUpdates, 'React.addons.batchedUpdates is deprecated. Use ' + 'ReactDOM.unstable_batchedUpdates instead.') : undefined;
+        warnedAboutBatchedUpdates = true;
+      }
+      return ReactUpdates.batchedUpdates.apply(this, arguments);
+    },
+    cloneWithProps: cloneWithProps,
+    createFragment: ReactFragment.create,
+    shallowCompare: shallowCompare,
+    update: update
+  };
+
+  if ("development" !== 'production') {
+    React.addons.Perf = _dereq_(55);
+    React.addons.TestUtils = _dereq_(91);
+  }
+
+  module.exports = React;
+},{"118":118,"140":140,"143":143,"173":173,"22":22,"26":26,"29":29,"37":37,"55":55,"64":64,"91":91,"94":94,"96":96}],2:[function(_dereq_,module,exports){
+  /**
+   * Copyright 2013-2015, Facebook, Inc.
+   * All rights reserved.
+   *
+   * This source code is licensed under the BSD-style license found in the
+   * LICENSE file in the root directory of this source tree. An additional grant
+   * of patent rights can be found in the PATENTS file in the same directory.
+   *
+   * @providesModule AutoFocusUtils
+   * @typechecks static-only
+   */
 
-'use strict';
+  'use strict';
 
-var focusNode = _dereq_(134);
+  var ReactMount = _dereq_(72);
 
-var AutoFocusMixin = {
-  componentDidMount: function() {
-    if (this.props.autoFocus) {
-      focusNode(this.getDOMNode());
+  var findDOMNode = _dereq_(122);
+  var focusNode = _dereq_(155);
+
+  var Mixin = {
+    componentDidMount: function () {
+      if (this.props.autoFocus) {
+        focusNode(findDOMNode(this));
+      }
     }
-  }
-};
+  };
 
-module.exports = AutoFocusMixin;
+  var AutoFocusUtils = {
+    Mixin: Mixin,
 
-},{"134":134}],3:[function(_dereq_,module,exports){
-/**
- * Copyright 2013-2015 Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule BeforeInputEventPlugin
- * @typechecks static-only
- */
+    focusDOMComponent: function () {
+      focusNode(ReactMount.getNode(this._rootNodeID));
+    }
+  };
+
+  module.exports = AutoFocusUtils;
+},{"122":122,"155":155,"72":72}],3:[function(_dereq_,module,exports){
+  /**
+   * Copyright 2013-2015 Facebook, Inc.
+   * All rights reserved.
+   *
+   * This source code is licensed under the BSD-style license found in the
+   * LICENSE file in the root directory of this source tree. An additional grant
+   * of patent rights can be found in the PATENTS file in the same directory.
+   *
+   * @providesModule BeforeInputEventPlugin
+   * @typechecks static-only
+   */
 
-'use strict';
+  'use strict';
 
-var EventConstants = _dereq_(16);
-var EventPropagators = _dereq_(21);
-var ExecutionEnvironment = _dereq_(22);
-var FallbackCompositionState = _dereq_(23);
-var SyntheticCompositionEvent = _dereq_(106);
-var SyntheticInputEvent = _dereq_(110);
+  var EventConstants = _dereq_(15);
+  var EventPropagators = _dereq_(19);
+  var ExecutionEnvironment = _dereq_(147);
+  var FallbackCompositionState = _dereq_(20);
+  var SyntheticCompositionEvent = _dereq_(103);
+  var SyntheticInputEvent = _dereq_(107);
 
-var keyOf = _dereq_(157);
+  var keyOf = _dereq_(166);
 
-var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
-var START_KEYCODE = 229;
+  var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
+  var START_KEYCODE = 229;
 
-var canUseCompositionEvent = (
-  ExecutionEnvironment.canUseDOM &&
-  'CompositionEvent' in window
-);
+  var canUseCompositionEvent = ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window;
 
-var documentMode = null;
-if (ExecutionEnvironment.canUseDOM && 'documentMode' in document) {
-  documentMode = document.documentMode;
-}
+  var documentMode = null;
+  if (ExecutionEnvironment.canUseDOM && 'documentMode' in document) {
+    documentMode = document.documentMode;
+  }
 
 // Webkit offers a very useful `textInput` event that can be used to
 // directly represent `beforeInput`. The IE `textinput` event is not as
 // useful, so we don't use it.
-var canUseTextInputEvent = (
-  ExecutionEnvironment.canUseDOM &&
-  'TextEvent' in window &&
-  !documentMode &&
-  !isPresto()
-);
+  var canUseTextInputEvent = ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto();
 
 // In IE9+, we have access to composition events, but the data supplied
 // by the native compositionend event may be incorrect. Japanese ideographic
 // spaces, for instance (\u3000) are not recorded correctly.
-var useFallbackCompositionData = (
-  ExecutionEnvironment.canUseDOM &&
-  (
-    (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11)
-  )
-);
+  var useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);
 
-/**
- * Opera <= 12 includes TextEvent in window, but does not fire
- * text input events. Rely on keypress instead.
- */
-function isPresto() {
-  var opera = window.opera;
-  return (
-    typeof opera === 'object' &&
-    typeof opera.version === 'function' &&
-    parseInt(opera.version(), 10) <= 12
-  );
-}
+  /**
+   * Opera <= 12 includes TextEvent in window, but does not fire
+   * text input events. Rely on keypress instead.
+   */
+  function isPresto() {
+    var opera = window.opera;
+    return typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12;
+  }
 
-var SPACEBAR_CODE = 32;
-var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);
+  var SPACEBAR_CODE = 32;
+  var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);
 
-var topLevelTypes = EventConstants.topLevelTypes;
+  var topLevelTypes = EventConstants.topLevelTypes;
 
 // Events and their corresponding property names.
-var eventTypes = {
-  beforeInput: {
-    phasedRegistrationNames: {
-      bubbled: keyOf({onBeforeInput: null}),
-      captured: keyOf({onBeforeInputCapture: null})
-    },
-    dependencies: [
-      topLevelTypes.topCompositionEnd,
-      topLevelTypes.topKeyPress,
-      topLevelTypes.topTextInput,
-      topLevelTypes.topPaste
-    ]
-  },
-  compositionEnd: {
-    phasedRegistrationNames: {
-      bubbled: keyOf({onCompositionEnd: null}),
-      captured: keyOf({onCompositionEndCapture: null})
-    },
-    dependencies: [
-      topLevelTypes.topBlur,
-      topLevelTypes.topCompositionEnd,
-      topLevelTypes.topKeyDown,
-      topLevelTypes.topKeyPress,
-      topLevelTypes.topKeyUp,
-      topLevelTypes.topMouseDown
-    ]
-  },
-  compositionStart: {
-    phasedRegistrationNames: {
-      bubbled: keyOf({onCompositionStart: null}),
-      captured: keyOf({onCompositionStartCapture: null})
-    },
-    dependencies: [
-      topLevelTypes.topBlur,
-      topLevelTypes.topCompositionStart,
-      topLevelTypes.topKeyDown,
-      topLevelTypes.topKeyPress,
-      topLevelTypes.topKeyUp,
-      topLevelTypes.topMouseDown
-    ]
-  },
-  compositionUpdate: {
-    phasedRegistrationNames: {
-      bubbled: keyOf({onCompositionUpdate: null}),
-      captured: keyOf({onCompositionUpdateCapture: null})
-    },
-    dependencies: [
-      topLevelTypes.topBlur,
-      topLevelTypes.topCompositionUpdate,
-      topLevelTypes.topKeyDown,
-      topLevelTypes.topKeyPress,
-      topLevelTypes.topKeyUp,
-      topLevelTypes.topMouseDown
-    ]
-  }
-};
+  var eventTypes = {
+    beforeInput: {
+      phasedRegistrationNames: {
+        bubbled: keyOf({ onBeforeInput: null }),
+        captured: keyOf({ onBeforeInputCapture: null })
+      },
+      dependencies: [topLevelTypes.topCompositionEnd, topLevelTypes.topKeyPress, topLevelTypes.topTextInput, topLevelTypes.topPaste]
+    },
+    compositionEnd: {
+      phasedRegistrationNames: {
+        bubbled: keyOf({ onCompositionEnd: null }),
+        captured: keyOf({ onCompositionEndCapture: null })
+      },
+      dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionEnd, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]
+    },
+    compositionStart: {
+      phasedRegistrationNames: {
+        bubbled: keyOf({ onCompositionStart: null }),
+        captured: keyOf({ onCompositionStartCapture: null })
+      },
+      dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionStart, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]
+    },
+    compositionUpdate: {
+      phasedRegistrationNames: {
+        bubbled: keyOf({ onCompositionUpdate: null }),
+        captured: keyOf({ onCompositionUpdateCapture: null })
+      },
+      dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionUpdate, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]
+    }
+  };
 
 // Track whether we've ever handled a keypress on the space key.
-var hasSpaceKeypress = false;
+  var hasSpaceKeypress = false;
 
-/**
- * Return whether a native keypress event is assumed to be a command.
- * This is required because Firefox fires `keypress` events for key commands
- * (cut, copy, select-all, etc.) even though no character is inserted.
- */
-function isKeypressCommand(nativeEvent) {
-  return (
-    (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&
-    // ctrlKey && altKey is equivalent to AltGr, and is not a command.
-    !(nativeEvent.ctrlKey && nativeEvent.altKey)
-  );
-}
-
-
-/**
- * Translate native top level events into event types.
- *
- * @param {string} topLevelType
- * @return {object}
- */
-function getCompositionEventType(topLevelType) {
-  switch (topLevelType) {
-    case topLevelTypes.topCompositionStart:
-      return eventTypes.compositionStart;
-    case topLevelTypes.topCompositionEnd:
-      return eventTypes.compositionEnd;
-    case topLevelTypes.topCompositionUpdate:
-      return eventTypes.compositionUpdate;
+  /**
+   * Return whether a native keypress event is assumed to be a command.
+   * This is required because Firefox fires `keypress` events for key commands
+   * (cut, copy, select-all, etc.) even though no character is inserted.
+   */
+  function isKeypressCommand(nativeEvent) {
+    return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&
+        // ctrlKey && altKey is equivalent to AltGr, and is not a command.
+      !(nativeEvent.ctrlKey && nativeEvent.altKey);
   }
-}
-
-/**
- * Does our fallback best-guess model think this event signifies that
- * composition has begun?
- *
- * @param {string} topLevelType
- * @param {object} nativeEvent
- * @return {boolean}
- */
-function isFallbackCompositionStart(topLevelType, nativeEvent) {
-  return (
-    topLevelType === topLevelTypes.topKeyDown &&
-    nativeEvent.keyCode === START_KEYCODE
-  );
-}
 
-/**
- * Does our fallback mode think that this event is the end of composition?
- *
- * @param {string} topLevelType
- * @param {object} nativeEvent
- * @return {boolean}
- */
-function isFallbackCompositionEnd(topLevelType, nativeEvent) {
-  switch (topLevelType) {
-    case topLevelTypes.topKeyUp:
-      // Command keys insert or clear IME input.
-      return (END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1);
-    case topLevelTypes.topKeyDown:
-      // Expect IME keyCode on each keydown. If we get any other
-      // code we must have exited earlier.
-      return (nativeEvent.keyCode !== START_KEYCODE);
-    case topLevelTypes.topKeyPress:
-    case topLevelTypes.topMouseDown:
-    case topLevelTypes.topBlur:
-      // Events are not possible without cancelling IME.
-      return true;
-    default:
-      return false;
+  /**
+   * Translate native top level events into event types.
+   *
+   * @param {string} topLevelType
+   * @return {object}
+   */
+  function getCompositionEventType(topLevelType) {
+    switch (topLevelType) {
+      case topLevelTypes.topCompositionStart:
+        return eventTypes.compositionStart;
+      case topLevelTypes.topCompositionEnd:
+        return eventTypes.compositionEnd;
+      case topLevelTypes.topCompositionUpdate:
+        return eventTypes.compositionUpdate;
+    }
   }
-}
 
-/**
- * Google Input Tools provides composition data via a CustomEvent,
- * with the `data` property populated in the `detail` object. If this
- * is available on the event object, use it. If not, this is a plain
- * composition event and we have nothing special to extract.
- *
- * @param {object} nativeEvent
- * @return {?string}
- */
-function getDataFromCustomEvent(nativeEvent) {
-  var detail = nativeEvent.detail;
-  if (typeof detail === 'object' && 'data' in detail) {
-    return detail.data;
+  /**
+   * Does our fallback best-guess model think this event signifies that
+   * composition has begun?
+   *
+   * @param {string} topLevelType
+   * @param {object} nativeEvent
+   * @return {boolean}
+   */
+  function isFallbackCompositionStart(topLevelType, nativeEvent) {
+    return topLevelType === topLevelTypes.topKeyDown && nativeEvent.keyCode === START_KEYCODE;
   }
-  return null;
-}
 
-// Track the current IME composition fallback object, if any.
-var currentComposition = null;
+  /**
+   * Does our fallback mode think that this event is the end of composition?
+   *
+   * @param {string} topLevelType
+   * @param {object} nativeEvent
+   * @return {boolean}
+   */
+  function isFallbackCompositionEnd(topLevelType, nativeEvent) {
+    switch (topLevelType) {
+      case topLevelTypes.topKeyUp:
+        // Command keys insert or clear IME input.
+        return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
+      case topLevelTypes.topKeyDown:
+        // Expect IME keyCode on each keydown. If we get any other
+        // code we must have exited earlier.
+        return nativeEvent.keyCode !== START_KEYCODE;
+      case topLevelTypes.topKeyPress:
+      case topLevelTypes.topMouseDown:
+      case topLevelTypes.topBlur:
+        // Events are not possible without cancelling IME.
+        return true;
+      default:
+        return false;
+    }
+  }
 
-/**
- * @param {string} topLevelType Record from `EventConstants`.
- * @param {DOMEventTarget} topLevelTarget The listening component root node.
- * @param {string} topLevelTargetID ID of `topLevelTarget`.
- * @param {object} nativeEvent Native browser event.
- * @return {?object} A SyntheticCompositionEvent.
- */
-function extractCompositionEvent(
-  topLevelType,
-  topLevelTarget,
-  topLevelTargetID,
-  nativeEvent
-) {
-  var eventType;
-  var fallbackData;
-
-  if (canUseCompositionEvent) {
-    eventType = getCompositionEventType(topLevelType);
-  } else if (!currentComposition) {
-    if (isFallbackCompositionStart(topLevelType, nativeEvent)) {
-      eventType = eventTypes.compositionStart;
-    }
-  } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {
-    eventType = eventTypes.compositionEnd;
-  }
-
-  if (!eventType) {
+  /**
+   * Google Input Tools provides composition data via a CustomEvent,
+   * with the `data` property populated in the `detail` object. If this
+   * is available on the event object, use it. If not, this is a plain
+   * composition event and we have nothing special to extract.
+   *
+   * @param {object} nativeEvent
+   * @return {?string}
+   */
+  function getDataFromCustomEvent(nativeEvent) {
+    var detail = nativeEvent.detail;
+    if (typeof detail === 'object' && 'data' in detail) {
+      return detail.data;
+    }
     return null;
   }
 
-  if (useFallbackCompositionData) {
-    // The current composition is stored statically and must not be
-    // overwritten while composition continues.
-    if (!currentComposition && eventType === eventTypes.compositionStart) {
-      currentComposition = FallbackCompositionState.getPooled(topLevelTarget);
-    } else if (eventType === eventTypes.compositionEnd) {
-      if (currentComposition) {
-        fallbackData = currentComposition.getData();
+// Track the current IME composition fallback object, if any.
+  var currentComposition = null;
+
+  /**
+   * @param {string} topLevelType Record from `EventConstants`.
+   * @param {DOMEventTarget} topLevelTarget The listening component root node.
+   * @param {string} topLevelTargetID ID of `topLevelTarget`.
+   * @param {object} nativeEvent Native browser event.
+   * @return {?object} A SyntheticCompositionEvent.
+   */
+  function extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
+    var eventType;
+    var fallbackData;
+
+    if (canUseCompositionEvent) {
+      eventType = getCompositionEventType(topLevelType);
+    } else if (!currentComposition) {
+      if (isFallbackCompositionStart(topLevelType, nativeEvent)) {
+        eventType = eventTypes.compositionStart;
       }
+    } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {
+      eventType = eventTypes.compositionEnd;
     }
-  }
 
-  var event = SyntheticCompositionEvent.getPooled(
-    eventType,
-    topLevelTargetID,
-    nativeEvent
-  );
+    if (!eventType) {
+      return null;
+    }
 
-  if (fallbackData) {
-    // Inject data generated from fallback path into the synthetic event.
-    // This matches the property of native CompositionEventInterface.
-    event.data = fallbackData;
-  } else {
-    var customData = getDataFromCustomEvent(nativeEvent);
-    if (customData !== null) {
-      event.data = customData;
+    if (useFallbackCompositionData) {
+      // The current composition is stored statically and must not be
+      // overwritten while composition continues.
+      if (!currentComposition && eventType === eventTypes.compositionStart) {
+        currentComposition = FallbackCompositionState.getPooled(topLevelTarget);
+      } else if (eventType === eventTypes.compositionEnd) {
+        if (currentComposition) {
+          fallbackData = currentComposition.getData();
+        }
+      }
     }
-  }
 
-  EventPropagators.accumulateTwoPhaseDispatches(event);
-  return event;
-}
+    var event = SyntheticCompositionEvent.getPooled(eventType, topLevelTargetID, nativeEvent, nativeEventTarget);
 
-/**
- * @param {string} topLevelType Record from `EventConstants`.
- * @param {object} nativeEvent Native browser event.
- * @return {?string} The string corresponding to this `beforeInput` event.
- */
-function getNativeBeforeInputChars(topLevelType, nativeEvent) {
-  switch (topLevelType) {
-    case topLevelTypes.topCompositionEnd:
-      return getDataFromCustomEvent(nativeEvent);
-    case topLevelTypes.topKeyPress:
-      /**
-       * If native `textInput` events are available, our goal is to make
-       * use of them. However, there is a special case: the spacebar key.
-       * In Webkit, preventing default on a spacebar `textInput` event
-       * cancels character insertion, but it *also* causes the browser
-       * to fall back to its default spacebar behavior of scrolling the
-       * page.
-       *
-       * Tracking at:
-       * https://code.google.com/p/chromium/issues/detail?id=355103
-       *
-       * To avoid this issue, use the keypress event as if no `textInput`
-       * event is available.
-       */
-      var which = nativeEvent.which;
-      if (which !== SPACEBAR_CODE) {
-        return null;
+    if (fallbackData) {
+      // Inject data generated from fallback path into the synthetic event.
+      // This matches the property of native CompositionEventInterface.
+      event.data = fallbackData;
+    } else {
+      var customData = getDataFromCustomEvent(nativeEvent);
+      if (customData !== null) {
+        event.data = customData;
       }
+    }
 
-      hasSpaceKeypress = true;
-      return SPACEBAR_CHAR;
+    EventPropagators.accumulateTwoPhaseDispatches(event);
+    return event;
+  }
 
-    case topLevelTypes.topTextInput:
-      // Record the characters to be added to the DOM.
-      var chars = nativeEvent.data;
+  /**
+   * @param {string} topLevelType Record from `EventConstants`.
+   * @param {object} nativeEvent Native browser event.
+   * @return {?string} The string corresponding to this `beforeInput` event.
+   */
+  function getNativeBeforeInputChars(topLevelType, nativeEvent) {
+    switch (topLevelType) {
+      case topLevelTypes.topCompositionEnd:
+        return getDataFromCustomEvent(nativeEvent);
+      case topLevelTypes.topKeyPress:
+        /**
+         * If native `textInput` events are available, our goal is to make
+         * use of them. However, there is a special case: the spacebar key.
+         * In Webkit, preventing default on a spacebar `textInput` event
+         * cancels character insertion, but it *also* causes the browser
+         * to fall back to its default spacebar behavior of scrolling the
+         * page.
+         *
+         * Tracking at:
+         * https://code.google.com/p/chromium/issues/detail?id=355103
+         *
+         * To avoid this issue, use the keypress event as if no `textInput`
+         * event is available.
+         */
+        var which = nativeEvent.which;
+        if (which !== SPACEBAR_CODE) {
+          return null;
+        }
 
-      // If it's a spacebar character, assume that we have already handled
-      // it at the keypress level and bail immediately. Android Chrome
-      // doesn't give us keycodes, so we need to blacklist it.
-      if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
-        return null;
-      }
+        hasSpaceKeypress = true;
+        return SPACEBAR_CHAR;
 
-      return chars;
+      case topLevelTypes.topTextInput:
+        // Record the characters to be added to the DOM.
+        var chars = nativeEvent.data;
 
-    default:
-      // For other native event types, do nothing.
-      return null;
-  }
-}
+        // If it's a spacebar character, assume that we have already handled
+        // it at the keypress level and bail immediately. Android Chrome
+        // doesn't give us keycodes, so we need to blacklist it.
+        if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
+          return null;
+        }
 
-/**
- * For browsers that do not provide the `textInput` event, extract the
- * appropriate string to use for SyntheticInputEvent.
- *
- * @param {string} topLevelType Record from `EventConstants`.
- * @param {object} nativeEvent Native browser event.
- * @return {?string} The fallback string for this `beforeInput` event.
- */
-function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
-  // If we are currently composing (IME) and using a fallback to do so,
-  // try to extract the composed characters from the fallback object.
-  if (currentComposition) {
-    if (
-      topLevelType === topLevelTypes.topCompositionEnd ||
-      isFallbackCompositionEnd(topLevelType, nativeEvent)
-    ) {
-      var chars = currentComposition.getData();
-      FallbackCompositionState.release(currentComposition);
-      currentComposition = null;
-      return chars;
+        return chars;
+
+      default:
+        // For other native event types, do nothing.
+        return null;
     }
-    return null;
   }
 
-  switch (topLevelType) {
-    case topLevelTypes.topPaste:
-      // If a paste event occurs after a keypress, throw out the input
-      // chars. Paste events should not lead to BeforeInput events.
-      return null;
-    case topLevelTypes.topKeyPress:
-      /**
-       * As of v27, Firefox may fire keypress events even when no character
-       * will be inserted. A few possibilities:
-       *
-       * - `which` is `0`. Arrow keys, Esc key, etc.
-       *
-       * - `which` is the pressed key code, but no char is available.
-       *   Ex: 'AltGr + d` in Polish. There is no modified character for
-       *   this key combination and no character is inserted into the
-       *   document, but FF fires the keypress for char code `100` anyway.
-       *   No `input` event will occur.
-       *
-       * - `which` is the pressed key code, but a command combination is
-       *   being used. Ex: `Cmd+C`. No character is inserted, and no
-       *   `input` event will occur.
-       */
-      if (nativeEvent.which && !isKeypressCommand(nativeEvent)) {
-        return String.fromCharCode(nativeEvent.which);
+  /**
+   * For browsers that do not provide the `textInput` event, extract the
+   * appropriate string to use for SyntheticInputEvent.
+   *
+   * @param {string} topLevelType Record from `EventConstants`.
+   * @param {object} nativeEvent Native browser event.
+   * @return {?string} The fallback string for this `beforeInput` event.
+   */
+  function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
+    // If we are currently composing (IME) and using a fallback to do so,
+    // try to extract the composed characters from the fallback object.
+    if (currentComposition) {
+      if (topLevelType === topLevelTypes.topCompositionEnd || isFallbackCompositionEnd(topLevelType, nativeEvent)) {
+        var chars = currentComposition.getData();
+        FallbackCompositionState.release(currentComposition);
+        currentComposition = null;
+        return chars;
       }
       return null;
-    case topLevelTypes.topCompositionEnd:
-      return useFallbackCompositionData ? null : nativeEvent.data;
-    default:
-      return null;
-  }
-}
-
-/**
- * Extract a SyntheticInputEvent for `beforeInput`, based on either native
- * `textInput` or fallback behavior.
- *
- * @param {string} topLevelType Record from `EventConstants`.
- * @param {DOMEventTarget} topLevelTarget The listening component root node.
- * @param {string} topLevelTargetID ID of `topLevelTarget`.
- * @param {object} nativeEvent Native browser event.
- * @return {?object} A SyntheticInputEvent.
- */
-function extractBeforeInputEvent(
-  topLevelType,
-  topLevelTarget,
-  topLevelTargetID,
-  nativeEvent
-) {
-  var chars;
-
-  if (canUseTextInputEvent) {
-    chars = getNativeBeforeInputChars(topLevelType, nativeEvent);
-  } else {
-    chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);
-  }
+    }
 
-  // If no characters are being inserted, no BeforeInput event should
-  // be fired.
-  if (!chars) {
-    return null;
+    switch (topLevelType) {
+      case topLevelTypes.topPaste:
+        // If a paste event occurs after a keypress, throw out the input
+        // chars. Paste events should not lead to BeforeInput events.
+        return null;
+      case topLevelTypes.topKeyPress:
+        /**
+         * As of v27, Firefox may fire keypress events even when no character
+         * will be inserted. A few possibilities:
+         *
+         * - `which` is `0`. Arrow keys, Esc key, etc.
+         *
+         * - `which` is the pressed key code, but no char is available.
+         *   Ex: 'AltGr + d` in Polish. There is no modified character for
+         *   this key combination and no character is inserted into the
+         *   document, but FF fires the keypress for char code `100` anyway.
+         *   No `input` event will occur.
+         *
+         * - `which` is the pressed key code, but a command combination is
+         *   being used. Ex: `Cmd+C`. No character is inserted, and no
+         *   `input` event will occur.
+         */
+        if (nativeEvent.which && !isKeypressCommand(nativeEvent)) {
+          return String.fromCharCode(nativeEvent.which);
+        }
+        return null;
+      case topLevelTypes.topCompositionEnd:
+        return useFallbackCompositionData ? null : nativeEvent.data;
+      default:
+        return null;
+    }
   }
 
-  var event = SyntheticInputEvent.getPooled(
-    eventTypes.beforeInput,
-    topLevelTargetID,
-    nativeEvent
-  );
-
-  event.data = chars;
-  EventPropagators.accumulateTwoPhaseDispatches(event);
-  return event;
-}
-
-/**
- * Create an `onBeforeInput` event to match
- * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
- *
- * This event plugin is based on the native `textInput` event
- * available in Chrome, Safari, Opera, and IE. This event fires after
- * `onKeyPress` and `onCompositionEnd`, but before `onInput`.
- *
- * `beforeInput` is spec'd but not implemented in any browsers, and
- * the `input` event does not provide any useful information about what has
- * actually been added, contrary to the spec. Thus, `textInput` is the best
- * available event to identify the characters that have actually been inserted
- * into the target node.
- *
- * This plugin is also responsible for emitting `composition` events, thus
- * allowing us to share composition fallback code for both `beforeInput` and
- * `composition` event types.
- */
-var BeforeInputEventPlugin = {
-
-  eventTypes: eventTypes,
-
   /**
+   * Extract a SyntheticInputEvent for `beforeInput`, based on either native
+   * `textInput` or fallback behavior.
+   *
    * @param {string} topLevelType Record from `EventConstants`.
    * @param {DOMEventTarget} topLevelTarget The listening component root node.
    * @param {string} topLevelTargetID ID of `topLevelTarget`.
    * @param {object} nativeEvent Native browser event.
-   * @return {*} An accumulation of synthetic events.
-   * @see {EventPluginHub.extractEvents}
-   */
-  extractEvents: function(
-    topLevelType,
-    topLevelTarget,
-    topLevelTargetID,
-    nativeEvent
-  ) {
-    return [
-      extractCompositionEvent(
-        topLevelType,
-        topLevelTarget,
-        topLevelTargetID,
-        nativeEvent
-      ),
-      extractBeforeInputEvent(
-        topLevelType,
-        topLevelTarget,
-        topLevelTargetID,
-        nativeEvent
-      )
-    ];
-  }
-};
-
-module.exports = BeforeInputEventPlugin;
-
-},{"106":106,"110":110,"157":157,"16":16,"21":21,"22":22,"23":23}],4:[function(_dereq_,module,exports){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule CSSCore
- * @typechecks
- */
+   * @return {?object} A SyntheticInputEvent.
+   */
+  function extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
+    var chars;
 
-var invariant = _dereq_(150);
+    if (canUseTextInputEvent) {
+      chars = getNativeBeforeInputChars(topLevelType, nativeEvent);
+    } else {
+      chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);
+    }
 
-/**
- * The CSSCore module specifies the API (and implements most of the methods)
- * that should be used when dealing with the display of elements (via their
- * CSS classes and visibility on screen. It is an API focused on mutating the
- * display and not reading it as no logical state should be encoded in the
- * display of elements.
- */
+    // If no characters are being inserted, no BeforeInput event should
+    // be fired.
+    if (!chars) {
+      return null;
+    }
+
+    var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, topLevelTargetID, nativeEvent, nativeEventTarget);
 
-var CSSCore = {
+    event.data = chars;
+    EventPropagators.accumulateTwoPhaseDispatches(event);
+    return event;
+  }
 
   /**
-   * Adds the class passed in to the element if it doesn't already have it.
+   * Create an `onBeforeInput` event to match
+   * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
+   *
+   * This event plugin is based on the native `textInput` event
+   * available in Chrome, Safari, Opera, and IE. This event fires after
+   * `onKeyPress` and `onCompositionEnd`, but before `onInput`.
    *
-   * @param {DOMElement} element the element to set the class on
-   * @param {string} className the CSS className
-   * @return {DOMElement} the element passed in
+   * `beforeInput` is spec'd but not implemented in any browsers, and
+   * the `input` event does not provide any useful information about what has
+   * actually been added, contrary to the spec. Thus, `textInput` is the best
+   * available event to identify the characters that have actually been inserted
+   * into the target node.
+   *
+   * This plugin is also responsible for emitting `composition` events, thus
+   * allowing us to share composition fallback code for both `beforeInput` and
+   * `composition` event types.
    */
-  addClass: function(element, className) {
-    ("production" !== "development" ? invariant(
-      !/\s/.test(className),
-      'CSSCore.addClass takes only a single class name. "%s" contains ' +
-      'multiple classes.', className
-    ) : invariant(!/\s/.test(className)));
+  var BeforeInputEventPlugin = {
 
-    if (className) {
-      if (element.classList) {
-        element.classList.add(className);
-      } else if (!CSSCore.hasClass(element, className)) {
-        element.className = element.className + ' ' + className;
-      }
+    eventTypes: eventTypes,
+
+    /**
+     * @param {string} topLevelType Record from `EventConstants`.
+     * @param {DOMEventTarget} topLevelTarget The listening component root node.
+     * @param {string} topLevelTargetID ID of `topLevelTarget`.
+     * @param {object} nativeEvent Native browser event.
+     * @return {*} An accumulation of synthetic events.
+     * @see {EventPluginHub.extractEvents}
+     */
+    extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
+      return [extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget)];
     }
-    return element;
-  },
+  };
 
+  module.exports = BeforeInputEventPlugin;
+},{"103":103,"107":107,"147":147,"15":15,"166":166,"19":19,"20":20}],4:[function(_dereq_,module,exports){
   /**
-   * Removes the class passed in from the element
+   * Copyright 2013-2015, Facebook, Inc.
+   * All rights reserved.
    *
-   * @param {DOMElement} element the element to set the class on
-   * @param {string} className the CSS className
-   * @return {DOMElement} the element passed in
+   * This source code is licensed under the BSD-style license found in the
+   * LICENSE file in the root directory of this source tree. An additional grant
+   * of patent rights can be found in the PATENTS file in the same directory.
+   *
+   * @providesModule CSSProperty
    */
-  removeClass: function(element, className) {
-    ("production" !== "development" ? invariant(
-      !/\s/.test(className),
-      'CSSCore.removeClass takes only a single class name. "%s" contains ' +
-      'multiple classes.', className
-    ) : invariant(!/\s/.test(className)));
 
-    if (className) {
-      if (element.classList) {
-        element.classList.remove(className);
-      } else if (CSSCore.hasClass(element, className)) {
-        element.className = element.className
-          .replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)', 'g'), '$1')
-          .replace(/\s+/g, ' ') // multiple spaces to one
-          .replace(/^\s*|\s*$/g, ''); // trim the ends
-      }
-    }
-    return element;
-  },
+  'use strict';
 
   /**
-   * Helper to add or remove a class from an element based on a condition.
-   *
-   * @param {DOMElement} element the element to set the class on
-   * @param {string} className the CSS className
-   * @param {*} bool condition to whether to add or remove the class
-   * @return {DOMElement} the element passed in
+   * CSS properties which accept numbers but are not in units of "px".
    */
-  conditionClass: function(element, className, bool) {
-    return (bool ? CSSCore.addClass : CSSCore.removeClass)(element, className);
-  },
+  var isUnitlessNumber = {
+    animationIterationCount: true,
+    boxFlex: true,
+    boxFlexGroup: true,
+    boxOrdinalGroup: true,
+    columnCount: true,
+    flex: true,
+    flexGrow: true,
+    flexPositive: true,
+    flexShrink: true,
+    flexNegative: true,
+    flexOrder: true,
+    fontWeight: true,
+    lineClamp: true,
+    lineHeight: true,
+    opacity: true,
+    order: true,
+    orphans: true,
+    tabSize: true,
+    widows: true,
+    zIndex: true,
+    zoom: true,
+
+    // SVG-related properties
+    fillOpacity: true,
+    stopOpacity: true,
+    strokeDashoffset: true,
+    strokeOpacity: true,
+    strokeWidth: true
+  };
 
   /**
-   * Tests whether the element has the class specified.
-   *
-   * @param {DOMNode|DOMWindow} element the element to set the class on
-   * @param {string} className the CSS className
-   * @return {boolean} true if the element has the class, false if not
+   * @param {string} prefix vendor-specific prefix, eg: Webkit
+   * @param {string} key style name, eg: transitionDuration
+   * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
+   * WebkitTransitionDuration
    */
-  hasClass: function(element, className) {
-    ("production" !== "development" ? invariant(
-      !/\s/.test(className),
-      'CSS.hasClass takes only a single class name.'
-    ) : invariant(!/\s/.test(className)));
-    if (element.classList) {
-      return !!className && element.classList.contains(className);
-    }
-    return (' ' + element.className + ' ').indexOf(' ' + className + ' ') > -1;
+  function prefixKey(prefix, key) {
+    return prefix + key.charAt(0).toUpperCase() + key.substring(1);
   }
 
-};
-
-module.exports = CSSCore;
-
-},{"150":150}],5:[function(_dereq_,module,exports){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule CSSProperty
- */
-
-'use strict';
-
-/**
- * CSS properties which accept numbers but are not in units of "px".
- */
-var isUnitlessNumber = {
-  boxFlex: true,
-  boxFlexGroup: true,
-  columnCount: true,
-  flex: true,
-  flexGrow: true,
-  flexPositive: true,
-  flexShrink: true,
-  flexNegative: true,
-  fontWeight: true,
-  lineClamp: true,
-  lineHeight: true,
-  opacity: true,
-  order: true,
-  orphans: true,
-  widows: true,
-  zIndex: true,
-  zoom: true,
-
-  // SVG-related properties
-  fillOpacity: true,
-  strokeDashoffset: true,
-  strokeOpacity: true,
-  strokeWidth: true
-};
-
-/**
- * @param {string} prefix vendor-specific prefix, eg: Webkit
- * @param {string} key style name, eg: transitionDuration
- * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
- * WebkitTransitionDuration
- */
-function prefixKey(prefix, key) {
-  return prefix + key.charAt(0).toUpperCase() + key.substring(1);
-}
-
-/**
- * Support style names that may come passed in prefixed by adding permutations
- * of vendor prefixes.
- */
-var prefixes = ['Webkit', 'ms', 'Moz', 'O'];
+  /**
+   * Support style names that may come passed in prefixed by adding permutations
+   * of vendor prefixes.
+   */
+  var prefixes = ['Webkit', 'ms', 'Moz', 'O'];
 
 // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
 // infinite loop, because it iterates over the newly added props too.
-Object.keys(isUnitlessNumber).forEach(function(prop) {
-  prefixes.forEach(function(prefix) {
-    isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
+  Object.keys(isUnitlessNumber).forEach(function (prop) {
+    prefixes.forEach(function (prefix) {
+      isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
+    });
   });
-});
-
-/**
- * Most style properties can be unset by doing .style[prop] = '' but IE8
- * doesn't like doing that with shorthand properties so for the properties that
- * IE8 breaks on, which are listed here, we instead unset each of the
- * individual properties. See http://bugs.jquery.com/ticket/12385.
- * The 4-value 'clock' properties like margin, padding, border-width seem to
- * behave without any problems. Curiously, list-style works too without any
- * special prodding.
- */
-var shorthandPropertyExpansions = {
-  background: {
-    backgroundImage: true,
-    backgroundPosition: true,
-    backgroundRepeat: true,
-    backgroundColor: true
-  },
-  border: {
-    borderWidth: true,
-    borderStyle: true,
-    borderColor: true
-  },
-  borderBottom: {
-    borderBottomWidth: true,
-    borderBottomStyle: true,
-    borderBottomColor: true
-  },
-  borderLeft: {
-    borderLeftWidth: true,
-    borderLeftStyle: true,
-    borderLeftColor: true
-  },
-  borderRight: {
-    borderRightWidth: true,
-    borderRightStyle: true,
-    borderRightColor: true
-  },
-  borderTop: {
-    borderTopWidth: true,
-    borderTopStyle: true,
-    borderTopColor: true
-  },
-  font: {
-    fontStyle: true,
-    fontVariant: true,
-    fontWeight: true,
-    fontSize: true,
-    lineHeight: true,
-    fontFamily: true
-  }
-};
-
-var CSSProperty = {
-  isUnitlessNumber: isUnitlessNumber,
-  shorthandPropertyExpansions: shorthandPropertyExpansions
-};
 
-module.exports = CSSProperty;
-
-},{}],6:[function(_dereq_,module,exports){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule CSSPropertyOperations
- * @typechecks static-only
- */
+  /**
+   * Most style properties can be unset by doing .style[prop] = '' but IE8
+   * doesn't like doing that with shorthand properties so for the properties that
+   * IE8 breaks on, which are listed here, we instead unset each of the
+   * individual properties. See http://bugs.jquery.com/ticket/12385.
+   * The 4-value 'clock' properties like margin, padding, border-width seem to
+   * behave without any problems. Curiously, list-style works too without any
+   * special prodding.
+   */
+  var shorthandPropertyExpansions = {
+    background: {
+      backgroundAttachment: true,
+      backgroundColor: true,
+      backgroundImage: true,
+      backgroundPositionX: true,
+      backgroundPositionY: true,
+      backgroundRepeat: true
+    },
+    backgroundPosition: {
+      backgroundPositionX: true,
+      backgroundPositionY: true
+    },
+    border: {
+      borderWidth: true,
+      borderStyle: true,
+      borderColor: true
+    },
+    borderBottom: {
+      borderBottomWidth: true,
+      borderBottomStyle: true,
+      borderBottomColor: true
+    },
+    borderLeft: {
+      borderLeftWidth: true,
+      borderLeftStyle: true,
+      borderLeftColor: true
+    },
+    borderRight: {
+      borderRightWidth: true,
+      borderRightStyle: true,
+      borderRightColor: true
+    },
+    borderTop: {
+      borderTopWidth: true,
+      borderTopStyle: true,
+      borderTopColor: true
+    },
+    font: {
+      fontStyle: true,
+      fontVariant: true,
+      fontWeight: true,
+      fontSize: true,
+      lineHeight: true,
+      fontFamily: true
+    },
+    outline: {
+      outlineWidth: true,
+      outlineStyle: true,
+      outlineColor: true
+    }
+  };
+
+  var CSSProperty = {
+    isUnitlessNumber: isUnitlessNumber,
+    shorthandPropertyExpansions: shorthandPropertyExpansions
+  };
+
+  module.exports = CSSProperty;
+},{}],5:[function(_dereq_,module,exports){
+  /**
+   * Copyright 2013-2015, Facebook, Inc.
+   * All rights reserved.
+   *
+   * This source code is licensed under the BSD-style license found in the
+   * LICENSE file in the root directory of this source tree. An additional grant
+   * of patent rights can be found in the PATENTS file in the same directory.
+   *
+   * @providesModule CSSPropertyOperations
+   * @typechecks static-only
+   */
 
-'use strict';
+  'use strict';
 
-var CSSProperty = _dereq_(5);
-var ExecutionEnvironment = _dereq_(22);
+  var CSSProperty = _dereq_(4);
+  var ExecutionEnvironment = _dereq_(147);
+  var ReactPerf = _dereq_(78);
 
-var camelizeStyleName = _dereq_(121);
-var dangerousStyleValue = _dereq_(128);
-var hyphenateStyleName = _dereq_(148);
-var memoizeStringOnly = _dereq_(159);
-var warning = _dereq_(171);
+  var camelizeStyleName = _dereq_(149);
+  var dangerousStyleValue = _dereq_(119);
+  var hyphenateStyleName = _dereq_(160);
+  var memoizeStringOnly = _dereq_(168);
+  var warning = _dereq_(173);
 
-var processStyleName = memoizeStringOnly(function(styleName) {
-  return hyphenateStyleName(styleName);
-});
+  var processStyleName = memoizeStringOnly(function (styleName) {
+    return hyphenateStyleName(styleName);
+  });
 
-var styleFloatAccessor = 'cssFloat';
-if (ExecutionEnvironment.canUseDOM) {
-  // IE8 only supports accessing cssFloat (standard) as styleFloat
-  if (document.documentElement.style.cssFloat === undefined) {
-    styleFloatAccessor = 'styleFloat';
+  var hasShorthandPropertyBug = false;
+  var styleFloatAccessor = 'cssFloat';
+  if (ExecutionEnvironment.canUseDOM) {
+    var tempStyle = document.createElement('div').style;
+    try {
+      // IE8 throws "Invalid argument." if resetting shorthand style properties.
+      tempStyle.font = '';
+    } catch (e) {
+      hasShorthandPropertyBug = true;
+    }
+    // IE8 only supports accessing cssFloat (standard) as styleFloat
+    if (document.documentElement.style.cssFloat === undefined) {
+      styleFloatAccessor = 'styleFloat';
+    }
   }
-}
 
-if ("production" !== "development") {
-  // 'msTransform' is correct, but the other prefixes should be capitalized
-  var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
+  if ("development" !== 'production') {
+    // 'msTransform' is correct, but the other prefixes should be capitalized
+    var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
 
-  // style values shouldn't contain a semicolon
-  var badStyleValueWithSemicolonPattern = /;\s*$/;
+    // style values shouldn't contain a semicolon
+    var badStyleValueWithSemicolonPattern = /;\s*$/;
 
-  var warnedStyleNames = {};
-  var warnedStyleValues = {};
+    var warnedStyleNames = {};
+    var warnedStyleValues = {};
 
-  var warnHyphenatedStyleName = function(name) {
-    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
-      return;
-    }
+    var warnHyphenatedStyleName = function (name) {
+      if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
+        return;
+      }
 
-    warnedStyleNames[name] = true;
-    ("production" !== "development" ? warning(
-      false,
-      'Unsupported style property %s. Did you mean %s?',
-      name,
-      camelizeStyleName(name)
-    ) : null);
-  };
+      warnedStyleNames[name] = true;
+      "development" !== 'production' ? warning(false, 'Unsupported style property %s. Did you mean %s?', name, camelizeStyleName(name)) : undefined;
+    };
 
-  var warnBadVendoredStyleName = function(name) {
-    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
-      return;
-    }
+    var warnBadVendoredStyleName = function (name) {
+      if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
+        return;
+      }
 
-    warnedStyleNames[name] = true;
-    ("production" !== "development" ? warning(
-      false,
-      'Unsupported vendor-prefixed style property %s. Did you mean %s?',
-      name,
-      name.charAt(0).toUpperCase() + name.slice(1)
-    ) : null);
-  };
+      warnedStyleNames[name] = true;
+      "development" !== 'production' ? warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)) : undefined;
+    };
 
-  var warnStyleValueWithSemicolon = function(name, value) {
-    if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
-      return;
-    }
+    var warnStyleValueWithSemicolon = function (name, value) {
+      if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
+        return;
+      }
 
-    warnedStyleValues[value] = true;
-    ("production" !== "development" ? warning(
-      false,
-      'Style property values shouldn\'t contain a semicolon. ' +
-      'Try "%s: %s" instead.',
-      name,
-      value.replace(badStyleValueWithSemicolonPattern, '')
-    ) : null);
-  };
+      warnedStyleValues[value] = true;
+      "development" !== 'production' ? warning(false, 'Style property values shouldn\'t contain a semicolon. ' + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')) : undefined;
+    };
+
+    /**
+     * @param {string} name
+     * @param {*} value
+     */
+    var warnValidStyle = function (name, value) {
+      if (name.indexOf('-') > -1) {
+        warnHyphenatedStyleName(name);
+      } else if (badVendoredStyleNamePattern.test(name)) {
+        warnBadVendoredStyleName(name);
+      } else if (badStyleValueWithSemicolonPattern.test(value)) {
+        warnStyleValueWithSemicolon(name, value);
+      }
+    };
+  }
 
   /**
-   * @param {string} name
-   * @param {*} value
+   * Operations for dealing with CSS properties.
    */
-  var warnValidStyle = function(name, value) {
-    if (name.indexOf('-') > -1) {
-      warnHyphenatedStyleName(name);
-    } else if (badVendoredStyleNamePattern.test(name)) {
-      warnBadVendoredStyleName(name);
-    } else if (badStyleValueWithSemicolonPattern.test(value)) {
-      warnStyleValueWithSemicolon(name, value);
+  var CSSPropertyOperations = {
+
+    /**
+     * Serializes a mapping of style properties for use as inline styles:
+     *
+     *   > createMarkupForStyles({width: '200px', height: 0})
+     *   "width:200px;height:0;"
+     *
+     * Undefined values are ignored so that declarative programming is easier.
+     * The result should be HTML-escaped before insertion into the DOM.
+     *
+     * @param {object} styles
+     * @return {?string}
+     */
+    createMarkupForStyles: function (styles) {
+      var serialized = '';
+      for (var styleName in styles) {
+        if (!styles.hasOwnProperty(styleName)) {
+          continue;
+        }
+        var styleValue = styles[styleName];
+        if ("development" !== 'production') {
+          warnValidStyle(styleName, styleValue);
+        }
+        if (styleValue != null) {
+          serialized += processStyleName(styleName) + ':';
+          serialized += dangerousStyleValue(styleName, styleValue) + ';';
+        }
+      }
+      return serialized || null;
+    },
+
+    /**
+     * Sets the value for multiple styles on a node.  If a value is specified as
+     * '' (empty string), the corresponding style property will be unset.
+     *
+     * @param {DOMElement} node
+     * @param {object} styles
+     */
+    setValueForStyles: function (node, styles) {
+      var style = node.style;
+      for (var styleName in styles) {
+        if (!styles.hasOwnProperty(styleName)) {
+          continue;
+        }
+        if ("development" !== 'production') {
+          warnValidStyle(styleName, styles[styleName]);
+        }
+        var styleValue = dangerousStyleValue(styleName, styles[styleName]);
+        if (styleName === 'float') {
+          styleName = styleFloatAccessor;
+        }
+        if (styleValue) {
+          style[styleName] = styleValue;
+        } else {
+          var expansion = hasShorthandPropertyBug && CSSProperty.shorthandPropertyExpansions[styleName];
+          if (expansion) {
+            // Shorthand property that IE8 won't like unsetting, so unset each
+            // component to placate it
+            for (var individualStyleName in expansion) {
+              style[individualStyleName] = '';
+            }
+          } else {
+            style[styleName] = '';
+          }
+        }
+      }
     }
+
   };
-}
 
-/**
- * Operations for dealing with CSS properties.
- */
-var CSSPropertyOperations = {
+  ReactPerf.measureMethods(CSSPropertyOperations, 'CSSPropertyOperations', {
+    setValueForStyles: 'setValueForStyles'
+  });
 
+  module.exports = CSSPropertyOperations;
+},{"119":119,"147":147,"149":149,"160":160,"168":168,"173":173,"4":4,"78":78}],6:[function(_dereq_,module,exports){
   /**
-   * Serializes a mapping of style properties for use as inline styles:
+   * Copyright 2013-2015, Facebook, Inc.
+   * All rights reserved.
    *
-   *   > createMarkupForStyles({width: '200px', height: 0})
-   *   "width:200px;height:0;"
+   * This source code is licensed under the BSD-style license found in the
+   * LICENSE file in the root directory of this source tree. An additional grant
+   * of patent rights can be found in the PATENTS file in the same directory.
    *
-   * Undefined values are ignored so that declarative programming is easier.
-   * The result should be HTML-escaped before insertion into the DOM.
-   *
-   * @param {object} styles
-   * @return {?string}
+   * @providesModule CallbackQueue
    */
-  createMarkupForStyles: function(styles) {
-    var serialized = '';
-    for (var styleName in styles) {
-      if (!styles.hasOwnProperty(styleName)) {
-        continue;
-      }
-      var styleValue = styles[styleName];
-      if ("production" !== "development") {
-        warnValidStyle(styleName, styleValue);
-      }
-      if (styleValue != null) {
-        serialized += processStyleName(styleName) + ':';
-        serialized += dangerousStyleValue(styleName, styleValue) + ';';
-      }
-    }
-    return serialized || null;
-  },
+
+  'use strict';
+
+  var PooledClass = _dereq_(25);
+
+  var assign = _dereq_(24);
+  var invariant = _dereq_(161);
 
   /**
-   * Sets the value for multiple styles on a node.  If a value is specified as
-   * '' (empty string), the corresponding style property will be unset.
+   * A specialized pseudo-event module to help keep track of components waiting to
+   * be notified when their DOM representations are available for use.
    *
-   * @param {DOMElement} node
-   * @param {object} styles
+   * This implements `PooledClass`, so you should never need to instantiate this.
+   * Instead, use `CallbackQueue.getPooled()`.
+   *
+   * @class ReactMountReady
+   * @implements PooledClass
+   * @internal
    */
-  setValueForStyles: function(node, styles) {
-    var style = node.style;
-    for (var styleName in styles) {
-      if (!styles.hasOwnProperty(styleName)) {
-        continue;
-      }
-      if ("production" !== "development") {
-        warnValidStyle(styleName, styles[styleName]);
-      }
-      var styleValue = dangerousStyleValue(styleName, styles[styleName]);
-      if (styleName === 'float') {
-        styleName = styleFloatAccessor;
-      }
-      if (styleValue) {
-        style[styleName] = styleValue;
-      } else {
-        var expansion = CSSProperty.shorthandPropertyExpansions[styleName];
-        if (expansion) {
-          // Shorthand property that IE8 won't like unsetting, so unset each
-          // component to placate it
-          for (var individualStyleName in expansion) {
-            style[individualStyleName] = '';
-          }
-        } else {
-          style[styleName] = '';
-        }
-      }
-    }
+  function CallbackQueue() {
+    this._callbacks = null;
+    this._contexts = null;
   }
 
-};
-
-module.exports = CSSPropertyOperations;
+  assign(CallbackQueue.prototype, {
 
-},{"121":121,"128":128,"148":148,"159":159,"171":171,"22":22,"5":5}],7:[function(_dereq_,module,exports){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule CallbackQueue
- */
+    /**
+     * Enqueues a callback to be invoked when `notifyAll` is invoked.
+     *
+     * @param {function} callback Invoked when `notifyAll` is invoked.
+     * @param {?object} context Context to call `callback` with.
+     * @internal
+     */
+    enqueue: function (callback, context) {
+      this._callbacks = this._callbacks || [];
+      this._contexts = this._contexts || [];
+      this._callbacks.push(callback);
+      this._contexts.push(context);
+    },
 
-'use strict';
+    /**
+     * Invokes all enqueued callbacks and clears the queue. This is invoked after
+     * the DOM representation of a component has been created or updated.
+     *
+     * @internal
+     */
+    notifyAll: function () {
+      var callbacks = this._callbacks;
+      var contexts = this._contexts;
+      if (callbacks) {
+        !(callbacks.length === contexts.length) ? "development" !== 'production' ? invariant(false, 'Mismatched list of contexts in callback queue') : invariant(false) : undefined;
+        this._callbacks = null;
+        this._contexts = null;
+        for (var i = 0; i < callbacks.length; i++) {
+          callbacks[i].call(contexts[i]);
+        }
+        callbacks.length = 0;
+        contexts.length = 0;
+      }
+    },
 
-var PooledClass = _dereq_(30);
+    /**
+     * Resets the internal queue.
+     *
+     * @internal
+     */
+    reset: function () {
+      this._callbacks = null;
+      this._contexts = null;
+    },
 
-var assign = _dereq_(29);
-var invariant = _dereq_(150);
+    /**
+     * `PooledClass` looks for this.
+     */
+    destructor: function () {
+      this.reset();
+    }
 
-/**
- * A specialized pseudo-event module to help keep track of components waiting to
- * be notified when their DOM representations are available for use.
- *
- * This implements `PooledClass`, so you should never need to instantiate this.
- * Instead, use `CallbackQueue.getPooled()`.
- *
- * @class ReactMountReady
- * @implements PooledClass
- * @internal
- */
-function CallbackQueue() {
-  this._callbacks = null;
-  this._contexts = null;
-}
+  });
 
-assign(CallbackQueue.prototype, {
+  PooledClass.addPoolingTo(CallbackQueue);
 
+  module.exports = CallbackQueue;
+},{"161":161,"24":24,"25":25}],7:[function(_dereq_,module,exports){
   /**
-   * Enqueues a callback to be invoked when `notifyAll` is invoked.
+   * Copyright 2013-2015, Facebook, Inc.
+   * All rights reserved.
    *
-   * @param {function} callback Invoked when `notifyAll` is invoked.
-   * @param {?object} context Context to call `callback` with.
-   * @internal
-   */
-  enqueue: function(callback, context) {
-    this._callbacks = this._callbacks || [];
-    this._contexts = this._contexts || [];
-    this._callbacks.push(callback);
-    this._contexts.push(context);
-  },
-
-  /**
-   * Invokes all enqueued callbacks and clears the queue. This is invoked after
-   * the DOM representation of a component has been created or updated.
+   * This source code is licensed under the BSD-style license found in the
+   * LICENSE file in the root directory of this source tree. An additional grant
+   * of patent rights can be found in the PATENTS file in the same directory.
    *
-   * @internal
+   * @providesModule ChangeEventPlugin
    */
-  notifyAll: function() {
-    var callbacks = this._callbacks;
-    var contexts = this._contexts;
-    if (callbacks) {
-      ("production" !== "development" ? invariant(
-        callbacks.length === contexts.length,
-        'Mismatched list of contexts in callback queue'
-      ) : invariant(callbacks.length === contexts.length));
-      this._callbacks = null;
-      this._contexts = null;
-      for (var i = 0, l = callbacks.length; i < l; i++) {
-        callbacks[i].call(contexts[i]);
-      }
-      callbacks.length = 0;
-      contexts.length = 0;
+
+  'use strict';
+
+  var EventConstants = _dereq_(15);
+  var EventPluginHub = _dereq_(16);
+  var EventPropagators = _dereq_(19);
+  var ExecutionEnvironment = _dereq_(147);
+  var ReactUpdates = _dereq_(96);
+  var SyntheticEvent = _dereq_(105);
+
+  var getEventTarget = _dereq_(128);
+  var isEventSupported = _dereq_(133);
+  var isTextInputElement = _dereq_(134);
+  var keyOf = _dereq_(166);
+
+  var topLevelTypes = EventConstants.topLevelTypes;
+
+  var eventTypes = {
+    change: {
+      phasedRegistrationNames: {
+        bubbled: keyOf({ onChange: null }),
+        captured: keyOf({ onChangeCapture: null })
+      },
+      dependencies: [topLevelTypes.topBlur, topLevelTypes.topChange, topLevelTypes.topClick, topLevelTypes.topFocus, topLevelTypes.topInput, topLevelTypes.topKeyDown, topLevelTypes.topKeyUp, topLevelTypes.topSelectionChange]
     }
-  },
+  };
 
   /**
-   * Resets the internal queue.
-   *
-   * @internal
+   * For IE shims
    */
-  reset: function() {
-    this._callbacks = null;
-    this._contexts = null;
-  },
+  var activeElement = null;
+  var activeElementID = null;
+  var activeElementValue = null;
+  var activeElementValueProp = null;
 
   /**
-   * `PooledClass` looks for this.
+   * SECTION: handle `change` event
    */
-  destructor: function() {
-    this.reset();
+  function shouldUseChangeEvent(elem) {
+    var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
+    return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';
   }
 
-});
+  var doesChangeEventBubble = false;
+  if (ExecutionEnvironment.canUseDOM) {
+    // See `handleChange` comment below
+    doesChangeEventBubble = isEventSupported('change') && (!('documentMode' in document) || document.documentMode > 8);
+  }
 
-PooledClass.addPoolingTo(CallbackQueue);
+  function manualDispatchChangeEvent(nativeEvent) {
+    var event = SyntheticEvent.getPooled(eventTypes.change, activeElementID, nativeEvent, getEventTarget(nativeEvent));
+    EventPropagators.accumulateTwoPhaseDispatches(event);
 
-module.exports = CallbackQueue;
+    // If change and propertychange bubbled, we'd just bind to it like all the
+    // other events and have it go through ReactBrowserEventEmitter. Since it
+    // doesn't, we manually listen for the events and so we have to enqueue and
+    // process the abstract event manually.
+    //
+    // Batching is necessary here in order to ensure that all event handlers run
+    // before the next rerender (including event handlers attached to ancestor
+    // elements instead of directly on the input). Without this, controlled
+    // components don't work properly in conjunction with event bubbling because
+    // the component is rerendered and the value reverted before all the event
+    // handlers can run. See https://github.com/facebook/react/issues/708.
+    ReactUpdates.batchedUpdates(runEventInBatch, event);
+  }
 
-},{"150":150,"29":29,"30":30}],8:[function(_dereq_,module,exports){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule ChangeEventPlugin
- */
+  function runEventInBatch(event) {
+    EventPluginHub.enqueueEvents(event);
+    EventPluginHub.processEventQueue(false);
+  }
 
-'use strict';
+  function startWatchingForChangeEventIE8(target, targetID) {
+    activeElement = target;
+    activeElementID = targetID;
+    activeElement.attachEvent('onchange', manualDispatchChangeEvent);
+  }
 
-var EventConstants = _dereq_(16);
-var EventPluginHub = _dereq_(18);
-var EventPropagators = _dereq_(21);
-var ExecutionEnvironment = _dereq_(22);
-var ReactUpdates = _dereq_(100);
-var SyntheticEvent = _dereq_(108);
+  function stopWatchingForChangeEventIE8() {
+    if (!activeElement) {
+      return;
+    }
+    activeElement.detachEvent('onchange', manualDispatchChangeEvent);
+    activeElement = null;
+    activeElementID = null;
+  }
 
-var isEventSupported = _dereq_(151);
-var isTextInputElement = _dereq_(153);
-var keyOf = _dereq_(157);
+  function getTargetIDForChangeEvent(topLevelType, topLevelTarget, topLevelTargetID) {
+    if (topLevelType === topLevelTypes.topChange) {
+      return topLevelTargetID;
+    }
+  }
+  function handleEventsForChangeEventIE8(topLevelType, topLevelTarget, topLevelTargetID) {
+    if (topLevelType === topLevelTypes.topFocus) {
+      // stopWatching() should be a noop here but we call it just in case we
+      // missed a blur event somehow.
+      stopWatchingForChangeEventIE8();
+      startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID);
+    } else if (topLevelType === topLevelTypes.topBlur) {
+      stopWatchingForChangeEventIE8();
+    }
+  }
 
-var topLevelTypes = EventConstants.topLevelTypes;
+  /**
+   * SECTION: handle `input` event
+   */
+  var isInputEventSupported = false;
+  if (ExecutionEnvironment.canUseDOM) {
+    // IE9 claims to support the input event but fails to trigger it when
+    // deleting text, so we ignore its input events
+    isInputEventSupported = isEventSupported('input') && (!('documentMode' in document) || document.documentMode > 9);
+  }
 
-var eventTypes = {
-  change: {
-    phasedRegistrationNames: {
-      bubbled: keyOf({onChange: null}),
-      captured: keyOf({onChangeCapture: null})
+  /**
+   * (For old IE.) Replacement getter/setter for the `value` property that gets
+   * set on the active element.
+   */
+  var newValueProp = {
+    get: function () {
+      return activeElementValueProp.get.call(this);
     },
-    dependencies: [
-      topLevelTypes.topBlur,
-      topLevelTypes.topChange,
-      topLevelTypes.topClick,
-      topLevelTypes.topFocus,
-      topLevelTypes.topInput,
-      topLevelTypes.topKeyDown,
-      topLevelTypes.topKeyUp,
-      topLevelTypes.topSelectionChange
-    ]
-  }
-};
+    set: function (val) {
+      // Cast to a string so we can do equality checks.
+      activeElementValue = '' + val;
+      activeElementValueProp.set.call(this, val);
+    }
+  };
 
-/**
- * For IE shims
- */
-var activeElement = null;
-var activeElementID = null;
-var activeElementValue = null;
-var activeElementValueProp = null;
+  /**
+   * (For old IE.) Starts tracking propertychange events on the passed-in element
+   * and override the value property so that we can distinguish user events from
+   * value changes in JS.
+   */
+  function startWatchingForValueChange(target, targetID) {
+    activeElement = target;
+    activeElementID = targetID;
+    activeElementValue = target.value;
+    activeElementValueProp = Object.getOwnPropertyDescriptor(target.constructor.prototype, 'value');
 
-/**
- * SECTION: handle `change` event
- */
-function shouldUseChangeEvent(elem) {
-  return (
-    elem.nodeName === 'SELECT' ||
-    (elem.nodeName === 'INPUT' && elem.type === 'file')
-  );
-}
-
-var doesChangeEventBubble = false;
-if (ExecutionEnvironment.canUseDOM) {
-  // See `handleChange` comment below
-  doesChangeEventBubble = isEventSupported('change') && (
-    (!('documentMode' in document) || document.documentMode > 8)
-  );
-}
-
-function manualDispatchChangeEvent(nativeEvent) {
-  var event = SyntheticEvent.getPooled(
-    eventTypes.change,
-    activeElementID,
-    nativeEvent
-  );
-  EventPropagators.accumulateTwoPhaseDispatches(event);
-
-  // If change and propertychange bubbled, we'd just bind to it like all the
-  // other events and have it go through ReactBrowserEventEmitter. Since it
-  // doesn't, we manually listen for the events and so we have to enqueue and
-  // process the abstract event manually.
-  //
-  // Batching is necessary here in order to ensure that all event handlers run
-  // before the next rerender (including event handlers attached to ancestor
-  // elements instead of directly on the input). Without this, controlled
-  // components don't work properly in conjunction with event bubbling because
-  // the component is rerendered and the value reverted before all the event
-  // handlers can run. See https://github.com/facebook/react/issues/708.
-  ReactUpdates.batchedUpdates(runEventInBatch, event);
-}
-
-function runEventInBatch(event) {
-  EventPluginHub.enqueueEvents(event);
-  EventPluginHub.processEventQueue();
-}
-
-function startWatchingForChangeEventIE8(target, targetID) {
-  activeElement = target;
-  activeElementID = targetID;
-  activeElement.attachEvent('onchange', manualDispatchChangeEvent);
-}
-
-function stopWatchingForChangeEventIE8() {
-  if (!activeElement) {
-    return;
-  }
-  activeElement.detachEvent('onchange', manualDispatchChangeEvent);
-  activeElement = null;
-  activeElementID = null;
-}
-
-function getTargetIDForChangeEvent(
-    topLevelType,
-    topLevelTarget,
-    topLevelTargetID) {
-  if (topLevelType === topLevelTypes.topChange) {
-    return topLevelTargetID;
-  }
-}
-function handleEventsForChangeEventIE8(
-    topLevelType,
-    topLevelTarget,
-    topLevelTargetID) {
-  if (topLevelType === topLevelTypes.topFocus) {
-    // stopWatching() should be a noop here but we call it just in case we
-    // missed a blur event somehow.
-    stopWatchingForChangeEventIE8();
-    startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID);
-  } else if (topLevelType === topLevelTypes.topBlur) {
-    stopWatchingForChangeEventIE8();
-  }
-}
+    // Not guarded in a canDefineProperty check: IE8 supports defineProperty only
+    // on DOM elements
+    Object.defineProperty(activeElement, 'value', newValueProp);
+    activeElement.attachEvent('onpropertychange', handlePropertyChange);
+  }
 
+  /**
+   * (For old IE.) Removes the event listeners from the currently-tracked element,
+   * if any exists.
+   */
+  function stopWatchingForValueChange() {
+    if (!activeElement) {
+      return;
+    }
 
-/**
- * SECTION: handle `input` event
- */
-var isInputEventSupported = false;
-if (ExecutionEnvironment.canUseDOM) {
-  // IE9 claims to support the input event but fails to trigger it when
-  // deleting text, so we ignore its input events
-  isInputEventSupported = isEventSupported('input') && (
-    (!('documentMode' in document) || document.documentMode > 9)
-  );
-}
+    // delete restores the original property definition
+    delete activeElement.value;
+    activeElement.detachEvent('onpropertychange', handlePropertyChange);
 
-/**
- * (For old IE.) Replacement getter/setter for the `value` property that gets
- * set on the active element.
- */
-var newValueProp =  {
-  get: function() {
-    return activeElementValueProp.get.call(this);
-  },
-  set: function(val) {
-    // Cast to a string so we can do equality checks.
-    activeElementValue = '' + val;
-    activeElementValueProp.set.call(this, val);
+    activeElement = null;
+    activeElementID = null;
+    activeElementValue = null;
+    activeElementValueProp = null;
   }
-};
 
-/**
- * (For old IE.) Starts tracking propertychange events on the passed-in element
- * and override the value property so that we can distinguish user events from
- * value changes in JS.
- */
-function startWatchingForValueChange(target, targetID) {
-  activeElement = target;
-  activeElementID = targetID;
-  activeElementValue = target.value;
-  activeElementValueProp = Object.getOwnPropertyDescriptor(
-    target.constructor.prototype,
-    'value'
-  );
-
-  Object.defineProperty(activeElement, 'value', newValueProp);
-  activeElement.attachEvent('onpropertychange', handlePropertyChange);
-}
+  /**
+   * (For old IE.) Handles a propertychange event, sending a `change` event if
+   * the value of the active element has changed.
+   */
+  function handlePropertyChange(nativeEvent) {
+    if (nativeEvent.propertyName !== 'value') {
+      return;
+    }
+    var value = nativeEvent.srcElement.value;
+    if (value === activeElementValue) {
+      return;
+    }
+    activeElementValue = value;
 
-/**
- * (For old IE.) Removes the event listeners from the currently-tracked element,
- * if any exists.
- */
-function stopWatchingForValueChange() {
-  if (!activeElement) {
-    return;
+    manualDispatchChangeEvent(nativeEvent);
   }
 
-  // delete restores the original property definition
-  delete activeElement.value;
-  activeElement.detachEvent('onpropertychange', handlePropertyChange);
-
-  activeElement = null;
-  activeElementID = null;
-  activeElementValue = null;
-  activeElementValueProp = null;
-}
-
-/**
- * (For old IE.) Handles a propertychange event, sending a `change` event if
- * the value of the active element has changed.
- */
-function handlePropertyChange(nativeEvent) {
-  if (nativeEvent.propertyName !== 'value') {
-    return;
-  }
-  var value = nativeEvent.srcElement.value;
-  if (value === activeElementValue) {
-    return;
+  /**
+   * If a `change` event should be fired, returns the target's ID.
+   */
+  function getTargetIDForInputEvent(topLevelType, topLevelTarget, topLevelTargetID) {
+    if (topLevelType === topLevelTypes.topInput) {
+      // In modern browsers (i.e., not IE8 or IE9), the input event is exactly
+      // what we want so fall through here and trigger an abstract event
+      return topLevelTargetID;
+    }
   }
-  activeElementValue = value;
-
-  manualDispatchChangeEvent(nativeEvent);
-}
 
-/**
- * If a `change` event should be fired, returns the target's ID.
- */
-function getTargetIDForInputEvent(
-    topLevelType,
-    topLevelTarget,
-    topLevelTargetID) {
-  if (topLevelType === topLevelTypes.topInput) {
-    // In modern browsers (i.e., not IE8 or IE9), the input event is exactly
-    // what we want so fall through here and trigger an abstract event
-    return topLevelTargetID;
+// For IE8 and IE9.
+  function handleEventsForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) {
+    if (topLevelType === topLevelTypes.topFocus) {
+      // In IE8, we can capture almost all .value changes by adding a
+      // propertychange handler and looking for events with propertyName
+      // equal to 'value'
+      // In IE9, propertychange fires for most input events but is buggy and
+      // doesn't fire when text is deleted, but conveniently, selectionchange
+      // appears to fire in all of the remaining cases so we catch those and
+      // forward the event if the value has changed
+      // In either case, we don't want to call the event handler if the value
+      // is changed from JS so we redefine a setter for `.value` that updates
+      // our activeElementValue variable, allowing us to ignore those changes
+      //
+      // stopWatching() should be a noop here but we call it just in case we
+      // missed a blur event somehow.
+      stopWatchingForValueChange();
+      startWatchingForValueChange(topLevelTarget, topLevelTargetID);
+    } else if (topLevelType === topLevelTypes.topBlur) {
+      stopWatchingForValueChange();
+    }
   }
-}
 
 // For IE8 and IE9.
-function handleEventsForInputEventIE(
-    topLevelType,
-    topLevelTarget,
-    topLevelTargetID) {
-  if (topLevelType === topLevelTypes.topFocus) {
-    // In IE8, we can capture almost all .value changes by adding a
-    // propertychange handler and looking for events with propertyName
-    // equal to 'value'
-    // In IE9, propertychange fires for most input events but is buggy and
-    // doesn't fire when text is deleted, but conveniently, selectionchange
-    // appears to fire in all of the remaining cases so we catch those and
-    // forward the event if the value has changed
-    // In either case, we don't want to call the event handler if the value
-    // is changed from JS so we redefine a setter for `.value` that updates
-    // our activeElementValue variable, allowing us to ignore those changes
-    //
-    // stopWatching() should be a noop here but we call it just in case we
-    // missed a blur event somehow.
-    stopWatchingForValueChange();
-    startWatchingForValueChange(topLevelTarget, topLevelTargetID);
-  } else if (topLevelType === topLevelTypes.topBlur) {
-    stopWatchingForValueChange();
+  function getTargetIDForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) {
+    if (topLevelType === topLevelTypes.topSelectionChange || topLevelType === topLevelTypes.topKeyUp || topLevelType === topLevelTypes.topKeyDown) {
+      // On the selectionchange event, the target is just document which isn't
+      // helpful for us so just check activeElement instead.
+      //
+      // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
+      // propertychange on the first input event after setting `value` from a
+      // script and fires only keydown, keypress, keyup. Catching keyup usually
+      // gets it and catching keydown lets us fire an event for the first
+      // keystroke if user does a key repeat (it'll be a little delayed: right
+      // before the second keystroke). Other input methods (e.g., paste) seem to
+      // fire selectionchange normally.
+      if (activeElement && activeElement.value !== activeElementValue) {
+        activeElementValue = activeElement.value;
+        return activeElementID;
+      }
+    }
   }
-}
 
-// For IE8 and IE9.
-function getTargetIDForInputEventIE(
-    topLevelType,
-    topLevelTarget,
-    topLevelTargetID) {
-  if (topLevelType === topLevelTypes.topSelectionChange ||
-      topLevelType === topLevelTypes.topKeyUp ||
-      topLevelType === topLevelTypes.topKeyDown) {
-    // On the selectionchange event, the target is just document which isn't
-    // helpful for us so just check activeElement instead.
-    //
-    // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
-    // propertychange on the first input event after setting `value` from a
-    // script and fires only keydown, keypress, keyup. Catching keyup usually
-    // gets it and catching keydown lets us fire an event for the first
-    // keystroke if user does a key repeat (it'll be a little delayed: right
-    // before the second keystroke). Other input methods (e.g., paste) seem to
-    // fire selectionchange normally.
-    if (activeElement && activeElement.value !== activeElementValue) {
-      activeElementValue = activeElement.value;
-      return activeElementID;
+  /**
+   * SECTION: handle `click` event
+   */
+  function shouldUseClickEvent(elem) {
+    // Use the `click` event to detect changes to checkbox and radio inputs.
+    // This approach works across all browsers, whereas `change` does not fire
+    // until `blur` in IE8.
+    return elem.nodeName && elem.nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');
+  }
+
+  function getTargetIDForClickEvent(topLevelType, topLevelTarget, topLevelTargetID) {
+    if (topLevelType === topLevelTypes.topClick) {
+      return topLevelTargetID;
     }
   }
-}
 
+  /**
+   * This plugin creates an `onChange` event that normalizes change events
+   * across form elements. This event fires at a time when it's possible to
+   * change the element's value without seeing a flicker.
+   *
+   * Supported elements are:
+   * - input (see `isTextInputElement`)
+   * - textarea
+   * - select
+   */
+  var ChangeEventPlugin = {
 
-/**
- * SECTION: handle `click` event
- */
-function shouldUseClickEvent(elem) {
-  // Use the `click` event to detect changes to checkbox and radio inputs.
-  // This approach works across all browsers, whereas `change` does not fire
-  // until `blur` in IE8.
-  return (
-    elem.nodeName === 'INPUT' &&
-    (elem.type === 'checkbox' || elem.type === 'radio')
-  );
-}
-
-function getTargetIDForClickEvent(
-    topLevelType,
-    topLevelTarget,
-    topLevelTargetID) {
-  if (topLevelType === topLevelTypes.topClick) {
-    return topLevelTargetID;
-  }
-}
+    eventTypes: eventTypes,
 
-/**
- * This plugin creates an `onChange` event that normalizes change events
- * across form elements. This event fires at a time when it's possible to
- * change the element's value without seeing a flicker.
- *
- * Supported elements are:
- * - input (see `isTextInputElement`)
- * - textarea
- * - select
- */
-var ChangeEventPlugin = {
+    /**
+     * @param {string} topLevelType Record from `EventConstants`.
+     * @param {DOMEventTarget} topLevelTarget The listening component root node.
+     * @param {string} topLevelTargetID ID of `topLevelTarget`.
+     * @param {object} nativeEvent Native browser event.
+     * @return {*} An accumulation of synthetic events.
+     * @see {EventPluginHub.extractEvents}
+     */
+    extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
 
-  eventTypes: eventTypes,
+      var getTargetIDFunc, handleEventFunc;
+      if (shouldUseChangeEvent(topLevelTarget)) {
+        if (doesChangeEventBubble) {
+          getTargetIDFunc = getTargetIDForChangeEvent;
+        } else {
+          handleEventFunc = handleEventsForChangeEventIE8;
+        }
+      } else if (isTextInputElement(topLevelTarget)) {
+        if (isInputEventSupported) {
+          getTargetIDFunc = getTargetIDForInputEvent;
+        } else {
+          getTargetIDFunc = getTargetIDForInputEventIE;
+          handleEventFunc = handleEventsForInputEventIE;
+        }
+      } else if (shouldUseClickEvent(topLevelTarget)) {
+        getTargetIDFunc = getTargetIDForClickEvent;
+      }
 
-  /**
-   * @param {string} topLevelType Record from `EventConstants`.
-   * @param {DOMEventTarget} topLevelTarget The listening component root node.
-   * @param {string} topLevelTargetID ID of `topLevelTarget`.
-   * @param {object} nativeEvent Native browser event.
-   * @return {*} An accumulation of synthetic events.
-   * @see {EventPluginHub.extractEvents}
-   */
-  extractEvents: function(
-      topLevelType,
-      topLevelTarget,
-      topLevelTargetID,
-      nativeEvent) {
-
-    var getTargetIDFunc, handleEventFunc;
-    if (shouldUseChangeEvent(topLevelTarget)) {
-      if (doesChangeEventBubble) {
-        getTargetIDFunc = getTargetIDForChangeEvent;
-      } else {
-        handleEventFunc = handleEventsForChangeEventIE8;
+      if (getTargetIDFunc) {
+        var targetID = getTargetIDFunc(topLevelType, topLevelTarget, topLevelTargetID);
+        if (targetID) {
+          var event = SyntheticEvent.getPooled(eventTypes.change, targetID, nativeEvent, nativeEventTarget);
+          event.type = 'change';
+          EventPropagators.accumulateTwoPhaseDispatches(event);
+          return event;
+        }
       }
-    } else if (isTextInputElement(topLevelTarget)) {
-      if (isInputEventSupported) {
-        getTargetIDFunc = getTargetIDForInputEvent;
-      } else {
-        getTargetIDFunc = getTargetIDForInputEventIE;
-        handleEventFunc = handleEventsForInputEventIE;
+
+      if (handleEventFunc) {
+        handleEventFunc(topLevelType, topLevelTarget, topLevelTargetID);
       }
-    } else if (shouldUseClickEvent(topLevelTarget)) {
-      getTargetIDFunc = getTargetIDForClickEvent;
     }
 
-    if (getTargetIDFunc) {
-      var targetID = getTargetIDFunc(
-        topLevelType,
-        topLevelTarget,
-        topLevelTargetID
-      );
-      if (targetID) {
-        var event = SyntheticEvent.getPooled(
-          eventTypes.change,
-          targetID,
-          nativeEvent
-        );
-        EventPropagators.accumulateTwoPhaseDispatches(event);
-        return event;
-      }
-    }
-
-    if (handleEventFunc) {
-      handleEventFunc(
-        topLevelType,
-        topLevelTarget,
-        topLevelTargetID
-      );
-    }
-  }
-
-};
-
-module.exports = ChangeEventPlugin;
-
-},{"100":100,"108":108,"151":151,"153":153,"157":157,"16":16,"18":18,"21":21,"22":22}],9:[function(_dereq_,module,exports){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule ClientReactRootIndex
- * @typechecks
- */
-
-'use strict';
-
-var nextReactRootIndex = 0;
-
-var ClientReactRootIndex = {
-  createReactRootIndex: function() {
-    return nextReactRootIndex++;
-  }
-};
-
-module.exports = ClientReactRootIndex;
+  };
 
-},{}],10:[function(_dereq_,module,exports){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An ad

<TRUNCATED>

[2/6] fauxton commit: updated refs/heads/master to e6450a0

Posted by be...@apache.org.
removing react 14 warnings


Project: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/commit/e6450a0d
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/tree/e6450a0d
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/diff/e6450a0d

Branch: refs/heads/master
Commit: e6450a0d0c9710d79e96bc924c447b8cb12f01b8
Parents: cab6fc2
Author: Ben Keen <be...@gmail.com>
Authored: Tue Jan 19 10:33:45 2016 -0800
Committer: Ben Keen <be...@gmail.com>
Committed: Mon Feb 1 08:39:35 2016 -0800

----------------------------------------------------------------------
 app/addons/activetasks/components.react.jsx     | 34 ++++++------
 .../tests/activetasks.componentsSpec.react.jsx  | 13 ++---
 app/addons/auth/components.react.jsx            | 13 ++---
 .../auth/test/auth.componentsSpec.react.jsx     | 31 +++++------
 app/addons/cluster/tests/clusterSpec.react.jsx  | 10 ++--
 .../compaction/tests/componentsSpec.react.jsx   | 15 +++---
 .../components/react-components.react.jsx       | 25 +++++----
 .../tests/apiBarControllerSpec.react.jsx        | 31 +++++------
 .../components/tests/beautifySpec.react.jsx     | 14 ++---
 .../tests/codeEditorPanelSpec.react.jsx         | 13 ++---
 .../components/tests/codeEditorSpec.react.jsx   |  7 +--
 .../tests/confirmButtonSpec.react.jsx           | 12 ++---
 app/addons/components/tests/docSpec.react.jsx   | 32 ++++++------
 .../tests/headerTogglebuttonSpec.react.jsx      | 10 ++--
 .../tests/paddedBorderedBoxSpec.react.jsx       | 10 ++--
 .../tests/stringEditModalSpec.react.jsx         | 55 +++-----------------
 .../components/tests/styledSelectSpec.react.jsx | 10 ++--
 .../components/tests/zenModeSpec.react.jsx      | 17 +++---
 app/addons/cors/tests/componentsSpec.react.jsx  | 55 ++++++++++----------
 app/addons/databases/components.react.jsx       | 27 +++++-----
 .../databases/tests/componentsSpec.react.jsx    | 31 +++++------
 .../documents/changes/components.react.jsx      | 19 ++++---
 .../tests/changes.componentsSpec.react.jsx      | 53 ++++++++++---------
 .../documents/doc-editor/components.react.jsx   |  5 +-
 .../tests/doc-editor.componentsSpec.react.jsx   | 55 +++++++++-----------
 app/addons/documents/helpers.js                 |  6 ++-
 .../tests/viewIndex.componentsSpec.react.jsx    | 23 ++++----
 .../index-results.components.react.jsx          |  2 +-
 .../index-results.componentsSpec.react.jsx      | 40 +++++++-------
 .../mango/tests/mango.componentsSpec.react.jsx  | 25 +++++----
 .../tests/pagination.componentSpec.react.jsx    | 14 ++---
 .../queryoptions/queryoptions.react.jsx         | 11 ++--
 .../tests/queryoptions.componentsSpec.react.jsx | 21 ++++----
 app/addons/documents/sidebar/sidebar.react.jsx  | 10 ++--
 .../tests/sidebar.componentsSpec.react.jsx      | 11 ++--
 app/addons/documents/tests/helpersSpec.js       | 31 +++++++++++
 app/addons/fauxton/components.react.jsx         | 11 ++--
 .../fauxton/navigation/components.react.jsx     |  5 +-
 .../navigation/tests/componentsSpec.react.jsx   | 13 ++---
 .../notifications/notifications.react.jsx       | 11 ++--
 .../tests/componentsSpec.react.jsx              | 43 +++++++--------
 .../fauxton/tests/componentsSpec.react.jsx      | 25 ++++-----
 .../permissions/tests/componentsSpec.react.jsx  | 25 ++++-----
 .../setup/tests/setupComponentsSpec.react.jsx   | 21 ++++----
 .../tests/componentsSpec.react.jsx              | 21 ++++----
 app/config.js                                   |  1 +
 app/core/routeObject.js                         |  7 +--
 app/core/tests/routeObjectSpec.js               | 11 ++--
 48 files changed, 504 insertions(+), 481 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/activetasks/components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/activetasks/components.react.jsx b/app/addons/activetasks/components.react.jsx
index 7e65399..b8d294c 100644
--- a/app/addons/activetasks/components.react.jsx
+++ b/app/addons/activetasks/components.react.jsx
@@ -14,12 +14,13 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/activetasks/stores',
   'addons/activetasks/resources',
   'addons/activetasks/actions',
   'addons/components/react-components.react',
   'addons/fauxton/components.react'
-], function (app, FauxtonAPI, React, Stores, Resources, Actions, Components, ComponentsReact) {
+], function (app, FauxtonAPI, React, ReactDOM, Stores, Resources, Actions, Components, ComponentsReact) {
 
   var activeTasksStore = Stores.activeTasksStore;
   var ReactCSSTransitionGroup = React.addons.CSSTransitionGroup;
@@ -263,21 +264,20 @@ define([
       var th_class = 'header-field ' + this.props.headerName;
 
       return (
-        <input
-          type="radio"
-          name="header-field"
-          id={this.props.headerName}
-          value={this.props.headerName}
-          className="header-field radio"
-          onChange={this.onTableHeaderClick}>
-          <td className={th_class + " tableheader"} value={this.props.headerName}>
-            <label
-              className="header-field label-text active-tasks-header noselect"
-              htmlFor={this.props.headerName}>
-              {this.props.displayName} {arrow}
-            </label>
-          </td>
-        </input>
+        <td className={th_class + " tableheader"} value={this.props.headerName}>
+          <input
+            type="radio"
+            name="header-field"
+            id={this.props.headerName}
+            value={this.props.headerName}
+            className="header-field radio"
+            onChange={this.onTableHeaderClick} />
+          <label
+            className="header-field label-text active-tasks-header noselect"
+            htmlFor={this.props.headerName}>
+            {this.props.displayName} {arrow}
+          </label>
+        </td>
       );
     }
   });
@@ -396,7 +396,7 @@ define([
       e.preventDefault();
       this.refs.view_source_sequence_btn.toggle(function (shown) {
         if (shown) {
-          React.findDOMNode(this.refs.view_source_sequence_btn).focus();
+          ReactDOM.findDOMNode(this.refs.view_source_sequence_btn).focus();
         }
       }.bind(this));
     },

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/activetasks/tests/activetasks.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/activetasks/tests/activetasks.componentsSpec.react.jsx b/app/addons/activetasks/tests/activetasks.componentsSpec.react.jsx
index 6db8f66..6ad4413 100644
--- a/app/addons/activetasks/tests/activetasks.componentsSpec.react.jsx
+++ b/app/addons/activetasks/tests/activetasks.componentsSpec.react.jsx
@@ -16,9 +16,10 @@ define([
   'addons/activetasks/stores',
   'addons/activetasks/tests/fakeActiveTaskResponse',
   'react',
+  'react-dom',
   'addons/activetasks/actions',
   'testUtils'
-], function (FauxtonAPI, ActiveTasks, Components, Stores, fakedResponse, React, Actions, utils) {
+], function (FauxtonAPI, ActiveTasks, Components, Stores, fakedResponse, React, ReactDOM, Actions, utils) {
   var assert = utils.assert;
   var restore = utils.restore;
   var TestUtils = React.addons.TestUtils;
@@ -39,7 +40,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(pollingWidgetDiv);
+        ReactDOM.unmountComponentAtNode(pollingWidgetDiv);
         restore(Actions.changePollingInterval);
       });
 
@@ -67,7 +68,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(tableDiv);
+        ReactDOM.unmountComponentAtNode(tableDiv);
         restore(window.confirm);
       });
 
@@ -88,7 +89,7 @@ define([
         it('should trigger change to radio buttons', function () {
           _.each(radioIDs, function (radioID) {
             spy = sinon.spy(Actions, 'switchTab');
-            TestUtils.Simulate.change($(table.getDOMNode()).find('#' + radioID)[0]);
+            TestUtils.Simulate.change($(ReactDOM.findDOMNode(table)).find('#' + radioID)[0]);
             assert.ok(spy.calledOnce);
             spy.restore();
           });
@@ -96,7 +97,7 @@ define([
 
         it('should trigger change to search term', function () {
           spy = sinon.spy(Actions, 'setSearchTerm');
-          TestUtils.Simulate.change($(table.getDOMNode()).find('.searchbox')[0], {target: {value: 'searching'}});
+          TestUtils.Simulate.change($(ReactDOM.findDOMNode(table)).find('.searchbox')[0], {target: {value: 'searching'}});
           assert.ok(spy.calledOnce);
         });
       });
@@ -118,7 +119,7 @@ define([
         it('should trigger change to which header to sort by', function () {
           _.each(headerNames, function (header) {
             spy = sinon.spy(Actions, 'sortByColumnHeader');
-            TestUtils.Simulate.change($(table.getDOMNode()).find('#' + header)[0]);
+            TestUtils.Simulate.change($(ReactDOM.findDOMNode(table)).find('#' + header)[0]);
             assert.ok(spy.calledOnce);
             spy.restore();
           });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/auth/components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/auth/components.react.jsx b/app/addons/auth/components.react.jsx
index d4d1abb..448c7c0 100644
--- a/app/addons/auth/components.react.jsx
+++ b/app/addons/auth/components.react.jsx
@@ -14,9 +14,10 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/auth/stores',
   'addons/auth/actions'
-], function (app, FauxtonAPI, React, AuthStores, AuthActions) {
+], function (app, FauxtonAPI, React, ReactDOM, AuthStores, AuthActions) {
 
   var changePasswordStore = AuthStores.changePasswordStore;
   var createAdminStore = AuthStores.createAdminStore;
@@ -64,8 +65,8 @@ define([
       if (this.state.username !== '' || this.state.password !== '') {
         return false;
       }
-      var username = (this.props.testBlankUsername) ? this.props.testBlankUsername : React.findDOMNode(this.refs.username).value;
-      var password = (this.props.testBlankPassword) ? this.props.testBlankPassword : React.findDOMNode(this.refs.password).value;
+      var username = (this.props.testBlankUsername) ? this.props.testBlankUsername : ReactDOM.findDOMNode(this.refs.username).value;
+      var password = (this.props.testBlankPassword) ? this.props.testBlankPassword : ReactDOM.findDOMNode(this.refs.password).value;
       this.setState({ username: username, password: password }); // doesn't set immediately, hence separate login() call
       this.login(username, password);
 
@@ -77,7 +78,7 @@ define([
     },
 
     componentDidMount: function () {
-      React.findDOMNode(this.refs.username).focus();
+      ReactDOM.findDOMNode(this.refs.username).focus();
     },
 
     render: function () {
@@ -128,7 +129,7 @@ define([
     },
 
     componentDidMount: function () {
-      React.findDOMNode(this.refs.password).focus();
+      ReactDOM.findDOMNode(this.refs.password).focus();
       changePasswordStore.on('change', this.onChange, this);
     },
 
@@ -203,7 +204,7 @@ define([
     },
 
     componentDidMount: function () {
-      React.findDOMNode(this.refs.username).focus();
+      ReactDOM.findDOMNode(this.refs.username).focus();
       createAdminStore.on('change', this.onChange, this);
     },
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/auth/test/auth.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/auth/test/auth.componentsSpec.react.jsx b/app/addons/auth/test/auth.componentsSpec.react.jsx
index 5113147..f8315bb 100644
--- a/app/addons/auth/test/auth.componentsSpec.react.jsx
+++ b/app/addons/auth/test/auth.componentsSpec.react.jsx
@@ -12,11 +12,12 @@
 define([
   'api',
   'react',
+  'react-dom',
   'testUtils',
   'addons/auth/components.react',
   'addons/auth/stores',
   'addons/auth/actions'
-], function (FauxtonAPI, React, utils, Components, Stores, Actions) {
+], function (FauxtonAPI, React, ReactDOM, utils, Components, Stores, Actions) {
   var assert = utils.assert;
 
   var TestUtils = React.addons.TestUtils;
@@ -34,14 +35,14 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
         createAdminSidebarStore.reset();
         Actions.login.restore();
       });
 
       it('should trigger login event when form submitted', function () {
         loginForm = TestUtils.renderIntoDocument(<Components.LoginForm />, container);
-        TestUtils.Simulate.submit($(loginForm.getDOMNode()).find('#login')[0]);
+        TestUtils.Simulate.submit($(ReactDOM.findDOMNode(loginForm)).find('#login')[0]);
         assert.ok(stub.calledOnce);
       });
 
@@ -55,7 +56,7 @@ define([
             testBlankPassword={password}
           />, container);
 
-        TestUtils.Simulate.submit($(loginForm.getDOMNode()).find('#login')[0]);
+        TestUtils.Simulate.submit($(ReactDOM.findDOMNode(loginForm)).find('#login')[0]);
         assert.ok(stub.calledOnce);
 
         // confirm Actions.login() received the values that weren't in the DOM
@@ -75,24 +76,24 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
       });
 
       it('should call action to update password on field change', function () {
         var spy = sinon.spy(Actions, 'updateChangePasswordField');
-        TestUtils.Simulate.change($(changePasswordForm.getDOMNode()).find('#password')[0], { target: { value: 'bobsyouruncle' }});
+        TestUtils.Simulate.change($(ReactDOM.findDOMNode(changePasswordForm)).find('#password')[0], { target: { value: 'bobsyouruncle' }});
         assert.ok(spy.calledOnce);
       });
 
       it('should call action to update password confirm on field change', function () {
         var spy = sinon.spy(Actions, 'updateChangePasswordConfirmField');
-        TestUtils.Simulate.change($(changePasswordForm.getDOMNode()).find('#password-confirm')[0], { target: { value: 'hotdiggity' }});
+        TestUtils.Simulate.change($(ReactDOM.findDOMNode(changePasswordForm)).find('#password-confirm')[0], { target: { value: 'hotdiggity' }});
         assert.ok(spy.calledOnce);
       });
 
       it('should call action to submit form', function () {
         var stub = sinon.stub(Actions, 'changePassword', function () {});
-        TestUtils.Simulate.submit($(changePasswordForm.getDOMNode()).find('#change-password')[0]);
+        TestUtils.Simulate.submit($(ReactDOM.findDOMNode(changePasswordForm)).find('#change-password')[0]);
         assert.ok(stub.calledOnce);
       });
     });
@@ -106,18 +107,18 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
       });
 
       it('should call action to update username on field change', function () {
         var spy = sinon.spy(Actions, 'updateCreateAdminUsername');
-        TestUtils.Simulate.change($(createAdminForm.getDOMNode()).find('#username')[0], { target: { value: 'catsmeow' }});
+        TestUtils.Simulate.change($(ReactDOM.findDOMNode(createAdminForm)).find('#username')[0], { target: { value: 'catsmeow' }});
         assert.ok(spy.calledOnce);
       });
 
       it('should call action to update password confirm on field change', function () {
         var spy = sinon.spy(Actions, 'updateCreateAdminPassword');
-        TestUtils.Simulate.change($(createAdminForm.getDOMNode()).find('#password')[0], { target: { value: 'topnotch' }});
+        TestUtils.Simulate.change($(ReactDOM.findDOMNode(createAdminForm)).find('#password')[0], { target: { value: 'topnotch' }});
         assert.ok(spy.calledOnce);
       });
     });
@@ -132,16 +133,16 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
       });
 
       it('confirm the default selected nav item is the change pwd page', function () {
-        assert.equal($(createAdminSidebar.getDOMNode()).find('.active').find('a').attr('href'), '#changePassword');
+        assert.equal($(ReactDOM.findDOMNode(createAdminSidebar)).find('.active').find('a').attr('href'), '#changePassword');
       });
 
       it('confirm clicking a sidebar nav item selects it in the DOM', function () {
-        TestUtils.Simulate.click($(createAdminSidebar.getDOMNode()).find('li[data-page="addAdmin"]').find('a')[0]);
-        assert.equal($(createAdminSidebar.getDOMNode()).find('.active').find('a').attr('href'), '#addAdmin');
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(createAdminSidebar)).find('li[data-page="addAdmin"]').find('a')[0]);
+        assert.equal($(ReactDOM.findDOMNode(createAdminSidebar)).find('.active').find('a').attr('href'), '#addAdmin');
       });
     });
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/cluster/tests/clusterSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/cluster/tests/clusterSpec.react.jsx b/app/addons/cluster/tests/clusterSpec.react.jsx
index 9a6c3b5..08e3625 100644
--- a/app/addons/cluster/tests/clusterSpec.react.jsx
+++ b/app/addons/cluster/tests/clusterSpec.react.jsx
@@ -14,10 +14,10 @@ define([
   'addons/cluster/cluster.react',
   'addons/cluster/cluster.actions',
   'addons/cluster/cluster.stores',
-
   'testUtils',
-  'react'
-], function (FauxtonAPI, ClusterComponent, ClusterActions, ClusterStores, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, ClusterComponent, ClusterActions, ClusterStores, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -47,11 +47,11 @@ define([
 
     afterEach(function () {
       ClusterStores.nodesStore.reset();
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('renders the amount of nodes', function () {
-      assert.ok(/6 nodes/.test($(controller.getDOMNode()).text()), 'finds 6 nodes');
+      assert.ok(/6 nodes/.test($(ReactDOM.findDOMNode(controller)).text()), 'finds 6 nodes');
     });
   });
 });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/compaction/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/compaction/tests/componentsSpec.react.jsx b/app/addons/compaction/tests/componentsSpec.react.jsx
index 5c6a18a..08fb02e 100644
--- a/app/addons/compaction/tests/componentsSpec.react.jsx
+++ b/app/addons/compaction/tests/componentsSpec.react.jsx
@@ -14,8 +14,9 @@ define([
   'addons/compaction/components.react',
   'addons/compaction/actions',
   'testUtils',
-  "react"
-], function (FauxtonAPI, Views, Actions, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, Views, Actions, utils, React, ReactDOM) {
   FauxtonAPI.router = new FauxtonAPI.Router([]);
 
   var assert = utils.assert;
@@ -37,7 +38,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('triggers compact database action', function () {
@@ -69,11 +70,11 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('calls cleanupView on button click', function () {
-      var el = $(cleanupViewEl.getDOMNode()).find('button')[0];
+      var el = $(ReactDOM.findDOMNode(cleanupViewEl)).find('button')[0];
       TestUtils.Simulate.click(el, {});
 
       assert.ok(spy.calledOnce);
@@ -95,11 +96,11 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('calls compact database on button click', function () {
-      var el = $(compactViewEl.getDOMNode()).find('button')[0];
+      var el = $(ReactDOM.findDOMNode(compactViewEl)).find('button')[0];
       TestUtils.Simulate.click(el, {});
 
       assert.ok(spy.calledOnce);

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/components/react-components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/react-components.react.jsx b/app/addons/components/react-components.react.jsx
index a471637..606d50b 100644
--- a/app/addons/components/react-components.react.jsx
+++ b/app/addons/components/react-components.react.jsx
@@ -14,14 +14,16 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/components/stores',
   'addons/fauxton/components.react',
+  'addons/documents/helpers',
   'ace/ace',
   'plugins/beautify',
   'libs/react-bootstrap'
 ],
 
-function (app, FauxtonAPI, React, Stores, FauxtonComponents, ace, beautifyHelper, ReactBootstrap) {
+function (app, FauxtonAPI, React, ReactDOM, Stores, FauxtonComponents, Helpers, ace, beautifyHelper, ReactBootstrap) {
 
   var ReactCSSTransitionGroup = React.addons.CSSTransitionGroup;
   var componentStore = Stores.componentStore;
@@ -450,7 +452,7 @@ function (app, FauxtonAPI, React, Stores, FauxtonComponents, ace, beautifyHelper
     },
 
     setupAce: function (props, shouldUpdateCode) {
-      this.editor = ace.edit(React.findDOMNode(this.refs.ace));
+      this.editor = ace.edit(ReactDOM.findDOMNode(this.refs.ace));
 
       // suppresses an Ace editor error
       this.editor.$blockScrolling = Infinity;
@@ -770,14 +772,14 @@ function (app, FauxtonAPI, React, Stores, FauxtonComponents, ace, beautifyHelper
       }
       var val = '';
       if (!prevProps.visible && this.props.visible) {
-        val = JSON.parse('"' + this.props.value + '"'); // this ensures newlines are converted
+        val = Helpers.parseJSON(this.props.value);
       }
 
       this.initEditor(val);
     },
 
     initEditor: function (val) {
-      this.editor = ace.edit(React.findDOMNode(this.refs.stringEditor));
+      this.editor = ace.edit(ReactDOM.findDOMNode(this.refs.stringEditor));
       this.editor.$blockScrolling = Infinity; // suppresses an Ace editor error
       this.editor.setShowPrintMargin(false);
       this.editor.setOption('highlightActiveLine', true);
@@ -857,8 +859,8 @@ function (app, FauxtonAPI, React, Stores, FauxtonComponents, ace, beautifyHelper
     },
 
     componentDidMount: function () {
-      $(React.findDOMNode(this.refs.exit)).tooltip({ placement: 'left' });
-      $(React.findDOMNode(this.refs.theme)).tooltip({ placement: 'left' });
+      $(ReactDOM.findDOMNode(this.refs.exit)).tooltip({ placement: 'left' });
+      $(ReactDOM.findDOMNode(this.refs.theme)).tooltip({ placement: 'left' });
     },
 
     exitZenMode: function () {
@@ -1194,7 +1196,8 @@ function (app, FauxtonAPI, React, Stores, FauxtonComponents, ace, beautifyHelper
 
     render: function () {
       return (
-        <ReactCSSTransitionGroup transitionName="tray" transitionAppear={true} component="div">
+        <ReactCSSTransitionGroup transitionName="tray" transitionAppear={true} component="div" transitionAppearTimeout={500}
+          transitionEnterTimeout={500} transitionLeaveTimeout={300}>
           {this.getChildren()}
         </ReactCSSTransitionGroup>
       );
@@ -1246,7 +1249,7 @@ function (app, FauxtonAPI, React, Stores, FauxtonComponents, ace, beautifyHelper
 
     renderChildren: function () {
       return React.Children.map(this.props.children, function (child, key) {
-        return React.addons.cloneWithProps(child, {
+        return React.cloneElement(child, {
           trayVisible: this.state.trayVisible,
           selected: this.state.trayVisible,
           toggleCallback: this.toggleTray,
@@ -1265,7 +1268,7 @@ function (app, FauxtonAPI, React, Stores, FauxtonComponents, ace, beautifyHelper
 
     closeIfOpen: function (e) {
       if (!this.state.trayVisible) { return; }
-      var trayEl = $(React.findDOMNode(this));
+      var trayEl = $(ReactDOM.findDOMNode(this));
 
       if (!trayEl.is(e.target) && trayEl.has(e.target).length === 0) {
         this.toggleTray();
@@ -1385,11 +1388,11 @@ function (app, FauxtonAPI, React, Stores, FauxtonComponents, ace, beautifyHelper
     ApiBarController: ApiBarController,
 
     renderMenuDropDown: function (el, opts) {
-      React.render(<MenuDropDown icon="fonticon-cog" links={opts.links} />, el);
+      ReactDOM.render(<MenuDropDown icon="fonticon-cog" links={opts.links} />, el);
     },
 
     removeMenuDropDown: function (el) {
-      React.unmountComponentAtNode(el);
+      ReactDOM.unmountComponentAtNode(el);
     },
   };
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/components/tests/apiBarControllerSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/tests/apiBarControllerSpec.react.jsx b/app/addons/components/tests/apiBarControllerSpec.react.jsx
index 3f516d8..4ca4b5d 100644
--- a/app/addons/components/tests/apiBarControllerSpec.react.jsx
+++ b/app/addons/components/tests/apiBarControllerSpec.react.jsx
@@ -15,8 +15,9 @@ define([
   'addons/components/stores',
   'addons/components/react-components.react',
   'testUtils',
-  'react'
-], function (FauxtonAPI, Actions, Stores, ReactComponents, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, Actions, Stores, ReactComponents, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -32,7 +33,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
       componentStore.reset();
     });
 
@@ -83,16 +84,16 @@ define([
       var el = TestUtils.renderIntoDocument(<ApiBarController />, container);
       Actions.updateAPIBar({ visible: true, endpoint: 'http://link.com', docURL: 'http://doc.com' });
 
-      TestUtils.Simulate.click($(el.getDOMNode()).find('.control-toggle-api-url')[0]);
-      assert.equal($(el.getDOMNode()).find('.help-link').length, 1);
+      TestUtils.Simulate.click($(ReactDOM.findDOMNode(el)).find('.control-toggle-api-url')[0]);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.help-link').length, 1);
     });
 
     it('Confirm doc link icon doesn\'t appear with no docURL', function () {
       var el = TestUtils.renderIntoDocument(<ApiBarController />, container);
       Actions.updateAPIBar({ visible: true, endpoint: 'http://link.com', docURL: null });
 
-      TestUtils.Simulate.click($(el.getDOMNode()).find('.control-toggle-api-url')[0]);
-      assert.equal($(el.getDOMNode()).find('.help-link').length, 0);
+      TestUtils.Simulate.click($(ReactDOM.findDOMNode(el)).find('.control-toggle-api-url')[0]);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.help-link').length, 0);
     });
 
     it('Confirm endpoint appears in markup', function () {
@@ -100,8 +101,8 @@ define([
       var link = 'http://booyah.ca';
       Actions.updateAPIBar({ visible: true, endpoint: link, docURL: null });
 
-      TestUtils.Simulate.click($(el.getDOMNode()).find('.control-toggle-api-url')[0]);
-      assert.equal($(el.getDOMNode()).find('.text-field-to-copy').val(), link);
+      TestUtils.Simulate.click($(ReactDOM.findDOMNode(el)).find('.control-toggle-api-url')[0]);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.text-field-to-copy').val(), link);
     });
 
     it('Confirm endpoint is updated in markup', function () {
@@ -109,12 +110,12 @@ define([
       var link = 'http://booyah.ca';
       Actions.updateAPIBar({ visible: true, endpoint: link, docURL: null });
 
-      TestUtils.Simulate.click($(el.getDOMNode()).find('.control-toggle-api-url')[0]);
-      assert.equal($(el.getDOMNode()).find('.text-field-to-copy').val(), link);
+      TestUtils.Simulate.click($(ReactDOM.findDOMNode(el)).find('.control-toggle-api-url')[0]);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.text-field-to-copy').val(), link);
 
       var newLink = 'http://chickensarenoisy.com';
       Actions.updateAPIBar({ endpoint: newLink });
-      assert.equal($(el.getDOMNode()).find('.text-field-to-copy').val(), newLink);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.text-field-to-copy').val(), newLink);
     });
 
     it('Confirm doc URL is updated in markup after a change', function () {
@@ -122,12 +123,12 @@ define([
       var docLink = 'http://mydoc.org';
       Actions.updateAPIBar({ visible: true, endpoint: 'http://whatever.com', docURL: docLink });
 
-      TestUtils.Simulate.click($(el.getDOMNode()).find('.control-toggle-api-url')[0]);
-      assert.equal($(el.getDOMNode()).find('.help-link').attr('href'), docLink);
+      TestUtils.Simulate.click($(ReactDOM.findDOMNode(el)).find('.control-toggle-api-url')[0]);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.help-link').attr('href'), docLink);
 
       var newDocLink = 'http://newawesomedoclink.xxx';
       Actions.updateAPIBar({ docURL: newDocLink });
-      assert.equal($(el.getDOMNode()).find('.help-link').attr('href'), newDocLink);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.help-link').attr('href'), newDocLink);
     });
 
   });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/components/tests/beautifySpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/tests/beautifySpec.react.jsx b/app/addons/components/tests/beautifySpec.react.jsx
index 92260cb..17d106d 100644
--- a/app/addons/components/tests/beautifySpec.react.jsx
+++ b/app/addons/components/tests/beautifySpec.react.jsx
@@ -12,10 +12,10 @@
 define([
   'api',
   'addons/components/react-components.react',
-
   'testUtils',
-  'react'
-], function (FauxtonAPI, ReactComponents, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, ReactComponents, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -28,7 +28,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('should be empty for multi-lined code', function () {
@@ -37,13 +37,13 @@ define([
         <ReactComponents.Beautify code={correctCode}/>,
         container
       );
-      assert.ok(_.isNull(beautifyEl.getDOMNode()));
+      assert.ok(_.isNull(ReactDOM.findDOMNode(beautifyEl)));
     });
 
     it('should have button to beautify for single line code', function () {
       var badCode = 'function () { console.log("hello"); }';
       beautifyEl = TestUtils.renderIntoDocument(<ReactComponents.Beautify code={badCode}/>, container);
-      assert.ok($(beautifyEl.getDOMNode()).hasClass('beautify'));
+      assert.ok($(ReactDOM.findDOMNode(beautifyEl)).hasClass('beautify'));
     });
 
     it('on click beautifies code', function () {
@@ -61,7 +61,7 @@ define([
           noOfLines={1}/>,
         container
       );
-      TestUtils.Simulate.click(beautifyEl.getDOMNode());
+      TestUtils.Simulate.click(ReactDOM.findDOMNode(beautifyEl));
       assert.equal(fixedCode, correctCode);
 
     });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/components/tests/codeEditorPanelSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/tests/codeEditorPanelSpec.react.jsx b/app/addons/components/tests/codeEditorPanelSpec.react.jsx
index a2a1dcd..98252b5 100644
--- a/app/addons/components/tests/codeEditorPanelSpec.react.jsx
+++ b/app/addons/components/tests/codeEditorPanelSpec.react.jsx
@@ -13,8 +13,9 @@ define([
   'api',
   'addons/components/react-components.react',
   'testUtils',
-  'react'
-], function (FauxtonAPI, ReactComponents, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, ReactComponents, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -30,7 +31,7 @@ define([
           <ReactComponents.CodeEditorPanel defaultCode={code} />,
           container
         );
-        assert.equal($(codeEditorEl.getDOMNode()).find('.icon-question-sign').length, 0);
+        assert.equal($(ReactDOM.findDOMNode(codeEditorEl)).find('.icon-question-sign').length, 0);
       });
       it('hidden by default', function () {
         var container = document.createElement('div');
@@ -38,7 +39,7 @@ define([
           <ReactComponents.CodeEditorPanel defaultCode={code} docLink="http://link.com" />,
           container
         );
-        assert.equal($(codeEditorEl.getDOMNode()).find('.icon-question-sign').length, 1);
+        assert.equal($(ReactDOM.findDOMNode(codeEditorEl)).find('.icon-question-sign').length, 1);
       });
     });
 
@@ -49,7 +50,7 @@ define([
           <ReactComponents.CodeEditorPanel defaultCode={code} />,
           container
         );
-        assert.equal($(codeEditorEl.getDOMNode()).find('.zen-editor-icon').length, 1);
+        assert.equal($(ReactDOM.findDOMNode(codeEditorEl)).find('.zen-editor-icon').length, 1);
       });
 
       it('omits zen mode if explicitly turned off', function () {
@@ -58,7 +59,7 @@ define([
           <ReactComponents.CodeEditor defaultCode={code} allowZenMode={false} />,
           container
         );
-        assert.equal($(codeEditorEl.getDOMNode()).find('.zen-editor-icon').length, 0);
+        assert.equal($(ReactDOM.findDOMNode(codeEditorEl)).find('.zen-editor-icon').length, 0);
       });
     });
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/components/tests/codeEditorSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/tests/codeEditorSpec.react.jsx b/app/addons/components/tests/codeEditorSpec.react.jsx
index ee3dbd5..3ba5ce7 100644
--- a/app/addons/components/tests/codeEditorSpec.react.jsx
+++ b/app/addons/components/tests/codeEditorSpec.react.jsx
@@ -13,8 +13,9 @@ define([
   'api',
   'addons/components/react-components.react',
   'testUtils',
-  'react'
-], function (FauxtonAPI, ReactComponents, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, ReactComponents, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -39,7 +40,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     describe('Tracking edits', function () {

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/components/tests/confirmButtonSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/tests/confirmButtonSpec.react.jsx b/app/addons/components/tests/confirmButtonSpec.react.jsx
index d4d428a..d650c59 100644
--- a/app/addons/components/tests/confirmButtonSpec.react.jsx
+++ b/app/addons/components/tests/confirmButtonSpec.react.jsx
@@ -12,10 +12,10 @@
 define([
   'api',
   'addons/components/react-components.react',
-
   'testUtils',
-  'react'
-], function (FauxtonAPI, ReactComponents, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, ReactComponents, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -27,7 +27,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('should render text properties', function () {
@@ -35,7 +35,7 @@ define([
         <ReactComponents.ConfirmButton text="Click here to render Rocko Artischocko" />,
         container
       );
-      assert.equal($(button.getDOMNode()).text(), 'Click here to render Rocko Artischocko');
+      assert.equal($(ReactDOM.findDOMNode(button)).text(), 'Click here to render Rocko Artischocko');
     });
 
     it('should use onClick handler if provided', function () {
@@ -46,7 +46,7 @@ define([
         container
       );
 
-      React.addons.TestUtils.Simulate.click(button.getDOMNode());
+      React.addons.TestUtils.Simulate.click(ReactDOM.findDOMNode(button));
       assert.ok(spy.calledOnce);
     });
   });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/components/tests/docSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/tests/docSpec.react.jsx b/app/addons/components/tests/docSpec.react.jsx
index a931019..a013cb0 100644
--- a/app/addons/components/tests/docSpec.react.jsx
+++ b/app/addons/components/tests/docSpec.react.jsx
@@ -12,10 +12,10 @@
 define([
   'api',
   'addons/components/react-components.react',
-
   'testUtils',
-  'react'
-], function (FauxtonAPI, ReactComponents, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, ReactComponents, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -28,7 +28,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('hosts child elements', function () {
@@ -38,7 +38,7 @@ define([
         </ReactComponents.Document>,
         container
       );
-      assert.ok($(el.getDOMNode()).find('.foo-children').length);
+      assert.ok($(ReactDOM.findDOMNode(el)).find('.foo-children').length);
     });
 
     it('does not require child elements', function () {
@@ -46,7 +46,7 @@ define([
         <ReactComponents.Document />,
         container
       );
-      assert.notOk($(el.getDOMNode()).find('.doc-edit-symbol').length);
+      assert.notOk($(ReactDOM.findDOMNode(el)).find('.doc-edit-symbol').length);
     });
 
     it('you can check it', function () {
@@ -54,7 +54,7 @@ define([
         <ReactComponents.Document isDeletable={true} checked={true} docIdentifier="foo" />,
         container
       );
-      assert.equal($(el.getDOMNode()).find('input[type="checkbox"]').attr('checked'), 'checked');
+      assert.equal($(ReactDOM.findDOMNode(el)).find('input[type="checkbox"]').attr('checked'), 'checked');
     });
 
     it('you can uncheck it', function () {
@@ -62,7 +62,7 @@ define([
         <ReactComponents.Document isDeletable={true} docIdentifier="foo" />,
         container
       );
-      assert.equal($(el.getDOMNode()).find('input[type="checkbox"]').attr('checked'), undefined);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('input[type="checkbox"]').attr('checked'), undefined);
     });
 
     it('it calls an onchange callback', function () {
@@ -72,7 +72,7 @@ define([
         <ReactComponents.Document doc={{id: "foo"}} isDeletable={true} docChecked={spy} docIdentifier="foo" />,
         container
       );
-      var testEl = $(el.getDOMNode()).find('input[type="checkbox"]')[0];
+      var testEl = $(ReactDOM.findDOMNode(el)).find('input[type="checkbox"]')[0];
       React.addons.TestUtils.Simulate.change(testEl, {target: {value: 'Hello, world'}});
       assert.ok(spy.calledOnce);
     });
@@ -84,7 +84,7 @@ define([
         <ReactComponents.Document isDeletable={true} onDoubleClick={spy} docIdentifier="foo" />,
         container
       );
-      React.addons.TestUtils.Simulate.doubleClick(el.getDOMNode());
+      React.addons.TestUtils.Simulate.doubleClick(ReactDOM.findDOMNode(el));
       assert.ok(spy.calledOnce);
     });
 
@@ -95,8 +95,8 @@ define([
         <ReactComponents.Document isDeletable={false} onDoubleClick={spy} docIdentifier="foo" />,
         container
       );
-      assert.notOk($(el.getDOMNode()).find('input[type="checkbox"]').length);
-      assert.ok($(el.getDOMNode()).find('.checkbox-dummy').length);
+      assert.notOk($(ReactDOM.findDOMNode(el)).find('input[type="checkbox"]').length);
+      assert.ok($(ReactDOM.findDOMNode(el)).find('.checkbox-dummy').length);
     });
 
     it('contains a doc-data element when there\'s doc content', function () {
@@ -104,7 +104,7 @@ define([
         <ReactComponents.Document isDeletable={true} checked={true} docIdentifier="foo" docContent='{ "content": true }' />,
         container
       );
-      assert.equal(1, $(el.getDOMNode()).find('.doc-data').length);
+      assert.equal(1, $(ReactDOM.findDOMNode(el)).find('.doc-data').length);
     });
 
     it('doesn\'t contain a doc-data element when there\'s no doc content', function () {
@@ -112,7 +112,7 @@ define([
         <ReactComponents.Document isDeletable={true} checked={true} docIdentifier="foo" docContent='' />,
         container
       );
-      assert.equal(0, $(el.getDOMNode()).find('.doc-data').length);
+      assert.equal(0, $(ReactDOM.findDOMNode(el)).find('.doc-data').length);
     });
 
     it('allows empty headers', function () {
@@ -120,7 +120,7 @@ define([
         <ReactComponents.Document header={null} isDeletable={true} checked={true} docIdentifier="foo" docContent='' />,
         container
       );
-      assert.equal('', $(el.getDOMNode()).find('.header-doc-id').text());
+      assert.equal('', $(ReactDOM.findDOMNode(el)).find('.header-doc-id').text());
     });
 
     it('allows supports headers with "', function () {
@@ -128,7 +128,7 @@ define([
         <ReactComponents.Document header="foo" isDeletable={true} checked={true} docIdentifier="foo" docContent='' />,
         container
       );
-      assert.equal('"foo"', $(el.getDOMNode()).find('.header-doc-id').text());
+      assert.equal('"foo"', $(ReactDOM.findDOMNode(el)).find('.header-doc-id').text());
     });
   });
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/components/tests/headerTogglebuttonSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/tests/headerTogglebuttonSpec.react.jsx b/app/addons/components/tests/headerTogglebuttonSpec.react.jsx
index 14523f3..6ce0776 100644
--- a/app/addons/components/tests/headerTogglebuttonSpec.react.jsx
+++ b/app/addons/components/tests/headerTogglebuttonSpec.react.jsx
@@ -12,10 +12,10 @@
 define([
   'api',
   'addons/components/react-components.react',
-
   'testUtils',
-  'react'
-], function (FauxtonAPI, ReactComponents, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, ReactComponents, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -30,11 +30,11 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('should call the passed callback', function () {
-      TestUtils.Simulate.click(toggleEl.getDOMNode());
+      TestUtils.Simulate.click(ReactDOM.findDOMNode(toggleEl));
       assert.ok(toggleCallback.calledOnce);
     });
   });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/components/tests/paddedBorderedBoxSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/tests/paddedBorderedBoxSpec.react.jsx b/app/addons/components/tests/paddedBorderedBoxSpec.react.jsx
index b262bc3..a0e2866 100644
--- a/app/addons/components/tests/paddedBorderedBoxSpec.react.jsx
+++ b/app/addons/components/tests/paddedBorderedBoxSpec.react.jsx
@@ -12,10 +12,10 @@
 define([
   'api',
   'addons/components/react-components.react',
-
   'testUtils',
-  'react'
-], function (FauxtonAPI, ReactComponents, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, ReactComponents, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -28,7 +28,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('hosts child elements', function () {
@@ -38,7 +38,7 @@ define([
         </ReactComponents.PaddedBorderedBox>,
         container
       );
-      assert.ok($(el.getDOMNode()).find('.foo-children').length);
+      assert.ok($(ReactDOM.findDOMNode(el)).find('.foo-children').length);
     });
   });
 });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/components/tests/stringEditModalSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/tests/stringEditModalSpec.react.jsx b/app/addons/components/tests/stringEditModalSpec.react.jsx
index bc1fd71..188581c 100644
--- a/app/addons/components/tests/stringEditModalSpec.react.jsx
+++ b/app/addons/components/tests/stringEditModalSpec.react.jsx
@@ -14,8 +14,9 @@ define([
   'addons/components/react-components.react',
   'libs/react-bootstrap',
   'testUtils',
-  'react'
-], function (FauxtonAPI, ReactComponents, ReactBootstrap, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, ReactComponents, ReactBootstrap, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -31,34 +32,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
-    });
-
-    describe('event methods called', function () {
-      it('onClose called by top (x)', function () {
-        var spy = sinon.spy();
-        el = TestUtils.renderIntoDocument(
-          <ReactComponents.StringEditModal visible={true} onClose={spy} onSave={stub} />,
-          container
-        );
-        var modal = TestUtils.findRenderedComponentWithType(el, Modal);
-        var modalEl = React.findDOMNode(modal.refs.modal);
-
-        TestUtils.Simulate.click($(modalEl).find('.close')[0]);
-        assert.ok(spy.calledOnce);
-      });
-
-      it('onClose called by cancel button', function () {
-        var spy = sinon.spy();
-        el = TestUtils.renderIntoDocument(
-          <ReactComponents.StringEditModal visible={true} onClose={spy} onSave={stub} />,
-          container
-        );
-        var modal = TestUtils.findRenderedComponentWithType(el, Modal);
-        var modalEl = React.findDOMNode(modal.refs.modal);
-        TestUtils.Simulate.click($(modalEl).find('.cancel-button')[0]);
-        assert.ok(spy.calledOnce);
-      });
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     describe('onSave', function () {
@@ -69,28 +43,11 @@ define([
           <ReactComponents.StringEditModal visible={true} onClose={stub} onSave={spy} value={string} />,
           container
         );
-        var modal = TestUtils.findRenderedComponentWithType(el, Modal);
-        var modalEl = React.findDOMNode(modal.refs.modal);
-
-        TestUtils.Simulate.click($(modalEl).find('#string-edit-save-btn')[0]);
+        TestUtils.Simulate.click($('body').find('#string-edit-save-btn')[0]);
         assert.ok(spy.calledOnce);
         assert.ok(spy.calledWith(string));
       });
-
-      it('replaces "\\n" with actual newlines', function () {
-        var spy = sinon.spy();
-        var string = 'I am a string\\nwith\\nlinebreaks\\nin\\nit';
-        el = TestUtils.renderIntoDocument(
-          <ReactComponents.StringEditModal visible={true} onSave={spy} value={string} />,
-          container
-        );
-
-        var modal = TestUtils.findRenderedComponentWithType(el, Modal);
-        var modalEl = React.findDOMNode(modal.refs.modal);
-
-        TestUtils.Simulate.click($(modalEl).find('#string-edit-save-btn')[0]);
-        assert.ok(spy.calledOnce);
-      });
     });
   });
+
 });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/components/tests/styledSelectSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/tests/styledSelectSpec.react.jsx b/app/addons/components/tests/styledSelectSpec.react.jsx
index 7a3328a..94e0028 100644
--- a/app/addons/components/tests/styledSelectSpec.react.jsx
+++ b/app/addons/components/tests/styledSelectSpec.react.jsx
@@ -12,10 +12,10 @@
 define([
   'api',
   'addons/components/react-components.react',
-
   'testUtils',
-  'react'
-], function (FauxtonAPI, ReactComponents, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, ReactComponents, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -44,11 +44,11 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('calls the callback on select', function () {
-      TestUtils.Simulate.change($(selectorEl.getDOMNode()).find('#new-ddoc')[0], {
+      TestUtils.Simulate.change($(ReactDOM.findDOMNode(selectorEl)).find('#new-ddoc')[0], {
         target: {
           value: 'new'
         }

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/components/tests/zenModeSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/tests/zenModeSpec.react.jsx b/app/addons/components/tests/zenModeSpec.react.jsx
index ec742d4..7895454 100644
--- a/app/addons/components/tests/zenModeSpec.react.jsx
+++ b/app/addons/components/tests/zenModeSpec.react.jsx
@@ -13,8 +13,9 @@ define([
   'api',
   'addons/components/react-components.react',
   'testUtils',
-  'react'
-], function (FauxtonAPI, ReactComponents, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, ReactComponents, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -33,26 +34,26 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
       window.localStorage.removeItem('zenTheme');
     });
 
     describe('Toggle theme', function () {
       it('defaults to dark theme', function () {
-        assert.ok($(el.getDOMNode()).hasClass('zen-theme-dark'));
+        assert.ok($(ReactDOM.findDOMNode(el)).hasClass('zen-theme-dark'));
       });
 
       it('switch to light theme on click', function () {
-        TestUtils.Simulate.click($(el.getDOMNode()).find('.js-toggle-theme')[0]);
-        assert.ok($(el.getDOMNode()).hasClass('zen-theme-light'));
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(el)).find('.js-toggle-theme')[0]);
+        assert.ok($(ReactDOM.findDOMNode(el)).hasClass('zen-theme-light'));
         // reset
-        TestUtils.Simulate.click($(el.getDOMNode()).find('.js-toggle-theme')[0]);
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(el)).find('.js-toggle-theme')[0]);
       });
     });
 
     describe('Closing zen mode', function () {
       it('method called', function () {
-        TestUtils.Simulate.click($(el.getDOMNode()).find('.js-exit-zen-mode')[0]);
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(el)).find('.js-exit-zen-mode')[0]);
         assert.ok(spy.calledOnce);
       });
     });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/cors/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/cors/tests/componentsSpec.react.jsx b/app/addons/cors/tests/componentsSpec.react.jsx
index 7bd5762..dd76ff3 100644
--- a/app/addons/cors/tests/componentsSpec.react.jsx
+++ b/app/addons/cors/tests/componentsSpec.react.jsx
@@ -16,8 +16,9 @@ define([
   'addons/cors/resources',
   'addons/cors/stores',
   'testUtils',
-  "react"
-], function (FauxtonAPI, Views, Actions, Resources, Stores, utils, React) {
+  "react",
+  'react-dom'
+], function (FauxtonAPI, Views, Actions, Resources, Stores, utils, React, ReactDOM) {
 
   FauxtonAPI.router = new FauxtonAPI.Router([]);
   var assert = utils.assert;
@@ -45,7 +46,7 @@ define([
         utils.restore(Actions.toggleLoadingBarsToEnabled);
         utils.restore(corsEl.save);
 
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
         window.confirm.restore && window.confirm.restore();
       });
 
@@ -92,13 +93,13 @@ define([
 
       it('shows loading bars', function () {
         Actions.toggleLoadingBarsToEnabled(true);
-        assert.equal($(corsEl.getDOMNode()).find('.loading-lines').length, 1);
+        assert.equal($(ReactDOM.findDOMNode(corsEl)).find('.loading-lines').length, 1);
       });
 
       it('hides loading bars', function () {
         Actions.toggleLoadingBarsToEnabled(false);
 
-        assert.equal($(corsEl.getDOMNode()).find('.loading-lines').length, 0);
+        assert.equal($(ReactDOM.findDOMNode(corsEl)).find('.loading-lines').length, 0);
       });
     });
 
@@ -115,26 +116,26 @@ define([
       afterEach(function () {
         utils.restore(Resources.validateCORSDomain);
         utils.restore(FauxtonAPI.addNotification);
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
       });
 
       it('calls validates each domain', function () {
         var spy = sinon.spy(Resources, 'validateCORSDomain');
-        TestUtils.Simulate.change($(inputEl.getDOMNode()).find('input')[0], {target: {value: newOrigin}});
-        TestUtils.Simulate.click($(inputEl.getDOMNode()).find('.btn')[0]);
+        TestUtils.Simulate.change($(ReactDOM.findDOMNode(inputEl)).find('input')[0], {target: {value: newOrigin}});
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(inputEl)).find('.btn')[0]);
         assert.ok(spy.calledWith(newOrigin));
       });
 
       it('calls addOrigin on add click with valid domain', function () {
-        TestUtils.Simulate.change($(inputEl.getDOMNode()).find('input')[0], {target: {value: newOrigin}});
-        TestUtils.Simulate.click($(inputEl.getDOMNode()).find('.btn')[0]);
+        TestUtils.Simulate.change($(ReactDOM.findDOMNode(inputEl)).find('input')[0], {target: {value: newOrigin}});
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(inputEl)).find('.btn')[0]);
         assert.ok(addOrigin.calledWith(newOrigin));
       });
 
       it('shows notification if origin is not valid', function () {
         var spy = sinon.spy(FauxtonAPI, 'addNotification');
-        TestUtils.Simulate.change($(inputEl.getDOMNode()).find('input')[0], {target: {value: 'badOrigin'}});
-        TestUtils.Simulate.click($(inputEl.getDOMNode()).find('.btn')[0]);
+        TestUtils.Simulate.change($(ReactDOM.findDOMNode(inputEl)).find('input')[0], {target: {value: 'badOrigin'}});
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(inputEl)).find('.btn')[0]);
         assert.ok(spy.calledOnce);
       });
     });
@@ -149,11 +150,11 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
       });
 
       it('calls change Origin on all origins selected', function () {
-        TestUtils.Simulate.change($(originEl.getDOMNode()).find('input[value="all"]')[0]);
+        TestUtils.Simulate.change($(ReactDOM.findDOMNode(originEl)).find('input[value="all"]')[0]);
         assert.ok(changeOrigin.calledWith(true));
       });
 
@@ -165,7 +166,7 @@ define([
         //1. render radio buttons with 'all origins'
         originEl = TestUtils.renderIntoDocument(<Views.Origins corsEnabled={true} isAllOrigins={true} originChange={changeOrigin}/>, container);
         //2. switch back to 'select origins'
-        TestUtils.Simulate.change($(originEl.getDOMNode()).find('input[value="selected"]')[0]);
+        TestUtils.Simulate.change($(ReactDOM.findDOMNode(originEl)).find('input[value="selected"]')[0]);
         assert.ok(changeOrigin.calledWith(false));
       });
     });
@@ -185,14 +186,14 @@ define([
       afterEach(function () {
         window.confirm.restore && window.confirm.restore();
         Actions.deleteOrigin.restore && Actions.deleteOrigin.restore();
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
       });
 
       it('should confirm on delete', function () {
         var stub = sinon.stub(window, 'confirm');
         stub.returns(true);
 
-        TestUtils.Simulate.click($(originTableEl.getDOMNode()).find('.fonticon-trash')[0]);
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(originTableEl)).find('.fonticon-trash')[0]);
         assert.ok(stub.calledOnce);
       });
 
@@ -210,43 +211,43 @@ define([
       it('should deleteOrigin on confirm true', function () {
         var stub = sinon.stub(window, 'confirm');
         stub.returns(true);
-        TestUtils.Simulate.click($(originTableEl.getDOMNode()).find('.fonticon-trash')[0]);
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(originTableEl)).find('.fonticon-trash')[0]);
         assert.ok(deleteOrigin.calledWith(origin));
       });
 
       it('should not deleteOrigin on confirm false', function () {
         var stub = sinon.stub(window, 'confirm');
         stub.returns(false);
-        TestUtils.Simulate.click($(originTableEl.getDOMNode()).find('.fonticon-trash')[0]);
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(originTableEl)).find('.fonticon-trash')[0]);
         assert.notOk(deleteOrigin.calledOnce);
       });
 
       it('should change origin to input on edit click', function () {
-        TestUtils.Simulate.click($(originTableEl.getDOMNode()).find('.fonticon-pencil')[0]);
-        assert.ok($(originTableEl.getDOMNode()).find('input').length === 1);
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(originTableEl)).find('.fonticon-pencil')[0]);
+        assert.ok($(ReactDOM.findDOMNode(originTableEl)).find('input').length === 1);
       });
 
       it('should update origin on update clicked', function () {
         var updatedOrigin = 'https://updated-origin.com';
-        TestUtils.Simulate.click($(originTableEl.getDOMNode()).find('.fonticon-pencil')[0]);
-        TestUtils.Simulate.change($(originTableEl.getDOMNode()).find('input')[0], {
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(originTableEl)).find('.fonticon-pencil')[0]);
+        TestUtils.Simulate.change($(ReactDOM.findDOMNode(originTableEl)).find('input')[0], {
           target: {
             value: updatedOrigin
           }
         });
-        TestUtils.Simulate.click($(originTableEl.getDOMNode()).find('.btn')[0]);
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(originTableEl)).find('.btn')[0]);
         assert.ok(updateOrigin.calledWith(updatedOrigin));
       });
 
       it('should not update origin on update clicked with bad origin', function () {
         var updatedOrigin = 'updated-origin';
-        TestUtils.Simulate.click($(originTableEl.getDOMNode()).find('.fonticon-pencil')[0]);
-        TestUtils.Simulate.change($(originTableEl.getDOMNode()).find('input')[0], {
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(originTableEl)).find('.fonticon-pencil')[0]);
+        TestUtils.Simulate.change($(ReactDOM.findDOMNode(originTableEl)).find('input')[0], {
           target: {
             value: updatedOrigin
           }
         });
-        TestUtils.Simulate.click($(originTableEl.getDOMNode()).find('.btn')[0]);
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(originTableEl)).find('.btn')[0]);
         assert.notOk(updateOrigin.calledOnce);
       });
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/databases/components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/databases/components.react.jsx b/app/addons/databases/components.react.jsx
index 98e85be..05e4b45 100644
--- a/app/addons/databases/components.react.jsx
+++ b/app/addons/databases/components.react.jsx
@@ -14,13 +14,14 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/components/react-components.react',
   'addons/fauxton/components.react',
   'addons/databases/stores',
   'addons/databases/resources',
   'addons/databases/actions',
   'helpers'
-], function (app, FauxtonAPI, React, Components, ComponentsReact, Stores, Resources, Actions, Helpers) {
+], function (app, FauxtonAPI, React, ReactDOM, Components, ComponentsReact, Stores, Resources, Actions, Helpers) {
 
   var ToggleHeaderButton = Components.ToggleHeaderButton;
   var databasesStore = Stores.databasesStore;
@@ -89,12 +90,14 @@ define([
         <div className="view">
           <table className="databases table table-striped">
             <thead>
-              <th>Name</th>
-              <th>Size</th>
-              <th># of Docs</th>
-              <th>Update Seq</th>
-              {this.getExtensionColumns()}
-              <th>Actions</th>
+              <tr>
+                <th>Name</th>
+                <th>Size</th>
+                <th># of Docs</th>
+                <th>Update Seq</th>
+                {this.getExtensionColumns()}
+                <th>Actions</th>
+              </tr>
             </thead>
             <tbody>
             {rows}
@@ -170,7 +173,7 @@ define([
   var GraveyardInfo = React.createClass({
 
     componentDidMount: function () {
-      $(React.findDOMNode(this.refs.myself)).tooltip();
+      $(ReactDOM.findDOMNode(this.refs.myself)).tooltip();
     },
 
     render: function () {
@@ -204,7 +207,7 @@ define([
 
       this.refs.newDbTray.toggle(function (shown) {
         if (shown) {
-          React.findDOMNode(this.refs.newDbName).focus();
+          ReactDOM.findDOMNode(this.refs.newDbName).focus();
         }
       }.bind(this));
     },
@@ -222,7 +225,7 @@ define([
     },
 
     onAddDatabase: function () {
-      var databaseName = React.findDOMNode(this.refs.newDbName).value;
+      var databaseName = ReactDOM.findDOMNode(this.refs.newDbName).value;
       Actions.createNewDatabase(databaseName);
     },
 
@@ -265,7 +268,7 @@ define([
     },
 
     componentDidUpdate: function () {
-      $(React.findDOMNode(this.refs.searchDbName)).typeahead({
+      $(ReactDOM.findDOMNode(this.refs.searchDbName)).typeahead({
         source: this.state.databaseNames,
         updater: function (item) {
           this.jumpToDb(item);
@@ -282,7 +285,7 @@ define([
     },
 
     jumpToDb: function (databaseName) {
-      databaseName = databaseName || React.findDOMNode(this.refs.searchDbName).value;
+      databaseName = databaseName || ReactDOM.findDOMNode(this.refs.searchDbName).value;
       Actions.jumpToDatabase(databaseName);
     },
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/databases/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/databases/tests/componentsSpec.react.jsx b/app/addons/databases/tests/componentsSpec.react.jsx
index 2669b46..f57c5c2 100644
--- a/app/addons/databases/tests/componentsSpec.react.jsx
+++ b/app/addons/databases/tests/componentsSpec.react.jsx
@@ -16,8 +16,9 @@ define([
   'addons/databases/actiontypes',
   'addons/databases/stores',
   'testUtils',
-  "react"
-], function (FauxtonAPI, Views, Actions, ActionTypes, Stores, utils, React) {
+  "react",
+  'react-dom'
+], function (FauxtonAPI, Views, Actions, ActionTypes, Stores, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -85,12 +86,12 @@ define([
         ];
       };
       container = document.createElement('div');
-      dbEl = React.render(React.createElement(Views.DatabasesController, {}), container);
+      dbEl = ReactDOM.render(React.createElement(Views.DatabasesController, {}), container);
     });
 
     afterEach(function () {
       Stores.databasesStore.getCollection = oldGetCollection;
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('renders base data of DBs', function () {
@@ -118,12 +119,12 @@ define([
         passedDbName = dbName;
       };
       container = document.createElement('div');
-      addEl = React.render(React.createElement(Views.AddDatabaseWidget, {}), container);
+      addEl = ReactDOM.render(React.createElement(Views.AddDatabaseWidget, {}), container);
     });
 
     afterEach(function () {
       Actions.createNewDatabase = oldCreateNewDatabase;
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it("Creates a database with given name", function () {
@@ -160,14 +161,14 @@ define([
         return ["db1", "db2"];
       };
       container = document.createElement('div');
-      jumpEl = React.render(React.createElement(Views.JumpToDatabaseWidget, {}), container);
+      jumpEl = ReactDOM.render(React.createElement(Views.JumpToDatabaseWidget, {}), container);
     });
 
     afterEach(function () {
       $ = old$;
       Actions.jumpToDatabase = oldJumpToDatabase;
       Stores.databasesStore.getDatabaseNames = oldGetDatabaseNames;
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it("Jumps to a database with given name", function () {
@@ -217,14 +218,14 @@ define([
     it('uses custom URL prefix on the navigation if passed through props', function () {
       var container = document.createElement('div');
       var pagination = TestUtils.renderIntoDocument(<Views.DatabasePagination linkPath="_custom_path" />, container);
-      var links = $(pagination.getDOMNode()).find('a');
+      var links = $(ReactDOM.findDOMNode(pagination)).find('a');
 
       assert.equal(links.length, 3, 'pagination contains links');
       links.each(function () {
         assert.include(this.href, '_custom_path', 'link contains custom path');
       });
 
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
   });
 
@@ -236,7 +237,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('adds multiple extra columns if extended', function () {
@@ -255,7 +256,7 @@ define([
       FauxtonAPI.registerExtension('DatabaseTable:head', ColHeader3);
 
       var table = TestUtils.renderIntoDocument(<Views.DatabaseTable loading={false} body={[]} />, container);
-      var cols = $(table.getDOMNode()).find('th');
+      var cols = $(ReactDOM.findDOMNode(table)).find('th');
 
       // (default # of rows is 5)
       assert.equal(cols.length, 8, 'extra columns show up');
@@ -280,7 +281,7 @@ define([
       };
 
       var databaseRow = TestUtils.renderIntoDocument(<Views.DatabaseTable body={[row]} />, container);
-      var links = $(databaseRow.getDOMNode()).find('td');
+      var links = $(ReactDOM.findDOMNode(databaseRow)).find('td');
 
       // (default # of rows is 5)
       assert.equal(links.length, 6, 'extra column shows up');
@@ -301,7 +302,7 @@ define([
       };
 
       var databaseRow = TestUtils.renderIntoDocument(<Views.DatabaseTable body={[row]} />, container);
-      assert.equal($(databaseRow.getDOMNode()).find('.database-load-fail').length, 1);
+      assert.equal($(ReactDOM.findDOMNode(databaseRow)).find('.database-load-fail').length, 1);
     });
 
     it('shows no error if row marked as loaded', function () {
@@ -316,7 +317,7 @@ define([
 
       var databaseRow = TestUtils.renderIntoDocument(<Views.DatabaseTable body={[row]} />, container);
 
-      assert.equal($(databaseRow.getDOMNode()).find('.database-load-fail').length, 0);
+      assert.equal($(ReactDOM.findDOMNode(databaseRow)).find('.database-load-fail').length, 0);
     });
 
   });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/changes/components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/changes/components.react.jsx b/app/addons/documents/changes/components.react.jsx
index 9d8ed98..9ba2b57 100644
--- a/app/addons/documents/changes/components.react.jsx
+++ b/app/addons/documents/changes/components.react.jsx
@@ -14,13 +14,14 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/documents/changes/actions',
   'addons/documents/changes/stores',
   'addons/fauxton/components.react',
   'addons/components/react-components.react',
 
   'plugins/prettify'
-], function (app, FauxtonAPI, React, Actions, Stores, Components, ReactComponents) {
+], function (app, FauxtonAPI, React, ReactDOM, Actions, Stores, Components, ReactComponents) {
 
   var changesStore = Stores.changesStore;
   var ReactCSSTransitionGroup = React.addons.CSSTransitionGroup;
@@ -64,7 +65,8 @@ define([
       return (
         <div className="changes-header-section">
           <ChangesHeaderTab onToggle={this.toggleFilterSection} />
-          <ReactCSSTransitionGroup transitionName="toggle-changes-filter" component="div" className="changes-tab-content">
+          <ReactCSSTransitionGroup transitionName="toggle-changes-filter" component="div" className="changes-tab-content"
+             transitionEnterTimeout={500} transitionLeaveTimeout={300}>
             {tabContent}
           </ReactCSSTransitionGroup>
         </div>
@@ -211,7 +213,7 @@ define([
     },
 
     focusFilterField: function () {
-      React.findDOMNode(this.refs.addItem).focus();
+      ReactDOM.findDOMNode(this.refs.addItem).focus();
     },
 
     onChangeFilter: function (e) {
@@ -248,7 +250,7 @@ define([
   var FilterTooltip = React.createClass({
     componentDidMount: function () {
       if (this.props.tooltip) {
-        $(React.findDOMNode(this.refs.tooltip)).tooltip();
+        $(ReactDOM.findDOMNode(this.refs.tooltip)).tooltip();
       }
     },
 
@@ -383,7 +385,8 @@ define([
               </div>
             </div>
 
-            <ReactCSSTransitionGroup transitionName="toggle-changes-code" component="div" className="changesCodeSectionWrapper">
+            <ReactCSSTransitionGroup transitionName="toggle-changes-code" component="div" className="changesCodeSectionWrapper"
+              transitionEnterTimeout={500} transitionLeaveTimeout={300}>
               {this.getChangesCode()}
             </ReactCSSTransitionGroup>
 
@@ -416,13 +419,13 @@ define([
 
   return {
     renderHeader: function (el) {
-      React.render(<ChangesHeaderController />, el);
+      ReactDOM.render(<ChangesHeaderController />, el);
     },
     renderChanges: function (el) {
-      React.render(<ChangesController />, el);
+      ReactDOM.render(<ChangesController />, el);
     },
     remove: function (el) {
-      React.unmountComponentAtNode(el);
+      ReactDOM.unmountComponentAtNode(el);
     },
 
     ChangesHeaderController: ChangesHeaderController,

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/changes/tests/changes.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/changes/tests/changes.componentsSpec.react.jsx b/app/addons/documents/changes/tests/changes.componentsSpec.react.jsx
index 7a3e444..c5f5e62 100644
--- a/app/addons/documents/changes/tests/changes.componentsSpec.react.jsx
+++ b/app/addons/documents/changes/tests/changes.componentsSpec.react.jsx
@@ -14,11 +14,12 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/documents/changes/components.react',
   'addons/documents/changes/stores',
   'addons/documents/changes/actions',
   'testUtils'
-], function (app, FauxtonAPI, React, Changes, Stores, Actions, utils) {
+], function (app, FauxtonAPI, React, ReactDOM, Changes, Stores, Actions, utils) {
   FauxtonAPI.router = new FauxtonAPI.Router([]);
 
   var assert = utils.assert;
@@ -47,12 +48,12 @@ define([
       afterEach(function () {
         spy.restore();
         Stores.changesStore.reset();
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
       });
 
       // similar as previous, except it confirms that the action gets fired, not the custom toggle func
       it('calls toggleTabVisibility action on selecting a tab', function () {
-        TestUtils.Simulate.click($(tab.getDOMNode()).find('a')[0]);
+        TestUtils.Simulate.click($(ReactDOM.findDOMNode(tab)).find('a')[0]);
         assert.ok(spy.calledOnce);
       });
     });
@@ -69,11 +70,11 @@ define([
 
     afterEach(function () {
       Stores.changesStore.reset();
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('should call toggle function on clicking tab', function () {
-      TestUtils.Simulate.click($(tab.getDOMNode()).find('a')[0]);
+      TestUtils.Simulate.click($(ReactDOM.findDOMNode(tab)).find('a')[0]);
       assert.ok(toggleTabVisibility.calledOnce);
     });
   });
@@ -89,11 +90,11 @@ define([
 
     afterEach(function () {
       Stores.changesStore.reset();
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('should add filter markup', function () {
-      var $el = $(changesFilterEl.getDOMNode()),
+      var $el = $(ReactDOM.findDOMNode(changesFilterEl)),
           submitBtn = $el.find('[type="submit"]')[0],
           addItemField = $el.find('.js-changes-filter-field')[0];
 
@@ -109,7 +110,7 @@ define([
     });
 
     it('should call addFilter action on click', function () {
-      var $el = $(changesFilterEl.getDOMNode()),
+      var $el = $(ReactDOM.findDOMNode(changesFilterEl)),
         submitBtn = $el.find('[type="submit"]')[0],
         addItemField = $el.find('.js-changes-filter-field')[0];
 
@@ -123,7 +124,7 @@ define([
     });
 
     it('should remove filter markup', function () {
-      var $el = $(changesFilterEl.getDOMNode()),
+      var $el = $(ReactDOM.findDOMNode(changesFilterEl)),
         submitBtn = $el.find('[type="submit"]')[0],
         addItemField = $el.find('.js-changes-filter-field')[0];
 
@@ -143,7 +144,7 @@ define([
     });
 
     it('should call removeFilter action on click', function () {
-      var $el = $(changesFilterEl.getDOMNode()),
+      var $el = $(ReactDOM.findDOMNode(changesFilterEl)),
         submitBtn = $el.find('[type="submit"]')[0],
         addItemField = $el.find('.js-changes-filter-field')[0];
 
@@ -158,7 +159,7 @@ define([
     });
 
     it('should not add empty filters', function () {
-      var $el = $(changesFilterEl.getDOMNode()),
+      var $el = $(ReactDOM.findDOMNode(changesFilterEl)),
         submitBtn = $el.find('[type="submit"]')[0],
         addItemField = $el.find('.js-changes-filter-field')[0];
 
@@ -170,11 +171,11 @@ define([
     });
 
     it('should not add tooltips by default', function () {
-      assert.equal(0, $(changesFilterEl.getDOMNode()).find('.js-remove-filter').length);
+      assert.equal(0, $(ReactDOM.findDOMNode(changesFilterEl)).find('.js-remove-filter').length);
     });
 
     it('should not add the same filter twice', function () {
-      var $el = $(changesFilterEl.getDOMNode()),
+      var $el = $(ReactDOM.findDOMNode(changesFilterEl)),
           submitBtn = $el.find('[type="submit"]')[0],
           addItemField = $el.find('.js-changes-filter-field')[0];
 
@@ -213,16 +214,16 @@ define([
       container2 = document.createElement('div');
       Actions.initChanges({ databaseName: 'testDatabase' });
       headerEl  = TestUtils.renderIntoDocument(<Changes.ChangesHeaderController />, container);
-      $headerEl = $(headerEl.getDOMNode());
+      $headerEl = $(ReactDOM.findDOMNode(headerEl));
       changesEl = TestUtils.renderIntoDocument(<Changes.ChangesController />, container2);
-      $changesEl = $(changesEl.getDOMNode());
+      $changesEl = $(ReactDOM.findDOMNode(changesEl));
       Actions.updateChanges(changesResponse);
     });
 
     afterEach(function () {
       Stores.changesStore.reset();
-      React.unmountComponentAtNode(container);
-      React.unmountComponentAtNode(container2);
+      ReactDOM.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container2);
     });
 
 
@@ -320,16 +321,16 @@ define([
 
     afterEach(function () {
       Stores.changesStore.reset();
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('should truncate the number of results with very large # of changes', function () {
       // check there's no more than maxChanges results
-      assert.equal(maxChanges, $(changesEl.getDOMNode()).find('.change-box').length);
+      assert.equal(maxChanges, $(ReactDOM.findDOMNode(changesEl)).find('.change-box').length);
     });
 
     it('should show a message if the results are truncated', function () {
-      assert.equal(1, $(changesEl.getDOMNode()).find('.changes-result-limit').length);
+      assert.equal(1, $(ReactDOM.findDOMNode(changesEl)).find('.changes-result-limit').length);
     });
 
   });
@@ -349,7 +350,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
 
@@ -357,23 +358,23 @@ define([
       var changeRow = TestUtils.renderIntoDocument(<Changes.ChangeRow change={change} databaseName="testDatabase" />, container);
 
       // confirm it's hidden by default
-      assert.equal(0, $(changeRow.getDOMNode()).find('.prettyprint').length);
+      assert.equal(0, $(ReactDOM.findDOMNode(changeRow)).find('.prettyprint').length);
 
       // confirm clicking it shows the element
-      TestUtils.Simulate.click($(changeRow.getDOMNode()).find('button.btn')[0]);
-      assert.equal(1, $(changeRow.getDOMNode()).find('.prettyprint').length);
+      TestUtils.Simulate.click($(ReactDOM.findDOMNode(changeRow)).find('button.btn')[0]);
+      assert.equal(1, $(ReactDOM.findDOMNode(changeRow)).find('.prettyprint').length);
     });
 
     it('deleted docs should not be clickable', function () {
       change.deleted = true;
       var changeRow = TestUtils.renderIntoDocument(<Changes.ChangeRow change={change} databaseName="testDatabase" />, container);
-      assert.equal(0, $(changeRow.getDOMNode()).find('a.js-doc-link').length);
+      assert.equal(0, $(ReactDOM.findDOMNode(changeRow)).find('a.js-doc-link').length);
     });
 
     it('non-deleted docs should be clickable', function () {
       change.deleted = false;
       var changeRow = TestUtils.renderIntoDocument(<Changes.ChangeRow change={change} databaseName="testDatabase" />, container);
-      assert.equal(1, $(changeRow.getDOMNode()).find('a.js-doc-link').length);
+      assert.equal(1, $(ReactDOM.findDOMNode(changeRow)).find('a.js-doc-link').length);
     });
   });
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/doc-editor/components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/doc-editor/components.react.jsx b/app/addons/documents/doc-editor/components.react.jsx
index 6e1e051..56ed8d3 100644
--- a/app/addons/documents/doc-editor/components.react.jsx
+++ b/app/addons/documents/doc-editor/components.react.jsx
@@ -2,13 +2,14 @@ define([
   'api',
   'app',
   'react',
+  'react-dom',
   'addons/documents/doc-editor/actions',
   'addons/documents/doc-editor/stores',
   'addons/fauxton/components.react',
   'addons/components/react-components.react',
   'libs/react-bootstrap',
   'helpers'
-], function (FauxtonAPI, app, React, Actions, Stores, FauxtonComponents, GeneralComponents, ReactBootstrap, Helpers) {
+], function (FauxtonAPI, app, React, ReactDOM, Actions, Stores, FauxtonComponents, GeneralComponents, ReactBootstrap, Helpers) {
 
   var store = Stores.docEditorStore;
   var Modal = ReactBootstrap.Modal;
@@ -290,7 +291,7 @@ define([
       Actions.uploadAttachment({
         doc: this.props.doc,
         rev: this.props.doc.get('_rev'),
-        files: $(React.findDOMNode(this.refs.attachments))[0].files
+        files: $(ReactDOM.findDOMNode(this.refs.attachments))[0].files
       });
     },
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/doc-editor/tests/doc-editor.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/doc-editor/tests/doc-editor.componentsSpec.react.jsx b/app/addons/documents/doc-editor/tests/doc-editor.componentsSpec.react.jsx
index cdbc192..124d101 100644
--- a/app/addons/documents/doc-editor/tests/doc-editor.componentsSpec.react.jsx
+++ b/app/addons/documents/doc-editor/tests/doc-editor.componentsSpec.react.jsx
@@ -14,6 +14,7 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/documents/resources',
   'addons/documents/doc-editor/components.react',
   'addons/documents/doc-editor/stores',
@@ -22,12 +23,10 @@ define([
   'addons/databases/base',
   'testUtils',
   'libs/react-bootstrap'
-], function (app, FauxtonAPI, React, Documents, Components, Stores, Actions, ActionTypes, Databases, utils,
+], function (app, FauxtonAPI, React, ReactDOM, Documents, Components, Stores, Actions, ActionTypes, Databases, utils,
   ReactBoostrap) {
 
   FauxtonAPI.router = new FauxtonAPI.Router([]);
-  var Modal = ReactBoostrap.Modal;
-
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -71,12 +70,12 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('loading indicator appears on load', function () {
       var el = TestUtils.renderIntoDocument(<Components.DocEditorController />, container);
-      assert.equal($(el.getDOMNode()).find('.loading-lines').length, 1);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.loading-lines').length, 1);
     });
 
     it('new docs do not show the button row', function () {
@@ -90,10 +89,10 @@ define([
         }
       });
 
-      assert.equal($(el.getDOMNode()).find('.loading-lines').length, 0);
-      assert.equal($(el.getDOMNode()).find('.icon-circle-arrow-up').length, 0);
-      assert.equal($(el.getDOMNode()).find('.icon-repeat').length, 0);
-      assert.equal($(el.getDOMNode()).find('.icon-trash').length, 0);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.loading-lines').length, 0);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.icon-circle-arrow-up').length, 0);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.icon-repeat').length, 0);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.icon-trash').length, 0);
     });
 
     it('view attachments button does not appear with no attachments', function () {
@@ -106,7 +105,7 @@ define([
           doc: doc
         }
       });
-      assert.equal($(el.getDOMNode()).find('.view-attachments-section').length, 0);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.view-attachments-section').length, 0);
     });
 
     it('view attachments button shows up when the doc has attachments', function () {
@@ -119,7 +118,7 @@ define([
           doc: doc
         }
       });
-      assert.equal($(el.getDOMNode()).find('.view-attachments-section').length, 1);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.view-attachments-section').length, 1);
     });
 
     it('view attachments dropdown contains right number of docs', function () {
@@ -132,7 +131,7 @@ define([
           doc: doc
         }
       });
-      assert.equal($(el.getDOMNode()).find('.view-attachments-section .dropdown-menu li').length, 2);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.view-attachments-section .dropdown-menu li').length, 2);
     });
 
     it('view attachments dropdown contains correct urls', function () {
@@ -146,13 +145,12 @@ define([
         }
       });
 
-      var attachmentNode = $(el.getDOMNode()).find('.view-attachments-section .dropdown-menu li')[0];
+      var attachmentNode = $(ReactDOM.findDOMNode(el)).find('.view-attachments-section .dropdown-menu li')[0];
       var attachmentURLactual = $(attachmentNode).find('a').attr('href');
 
       assert.equal(attachmentURLactual, "../../id/_design/test-doc/one.png");
     });
 
-
     it('setting deleteDocModal=true in store shows modal', function () {
       var el = TestUtils.renderIntoDocument(<Components.DocEditorController database={database} />, container);
       var doc = new Documents.Doc(docWithAttachmentsJSON, { database: database });
@@ -163,14 +161,14 @@ define([
         }
       });
 
-      // this is unfortunate, but I can't find a better way to do it. Refs won't work for bootstrap modals because
-      // they add the modal to the page at the top level outside the component. There are 3 modals in the
-      // component: the upload modal, clone modal, delete doc modal. We locate it by index
-      var modals = TestUtils.scryRenderedComponentsWithType(el, Modal);
+      // uber-kludgy, but the delete doc modal is a generic dialog used multiple times, so this test first checks
+      // no modal is open, then confirms the open modal contains the delete dialog message
+      assert.equal($('body').find('.confirmation-modal').length, 0);
 
-      assert.equal(React.findDOMNode(modals[2].refs.modal), null);
       Actions.showDeleteDocModal();
-      assert.notEqual(React.findDOMNode(modals[2].refs.modal), null);
+
+      var modalContent = $('body').find('.confirmation-modal .modal-body p')[0];
+      assert.ok(/Are you sure you want to delete this document\?/.test(modalContent.innerHTML));
     });
 
     it('setting uploadDocModal=true in store shows modal', function () {
@@ -182,11 +180,10 @@ define([
           doc: doc
         }
       });
-      var modals = TestUtils.scryRenderedComponentsWithType(el, Modal);
 
-      assert.equal(React.findDOMNode(modals[1].refs.modal), null);
+      assert.equal($('body').find('.upload-file-modal').length, 0);
       Actions.showUploadModal();
-      assert.notEqual(React.findDOMNode(modals[1].refs.modal), null);
+      assert.notEqual($('body').find('.upload-file-modal').length, 0);
     });
   });
 
@@ -200,17 +197,17 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('does not show up when loading', function () {
       var el = TestUtils.renderIntoDocument(<Components.AttachmentsPanelButton isLoading={true} doc={doc} />, container);
-      assert.equal($(el.getDOMNode()).find('.panel-button').length, 0);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.panel-button').length, 0);
     });
 
     it('shows up after loading', function () {
       var el = TestUtils.renderIntoDocument(<Components.AttachmentsPanelButton isLoading={false} doc={doc} />, container);
-      assert.equal($(el.getDOMNode()).find('.panel-button').length, 1);
+      assert.equal($(ReactDOM.findDOMNode(el)).find('.panel-button').length, 1);
     });
   });
 
@@ -231,12 +228,12 @@ define([
 
       var container = document.createElement('div');
       var el = TestUtils.renderIntoDocument(<Components.DocEditorController database={database} />, container);
-      assert.isTrue(/Oh\sno\sshe\sdi'n't!/.test(el.getDOMNode().outerHTML));
+      assert.isTrue(/Oh\sno\sshe\sdi'n't!/.test(ReactDOM.findDOMNode(el).outerHTML));
 
       // confirm the database name was also included
-      assert.equal($(el.getDOMNode()).find("#testDatabaseName").html(), database.id);
+      assert.equal($(ReactDOM.findDOMNode(el)).find("#testDatabaseName").html(), database.id);
 
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
   });
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/helpers.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/helpers.js b/app/addons/documents/helpers.js
index 17d774c..81be185 100644
--- a/app/addons/documents/helpers.js
+++ b/app/addons/documents/helpers.js
@@ -16,7 +16,6 @@ define([
 ], function (app, FauxtonAPI) {
 
 
-
   function getPreviousPageForDoc (database, wasCloned) {
     var previousPage = database.url('index'), // default to the current database's all_docs page
         lastPages = FauxtonAPI.router.lastPages;
@@ -81,12 +80,15 @@ define([
     };
   }
 
+  function parseJSON (str) {
+    return JSON.parse('"' + str + '"');   // this ensures newlines are converted
+  }
 
   return {
     getPreviousPageForDoc: getPreviousPageForDoc,
     getPreviousPage: getPreviousPage,
     getSeqNum: getSeqNum,
     getNewButtonLinks: getNewButtonLinks,
-
+    parseJSON: parseJSON
   };
 });


[6/6] fauxton commit: updated refs/heads/master to e6450a0

Posted by be...@apache.org.
Updating React to 0.14.6


Project: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/commit/d0cb3d81
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/tree/d0cb3d81
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/diff/d0cb3d81

Branch: refs/heads/master
Commit: d0cb3d8127b4094b44cbb38e77334664f11fba2d
Parents: 574af6a
Author: Ben Keen <be...@gmail.com>
Authored: Tue Jan 19 09:49:30 2016 -0800
Committer: Ben Keen <be...@gmail.com>
Committed: Mon Feb 1 08:39:35 2016 -0800

----------------------------------------------------------------------
 assets/js/libs/react-dom.js |    42 +
 assets/js/libs/react.js     | 37013 ++++++++++++++++++-------------------
 2 files changed, 18108 insertions(+), 18947 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/d0cb3d81/assets/js/libs/react-dom.js
----------------------------------------------------------------------
diff --git a/assets/js/libs/react-dom.js b/assets/js/libs/react-dom.js
new file mode 100644
index 0000000..928ddd4
--- /dev/null
+++ b/assets/js/libs/react-dom.js
@@ -0,0 +1,42 @@
+/**
+ * ReactDOM v0.14.6
+ *
+ * Copyright 2013-2015, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ *
+ */
+// Based off https://github.com/ForbesLindesay/umd/blob/master/template.js
+;(function(f) {
+  // CommonJS
+  if (typeof exports === "object" && typeof module !== "undefined") {
+    module.exports = f(require('react'));
+
+    // RequireJS
+  } else if (typeof define === "function" && define.amd) {
+    define(['react'], f);
+
+    // <script>
+  } else {
+    var g
+    if (typeof window !== "undefined") {
+      g = window;
+    } else if (typeof global !== "undefined") {
+      g = global;
+    } else if (typeof self !== "undefined") {
+      g = self;
+    } else {
+      // works providing we're not in "use strict";
+      // needed for Java 8 Nashorn
+      // see https://github.com/facebook/react/issues/3037
+      g = this;
+    }
+    g.ReactDOM = f(g.React);
+  }
+
+})(function(React) {
+  return React.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
+});