diff --git a/v1-com-officielle/glitcher/glitcher.css b/v1-com-officielle/glitcher/glitcher.css new file mode 100644 index 0000000..c11813c --- /dev/null +++ b/v1-com-officielle/glitcher/glitcher.css @@ -0,0 +1,72 @@ +/*=============Typo*/ +@font-face { + font-family: 'lineal'; + src: url('../typo/Lineal-Heavy.ttf'); +} + +@font-face { + font-family: 'pressStart2P'; + src: url('../typo/PressStart2P-Regular.ttf'); +} + +@font-face { + font-family: 'velvelyne'; + src: url('../typo/Velvelyne-Light.ttf') format('truetype'); + font-weight:lighter; +} + +@font-face { + font-family: 'velvelyne'; + src:url('../typo/Velvelyne-Bold.ttf') format('truetype'); + font-weight: bold; +} + +/*============General*/ + +body, html { + padding: 0; + margin: 0; +} + +body { + width: 100vw; + height: 100vh; + overflow: hidden; +} + +:root { + --back-color: black; + --main-color: white; + --accent-color: #3CFF00; + --neon-color: #3CFF00; + + color: var(--main-color); + font-size: 1rem; + background: var(--back-color); + font-family: 'velvelyne', sans-serif; + font-weight: bold; +} + +body > *{ + width: 100%; + height: 100%; + box-sizing: border-box; + padding: 15px; +} + +#welcome-panel { + text-align: center; +} + +h1 { + font-family: 'lineal', sans-serif; + font-weight: bolder; +} + +#ui-canvas { + display: block; + max-width: calc(100vw - 30px); + max-height: calc(100vh - 30px); + margin-left: auto; + margin-right: auto; +} \ No newline at end of file diff --git a/v1-com-officielle/glitcher/glitcher.js b/v1-com-officielle/glitcher/glitcher.js new file mode 100644 index 0000000..df39c63 --- /dev/null +++ b/v1-com-officielle/glitcher/glitcher.js @@ -0,0 +1,112 @@ +import { Glitcher } from "./lib/glitcher"; + +const CANVAS = document.getElementById("ui-canvas") +const UI_GLITCHER = new Glitcher(CANVAS) +const FORM = document.getElementById("glitcher-form") + +async function updateFromForm(){ + let data = new FormData(FORM) + + let image = data.get("image") + if(image.size > 0){ + if(UI_GLITCHER.currentImageFile != image){ + await UI_GLITCHER.setImage(image) + UI_GLITCHER.clearGlitch() + } + } else { + UI_GLITCHER.clearImage() + } + + document.getElementById("welcome-panel").hidden = image.size > 0 + document.getElementById("glitch-panel").hidden = image.size == 0 + + UI_GLITCHER.render() +} + +for(let el of FORM.elements){ + el.addEventListener("change", () => FORM.requestSubmit()) +} + +FORM.addEventListener("submit", e => { + e.preventDefault() + updateFromForm() + }) + +FORM.addEventListener("reset", e => { + FORM.elements["image"].value = "" + updateFromForm() + }) + +document.getElementById("download-btn").addEventListener("click", async e => { + e.preventDefault(); + let data = await UI_GLITCHER.toBlob("image/jpeg", 0.9); + let a = document.createElement('a') + a.href = URL.createObjectURL(data) + a.download = UI_GLITCHER.currentImageFile.name + a.click() + setTimeout(() => URL.revokeObjectURL(a.href), 10000) +}) + +CANVAS.addEventListener("pointerdown", e => { + let pointerId = e.pointerId; + + let lastX = undefined; + let lastY = undefined; + let lastCommit = null; + + function applyGlitch(e){ + if(e.pointerId != pointerId){ + return + } + + let canvasRect = CANVAS.getBoundingClientRect() + let x = e.clientX - canvasRect.left + let y = e.clientY - canvasRect.top + + let now = Date.now() + + if(lastCommit === null || now - lastCommit > 100){ + let width = 50; + if(e.pointerType == "touch"){ + width *= 2 + } + + let deltaX = lastX !== undefined ? x - lastX : 0 + let deltaY = lastY !== undefined ? y - lastY : 0 + + width += Math.max(Math.abs(deltaX), Math.abs(deltaY)) + width += Math.random()*2 + + UI_GLITCHER.addGlitch(x, y, width) + UI_GLITCHER.render() + + lastCommit = now + } + + lastX = x + lastY = y + } + + function endGlitch(e){ + if(e.pointerId != pointerId){ + return + } + + window.removeEventListener("pointermove", applyGlitch) + window.removeEventListener("pointerup", endGlitch) + } + + window.addEventListener("pointerup", endGlitch) + window.addEventListener("pointermove", applyGlitch) + + applyGlitch(e) +}) + +/*function startRendering(){ + UI_GLITCHER.render() + requestAnimationFrame(startRendering) +} +startRendering()*/ + +setInterval(() => UI_GLITCHER.render(), 500) +updateFromForm() \ No newline at end of file diff --git a/v1-com-officielle/glitcher/index.html b/v1-com-officielle/glitcher/index.html new file mode 100644 index 0000000..a5ac87a --- /dev/null +++ b/v1-com-officielle/glitcher/index.html @@ -0,0 +1,29 @@ + + +
+ + + +{{selectedVideo.like}}