Skip to content

Instantly share code, notes, and snippets.

@sethkrasnianski
Created May 11, 2016 17:36
Show Gist options
  • Save sethkrasnianski/d249c2e3c0fdb9561206d843f002e3c7 to your computer and use it in GitHub Desktop.
Save sethkrasnianski/d249c2e3c0fdb9561206d843f002e3c7 to your computer and use it in GitHub Desktop.
eZXMRr
<div id="main-container"></div>
var intro_straplines = {
"long": [
"Good design is invisible",
"Starting complex means never ending",
"Courage is in shorter supply than genius",
],
"short": [
"Beauty in simplicity",
"Insatiable curiousity",
"Do it with love",
]
}
var helpers = function() {
function a(a, b, c, d) {
return Math.sqrt(Math.pow(c - a, 2) + Math.pow(d - b, 2))
}
function b(a) {
var b = void 0;
switch (a.type) {
case "polygon":
a.attributes.corners = a.attributes.corners || 3,
a.attributes.r = a.attributes.r || 100,
a.attributes.rotation = a.attributes.rotation || 0,
b = y(a.attributes.corners, a.attributes);
break;
case "circle":
case "rect":
b = x(a.type, a.attributes)
}
return b
}
function c(a) {
var b = [];
return helpers.each(a.split(" "), function(a) {
var c = a.split(",");
b.push([c[0], c[1]])
}),
b
}
function d(a, b, c, d, e) {
var f = 2 * Math.PI / d;
e.beginPath(),
e.moveTo(Math.cos(0 * f) * c + a, Math.sin(0 * f) * c + b);
for (var g = 0; d > g; g++) {
var h = Math.cos(f * g) * c + a
, i = Math.sin(f * g) * c + b;
e.lineTo(h, i)
}
e.closePath()
}
function e(a, b) {
var c = {
type: "circle",
attributes: {
x: 0,
y: 0,
r: 10,
lineWidth: 1,
strokeStyle: "none",
fillStyle: "none"
}
}
, d = helpers.extend(c, a);
"circle" == d.type && (b.beginPath(),
b.arc(d.attributes.x, d.attributes.y, d.attributes.r, 0, 2 * Math.PI),
b.fillStyle = d.fillStyle,
b.strokeStyle = d.fillStyle,
b.lineWidth = d.lineWidth,
b.fill(),
b.stroke())
}
function f(a) {
var b = a.toString(16);
return 1 == b.length ? "0" + b : b
}
function g(a, b, c) {
return "#" + f(a) + f(b) + f(c)
}
function h() {
var a, b, c, d, e, f = arguments[0] / 255, g = arguments[1] / 255, h = arguments[2] / 255, i = Math.max(f, g, h), j = i - Math.min(f, g, h), k = function(a) {
return (i - a) / 6 / j + .5
}
;
return 0 == j ? d = e = 0 : (e = j / i,
a = k(f),
b = k(g),
c = k(h),
f === i ? d = c - b : g === i ? d = 1 / 3 + a - c : h === i && (d = 2 / 3 + b - a),
0 > d ? d += 1 : d > 1 && (d -= 1)),
{
h: Math.round(360 * d),
s: Math.round(100 * e),
v: Math.round(100 * i)
}
}
function i(a, b, c) {
var d, e, f, g, h, i, j, k;
if (a = Math.max(0, Math.min(360, a)),
b = Math.max(0, Math.min(100, b)),
c = Math.max(0, Math.min(100, c)),
b /= 100,
c /= 100,
0 == b)
return d = e = f = c,
[Math.round(255 * d), Math.round(255 * e), Math.round(255 * f)];
switch (a /= 60,
g = Math.floor(a),
h = a - g,
i = c * (1 - b),
j = c * (1 - b * h),
k = c * (1 - b * (1 - h)),
g) {
case 0:
d = c,
e = k,
f = i;
break;
case 1:
d = j,
e = c,
f = i;
break;
case 2:
d = i,
e = c,
f = k;
break;
case 3:
d = i,
e = j,
f = c;
break;
case 4:
d = k,
e = i,
f = c;
break;
default:
d = c,
e = i,
f = j
}
return [Math.round(255 * d), Math.round(255 * e), Math.round(255 * f)]
}
var j = Array.prototype.slice
, k = Array.prototype.forEach
, l = (Array.prototype.indexOf,
Object.prototype.keys)
, m = Function.prototype
, n = m.bind
, o = {}
, p = function(a) {
return u(j.call(arguments, 1), function(b) {
for (var c in b)
a[c] = b[c]
}),
a
}
, q = function(a) {
var b = typeof a;
return "function" === b || "object" === b && !!a
}
, r = function(a, b) {
return hasOwnProperty.call(a, b)
}
, s = function(a) {
return null == a ? 0 : a.length === +a.length ? a.length : t(a).length
}
, t = function(a) {
if (!q(a))
return [];
if (l)
return l(a);
var b = [];
for (var c in a)
r(a, c) && b.push(c);
return b
}
, u = function(a, b, c) {
if (null != a)
if (k && a.forEach === k)
a.forEach(b, c);
else if (a.length === +a.length) {
for (var d = 0, e = a.length; e > d; d++)
if (d in a && b.call(c, a[d], d, a) === o)
return
} else
for (var f in a)
if (r(a, f) && b.call(c, a[f], f, a) === o)
return
}
, v = function(a, b) {
if (n && a.bind === n)
return n.apply(a, j.call(arguments, 1));
if (!_.isFunction(a))
throw TypeError("Bind must be called on a function");
var c = j.call(arguments, 2);
return function d() {
return executeBound(a, d, b, this, c.concat(j.call(arguments)))
}
}
, w = function(a, b, c, d, e) {
var f = c - b
, g = e - d
, h = a - b / f;
return d + h * g
}
, x = function(a, b) {
var c = document.createElementNS("http://www.w3.org/2000/svg", a);
for (attribute in b)
b.hasOwnProperty(attribute) && c.setAttributeNS(null , attribute, b[attribute]);
return c
}
, y = function(a, b) {
for (var c = document.createElementNS("http://www.w3.org/2000/svg", "polygon"), d = "", e = 2 * Math.PI / a, f = b.rotate ? b.rotate * (Math.PI / 180) : 0, g = 0; a > g; g++) {
var h = Math.cos(e * g + f) * b.r
, i = Math.sin(e * g + f) * b.r;
d += h + " " + i + " "
}
for (attribute in b)
b.hasOwnProperty(attribute) && "rotate" !== attribute && "r" !== attribute && "corners" !== attribute && c.setAttributeNS(null , attribute, b[attribute]);
return c.setAttributeNS(null , "points", d),
c
}
, z = function() {
function a(a) {
var e = [];
return a.replace(d, function(a, d, f) {
var g = d.toLowerCase();
for (f = b(f),
"m" == g && f.length > 2 && (e.push([d].concat(f.splice(0, 2))),
g = "l",
d = "m" == d ? "l" : "L"); ; ) {
if (f.length == c[g])
return f.unshift(d),
e.push(f);
if (f.length < c[g])
throw new Error("malformed path data");
e.push([d].concat(f.splice(0, c[g])))
}
}),
e
}
function b(a) {
return a = a.match(/-?[.0-9]+(?:e[-+]?\d+)?/gi),
a ? a.map(Number) : []
}
var c = {
a: 7,
c: 6,
h: 1,
l: 2,
m: 2,
q: 4,
s: 4,
t: 2,
v: 1,
z: 0
}
, d = /([astvzqmhlc])([^astvzqmhlc]*)/gi;
return a
}()
, A = function(a) {
var b = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(a);
return b ? {
r: parseInt(b[1], 16),
g: parseInt(b[2], 16),
b: parseInt(b[3], 16)
} : null
}
, B = function(a) {
var b = a.match(/\d+/g);
return b[0] = parseFloat(b[0]),
b[1] = parseFloat(b[1]),
b[2] = parseFloat(b[2]),
b
}
;
return {
extend: p,
each: u,
size: s,
map: w,
distance: a,
bind: v,
createShape: b,
createSvgShape: x,
createRegularPolygon: y,
parsePath: z,
parsePolygon: c,
createCanvasPolygon: d,
createCanvasShape: e,
hexToRgb: A,
rgbToHex: g,
rgbToHsv: h,
hsvToRgb: i,
arrayFromRGB: B
}
}()
, ticker = function() {
function a(a) {
helpers.each(a, function(a) {
e.push(setTimeout(a.do, a.time))
})
}
function b() {
helpers.each(e, function(a) {
window.clearTimeout(a)
})
}
function c() {
return {
addTicks: a,
clearTimeouts: b
}
}
var d, e = [];
return {
init: function() {
return d || (d = c()),
d
}
}
}()
, swarmIntro = function() {
function a(a, b) {
return Math.floor(Math.random() * (b - a + 1)) + a
}
var b = document.documentElement.clientHeight
, c = document.documentElement.clientWidth
, d = new Physics
, e = function(b, c, d) {
var e = this;
this.state = -1,
this.canvas = document.createElement("canvas"),
this.ctx = this.canvas.getContext("2d"),
this.tcanvas = document.createElement("canvas"),
this.tcanvas.id = "placeholder",
this.tctx = this.tcanvas.getContext("2d"),
this.logocanvas = document.createElement("canvas"),
this.logocanvas.id = "placeholder",
this.logoctx = this.logocanvas.getContext("2d"),
this.canvas.width = b,
this.canvas.height = c,
this.text = d.text,
window.setTimeout(function() {
e.state = 0
}, 800),
window.setTimeout(function() {
e.state = 1
}, 1e3),
window.setTimeout(function() {
e.state = 2
}, 1100),
window.setTimeout(function() {
this.frictionCoeff = 20,
e.state = 3,
e.mouse.moved || (e.mouse.position.x = b / 2 + a(-300, 300),
e.mouse.position.y = c / 2 + a(-300, 300))
}, 1900),
window.setTimeout(function() {
for (var a = e.particles.length - 1; a >= 0; a--)
e.particles[a].mass = Math.min(e.particles[a].mass, 200);
e.state = 4
}, 3400),
this.image = new Image;
var f = "/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAUAAA/+EDLWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwMTQgNzkuMTU2Nzk3LCAyMDE0LzA4LzIwLTA5OjUzOjAyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGQTg1REUwNDY3NzExMUU0OEZDQ0U5RTBFN0YwNkE5NiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGQTg1REUwMzY3NzExMUU0OEZDQ0U5RTBFN0YwNkE5NiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MEU1NjdDODMyODA2MTFFMjk0MzhCMTQ5MEJCRjNBMUYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MEU1NjdDODQyODA2MTFFMjk0MzhCMTQ5MEJCRjNBMUYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAACAgICAgICAgICAwICAgMEAwICAwQFBAQE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";
this.image.src = "data:image/jpg;base64," + encodeURIComponent(f),
this.image.width = 597,
this.image.height = 79,
this.tcanvas.width = b,
this.tcanvas.height = c,
this.frictionCoeff = 20,
this.image.onload = this.init.bind(this)
}
;
e.prototype = {
init: function() {
function e(b, c) {
b.mass = a(100, 700),
b.fillStyle = "rgb(" + c + "," + c + "," + c + ")"
}
var k = this;
app.container.appendChild(this.canvas),
this.mouse = new i,
window.addEventListener("mousemove", helpers.bind(this.mouse.move, this.mouse)),
window.addEventListener("resize", helpers.bind(this.onWindowResize, this)),
this.attractor = new g(c / 2,b / 2),
this.attractor.gravityConstant = 8,
this.attractor.mass = 10,
this.refractor = new h,
this.refractor.gravityConstant = 8,
this.refractor.mass = 80,
this.mouseAttractor = new g,
this.mouseAttractor.gravityConstant = 10,
this.mouseAttractor.mass = 20,
this.dynamicAttractor = new h,
this.dynamicAttractor.mass = 100,
this.dynamicAttractor.gravityConstant = 1,
this.particles = [],
this.imageParticles = [],
this.tctx.font = c >= breakpoints.tabletl ? "bold 50px brownbold" : "bold 30px brownbold",
this.tctx.fillStyle = "rgba(255, 255, 255, 1)",
this.tctx.fillRect(0, 0, c, b),
this.tctx.fillStyle = "black",
this.tctx.textAlign = "center",
this.tctx.fillText(this.text, c / 2, b / 2),
this.logocanvas.width = this.image.width,
this.logocanvas.height = this.image.height,
this.logoctx.fillStyle = "white",
this.logoctx.fillRect(0, 0, this.image.width, this.image.height),
k.logoctx.drawImage(k.image, 0, 0, k.image.width, k.image.height);
for (var l = this.logoctx.getImageData(0, 0, this.image.width, this.image.height), m = l.data, n = this.tctx.getImageData(0, 0, c, b), o = n.data, p = 0; p < o.length; p += 4)
if (255 != o[p]) {
var q = p / 4 % c + (c - c)
, r = p / 4 / c + (b - b)
, s = new f(q,r);
e(s, o[p]),
s.repelOrigin = new j(s.position.x + a(-10, 10),s.position.y + a(-10, 10)),
this.particles.push(s)
}
window.setTimeout(function() {
for (var d = 0, g = (m.length > this.particles.length ? m.length : this.particles.length,
0); g < m.length; g += 16)
if (255 != m[g]) {
var h = g / 4 % this.image.width + (c / 2 - this.image.width / 2)
, i = g / 4 / this.image.width + (b / 2 - this.image.height / 2);
if (this.imageParticles.push(new j(h,i)),
d < this.particles.length)
this.particles[d].originPosition = new j(h,i);
else {
var k = a(0, this.particles.length - 1)
, l = this.particles[k]
, n = new f(l.position.x,l.position.y);
n.repelOrigin = new j(l.position.x + a(-10, 10),l.position.y + a(-10, 10)),
n.originPosition = new j(h,i),
e(n, 0),
this.particles.push(n)
}
d++
}
for (var g = 0; g < this.particles.length; g += 1)
if ("undefined" == typeof this.particles[g].originPosition) {
var k = a(0, this.imageParticles.length - 1)
, l = this.imageParticles[k];
this.particles[g].originPosition = new j(l.x,l.y)
}
}
.bind(this), 800),
this.center = new j(c / 2,b / 2 - 10),
d.onUpdate(helpers.bind(this.render, this)),
d.play()
},
render: function() {
var a = this;
this.ctx.clearRect(0, 0, c, b),
this.mouseAttractor.position = this.mouse.position,
this.particles.forEach(function(b) {
0 === a.state ? b.applyForce(a.attractor.attract(b)) : 1 === a.state ? b.applyForce(a.refractor.repel(b, a.center)) : 3 === a.state ? b.applyForce(a.mouseAttractor.attract(b)) : 4 === a.state && b.applyForce(a.dynamicAttractor.attract(b, b.originPosition));
var c = b.velocity.clone();
c.multiply(-1),
c.multiply(a.frictionCoeff),
b.applyForce(c),
b.update(a.ctx)
})
},
destroy: function() {
d.clear(),
d.pause(),
d.removeOnUpdate(this.render),
this.particles = [],
window.removeEventListener("resize", this.onWindowResize)
},
onWindowResize: function() {
b = document.documentElement.clientHeight,
c = document.documentElement.clientWidth,
this.canvas.width = c,
this.canvas.height = b
}
};
var f = function(a, b) {
this.position = new j(a,b),
this.velocity = new j,
this.acceleration = new j,
this.mass = 10.9,
this.size = 1,
this.fillStyle = "#fff"
}
;
f.prototype = {
applyForce: function(a) {
this.acceleration.add(a.divide(this.mass))
},
update: function(a) {
this.velocity.add(this.acceleration),
this.position.add(this.velocity),
this.draw(a),
this.acceleration.multiply(0)
},
draw: function(a) {
a.fillStyle = this.fillStyle,
a.fillRect(this.position.x, this.position.y, this.size, this.size)
}
};
var g = function(a, b) {
this.position = new j(a,b),
this.mass = 20,
this.gravityConstant = .01
}
;
g.prototype = {
attract: function(a, b) {
b = b || 1;
var c = this.position.clone().subtract(a.position)
, d = c.length();
d = Math.max(5, Math.min(10, d)),
c.normalize();
var e = b * this.gravityConstant * this.mass * a.mass / (d * d);
return c.multiply(e),
c
},
repel: function(a) {
return this.attract(a, -1)
},
draw: function(a) {
a.beginPath(),
a.fillStyle = "rgba(0, 0, 0, 0.6)",
a.arc(this.position.x, this.position.y, this.mass, 0, 2 * Math.PI, !0),
a.fill()
}
};
var h = function() {
this.mass = 20,
this.gravityConstant = 1.01
}
;
h.prototype = {
attract: function(a, b, c) {
c = c || 1;
var d = b.clone().subtract(a.position)
, e = d.length();
e = Math.max(5, Math.min(10, e)),
d.normalize();
var f = c * this.gravityConstant * this.mass * a.mass / (e * e);
return d.multiply(f),
d
},
repel: function(a, b) {
return this.attract(a, b, -1)
}
};
var i = function() {
this.x = 0,
this.y = 0,
this.position = new j(this.x,this.y),
this.oldX = 0,
this.oldY = 0,
this.moved = !1
}
;
i.prototype = {
move: function(a) {
this.moved = !0,
this.oldX = this.position.x,
this.oldY = this.position.y,
this.position.x = a.pageX,
this.position.y = a.pageY
}
};
var j = function(a, b) {
this.x = a || 0,
this.y = b || 0
}
;
return j.prototype = {
invert: function() {
return this.x = -this.x,
this.y = -this.y,
this
},
add: function(a) {
return this.x += a.x,
this.y += a.y,
this
},
subtract: function(a) {
return this.x -= a.x,
this.y -= a.y,
this
},
multiply: function(a) {
return this.x *= a,
this.y *= a,
this
},
divide: function(a) {
return this.x /= a,
this.y /= a,
this
},
normalize: function() {
return this.divide(this.length())
},
equals: function(a) {
return this.x == a.x && this.y == a.y
},
length: function(a) {
return void 0 === a ? Math.sqrt(this.x * this.x + this.y * this.y) : (this.x = Math.cos(this.angle) * a,
this.y = Math.sin(this.angle) * a,
this)
},
angle: function() {
return Math.atan2(this.y, this.x)
},
clone: function() {
return new j(this.x,this.y)
},
set: function(a, b) {
return this.x = a,
this.y = b,
this
}
},
{
init: function(a) {
this.stage = new e(c,b,a)
},
destroy: function() {
this.stage.destroy()
}
}
}
;
!function() {
{
var a = this;
a.Physics
}
common = function() {
var a = {}
, b = Array.prototype
, c = Object.prototype
, d = c.hasOwnProperty
, e = b.slice
, f = b.forEach
, g = b.indexOf
, h = c.toString
, i = function(a, b) {
return d.call(a, b)
}
, j = function(b, c, d) {
if (null != b)
if (f && b.forEach === f)
b.forEach(c, d);
else if (b.length === +b.length) {
for (var e = 0, g = b.length; g > e; e++)
if (e in b && c.call(d, b[e], e, b) === a)
return
} else
for (var h in b)
if (_.has(b, h) && c.call(d, b[h], h, b) === a)
return
}
, k = function(a) {
return a
}
, l = function(a, b, c) {
c || (c = k);
for (var d = 0, e = a.length; e > d; ) {
var f = d + e >> 1;
c(a[f]) < c(b) ? d = f + 1 : e = f
}
return d
}
;
return {
has: i,
each: j,
extend: function(a) {
return j(e.call(arguments, 1), function(b) {
for (var c in b)
a[c] = b[c]
}),
a
},
indexOf: function(a, b, c) {
if (null == a)
return -1;
var d, e;
if (c)
return d = l(a, b),
a[d] === b ? d : -1;
if (g && a.indexOf === g)
return a.indexOf(b);
for (d = 0,
e = a.length; e > d; d++)
if (d in a && a[d] === b)
return d;
return -1
},
sortedIndex: l,
identity: k,
isNumber: function(a) {
return "[object Number]" == h.call(a)
},
isFunction: function(a) {
return "[object Function]" == h.call(a) || "function" == typeof a
},
isUndefined: function(a) {
return void 0 === a
},
isNull: function(a) {
return null === a
}
}
}(),
Vector = function(a) {
var b = function(a, b) {
this.x = a || 0,
this.y = b || 0
}
;
return a.extend(b.prototype, {
set: function(a, b) {
return this.x = a,
this.y = b,
this
},
copy: function(a) {
return this.x = a.x,
this.y = a.y,
this
},
clear: function() {
return this.x = 0,
this.y = 0,
this
},
clone: function() {
return new b(this.x,this.y)
},
add: function(a, b) {
return this.x = a.x + b.x,
this.y = a.y + b.y,
this
},
addSelf: function(a) {
return this.x += a.x,
this.y += a.y,
this
},
sub: function(a, b) {
return this.x = a.x - b.x,
this.y = a.y - b.y,
this
},
subSelf: function(a) {
return this.x -= a.x,
this.y -= a.y,
this
},
multiplySelf: function(a) {
return this.x *= a.x,
this.y *= a.y,
this
},
multiplyScalar: function(a) {
return this.x *= a,
this.y *= a,
this
},
divideScalar: function(a) {
return a ? (this.x /= a,
this.y /= a) : this.set(0, 0),
this
},
negate: function() {
return this.multiplyScalar(-1)
},
dot: function(a) {
return this.x * a.x + this.y * a.y
},
lengthSquared: function() {
return this.x * this.x + this.y * this.y
},
length: function() {
return Math.sqrt(this.lengthSquared())
},
normalize: function() {
return this.divideScalar(this.length())
},
distanceTo: function(a) {
return Math.sqrt(this.distanceToSquared(a))
},
distanceToSquared: function(a) {
var b = this.x - a.x
, c = this.y - a.y;
return b * b + c * c
},
setLength: function(a) {
return this.normalize().multiplyScalar(a)
},
equals: function(a) {
return this.distanceTo(a) < 1e-4
},
lerp: function(a, b) {
var c = (a.x - this.x) * b + this.x
, d = (a.y - this.y) * b + this.y;
return this.set(c, d)
},
isZero: function() {
return this.length() < 1e-4
}
}),
b
}(common),
a.Physics = Physics = function(a, b, c) {
function d() {
var a = this;
this.tick(),
c.each(this.animations, function(a) {
a()
}),
(this.__optimized && !this.__equilibrium || !this.__optimized) && this.playing && b(function() {
d.call(a)
}),
this.__optimized && this.__equilibrium && c.each(this.equilibriumCallbacks, function(a) {
a()
})
}
var e = function() {
this.playing = !1,
a.apply(this, arguments),
this.animations = [],
this.equilibriumCallbacks = [],
d.call(this)
}
;
return c.extend(e, a, {
superclass: a
}),
c.extend(e.prototype, a.prototype, {
play: function() {
return this.playing ? this : (this.playing = !0,
this.__equilibrium = !1,
d.call(this),
this)
},
pause: function() {
return this.playing = !1,
this
},
toggle: function() {
return this.playing ? this.pause() : this.play(),
this
},
onUpdate: function(a) {
return c.indexOf(this.animations, a) >= 0 || !c.isFunction(a) ? this : (this.animations.push(a),
this)
},
removeOnUpdate: function(a) {
var b = c.indexOf(this.animations, a);
return -1 != b && c.isFunction(a) ? (this.animations.splice(b, 1),
this) : this
},
onEquilibrium: function(a) {
return c.indexOf(this.equilibriumCallbacks, a) >= 0 || !c.isFunction(a) ? this : (this.equilibriumCallbacks.push(a),
this)
},
update: function() {
return this.__equilibrium ? (this.__equilibrium = !1,
this.playing && d.call(this),
this) : this
}
}),
e
}(ParticleSystem = function(a, b, c, d, e, f) {
var g = function() {
this.__equilibriumCriteria = {
particles: !0,
springs: !0,
attractions: !0
},
this.__equilibrium = !1,
this.__optimized = !1,
this.particles = [],
this.springs = [],
this.attractions = [],
this.forces = [],
this.integrator = new e(this),
this.hasDeadParticles = !1;
var b = arguments.length;
1 === b ? (this.gravity = new a(0,arguments[0]),
this.drag = g.DEFAULT_DRAG) : 2 === b ? (this.gravity = new a(0,arguments[0]),
this.drag = arguments[1]) : 3 === b ? (this.gravity = new a(arguments[0],arguments[1]),
this.drag = arguments[3]) : (this.gravity = new a(0,g.DEFAULT_GRAVITY),
this.drag = g.DEFAULT_DRAG)
}
;
return f.extend(g, {
DEFAULT_GRAVITY: 0,
DEFAULT_DRAG: .001,
Attraction: d,
Integrator: e,
Particle: b,
Spring: c,
Vector: a
}),
f.extend(g.prototype, {
optimize: function(a) {
return this.__optimized = !!a,
this
},
setGravity: function(a, b) {
return this.gravity.set(a, b),
this
},
setEquilibriumCriteria: function(a, b, c) {
this.__equilibriumCriteria.particles = !!a,
this.__equilibriumCriteria.springs = !!b,
this.__equilibriumCriteria.attractions = !!c
},
tick: function() {
return this.integrator.step(0 === arguments.length ? 1 : arguments[0]),
this.__optimized && (this.__equilibrium = !this.needsUpdate()),
this
},
needsUpdate: function() {
var a = 0;
if (this.__equilibriumCriteria.particles)
for (a = 0,
l = this.particles.length; l > a; a++)
if (!this.particles[a].resting())
return !0;
if (this.__equilibriumCriteria.springs)
for (a = 0,
l = this.springs.length; l > a; a++)
if (!this.springs[a].resting())
return !0;
if (this.__equilibriumCriteria.attractions)
for (a = 0,
l = this.attractions.length; l > a; a++)
if (!this.attractions[a].resting())
return !0;
return !1
},
addParticle: function(a) {
return this.particles.push(a),
this
},
addSpring: function(a) {
return this.springs.push(a),
this
},
addAttraction: function(a) {
return this.attractions.push(a),
this
},
makeParticle: function(a, c, d) {
var e = f.isNumber(a) ? a : 1
, c = c || 0
, d = d || 0
, g = new b(e);
return g.position.set(c, d),
this.addParticle(g),
g
},
makeSpring: function(a, b, d, e, f) {
var g = new c(a,b,d,e,f);
return this.addSpring(g),
g
},
makeAttraction: function(a, b, c, e) {
var a = new d(a,b,c,e);
return this.addAttraction(a),
a
},
clear: function() {
this.particles.length = 0,
this.springs.length = 0,
this.attractions.length = 0
},
applyForces: function() {
this.gravity.isZero() || f.each(this.particles, function(a) {
a.force.addSelf(this.gravity)
}, this);
var b = new a;
return f.each(this.particles, function(a) {
b.set(-1 * a.velocity.x * this.drag, -1 * a.velocity.y * this.drag),
a.force.addSelf(b)
}, this),
f.each(this.springs, function(a) {
a.update()
}),
f.each(this.attractions, function(a) {
a.update()
}),
f.each(this.forces, function(a) {
a.update()
}),
this
},
clearForces: function() {
return f.each(this.particles, function(a) {
a.clear()
}),
this
}
}),
g
}(Vector, Particle = function(a, b) {
var c = function(b) {
this.position = new a,
this.velocity = new a,
this.force = new a,
this.mass = b,
this.fixed = !1,
this.age = 0,
this.dead = !1
}
;
return b.extend(c.prototype, {
distanceTo: function(a) {
return this.position.distanceTo(a.position)
},
makeFixed: function() {
return this.fixed = !0,
this.velocity.clear(),
this
},
reset: function() {
return this.age = 0,
this.dead = !1,
this.position.clear(),
this.velocity.clear(),
this.force.clear(),
this.mass = 1,
this
},
resting: function() {
return this.fixed || this.velocity.isZero() && this.force.isZero()
}
}),
c
}(Vector, common), Spring = function(a, b) {
var c = function(a, b, c, d, e) {
this.constant = c,
this.damping = d,
this.length = e,
this.a = a,
this.b = b,
this.on = !0
}
;
return b.extend(c.prototype, {
currentLength: function() {
return this.a.position.distanceTo(this.b.position)
},
update: function() {
var b = this.a
, c = this.b;
if (!this.on || b.fixed && c.fixed)
return this;
var d = (new a).sub(b.position, c.position)
, e = d.length();
0 === e ? d.clear() : d.divideScalar(e);
var f = -1 * (e - this.length) * this.constant
, g = (new a).sub(b.velocity, c.velocity)
, h = -1 * this.damping * g.dot(d)
, i = f + h;
return d.multiplyScalar(i),
b.fixed || b.force.addSelf(d),
c.fixed || c.force.subSelf(d),
this
},
resting: function() {
var a = this.a
, b = this.b
, c = this.length;
return !this.on || a.fixed && b.fixed || a.fixed && (0 === c ? b.position.equals(a.position) : b.position.distanceTo(a.position) <= c) && b.resting() || b.fixed && (0 === c ? a.position.equals(b.position) : a.position.distanceTo(b.position) <= c) && a.resting()
}
}),
c
}(Vector, common), Attraction = function(a, b) {
var c = function(a, b, c, d) {
this.a = a,
this.b = b,
this.constant = c,
this.on = !0,
this.distanceMin = d,
this.distanceMinSquared = d * d
}
;
return b.extend(c.prototype, {
update: function() {
var b = this.a
, c = this.b;
if (!(!this.on || b.fixed && c.fixed)) {
var d = (b.position.x - c.position.x,
b.position.y - c.position.y,
(new a).sub(b.position, c.position))
, e = Math.max(d.lengthSquared(), this.distanceMinSquared)
, f = this.constant * b.mass * c.mass / e
, g = Math.sqrt(e);
return 0 === f || 0 === g ? d.clear() : d.divideScalar(g).multiplyScalar(f),
b.fixed || b.force.subSelf(d),
c.fixed || c.force.addSelf(d),
this
}
},
resting: function() {
var a = this.a
, b = this.b
, c = this.distanceMin;
return !this.on || a.fixed && b.fixed || a.fixed && b.position.distanceTo(a.position) <= c && b.resting() || b.fixed && a.position.distanceTo(b.position) <= c && a.resting()
}
}),
c
}(Vector, common), Integrator = function(a, b) {
var c = function(a) {
this.s = a,
this.originalPositions = [],
this.originalVelocities = [],
this.k1Forces = [],
this.k1Velocities = [],
this.k2Forces = [],
this.k2Velocities = [],
this.k3Forces = [],
this.k3Velocities = [],
this.k4Forces = [],
this.k4Velocities = []
}
;
return b.extend(c.prototype, {
allocateParticles: function() {
for (; this.s.particles.length > this.originalPositions.length; )
this.originalPositions.push(new a),
this.originalVelocities.push(new a),
this.k1Forces.push(new a),
this.k1Velocities.push(new a),
this.k2Forces.push(new a),
this.k2Velocities.push(new a),
this.k3Forces.push(new a),
this.k3Velocities.push(new a),
this.k4Forces.push(new a),
this.k4Velocities.push(new a);
return this
},
step: function(a) {
var c, d, e = this.s;
return this.allocateParticles(),
b.each(e.particles, function(a, b) {
a.fixed || (this.originalPositions[b].copy(a.position),
this.originalVelocities[b].copy(a.velocity)),
a.force.clear()
}, this),
e.applyForces(),
b.each(e.particles, function(a, b) {
a.fixed || (this.k1Forces[b].copy(a.force),
this.k1Velocities[b].copy(a.velocity)),
a.force.clear()
}, this),
b.each(e.particles, function(b, e) {
if (!b.fixed) {
var f = this.originalPositions[e]
, g = this.k1Velocities[e];
c = f.x + .5 * g.x * a,
d = f.y + .5 * g.y * a,
b.position.set(c, d);
var h = this.originalVelocities[e]
, i = this.k1Forces[e];
c = h.x + .5 * i.x * a / b.mass,
d = h.y + .5 * i.y * a / b.mass,
b.velocity.set(c, d)
}
}, this),
e.applyForces(),
b.each(e.particles, function(a, b) {
a.fixed || (this.k2Forces[b].copy(a.force),
this.k2Velocities[b].copy(a.velocity)),
a.force.clear()
}, this),
b.each(e.particles, function(b, c) {
if (!b.fixed) {
var d = this.originalPositions[c]
, e = this.k2Velocities[c];
b.position.set(d.x + .5 * e.x * a, d.y + .5 * e.y * a);
var f = this.originalVelocities[c]
, g = this.k2Forces[c];
b.velocity.set(f.x + .5 * g.x * a / b.mass, f.y + .5 * g.y * a / b.mass)
}
}, this),
e.applyForces(),
b.each(e.particles, function(a, b) {
a.fixed || (this.k3Forces[b].copy(a.force),
this.k3Velocities[b].copy(a.velocity)),
a.force.clear()
}, this),
b.each(e.particles, function(b, c) {
if (!b.fixed) {
var d = this.originalPositions[c]
, e = this.k3Velocities[c];
b.position.set(d.x + e.x * a, d.y + e.y * a);
var f = this.originalVelocities[c]
, g = this.k3Forces[c];
b.velocity.set(f.x + g.x * a / b.mass, f.y + g.y * a / b.mass)
}
}, this),
e.applyForces(),
b.each(e.particles, function(a, b) {
a.fixed || (this.k4Forces[b].copy(a.force),
this.k4Velocities[b].copy(a.velocity))
}, this),
b.each(e.particles, function(b, c) {
if (b.age += a,
!b.fixed) {
var d = this.originalPositions[c]
, e = this.k1Velocities[c]
, f = this.k2Velocities[c]
, g = this.k3Velocities[c]
, h = this.k4Velocities[c]
, i = d.x + a / 6 * (e.x + 2 * f.x + 2 * g.x + h.x)
, j = d.y + a / 6 * (e.y + 2 * f.y + 2 * g.y + h.y);
b.position.set(i, j);
var k = this.originalVelocities[c]
, l = this.k1Forces[c]
, m = this.k2Forces[c]
, n = this.k3Forces[c]
, o = this.k4Forces[c];
i = k.x + a / (6 * b.mass) * (l.x + 2 * m.x + 2 * n.x + o.x),
j = k.y + a / (6 * b.mass) * (l.y + 2 * m.y + 2 * n.y + o.y),
b.velocity.set(i, j)
}
}, this),
this
}
}),
c
}(Vector, common), common), requestAnimationFrame = function() {
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(a) {
window.setTimeout(a, 1e3 / 60)
}
}(), common)
}();
var Blob = function(a, b, c) {
var d = {
x: 0,
y: 0,
w: 10,
mass: 1e4,
color1: [255, 0, 0],
color2: [255, 0, 255],
fadeInFrames: 20,
maxDistance: 100 * app.scale,
renderCallback: function() {}
};
this.config = helpers.extend(d, a),
this.physics = b,
this.others = c,
this.index = c.length,
this.closest = [],
this.closestIndexes = [],
this.closestIdCounter = 0,
this.x = this.config.x,
this.y = this.config.y,
this.init()
}
;
Blob.prototype = {
init: function() {
this.particle = this.physics.makeParticle(this.config.mass, this.config.x, this.config.y),
this.colorsHsv1 = helpers.rgbToHsv(this.config.color1[0], this.config.color1[1], this.config.color1[2]),
this.colorsHsv2 = helpers.rgbToHsv(this.config.color2[0], this.config.color2[1], this.config.color2[2])
},
update: function() {
var a = this
, b = this.x = this.particle.position.x
, c = this.y = this.particle.position.y;
if (b < window.innerWidth * app.scale + 100 && c < window.innerHeight * app.scale + 100 && b > -100 && c > -100) {
var d = []
, e = []
, f = new Array(this.closest.length);
helpers.each(this.others, function(b, c) {
if (a.index > c) {
var g = helpers.distance(a.x, a.y, b.x, b.y)
, h = a.closestIndexes.indexOf(c);
g < a.config.maxDistance ? -1 !== h ? (a.closest[h].fade++,
a.closest[h].fade++ > 20 && (a.closest[h].fade = 20),
a.closest[h].x = b.x,
a.closest[h].y = b.y,
f[h] = !0) : (a.closestIdCounter = (a.closestIdCounter + 1) % a.others.length,
d.push({
x: a.x,
y: a.y,
fade: 0,
id: a.closestIdCounter,
dist: g
}),
e.push(c)) : -1 !== h && (a.closest[h].fade--,
a.closest[h].x = b.x,
a.closest[h].y = b.y,
f[h] = !1)
}
});
for (var g = 0; g < this.closest.length; g++)
!f[g] && this.closest[g].fade <= 0 && (a.closest.splice(g, 1),
a.closestIndexes.splice(g, 1));
this.closest = this.closest.concat(d),
this.closestIndexes = this.closestIndexes.concat(e);
var h = Math.sqrt(Math.pow(window.innerWidth, 2) + Math.pow(window.innerHeight, 2))
, i = Math.sqrt(Math.pow(b, 2) + Math.pow(c, 2))
, j = i / h
, k = helpers.map(j, 0, 1, this.colorsHsv1.h, this.colorsHsv2.h)
, l = helpers.map(j, 0, 1, this.colorsHsv1.s, this.colorsHsv2.s)
, m = helpers.map(j, 0, 1, this.colorsHsv1.v, this.colorsHsv2.v)
, n = helpers.hsvToRgb(k, l, m)
, o = helpers.rgbToHex(n[0], n[1], n[2]);
this.config.renderCallback(b, c, this.config.w, o)
}
}
};
var particles = function(a) {
function b() {
return s = document.createElement("canvas"),
s.setAttribute("id", "canvas"),
t = s.getContext("2d"),
{
run: c,
setSprings: e,
releaseSprings: f,
makeItRain: g,
repulse: i,
explode: h,
destroy: k
}
}
function c(b) {
b = b || {},
app.container.appendChild(s);
var c = Math.floor(Math.random() * B.length);
w = B[c],
q = {
interactive: !1,
delaunay: !1,
gradient: !0,
springs: !0,
attraction: !0,
connections: !1,
baseRadius: 8 * app.scale,
baseMass: 7e3 * app.scale,
lineWidth: 1.5 * app.scale,
baseSpringDamping: 80 * app.scale,
baseSpringRest: 850 * app.scale,
baseSpringStrength: 1.7 * app.scale,
baseAttractionStrength: .5 * app.scale,
baseDistanceMin: 100 * app.scale,
gravityX: 0 * app.scale,
gravityY: 0 * app.scale
},
p = helpers.extend(q, b),
u = new Physics,
u.gravity = new Physics.Vector(p.gravityX,p.gravityY),
o();
var e = 0
, f = a.setInterval(function() {
for (var b = 0; 20 > b; b++)
x > e && (d(),
e++);
e >= x && (p.interactive && n(),
a.clearInterval(f))
}, 100);
j(),
u.onUpdate(l),
u.play()
}
function d() {
var a, b = s.width / 2 + (500 * Math.random() - 250), c = s.height / 2 + (500 * Math.random() - 250), d = Math.random() * p.baseMass / 2 + p.baseMass / 2, e = Math.random() * p.baseRadius / 2 + p.baseRadius / 2, f = Math.floor(Math.random() * A.length), g = A[f], h = new Blob({
x: b,
y: c,
w: e,
maxDistance: 80 * app.scale,
mass: d,
color1: w[0],
color2: w[1],
renderCallback: g.render
},u,y);
y.push(h),
a = y.indexOf(h),
p.springs && helpers.each(u.particles, function(b, c) {
if (a > c) {
u.makeSpring(h.particle, b, p.baseSpringStrength, p.baseSpringDamping, p.baseSpringRest)
}
})
}
function e(a) {
a.constant = a.constant * app.scale || p.baseSpringStrength,
a.damping = a.damping * app.scale || p.baseSpringDamping,
a.rest = a.rest * app.scale || p.baseSpringRest,
helpers.each(u.springs, function(b) {
b.constant = a.constant,
b.damping = a.damping,
b.length = a.rest
})
}
function f() {
helpers.each(u.springs, function(a) {
a.on = !1
})
}
function g() {
u.setGravity(0, 2800 * app.scale),
helpers.each(u.springs, function(a) {
a.on = !1
})
}
function h() {
var b = u.makeParticle(1e4, a.innerWidth / 2 * app.scale, a.innerHeight / 2 * app.scale + 150);
helpers.each(u.particles, function(a) {
u.makeAttraction(b, a, -10 * app.scale, 50 * app.scale)
}),
helpers.each(u.springs, function(a) {
a.on = !1
}),
b.fixed = !0
}
function i() {
helpers.each(u.springs, function(a) {
a.on = !1
}),
helpers.each(z, function(a) {
a.constant = -10 * app.scale
})
}
function j() {
a.addEventListener("resize", o)
}
function k() {
u.clear(),
u.pause(),
u.removeOnUpdate(l),
u.setGravity(0, 0),
y = [],
a.removeEventListener("resize", o)
}
function l() {
t.clearRect(0, 0, s.width, s.height),
p.connections && m();
for (var a = 0; a < y.length; a++)
y[a].update()
}
function m() {
helpers.each(y, function(a) {
helpers.each(a.closest, function(b) {
var c = b.fade / 20
, d = (b.x - a.x) * c + a.x
, e = (b.y - a.y) * c + a.y;
t.beginPath(),
t.moveTo(a.x, a.y),
t.lineTo(d, e);
var f = b.fade / 20;
t.strokeStyle = "rgba(120, 120, 120," + f + ")",
t.lineWidth = b.fade / 100,
t.stroke()
})
})
}
function n() {
var a = 1 * app.scale;
v = new Blob({
maxDistance: 100 * app.scale,
x: s.width / 2 - 200,
y: s.height / 2 - 200,
mass: 1e4 * app.scale
},u,y),
v.particle.fixed = !0,
helpers.each(u.particles, function(b) {
var c = u.makeAttraction(v.particle, b, a, 50 * app.scale);
z.push(c)
}),
y.push(v),
s.addEventListener("mousemove", function(a) {
v.particle.position.x = a.x * app.scale,
v.particle.position.y = a.y * app.scale
})
}
function o() {
var b = a.innerWidth
, c = a.innerHeight;
s.width = b,
s.height = c,
a.devicePixelRatio > 1 && (s.width = 2 * b,
s.height = 2 * c)
}
var p, q, r, s, t, u, v, w, x = 150, y = [], z = [], A = [{
type: "circle",
render: function(a, b, c, d) {
t.beginPath(),
t.arc(a, b, c, 0, 2 * Math.PI),
t.strokeStyle = d,
t.fillStyle = "rgba(0,0,0,0)",
t.lineWidth = p.lineWidth,
t.fill(),
t.stroke()
}
}, {
type: "rect",
render: function(a, b, c, d) {
t.beginPath(),
t.rect(a, b, c, c),
t.strokeStyle = d,
t.fillStyle = "rgba(0,0,0,0)",
t.lineWidth = p.lineWidth,
t.fill(),
t.stroke()
}
}, {
type: "triangle",
render: function(a, b, c, d) {
helpers.createCanvasPolygon(a, b, c, 3, t),
t.strokeStyle = d,
t.fillStyle = "rgba(0,0,0,0)",
t.lineWidth = p.lineWidth,
t.fill(),
t.stroke()
}
}, {
type: "hexagon",
render: function(a, b, c, d) {
helpers.createCanvasPolygon(a, b, c, 6, t),
t.strokeStyle = d,
t.fillStyle = "rgba(0,0,0,0)",
t.lineWidth = p.lineWidth,
t.fill(),
t.stroke()
}
}, {
type: "octagon",
render: function(a, b, c, d) {
helpers.createCanvasPolygon(a, b, c, 8, t),
t.strokeStyle = d,
t.fillStyle = "rgba(0,0,0,0)",
t.lineWidth = p.lineWidth,
t.fill(),
t.stroke()
}
}], B = [[[62, 143, 255], [91, 19, 255]], [[24, 85, 238], [0, 185, 238]], [[253, 239, 21], [255, 93, 21]], [[224, 36, 58], [250, 93, 226]], [[81, 219, 152], [132, 234, 22]], [[255, 0, 0], [0, 0, 255]]];
return {
init: function() {
return r || (r = b()),
r
}
}
}(window)
, p = function() {
function a() {
this.ticker.addTicks(mode)
}
function b() {
mode != modes[3] ? (this.particles.destroy(),
this.ticker.clearTimeouts()) : app.swarmIntro.destroy()
}
function c() {
return e = particles.init(),
f = ticker.init(),
{
run: a,
reset: b,
ticker: f,
particles: e,
scale: g,
container: h
}
}
var d, e, f, g = window.devicePixelRatio > 1 ? 2 : 1, h = $("#main-container")[0], i = $("<h2></h2>"), j = intro_straplines.long.concat(intro_straplines.short);
return strapline = j[Math.floor(Math.random() * j.length)],
modes = [[{
time: 0,
"do": function() {
e.run({
gradient: !0
}),
i.addClass("intro__strap"),
i.addClass("intro__strap--hidden"),
i.html(strapline),
$(h).append(i)
}
}, {
time: 100,
"do": function() {
i.removeClass("intro__strap--hidden")
}
}, {
time: 2560,
"do": function() {
e.setSprings({
rest: -1800
})
}
}, {
time: 2720,
"do": function() {
e.setSprings({
rest: 100
})
}
}, {
time: 3200,
"do": function() {
e.setSprings({
rest: 3e3
})
}
}, {
time: 3280,
"do": function() {
i.addClass("intro__strap--out"),
e.explode()
}
}, {
time: 3840,
"do": function() {
$("body").trigger("closeintro"),
setTimeout(function() {
app.reset()
}, 2e3)
}
}], [{
time: 0,
"do": function() {
e.run({
baseSpringStrength: 8
}),
i.addClass("intro__strap"),
i.addClass("intro__strap--hidden"),
i.html(strapline),
$(h).append(i)
}
}, {
time: 100,
"do": function() {
i.removeClass("intro__strap--hidden")
}
}, {
time: 2e3,
"do": function() {
e.makeItRain()
}
}, {
time: 2500,
"do": function() {
i.addClass("intro__strap--down")
}
}, {
time: 3300,
"do": function() {
$("body").trigger("closeintro"),
setTimeout(function() {
app.reset()
}, 2e3)
}
}], [{
time: 0,
"do": function() {
e.run({
interactive: !0,
baseSpringStrength: 2.5 * app.scale,
baseSpringRest: 800 * app.scale,
connections: !0,
baseRadius: 4 * app.scale
}),
i.addClass("intro__strap"),
i.addClass("intro__strap--hidden"),
i.html(strapline),
$(h).append(i)
}
}, {
time: 100,
"do": function() {
i.removeClass("intro__strap--hidden")
}
}, {
time: 1500,
"do": function() {
e.setSprings({
strength: .8
})
}
}, {
time: 1800,
"do": function() {
e.setSprings({
strength: 0
})
}
}, {
time: 4500,
"do": function() {
i.addClass("intro__strap--out"),
e.repulse()
}
}, {
time: 5400,
"do": function() {
$("body").trigger("closeintro"),
setTimeout(function() {
app.reset()
}, 2e3)
}
}], [{
time: 0,
"do": function() {
j = intro_straplines.short,
strapline = j[Math.floor(Math.random() * j.length)],
WebFont.load({
custom: {
families: ["brownbold"]
},
active: function() {
app.swarmIntro = swarmIntro(),
app.swarmIntro.init({
text: strapline
})
}
})
}
}, {
time: 6900,
"do": function() {
$("body").trigger("closeintro"),
setTimeout(function() {
app.reset()
}, 2e3)
}
}]],
mode = modes[Math.floor(Math.random() * modes.length)],
{
init: function() {
return d || (d = c()),
d
}
}
}();
(function() {
function a() {
window.app = p.init()
app.run()
}
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment