react 0.14.0-alpha3 → 0.14.0-rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/README.md +5 -2
  2. package/addons.js +8 -3
  3. package/dist/react-dom.js +42 -0
  4. package/dist/react-dom.min.js +12 -0
  5. package/dist/react-with-addons.js +6076 -5337
  6. package/dist/react-with-addons.min.js +6 -6
  7. package/dist/react.js +5445 -4839
  8. package/dist/react.min.js +6 -5
  9. package/lib/{AutoFocusMixin.js → AutoFocusUtils.js} +15 -5
  10. package/lib/BeforeInputEventPlugin.js +13 -13
  11. package/lib/CSSProperty.js +18 -3
  12. package/lib/CSSPropertyOperations.js +22 -14
  13. package/lib/CallbackQueue.js +4 -4
  14. package/lib/ChangeEventPlugin.js +18 -15
  15. package/lib/DOMChildrenOperations.js +17 -7
  16. package/lib/DOMProperty.js +82 -117
  17. package/lib/DOMPropertyOperations.js +84 -33
  18. package/lib/Danger.js +21 -16
  19. package/lib/DefaultEventPluginOrder.js +2 -2
  20. package/lib/EnterLeaveEventPlugin.js +21 -13
  21. package/lib/EventConstants.js +23 -1
  22. package/lib/EventPluginHub.js +17 -20
  23. package/lib/EventPluginRegistry.js +8 -8
  24. package/lib/EventPluginUtils.js +33 -42
  25. package/lib/EventPropagators.js +8 -8
  26. package/lib/FallbackCompositionState.js +9 -3
  27. package/lib/HTMLDOMPropertyConfig.js +19 -3
  28. package/lib/LinkedStateMixin.js +2 -2
  29. package/lib/LinkedValueUtils.js +50 -38
  30. package/lib/MetaMatchers.js +118 -0
  31. package/lib/OrderedMap.js +453 -0
  32. package/lib/PooledClass.js +15 -5
  33. package/lib/React.js +18 -7
  34. package/lib/ReactBrowserComponentMixin.js +4 -4
  35. package/lib/ReactBrowserEventEmitter.js +30 -7
  36. package/lib/ReactCSSTransitionGroup.js +35 -9
  37. package/lib/ReactCSSTransitionGroupChild.js +56 -30
  38. package/lib/ReactChildReconciler.js +24 -19
  39. package/lib/ReactChildren.js +75 -35
  40. package/lib/ReactClass.js +70 -87
  41. package/lib/ReactComponent.js +27 -20
  42. package/lib/ReactComponentBrowserEnvironment.js +2 -2
  43. package/lib/ReactComponentEnvironment.js +2 -2
  44. package/lib/ReactComponentWithPureRenderMixin.js +3 -3
  45. package/lib/ReactCompositeComponent.js +117 -106
  46. package/lib/ReactDOM.js +74 -158
  47. package/lib/ReactDOMButton.js +15 -26
  48. package/lib/ReactDOMComponent.js +441 -72
  49. package/lib/ReactDOMFactories.js +177 -0
  50. package/lib/{emptyObject.js → ReactDOMFeatureFlags.js} +6 -8
  51. package/lib/ReactDOMIDOperations.js +8 -66
  52. package/lib/ReactDOMInput.js +87 -99
  53. package/lib/ReactDOMOption.js +25 -44
  54. package/lib/ReactDOMSelect.js +88 -98
  55. package/lib/ReactDOMSelection.js +3 -3
  56. package/lib/ReactDOMServer.js +5 -3
  57. package/lib/ReactDOMTextComponent.js +33 -20
  58. package/lib/ReactDOMTextarea.js +48 -61
  59. package/lib/ReactDefaultBatchingStrategy.js +4 -4
  60. package/lib/ReactDefaultInjection.js +23 -72
  61. package/lib/ReactDefaultPerf.js +7 -7
  62. package/lib/ReactDefaultPerfAnalysis.js +6 -11
  63. package/lib/ReactElement.js +92 -107
  64. package/lib/ReactElementValidator.js +53 -173
  65. package/lib/ReactEmptyComponent.js +26 -62
  66. package/lib/ReactEmptyComponentRegistry.js +48 -0
  67. package/lib/ReactErrorUtils.js +45 -9
  68. package/lib/ReactEventEmitterMixin.js +3 -4
  69. package/lib/ReactEventListener.js +64 -12
  70. package/lib/ReactFragment.js +29 -115
  71. package/lib/ReactInjection.js +10 -12
  72. package/lib/ReactInputSelection.js +8 -7
  73. package/lib/ReactInstanceHandles.js +12 -12
  74. package/lib/ReactIsomorphic.js +15 -11
  75. package/lib/ReactLink.js +1 -1
  76. package/lib/ReactMarkupChecksum.js +6 -2
  77. package/lib/ReactMount.js +196 -122
  78. package/lib/ReactMultiChild.js +119 -25
  79. package/lib/ReactMultiChildUpdateTypes.js +2 -1
  80. package/lib/ReactNativeComponent.js +3 -8
  81. package/lib/ReactNoopUpdateQueue.js +118 -0
  82. package/lib/ReactOwner.js +3 -3
  83. package/lib/ReactPerf.js +2 -2
  84. package/lib/ReactPropTransferer.js +3 -3
  85. package/lib/ReactPropTypeLocationNames.js +1 -1
  86. package/lib/ReactPropTypeLocations.js +1 -1
  87. package/lib/ReactPropTypes.js +41 -12
  88. package/lib/ReactReconcileTransaction.js +12 -10
  89. package/lib/ReactReconciler.js +8 -11
  90. package/lib/ReactRef.js +15 -2
  91. package/lib/ReactServerBatchingStrategy.js +23 -0
  92. package/lib/ReactServerRendering.js +22 -9
  93. package/lib/ReactServerRenderingTransaction.js +8 -7
  94. package/lib/ReactTestUtils.js +89 -64
  95. package/lib/ReactTransitionChildMapping.js +3 -6
  96. package/lib/ReactTransitionEvents.js +1 -1
  97. package/lib/ReactTransitionGroup.js +5 -6
  98. package/lib/ReactUpdateQueue.js +60 -35
  99. package/lib/ReactUpdates.js +15 -18
  100. package/lib/{isTextNode.js → ReactVersion.js} +2 -13
  101. package/lib/ReactWithAddons.js +24 -17
  102. package/lib/ResponderEventPlugin.js +514 -0
  103. package/lib/ResponderSyntheticEvent.js +40 -0
  104. package/lib/ResponderTouchHistoryStore.js +180 -0
  105. package/lib/SVGDOMPropertyConfig.js +1 -1
  106. package/lib/SelectEventPlugin.js +25 -16
  107. package/lib/SimpleEventPlugin.js +200 -45
  108. package/lib/SyntheticClipboardEvent.js +3 -3
  109. package/lib/SyntheticCompositionEvent.js +3 -3
  110. package/lib/SyntheticDragEvent.js +3 -3
  111. package/lib/SyntheticEvent.js +24 -8
  112. package/lib/SyntheticFocusEvent.js +3 -3
  113. package/lib/SyntheticInputEvent.js +3 -3
  114. package/lib/SyntheticKeyboardEvent.js +6 -6
  115. package/lib/SyntheticMouseEvent.js +5 -5
  116. package/lib/SyntheticTouchEvent.js +4 -4
  117. package/lib/SyntheticUIEvent.js +4 -4
  118. package/lib/SyntheticWheelEvent.js +3 -3
  119. package/lib/TapEventPlugin.js +119 -0
  120. package/lib/Transaction.js +17 -11
  121. package/lib/accumulate.js +44 -0
  122. package/lib/accumulateInto.js +2 -2
  123. package/lib/adler32.js +19 -7
  124. package/lib/cloneWithProps.js +12 -7
  125. package/lib/createHierarchyRenderer.js +85 -0
  126. package/lib/dangerousStyleValue.js +1 -1
  127. package/lib/deprecated.js +48 -0
  128. package/lib/findDOMNode.js +11 -12
  129. package/lib/flattenChildren.js +4 -4
  130. package/lib/forEachAccumulated.js +1 -1
  131. package/lib/getEventCharCode.js +1 -1
  132. package/lib/getEventKey.js +1 -1
  133. package/lib/getEventModifierState.js +0 -1
  134. package/lib/getTestDocument.js +28 -0
  135. package/lib/getTextContentAccessor.js +1 -1
  136. package/lib/instantiateReactComponent.js +27 -25
  137. package/lib/isEventSupported.js +1 -1
  138. package/lib/isTextInputElement.js +2 -1
  139. package/lib/joinClasses.js +1 -1
  140. package/lib/onlyChild.js +3 -3
  141. package/lib/quoteAttributeValueForBrowser.js +1 -1
  142. package/lib/reactComponentExpect.js +216 -0
  143. package/lib/renderSubtreeIntoContainer.js +1 -1
  144. package/lib/setInnerHTML.js +2 -2
  145. package/lib/setTextContent.js +3 -3
  146. package/lib/shallowCompare.js +1 -1
  147. package/lib/shouldUpdateReactComponent.js +12 -8
  148. package/lib/sliceChildren.js +34 -0
  149. package/lib/traverseAllChildren.js +21 -19
  150. package/lib/update.js +13 -13
  151. package/lib/validateDOMNesting.js +6 -6
  152. package/lib/webcomponents.js +6379 -0
  153. package/package.json +4 -6
  154. package/react.js +2 -0
  155. package/addons/CSSTransitionGroup.js +0 -1
  156. package/addons/LinkedStateMixin.js +0 -1
  157. package/addons/Perf.js +0 -1
  158. package/addons/PureRenderMixin.js +0 -1
  159. package/addons/TestUtils.js +0 -1
  160. package/addons/TransitionGroup.js +0 -1
  161. package/addons/batchedUpdates.js +0 -1
  162. package/addons/cloneWithProps.js +0 -1
  163. package/addons/createFragment.js +0 -1
  164. package/addons/renderSubtreeIntoContainer.js +0 -1
  165. package/addons/shallowCompare.js +0 -1
  166. package/addons/update.js +0 -1
  167. package/dist/JSXTransformer.js +0 -17589
  168. package/lib/CSSCore.js +0 -97
  169. package/lib/EventListener.js +0 -84
  170. package/lib/ExecutionEnvironment.js +0 -38
  171. package/lib/LocalEventTrapMixin.js +0 -46
  172. package/lib/ReactContext.js +0 -32
  173. package/lib/ReactDOMClient.js +0 -85
  174. package/lib/ReactDOMForm.js +0 -47
  175. package/lib/ReactDOMIframe.js +0 -43
  176. package/lib/ReactDOMImg.js +0 -44
  177. package/lib/ReactLifeCycle.js +0 -35
  178. package/lib/camelize.js +0 -32
  179. package/lib/camelizeStyleName.js +0 -40
  180. package/lib/containsNode.js +0 -55
  181. package/lib/createArrayFromMixed.js +0 -85
  182. package/lib/createFullPageComponent.js +0 -51
  183. package/lib/createNodesFromMarkup.js +0 -84
  184. package/lib/emptyFunction.js +0 -38
  185. package/lib/focusNode.js +0 -26
  186. package/lib/getActiveElement.js +0 -29
  187. package/lib/getMarkupWrap.js +0 -115
  188. package/lib/getUnboundedScrollPosition.js +0 -38
  189. package/lib/hyphenate.js +0 -33
  190. package/lib/hyphenateStyleName.js +0 -39
  191. package/lib/invariant.js +0 -49
  192. package/lib/isNode.js +0 -23
  193. package/lib/keyMirror.js +0 -48
  194. package/lib/keyOf.js +0 -35
  195. package/lib/mapObject.js +0 -51
  196. package/lib/performance.js +0 -23
  197. package/lib/performanceNow.js +0 -28
  198. package/lib/shallowEqual.js +0 -48
  199. package/lib/toArray.js +0 -57
  200. package/lib/warning.js +0 -61
