Skip to content

Commit

Permalink
Add tabs to presentation section
Browse files Browse the repository at this point in the history
  • Loading branch information
jemgold committed Mar 8, 2015
1 parent db2655e commit 1db4fab
Show file tree
Hide file tree
Showing 8 changed files with 242 additions and 23 deletions.
18 changes: 18 additions & 0 deletions css/base.css
Original file line number Diff line number Diff line change
Expand Up @@ -1259,6 +1259,7 @@ input[type=range] {

.range-light::-webkit-slider-thumb {
-webkit-appearance: none;
position: relative;
width: .5rem;
height: 1.25rem;
border-radius: 3px;
Expand All @@ -1267,6 +1268,19 @@ input[type=range] {
margin-top: -0.5rem;
}

/* Touch screen friendly pseudo element */

.range-light::-webkit-slider-thumb:before {
content: '';
display: block;
position: absolute;
top: -0.5rem;
left: -0.875rem;
width: 2.25rem;
height: 2.25rem;
opacity: 0;
}

.range-light::-moz-range-thumb {
width: .5rem;
height: 1.25rem;
Expand Down Expand Up @@ -1907,6 +1921,10 @@ html {
background: rgba(255, 255, 255, .2);
}

.border-transparent {
border-color: transparent;
}

.mbn4 {
margin-bottom: -4rem;
}
Expand Down
2 changes: 1 addition & 1 deletion css/base.min.css

Large diffs are not rendered by default.

16 changes: 12 additions & 4 deletions gulpfile.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@

var gulp = require('gulp');
var rename = require('gulp-rename');
var basswork = require('gulp-basswork');
var minifyCss = require('gulp-minify-css');
var webserver = require('gulp-webserver');
var babel = require('gulp-babel');

gulp.task('css', function() {
gulp.src('./src/css/base.css')
Expand All @@ -14,12 +14,20 @@ gulp.task('css', function() {
.pipe(gulp.dest('./css'));
});

gulp.task('es6', function() {
gulp.src('src/es6/**/*.es6')
.pipe(babel())
.pipe(rename({ extname: '.js' }))
.pipe(gulp.dest('js'));
});

gulp.task('serve', function() {
gulp.src('.')
.pipe(webserver({livereload: true}));
});

gulp.task('default', ['css', 'serve'], function() {
gulp.watch(['./src/**/*'], ['css']);
});
gulp.task('default', ['css', 'es6', 'serve'], function() {
gulp.watch(['./src/css/*'], ['css']);
gulp.watch(['./src/es6/*'], ['es6']);

});
23 changes: 5 additions & 18 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<link rel="stylesheet" href="css/base.min.css">
<script src="//use.typekit.net/juw6rni.js"></script>
<script>try{Typekit.load();}catch(e){}</script>
<script src="http://fb.me/react-0.12.2.min.js"></script>
</head>
<body>

Expand Down Expand Up @@ -80,24 +81,8 @@ <h3 class="black">Monitoring and Logging</h3>

<div class="gradient-blue-pink white">
<div class="container py4 px2">
<div class="clearfix mt4">
<div class="sm-col sm-col-4">
<h2 class="h1 mt0 mb3">Presentations & screencasts</h2>
<div class="clearfix p2 mxn2 mb1 bg-white-translucent rounded border border-white">
<div class="left mr2">
<img src="http://img.youtube.com/vi/Zve7rJ1FoDU/0.jpg" alt="" width=75 class="block rounded">
</div>
<div class="overflow-hidden">
<p class="bold mb0">Container Camp</p>
<p class="mb0">September 2014</p>
</div>
</div>
</div>
<div class="sm-col sm-col-8">
<div class="media-16-by-9 shadow rounded">
<iframe src="https://www.youtube.com/embed/Zve7rJ1FoDU?modestbranding=1&autohide=1&showinfo=0&controls=1" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div id="react-base">
Videos are available on YouTube: <a href="http://youtube.com/watch?=cQOPoDmkFg8" alt="LNUG">LNUG</a> <a href="http://youtube.com/watch?=Zve7rJ1FoDU" alt="Container Camp">Container Camp</a>
</div>
</div>
</div>
Expand Down Expand Up @@ -150,5 +135,7 @@ <h2 class="h1 mt0 black">Contributors & Crafters</h2>
</div>
</div>
</footer>

<script src="js/app.js"></script>
</body>
</html>
114 changes: 114 additions & 0 deletions js/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
"use strict";

var presentations = [{
title: "LNUG",
subtitle: "February 2015",
youtubeId: "cQOPoDmkFg8"
}, {
title: "Container Camp",
subtitle: "September 2014",
youtubeId: "Zve7rJ1FoDU"
}];

var YoutubeEmbed = React.createClass({
displayName: "YoutubeEmbed",

render: function render() {
var url = "https://www.youtube.com/embed/" + this.props.id + "?modestbranding=1&autohide=1&showinfo=0&controls=1";
return React.createElement("iframe", { src: url, frameBorder: "0", allowFullScreen: true });
}
});

var MenuItem = React.createClass({
displayName: "MenuItem",

onClick: function onClick() {
this.props.onClick(this.props.item.youtubeId);
},
render: function render() {
var classList = "clearfix p2 mxn2 mb1 rounded border";
if (this.props.active) {
classList += " bg-white-translucent border-white";
} else {
classList += " border-transparent";
}
return React.createElement(
"div",
{ className: classList, onClick: this.onClick },
React.createElement(
"div",
{ className: "left mr2" },
React.createElement(YoutubeThumbnail, { id: this.props.item.youtubeId })
),
React.createElement(
"div",
{ className: "overflow-hidden" },
React.createElement(
"p",
{ className: "bold mb0" },
this.props.item.title
),
React.createElement(
"p",
{ className: "mb0" },
this.props.item.subtitle
)
)
);
}
});

var YoutubeThumbnail = React.createClass({
displayName: "YoutubeThumbnail",

render: function render() {
var url = "http://img.youtube.com/vi/" + this.props.id + "/0.jpg";
return React.createElement("img", { src: url, alt: "", width: "75", className: "block rounded" });
}
});

var Tabs = React.createClass({
displayName: "Tabs",

getInitialState: function getInitialState() {
return { active: this.props.data[0].youtubeId };
},
setActive: function setActive(id) {
this.setState({ active: id });
},
menuItems: function menuItems() {
var _this = this;

return this.props.data.map(function (p, i) {
var active = _this.state.active === p.youtubeId;
return React.createElement(MenuItem, { item: p, active: active, key: i, onClick: _this.setActive });
});
},
render: function render() {
return React.createElement(
"div",
{ className: "clearfix mt4" },
React.createElement(
"div",
{ className: "sm-col sm-col-4" },
React.createElement(
"h2",
{ className: "h1 mt0 mb3" },
"Presentations & screencasts"
),
this.menuItems()
),
React.createElement(
"div",
{ className: "sm-col sm-col-8" },
React.createElement(
"div",
{ className: "media-16-by-9 shadow rounded bg-white-translucent" },
React.createElement(YoutubeEmbed, { id: this.state.active })
)
)
);
}
});

React.render(React.createElement(Tabs, { data: presentations }), document.getElementById("react-base"));
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
},
"devDependencies": {
"gulp": "^3.8.11",
"gulp-babel": "^4.0.0",
"gulp-basswork": "^0.1.0",
"gulp-minify-css": "^0.3.11",
"gulp-rename": "^1.2.0",
Expand Down
4 changes: 4 additions & 0 deletions src/css/base.css
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,10 @@ html {
background: rgba(255,255,255,.2);
}

.border-transparent {
border-color: transparent;
}

.mbn4 { margin-bottom: -var(--space-4); }

.hero-bg {
Expand Down
87 changes: 87 additions & 0 deletions src/es6/app.es6
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
const presentations = [
{
title: 'LNUG',
subtitle: 'February 2015',
youtubeId: 'cQOPoDmkFg8'
},
{
title: 'Container Camp',
subtitle: 'September 2014',
youtubeId: 'Zve7rJ1FoDU'
}
];

const YoutubeEmbed = React.createClass({
render() {
const url = `https://www.youtube.com/embed/${this.props.id}?modestbranding=1&autohide=1&showinfo=0&controls=1`
return (
<iframe src={url} frameBorder="0" allowFullScreen></iframe>
)
}
});

const MenuItem = React.createClass({
onClick() {
this.props.onClick(this.props.item.youtubeId);
},
render() {
var classList = 'clearfix p2 mxn2 mb1 rounded border'
if (this.props.active) {
classList += ' bg-white-translucent border-white';
} else {
classList += ' border-transparent'
}
return (
<div className={classList} onClick={this.onClick}>
<div className="left mr2">
<YoutubeThumbnail id={this.props.item.youtubeId}/>
</div>
<div className="overflow-hidden">
<p className="bold mb0">{this.props.item.title}</p>
<p className="mb0">{this.props.item.subtitle}</p>
</div>
</div>
)
}
});

const YoutubeThumbnail = React.createClass({
render() {
const url = `http://img.youtube.com/vi/${this.props.id}/0.jpg`;
return (
<img src={url} alt="" width="75" className="block rounded" />
)
}
});

const Tabs = React.createClass({
getInitialState() {
return { active: this.props.data[0].youtubeId }
},
setActive(id) {
this.setState({ active: id })
},
menuItems() {
return this.props.data.map((p, i) => {
const active = (this.state.active === p.youtubeId);
return <MenuItem item={p} active={active} key={i} onClick={this.setActive} />
})
},
render() {
return (
<div className="clearfix mt4">
<div className="sm-col sm-col-4">
<h2 className="h1 mt0 mb3">Presentations & screencasts</h2>
{this.menuItems()}
</div>
<div className="sm-col sm-col-8">
<div className="media-16-by-9 shadow rounded bg-white-translucent">
<YoutubeEmbed id={this.state.active} />
</div>
</div>
</div>
)
}
});

React.render(<Tabs data={presentations} />, document.getElementById('react-base'))

0 comments on commit 1db4fab

Please sign in to comment.