': 'port (default: 8080)'
98 | }
99 | });
100 |
101 | gulp.task('publish', 'Publish all targets.', [
102 | 'publish-amd',
103 | 'publish-cjs'
104 | ]);
105 |
106 | gulp.task('publish-amd', 'Publish AMD.', function () {
107 | });
108 |
109 | gulp.task('publish-cjs', 'Publish CommonJS.', function () {
110 | return gulp.src('')
111 | .pipe(gulpShell([
112 | 'npm publish dist/cjs'
113 | ], {cwd: __dirname}));
114 | });
115 |
116 | gulp.task('publish-examples', 'Publish Examples.', function () {
117 | return gulp.src('')
118 | .pipe(gulpShell([
119 | 'git init',
120 | 'git add .',
121 | 'git commit -m Publish',
122 | 'git remote add origin git@github.com:react-famous/react-famous.github.io.git',
123 | 'git push -fu origin master'
124 | ].join('&&'), {cwd: path.join(__dirname, 'dist/examples')}));
125 | });
126 |
127 | gulp.task('default', false, ['help']);
128 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "dependencies": {
4 | "babel": "^4.7.3",
5 | "babel-core": "^4.7.3",
6 | "babel-loader": "^4.1.0",
7 | "css-loader": "^0.9.1",
8 | "del": "^1.1.1",
9 | "extract-text-webpack-plugin": "^0.3.8",
10 | "famous": "^0.3.5",
11 | "gulp": "^3.8.11",
12 | "gulp-babel": "^4.0.0",
13 | "gulp-help": "^1.3.3",
14 | "gulp-rename": "^1.2.0",
15 | "gulp-shell": "^0.3.0",
16 | "gulp-util": "^3.0.4",
17 | "gulp-wrap-amd": "^0.4.1",
18 | "imports-loader": "^0.6.3",
19 | "less": "^2.4.0",
20 | "less-loader": "^2.1.0",
21 | "lodash": "^3.4.0",
22 | "merge-stream": "^0.1.7",
23 | "minimist": "^1.1.0",
24 | "react": "^0.13.1",
25 | "react-hot-loader": "^1.1.7",
26 | "react-proxy-loader": "^0.3.3",
27 | "react-router": "^0.13.2",
28 | "style-loader": "^0.8.3",
29 | "webpack": "^1.7.2",
30 | "webpack-dev-server": "^1.7.0"
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/core/Context.jsx:
--------------------------------------------------------------------------------
1 | import FamousContext from 'famous/core/Context';
2 | import isUndefined from 'lodash/lang/isUndefined';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 | import Engine from './Engine';
8 |
9 | class Context extends FamousComponent {
10 | constructor(...args) {
11 | super(...args);
12 |
13 | this.famousContext = true;
14 | }
15 |
16 | famousCreate() {
17 | return Engine.createContext(React.findDOMNode(this.refs.container));
18 | }
19 |
20 | famousCreateNode() {
21 | let context = this.getFamous();
22 | let node = context;
23 | let next = this.getFamousChildrenRef().map((child) => [child, context]);
24 | return [node, next];
25 | }
26 |
27 | famousDelete() {
28 | Engine.deregisterContext(this.getFamousNode());
29 | }
30 |
31 | famousUpdate(nextProps) {
32 | let context = this.getFamous();
33 |
34 | if (!isUndefined(nextProps.perspective)) {
35 | context.setPerspective(nextProps.perspective);
36 | }
37 | }
38 |
39 | render() {
40 | return (
41 |
42 |
43 | {this.getFamousChildren()}
44 |
45 |
46 |
47 | );
48 | }
49 | }
50 |
51 | defaults(Context, FamousContext);
52 |
53 | Context.propTypes = {
54 | perspective: React.PropTypes.number
55 | };
56 |
57 | export default Context;
58 |
--------------------------------------------------------------------------------
/src/core/Engine.js:
--------------------------------------------------------------------------------
1 | import FamousEngine from 'famous/core/Engine';
2 | // import ReactUpdates from 'react/lib/ReactUpdates';
3 |
4 | import '../lib/FamousPatch';
5 |
6 | // ReactUpdates.injection.injectBatchingStrategy({
7 | // isBatchingUpdates: true,
8 | // batchedUpdates(callback, param) {
9 | // callback(param);
10 | // }
11 | // });
12 | // FamousEngine.on('prerender', ReactUpdates.flushBatchedUpdates.bind(ReactUpdates));
13 |
14 | FamousEngine.setOptions({
15 | appMode: false
16 | });
17 |
18 | export default FamousEngine;
19 |
--------------------------------------------------------------------------------
/src/core/Modifier.jsx:
--------------------------------------------------------------------------------
1 | import FamousModifier from 'famous/core/Modifier';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 |
7 | class Modifier extends FamousComponent {
8 | famousCreate() {
9 | return new FamousModifier(this.props.options);
10 | }
11 |
12 | famousCreateNode(parentNode) {
13 | let modifier = this.getFamous();
14 | let node = parentNode.add(modifier);
15 | let next = this.getFamousChildrenRef().map((child, idx) => [child, node]);
16 | return [node, next];
17 | }
18 |
19 | famousUpdate(nextProps) {
20 | let modifier = this.getFamous();
21 |
22 | if (nextProps.options.transform) {
23 | modifier.setTransform(nextProps.options.transform);
24 | }
25 | if (nextProps.options.opacity !== undefined) {
26 | modifier.setOpacity(nextProps.options.opacity);
27 | }
28 | if (nextProps.options.origin) {
29 | modifier.setOrigin(nextProps.options.origin);
30 | }
31 | if (nextProps.options.align) {
32 | modifier.setAlign(nextProps.options.align);
33 | }
34 | if (nextProps.options.size) {
35 | modifier.setSize(nextProps.options.size);
36 | }
37 | if (nextProps.options.proportions) {
38 | modifier.setProportions(nextProps.options.proportions);
39 | }
40 | }
41 |
42 | render() {
43 | return (
44 |
45 | {this.getFamousChildren()}
46 |
47 | );
48 | }
49 | }
50 |
51 | defaults(Modifier, FamousModifier);
52 |
53 | export default Modifier;
54 |
--------------------------------------------------------------------------------
/src/core/RenderNode.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 |
7 | class RenderNode extends FamousComponent {
8 | famousCreate() {
9 | return new FamousRenderNode();
10 | }
11 |
12 | famousCreateNode(parentNode) {
13 | let renderNode = this.getFamous();
14 | let node = parentNode.add(renderNode);
15 | let next = this.getFamousChildrenRef().map((child, idx) => [child, node]);
16 | return [node, next];
17 | }
18 |
19 | render() {
20 | return (
21 |
22 | {this.getFamousChildren()}
23 |
24 | );
25 | }
26 | }
27 |
28 | defaults(RenderNode, FamousRenderNode);
29 |
30 | export default RenderNode;
31 |
--------------------------------------------------------------------------------
/src/core/Surface.jsx:
--------------------------------------------------------------------------------
1 | import FamousSurface from 'famous/core/Surface';
2 | import isUndefined from 'lodash/lang/isUndefined';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 | import FamousConstants from '../lib/FamousConstants';
8 | import FamousUtil from '../lib/FamousUtil';
9 |
10 | class Surface extends FamousComponent {
11 | famousCreate() {
12 | let surface = new FamousSurface(this.props.options);
13 |
14 | FamousConstants.SURFACE_EVENTS.forEach((event) => {
15 | if (this.props[event.prop]) {
16 | surface.on(event.type, () => {
17 | this.props[event.prop](this.props.eventKey);
18 | });
19 | }
20 | });
21 |
22 | return surface;
23 | }
24 |
25 | famousCreateNode(parentNode) {
26 | let surface = this.getFamous();
27 | let node = parentNode.add(surface);
28 | return [node, null];
29 | }
30 |
31 | famousUpdate(nextProps) {
32 | let surface = this.getFamous();
33 | let content;
34 |
35 | if (!isUndefined(nextProps.children)) {
36 | content = FamousUtil.renderContent(nextProps.children);
37 | }
38 |
39 | surface.setOptions(defaults({}, nextProps.options, {content}));
40 | }
41 |
42 | render() {
43 | return (
44 |
45 | );
46 | }
47 | }
48 |
49 | defaults(Surface, FamousSurface);
50 |
51 | Surface.propTypes = defaults({}, FamousConstants.SURFACE_PROPTYPES);
52 |
53 | export default Surface;
54 |
--------------------------------------------------------------------------------
/src/core/View.jsx:
--------------------------------------------------------------------------------
1 | import FamousView from 'famous/core/View';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 |
7 | class View extends FamousComponent {
8 | famousCreate() {
9 | return new FamousView(this.props.options);
10 | }
11 |
12 | famousCreateNode(parentNode) {
13 | let view = this.getFamous();
14 | parentNode.add(view);
15 | let next = this.getFamousChildrenRef().map((child, idx) => [child, view]);
16 | return [view, next];
17 | }
18 |
19 | famousUpdate(nextProps) {
20 | let view = this.getFamous();
21 |
22 | view.setOptions(nextProps.options);
23 | }
24 |
25 | render() {
26 | return (
27 |
28 | {this.getFamousChildren()}
29 |
30 | );
31 | }
32 | }
33 |
34 | defaults(View, FamousView);
35 |
36 | export default View;
37 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | export default {
2 | core: {
3 | Context: require('./core/Context'),
4 | Engine: require('./core/Engine'),
5 | Modifier: require('./core/Modifier'),
6 | RenderNode: require('./core/RenderNode'),
7 | Surface: require('./core/Surface'),
8 | View: require('./core/View')
9 | },
10 | lib: {
11 | FamousComponent: require('./lib/FamousComponent'),
12 | FamousConstants: require('./lib/FamousConstants'),
13 | FamousMixin: require('./lib/FamousMixin'),
14 | FamousNodeMixin: require('./lib/FamousNodeMixin'),
15 | FamousPatch: require('./lib/FamousPatch'),
16 | FamousScheduler: require('./lib/FamousScheduler'),
17 | FamousUtil: require('./lib/FamousUtil'),
18 | ReactNode: require('./lib/ReactNode')
19 | },
20 | modifiers: {
21 | Draggable: require('./modifiers/Draggable'),
22 | ModifierChain: require('./modifiers/ModifierChain'),
23 | StateModifier: require('./modifiers/StateModifier')
24 | },
25 | surfaces: {
26 | CanvasSurface: require('./surfaces/CanvasSurface'),
27 | ContainerSurface: require('./surfaces/ContainerSurface'),
28 | FormContainerSurface: require('./surfaces/FormContainerSurface'),
29 | ImageSurface: require('./surfaces/ImageSurface'),
30 | InputSurface: require('./surfaces/InputSurface'),
31 | SubmitInputSurface: require('./surfaces/SubmitInputSurface'),
32 | TextareaSurface: require('./surfaces/TextareaSurface'),
33 | VideoSurface: require('./surfaces/VideoSurface')
34 | },
35 | views: {
36 | ContextualView: require('./views/ContextualView'),
37 | Deck: require('./views/Deck'),
38 | DrawerLayout: require('./views/DrawerLayout'),
39 | EdgeSwapper: require('./views/EdgeSwapper'),
40 | FlexibleLayout: require('./views/FlexibleLayout'),
41 | Flipper: require('./views/Flipper'),
42 | GridLayout: require('./views/GridLayout'),
43 | HeaderFooterLayout: require('./views/HeaderFooterLayout'),
44 | Lightbox: require('./views/Lightbox'),
45 | RenderController: require('./views/RenderController'),
46 | ScrollContainer: require('./views/ScrollContainer'),
47 | Scroller: require('./views/Scroller'),
48 | Scrollview: require('./views/Scrollview'),
49 | SequentialLayout: require('./views/SequentialLayout'),
50 | SizeAwareView: require('./views/SizeAwareView')
51 | }
52 | };
53 |
--------------------------------------------------------------------------------
/src/lib/FamousComponent.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | import FamousMixin from './FamousMixin';
4 |
5 | export default React.createClass({
6 | mixins: [FamousMixin],
7 |
8 | render() {
9 | // Override me
10 | }
11 | });
12 |
--------------------------------------------------------------------------------
/src/lib/FamousConstants.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const SURFACE_EVENTS = [
4 | {prop: 'onClick', type: 'click'},
5 | {prop: 'onKeyDown', type: 'keydown'},
6 | {prop: 'onKeyPress', type: 'keypress'},
7 | {prop: 'onKeyUp', type: 'keyup'},
8 | {prop: 'onMouseDown', type: 'mousedown'},
9 | {prop: 'onMouseMove', type: 'mousemove'},
10 | {prop: 'onMouseOut', type: 'mouseout'},
11 | {prop: 'onMouseOver', type: 'mouseover'},
12 | {prop: 'onMouseUp', type: 'mouseup'},
13 | {prop: 'onTouchCancel', type: 'touchcancel'},
14 | {prop: 'onTouchEnd', type: 'touchend'},
15 | {prop: 'onTouchMove', type: 'touchmove'},
16 | {prop: 'onTouchStart', type: 'touchstart'}
17 | ];
18 |
19 | export const SURFACE_PROPTYPES = {
20 | eventKey: React.PropTypes.any,
21 | onClick: React.PropTypes.func,
22 | onKeyDown: React.PropTypes.func,
23 | onKeyPress: React.PropTypes.func,
24 | onKeyUp: React.PropTypes.func,
25 | onMouseDown: React.PropTypes.func,
26 | onMouseMove: React.PropTypes.func,
27 | onMouseOut: React.PropTypes.func,
28 | onMouseOver: React.PropTypes.func,
29 | onMouseUp: React.PropTypes.func,
30 | onTouchCancel: React.PropTypes.func,
31 | onTouchEnd: React.PropTypes.func,
32 | onTouchMove: React.PropTypes.func,
33 | onTouchStart: React.PropTypes.func
34 | };
35 |
36 | export default {
37 | SURFACE_EVENTS,
38 | SURFACE_PROPTYPES
39 | };
40 |
--------------------------------------------------------------------------------
/src/lib/FamousMixin.js:
--------------------------------------------------------------------------------
1 | import isEqual from 'lodash/lang/isEqual';
2 | import isFunction from 'lodash/lang/isFunction';
3 | import values from 'lodash/object/values';
4 | import React from 'react';
5 | import shallowEqual from 'react/lib/shallowEqual';
6 |
7 | import FamousNodeMixin from './FamousNodeMixin';
8 | import FamousScheduler from './FamousScheduler';
9 | import FamousUtil from './FamousUtil';
10 |
11 | export default {
12 | mixins: [FamousNodeMixin],
13 |
14 | propTypes: {
15 | options: React.PropTypes.object
16 | },
17 |
18 | getDefaultProps() {
19 | return {
20 | options: {}
21 | };
22 | },
23 |
24 | componentWillMount() {
25 | if (!this.famousContext) {
26 | if (isFunction(this.famousCreate)) {
27 | this.setFamous(this.famousCreate());
28 | }
29 | if (isFunction(this.famousUpdate)) {
30 | this.famousUpdate(this.props, this.state);
31 | }
32 | }
33 | },
34 |
35 | _createFamousNode(component, parentNode = null) {
36 | if (FamousUtil.isFamous(component)) {
37 | if (isFunction(component.famousCreateNode)) {
38 | let [node, next] = component.famousCreateNode(parentNode);
39 | component.setFamousNode(node);
40 | (next || []).forEach(([child, parentNode]) => {
41 | this._createFamousNode(child, parentNode);
42 | });
43 | }
44 | } else {
45 | let instance = FamousUtil.getInstance(component);
46 | FamousUtil.getFamousChildren(instance).forEach((child) => {
47 | this._createFamousNode(child, parentNode);
48 | });
49 | }
50 | },
51 |
52 | componentDidMount() {
53 | if (this.famousContext) {
54 | if (isFunction(this.famousCreate)) {
55 | this.setFamous(this.famousCreate());
56 | }
57 | if (isFunction(this.famousUpdate)) {
58 | this.famousUpdate(this.props, this.state);
59 | }
60 | this._createFamousNode(this);
61 | setTimeout(FamousScheduler.run);
62 | }
63 | },
64 |
65 | shouldComponentUpdate(nextProps, nextState) {
66 | return !shallowEqual(this.props, nextProps) ||
67 | !shallowEqual(this.state, nextState) ||
68 | !isEqual(this.props.options, nextProps.options);
69 | },
70 |
71 | componentWillUpdate(nextProps, nextState) {
72 | if (isFunction(this.famousUpdate)) {
73 | this.famousUpdate(nextProps, nextState);
74 | }
75 | },
76 |
77 | componentWillUnmount() {
78 | if (isFunction(this.famousDelete)) {
79 | this.famousDelete();
80 | }
81 | this.releaseFamous();
82 | }
83 | };
84 |
--------------------------------------------------------------------------------
/src/lib/FamousNodeMixin.js:
--------------------------------------------------------------------------------
1 | import merge from 'lodash/object/merge';
2 | import React from 'react';
3 |
4 | const FAMOUS_KEY = '__famous__';
5 | const FAMOUS_NODE_KEY = '__famous_node__';
6 |
7 | export default {
8 | createFamousWrapper(child, props) {
9 | return React.createElement('div', merge({
10 | 'data-famous': 'Wrapper'
11 | }, props), child);
12 | },
13 |
14 | getFamous() {
15 | return this[FAMOUS_KEY];
16 | },
17 |
18 | getFamousNode() {
19 | return this[FAMOUS_NODE_KEY];
20 | },
21 |
22 | getFamousChildren() {
23 | let result = [];
24 | let children = React.Children.forEach(this.props.children, (child, idx) => {
25 | result.push(this.createFamousWrapper(child, {key: idx, ref: idx}));
26 | });
27 | return result;
28 | },
29 |
30 | getFamousChildrenRef() {
31 | return this.getFamousChildren().map((child, idx) => {
32 | return this.refs[idx];
33 | });
34 | },
35 |
36 | releaseFamous() {
37 | delete this[FAMOUS_KEY];
38 | delete this[FAMOUS_NODE_KEY];
39 | },
40 |
41 | setFamous(famousInstance) {
42 | this[FAMOUS_KEY] = famousInstance;
43 | },
44 |
45 | setFamousNode(famousNode) {
46 | this[FAMOUS_NODE_KEY] = famousNode;
47 | }
48 | };
49 |
--------------------------------------------------------------------------------
/src/lib/FamousPatch.js:
--------------------------------------------------------------------------------
1 | import ElementAllocator from 'famous/core/ElementAllocator';
2 |
3 | let _allocate = ElementAllocator.prototype.allocate;
4 |
5 | ElementAllocator.prototype.allocate = function () {
6 | let result = _allocate.apply(this, arguments);
7 | this.container.appendChild(result);
8 | return result;
9 | };
10 |
--------------------------------------------------------------------------------
/src/lib/FamousScheduler.js:
--------------------------------------------------------------------------------
1 | const _callbacks = [];
2 |
3 | export function schedule(cb, delay) {
4 | _callbacks.push([cb, delay]);
5 | }
6 |
7 | export function run() {
8 | while (_callbacks.length) {
9 | let [cb, delay] = _callbacks.shift();
10 |
11 | if (delay) {
12 | setTimeout(cb, delay);
13 | } else {
14 | cb();
15 | }
16 | }
17 | }
18 |
19 | export default {
20 | schedule,
21 | run
22 | };
23 |
--------------------------------------------------------------------------------
/src/lib/FamousUtil.js:
--------------------------------------------------------------------------------
1 | import isFunction from 'lodash/lang/isFunction';
2 | import values from 'lodash/object/values';
3 | import React from 'react';
4 | import ReactInstanceMap from 'react/lib/ReactInstanceMap';
5 |
6 | function _buildTraversePath(fromAncestor, toDescendant) {
7 | if (fromAncestor === toDescendant) {
8 | return [fromAncestor];
9 | }
10 | let component;
11 | fromAncestor = getInstance(fromAncestor);
12 | if (component._renderedComponent) {
13 | let traversePath;
14 | if (isFunction(component._renderedComponent.getPublicInstance)) {
15 | traversePath = _buildTraversePath(component._renderedComponent.getPublicInstance(), toDescendant);
16 | } else {
17 | traversePath = _buildTraversePath(component._renderedComponent, toDescendant);
18 | }
19 | if (traversePath) {
20 | return [fromAncestor].concat(traversePath);
21 | }
22 | } else if (component._renderedChildren) {
23 | let children = values(component._renderedChildren);
24 | for (let i = 0; i < children.length; ++i) {
25 | let child = children[i];
26 | let traversePath = _buildTraversePath(child.getPublicInstance(), toDescendant);
27 | if (traversePath) {
28 | return [fromAncestor].concat(traversePath);
29 | }
30 | }
31 | }
32 | return null;
33 | }
34 |
35 | function _findKeyFromNearestDescendant(traversePath, root) {
36 | for (let i = 0; i < traversePath.length; ++i) {
37 | if (traversePath[i] === root) {
38 | let descendants = traversePath.slice(i + 1);
39 | for (let j = 0; j < descendants.length; ++j) {
40 | let descendant = descendants[j];
41 | descendant = getInstance(descendant);
42 | if (descendant._currentElement.key) {
43 | return descendant._currentElement.key;
44 | }
45 | }
46 | break;
47 | }
48 | }
49 | return null;
50 | }
51 |
52 | function _findNearestFamousAncestor(component, searchedSubpath = []) {
53 | let owner = getOwner(component);
54 | if (!owner || owner === component) {
55 | return null;
56 | }
57 | let traversePath = _buildTraversePath(owner, component).concat(searchedSubpath);
58 | let famousTraversePath = traversePath.slice(0, -1).filter(isFamous);
59 | if (famousTraversePath.length) {
60 | return famousTraversePath.slice(-1)[0];
61 | } else {
62 | let searchedSubpath = traversePath.slice(1);
63 | return _findNearestFamousAncestor(owner, searchedSubpath);
64 | }
65 | }
66 |
67 | export function getFamousChildren(component) {
68 | if (component._renderedComponent &&
69 | isFunction(component._renderedComponent.getPublicInstance)) {
70 | return [component._renderedComponent.getPublicInstance()];
71 | }
72 | let instance = component;
73 | while (instance._renderedComponent && !instance._renderedChildren) {
74 | instance = instance._renderedComponent;
75 | }
76 | if (instance._renderedChildren) {
77 | return values(instance._renderedChildren).map((child) => {
78 | return child.getPublicInstance();
79 | });
80 | }
81 | return [];
82 | }
83 |
84 | export function getFamousParent(component) {
85 | return _findNearestFamousAncestor(component);
86 | }
87 |
88 | export function getInstance(component) {
89 | if (ReactInstanceMap.has(component)) {
90 | return ReactInstanceMap.get(component);
91 | }
92 | return component;
93 | }
94 |
95 | export function getOwner(component) {
96 | let pointer = getInstance(component);
97 | let owner = null;
98 | do {
99 | pointer = pointer._currentElement._owner;
100 | if (!pointer) { break; }
101 | owner = pointer._renderedComponent.getPublicInstance();
102 | } while (owner === component);
103 | return owner;
104 | }
105 |
106 | export function isFamous(component) {
107 | let FamousComponent = require('./FamousComponent');
108 | return component instanceof FamousComponent;
109 | }
110 |
111 | export function renderContent(obj) {
112 | if (Array.isArray(obj)) {
113 | return obj.map((obj) => {
114 | return renderContent(obj);
115 | }).join('');
116 | } else if (React.isValidElement(obj)) {
117 | return React.renderToString(obj);
118 | } else {
119 | return obj;
120 | }
121 | }
122 |
123 | export default {
124 | getFamousChildren,
125 | getFamousParent,
126 | getInstance,
127 | getOwner,
128 | isFamous,
129 | renderContent
130 | };
131 |
--------------------------------------------------------------------------------
/src/lib/ReactNode.jsx:
--------------------------------------------------------------------------------
1 | import FamousSurface from 'famous/core/Surface';
2 | import isArray from 'lodash/lang/isArray';
3 | import isString from 'lodash/lang/isString';
4 | import defaults from 'lodash/object/defaults';
5 | import React from 'react';
6 |
7 | import FamousComponent from './FamousComponent';
8 |
9 | export class FamousReactNode extends FamousSurface {
10 | constructor(options, context) {
11 | super(options);
12 |
13 | this._reactContext = context;
14 |
15 | this.deploy = this.recall = () => {};
16 |
17 | this.on('deploy', this.onDeploy);
18 | this.on('recall', this.onRecall);
19 | }
20 |
21 | onDeploy() {
22 | let content = this.getContent();
23 | let context = this._reactContext;
24 | let target = this._currentTarget;
25 |
26 | if (Array.isArray(content)) {
27 | content = (
28 | {content}
29 | );
30 | } else if (isString(content)) {
31 | content = (
32 | {content}
33 | );
34 | }
35 |
36 | if (React.isValidElement(content)) {
37 | if (context) {
38 | React.withContext(context, () => {
39 | React.render(content, target);
40 | });
41 | } else {
42 | React.render(content, target);
43 | }
44 | } else {
45 | throw new Error('Content is not a valid react component');
46 | }
47 | }
48 |
49 | onRecall() {
50 | let target = this._currentTarget;
51 |
52 | React.unmountComponentAtNode(target);
53 | }
54 | }
55 |
56 | export class ReactNode extends FamousComponent {
57 | famousCreate() {
58 | return new FamousReactNode(defaults(this.props.options, {
59 | properties: {
60 | overflow: 'hidden'
61 | }
62 | }));
63 | }
64 |
65 | famousCreateNode(parentNode) {
66 | let reactNode = this.getFamous();
67 | let node = parentNode.add(reactNode);
68 | return [node, null];
69 | }
70 |
71 | famousUpdate(nextProps) {
72 | let reactNode = this.getFamous();
73 | let content = this.props.children;
74 |
75 | reactNode.setOptions(defaults({}, nextProps.options, {content}));
76 | }
77 |
78 | render() {
79 | return (
80 |
81 | );
82 | }
83 | }
84 |
85 | defaults(ReactNode, FamousReactNode);
86 |
87 | export default ReactNode;
88 |
--------------------------------------------------------------------------------
/src/modifiers/Draggable.jsx:
--------------------------------------------------------------------------------
1 | import FamousDraggable from 'famous/modifiers/Draggable';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 |
7 | class Draggable extends FamousComponent {
8 | famousCreate() {
9 | return new FamousDraggable(this.props.options);
10 | }
11 |
12 | famousCreateNode(parentNode) {
13 | let draggable = this.getFamous();
14 | let node = parentNode.add(draggable);
15 | let next = this.getFamousChildrenRef().map((child, idx) => [child, node]);
16 | return [node, next];
17 | }
18 |
19 | famousUpdate(nextProps) {
20 | let draggable = this.getFamous();
21 |
22 | draggable.setOptions(nextProps.options);
23 | }
24 |
25 | render() {
26 | return (
27 |
28 | {this.getFamousChildren()}
29 |
30 | );
31 | }
32 | }
33 |
34 | defaults(Draggable, FamousDraggable);
35 |
36 | export default Draggable;
37 |
--------------------------------------------------------------------------------
/src/modifiers/ModifierChain.jsx:
--------------------------------------------------------------------------------
1 | import FamousModifierChain from 'famous/modifiers/ModifierChain';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 |
7 | class ModifierChain extends FamousComponent {
8 | famousCreate() {
9 | let modifierChain = new FamousModifierChain(this.props.options);
10 |
11 | this.props.modifiers.forEach((modifier) => modifierChain.addModifier(modifier));
12 |
13 | return modifierChain;
14 | }
15 |
16 | famousCreateNode(parentNode) {
17 | let modifierChain = this.getFamous();
18 | let node = parentNode.add(modifierChain);
19 | let next = this.getFamousChildrenRef().map((child, idx) => [child, node]);
20 | return [node, next];
21 | }
22 |
23 | famousUpdate(nextProps) {
24 | let modifierChain = this.getFamous();
25 |
26 | this._chain.length = 0;
27 | nextProps.modifiers.forEach((modifier) => modifierChain.addModifier(modifier));
28 | }
29 |
30 | render() {
31 | return (
32 |
33 | {this.getFamousChildren()}
34 |
35 | );
36 | }
37 | }
38 |
39 | defaults(ModifierChain, FamousModifierChain);
40 |
41 | ModifierChain.propTypes = {
42 | modifiers: React.PropTypes.array
43 | };
44 |
45 | export default ModifierChain;
46 |
--------------------------------------------------------------------------------
/src/modifiers/StateModifier.jsx:
--------------------------------------------------------------------------------
1 | import FamousStateModifier from 'famous/modifiers/StateModifier';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 |
7 | class StateModifier extends FamousComponent {
8 | famousCreate() {
9 | return new FamousStateModifier(this.props.options);
10 | }
11 |
12 | famousCreateNode(parentNode) {
13 | let stateModifier = this.getFamous();
14 | let node = parentNode.add(stateModifier);
15 | let next = this.getFamousChildrenRef().map((child, idx) => [child, node]);
16 | return [node, next];
17 | }
18 |
19 | famousUpdate(nextProps) {
20 | let stateModifier = this.getFamous();
21 |
22 | if (nextProps.options.transform) {
23 | stateModifier.setTransform(nextProps.options.transform);
24 | }
25 | if (nextProps.options.opacity !== undefined) {
26 | stateModifier.setOpacity(nextProps.options.opacity);
27 | }
28 | if (nextProps.options.origin) {
29 | stateModifier.setOrigin(nextProps.options.origin);
30 | }
31 | if (nextProps.options.align) {
32 | stateModifier.setAlign(nextProps.options.align);
33 | }
34 | if (nextProps.options.size) {
35 | stateModifier.setSize(nextProps.options.size);
36 | }
37 | if (nextProps.options.proportions) {
38 | stateModifier.setProportions(nextProps.options.proportions);
39 | }
40 | }
41 |
42 | render() {
43 | return (
44 |
45 | {this.getFamousChildren()}
46 |
47 | );
48 | }
49 | }
50 |
51 | defaults(StateModifier, FamousStateModifier);
52 |
53 | export default StateModifier;
54 |
--------------------------------------------------------------------------------
/src/surfaces/CanvasSurface.jsx:
--------------------------------------------------------------------------------
1 | import FamousCanvasSurface from 'famous/surfaces/CanvasSurface';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 |
7 | class CanvasSurface extends FamousComponent {
8 | famousCreate() {
9 | return new FamousCanvasSurface(this.props.options);
10 | }
11 |
12 | famousCreateNode(parentNode) {
13 | let surface = this.getFamous();
14 | let node = parentNode.add(surface);
15 | return [node, null];
16 | }
17 |
18 | famousUpdate(nextProps) {
19 | let canvasSurface = this.getFamous();
20 |
21 | canvasSurface.setOptions(nextProps.options);
22 | }
23 |
24 | render() {
25 | return (
26 |
27 | );
28 | }
29 | }
30 |
31 | defaults(CanvasSurface, FamousCanvasSurface);
32 |
33 | export default CanvasSurface;
34 |
--------------------------------------------------------------------------------
/src/surfaces/ContainerSurface.jsx:
--------------------------------------------------------------------------------
1 | import FamousContainerSurface from 'famous/surfaces/ContainerSurface';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import Context from '../core/Context';
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class ContainerSurface extends FamousComponent {
9 | famousCreate() {
10 | return new FamousContainerSurface(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let containerSurface = this.getFamous();
15 | let node = parentNode.add(containerSurface);
16 | let next = this.getFamousChildrenRef().map((child, idx) => [child, containerSurface]);
17 | return [node, next];
18 | }
19 |
20 | famousUpdate(nextProps) {
21 | let containerSurface = this.getFamous();
22 |
23 | containerSurface.setOptions(nextProps.options);
24 | }
25 |
26 | render() {
27 | return (
28 |
29 | {this.getFamousChildren()}
30 |
31 | );
32 | }
33 | }
34 |
35 | defaults(ContainerSurface, FamousContainerSurface);
36 |
37 | export default ContainerSurface;
38 |
--------------------------------------------------------------------------------
/src/surfaces/FormContainerSurface.jsx:
--------------------------------------------------------------------------------
1 | import FamousFormContainerSurface from 'famous/surfaces/FormContainerSurface';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import Context from '../core/Context';
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class FormContainerSurface extends FamousComponent {
9 | famousCreate() {
10 | return new FamousFormContainerSurface(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let formContainerSurface = this.getFamous();
15 | let node = parentNode.add(formContainerSurface);
16 | let next = this.getFamousChildrenRef().map((child, idx) => [child, formContainerSurface]);
17 | return [node, next];
18 | }
19 |
20 | famousUpdate(nextProps) {
21 | let formContainerSurface = this.getFamous();
22 |
23 | formContainerSurface.setOptions(nextProps.options);
24 | }
25 |
26 | render() {
27 | return (
28 |
29 | {this.getFamousChildren()}
30 |
31 | );
32 | }
33 | }
34 |
35 | defaults(FormContainerSurface, FamousFormContainerSurface);
36 |
37 | export default FormContainerSurface;
38 |
--------------------------------------------------------------------------------
/src/surfaces/ImageSurface.jsx:
--------------------------------------------------------------------------------
1 | import FamousImageSurface from 'famous/surfaces/ImageSurface';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 | import FamousConstants from '../lib/FamousConstants';
7 |
8 | class ImageSurface extends FamousComponent {
9 | famousCreate() {
10 | let imageSurface = new FamousImageSurface(this.props.options);
11 |
12 | FamousConstants.SURFACE_EVENTS.forEach((event) => {
13 | if (this.props[event.prop]) {
14 | imageSurface.on(event.type, () => {
15 | this.props[event.prop](this.props.eventKey);
16 | });
17 | }
18 | });
19 |
20 | return imageSurface;
21 | }
22 |
23 | famousCreateNode(parentNode) {
24 | let imageSurface = this.getFamous();
25 | let node = parentNode.add(imageSurface);
26 | return [node, null];
27 | }
28 |
29 | famousUpdate(nextProps) {
30 | let imageSurface = this.getFamous();
31 |
32 | imageSurface.setOptions(nextProps.options);
33 | }
34 |
35 | render() {
36 | return (
37 |
38 | );
39 | }
40 | }
41 |
42 | defaults(ImageSurface, FamousImageSurface);
43 |
44 | ImageSurface.propTypes = defaults({}, FamousConstants.SURFACE_PROPTYPES);
45 |
46 | export default ImageSurface;
47 |
--------------------------------------------------------------------------------
/src/surfaces/InputSurface.jsx:
--------------------------------------------------------------------------------
1 | import FamousInputSurface from 'famous/surfaces/InputSurface';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 |
7 | class InputSurface extends FamousComponent {
8 | famousCreate() {
9 | return new FamousInputSurface(this.props.options);
10 | }
11 |
12 | famousCreateNode(parentNode) {
13 | let inputSurface = this.getFamous();
14 | let node = parentNode.add(inputSurface);
15 | return [node, null];
16 | }
17 |
18 | famousUpdate(nextProps) {
19 | let inputSurface = this.getFamous();
20 |
21 | inputSurface.setOptions(nextProps.options);
22 | }
23 |
24 | render() {
25 | return (
26 |
27 | );
28 | }
29 | }
30 |
31 | defaults(InputSurface, FamousInputSurface);
32 |
33 | export default InputSurface;
34 |
--------------------------------------------------------------------------------
/src/surfaces/SubmitInputSurface.jsx:
--------------------------------------------------------------------------------
1 | import FamousSubmitInputSurface from 'famous/surfaces/SubmitInputSurface';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 |
7 | class SubmitInputSurface extends FamousComponent {
8 | famousCreate() {
9 | return new FamousSubmitInputSurface(this.props.options);
10 | }
11 |
12 | famousCreateNode(parentNode) {
13 | let submitInputSurface = this.getFamous();
14 | let node = parentNode.add(submitInputSurface);
15 | return [node, null];
16 | }
17 |
18 | famousUpdate(nextProps) {
19 | let submitInputSurface = this.getFamous();
20 |
21 | submitInputSurface.setOptions(nextProps.options);
22 | }
23 |
24 | render() {
25 | return (
26 |
27 | );
28 | }
29 | }
30 |
31 | defaults(SubmitInputSurface, FamousSubmitInputSurface);
32 |
33 | export default SubmitInputSurface;
34 |
--------------------------------------------------------------------------------
/src/surfaces/TextareaSurface.jsx:
--------------------------------------------------------------------------------
1 | import FamousTextareaSurface from 'famous/surfaces/TextareaSurface';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 |
7 | class TextareaSurface extends FamousComponent {
8 | famousCreate() {
9 | return new FamousTextareaSurface(this.props.options);
10 | }
11 |
12 | famousCreateNode(parentNode) {
13 | let textareaSurface = this.getFamous();
14 | let node = parentNode.add(textareaSurface);
15 | return [node, null];
16 | }
17 |
18 | famousUpdate(nextProps) {
19 | let textareaSurface = this.getFamous();
20 |
21 | textareaSurface.setOptions(nextProps.options);
22 | }
23 |
24 | render() {
25 | return (
26 |
27 | );
28 | }
29 | }
30 |
31 | defaults(TextareaSurface, FamousTextareaSurface);
32 |
33 | export default TextareaSurface;
34 |
--------------------------------------------------------------------------------
/src/surfaces/VideoSurface.jsx:
--------------------------------------------------------------------------------
1 | import FamousVideoSurface from 'famous/surfaces/VideoSurface';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 |
7 | class VideoSurface extends FamousComponent {
8 | famousCreate() {
9 | return new FamousVideoSurface(this.props.options);
10 | }
11 |
12 | famousCreateNode(parentNode) {
13 | let videoSurface = this.getFamous();
14 | let node = parentNode.add(videoSurface);
15 | return [node, null];
16 | }
17 |
18 | famousUpdate(nextProps) {
19 | let videoSurface = this.getFamous();
20 |
21 | videoSurface.setOptions(nextProps.options);
22 | }
23 |
24 | render() {
25 | return (
26 |
27 | );
28 | }
29 | }
30 |
31 | defaults(VideoSurface, FamousVideoSurface);
32 |
33 | export default VideoSurface;
34 |
--------------------------------------------------------------------------------
/src/views/ContextualView.jsx:
--------------------------------------------------------------------------------
1 | import FamousContextualView from 'famous/views/ContextualView';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 |
7 | class ContextualView extends FamousComponent {
8 | famousCreate() {
9 | return new FamousContextualView(this.props.options);
10 | }
11 |
12 | famousCreateNode(parentNode) {
13 | let contextualView = this.getFamous();
14 | let node = parentNode.add(contextualView);
15 | let next = this.getFamousChildrenRef().map((child, idx) => [child, node]);
16 | return [node, next];
17 | }
18 |
19 | famousUpdate(nextProps) {
20 | let contextualView = this.getFamous();
21 |
22 | contextualView.setOptions(nextProps.options);
23 | }
24 |
25 | render() {
26 | return (
27 |
28 | {this.getFamousChildren()}
29 |
30 | );
31 | }
32 | }
33 |
34 | defaults(ContextualView, FamousContextualView);
35 |
36 | export default ContextualView;
37 |
--------------------------------------------------------------------------------
/src/views/Deck.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import FamousDeck from 'famous/views/Deck';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class Deck extends FamousComponent {
9 | famousCreate() {
10 | return new FamousDeck(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let deck = this.getFamous();
15 | let node = parentNode.add(deck);
16 | let next = [];
17 | let sequence = this.getFamousChildrenRef().map((child, idx) => {
18 | let renderNode = new FamousRenderNode();
19 | next.push([child, renderNode]);
20 | return renderNode;
21 | });
22 | deck.sequenceFrom(sequence);
23 | return [node, next];
24 | }
25 |
26 | famousUpdate(nextProps) {
27 | let deck = this.getFamous();
28 |
29 | deck.setOptions(nextProps.options);
30 | }
31 |
32 | render() {
33 | return (
34 |
35 | {this.getFamousChildren()}
36 |
37 | );
38 | }
39 | }
40 |
41 | defaults(Deck, FamousDeck);
42 |
43 | export default Deck;
44 |
--------------------------------------------------------------------------------
/src/views/DrawerLayout.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import FamousDrawerLayout from 'famous/views/DrawerLayout';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class DrawerLayout extends FamousComponent {
9 | famousCreate() {
10 | return new FamousDrawerLayout(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let drawerLayout = this.getFamous();
15 | let node = parentNode.add(drawerLayout);
16 | let next = [
17 | [this.refs.content, drawerLayout.content],
18 | [this.refs.drawer, drawerLayout.drawer]
19 | ];
20 | return [node, next];
21 | }
22 |
23 | famousUpdate(nextProps) {
24 | let drawerLayout = this.getFamous();
25 |
26 | drawerLayout.setOptions(nextProps.options);
27 | }
28 |
29 | render() {
30 | let children = [];
31 |
32 | React.Children.forEach(this.props.children, (child) => {
33 | switch (child.type) {
34 | case DrawerLayout.Content:
35 | children.push(this.createFamousWrapper(child, {key: 'content', ref: 'content'}));
36 | break;
37 | case DrawerLayout.Drawer:
38 | children.push(this.createFamousWrapper(child, {key: 'drawer', ref: 'drawer'}));
39 | break;
40 | default:
41 | break;
42 | }
43 | });
44 |
45 | return (
46 |
47 | {children}
48 |
49 | );
50 | }
51 | };
52 |
53 | DrawerLayout.Content = class extends FamousComponent {
54 | famousCreate() {
55 | return new FamousRenderNode();
56 | }
57 |
58 | famousCreateNode(parentNode) {
59 | let renderNode = this.getFamous();
60 | let node = parentNode.add(renderNode);
61 | let next = this.getFamousChildrenRef().map((child, idx) => [child, node]);
62 | return [node, next];
63 | }
64 |
65 | render() {
66 | return (
67 |
68 | {this.getFamousChildren()}
69 |
70 | );
71 | }
72 | };
73 |
74 | DrawerLayout.Drawer = class extends FamousComponent {
75 | famousCreate() {
76 | return new FamousRenderNode();
77 | }
78 |
79 | famousCreateNode(parentNode) {
80 | let renderNode = this.getFamous();
81 | let node = parentNode.add(renderNode);
82 | let next = this.getFamousChildrenRef().map((child, idx) => [child, node]);
83 | return [node, next];
84 | }
85 |
86 | render() {
87 | return (
88 |
89 | {this.getFamousChildren()}
90 |
91 | );
92 | }
93 | };
94 |
95 | defaults(DrawerLayout, FamousDrawerLayout);
96 |
97 | export default DrawerLayout;
98 |
--------------------------------------------------------------------------------
/src/views/EdgeSwapper.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import FamousEdgeSwapper from 'famous/views/EdgeSwapper';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class EdgeSwapper extends FamousComponent {
9 | famousCreate() {
10 | return new FamousEdgeSwapper(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let edgeSwapper = this.getFamous();
15 | let node = parentNode.add(edgeSwapper);
16 | let next = this.getFamousChildrenRef().map((child, idx) => [child, new FamousRenderNode()]);
17 | return [node, next];
18 | }
19 |
20 | famousUpdate(nextProps) {
21 | let edgeSwapper = this.getFamous();
22 |
23 | edgeSwapper.setOptions(nextProps.options);
24 | }
25 |
26 | render() {
27 | return (
28 |
29 | {this.getFamousChildren()}
30 |
31 | );
32 | }
33 | }
34 |
35 | defaults(EdgeSwapper, FamousEdgeSwapper);
36 |
37 | export default EdgeSwapper;
38 |
--------------------------------------------------------------------------------
/src/views/FlexibleLayout.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import FamousFlexibleLayout from 'famous/views/FlexibleLayout';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class FlexibleLayout extends FamousComponent {
9 | famousCreate() {
10 | return new FamousFlexibleLayout(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let flexibleLayout = this.getFamous();
15 | let node = parentNode.add(flexibleLayout);
16 | let next = [];
17 | let sequence = this.getFamousChildrenRef().map((child, idx) => {
18 | let renderNode = new FamousRenderNode();
19 | next.push([child, renderNode]);
20 | return renderNode;
21 | });
22 | flexibleLayout.sequenceFrom(sequence);
23 | return [node, next];
24 | }
25 |
26 | famousUpdate(nextProps) {
27 | let flexibleLayout = this.getFamous();
28 |
29 | flexibleLayout.setOptions(nextProps.options);
30 | }
31 |
32 | render() {
33 | return (
34 |
35 | {this.getFamousChildren()}
36 |
37 | );
38 | }
39 | }
40 |
41 | defaults(FlexibleLayout, FamousFlexibleLayout);
42 |
43 | export default FlexibleLayout;
44 |
--------------------------------------------------------------------------------
/src/views/Flipper.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import FamousFlipper from 'famous/views/Flipper';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class Flipper extends FamousComponent {
9 | famousCreate() {
10 | return new FamousFlipper(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let flipper = this.getFamous();
15 | let backRenderNode = new FamousRenderNode();
16 | let frontRenderNode = new FamousRenderNode();
17 | let node = parentNode.add(flipper);
18 | let next = [
19 | [this.refs.back, backRenderNode],
20 | [this.refs.front, frontRenderNode]
21 | ];
22 | flipper.setBack(backRenderNode);
23 | flipper.setFront(frontRenderNode);
24 | return [node, next];
25 | }
26 |
27 | famousUpdate(nextProps) {
28 | let flipper = this.getFamous();
29 |
30 | flipper.setOptions(nextProps.options);
31 | }
32 |
33 | render() {
34 | let children = [];
35 |
36 | React.Children.forEach(this.props.children, (child) => {
37 | switch (child.type) {
38 | case Flipper.Back:
39 | children.push(this.createFamousWrapper(child, {key: 'back', ref: 'back'}));
40 | break;
41 | case Flipper.Front:
42 | children.push(this.createFamousWrapper(child, {key: 'front', ref: 'front'}));
43 | break;
44 | default:
45 | break;
46 | }
47 | });
48 |
49 | return (
50 |
51 | {children}
52 |
53 | );
54 | }
55 | }
56 |
57 | Flipper.Back = class extends FamousComponent {
58 | famousCreate() {
59 | return new FamousRenderNode();
60 | }
61 |
62 | famousCreateNode(parentNode) {
63 | let renderNode = this.getFamous();
64 | let node = parentNode.add(renderNode);
65 | let next = this.getFamousChildrenRef().map((child, idx) => [child, node]);
66 | return [node, next];
67 | }
68 |
69 | render() {
70 | return (
71 |
72 | {this.getFamousChildren()}
73 |
74 | );
75 | }
76 | };
77 |
78 | Flipper.Front = class extends FamousComponent {
79 | famousCreate() {
80 | return new FamousRenderNode();
81 | }
82 |
83 | famousCreateNode(parentNode) {
84 | let renderNode = this.getFamous();
85 | let node = parentNode.add(renderNode);
86 | let next = this.getFamousChildrenRef().map((child, idx) => [child, node]);
87 | return [node, next];
88 | }
89 |
90 | render() {
91 | return (
92 |
93 | {this.getFamousChildren()}
94 |
95 | );
96 | }
97 | }
98 |
99 | defaults(Flipper, FamousFlipper);
100 |
101 | export default Flipper;
102 |
--------------------------------------------------------------------------------
/src/views/GridLayout.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import FamousGridLayout from 'famous/views/GridLayout';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class GridLayout extends FamousComponent {
9 | famousCreate() {
10 | return new FamousGridLayout(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let gridLayout = this.getFamous();
15 | let node = parentNode.add(gridLayout);
16 | let next = [];
17 | let sequence = this.getFamousChildrenRef().map((child, idx) => {
18 | let renderNode = new FamousRenderNode();
19 | next.push([child, renderNode]);
20 | return renderNode;
21 | });
22 | gridLayout.sequenceFrom(sequence);
23 | return [node, next];
24 | }
25 |
26 | famousUpdate(nextProps) {
27 | let gridLayout = this.getFamous();
28 |
29 | gridLayout.setOptions(nextProps.options);
30 | }
31 |
32 | render() {
33 | return (
34 |
35 | {this.getFamousChildren()}
36 |
37 | );
38 | }
39 | }
40 |
41 | defaults(GridLayout, FamousGridLayout);
42 |
43 | export default GridLayout;
44 |
--------------------------------------------------------------------------------
/src/views/HeaderFooterLayout.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import FamousHeaderFooterLayout from 'famous/views/HeaderFooterLayout';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class HeaderFooterLayout extends FamousComponent {
9 | famousCreate() {
10 | return new FamousHeaderFooterLayout(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let headerFooterlayout = this.getFamous();
15 | let node = parentNode.add(headerFooterlayout);
16 | let next = [
17 | [this.refs.content, headerFooterlayout.content],
18 | [this.refs.footer, headerFooterlayout.footer],
19 | [this.refs.header, headerFooterlayout.header]
20 | ];
21 | return [node, next];
22 | }
23 |
24 | famousUpdate(nextProps) {
25 | let headerFooterlayout = this.getFamous();
26 |
27 | headerFooterlayout.setOptions(nextProps.options);
28 | }
29 |
30 | render() {
31 | let children = [];
32 |
33 | React.Children.forEach(this.props.children, (child) => {
34 | switch (child.type) {
35 | case HeaderFooterLayout.Content:
36 | children.push(this.createFamousWrapper(child, {key: 'content', ref: 'content'}));
37 | break;
38 | case HeaderFooterLayout.Footer:
39 | children.push(this.createFamousWrapper(child, {key: 'footer', ref: 'footer'}));
40 | break;
41 | case HeaderFooterLayout.Header:
42 | children.push(this.createFamousWrapper(child, {key: 'header', ref: 'header'}));
43 | break;
44 | default:
45 | break;
46 | }
47 | });
48 |
49 | return (
50 |
51 | {children}
52 |
53 | );
54 | }
55 | };
56 |
57 | HeaderFooterLayout.Content = class extends FamousComponent {
58 | famousCreate() {
59 | return new FamousRenderNode();
60 | }
61 |
62 | famousCreateNode(parentNode) {
63 | let renderNode = this.getFamous();
64 | let node = parentNode.add(renderNode);
65 | let next = this.getFamousChildrenRef().map((child, idx) => [child, node]);
66 | return [node, next];
67 | }
68 |
69 | render() {
70 | return (
71 |
72 | {this.getFamousChildren()}
73 |
74 | );
75 | }
76 | };
77 |
78 | HeaderFooterLayout.Footer = class extends FamousComponent {
79 | famousCreate() {
80 | return new FamousRenderNode();
81 | }
82 |
83 | famousCreateNode(parentNode) {
84 | let renderNode = this.getFamous();
85 | let node = parentNode.add(renderNode);
86 | let next = this.getFamousChildrenRef().map((child, idx) => [child, node]);
87 | return [node, next];
88 | }
89 |
90 | render() {
91 | return (
92 |
93 | {this.getFamousChildren()}
94 |
95 | );
96 | }
97 | };
98 |
99 | HeaderFooterLayout.Header = class extends FamousComponent {
100 | famousCreate() {
101 | return new FamousRenderNode();
102 | }
103 |
104 | famousCreateNode(parentNode) {
105 | let renderNode = this.getFamous();
106 | let node = parentNode.add(renderNode);
107 | let next = this.getFamousChildrenRef().map((child, idx) => [child, node]);
108 | return [node, next];
109 | }
110 |
111 | render() {
112 | return (
113 |
114 | {this.getFamousChildren()}
115 |
116 | );
117 | }
118 | }
119 |
120 | defaults(HeaderFooterLayout, FamousHeaderFooterLayout);
121 |
122 | export default HeaderFooterLayout;
123 |
--------------------------------------------------------------------------------
/src/views/Lightbox.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import FamousLightbox from 'famous/views/Lightbox';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class Lightbox extends FamousComponent {
9 | famousCreate() {
10 | return new FamousLightbox(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let lightbox = this.getFamous();
15 | let node = parentNode.add(lightbox);
16 | let next = this.getFamousChildrenRef().map((child, idx) => [child, new FamousRenderNode()]);
17 | return [node, next];
18 | }
19 |
20 | famousUpdate(nextProps) {
21 | let lightbox = this.getFamous();
22 |
23 | lightbox.setOptions(nextProps.options);
24 | }
25 |
26 | render() {
27 | return (
28 |
29 | {this.getFamousChildren()}
30 |
31 | );
32 | }
33 | }
34 |
35 | defaults(Lightbox, FamousLightbox);
36 |
37 | export default Lightbox;
38 |
--------------------------------------------------------------------------------
/src/views/RenderController.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import FamousRenderController from 'famous/views/RenderController';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class RenderController extends FamousComponent {
9 | famousCreate() {
10 | return new FamousRenderController(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let renderController = this.getFamous();
15 | let node = parentNode.add(renderController);
16 | let next = this.getFamousChildrenRef().map((child, idx) => [child, new FamousRenderNode()]);
17 | return [node, next];
18 | }
19 |
20 | famousUpdate(nextProps) {
21 | let renderController = this.getFamous();
22 |
23 | renderController.setOptions(nextProps.options);
24 | }
25 |
26 | render() {
27 | return (
28 |
29 | {this.getFamousChildren()}
30 |
31 | );
32 | }
33 | }
34 |
35 | defaults(RenderController, FamousRenderController);
36 |
37 | export default RenderController;
38 |
--------------------------------------------------------------------------------
/src/views/ScrollContainer.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import FamousScrollContainer from 'famous/views/ScrollContainer';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class ScrollContainer extends FamousComponent {
9 | famousCreate() {
10 | return new FamousScrollContainer(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let scrollContainer = this.getFamous();
15 | let node = parentNode.add(scrollContainer);
16 | let next = [];
17 | let sequence = this.getFamousChildrenRef().map((child, idx) => {
18 | let renderNode = new FamousRenderNode();
19 | next.push([child, renderNode]);
20 | return renderNode;
21 | });
22 | scrollContainer.sequenceFrom(sequence);
23 | return [node, next];
24 | }
25 |
26 | famousUpdate(nextProps) {
27 | let scrollContainer = this.getFamous();
28 |
29 | scrollContainer.setOptions(nextProps.options);
30 | }
31 |
32 | render() {
33 | return (
34 |
35 | {this.getFamousChildren()}
36 |
37 | );
38 | }
39 | }
40 |
41 | defaults(ScrollContainer, FamousScrollContainer);
42 |
43 | export default ScrollContainer;
44 |
--------------------------------------------------------------------------------
/src/views/Scroller.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import FamousScroller from 'famous/views/Scroller';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class Scroller extends FamousComponent {
9 | famousCreate() {
10 | return new FamousScroller(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let scroller = this.getFamous();
15 | let node = parentNode.add(scroller);
16 | let next = [];
17 | let sequence = this.getFamousChildrenRef().map((child, idx) => {
18 | let renderNode = new FamousRenderNode();
19 | next.push([child, renderNode]);
20 | return renderNode;
21 | });
22 | scroller.sequenceFrom(sequence);
23 | return [node, next];
24 | }
25 |
26 | famousUpdate(nextProps) {
27 | let scroller = this.getFamous();
28 |
29 | scroller.setOptions(nextProps.options);
30 | }
31 |
32 | render() {
33 | return (
34 |
35 | {this.getFamousChildren()}
36 |
37 | );
38 | }
39 | }
40 |
41 | defaults(Scroller, FamousScroller);
42 |
43 | export default Scroller;
44 |
--------------------------------------------------------------------------------
/src/views/Scrollview.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import FamousScrollview from 'famous/views/Scrollview';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class Scrollview extends FamousComponent {
9 | famousCreate() {
10 | return new FamousScrollview(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let scrollview = this.getFamous();
15 | let node = parentNode.add(scrollview);
16 | let next = [];
17 | let sequence = this.getFamousChildrenRef().map((child, idx) => {
18 | let renderNode = new FamousRenderNode();
19 | next.push([child, renderNode]);
20 | return renderNode;
21 | });
22 | scrollview.sequenceFrom(sequence);
23 | return [node, next];
24 | }
25 |
26 | famousUpdate(nextProps) {
27 | let scrollview = this.getFamous();
28 |
29 | scrollview.setOptions(nextProps.options);
30 | }
31 |
32 | render() {
33 | return (
34 |
35 | {this.getFamousChildren()}
36 |
37 | );
38 | }
39 | }
40 |
41 | defaults(Scrollview, FamousScrollview);
42 |
43 | export default Scrollview;
44 |
--------------------------------------------------------------------------------
/src/views/SequentialLayout.jsx:
--------------------------------------------------------------------------------
1 | import FamousRenderNode from 'famous/core/RenderNode';
2 | import FamousSequentialLayout from 'famous/views/SequentialLayout';
3 | import defaults from 'lodash/object/defaults';
4 | import React from 'react';
5 |
6 | import FamousComponent from '../lib/FamousComponent';
7 |
8 | class SequentialLayout extends FamousComponent {
9 | famousCreate() {
10 | return new FamousSequentialLayout(this.props.options);
11 | }
12 |
13 | famousCreateNode(parentNode) {
14 | let sequentialLayout = this.getFamous();
15 | let node = parentNode.add(sequentialLayout);
16 | let next = [];
17 | let sequence = this.getFamousChildrenRef().map((child, idx) => {
18 | let renderNode = new FamousRenderNode();
19 | next.push([child, renderNode]);
20 | return renderNode;
21 | });
22 | sequentialLayout.sequenceFrom(sequence);
23 | return [node, next];
24 | }
25 |
26 | famousUpdate(nextProps) {
27 | let sequentialLayout = this.getFamous();
28 |
29 | sequentialLayout.setOptions(nextProps.options);
30 | }
31 |
32 | render() {
33 | return (
34 |
35 | {this.getFamousChildren()}
36 |
37 | );
38 | }
39 | }
40 |
41 | defaults(SequentialLayout, FamousSequentialLayout);
42 |
43 | export default SequentialLayout;
44 |
--------------------------------------------------------------------------------
/src/views/SizeAwareView.jsx:
--------------------------------------------------------------------------------
1 | import FamousSizeAwareView from 'famous/views/SizeAwareView';
2 | import defaults from 'lodash/object/defaults';
3 | import React from 'react';
4 |
5 | import FamousComponent from '../lib/FamousComponent';
6 |
7 | class SizeAwareView extends FamousComponent {
8 | famousCreate() {
9 | return new FamousSizeAwareView(this.props.options);
10 | }
11 |
12 | famousCreateNode(parentNode) {
13 | let sizeAwareView = this.getFamous();
14 | parentNode.add(sizeAwareView);
15 | let next = this.getFamousChildrenRef().map((child, idx) => [child, sizeAwareView]);
16 | return [sizeAwareView, next];
17 | }
18 |
19 | famousUpdate(nextProps) {
20 | let sizeAwareView = this.getFamous();
21 |
22 | sizeAwareView.setOptions(nextProps.options);
23 | }
24 |
25 | render() {
26 | return (
27 |
28 | {this.getFamousChildren()}
29 |
30 | );
31 | }
32 | }
33 |
34 | defaults(SizeAwareView, FamousSizeAwareView);
35 |
36 | export default SizeAwareView;
37 |
--------------------------------------------------------------------------------
/tools/publish/amd/README.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pilwon/react-famous/1a37520899460f8d6ebbe9fb5f6048b92a6dc970/tools/publish/amd/README.md
--------------------------------------------------------------------------------
/tools/publish/amd/package.json:
--------------------------------------------------------------------------------
1 | {
2 | }
3 |
--------------------------------------------------------------------------------
/tools/publish/cjs/README.md:
--------------------------------------------------------------------------------
1 | # react-famous
2 |
3 | Add [Famo.us](http://famo.us) interactions and animations to any [React](http://facebook.github.io/react/) application and build **Famo.us** applications with **React**.
4 |
5 | Using `react-famous`, you can:
6 |
7 | * Create **Famo.us** apps using familiar **React** component specs and lifecycle.
8 | * Bring rich **Famo.us** animations to new or existing **React** apps.
9 | * Easily integrate **Famo.us** and **React** apps.
10 |
11 | Please visit [the project page](https://github.com/pilwon/react-famous) for more information.
12 |
--------------------------------------------------------------------------------
/tools/publish/cjs/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-famous",
3 | "description": "React bridge to Famo.us",
4 | "version": "0.1.7",
5 | "homepage": "https://github.com/pilwon/react-famous",
6 | "keywords": [
7 | "react",
8 | "react-component",
9 | "famo.us",
10 | "famous"
11 | ],
12 | "author": "Pilwon Huh ",
13 | "license": "MIT",
14 | "repository": {
15 | "type": "git",
16 | "url": "pilwon/react-famous"
17 | },
18 | "bugs": {
19 | "url": "https://github.com/pilwon/react-famous/issues"
20 | },
21 | "peerDependencies": {
22 | "famous": ">=0.3.5",
23 | "react": ">=0.13.1"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/tools/publish/examples/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | react-famous: React bridge to Famo.us
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------