let scrollId = Math.floor(Date.now()/1000/60/60); let scrollPerLoop = 2000; let mtx = 0.5; let mty = 0.5; let mta = 205.0/360.0; let mtr = 1.0; let maxScale = 16; let sensScale = 0.4; let sensTouch = 100; let alpha = 10; let nDecimals = 4; let touchTip = true; let sDegree = 3; let lValue = 0.5; let r = 0.45; let sw = r/2; let sensMouv = 0.1; let clientX; let clientY; let nLayers = 10; const thit = document.getElementById("thit"); const stringToConvert = thit.innerText; const myLogo = document.getElementById("myLogo"); const pathGroup = document.getElementById("pathGroup"); const maskGroup = document.getElementById("maskGroup"); const gradientsGroup = document.getElementById("gradients"); const tips = document.getElementById("tips"); const easeOut = document.getElementById("easeOut"); const easeOutValue = document.getElementById("easeOutValue"); const light = document.getElementById("light"); const lightValue = document.getElementById("lightValue"); function ready(fn) { if (document.readyState !== 'loading') { fn(); } else { document.addEventListener('DOMContentLoaded', fn); } } function easeInNone(x) { return x; } function easeOutNone(x) { return x; } function easeInQuad(x) { return x * x; } function easeInCubic(x) { return x * x * x; } function easeOutSine(x) { return Math.sin((x * Math.PI) / 2); } function easeInSpline(x,d) { return Math.pow(x, d); } function easeOutSpline(x,d) { return 1 - Math.pow(1 - x, d); } function easeInCirc(x) { return 1 - Math.sqrt(1 - Math.pow(x, 2)); } function easeOutCirc(x) { return Math.sqrt(1 - Math.pow(x - 1, 2)); } function easeOutExpo(x) { return x === 1 ? 1 : 1 - Math.pow(2, -10 * x); } function easeInOutCirc(x) { return x < 0.5 ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2 : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2; } function easeInSine(x) { return 1 - Math.cos((x * Math.PI) / 2); } function easeOutCubic(x) { return 1 - Math.pow(1 - x, 3); } function easeInOutQuad(x) { return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2; } function easeInOutSine(x) { return -(Math.cos(Math.PI * x) - 1) / 2; } function easeInOutCubic(x) { return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2; } function triangleWave(x, amplitude, period, offset) { let normalized = ((x+period/2) * (2 / period)) % 2; let wave = Math.abs(normalized - 1); return (wave * amplitude) + offset; } function dpathO() { let d = `M ${(r).toFixed(nDecimals)} 0 V ${(r).toFixed(nDecimals)} A ${r.toFixed(nDecimals)} ${r.toFixed(nDecimals)} 0 0 1 ${(-r).toFixed(nDecimals)} ${(r).toFixed(nDecimals)} V ${(-r).toFixed(nDecimals)} A ${r.toFixed(nDecimals)} ${r.toFixed(nDecimals)} 0 0 1 ${(r).toFixed(nDecimals)} ${(-r).toFixed(nDecimals)} Z`; return d; } function dpathM() { let d = 'M -100 100 L 100 -100'; return d; } function drawLayer(i) { let si = (scrollId%scrollPerLoop)/(scrollPerLoop-1); let scale = (nLayers - i - si)/nLayers; let rate = triangleWave((nLayers - i - si)/(nLayers-1),1,1,0.0); if (i == 0) { rate = 0; } // increase = easeInSine(increase); // rate = easeInOutSine(rate); let myLayer = document.getElementById(`layer${i}`); let myGrad = document.getElementById(`grad${i}`); myGrad.innerHTML = ``; // myGrad.setAttribute('gradientTransform', ` translate (0.5 0.5) scale(${scale}) translate (-0.5 -0.5)`); let o = document.getElementById(`o${i}`); let mo = document.getElementById(`mo${i}`); o.setAttribute('transform', `scale(${scale})`); mo.setAttribute('transform', `scale(${scale})`); myLayer.setAttribute('fill', `url(#grad${i})`); } function svgChar(i,c) { let mySvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); // mySvg.setAttribute('width','128px'); // mySvg.setAttribute('height','128px'); mySvg.setAttribute('viewBox','-0.5 -0.5 1 1'); mySvg.setAttribute('version','1.1'); mySvg.setAttribute('id',`svg${i}`); mySvg.setAttribute('xmlns','http://www.w3.org/2000/svg'); mySvg.setAttribute('xmlns:svg','http://www.w3.org/2000/svg'); mySvg.setAttribute('height','100px'); mySvg.setAttribute('width','100px'); let myChar = document.createElementNS('http://www.w3.org/2000/svg', 'text'); myChar.setAttribute('x','0'); myChar.setAttribute('y','0'); myChar.setAttribute('fill','none'); myChar.setAttribute('id',`text${i}`); myChar.setAttribute('text-anchor','middle'); myChar.setAttribute('dominant-baseline','middle'); let myText = document.createTextNode(c); myChar.appendChild(myText); mySvg.appendChild(myChar); thit.appendChild(mySvg); } function doThit() { console.log(stringToConvert); thit.innerHTML = ''; for (let i = 0; i < stringToConvert.length; i++) { svgChar(i,stringToConvert.charAt(i)); } } function doThas() { for (let i = 0; i < stringToConvert.length; i++) { cutOutChar(i); } } function cutOutChar(i) { let mySvg = document.getElementById(`svg${i}`); let myChar = document.getElementById(`text${i}`); let myBBox = myChar.getBBox(); let myRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect'); myRect.setAttribute('x',-1); myRect.setAttribute('y',-1); myRect.setAttribute('width',2); myRect.setAttribute('height',2); // myRect.setAttribute('x',myBBox.x); // myRect.setAttribute('y',myBBox.y); // myRect.setAttribute('width',myBBox.width); // myRect.setAttribute('height',myBBox.height); myRect.setAttribute('fill','#404040'); let myRect2 = myRect.cloneNode(); myRect.setAttribute('mask',`url(#mask${i})`); myRect2.setAttribute('fill','white'); let myMask = document.createElementNS('http://www.w3.org/2000/svg', 'mask'); myMask.setAttribute('id',`mask${i}`); myMask.setAttribute('mask-type','luminance'); mySvg.innerHTML = ''; myChar.setAttribute('fill','black'); let myOutline = myChar.cloneNode(true); myOutline.setAttribute('fill','none'); myOutline.setAttribute('stroke','black'); myOutline.setAttribute('stroke-width','0.005'); let myGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g'); myMask.appendChild(myRect2); myMask.appendChild(myChar); myGroup.appendChild(myMask); myGroup.appendChild(myRect); myGroup.appendChild(myOutline); for (let j = nLayers-1; j > 0; j--) { let couleur = (j+1)/nLayers*1/5; let ratio = 1-(j)/nLayers; let myClone = myGroup.cloneNode(true); myClone.firstChild.setAttribute('id',`mask${i}_${j}`); myClone.childNodes[1].setAttribute('mask',`url(#mask${i}_${j})`); myClone.childNodes[1].setAttribute('fill',`${hslToHex(couleur,1,0.5)}`); myClone.setAttribute('transform',`translate(0 ${-(j+1)*0.0035}) scale(${ratio})`); mySvg.appendChild(myClone); } mySvg.appendChild(myGroup); } function addLayers() { for (let i = 0; i < nLayers; i++) { let e = document.createElement("linearGradient"); e.setAttribute('id', `grad${i}`); e.setAttribute('x1','0'); e.setAttribute('y1', '0'); e.setAttribute('x2', '1'); e.setAttribute('y2', '0'); // let e = document.createElement("radialGradient"); // e.setAttribute('cx', '50%'); // e.setAttribute('id', `grad${i}`); // e.setAttribute('cy','50%'); // e.setAttribute('r', '50%'); // e.setAttribute('fx', '50%'); // e.setAttribute('fy', '50%'); gradientsGroup.appendChild(e); } for (let i = nLayers - 1; i >= 0; i--) { let g = document.createElement("g"); g.setAttribute('id', `group${i}`); g.setAttribute('shape-rendering','geometricPrecision') let r = document.createElement("rect"); r.setAttribute('id', `rect${i}`); r.setAttribute('x',-1); r.setAttribute('y',-1); r.setAttribute('width',2); r.setAttribute('height',2); r.setAttribute('fill',"white"); let o = document.createElement("path"); o.setAttribute('id', `o${i}`); o.setAttribute('d',dpathO()); o.setAttribute('fill',"black"); let mo = document.createElement("path"); mo.setAttribute('id', `mo${i}`); mo.setAttribute('d',dpathM()); mo.setAttribute('stroke',"black"); mo.setAttribute('stroke-width',`${sw}`); // e.setAttribute('mask', `url(#mask${i})`); let m = document.createElement("mask"); m.setAttribute('id', `mask${i}`); m.appendChild(r); m.appendChild(o); m.appendChild(mo); g.appendChild(m); let l = document.createElement("rect"); l.setAttribute('id', `layer${i}`); l.setAttribute('x',-1); l.setAttribute('y',-1); l.setAttribute('width',2); l.setAttribute('height',2); l.setAttribute('mask',`url(#mask${i})`); g.appendChild(l); myLogo.appendChild(g); } myLogo.innerHTML += ''; redrawLayers(); } function redrawLayers() { mta = Math.atan2(-0.5+mty,-0.5+mtx)/(2*Math.PI)+0.5; mtr = Math.min(2* Math.sqrt(Math.pow(-0.5+mty,2)+Math.pow(-0.5+mtx,2)),1); for (let i = 0; i < nLayers; i++) { drawLayer(i); } } function componentToHex(c) { var hex = c.toString(16); return hex.length == 1 ? "0" + hex : hex; } function rgbToHex(r, g, b) { return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b); } function rgbaToHex(r, g, b, a) { return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b) + componentToHex(a); } function hslToHex(h, s, l) { var r, g, b; if (s == 0) { r = g = b = 0; // achromatic } else { function hue2rgb(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1/6) return p + (q - p) * 6 * t; if (t < 1/2) return q; if (t < 2/3) return p + (q - p) * (2/3 - t) * 6; return p; } var q = l < 0.5 ? l * (1 + s) : l + s - l * s; var p = 2 * l - q; r = Math.round(hue2rgb(p, q, h + 1/3) * 255); g = Math.round(hue2rgb(p, q, h) * 255); b = Math.round(hue2rgb(p, q, h - 1/3) * 255); } return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b); } document.addEventListener("wheel", (e) => { // e.preventDefault(); scrollId += e.deltaY; if (scrollId <= 0){ scrollId = 0; console.log("You reached 1ᵉʳ janvier 1970") } // redrawLayers(); }); document.addEventListener("scroll", (e) => { // e.preventDefault(); scrollId += e.deltaY; if (scrollId <= 0){ scrollId = 0; console.log("You reached 1ᵉʳ janvier 1970") } // redrawLayers(); }); ready(doThit()); doThas() function letFlow() { scrollId += 50; // redrawLayers(); } setInterval(letFlow, 60);