@@ -11,7 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var invariant = require("./invariant");
14
+ var invariant = require('fbjs/lib/invariant');
15
15
 
16
16
  /**
17
17
  * Static poolers. Several custom versions for each potential number of
@@ -53,6 +53,17 @@ var threeArgumentPooler = function (a1, a2, a3) {
53
53
  }
54
54
  };
55
55
 
56
+ var fourArgumentPooler = function (a1, a2, a3, a4) {
57
+ var Klass = this;
58
+ if (Klass.instancePool.length) {
59
+ var instance = Klass.instancePool.pop();
60
+ Klass.call(instance, a1, a2, a3, a4);
61
+ return instance;
62
+ } else {
63
+ return new Klass(a1, a2, a3, a4);
64
+ }
65
+ };
66
+
56
67
  var fiveArgumentPooler = function (a1, a2, a3, a4, a5) {
57
68
  var Klass = this;
58
69
  if (Klass.instancePool.length) {
@@ -66,10 +77,8 @@ var fiveArgumentPooler = function (a1, a2, a3, a4, a5) {
66
77
 
67
78
  var standardReleaser = function (instance) {
68
79
  var Klass = this;
69
- !(instance instanceof Klass) ? 'production' !== process.env.NODE_ENV ? invariant(false, 'Trying to release an instance into a pool of a different type.') : invariant(false) : undefined;
70
- if (instance.destructor) {
71
- instance.destructor();
72
- }
80
+ !(instance instanceof Klass) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Trying to release an instance into a pool of a different type.') : invariant(false) : undefined;
81
+ instance.destructor();
73
82
  if (Klass.instancePool.length < Klass.poolSize) {
74
83
  Klass.instancePool.push(instance);
75
84
  }
@@ -103,6 +112,7 @@ var PooledClass = {
103
112
  oneArgumentPooler: oneArgumentPooler,
104
113
  twoArgumentPooler: twoArgumentPooler,
105
114
  threeArgumentPooler: threeArgumentPooler,
115
+ fourArgumentPooler: fourArgumentPooler,
106
116
  fiveArgumentPooler: fiveArgumentPooler
107
117
  };
108
118
 
package/lib/React.js CHANGED
@@ -11,18 +11,29 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var ReactDOMClient = require("./ReactDOMClient");
15
- var ReactDOMServer = require("./ReactDOMServer");
16
- var ReactIsomorphic = require("./ReactIsomorphic");
14
+ var ReactDOM = require('./ReactDOM');
15
+ var ReactDOMServer = require('./ReactDOMServer');
16
+ var ReactIsomorphic = require('./ReactIsomorphic');
17
17
 
18
- var assign = require("./Object.assign");
18
+ var assign = require('./Object.assign');
19
+ var deprecated = require('./deprecated');
19
20
 
21
+ // `version` will be added here by ReactIsomorphic.
20
22
  var React = {};
21
23
 
22
24
  assign(React, ReactIsomorphic);
23
- assign(React, ReactDOMClient);
24
- assign(React, ReactDOMServer);
25
25
 
26
- React.version = '0.14.0-alpha3';
26
+ assign(React, {
27
+ // ReactDOM
28
+ findDOMNode: deprecated('findDOMNode', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.findDOMNode),
29
+ render: deprecated('render', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.render),
30
+ unmountComponentAtNode: deprecated('unmountComponentAtNode', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.unmountComponentAtNode),
31
+
32
+ // ReactDOMServer
33
+ renderToString: deprecated('renderToString', 'ReactDOMServer', 'react-dom/server', ReactDOMServer, ReactDOMServer.renderToString),
34
+ renderToStaticMarkup: deprecated('renderToStaticMarkup', 'ReactDOMServer', 'react-dom/server', ReactDOMServer, ReactDOMServer.renderToStaticMarkup)
35
+ });
36
+
37
+ React.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactDOM;
27
38
 
28
39
  module.exports = React;
@@ -11,10 +11,10 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var ReactInstanceMap = require("./ReactInstanceMap");
14
+ var ReactInstanceMap = require('./ReactInstanceMap');
15
15
 
16
- var findDOMNode = require("./findDOMNode");
17
- var warning = require("./warning");
16
+ var findDOMNode = require('./findDOMNode');
17
+ var warning = require('fbjs/lib/warning');
18
18
 
19
19
  var didWarnKey = '_getDOMNodeDidWarn';
20
20
 
@@ -27,7 +27,7 @@ var ReactBrowserComponentMixin = {
27
27
  * @protected
28
28
  */
29
29
  getDOMNode: function () {
30
- 'production' !== process.env.NODE_ENV ? warning(this.constructor[didWarnKey], '%s.getDOMNode(...) is deprecated. Please use ' + 'React.findDOMNode(instance) instead.', ReactInstanceMap.get(this).getName() || this.tagName || 'Unknown') : undefined;
30
+ process.env.NODE_ENV !== 'production' ? warning(this.constructor[didWarnKey], '%s.getDOMNode(...) is deprecated. Please use ' + 'ReactDOM.findDOMNode(instance) instead.', ReactInstanceMap.get(this).getName() || this.tagName || 'Unknown') : undefined;
31
31
  this.constructor[didWarnKey] = true;
32
32
  return findDOMNode(this);
33
33
  }
@@ -12,14 +12,14 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var EventConstants = require("./EventConstants");
16
- var EventPluginHub = require("./EventPluginHub");
17
- var EventPluginRegistry = require("./EventPluginRegistry");
18
- var ReactEventEmitterMixin = require("./ReactEventEmitterMixin");
19
- var ViewportMetrics = require("./ViewportMetrics");
15
+ var EventConstants = require('./EventConstants');
16
+ var EventPluginHub = require('./EventPluginHub');
17
+ var EventPluginRegistry = require('./EventPluginRegistry');
18
+ var ReactEventEmitterMixin = require('./ReactEventEmitterMixin');
19
+ var ViewportMetrics = require('./ViewportMetrics');
20
20
 
21
- var assign = require("./Object.assign");
22
- var isEventSupported = require("./isEventSupported");
21
+ var assign = require('./Object.assign');
22
+ var isEventSupported = require('./isEventSupported');
23
23
 
24
24
  /**
25
25
  * Summary of `ReactBrowserEventEmitter` event handling:
@@ -84,7 +84,10 @@ var reactTopListenersCounter = 0;
84
84
  // lower node than `document`), binding at `document` would cause duplicate
85
85
  // events so we don't include them here
86
86
  var topEventMapping = {
87
+ topAbort: 'abort',
87
88
  topBlur: 'blur',
89
+ topCanPlay: 'canplay',
90
+ topCanPlayThrough: 'canplaythrough',
88
91
  topChange: 'change',
89
92
  topClick: 'click',
90
93
  topCompositionEnd: 'compositionend',
@@ -102,24 +105,44 @@ var topEventMapping = {
102
105
  topDragOver: 'dragover',
103
106
  topDragStart: 'dragstart',
104
107
  topDrop: 'drop',
108
+ topDurationChange: 'durationchange',
109
+ topEmptied: 'emptied',
110
+ topEncrypted: 'encrypted',
111
+ topEnded: 'ended',
112
+ topError: 'error',
105
113
  topFocus: 'focus',
106
114
  topInput: 'input',
107
115
  topKeyDown: 'keydown',
108
116
  topKeyPress: 'keypress',
109
117
  topKeyUp: 'keyup',
118
+ topLoadedData: 'loadeddata',
119
+ topLoadedMetadata: 'loadedmetadata',
120
+ topLoadStart: 'loadstart',
110
121
  topMouseDown: 'mousedown',
111
122
  topMouseMove: 'mousemove',
112
123
  topMouseOut: 'mouseout',
113
124
  topMouseOver: 'mouseover',
114
125
  topMouseUp: 'mouseup',
115
126
  topPaste: 'paste',
127
+ topPause: 'pause',
128
+ topPlay: 'play',
129
+ topPlaying: 'playing',
130
+ topProgress: 'progress',
131
+ topRateChange: 'ratechange',
116
132
  topScroll: 'scroll',
133
+ topSeeked: 'seeked',
134
+ topSeeking: 'seeking',
117
135
  topSelectionChange: 'selectionchange',
136
+ topStalled: 'stalled',
137
+ topSuspend: 'suspend',
118
138
  topTextInput: 'textInput',
139
+ topTimeUpdate: 'timeupdate',
119
140
  topTouchCancel: 'touchcancel',
120
141
  topTouchEnd: 'touchend',
121
142
  topTouchMove: 'touchmove',
122
143
  topTouchStart: 'touchstart',
144
+ topVolumeChange: 'volumechange',
145
+ topWaiting: 'waiting',
123
146
  topWheel: 'wheel'
124
147
  };
125
148
 
@@ -12,21 +12,44 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var React = require("./React");
15
+ var React = require('./React');
16
16
 
17
- var assign = require("./Object.assign");
17
+ var assign = require('./Object.assign');
18
18
 
19
- var ReactTransitionGroup = React.createFactory(require("./ReactTransitionGroup"));
20
- var ReactCSSTransitionGroupChild = React.createFactory(require("./ReactCSSTransitionGroupChild"));
19
+ var ReactTransitionGroup = require('./ReactTransitionGroup');
20
+ var ReactCSSTransitionGroupChild = require('./ReactCSSTransitionGroupChild');
21
+
22
+ function createTransitionTimeoutPropValidator(transitionType) {
23
+ var timeoutPropName = 'transition' + transitionType + 'Timeout';
24
+ var enabledPropName = 'transition' + transitionType;
25
+
26
+ return function (props) {
27
+ // If the transition is enabled
28
+ if (props[enabledPropName]) {
29
+ // If no timeout duration is provided
30
+ if (!props[timeoutPropName]) {
31
+ return new Error(timeoutPropName + ' wasn\'t supplied to ReactCSSTransitionGroup: ' + 'this can cause unreliable animations and won\'t be supported in ' + 'a future version of React. See ' + 'https://fb.me/react-animation-transition-group-timeout for more ' + 'information.');
32
+
33
+ // If the duration isn't a number
34
+ } else if (typeof props[timeoutPropName] !== 'number') {
35
+ return new Error(timeoutPropName + ' must be a number (in milliseconds)');
36
+ }
37
+ }
38
+ };
39
+ }
21
40
 
22
41
  var ReactCSSTransitionGroup = React.createClass({
23
42
  displayName: 'ReactCSSTransitionGroup',
24
43
 
25
44
  propTypes: {
26
- transitionName: React.PropTypes.string.isRequired,
45
+ transitionName: ReactCSSTransitionGroupChild.propTypes.name,
46
+
27
47
  transitionAppear: React.PropTypes.bool,
28
48
  transitionEnter: React.PropTypes.bool,
29
- transitionLeave: React.PropTypes.bool
49
+ transitionLeave: React.PropTypes.bool,
50
+ transitionAppearTimeout: createTransitionTimeoutPropValidator('Appear'),
51
+ transitionEnterTimeout: createTransitionTimeoutPropValidator('Enter'),
52
+ transitionLeaveTimeout: createTransitionTimeoutPropValidator('Leave')
30
53
  },
31
54
 
32
55
  getDefaultProps: function () {
@@ -41,16 +64,19 @@ var ReactCSSTransitionGroup = React.createClass({
41
64
  // We need to provide this childFactory so that
42
65
  // ReactCSSTransitionGroupChild can receive updates to name, enter, and
43
66
  // leave while it is leaving.
44
- return ReactCSSTransitionGroupChild({
67
+ return React.createElement(ReactCSSTransitionGroupChild, {
45
68
  name: this.props.transitionName,
46
69
  appear: this.props.transitionAppear,
47
70
  enter: this.props.transitionEnter,
48
- leave: this.props.transitionLeave
71
+ leave: this.props.transitionLeave,
72
+ appearTimeout: this.props.transitionAppearTimeout,
73
+ enterTimeout: this.props.transitionEnterTimeout,
74
+ leaveTimeout: this.props.transitionLeaveTimeout
49
75
  }, child);
50
76
  },
51
77
 
52
78
  render: function () {
53
- return ReactTransitionGroup(assign({}, this.props, { childFactory: this._wrapChild }));
79
+ return React.createElement(ReactTransitionGroup, assign({}, this.props, { childFactory: this._wrapChild }));
54
80
  }
55
81
  });
56
82
 
@@ -12,45 +12,68 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var React = require("./React");
15
+ var React = require('./React');
16
+ var ReactDOM = require('./ReactDOM');
16
17
 
17
- var CSSCore = require("./CSSCore");
18
- var ReactTransitionEvents = require("./ReactTransitionEvents");
18
+ var CSSCore = require('fbjs/lib/CSSCore');
19
+ var ReactTransitionEvents = require('./ReactTransitionEvents');
19
20
 
20
- var onlyChild = require("./onlyChild");
21
- var warning = require("./warning");
21
+ var onlyChild = require('./onlyChild');
22
22
 
23
23
  // We don't remove the element from the DOM until we receive an animationend or
24
24
  // transitionend event. If the user screws up and forgets to add an animation
25
25
  // their node will be stuck in the DOM forever, so we detect if an animation
26
26
  // does not start and if it doesn't, we just call the end listener immediately.
27
27
  var TICK = 17;
28
- var NO_EVENT_TIMEOUT = 5000;
29
-
30
- var noEventListener = null;
31
-
32
- if ('production' !== process.env.NODE_ENV) {
33
- noEventListener = function () {
34
- 'production' !== process.env.NODE_ENV ? warning(false, 'transition(): tried to perform an animation without ' + 'an animationend or transitionend event after timeout (' + '%sms). You should either disable this ' + 'transition in JS or add a CSS animation/transition.', NO_EVENT_TIMEOUT) : undefined;
35
- };
36
- }
37
28
 
38
29
  var ReactCSSTransitionGroupChild = React.createClass({
39
30
  displayName: 'ReactCSSTransitionGroupChild',
40
31
 
41
- transition: function (animationType, finishCallback) {
42
- var node = React.findDOMNode(this);
43
- var className = this.props.name + '-' + animationType;
44
- var activeClassName = className + '-active';
45
- var noEventTimeout = null;
32
+ propTypes: {
33
+ name: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.shape({
34
+ enter: React.PropTypes.string,
35
+ leave: React.PropTypes.string,
36
+ active: React.PropTypes.string
37
+ }), React.PropTypes.shape({
38
+ enter: React.PropTypes.string,
39
+ enterActive: React.PropTypes.string,
40
+ leave: React.PropTypes.string,
41
+ leaveActive: React.PropTypes.string,
42
+ appear: React.PropTypes.string,
43
+ appearActive: React.PropTypes.string
44
+ })]).isRequired,
45
+
46
+ // Once we require timeouts to be specified, we can remove the
47
+ // boolean flags (appear etc.) and just accept a number
48
+ // or a bool for the timeout flags (appearTimeout etc.)
49
+ appear: React.PropTypes.bool,
50
+ enter: React.PropTypes.bool,
51
+ leave: React.PropTypes.bool,
52
+ appearTimeout: React.PropTypes.number,
53
+ enterTimeout: React.PropTypes.number,
54
+ leaveTimeout: React.PropTypes.number
55
+ },
56
+
57
+ transition: function (animationType, finishCallback, userSpecifiedDelay) {
58
+ var node = ReactDOM.findDOMNode(this);
59
+
60
+ if (!node) {
61
+ if (finishCallback) {
62
+ finishCallback();
63
+ }
64
+ return;
65
+ }
66
+
67
+ var className = this.props.name[animationType] || this.props.name + '-' + animationType;
68
+ var activeClassName = this.props.name[animationType + 'Active'] || className + '-active';
69
+ var timeout = null;
46
70
 
47
71
  var endListener = function (e) {
48
72
  if (e && e.target !== node) {
49
73
  return;
50
74
  }
51
- if ('production' !== process.env.NODE_ENV) {
52
- clearTimeout(noEventTimeout);
53
- }
75
+
76
+ clearTimeout(timeout);
54
77
 
55
78
  CSSCore.removeClass(node, className);
56
79
  CSSCore.removeClass(node, activeClassName);
@@ -64,15 +87,18 @@ var ReactCSSTransitionGroupChild = React.createClass({
64
87
  }
65
88
  };
66
89
 
67
- ReactTransitionEvents.addEndEventListener(node, endListener);
68
-
69
90
  CSSCore.addClass(node, className);
70
91
 
71
92
  // Need to do this to actually trigger a transition.
72
93
  this.queueClass(activeClassName);
73
94
 
74
- if ('production' !== process.env.NODE_ENV) {
75
- noEventTimeout = setTimeout(noEventListener, NO_EVENT_TIMEOUT);
95
+ // If the user specified a timeout delay.
96
+ if (userSpecifiedDelay) {
97
+ // Clean-up the animation after the specified delay
98
+ timeout = setTimeout(endListener, userSpecifiedDelay);
99
+ } else {
100
+ // DEPRECATED: this listener will be removed in a future version of react
101
+ ReactTransitionEvents.addEndEventListener(node, endListener);
76
102
  }
77
103
  },
78
104
 
@@ -86,7 +112,7 @@ var ReactCSSTransitionGroupChild = React.createClass({
86
112
 
87
113
  flushClassNameQueue: function () {
88
114
  if (this.isMounted()) {
89
- this.classNameQueue.forEach(CSSCore.addClass.bind(CSSCore, React.findDOMNode(this)));
115
+ this.classNameQueue.forEach(CSSCore.addClass.bind(CSSCore, ReactDOM.findDOMNode(this)));
90
116
  }
91
117
  this.classNameQueue.length = 0;
92
118
  this.timeout = null;
@@ -104,7 +130,7 @@ var ReactCSSTransitionGroupChild = React.createClass({
104
130
 
105
131
  componentWillAppear: function (done) {
106
132
  if (this.props.appear) {
107
- this.transition('appear', done);
133
+ this.transition('appear', done, this.props.appearTimeout);
108
134
  } else {
109
135
  done();
110
136
  }
@@ -112,7 +138,7 @@ var ReactCSSTransitionGroupChild = React.createClass({
112
138
 
113
139
  componentWillEnter: function (done) {
114
140
  if (this.props.enter) {
115
- this.transition('enter', done);
141
+ this.transition('enter', done, this.props.enterTimeout);
116
142
  } else {
117
143
  done();
118
144
  }
@@ -120,7 +146,7 @@ var ReactCSSTransitionGroupChild = React.createClass({
120
146
 
121
147
  componentWillLeave: function (done) {
122
148
  if (this.props.leave) {
123
- this.transition('leave', done);
149
+ this.transition('leave', done, this.props.leaveTimeout);
124
150
  } else {
125
151
  done();
126
152
  }
@@ -12,11 +12,23 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var ReactReconciler = require("./ReactReconciler");
15
+ var ReactReconciler = require('./ReactReconciler');
16
16
 
17
- var flattenChildren = require("./flattenChildren");
18
- var instantiateReactComponent = require("./instantiateReactComponent");
19
- var shouldUpdateReactComponent = require("./shouldUpdateReactComponent");
17
+ var instantiateReactComponent = require('./instantiateReactComponent');
18
+ var shouldUpdateReactComponent = require('./shouldUpdateReactComponent');
19
+ var traverseAllChildren = require('./traverseAllChildren');
20
+ var warning = require('fbjs/lib/warning');
21
+
22
+ function instantiateChild(childInstances, child, name) {
23
+ // We found a component instance.
24
+ var keyUnique = childInstances[name] === undefined;
25
+ if (process.env.NODE_ENV !== 'production') {
26
+ process.env.NODE_ENV !== 'production' ? warning(keyUnique, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.', name) : undefined;
27
+ }
28
+ if (child != null && keyUnique) {
29
+ childInstances[name] = instantiateReactComponent(child, null);
30
+ }
31
+ }
20
32
 
21
33
  /**
22
34
  * ReactChildReconciler provides helpers for initializing or updating a set of
@@ -24,7 +36,6 @@ var shouldUpdateReactComponent = require("./shouldUpdateReactComponent");
24
36
  * does diffed reordering and insertion.
25
37
  */
26
38
  var ReactChildReconciler = {
27
-
28
39
  /**
29
40
  * Generates a "mount image" for each of the supplied children. In the case
30
41
  * of `ReactDOMComponent`, a mount image is a string of markup.
@@ -34,36 +45,30 @@ var ReactChildReconciler = {
34
45
  * @internal
35
46
  */
36
47
  instantiateChildren: function (nestedChildNodes, transaction, context) {
37
- var children = flattenChildren(nestedChildNodes);
38
- for (var name in children) {
39
- if (children.hasOwnProperty(name)) {
40
- var child = children[name];
41
- // The rendered children must be turned into instances as they're
42
- // mounted.
43
- var childInstance = instantiateReactComponent(child, null);
44
- children[name] = childInstance;
45
- }
48
+ if (nestedChildNodes == null) {
49
+ return null;
46
50
  }
47
- return children;
51
+ var childInstances = {};
52
+ traverseAllChildren(nestedChildNodes, instantiateChild, childInstances);
53
+ return childInstances;
48
54
  },
49
55
 
50
56
  /**
51
57
  * Updates the rendered children and returns a new set of children.
52
58
  *
53
59
  * @param {?object} prevChildren Previously initialized set of children.
54
- * @param {?object} nextNestedChildNodes Nested child maps.
60
+ * @param {?object} nextChildren Flat child element maps.
55
61
  * @param {ReactReconcileTransaction} transaction
56
62
  * @param {object} context
57
63
  * @return {?object} A new set of child instances.
58
64
  * @internal
59
65
  */
60
- updateChildren: function (prevChildren, nextNestedChildNodes, transaction, context) {
66
+ updateChildren: function (prevChildren, nextChildren, transaction, context) {
61
67
  // We currently don't have a way to track moves here but if we use iterators
62
68
  // instead of for..in we can zip the iterators and check if an item has
63
69
  // moved.
64
70
  // TODO: If nothing has changed, return the prevChildren object so that we
65
71
  // can quickly bailout if nothing has changed.
66
- var nextChildren = flattenChildren(nextNestedChildNodes);
67
72
  if (!nextChildren && !prevChildren) {
68
73
  return null;
69
74
  }
@@ -75,7 +80,7 @@ var ReactChildReconciler = {
75
80
  var prevChild = prevChildren && prevChildren[name];
76
81
  var prevElement = prevChild && prevChild._currentElement;
77
82
  var nextElement = nextChildren[name];
78
- if (shouldUpdateReactComponent(prevElement, nextElement)) {
83
+ if (prevChild != null && shouldUpdateReactComponent(prevElement, nextElement)) {
79
84
  ReactReconciler.receiveComponent(prevChild, nextElement, transaction, context);
80
85
  nextChildren[name] = prevChild;
81
86
  } else {