var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
var selectSVG = function selectSVG(id) {
|
var el = document.getElementById(id);
|
return new SVGElement(el);
|
};
|
|
var createSVG = function createSVG(type) {
|
var el = document.createElementNS('http://www.w3.org/2000/svg', type);
|
return new SVGElement(el);
|
};
|
|
var SVGElement = function () {
|
function SVGElement(element) {
|
_classCallCheck(this, SVGElement);
|
|
this.element = element;
|
}
|
|
_createClass(SVGElement, [{
|
key: 'set',
|
value: function set(attributeName, value) {
|
// this.element.setAttribute(attributeName, value);
|
}
|
}, {
|
key: 'style',
|
value: function style(property, value) {
|
this.element.style[property] = value;
|
}
|
}]);
|
|
return SVGElement;
|
}();
|
|
var colors = [{ main: '#FBDB4A', shades: ['#FAE073', '#FCE790', '#FADD65', '#E4C650'] }, { main: '#F3934A', shades: ['#F7B989', '#F9CDAA', '#DD8644', '#F39C59'] }, { main: '#EB547D', shades: ['#EE7293', '#F191AB', '#D64D72', '#C04567'] }, { main: '#9F6AA7', shades: ['#B084B6', '#C19FC7', '#916198', '#82588A'] }, { main: '#5476B3', shades: ['#6382B9', '#829BC7', '#4D6CA3', '#3E5782'] }, { main: '#2BB19B', shades: ['#4DBFAD', '#73CDBF', '#27A18D', '#1F8171'] }, { main: '#70B984', shades: ['#7FBE90', '#98CBA6', '#68A87A', '#5E976E'] }];
|
var svg = selectSVG('svg');
|
var text = document.getElementById('text');
|
var offscreenText = document.getElementById('offscreen-text');
|
var input = document.getElementById('input');
|
var button = document.getElementById('button');
|
var width = window.innerWidth;
|
var height = window.innerHeight;
|
var textSize = 0;
|
var textCenter = 0;
|
var letters = [];
|
var prompt = ['s', 't', 'a', 'r', 't', ' ', 't', 'y', 'p', 'i', 'n', 'g'];
|
var runPrompt = false;
|
|
var resizePage = function resizePage() {
|
width = window.innerWidth;
|
height = window.innerHeight;
|
svg.set('height', height);
|
svg.set('width', width);
|
svg.set('viewBox', '0 0 ' + width + ' ' + height);
|
resizeLetters();
|
};
|
|
var resizeLetters = function resizeLetters() {
|
textSize = width / (letters.length + 2);
|
if (textSize > 100) textSize = 100;
|
text.style.fontSize = textSize + 'px';
|
text.style.height = textSize + 'px';
|
text.style.lineHeight = textSize + 'px';
|
offscreenText.style.fontSize = textSize + 'px';
|
var textRect = text.getBoundingClientRect();
|
textCenter = textRect.top + textRect.height / 2;
|
positionLetters();
|
};
|
|
var positionLetters = function positionLetters() {
|
letters.forEach(function (letter) {
|
var timing = letter.shift ? 0.1 : 0;
|
TweenLite.to(letter.onScreen, timing, { x: letter.offScreen.offsetLeft + 'px', ease: Power3.easeInOut });
|
letter.shift = true;
|
});
|
};
|
|
var animateLetterIn = function animateLetterIn(letter) {
|
var yOffset = (0.5 + Math.random() * 0.5) * textSize;
|
TweenLite.fromTo(letter, 0.4, { scale: 0 }, { scale: 1, ease: Back.easeOut });
|
TweenLite.fromTo(letter, 0.4, { opacity: 0 }, { opacity: 1, ease: Power3.easeOut });
|
TweenLite.to(letter, 0.2, { y: -yOffset, ease: Power3.easeInOut });
|
TweenLite.to(letter, 0.2, { y: 0, ease: Power3.easeInOut, delay: 0.2 });
|
var rotation = -50 + Math.random() * 100;
|
TweenLite.to(letter, 0.2, { rotation: rotation, ease: Power3.easeInOut });
|
TweenLite.to(letter, 0.2, { rotation: 0, ease: Power3.easeInOut, delay: 0.2 });
|
};
|
|
var addDecor = function addDecor(letter, color) {
|
setTimeout(function () {
|
var rect = letter.getBoundingClientRect();
|
var x0 = letter.offsetLeft + letter.offsetWidth / 2;
|
var y0 = textCenter - textSize * 0.5;
|
var shade = color.shades[Math.floor(Math.random() * 4)];
|
for (var i = 0; i < 8; i++) {
|
addTri(x0, y0, shade);
|
}for (var i = 0; i < 8; i++) {
|
addCirc(x0, y0);
|
}
|
}, 150);
|
};
|
|
var addTri = function addTri(x0, y0, shade) {
|
var tri = createSVG('polygon');
|
var a = Math.random();
|
var a2 = a + (-0.2 + Math.random() * 0.4);
|
var r = textSize * 0.52;
|
var r2 = r + textSize * Math.random() * 0.2;
|
var x = x0 + r * Math.cos(2 * Math.PI * a);
|
var y = y0 + r * Math.sin(2 * Math.PI * a);
|
var x2 = x0 + r2 * Math.cos(2 * Math.PI * a2);
|
var y2 = y0 + r2 * Math.sin(2 * Math.PI * a2);
|
var triSize = textSize * 0.1;
|
var scale = 0.3 + Math.random() * 0.7;
|
var offset = triSize * scale;
|
tri.set('points', '0,0 ' + triSize * 2 + ',0 ' + triSize + ',' + triSize * 2);
|
tri.style('fill', shade);
|
svg.element.appendChild(tri.element);
|
TweenLite.fromTo(tri.element, 0.6, { rotation: Math.random() * 360, scale: scale, x: x - offset, y: y - offset, opacity: 1 }, { x: x2 - offset, y: y2 - offset, opacity: 0, ease: Power1.easeInOut, onComplete: function onComplete() {
|
svg.element.removeChild(tri.element);
|
} });
|
};
|
|
var addCirc = function addCirc(x0, y0) {
|
var circ = createSVG('circle');
|
var a = Math.random();
|
var r = textSize * 0.52;
|
var r2 = r + textSize;
|
var x = x0 + r * Math.cos(2 * Math.PI * a);
|
var y = y0 + r * Math.sin(2 * Math.PI * a);
|
var x2 = x0 + r2 * Math.cos(2 * Math.PI * a);
|
var y2 = y0 + r2 * Math.sin(2 * Math.PI * a);
|
var circSize = textSize * 0.05 * Math.random();
|
circ.set('r', circSize);
|
circ.style('fill', '#eee');
|
svg.element.appendChild(circ.element);
|
TweenLite.fromTo(circ.element, 0.6, { x: x - circSize, y: y - circSize, opacity: 1 }, { x: x2 - circSize, y: y2 - circSize, opacity: 0, ease: Power1.easeInOut, onComplete: function onComplete() {
|
svg.element.removeChild(circ.element);
|
} });
|
};
|
|
var addLetter = function addLetter(char, i) {
|
var letter = document.createElement('span');
|
var oLetter = document.createElement('span');
|
letter.innerHTML = char;
|
oLetter.innerHTML = char;
|
text.appendChild(letter);
|
var color = colors[i % colors.length];
|
letter.style.color = color.main;
|
offscreenText.appendChild(oLetter);
|
letters[i] = { offScreen: oLetter, onScreen: letter, char: char };
|
animateLetterIn(letter);
|
addDecor(oLetter, color);
|
};
|
|
var addLetters = function addLetters(value) {
|
value.forEach(function (char, i) {
|
if (letters[i] && letters[i].char !== char) {
|
letters[i].onScreen.innerHTML = char;
|
letters[i].offScreen.innerHTML = char;
|
letters[i].char = char;
|
}
|
if (letters[i] === undefined) {
|
addLetter(char, i);
|
}
|
});
|
};
|
|
var animateLetterOut = function animateLetterOut(letter, i) {
|
TweenLite.to(letter.onScreen, 0.1, { scale: 0, opacity: 0, ease: Power2.easeIn, onComplete: function onComplete() {
|
console.log('removing');
|
console.log(letter);
|
offscreenText.removeChild(letter.offScreen);
|
text.removeChild(letter.onScreen);
|
positionLetters();
|
} });
|
letters.splice(i, 1);
|
};
|
|
var removeLetters = function removeLetters(value) {
|
for (var i = letters.length - 1; i >= 0; i--) {
|
var letter = letters[i];
|
if (value[i] === undefined) {
|
animateLetterOut(letter, i);
|
}
|
}
|
};
|
|
var onInputChange = function onInputChange() {
|
var value = input.value === '' ? [] : input.value.toLowerCase().split('');
|
addLetters(value);
|
removeLetters(value);
|
resizeLetters();
|
};
|
|
var keyup = function keyup(e) {
|
if (runPrompt) {
|
input.value = '';
|
runPrompt = false;
|
};
|
onInputChange();
|
};
|
|
var addPrompt = function addPrompt(i) {
|
setTimeout(function () {
|
if (runPrompt && prompt[i]) {
|
input.value = input.value + prompt[i];
|
onInputChange();
|
addPrompt(i + 1);
|
}
|
}, 300);
|
};
|
|
resizePage();
|
window.addEventListener('resize', resizePage);
|
input.addEventListener('keyup', keyup);
|
input.focus();
|
addPrompt(0);
|