var $root = $(document.documentElement),
$window = $(window);
$root.attr("class", "js");
$(function() {
function animateLoader() {
var loader = $("#loader"),
loaderPos = 0;
setInterval(function() {
if (loaderPos == 12) loaderPos = 0;
loader.css("background-position", (loaderPos * -15) + "px 0");
loaderPos++;
}, 60);
}
function preload() {
var $works = $("section"),
postboxCompose = function() {
var postboxCompose = $works.eq(1),
emptyElt = $("<div/>");
postboxCompose.append($("<span/>", {
"class": "compose-area"
})).children().wrapAll(emptyElt.clone().addClass("wrap")).end().prepend(emptyElt.clone().addClass("shadow")).prepend(emptyElt.clone().addClass("gradient"));
},
kickoffTodos = function() {
var kickoffTodos = $works.eq(5),
emptyElt = $("<span/>");
kickoffTodos.prepend(emptyElt.clone().addClass("starsFront")).prepend(emptyElt.clone().addClass("starsMiddle")).prepend(emptyElt.clone().addClass("starsBack")).prepend(emptyElt.clone().addClass("bg")).append(emptyElt.clone().addClass("blur"));
},
thanks = function() {
var animBox = $works.eq(6).children("p").eq(0),
animImagesLength = 100;
function insertImg(src) {
var img = $("<img/>", {
alt: "",
src: "images/thanks/" + src + ".png"
})
img.appendTo(animBox);
}
for (var i = animImagesLength; i > -1; i--) insertImg(i);
};
postboxCompose();
kickoffTodos();
thanks();
};
animateLoader();
preload();
});
$window.load(function() {
// Helpers
var browserCSSPrefix = "",
animationEndEvent = "animationend";
if ($.browser.webkit) {
browserCSSPrefix = "-webkit-";
animationEndEvent = "webkitAnimationEnd";
} else if ($.browser.mozilla) browserCSSPrefix = "-moz-";
else if ($.browser.opera) browserCSSPrefix = "-o-";
var windowWidth = $root.width(),
windowHeight = $root.height(),
$style = $("<style/>").appendTo("head"),
$works = $("section"),
logo = $("h1"),
baseline = $("h2"),
reactiveClass = "reactive",
visibleClass = "visible",
hiddenClass = "hidden",
resizeScreenshot = function(screenshot) {
var windowWidth = $root.width(),
windowHeight = $root.height();
screenshotWidth = screenshot.width(), screenshotHeight = screenshot.height();
if (windowHeight < screenshotHeight) screenshot.css(
prefix("transform"), "scale(" + windowHeight / screenshotHeight + ")");
else if (windowWidth < screenshotWidth) screenshot.css(
prefix("transform"), "scale(" + windowWidth / screenshotWidth + ")");
else screenshot.css(prefix("transform"), "scale(1)");
},
prefix = function(obj) {
if (obj instanceof Object) {
var dict = obj,
newDict = {};
$.each(dict, function(key, value) {
newDict[prefix(key)] = value;
});
return newDict;
}
if (["transform", "animation", "animation-name", "animation-duration", "animation-timing-function", "animation-iteration-count", "animation-direction", "animation-delay"].indexOf(obj) > -1) obj = browserCSSPrefix + obj;
return obj;
},
insertCSSAnimation = function(name, properties) {
var anim = "@" + browserCSSPrefix + "keyframes " + name + " {\n";
$.each(properties, function(progress, props) {
anim += "\t" + progress + "% {\n";
$.each(props, function(key, value) {
anim += "\t\t" + key + ":" + value + ";\n";
})
anim += "\t" + "}\n";
})
anim += "}\n";
$style.append(anim);
};
// Works
function personal32pxSet() {
var personal32pxSet = $works.eq(0),
images = personal32pxSet.children("img");
function inAnim() {
personal32pxSet.addClass(visibleClass);
var animName = "inPersonal32pxSet";
insertCSSAnimation(animName, {
0: prefix({
"transform": "translateX(" + windowWidth + "px)"
}),
50: prefix({
"transform": "translateX(-20px)"
}),
100: prefix({
"transform": "translateX(0)"
})
});
images.css(prefix({
"transform": "translateX(" + windowWidth + "px)",
"animation": animName + " .8s cubic-bezier(.2,.6,.3,1)"
})).bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == animName) {
images.css(prefix("transform"), "translateX(0)");
$root.addClass(reactiveClass);
}
});
images.eq(0).css(prefix("animation-delay"), "1.2s");
images.eq(1).css(prefix("animation-delay"), "1.4s");
images.eq(2).css(prefix("animation-delay"), "1.6s");
images.eq(3).css(prefix("animation-delay"), "1.8s");
}
function outAnim() {
if (!$root.is("." + reactiveClass)) return;
$root.removeClass(reactiveClass);
var animName = "outPersonal32pxSet",
imagesLength = images.length;
insertCSSAnimation(animName, {
0: {},
100: prefix({
"transform": "translateX(-" + windowWidth + "px)"
})
});
images.each(function(i) {
var $this = images.eq(i),
animDelay = 0;
if (i == 1) animDelay = "08";
else if (i == 2) animDelay = "16";
else if (i == 3) animDelay = "24";
$this.css(
prefix("animation"), animName + " 1s cubic-bezier(.7,0,.6,.2) ." + animDelay + "s").bind(animationEndEvent, function() {
$this.addClass(hiddenClass);
if (i == imagesLength - 1) {
personal32pxSet.removeClass(visibleClass);
postboxCompose();
}
});
});
}
inAnim();
$root.click(outAnim);
};
function postboxCompose() {
var postboxCompose = $works.eq(1),
gradient = postboxCompose.children(".gradient"),
shadow = postboxCompose.children(".shadow"),
wrap = postboxCompose.children(".wrap");
postboxCompose.addClass(visibleClass);
$root.css("background", "#DF93BE");
logo.css("text-shadow", "0 1px 0 rgba(0,0,0,.35)");
baseline.css({
"color": "#5A3D51",
"text-shadow": "0 1px 0 rgba(255,255,255,.15)"
});
insertCSSAnimation("showGradient", {
0: prefix({
"opacity": "0",
"transform": "scale(1.2)"
}),
100: {}
});
insertCSSAnimation("showWindow", {
0: prefix({
"opacity": "0",
"transform": "scale(.3)"
}),
40: prefix({
"opacity": "0",
"transform": "scale(.3)"
}),
50: prefix({
"opacity": ".1",
"transform": "scale(1.05)"
}),
60: prefix({
"opacity": ".2",
"transform": "scale(.98)"
}),
70: prefix({
"opacity": ".3",
"transform": "scale(1.02)"
}),
100: {}
});
insertCSSAnimation("resizeShadow", {
0: prefix({
"opacity": "0",
"transform": "scaleY(.965) translateY(11px)"
}),
40: prefix({
"opacity": "0",
"transform": "scaleY(.965) translateY(11px)"
}),
68: prefix({
"transform": "scaleY(.965) translateY(11px)"
}),
100: {}
});
insertCSSAnimation("toolbarSlidesUp", {
0: prefix({
"transform": "translateY(21px)"
}),
80: prefix({
"transform": "translateY(21px)"
}),
100: {}
});
insertCSSAnimation("formatSlidesDown", {
0: prefix({
"transform": "translateY(-26px)"
}),
88: prefix({
"transform": "translateY(-26px)"
}),
100: {}
});
insertCSSAnimation("outWindow", {
0: {},
20: prefix({
"opacity": ".9",
"transform": "scale(1.05)"
}),
35: prefix({
"opacity": ".8",
"transform": "scale(1.05)"
}),
100: prefix({
"transform": "scale(.1)",
"opacity": "0"
})
});
insertCSSAnimation("outGradient", {
0: {},
100: prefix({
"opacity": "0",
"transform": "translateY(20px)"
})
});
gradient.css(
prefix("animation"), "showGradient .8s linear");
shadow.css(
prefix("animation"), "resizeShadow 3.5s ease-out");
wrap.css(
prefix("animation"), "showWindow 1.8s ease-in");
postboxCompose.find("[src*=toolbar]").css(
prefix("animation"), "toolbarSlidesUp 3s cubic-bezier(.2,.6,.3,1)");
postboxCompose.find("[src*=format]").css(
prefix("animation"), "formatSlidesDown 3.2s cubic-bezier(.2,.6,.3,1)");
postboxCompose.bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == "formatSlidesDown") {
$root.addClass(reactiveClass).click(function() {
gradient.css(
prefix("animation"), "outGradient .8s linear");
shadow.css(
prefix("animation"), "outWindow .8s cubic-bezier(.7,0,.6,.2)");
wrap.css(
prefix("animation"), "outWindow .8s cubic-bezier(.7,0,.6,.2)");
$root.removeClass(reactiveClass);
postboxCompose.bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == "outGradient") {
postboxCompose.removeClass(visibleClass);
postboxToolbarGlyphs();
}
});
});
}
});
$window.resize(function() {
resizeScreenshot(shadow);
resizeScreenshot(wrap);
});
};
function postboxToolbarGlyphs() {
var postboxToolbarGlyphs = $works.eq(2),
images = postboxToolbarGlyphs.children(),
inAnimName = "inPostboxToolbarGlyph",
outAnimName = "outPostboxToolbarGlyph";
postboxToolbarGlyphs.addClass(visibleClass);
$root.css("background", "#D0D0D0");
logo.css("text-shadow", "0 1px 0 rgba(0,0,0,.35)");
baseline.css({
"color": "#888",
"text-shadow": "0 1px 0 rgba(255,255,255,.3)"
});
var centerValue = parseInt(images.length / 2),
centerImage = images.eq(centerValue),
centerImageXPos = centerImage.position().left,
centerImageYPos = centerImage.position().top;
insertCSSAnimation("showCenterPostboxGlyph", {
0: prefix({
"opacity": "0",
"transform": "scale(2.5)"
}),
30: prefix({
"opacity": "0",
"transform": "scale(2.5)"
}),
50: prefix({
"transform": "scale(.6)"
}),
100: {}
});
centerImage.css(
prefix("animation"), "showCenterPostboxGlyph 2.2s cubic-bezier(.2,.6,.3,1)");
images.each(function(i) {
if (i == centerValue) return;
var $this = images.eq(i),
thisInAnimName = inAnimName + i,
thisInAnimDelay = 65 + (i / 1.5),
offsetX = (centerImageXPos - $this.position().left) + "px",
offsetY = (centerImageYPos - $this.position().top) + "px",
props = {
0: prefix({
"opacity": "0",
"transform": "translate(" + offsetX + "," + offsetY + ")"
}),
100: {}
};
props[thisInAnimDelay] = prefix({
"opacity": "0",
"transform": "translate(" + offsetX + "," + offsetY + ")"
});
insertCSSAnimation(thisInAnimName, props);
$this.css(
prefix("animation"), thisInAnimName + " 3s cubic-bezier(.2,.6,.3,1)");
});
postboxToolbarGlyphs.bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == inAnimName + (images.length - 1)) {
$root.addClass(reactiveClass).click(function() {
$root.removeClass(reactiveClass);
insertCSSAnimation(outAnimName, {
0: {},
20: prefix({
"transform": "scale(1.2)"
}),
100: prefix({
"opacity": "0",
"transform": "scale(.1)"
})
});
images.css(
prefix("animation"), outAnimName + " 1.2s cubic-bezier(.2,.6,.3,1)").eq(images.length - 1).bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == outAnimName) {
postboxToolbarGlyphs.removeClass(visibleClass);
postboxFolderIcons();
}
});
});
}
});
}
function postboxFolderIcons() {
var postboxFolderIcons = $works.eq(3),
images = postboxFolderIcons.children(),
imagesLength = images.length,
inAnimName = "inPostboxFolderIcons";
postboxFolderIcons.addClass(visibleClass);
$root.css("background", "#DCE1E7");
logo.css("text-shadow", "0 1px 0 #A4AFBE");
baseline.css({
"color": "#A4AFBE",
"text-shadow": "0 1px 0 rgba(255,255,255,.5)"
});
insertCSSAnimation(inAnimName, {
0: prefix({
"transform": "translateY(-" + windowHeight + "px)"
}),
94: prefix({
"transform": "translateY(8px)"
}),
100: prefix({
"transform": "translateY(0)"
})
});
function outAnim() {
var outAnimName = "outPostboxFolderIcons";
insertCSSAnimation(outAnimName, {
0: {},
40: prefix({
"transform": "translateY(-8px)"
}),
100: prefix({
"transform": "translateY(" + windowHeight + "px)"
})
});
images.each(function(i) {
var $this = images.eq(i);
$this.css(prefix({
"animation": outAnimName + " .8s cubic-bezier(.7,0,.6,.2) " + i / 15 + "s"
})).bind(animationEndEvent, function() {
$this.css(prefix("transform"), "translateY(" + windowHeight + "px)");
if (i == imagesLength - 1) {
postboxFolderIcons.removeClass(visibleClass);
kickoffBlankslateIcons();
}
});
});
$root.removeClass(reactiveClass);
};
images.each(function(i) {
var $this = images.eq(i);
$this.css(prefix({
"transform": "translateY(-" + windowHeight + "px)",
"animation": inAnimName + " 1.5s ease-in " + i / 15 + "s"
})).bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == inAnimName) {
$this.css(prefix("transform"), "translateY(0)");
if (i == imagesLength - 1) $root.addClass(reactiveClass).click(outAnim);
}
});
});
}
function kickoffBlankslateIcons() {
var kickoffBlankslateIcons = $works.eq(4),
icons = kickoffBlankslateIcons.children("img"),
inAnim = function() {
var iconSquaresNumber = 100,
iconSquareElt = $("<span/>", {
"class": "square"
}),
iconsSquaresWrap = $("<span/>", {
"class": "wrap"
}),
iconsNumber = icons.length,
animName = "inKickoffBlankslateIcons";
insertCSSAnimation(animName, {
0: prefix({
"opacity": "0",
"transform": "translateX(" + windowWidth + "px) scale(10) rotate(180deg)"
}),
50: prefix({
"opacity": ".5",
"transform": "translateX(-5px) scale(.5) rotate(-10deg)"
}),
100: {
"opacity": "1"
}
});
function styleBrand() {
$root.css("background", "#F6F7FA");
logo.css({
"color": "#000",
"text-shadow": "none"
});
baseline.css({
"color": "#ACB5CE",
"text-shadow": "0 1px 0 #fff"
});
}
function createParticles() {
var wrap = iconsSquaresWrap.clone(),
bg = $(this).attr("src");
for (var i = 0; i < iconSquaresNumber; i++) {
var x = (i % 10) * 25,
y = ~~ (i / 10) * 25;
iconSquareElt.clone().css(prefix({
"opacity": "0",
"background-image": "url(" + bg + ")",
"background-repeat": "no-repeat",
"background-position": "-" + x + "px -" + y + "px",
"animation": animName + " 2.8s cubic-bezier(.1,.8,.4,1) " + Math.random() + "s"
})).appendTo(wrap).bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == animName) {
$(this).css("opacity", "1");
}
});
};
kickoffBlankslateIcons.append(wrap);
}
function animListener(e) {
if (e.originalEvent.animationName == animName) {
$root.addClass(reactiveClass).click(outAnim);
$(this).unbind(animationEndEvent, animListener);
}
}
kickoffBlankslateIcons.addClass(visibleClass);
styleBrand();
icons.each(createParticles);
kickoffBlankslateIcons.bind(animationEndEvent, animListener);
},
outAnim = function() {
var animName = "outKickoffBlankslateIcons",
animDuration = 1200,
squares = kickoffBlankslateIcons.find(".square"),
delays = [];
insertCSSAnimation(animName, {
0: {},
100: prefix({
"opacity": "0",
"transform": "translateX(-" + windowWidth + "px) scale(.1) rotate(-300deg)"
})
});
function hideParticles() {
var $this = $(this),
delay = Math.random();
delays.push(delay);
$this.css(prefix({
"animation-name": animName,
"animation-duration": animDuration + "ms",
"animation-timing-function": "cubic-bezier(.7,0,.6,.2)",
"animation-delay": delay
})).bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == animName) $this.addClass(hiddenClass);
});
}
squares.each(hideParticles);
$root.removeClass(reactiveClass).unbind("click", outAnim);
setTimeout(function() {
kickoffBlankslateIcons.removeClass(visibleClass);
kickoffTodos();
}, animDuration + (delays.sort().pop() * 1000));
};
inAnim();
}
function kickoffTodos() {
var kickoffTodos = $works.eq(5),
screenshot = kickoffTodos.children("img"),
inAnim = function() {
var bg = kickoffTodos.children(".bg"),
starsBack = kickoffTodos.children(".starsBack"),
starsMiddle = kickoffTodos.children(".starsMiddle"),
starsFront = kickoffTodos.children(".starsFront"),
blur = kickoffTodos.children(".blur"),
stars = [starsBack, starsMiddle, starsFront],
starsLength = stars.length,
auroraAnimName = "inAuroraFadesIn",
starsAnimName = "inMoveStars",
screenshotAnimName = "inKickoffTodosWindow",
inBlurAnimName = "inKickoffTodosBlurWindow",
outBlurAnimName = "outKickoffTodosBlurWindow";
logo.css({
"color": "#fff",
"text-shadow": "0 1px 0 #000"
});
baseline.css({
"color": "#666E8A",
"text-shadow": "0 1px 0 #000"
});
kickoffTodos.addClass(visibleClass);
insertCSSAnimation(auroraAnimName, {
0: prefix({
"opacity": "0",
"transform": "scale(1.1) translateX(10px)"
}),
100: {}
});
insertCSSAnimation(starsAnimName, {
0: {
"opacity": "0"
},
2: prefix({
"opacity": "1",
"transform": "translateX(-160px)"
}),
4: prefix({
"opacity": ".2",
"transform": "translateX(-320px)"
}),
5: prefix({
"opacity": "1",
"transform": "translateX(-400px)"
}),
99: prefix({
"transform": "translateX(-8000px)"
}),
100: prefix({
"opacity": "0",
"transform": "translateX(-8000px)"
})
});
insertCSSAnimation(screenshotAnimName, {
0: {
"opacity": "0"
},
100: {}
});
insertCSSAnimation(inBlurAnimName, {
0: prefix({
"opacity": "0",
"transform": "scale(.96)"
}),
100: {
"opacity": ".7"
}
});
insertCSSAnimation(outBlurAnimName, {
0: {
"opacity": ".7"
},
100: {
"opacity": "0"
}
});
bg.css(prefix("animation"), auroraAnimName + " 1.5s ease-out").bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == auroraAnimName) $root.css("background", "#03092B");
});
for (var i = 0; i < starsLength; i++)
stars[i].css(prefix({
"animation-name": starsAnimName,
"animation-timing-function": "linear",
"animation-iteration-count": "infinite"
}));
starsFront.css(prefix("animation-duration"), "420s");
starsMiddle.css(prefix("animation-duration"), "660s");
starsBack.css(prefix("animation-duration"), "840s");
screenshot.addClass(hiddenClass);
blur.css(prefix({
"opacity": "0",
"animation": inBlurAnimName + " .4s ease-out 1.2s"
})).bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == inBlurAnimName) {
blur.css(prefix("animation"), outBlurAnimName + " 1s linear").bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == outBlurAnimName) {
blur.addClass(hiddenClass);
$root.addClass(reactiveClass).click(outAnim);
}
});
screenshot.css(prefix("animation"), screenshotAnimName + " .5s linear").removeClass(hiddenClass);
}
});
},
outAnim = function() {
var outGlobalAnimName = "outKickoffTodosGlobal",
outScreenshotAnimName = "outKickoffTodosScreenshot";
insertCSSAnimation(outGlobalAnimName, {
0: {},
100: {
"opacity": "0"
}
});
insertCSSAnimation(outScreenshotAnimName, {
0: {},
100: {
"opacity": "0"
}
});
kickoffTodos.css(
prefix("animation"), outGlobalAnimName + " 2.5s ease-out").bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == outGlobalAnimName) {
kickoffTodos.removeClass(visibleClass);
thanks();
}
});
screenshot.css(
prefix("animation"), outScreenshotAnimName + " 2s cubic-bezier(.2,.5,.3,1)").bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == outScreenshotAnimName) screenshot.addClass(hiddenClass);
});
$root.css("background", "#000").removeClass(reactiveClass);
};
inAnim();
$window.resize(function() {
resizeScreenshot(screenshot);
});
}
function thanks() {
var thanks = $works.eq(6),
inAnim = function() {
var gradient = $("<span/>", {
"class": "gradient"
}),
gradientAnimName = "inThanksGradient",
infoAnimName = "inThanksInfo",
copyright = thanks.children("p").eq(1),
lis = thanks.find("li"),
mail = lis.eq(0),
twitter = lis.eq(1),
info = [copyright, mail, twitter],
infoLength = info.length,
styleBrand = function() {
$root.css("background", "#000");
logo.css({
"color": "#fff",
"text-shadow": "0 1px 0 #000"
});
baseline.css({
"color": "#777",
"text-shadow": "0 1px 0 #000"
});
},
showInfo = function() {
for (var j = 0; j < infoLength; j++) {
info[j].css(
prefix("animation"), infoAnimName + " 1.2s cubic-bezier(.2,.5,.3,1)").bind(animationEndEvent, function(e) {
if (e.originalEvent.animationName == infoAnimName) $(this).css("opacity", 1);
});
};
mail.css(prefix("animation-delay"), ".4s");
twitter.css(prefix("animation-delay"), ".6s");
};
insertCSSAnimation(gradientAnimName, {
0: prefix({
"opacity": "0",
"transform": "scale(1.5)"
}),
100: {
"opacity": "1"
}
});
insertCSSAnimation(infoAnimName, {
0: prefix({
"opacity": "0",
"transform": "translateY(15px)"
}),
100: {
"opacity": "1"
}
});
gradient.css(
prefix("animation"), gradientAnimName + " 2s cubic-bezier(.2,.5,.3,1)");
for (var i = 0; i < infoLength; i++) {
info[i].css("opacity", 0);
};
var animImages = thanks.children("p").eq(0).children("img"),
i = 0,
animImagesLength = animImages.length - 1,
thanksAnim = setInterval(function() {
animImages.eq(i).remove();
i++;
if (i == animImagesLength) {
clearInterval(thanksAnim);
showInfo();
}
}, 30);
thanks.prepend(gradient).addClass(visibleClass);
styleBrand();
};
inAnim();
}
function removeLoader() {
var $loader = $("#loader"),
animName = "removeLoader";
insertCSSAnimation(animName, {
0: {},
10: prefix({
"transform": "scale(1.2)"
}),
15: prefix({
"transform": "scale(1.2)"
}),
100: prefix({
"transform": "scale(.1)",
"opacity": "0"
})
});
$loader.css(prefix("animation"), animName + " 1.5s cubic-bezier(.2,.6,.3,1)").bind(animationEndEvent, function() {
$loader.remove();
});
};
// Let the show begin
removeLoader();
personal32pxSet();
});
var $root = $(document.documentElement),
$window = $(window);
$root.attr("class","js");
$(function(){
function animateLoader() {
var loader = $("#loader"),
loaderPos = 0;
setInterval(function(){
if(loaderPos == 12)
loaderPos = 0;
loader.css("background-position", (loaderPos * -15) + "px 0");
loaderPos++;
}, 60);
}
function preload() {
var $works = $("section"),
postboxCompose = function() {
var postboxCompose = $works.eq(1),
emptyElt = $("<div/>");
postboxCompose
.append($("<span/>", {"class":"compose-area"}))
.children()
.wrapAll(emptyElt.clone().addClass("wrap"))
.end()
.prepend(emptyElt.clone().addClass("shadow"))
.prepend(emptyElt.clone().addClass("gradient"));
},
kickoffTodos = function() {
var kickoffTodos = $works.eq(5),
emptyElt = $("<span/>");
kickoffTodos
.prepend(emptyElt.clone().addClass("starsFront"))
.prepend(emptyElt.clone().addClass("starsMiddle"))
.prepend(emptyElt.clone().addClass("starsBack"))
.prepend(emptyElt.clone().addClass("bg"))
.append(emptyElt.clone().addClass("blur"));
},
thanks = function() {
var animBox = $works.eq(6).children("p").eq(0),
animImagesLength = 100;
function insertImg(src) {
var img = $("<img/>", {
alt:"",
src:"images/thanks/" + src + ".png"
})
img.appendTo(animBox);
}
for(var i = animImagesLength; i > -1; i--) insertImg(i);
};
postboxCompose();
kickoffTodos();
thanks();
};
animateLoader();
preload();
});
$window.load(function(){
// Helpers
var browserCSSPrefix = "",
animationEndEvent = "animationend";
if($.browser.webkit) {
browserCSSPrefix = "-webkit-";
animationEndEvent = "webkitAnimationEnd";
}
else if($.browser.mozilla)
browserCSSPrefix = "-moz-";
else if($.browser.opera)
browserCSSPrefix = "-o-";
var windowWidth = $root.width(),
windowHeight = $root.height(),
$style = $("<style/>").appendTo("head"),
$works = $("section"),
logo = $("h1"),
baseline = $("h2"),
reactiveClass = "reactive",
visibleClass = "visible",
hiddenClass = "hidden",
resizeScreenshot = function(screenshot){
var windowWidth = $root.width(),
windowHeight = $root.height();
screenshotWidth = screenshot.width(),
screenshotHeight = screenshot.height();
if(windowHeight < screenshotHeight)
screenshot.css(
prefix("transform"),"scale(" + windowHeight / screenshotHeight + ")"
);
else if(windowWidth < screenshotWidth)
screenshot.css(
prefix("transform"),"scale(" + windowWidth / screenshotWidth + ")"
);
else
screenshot.css(prefix("transform"),"scale(1)");
},
prefix = function(obj) {
if(obj instanceof Object) {
var dict = obj,
newDict = {};
$.each(dict,function(key , value) {
newDict[prefix(key)] = value;
});
return newDict;
}
if([
"transform",
"animation",
"animation-name",
"animation-duration",
"animation-timing-function",
"animation-iteration-count",
"animation-direction",
"animation-delay"
].indexOf(obj) > -1)
obj = browserCSSPrefix + obj;
return obj;
},
insertCSSAnimation = function(name, properties) {
var anim = "@" + browserCSSPrefix + "keyframes " + name + " {\n";
$.each(properties, function(progress, props) {
anim += "\t" + progress + "% {\n";
$.each(props,function(key , value) {
anim += "\t\t" + key + ":" + value + ";\n";
})
anim += "\t" + "}\n";
})
anim += "}\n";
$style.append(anim);
};
// Works
function personal32pxSet(){
var personal32pxSet = $works.eq(0),
images = personal32pxSet.children("img");
function inAnim(){
personal32pxSet.addClass(visibleClass);
var animName = "inPersonal32pxSet";
insertCSSAnimation(animName, {
0 : prefix({ "transform" : "translateX(" + windowWidth + "px)" }),
50 : prefix({ "transform" : "translateX(-20px)" }),
100 : prefix({ "transform" : "translateX(0)" })
});
images
.css(prefix({
"transform":"translateX(" + windowWidth + "px)",
"animation":animName + " .8s cubic-bezier(.2,.6,.3,1)"
}))
.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == animName) {
images.css(prefix("transform"),"translateX(0)");
$root.addClass(reactiveClass);
}
});
images.eq(0).css(prefix("animation-delay"),"1.2s");
images.eq(1).css(prefix("animation-delay"),"1.4s");
images.eq(2).css(prefix("animation-delay"),"1.6s");
images.eq(3).css(prefix("animation-delay"),"1.8s");
}
function outAnim(){
if(!$root.is("." + reactiveClass)) return;
$root.removeClass(reactiveClass);
var animName = "outPersonal32pxSet",
imagesLength = images.length;
insertCSSAnimation(animName, {
0 : {},
100 : prefix({ "transform":"translateX(-" + windowWidth + "px)" })
});
images.each(function(i){
var $this = images.eq(i),
animDelay = 0;
if(i == 1) animDelay = "08";
else if(i == 2) animDelay = "16";
else if(i == 3) animDelay = "24";
$this
.css(
prefix("animation"),
animName + " 1s cubic-bezier(.7,0,.6,.2) ." + animDelay + "s"
)
.bind(animationEndEvent, function(){
$this.addClass(hiddenClass);
if(i == imagesLength - 1) {
personal32pxSet.removeClass(visibleClass);
postboxCompose();
}
});
});
}
inAnim();
$root.click(outAnim);
};
function postboxCompose(){
var postboxCompose = $works.eq(1),
gradient = postboxCompose.children(".gradient"),
shadow = postboxCompose.children(".shadow"),
wrap = postboxCompose.children(".wrap");
postboxCompose.addClass(visibleClass);
$root.css("background","#DF93BE");
logo.css("text-shadow","0 1px 0 rgba(0,0,0,.35)");
baseline.css({
"color":"#5A3D51",
"text-shadow":"0 1px 0 rgba(255,255,255,.15)"
});
insertCSSAnimation("showGradient", {
0 : prefix({
"opacity":"0",
"transform":"scale(1.2)"
}),
100 : {}
});
insertCSSAnimation("showWindow", {
0 : prefix({
"opacity":"0",
"transform":"scale(.3)"
}),
40 : prefix({
"opacity":"0",
"transform":"scale(.3)"
}),
50 : prefix({
"opacity":".1",
"transform":"scale(1.05)"
}),
60 : prefix({
"opacity":".2",
"transform":"scale(.98)"
}),
70 : prefix({
"opacity":".3",
"transform":"scale(1.02)"
}),
100 : {}
});
insertCSSAnimation("resizeShadow", {
0 : prefix({
"opacity":"0",
"transform":"scaleY(.965) translateY(11px)"
}),
40 : prefix({
"opacity":"0",
"transform":"scaleY(.965) translateY(11px)"
}),
68 : prefix({"transform":"scaleY(.965) translateY(11px)"}),
100 : {}
});
insertCSSAnimation("toolbarSlidesUp", {
0 : prefix({"transform":"translateY(21px)"}),
80 : prefix({"transform":"translateY(21px)"}),
100 : {}
});
insertCSSAnimation("formatSlidesDown", {
0 : prefix({"transform":"translateY(-26px)"}),
88 : prefix({"transform":"translateY(-26px)"}),
100 : {}
});
insertCSSAnimation("outWindow", {
0 : {},
20 : prefix({
"opacity":".9",
"transform":"scale(1.05)"
}),
35 : prefix({
"opacity":".8",
"transform":"scale(1.05)"
}),
100 : prefix({
"transform":"scale(.1)",
"opacity":"0"
})
});
insertCSSAnimation("outGradient", {
0 : {},
100 : prefix({
"opacity":"0",
"transform":"translateY(20px)"
})
});
gradient.css(
prefix("animation"), "showGradient .8s linear"
);
shadow.css(
prefix("animation"), "resizeShadow 3.5s ease-out"
);
wrap.css(
prefix("animation"), "showWindow 1.8s ease-in"
);
postboxCompose.find("[src*=toolbar]").css(
prefix("animation"), "toolbarSlidesUp 3s cubic-bezier(.2,.6,.3,1)"
);
postboxCompose.find("[src*=format]").css(
prefix("animation"), "formatSlidesDown 3.2s cubic-bezier(.2,.6,.3,1)"
);
postboxCompose.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == "formatSlidesDown") {
$root.addClass(reactiveClass).click(function(){
gradient.css(
prefix("animation"),"outGradient .8s linear"
);
shadow.css(
prefix("animation"),"outWindow .8s cubic-bezier(.7,0,.6,.2)"
);
wrap.css(
prefix("animation"),"outWindow .8s cubic-bezier(.7,0,.6,.2)"
);
$root.removeClass(reactiveClass);
postboxCompose.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == "outGradient") {
postboxCompose.removeClass(visibleClass);
postboxToolbarGlyphs();
}
});
});
}
});
$window.resize(function(){
resizeScreenshot(shadow);
resizeScreenshot(wrap);
});
};
function postboxToolbarGlyphs(){
var postboxToolbarGlyphs = $works.eq(2),
images = postboxToolbarGlyphs.children(),
inAnimName = "inPostboxToolbarGlyph",
outAnimName = "outPostboxToolbarGlyph";
postboxToolbarGlyphs.addClass(visibleClass);
$root.css("background","#D0D0D0");
logo.css("text-shadow","0 1px 0 rgba(0,0,0,.35)");
baseline.css({
"color":"#888",
"text-shadow":"0 1px 0 rgba(255,255,255,.3)"
});
var centerValue = parseInt(images.length / 2),
centerImage = images.eq(centerValue),
centerImageXPos = centerImage.position().left,
centerImageYPos = centerImage.position().top;
insertCSSAnimation("showCenterPostboxGlyph", {
0 : prefix({
"opacity":"0",
"transform":"scale(2.5)"
}),
30 : prefix({
"opacity":"0",
"transform":"scale(2.5)"
}),
50 : prefix({
"transform":"scale(.6)"
}),
100 : {}
});
centerImage.css(
prefix("animation"),
"showCenterPostboxGlyph 2.2s cubic-bezier(.2,.6,.3,1)"
);
images.each(function(i){
if(i == centerValue) return;
var $this = images.eq(i),
thisInAnimName = inAnimName + i,
thisInAnimDelay = 65 + (i/1.5),
offsetX = (centerImageXPos - $this.position().left) + "px",
offsetY = (centerImageYPos - $this.position().top) + "px",
props = {
0 : prefix({
"opacity":"0",
"transform":"translate(" + offsetX + "," + offsetY + ")"
}),
100 : {}
};
props[thisInAnimDelay] = prefix({
"opacity":"0",
"transform":"translate(" + offsetX + "," + offsetY + ")"
});
insertCSSAnimation(thisInAnimName, props);
$this.css(
prefix("animation"),
thisInAnimName + " 3s cubic-bezier(.2,.6,.3,1)"
);
});
postboxToolbarGlyphs.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == inAnimName + (images.length - 1)) {
$root.addClass(reactiveClass).click(function(){
$root.removeClass(reactiveClass);
insertCSSAnimation(outAnimName, {
0 : {},
20 : prefix({"transform":"scale(1.2)"}),
100 : prefix({
"opacity":"0",
"transform":"scale(.1)"
})
});
images
.css(
prefix("animation"),
outAnimName + " 1.2s cubic-bezier(.2,.6,.3,1)"
)
.eq(images.length - 1)
.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == outAnimName) {
postboxToolbarGlyphs.removeClass(visibleClass);
postboxFolderIcons();
}
});
});
}
});
}
function postboxFolderIcons(){
var postboxFolderIcons = $works.eq(3),
images = postboxFolderIcons.children(),
imagesLength = images.length,
inAnimName = "inPostboxFolderIcons";
postboxFolderIcons.addClass(visibleClass);
$root.css("background","#DCE1E7");
logo.css("text-shadow","0 1px 0 #A4AFBE");
baseline.css({
"color":"#A4AFBE",
"text-shadow":"0 1px 0 rgba(255,255,255,.5)"
});
insertCSSAnimation(inAnimName, {
0 : prefix({"transform":"translateY(-" + windowHeight + "px)"}),
94 : prefix({"transform":"translateY(8px)"}),
100 : prefix({"transform":"translateY(0)"})
});
function outAnim() {
var outAnimName = "outPostboxFolderIcons";
insertCSSAnimation(outAnimName, {
0 : {},
40 : prefix({"transform":"translateY(-8px)"}),
100 : prefix({"transform":"translateY(" + windowHeight + "px)"})
});
images.each(function(i){
var $this = images.eq(i);
$this
.css(prefix({
"animation":outAnimName+" .8s cubic-bezier(.7,0,.6,.2) "+i/15+"s"
}))
.bind(animationEndEvent, function(){
$this.css(prefix("transform"),"translateY(" + windowHeight + "px)");
if(i == imagesLength - 1) {
postboxFolderIcons.removeClass(visibleClass);
kickoffBlankslateIcons();
}
});
});
$root.removeClass(reactiveClass);
};
images.each(function(i){
var $this = images.eq(i);
$this
.css(prefix({
"transform":"translateY(-" + windowHeight + "px)",
"animation":inAnimName + " 1.5s ease-in " + i/15 + "s"
}))
.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == inAnimName) {
$this.css(prefix("transform"),"translateY(0)");
if(i == imagesLength - 1)
$root.addClass(reactiveClass).click(outAnim);
}
});
});
}
function kickoffBlankslateIcons(){
var kickoffBlankslateIcons = $works.eq(4),
icons = kickoffBlankslateIcons.children("img"),
inAnim = function(){
var iconSquaresNumber = 100,
iconSquareElt = $("<span/>", {"class":"square"}),
iconsSquaresWrap = $("<span/>", {"class":"wrap"}),
iconsNumber = icons.length,
animName = "inKickoffBlankslateIcons";
insertCSSAnimation(animName, {
0 : prefix({
"opacity":"0",
"transform":"translateX("
+ windowWidth
+ "px) scale(10) rotate(180deg)"
}),
50 : prefix({
"opacity":".5",
"transform":"translateX(-5px) scale(.5) rotate(-10deg)"
}),
100 : {"opacity":"1"}
});
function styleBrand(){
$root.css("background","#F6F7FA");
logo.css({
"color":"#000",
"text-shadow":"none"
});
baseline.css({
"color":"#ACB5CE",
"text-shadow":"0 1px 0 #fff"
});
}
function createParticles() {
var wrap = iconsSquaresWrap.clone(),
bg = $(this).attr("src");
for (var i=0; i < iconSquaresNumber; i++) {
var x = (i % 10) * 25,
y = ~~(i / 10) * 25;
iconSquareElt
.clone()
.css(prefix({
"opacity":"0",
"background-image":"url(" + bg + ")",
"background-repeat":"no-repeat",
"background-position":"-" + x + "px -" + y + "px",
"animation":animName
+ " 2.8s cubic-bezier(.1,.8,.4,1) "
+ Math.random()
+ "s"
}))
.appendTo(wrap)
.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == animName) {
$(this).css("opacity","1");
}
});
};
kickoffBlankslateIcons.append(wrap);
}
function animListener(e) {
if(e.originalEvent.animationName == animName) {
$root.addClass(reactiveClass).click(outAnim);
$(this).unbind(animationEndEvent, animListener);
}
}
kickoffBlankslateIcons.addClass(visibleClass);
styleBrand();
icons.each(createParticles);
kickoffBlankslateIcons.bind(animationEndEvent, animListener);
},
outAnim = function(){
var animName = "outKickoffBlankslateIcons",
animDuration = 1200,
squares = kickoffBlankslateIcons.find(".square"),
delays = [];
insertCSSAnimation(animName, {
0 : {},
100 : prefix({
"opacity":"0",
"transform":"translateX(-"
+ windowWidth
+ "px) scale(.1) rotate(-300deg)"
})
});
function hideParticles() {
var $this = $(this),
delay = Math.random();
delays.push(delay);
$this
.css(prefix({
"animation-name":animName,
"animation-duration":animDuration + "ms",
"animation-timing-function":"cubic-bezier(.7,0,.6,.2)",
"animation-delay":delay
}))
.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == animName)
$this.addClass(hiddenClass);
});
}
squares.each(hideParticles);
$root.removeClass(reactiveClass).unbind("click", outAnim);
setTimeout(function(){
kickoffBlankslateIcons.removeClass(visibleClass);
kickoffTodos();
}, animDuration + (delays.sort().pop() * 1000));
};
inAnim();
}
function kickoffTodos(){
var kickoffTodos = $works.eq(5),
screenshot = kickoffTodos.children("img"),
inAnim = function() {
var bg = kickoffTodos.children(".bg"),
starsBack = kickoffTodos.children(".starsBack"),
starsMiddle = kickoffTodos.children(".starsMiddle"),
starsFront = kickoffTodos.children(".starsFront"),
blur = kickoffTodos.children(".blur"),
stars = [starsBack,starsMiddle,starsFront],
starsLength = stars.length,
auroraAnimName = "inAuroraFadesIn",
starsAnimName = "inMoveStars",
screenshotAnimName = "inKickoffTodosWindow",
inBlurAnimName = "inKickoffTodosBlurWindow",
outBlurAnimName = "outKickoffTodosBlurWindow";
logo.css({
"color":"#fff",
"text-shadow":"0 1px 0 #000"
});
baseline.css({
"color":"#666E8A",
"text-shadow":"0 1px 0 #000"
});
kickoffTodos.addClass(visibleClass);
insertCSSAnimation(auroraAnimName, {
0 : prefix({
"opacity":"0",
"transform":"scale(1.1) translateX(10px)"
}),
100 : {}
});
insertCSSAnimation(starsAnimName, {
0 : {"opacity":"0"},
2 : prefix({
"opacity":"1",
"transform":"translateX(-160px)"
}),
4 : prefix({
"opacity":".2",
"transform":"translateX(-320px)"
}),
5 : prefix({
"opacity":"1",
"transform":"translateX(-400px)"
}),
99: prefix({"transform":"translateX(-8000px)"}),
100 : prefix({
"opacity":"0",
"transform":"translateX(-8000px)"
})
});
insertCSSAnimation(screenshotAnimName, {
0 : {"opacity":"0"},
100 : {}
});
insertCSSAnimation(inBlurAnimName, {
0 : prefix({
"opacity":"0",
"transform":"scale(.96)"
}),
100 : {"opacity":".7"}
});
insertCSSAnimation(outBlurAnimName, {
0 : {"opacity":".7"},
100 : {"opacity":"0"}
});
bg
.css(prefix("animation"), auroraAnimName + " 1.5s ease-out")
.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == auroraAnimName)
$root.css("background","#03092B");
});
for (var i=0; i < starsLength; i++)
stars[i].css(prefix({
"animation-name":starsAnimName,
"animation-timing-function":"linear",
"animation-iteration-count":"infinite"
}));
starsFront.css(prefix("animation-duration"), "420s");
starsMiddle.css(prefix("animation-duration"),"660s");
starsBack.css(prefix("animation-duration"), "840s");
screenshot.addClass(hiddenClass);
blur
.css(prefix({
"opacity":"0",
"animation":inBlurAnimName + " .4s ease-out 1.2s"
}))
.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == inBlurAnimName) {
blur
.css(prefix("animation"), outBlurAnimName + " 1s linear")
.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == outBlurAnimName) {
blur.addClass(hiddenClass);
$root.addClass(reactiveClass).click(outAnim);
}
});
screenshot
.css(prefix("animation"), screenshotAnimName + " .5s linear")
.removeClass(hiddenClass);
}
});
},
outAnim = function() {
var outGlobalAnimName = "outKickoffTodosGlobal",
outScreenshotAnimName = "outKickoffTodosScreenshot";
insertCSSAnimation(outGlobalAnimName, {
0 : {},
100 : {"opacity":"0"}
});
insertCSSAnimation(outScreenshotAnimName, {
0 : {},
100 : {"opacity":"0"}
});
kickoffTodos
.css(
prefix("animation"),
outGlobalAnimName + " 2.5s ease-out"
)
.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == outGlobalAnimName) {
kickoffTodos.removeClass(visibleClass);
thanks();
}
});
screenshot
.css(
prefix("animation"),
outScreenshotAnimName + " 2s cubic-bezier(.2,.5,.3,1)"
)
.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == outScreenshotAnimName)
screenshot.addClass(hiddenClass);
});
$root.css("background","#000").removeClass(reactiveClass);
};
inAnim();
$window.resize(function(){
resizeScreenshot(screenshot);
});
}
function thanks(){
var thanks = $works.eq(6),
inAnim = function(){
var gradient = $("<span/>", {"class":"gradient"}),
gradientAnimName = "inThanksGradient",
infoAnimName = "inThanksInfo",
copyright = thanks.children("p").eq(1),
lis = thanks.find("li"),
mail = lis.eq(0),
twitter = lis.eq(1),
info = [copyright,mail,twitter],
infoLength = info.length,
styleBrand = function() {
$root.css("background","#000");
logo.css({
"color":"#fff",
"text-shadow":"0 1px 0 #000"
});
baseline.css({
"color":"#777",
"text-shadow":"0 1px 0 #000"
});
},
showInfo = function() {
for (var j=0; j < infoLength; j++) {
info[j]
.css(
prefix("animation"),
infoAnimName + " 1.2s cubic-bezier(.2,.5,.3,1)"
)
.bind(animationEndEvent, function(e){
if(e.originalEvent.animationName == infoAnimName)
$(this).css("opacity",1);
});
};
mail.css(prefix("animation-delay"),".4s");
twitter.css(prefix("animation-delay"),".6s");
};
insertCSSAnimation(gradientAnimName, {
0 : prefix({
"opacity":"0",
"transform":"scale(1.5)"
}),
100 : {"opacity":"1"}
});
insertCSSAnimation(infoAnimName, {
0 : prefix({
"opacity":"0",
"transform":"translateY(15px)"
}),
100 : {"opacity":"1"}
});
gradient.css(
prefix("animation"),
gradientAnimName + " 2s cubic-bezier(.2,.5,.3,1)"
);
for (var i=0; i < infoLength; i++) {
info[i].css("opacity",0);
};
var animImages = thanks.children("p").eq(0).children("img"),
i = 0,
animImagesLength = animImages.length - 1,
thanksAnim = setInterval(function(){
animImages.eq(i).remove();
i++;
if(i == animImagesLength) {
clearInterval(thanksAnim);
showInfo();
}
}, 30);
thanks.prepend(gradient).addClass(visibleClass);
styleBrand();
};
inAnim();
}
function removeLoader(){
var $loader = $("#loader"),
animName = "removeLoader";
insertCSSAnimation(animName, {
0 : {},
10 : prefix({"transform":"scale(1.2)"}),
15 : prefix({"transform":"scale(1.2)"}),
100 : prefix({
"transform":"scale(.1)",
"opacity":"0"
})
});
$loader
.css(prefix("animation"), animName + " 1.5s cubic-bezier(.2,.6,.3,1)")
.bind(animationEndEvent, function(){
$loader.remove();
});
};
// Let the show begin
removeLoader();
personal32pxSet();
});