Skip to content
Permalink
4b84104f60
Switch branches/tags
Go to file
 
 
Cannot retrieve contributors at this time
127 lines (100 sloc) 3.18 KB
(function(){
if (!document.querySelector || !document.documentElement.getBoundingClientRect || !document.addEventListener)
return;
var options = INSTALL_OPTIONS;
var pendingRegions = options.regions;
var prevRegions = [];
var styleCont = '';
for (var i=0; i < pendingRegions.length; i++){
styleCont += pendingRegions[i].location + " { opacity: 0; }\n"
}
var style = document.createElement('style');
style.innerHTML = styleCont;
document.head.appendChild(style);
var trianglify = function(el, reg){
// We need default sizes because with MutationObserver we could easily be running before this element
// attains it's full size. We could rerender as it's children are populated, but that causes the rendering
// to change as the page loads.
if (reg.size < 20)
reg.size = 20;
var tri = window.Trianglify({
width: 1000,
height: 1000,
cell_size: reg.size,
x_colors: reg.colors,
variance: reg.variance / 100
});
var svg = tri.svg();
svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
prevRegions.push([el, el.style.background, el.style.backgroundSize]);
el.style.background = "url('data:image/svg+xml;utf8," + svg.outerHTML + "') no-repeat";
el.style.backgroundSize = 'cover';
// It takes a non-trivial amount of time to generate the triangles, so we hide the element to prevent a flash
el.style.opacity = '1';
}
var checkNode = function(node){
if (node.nodeType == 1){
for (var i=0; i < pendingRegions.length; i++){
if (node.matches(pendingRegions[i].location)){
trianglify(node, pendingRegions[i]);
pendingRegions.splice(i, 1);
i--;
return true;
}
}
}
return false;
};
var load = function(){
for (var i=0; i < pendingRegions.length; i++){
var reg = pendingRegions[i];
var els = document.querySelectorAll(reg.location);
if (!els) continue;
for (var j=0; j < els.length; j++){
trianglify(els[i], reg);
}
}
};
var observer;
if (window.MutationObserver != null) {
observer = new MutationObserver(function(mutations) {
for (var i=0; i < mutations.length; i++){
var addedNodes = mutations[i].addedNodes;
for (var j=0; j < addedNodes.length; j++){
if (checkNode(addedNodes[j])){
break;
}
}
}
if (pendingRegions.length == 0 || document.readyState == 'complete'){
observer.disconnect();
}
});
observer.observe(document.documentElement, {
childList: true,
subtree: true
});
} else {
if (document.readyState == 'complete'){
load();
} else {
document.addEventListener('DOMContentLoaded', load);
}
}
var setOptions = function(opts){
options = opts;
pendingRegions = options.regions;
if (observer){
observer.disconnect();
}
for (var i=0; i < prevRegions.length; i++){
prevRegions[i][0].style.background = prevRegions[i][1];
prevRegions[i][0].style.backgroundSize = prevRegions[i][2];
}
prevRegions = [];
load();
}
window.EagerTrianglifyApp = {
setOptions: setOptions
};
})()