initial commit
This commit is contained in:
commit
c6f9769ef8
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
node_modules
|
7
Dockerfile
Normal file
7
Dockerfile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
FROM john/nodebase
|
||||||
|
|
||||||
|
VOLUME /code
|
||||||
|
WORKDIR /code
|
||||||
|
COPY bin/docker-start /usr/local/bin/start
|
||||||
|
RUN chmod a+x /usr/local/bin/start
|
||||||
|
CMD /usr/local/bin/start
|
7
Dockerfile.nodebase
Normal file
7
Dockerfile.nodebase
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
FROM ubuntu:15.04
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get -y install curl build-essential python apt-utils git vim
|
||||||
|
RUN curl https://deb.nodesource.com/setup_4.x | bash
|
||||||
|
RUN apt-get -y install nodejs
|
||||||
|
RUN npm install -g babel
|
||||||
|
CMD bash
|
2
README.md
Normal file
2
README.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Either run locally with `npm install && npm run dev` or use
|
||||||
|
Docker and `bin/run`. Connect to `http://localhost:3500`.
|
18
bin/run
Executable file
18
bin/run
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
docker build -t john/nodebase -f Dockerfile.nodebase .
|
||||||
|
|
||||||
|
docker build -t john/react-tiny-components-modules - <<DOCKERFILE
|
||||||
|
FROM busybox
|
||||||
|
RUN mkdir -p /usr/local/node_modules
|
||||||
|
VOLUME /usr/local/node_modules
|
||||||
|
DOCKERFILE
|
||||||
|
|
||||||
|
docker rm `docker stop react-tiny-components`
|
||||||
|
docker build -t john/react-tiny-components -f Dockerfile .
|
||||||
|
docker run --name react-tiny-components-modules john/react-tiny-components-modules truen
|
||||||
|
docker run -it -p 3500:3500 \
|
||||||
|
-v $PWD:/code \
|
||||||
|
--volumes-from react-tiny-components-modules \
|
||||||
|
--name react-tiny-components \
|
||||||
|
john/react-tiny-components
|
13
dist/index.html
vendored
Normal file
13
dist/index.html
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Presentation</title>
|
||||||
|
<script src="/presentation.js" async defer></script>
|
||||||
|
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.8.0/styles/default.min.css" />
|
||||||
|
<link rel="stylesheet" href="/style.css" />
|
||||||
|
<link href='https://fonts.googleapis.com/css?family=Arimo:400,700' rel='stylesheet' type='text/css'>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
37350
dist/presentation.js
vendored
Normal file
37350
dist/presentation.js
vendored
Normal file
File diff suppressed because one or more lines are too long
67
dist/style.css
vendored
Normal file
67
dist/style.css
vendored
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
.styles__presentation___11BVg, .styles__slide___2DZqS, .styles__transitions___bLoMQ {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden; }
|
||||||
|
|
||||||
|
.styles__large-text___1xK4s, .styles__small-text___thSOA {
|
||||||
|
font-family: 'Arimo', sans-serif; }
|
||||||
|
|
||||||
|
.styles__slide___2DZqS {
|
||||||
|
display: table; }
|
||||||
|
|
||||||
|
.styles__slide-inner___14DZN {
|
||||||
|
display: table-cell;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle; }
|
||||||
|
|
||||||
|
.styles__spacer___2xsQf {
|
||||||
|
height: 2em; }
|
||||||
|
|
||||||
|
.styles__large-text___1xK4s {
|
||||||
|
font-size: 4em;
|
||||||
|
font-weight: 700; }
|
||||||
|
|
||||||
|
.styles__small-text___thSOA {
|
||||||
|
font-size: 2em;
|
||||||
|
font-weight: 400; }
|
||||||
|
|
||||||
|
.styles__code___1WYoK, .styles__code-large___2KxFW {
|
||||||
|
text-align: left; }
|
||||||
|
|
||||||
|
.styles__code___1WYoK {
|
||||||
|
font-size: 0.75em; }
|
||||||
|
|
||||||
|
.styles__code-large___2KxFW {
|
||||||
|
font-size: 1.35em; }
|
||||||
|
html, body, #app {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%; }
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0; }
|
||||||
|
|
||||||
|
* {
|
||||||
|
user-select: none; }
|
||||||
|
|
||||||
|
.slide-enter, .slide-leave {
|
||||||
|
transition: opacity 0.1s ease-in;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0; }
|
||||||
|
|
||||||
|
.slide-enter {
|
||||||
|
opacity: 0; }
|
||||||
|
|
||||||
|
.slide-enter-active {
|
||||||
|
opacity: 1; }
|
||||||
|
|
||||||
|
.slide-leave {
|
||||||
|
opacity: 1; }
|
||||||
|
|
||||||
|
.slide-leave-active {
|
||||||
|
opacity: 0; }
|
||||||
|
|
||||||
|
/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzdHlsZS5jc3MiLCJzb3VyY2VSb290IjoiIn0=*/
|
38
package.json
Normal file
38
package.json
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"name": "code",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
|
"server": "babel-node --stage 0 ./server.js",
|
||||||
|
"webpack": "webpack --watch",
|
||||||
|
"dev": "npm-run-all --parallel server webpack"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"devDependencies": {
|
||||||
|
"babel-core": "^5.8.25",
|
||||||
|
"babel-loader": "^5.3.2",
|
||||||
|
"compression-webpack-plugin": "^0.2.0",
|
||||||
|
"css-loader": "^0.19.0",
|
||||||
|
"express": "^4.13.3",
|
||||||
|
"extract-text-webpack-plugin": "^0.8.2",
|
||||||
|
"file-loader": "^0.8.4",
|
||||||
|
"highlight.js": "^8.8.0",
|
||||||
|
"http-server": "^0.8.5",
|
||||||
|
"image-size-loader": "^0.7.0",
|
||||||
|
"node-sass": "^3.3.3",
|
||||||
|
"node-static": "^0.7.7",
|
||||||
|
"npm-run-all": "^1.2.11",
|
||||||
|
"react": "^0.14.0-rc1",
|
||||||
|
"react-addons-css-transition-group": "^0.14.0-rc1",
|
||||||
|
"react-css-modules": "^3.2.3",
|
||||||
|
"react-dom": "^0.14.0-rc1",
|
||||||
|
"sass-loader": "^2.0.1",
|
||||||
|
"serve-static": "^1.10.0",
|
||||||
|
"style-loader": "^0.12.4",
|
||||||
|
"watch-ignore-webpack-plugin": "git+https://github.com/rbdone/watch-ignore-webpack-plugin.git",
|
||||||
|
"webpack": "^1.12.2"
|
||||||
|
}
|
||||||
|
}
|
10
server.js
Normal file
10
server.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import Express from 'express';
|
||||||
|
import ServeStatic from 'serve-static';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
const app = Express();
|
||||||
|
|
||||||
|
app.use(ServeStatic('./dist'));
|
||||||
|
app.get('*', (req, res) => { res.sendFile(path.resolve(__dirname, './dist/index.html')); });
|
||||||
|
|
||||||
|
app.listen(3500, (server) => { console.log('server listening on 3500'); });
|
8
src/code.js
Normal file
8
src/code.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import CodeBase from './code_base';
|
||||||
|
|
||||||
|
export default class Code extends CodeBase {
|
||||||
|
static defaultProps = {
|
||||||
|
codeClass: 'code'
|
||||||
|
};
|
||||||
|
}
|
19
src/code_base.js
Normal file
19
src/code_base.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Highlight from 'highlight.js';
|
||||||
|
|
||||||
|
import WithCSS from 'react-css-modules';
|
||||||
|
|
||||||
|
import styles from './styles.scss';
|
||||||
|
|
||||||
|
@WithCSS(styles)
|
||||||
|
export default class CodeBase extends React.Component {
|
||||||
|
componentDidMount () {
|
||||||
|
Highlight.highlightBlock(this.refs.code);
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<pre styleName={this.props.codeClass} ref='code'>{this.props.children}</pre>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
8
src/code_large.js
Normal file
8
src/code_large.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import CodeBase from './code_base';
|
||||||
|
|
||||||
|
export default class CodeLarge extends CodeBase {
|
||||||
|
static defaultProps = {
|
||||||
|
codeClass: 'code-large'
|
||||||
|
};
|
||||||
|
}
|
42
src/global.scss
Normal file
42
src/global.scss
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
html, body, #app {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
%slide-base {
|
||||||
|
transition: opacity 0.1s ease-in;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-enter {
|
||||||
|
@extend %slide-base;
|
||||||
|
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-enter-active {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-leave {
|
||||||
|
@extend %slide-base;
|
||||||
|
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-leave-active {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
13
src/index.html
Normal file
13
src/index.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Presentation</title>
|
||||||
|
<script src="/presentation.js" async defer></script>
|
||||||
|
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.8.0/styles/default.min.css" />
|
||||||
|
<link rel="stylesheet" href="/style.css" />
|
||||||
|
<link href='https://fonts.googleapis.com/css?family=Arimo:400,700' rel='stylesheet' type='text/css'>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
12
src/index.js
Normal file
12
src/index.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import _htmlIndex from './index.html';
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import {render} from 'react-dom';
|
||||||
|
|
||||||
|
import Presentation from './presentation';
|
||||||
|
|
||||||
|
function Index() {
|
||||||
|
return <Presentation />;
|
||||||
|
};
|
||||||
|
|
||||||
|
render(<Index />, document.getElementById('app'));
|
11
src/large_text.js
Normal file
11
src/large_text.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import WithCSS from 'react-css-modules/dist/linkClass';
|
||||||
|
|
||||||
|
import styles from './styles.scss';
|
||||||
|
|
||||||
|
export default function LargeText(props) {
|
||||||
|
return WithCSS(
|
||||||
|
<div styleName='large-text'>{props.children}</div>,
|
||||||
|
styles
|
||||||
|
);
|
||||||
|
}
|
71
src/presentation.js
Normal file
71
src/presentation.js
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import WithCSS from 'react-css-modules';
|
||||||
|
|
||||||
|
import Slides from './slides';
|
||||||
|
import SlideList from './slide_list';
|
||||||
|
|
||||||
|
import styles from './styles.scss';
|
||||||
|
|
||||||
|
@WithCSS(styles)
|
||||||
|
export default class Presentation extends React.Component {
|
||||||
|
constructor (props) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
let currentSlide = 0;
|
||||||
|
|
||||||
|
const oldState = window.history.state;
|
||||||
|
if (oldState && oldState.currentSlide) {
|
||||||
|
currentSlide = oldState.currentSlide;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.state = { currentSlide: currentSlide };
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount () {
|
||||||
|
document.addEventListener('keyup', this.handleKeyUp.bind(this));
|
||||||
|
document.addEventListener('mousedown', this.handleMouseDown.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
advance () {
|
||||||
|
const value = Math.min(this.state.currentSlide + 1, SlideList.length - 1);
|
||||||
|
|
||||||
|
this.setState({currentSlide: value});
|
||||||
|
}
|
||||||
|
|
||||||
|
retreat () {
|
||||||
|
const value = Math.max(this.state.currentSlide - 1, 0);
|
||||||
|
|
||||||
|
this.setState({currentSlide: value});
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate () {
|
||||||
|
window.history.pushState(this.state, this.state.currentSlide, `/slide/${this.state.currentSlide}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
handleMouseDown (e) {
|
||||||
|
this.advance();
|
||||||
|
}
|
||||||
|
|
||||||
|
handleKeyUp (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
switch (e.keyIdentifier) {
|
||||||
|
case 'U+0020':
|
||||||
|
case 'Right':
|
||||||
|
this.advance();
|
||||||
|
break;
|
||||||
|
case 'Left':
|
||||||
|
this.retreat();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<div styleName='presentation'>
|
||||||
|
<Slides slides={SlideList}
|
||||||
|
{...this.state} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
15
src/slide.js
Normal file
15
src/slide.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import WithCSS from 'react-css-modules/dist/linkClass';
|
||||||
|
|
||||||
|
import styles from './styles.scss';
|
||||||
|
|
||||||
|
export default function Slide(props) {
|
||||||
|
return WithCSS(
|
||||||
|
<div styleName='slide'>
|
||||||
|
<div styleName='slide-inner'>
|
||||||
|
{props.children}
|
||||||
|
</div>
|
||||||
|
</div>,
|
||||||
|
styles
|
||||||
|
);
|
||||||
|
};
|
63
src/slide_list.js
Normal file
63
src/slide_list.js
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import TitleSlide from './slides/title_slide';
|
||||||
|
import ES6Warning from './slides/es6_warning'
|
||||||
|
import ExampleComponent from './slides/example_component';
|
||||||
|
import Wow from './slides/wow';
|
||||||
|
import ReactIcon from './slides/react_icon';
|
||||||
|
import BigReactIcon from './slides/big_react_icon';
|
||||||
|
import LotsOfLittleReactIcons from './slides/lots_of_little_react_icons';
|
||||||
|
import LotsOfRotatingLittleReactIcons from './slides/lots_of_rotating_little_react_icons';
|
||||||
|
import BreakOutContainers from './slides/break_out_containers';
|
||||||
|
import CodeBreakingOutContainers from './slides/code_breaking_out_containers';
|
||||||
|
import AContainer from './slides/a_container';
|
||||||
|
import React014ContainerBreakout from './slides/react014_container_breakout';
|
||||||
|
import MoveStylesOutOfGlobalCSS from './slides/move_styles_out_of_global_css';
|
||||||
|
import GlobalStyles from './slides/global_styles';
|
||||||
|
import SCSSLocalStyles from './slides/scss_local_styles';
|
||||||
|
import RenderedLocalStyles from './slides/rendered_local_styles';
|
||||||
|
import ReactCSSModules from './slides/react_css_modules';
|
||||||
|
import MoveDataLoads from './slides/move_data_loads';
|
||||||
|
import DataLoadDecorator from './slides/data_load_decorator';
|
||||||
|
import HigherOrderComponents from './slides/higher_order_components';
|
||||||
|
import ComponentPhase2 from './slides/component_phase_2';
|
||||||
|
import ComponentPhase3 from './slides/component_phase_3';
|
||||||
|
import ComponentPhase4 from './slides/component_phase_4';
|
||||||
|
import StuffInComponent from './slides/stuff_in_component';
|
||||||
|
import AsPartOfTheApp from './slides/as_part_of_the_app';
|
||||||
|
import BasicGuidelines from './slides/basic_guidelines';
|
||||||
|
import PushDOMNodesDown from './slides/push_dom_nodes_down';
|
||||||
|
import PushStateUp from './slides/push_state_up';
|
||||||
|
import Thanks from './slides/thanks';
|
||||||
|
|
||||||
|
export default [
|
||||||
|
TitleSlide,
|
||||||
|
ReactIcon,
|
||||||
|
StuffInComponent,
|
||||||
|
BigReactIcon,
|
||||||
|
LotsOfLittleReactIcons,
|
||||||
|
ES6Warning,
|
||||||
|
ExampleComponent,
|
||||||
|
Wow,
|
||||||
|
BreakOutContainers,
|
||||||
|
AContainer,
|
||||||
|
CodeBreakingOutContainers,
|
||||||
|
React014ContainerBreakout,
|
||||||
|
MoveStylesOutOfGlobalCSS,
|
||||||
|
GlobalStyles,
|
||||||
|
ReactCSSModules,
|
||||||
|
SCSSLocalStyles,
|
||||||
|
RenderedLocalStyles,
|
||||||
|
MoveDataLoads,
|
||||||
|
DataLoadDecorator,
|
||||||
|
HigherOrderComponents,
|
||||||
|
ComponentPhase2,
|
||||||
|
ComponentPhase3,
|
||||||
|
ComponentPhase4,
|
||||||
|
AsPartOfTheApp,
|
||||||
|
BasicGuidelines,
|
||||||
|
PushDOMNodesDown,
|
||||||
|
PushStateUp,
|
||||||
|
LotsOfRotatingLittleReactIcons,
|
||||||
|
Thanks,
|
||||||
|
];
|
32
src/slides.js
Normal file
32
src/slides.js
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from './slide';
|
||||||
|
import CSSTransitionGroup from 'react-addons-css-transition-group';
|
||||||
|
|
||||||
|
const {cloneElement} = React;
|
||||||
|
|
||||||
|
import WithCSS from 'react-css-modules';
|
||||||
|
|
||||||
|
import styles from './styles.scss';
|
||||||
|
|
||||||
|
@WithCSS(styles)
|
||||||
|
export default class Slides extends React.Component {
|
||||||
|
render () {
|
||||||
|
const currentSlide = cloneElement(
|
||||||
|
this.props.slides[this.props.currentSlide],
|
||||||
|
{ key: this.props.currentSlide }
|
||||||
|
);
|
||||||
|
|
||||||
|
document.title = currentSlide.props.title;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<CSSTransitionGroup styleName='transitions'
|
||||||
|
transitionAppearTimeout={100}
|
||||||
|
transitionEnterTimeout={100}
|
||||||
|
transitionLeaveTimeout={100}
|
||||||
|
component='div'
|
||||||
|
transitionName='slide'>
|
||||||
|
{currentSlide}
|
||||||
|
</CSSTransitionGroup>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
13
src/slides/a_container.js
Normal file
13
src/slides/a_container.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import CodeLarge from '../code_large';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="A container">
|
||||||
|
<CodeLarge>{`
|
||||||
|
<div className='navbar navbar-right'>
|
||||||
|
<nodes that="get" wrapped-around={other(nodes)} />
|
||||||
|
</div>
|
||||||
|
`}</CodeLarge>
|
||||||
|
</Slide>
|
||||||
|
);
|
32
src/slides/as_part_of_the_app.js
Normal file
32
src/slides/as_part_of_the_app.js
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import CodeLarge from '../code_large';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="As part of the app">
|
||||||
|
<CodeLarge>{`
|
||||||
|
import UserData from './user_data';
|
||||||
|
|
||||||
|
export default class Application extends React.Component {
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<ApplicationContainer>
|
||||||
|
<Header>
|
||||||
|
<UserData />
|
||||||
|
</Header>
|
||||||
|
<ContentContainer>
|
||||||
|
<Sidebar>
|
||||||
|
<SomeNavMenu />
|
||||||
|
</Sidebar>
|
||||||
|
<Content>
|
||||||
|
<RouteHandler />
|
||||||
|
</Content>
|
||||||
|
</ContentContainer>
|
||||||
|
</ApplicationContainer>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`}</CodeLarge>
|
||||||
|
</Slide>
|
||||||
|
);
|
||||||
|
|
9
src/slides/basic_guidelines.js
Normal file
9
src/slides/basic_guidelines.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Basic Guidelines">
|
||||||
|
<LargeText>Basic Guidelines</LargeText>
|
||||||
|
</Slide>
|
||||||
|
);
|
9
src/slides/big_react_icon.js
Normal file
9
src/slides/big_react_icon.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="wow">
|
||||||
|
<img src="https://cdn.auth0.com/blog/react-js/react.png" height="80%" />
|
||||||
|
</Slide>
|
||||||
|
);
|
||||||
|
|
9
src/slides/break_out_containers.js
Normal file
9
src/slides/break_out_containers.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Break out containers">
|
||||||
|
<LargeText>Break Out Containers</LargeText>
|
||||||
|
</Slide>
|
||||||
|
);
|
19
src/slides/code_breaking_out_containers.js
Normal file
19
src/slides/code_breaking_out_containers.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import CodeLarge from '../code_large';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Break out the containers">
|
||||||
|
<CodeLarge>{`
|
||||||
|
export default class NavbarRight extends React.Component {
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<div className='navbar navbar-right'>
|
||||||
|
{this.props.children}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`}</CodeLarge>
|
||||||
|
</Slide>
|
||||||
|
);
|
44
src/slides/component_phase_2.js
Normal file
44
src/slides/component_phase_2.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
import Spacer from '../spacer';
|
||||||
|
import SmallText from '../small_text';
|
||||||
|
import CodeLarge from '../code_large';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Component Phase 2">
|
||||||
|
<CodeLarge>{`
|
||||||
|
import NavbarRight from './navbar_right';
|
||||||
|
import WithUserData from './with_user_data';
|
||||||
|
|
||||||
|
@WithUserData
|
||||||
|
export default class UserData extends React.Component {
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<NavbarRight>
|
||||||
|
{!this.props.isLoaded &&
|
||||||
|
<div className='user-data-loading'>
|
||||||
|
Loading...
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
{this.props.isLoaded &&
|
||||||
|
<div className='user-data'>
|
||||||
|
<div className='name'>
|
||||||
|
<span className='first-name'>
|
||||||
|
{this.props.userData.firstName}
|
||||||
|
</span>
|
||||||
|
<span className='last-name'>
|
||||||
|
{this.props.userData.lastName}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</NavbarRight>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`}</CodeLarge>
|
||||||
|
</Slide>
|
||||||
|
);
|
||||||
|
|
41
src/slides/component_phase_3.js
Normal file
41
src/slides/component_phase_3.js
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
import Spacer from '../spacer';
|
||||||
|
import SmallText from '../small_text';
|
||||||
|
import CodeLarge from '../code_large';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Component Phase 3">
|
||||||
|
<CodeLarge>{`
|
||||||
|
import NavbarRight from './navbar_right';
|
||||||
|
import WithUserDate from './with_user_data';
|
||||||
|
import UserDataLoading from './user_data_loading';
|
||||||
|
|
||||||
|
@WithUserData
|
||||||
|
export default class UserData extends React.Component {
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<NavbarRight>
|
||||||
|
{!this.props.isLoaded && <UserDataLoading />}
|
||||||
|
|
||||||
|
{this.props.isLoaded &&
|
||||||
|
<div className='user-data'>
|
||||||
|
<div className='name'>
|
||||||
|
<span className='first-name'>
|
||||||
|
{this.props.userData.firstName}
|
||||||
|
</span>
|
||||||
|
<span className='last-name'>
|
||||||
|
{this.props.userData.lastName}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</NavbarRight>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`}</CodeLarge>
|
||||||
|
</Slide>
|
||||||
|
);
|
||||||
|
|
30
src/slides/component_phase_4.js
Normal file
30
src/slides/component_phase_4.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
import Spacer from '../spacer';
|
||||||
|
import SmallText from '../small_text';
|
||||||
|
import CodeLarge from '../code_large';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Component Phase 4">
|
||||||
|
<CodeLarge>{`
|
||||||
|
import NavbarRight from './navbar_right';
|
||||||
|
import WithUserDate from './with_user_data';
|
||||||
|
import UserDataLoading from './user_data_loading';
|
||||||
|
import UserDataDisplay from './user_data_display';
|
||||||
|
|
||||||
|
@WithUserData
|
||||||
|
export default class UserData extends React.Component {
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<NavbarRight>
|
||||||
|
{!this.props.isLoaded && <UserDataLoading />}
|
||||||
|
{this.props.isLoaded && <UserDataDisplay {...this.props.userData} />}
|
||||||
|
</NavbarRight>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`}</CodeLarge>
|
||||||
|
</Slide>
|
||||||
|
);
|
||||||
|
|
38
src/slides/data_load_decorator.js
Normal file
38
src/slides/data_load_decorator.js
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import CodeLarge from '../code_large';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="data-load-decorator">
|
||||||
|
<CodeLarge>{`
|
||||||
|
export default function WithUserData(Component) {
|
||||||
|
return class WithUserData extends React.Component {
|
||||||
|
constructor (props) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
isLoaded: false,
|
||||||
|
userData: null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillMount () {
|
||||||
|
axios
|
||||||
|
.get(\`/data/user/\${this.props.userID}\`)
|
||||||
|
.then(({data}) => {
|
||||||
|
this.setState({
|
||||||
|
userData: data.userData,
|
||||||
|
isLoaded: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
return (<Component {...this.props} {...this.state} />);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`}</CodeLarge>
|
||||||
|
</Slide>
|
||||||
|
);
|
||||||
|
|
11
src/slides/es6_warning.js
Normal file
11
src/slides/es6_warning.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
import SmallText from '../small_text';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="ES6">
|
||||||
|
<LargeText>ES6/ES7 decorators ahead!</LargeText>
|
||||||
|
<SmallText>#babelmasterrace</SmallText>
|
||||||
|
</Slide>
|
||||||
|
);
|
59
src/slides/example_component.js
Normal file
59
src/slides/example_component.js
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
import Spacer from '../spacer';
|
||||||
|
import SmallText from '../small_text';
|
||||||
|
import Code from '../code';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Example Component">
|
||||||
|
<Code>{`
|
||||||
|
export default class UserData extends React.Component {
|
||||||
|
constructor (props) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
isLoaded: false,
|
||||||
|
userData: null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillMount () {
|
||||||
|
axios
|
||||||
|
.get(\`/data/user/\${this.props.userID}\`)
|
||||||
|
.then(({data}) => {
|
||||||
|
this.setState({
|
||||||
|
userData: data.userData,
|
||||||
|
isLoaded: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<div className='navbar navbar-right'>
|
||||||
|
{!this.state.isLoaded &&
|
||||||
|
<div className='user-data-loading'>
|
||||||
|
Loading...
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
{this.state.isLoaded &&
|
||||||
|
<div className='user-data'>
|
||||||
|
<div className='name'>
|
||||||
|
<span className='first-name'>
|
||||||
|
{this.state.userData.firstName}
|
||||||
|
</span>
|
||||||
|
<span className='last-name'>
|
||||||
|
{this.state.userData.lastName}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`}</Code>
|
||||||
|
</Slide>
|
||||||
|
);
|
25
src/slides/global_styles.js
Normal file
25
src/slides/global_styles.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import CodeLarge from '../code_large';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Global CSS">
|
||||||
|
<CodeLarge>{`
|
||||||
|
.navbar {
|
||||||
|
color: green;
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-right {
|
||||||
|
color: orange;
|
||||||
|
opacity: 1.25;
|
||||||
|
}
|
||||||
|
|
||||||
|
.five-million-others {
|
||||||
|
.and-maybe-they-re-nested {
|
||||||
|
@include or-autogenerate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`}</CodeLarge>
|
||||||
|
</Slide>
|
||||||
|
);
|
11
src/slides/higher_order_components.js
Normal file
11
src/slides/higher_order_components.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
import SmallText from '../large_text';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Higher Order Components">
|
||||||
|
<LargeText>Higher Order Components</LargeText>
|
||||||
|
<SmallText>(they will replace mixins in newer React)</SmallText>
|
||||||
|
</Slide>
|
||||||
|
);
|
91
src/slides/icon_drawer.js
Normal file
91
src/slides/icon_drawer.js
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
const MAX_FPS = 30;
|
||||||
|
const MAX_FPS_TIME = 1000 / MAX_FPS;
|
||||||
|
|
||||||
|
export default class IconDrawer extends React.Component {
|
||||||
|
constructor (props) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.startTimestamp = null;
|
||||||
|
this.lastTimestamp = null;
|
||||||
|
this.stopAnimating = false;
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
imageProperties: {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount () {
|
||||||
|
if (this.props.animate) {
|
||||||
|
window.requestAnimationFrame(this.animate.bind(this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount () {
|
||||||
|
this.stopAnimating = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
animate (timestamp) {
|
||||||
|
this.lastTimestamp = this.lastTimestamp || timestamp;
|
||||||
|
this.startTimestamp = this.startTimestamp || timestamp;
|
||||||
|
|
||||||
|
const newImageProperties = {};
|
||||||
|
|
||||||
|
this.forEachIcon((x, y) => {
|
||||||
|
newImageProperties[`${x}-${y}`] = this.props.animate(
|
||||||
|
x, y, timestamp - this.startTimestamp
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!this.stopAnimating) {
|
||||||
|
this.setState({imageProperties: newImageProperties});
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
this.lastTimestamp = timestamp;
|
||||||
|
window.requestAnimationFrame(this.animate.bind(this));
|
||||||
|
}, Math.max(0, MAX_FPS_TIME - (timestamp - this.lastTimestamp)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
forEachIcon (code) {
|
||||||
|
for (let y = 0; y < this.props.height; ++y) {
|
||||||
|
for (let x = 0; x < this.props.width; ++x) {
|
||||||
|
code(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
const icons = [];
|
||||||
|
|
||||||
|
this.forEachIcon((x, y) => {
|
||||||
|
const offset = ((y % 2 === 0) ? this.props.imageSize : -this.props.imageSize) / 4;
|
||||||
|
|
||||||
|
const styles = {
|
||||||
|
position: 'absolute',
|
||||||
|
top: (this.props.imageSize + this.props.imagePadding) * y,
|
||||||
|
left: (this.props.imageSize + this.props.imagePadding) * x + offset
|
||||||
|
};
|
||||||
|
|
||||||
|
let additionalProperties = this.state.imageProperties[`${x}-${y}`] || {};
|
||||||
|
|
||||||
|
Object.assign(styles, additionalProperties);
|
||||||
|
|
||||||
|
icons.push(<img
|
||||||
|
key={`icon-${x}-${y}`}
|
||||||
|
src="https://cdn.auth0.com/blog/react-js/react.png"
|
||||||
|
height={this.props.imageSize}
|
||||||
|
width={this.props.imageSize}
|
||||||
|
style={styles}
|
||||||
|
/>);
|
||||||
|
});
|
||||||
|
|
||||||
|
return <div style={{
|
||||||
|
position: 'relative',
|
||||||
|
width: (this.props.imageSize + this.props.imagePadding) * this.props.width,
|
||||||
|
height: (this.props.imageSize + this.props.imagePadding) * this.props.height,
|
||||||
|
margin: '0 auto'
|
||||||
|
}}>{icons}</div>;
|
||||||
|
}
|
||||||
|
}
|
9
src/slides/lots_of_little_react_icons.js
Normal file
9
src/slides/lots_of_little_react_icons.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import IconDrawer from './icon_drawer';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="wow">
|
||||||
|
<IconDrawer width={10} height={6} imageSize={100} imagePadding={10} />
|
||||||
|
</Slide>
|
||||||
|
);
|
29
src/slides/lots_of_rotating_little_react_icons.js
Normal file
29
src/slides/lots_of_rotating_little_react_icons.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import IconDrawer from './icon_drawer';
|
||||||
|
|
||||||
|
const ticksPerRotation = 2000;
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="wow">
|
||||||
|
<IconDrawer width={10}
|
||||||
|
height={6}
|
||||||
|
imageSize={100}
|
||||||
|
imagePadding={10}
|
||||||
|
animate={(x, y, tick) => {
|
||||||
|
const frame = tick % ticksPerRotation;
|
||||||
|
const degree = (frame * 360) / ticksPerRotation;
|
||||||
|
|
||||||
|
if (x % 2 === y % 2) {
|
||||||
|
return {
|
||||||
|
transform: `rotateZ(0deg) rotate(${degree}deg)`
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
transform: `rotateZ(0deg) rotate(-${degree}deg)`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Slide>
|
||||||
|
);
|
9
src/slides/move_data_loads.js
Normal file
9
src/slides/move_data_loads.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide>
|
||||||
|
<LargeText>Move data loads out of components</LargeText>
|
||||||
|
</Slide>
|
||||||
|
);
|
10
src/slides/move_styles_out_of_global_css.js
Normal file
10
src/slides/move_styles_out_of_global_css.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Move Styles out of Global CSS">
|
||||||
|
<LargeText>Move styles out of global CSS</LargeText>
|
||||||
|
</Slide>
|
||||||
|
);
|
||||||
|
|
12
src/slides/push_dom_nodes_down.js
Normal file
12
src/slides/push_dom_nodes_down.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
import SmallText from '../small_text';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Push DOM Nodes Down">
|
||||||
|
<LargeText>Push DOM Nodes Down</LargeText>
|
||||||
|
<SmallText>...by making containers</SmallText>
|
||||||
|
<SmallText>...by moving prop renderers deeper </SmallText>
|
||||||
|
</Slide>
|
||||||
|
);
|
12
src/slides/push_state_up.js
Normal file
12
src/slides/push_state_up.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
import SmallText from '../small_text';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Push State Up">
|
||||||
|
<LargeText>Push State Up</LargeText>
|
||||||
|
<SmallText>...by using higher-order components</SmallText>
|
||||||
|
<SmallText>...(which may be disguised as decorators!)</SmallText>
|
||||||
|
</Slide>
|
||||||
|
);
|
19
src/slides/react014_container_breakout.js
Normal file
19
src/slides/react014_container_breakout.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import SmallText from '../small_text';
|
||||||
|
import CodeLarge from '../code_large';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Break out the containers in React 0.14">
|
||||||
|
<SmallText>React 0.14</SmallText>
|
||||||
|
<CodeLarge>{`
|
||||||
|
export default function NavbarRight(props) {
|
||||||
|
return (
|
||||||
|
<div className='navbar navbar-right'>
|
||||||
|
{props.children}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
`}</CodeLarge>
|
||||||
|
</Slide>
|
||||||
|
);
|
23
src/slides/react_css_modules.js
Normal file
23
src/slides/react_css_modules.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import CodeLarge from '../code_large';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="react-css-modules">
|
||||||
|
<CodeLarge>{`
|
||||||
|
import WithCSS from 'react-css-modules';
|
||||||
|
import styles from './navbar_styling.scss';
|
||||||
|
|
||||||
|
@WithCSS(styles)
|
||||||
|
export default class NavbarRight extends React.Component {
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<div styleName='navbar'>
|
||||||
|
{this.props.children}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`}</CodeLarge>
|
||||||
|
</Slide>
|
||||||
|
);
|
9
src/slides/react_icon.js
Normal file
9
src/slides/react_icon.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="wow">
|
||||||
|
<img src="https://cdn.auth0.com/blog/react-js/react.png" height="40%" />
|
||||||
|
</Slide>
|
||||||
|
);
|
||||||
|
|
21
src/slides/rendered_local_styles.js
Normal file
21
src/slides/rendered_local_styles.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import CodeLarge from '../code_large';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Rendered react-css-modules CSS">
|
||||||
|
<CodeLarge>{`
|
||||||
|
/* from the @extend */
|
||||||
|
.NavbarRight__navbar__abcdef, .others {
|
||||||
|
color: green;
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* from the style itself */
|
||||||
|
.NavbarRight__navbar__abcdef {
|
||||||
|
color: orange;
|
||||||
|
opacity: 1.25;
|
||||||
|
}
|
||||||
|
`}</CodeLarge>
|
||||||
|
</Slide>
|
||||||
|
);
|
18
src/slides/scss_local_styles.js
Normal file
18
src/slides/scss_local_styles.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import CodeLarge from '../code_large';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="SCSS Local Styles">
|
||||||
|
<CodeLarge>{`
|
||||||
|
@import './global';
|
||||||
|
|
||||||
|
.navbar {
|
||||||
|
@extend %navbar;
|
||||||
|
|
||||||
|
color: orange;
|
||||||
|
opacity: 1.25;
|
||||||
|
}
|
||||||
|
`}</CodeLarge>
|
||||||
|
</Slide>
|
||||||
|
);
|
12
src/slides/stuff_in_component.js
Normal file
12
src/slides/stuff_in_component.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Stuff in Component">
|
||||||
|
<LargeText>State Management</LargeText>
|
||||||
|
<LargeText>Data Retrieval</LargeText>
|
||||||
|
<LargeText>Component Rendering</LargeText>
|
||||||
|
<LargeText>...and so much more!</LargeText>
|
||||||
|
</Slide>
|
||||||
|
);
|
9
src/slides/thanks.js
Normal file
9
src/slides/thanks.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Thanks">
|
||||||
|
<LargeText>Thanks!</LargeText>
|
||||||
|
</Slide>
|
||||||
|
);
|
13
src/slides/title_slide.js
Normal file
13
src/slides/title_slide.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
import LargeText from '../large_text';
|
||||||
|
import Spacer from '../spacer';
|
||||||
|
import SmallText from '../small_text';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="Tiny Components are Happy Components">
|
||||||
|
<LargeText>Tiny Components are Happy Components</LargeText>
|
||||||
|
<Spacer />
|
||||||
|
<SmallText>By John Bintz</SmallText>
|
||||||
|
</Slide>
|
||||||
|
);
|
8
src/slides/wow.js
Normal file
8
src/slides/wow.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Slide from '../slide';
|
||||||
|
|
||||||
|
export default (
|
||||||
|
<Slide title="wow">
|
||||||
|
<img src="http://i.stack.imgur.com/aP2dv.gif" />
|
||||||
|
</Slide>
|
||||||
|
);
|
11
src/small_text.js
Normal file
11
src/small_text.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import WithCSS from 'react-css-modules/dist/linkClass';
|
||||||
|
|
||||||
|
import styles from './styles.scss';
|
||||||
|
|
||||||
|
export default function SmallText(props) {
|
||||||
|
return WithCSS(
|
||||||
|
<div styleName='small-text'>{props.children}</div>,
|
||||||
|
styles
|
||||||
|
);
|
||||||
|
}
|
12
src/spacer.js
Normal file
12
src/spacer.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import WithCSS from 'react-css-modules/dist/linkClass';
|
||||||
|
|
||||||
|
import styles from './styles.scss';
|
||||||
|
|
||||||
|
export default function Spacer(props) {
|
||||||
|
return WithCSS(
|
||||||
|
<div styleName='spacer' />,
|
||||||
|
styles
|
||||||
|
);
|
||||||
|
}
|
53
src/styles.scss
Normal file
53
src/styles.scss
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
.presentation, .slide, .transitions {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
%font {
|
||||||
|
font-family: 'Arimo', sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide {
|
||||||
|
display: table;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-inner {
|
||||||
|
display: table-cell;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spacer {
|
||||||
|
height: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.large-text {
|
||||||
|
@extend %font;
|
||||||
|
|
||||||
|
font-size: 4em;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-text {
|
||||||
|
@extend %font;
|
||||||
|
|
||||||
|
font-size: 2em;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
%code {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.code {
|
||||||
|
@extend %code;
|
||||||
|
|
||||||
|
font-size: 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.code-large {
|
||||||
|
@extend %code;
|
||||||
|
|
||||||
|
font-size: 1.35em;
|
||||||
|
}
|
50
webpack.config.js
Normal file
50
webpack.config.js
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
var ExtractTextPlugin = require('extract-text-webpack-plugin');
|
||||||
|
var CompressionPlugin = require('compression-webpack-plugin');
|
||||||
|
var WatchIgnorePlugin = require('watch-ignore-webpack-plugin');
|
||||||
|
var path = require('path');
|
||||||
|
|
||||||
|
var COMPRESS = false;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
context: __dirname + '/src',
|
||||||
|
entry: ['./index.js', './global.scss'],
|
||||||
|
output: {
|
||||||
|
path: __dirname + '/dist',
|
||||||
|
filename: 'presentation.js'
|
||||||
|
},
|
||||||
|
devtool: 'inline-source-map',
|
||||||
|
watchOptions: {
|
||||||
|
aggregateTimeout: 1000
|
||||||
|
},
|
||||||
|
module: {
|
||||||
|
loaders: [
|
||||||
|
{ test: /\.js$/, include: /\/src\//, loader: "babel-loader?stage=0"},
|
||||||
|
{
|
||||||
|
test: /styles\.scss$/, include: /\/src\//,
|
||||||
|
loader: ExtractTextPlugin.extract('style', 'css?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!sass')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /global.scss$/, include: /\/src\//,
|
||||||
|
loader: ExtractTextPlugin.extract('style', 'css?modules&importLoaders=1&localIdentName=[local]!sass')
|
||||||
|
},
|
||||||
|
{ test: /\.html$/, include: /\/src\//, loader: 'file?name=[name].[ext]' },
|
||||||
|
{ test: /\.{jpg,png}/, include: /\/src\//, loader: 'image-size?name=[name].[ext]' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new ExtractTextPlugin('style.css', { allChunks: true }),
|
||||||
|
new WatchIgnorePlugin([
|
||||||
|
path.resolve(__dirname ,'./node_modules/')
|
||||||
|
])
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
if (COMPRESS) {
|
||||||
|
module.exports.plugins.push(
|
||||||
|
new CompressionPlugin({
|
||||||
|
asset: '{file}.gz',
|
||||||
|
algorithm: 'gzip',
|
||||||
|
regExp: /\.(js|html|css)$/
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user