]> git.r.bdr.sh - rbdr/r.bdr.sh/commitdiff
Add breadsticks and new selfie
authorBen Beltran <redacted>
Sun, 10 Nov 2019 17:27:16 +0000 (18:27 +0100)
committerBen Beltran <redacted>
Sun, 10 Nov 2019 17:27:16 +0000 (18:27 +0100)
jekyll/_layouts/default.html
jekyll/css/application.css
jekyll/img/selfie.gif
jekyll/index.html
jekyll/js/breadsticks.js [new file with mode: 0644]
jekyll/video/selfie.mp4
jekyll/video/selfie.webm

index 93a352d50c69d89fb34fd4afc409dd02e5e33d71..50fe27cde76ca8dc1e714ba7d279d2220537d8ab 100644 (file)
@@ -18,7 +18,7 @@
       <link rel="stylesheet" type="text/css" href="/css/application.css">
     </noscript>
 
-    <script src="/js/offline_support.js" defer></script>
+    <script src="/js/breadsticks.js" defer></script>
 
     <!--
         /\
@@ -38,5 +38,6 @@
         {{ content }}
       </section>
     </div>
+    <canvas id="breadsticks" class="background"></canvas>
   </body>
 </html>
index 5084debe53f6d2e15bd4ac2ab754aa1774931b6c..171764cbdc52d8a481a0b4d828c4ae3e4244edb6 100644 (file)
@@ -14,6 +14,7 @@ header a, header a:visited {
 
 h2,
 h3 {
+  display: inline-block;
   margin-left: 10px;
   font-weight: 300;
 }
@@ -50,6 +51,7 @@ ul {
 }
 
 li {
+  display: inline-block;
   line-height: 1.82em;
 }
 
@@ -63,6 +65,10 @@ video {
   max-width: 100vw;
 }
 
+li, h2, h3, p {
+  background-color: white;
+}
+
 /* Dark mode overrides */
 @media (prefers-color-scheme: dark) {
   body {
@@ -89,4 +95,29 @@ video {
   aside {
     color: #FFEC27;
   }
+
+  li, h2, h3, p {
+    background-color: black;
+  }
+}
+
+/*
+ * Mini header
+ */
+@media (max-width: 600px) {
+  h1 {
+    font-size: 4.8em;
+  }
+}
+
+/*
+ * Breadsticks
+ */
+canvas.background {
+  width: 100%;
+  height: 100%;
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: -1;
 }
index 42b0d1f25a6003de96409980af821b4a50cc2f54..8026530075b295aa353ee4ee7f7654eba40e2628 100644 (file)
Binary files a/jekyll/img/selfie.gif and b/jekyll/img/selfie.gif differ
index b20ae4b5b707847bb1be1b573ade11c51564743b..2c3b8af9f68ba4c8b76d0a1c81eba9507d0a4846 100644 (file)
@@ -131,13 +131,15 @@ description: "unlimited.pizza - ruben beltran del río surfs the internet: progr
 
   <h2>Even more stuff.</h2>
 
-  <video autoplay muted loop>
-    <source src="/video/selfie.webm" type="video/webm">
-    <source src="/video/selfie.mp4" type="video/mp4">
-  </video>
+  <div>
+    <video autoplay muted loop>
+      <source src="/video/selfie.webm" type="video/webm">
+      <source src="/video/selfie.mp4" type="video/mp4">
+    </video>
+  </div>
 
-  <p>🍕 Unlimited pizza 🍕 is brought to you by blood magic, ancient rituals and
-  me, Rubén Beltrán del Río. I have words written <span lang="es-mx">(español e inglés)</span> on
+  <p>🍕 Unlimited pizza 🍕 Rubén Beltrán del Río. I have words written
+  <span lang="es-mx">(español e inglés)</span> on
   <a href="https://medium.com/@expertosenbing">medium</a>,
   spoken in <a href="https://www.youtube.com/playlist?list=PLYxitPB3WXb1B4zPAsj92l9ay5pBOyynt">a handy playlist</a>,
   music at <a href="https://soundcloud.com/benbeltran">soundcloud</a>
diff --git a/jekyll/js/breadsticks.js b/jekyll/js/breadsticks.js
new file mode 100644 (file)
index 0000000..2675c0c
--- /dev/null
@@ -0,0 +1,166 @@
+// App Config
+
+const kEntrypoint = "breadsticks";
+const kGap = 50;
+const kDrawDelay = 100;
+const kDarkDrawingColor = '#fff';
+const kLightDrawingColor = '#000';
+
+/***********************************************
+ * Breadstick generates a matrix of points
+ * and assigns a vector to each entry
+ * and then draws them
+ ***********************************************/
+
+/*
+ * Generate field of points in which to draw
+ */
+
+// Updates the field object using a canvas
+
+const updateFieldFromCanvas = (field, canvas) => {
+  updateFieldFromRect(field, canvas.getBoundingClientRect());
+
+  canvas.width = window.innerWidth;
+  canvas.height = window.innerHeight;
+
+  window.addEventListener('resize', () => {
+    canvas.width = window.innerWidth;
+    canvas.height = window.innerHeight;
+    updateFieldFromRect(field, canvas.getBoundingClientRect());
+  });
+};
+
+// Updates a field object using a rect
+
+const updateFieldFromRect = (field, rect) => {
+  field.width = rect.width;
+  field.height = rect.height;
+}
+
+/*
+ * Generate the matrix of vectors
+ */
+
+// Updates a matrix for a given field using the mouse
+
+
+const updateFieldMatrixFromMouse = (field, matrix, gap = 50) => {
+  const mousePosition = {
+    x: 0,
+    y: 0
+  };
+
+  fillMatrix(matrix, mousePosition.x, mousePosition.y, field.width, field.height, gap);
+
+  const updateMousePosition = document.addEventListener('mousemove', (event) => {
+    mousePosition.x = event.offsetX;
+    mousePosition.y = event.offsetY;
+    fillMatrix(matrix, mousePosition.x, mousePosition.y, field.width, field.height, gap);
+  });
+};
+
+// Gets a matrix by calculating the offset between position and field.
+
+const fillMatrix = (matrix, x, y, w, h, gap = 50) => {
+  for (let i = 0; i < w / gap; ++i) {
+    matrix[i] = [];
+    for (let j = 0; j < h / gap; ++j) {
+      let targetX = i * gap;
+      let targetY = j * gap;
+      matrix[i][j] = calculateOffsetVector(x, y, targetX, targetY, w, h);
+    }
+  }
+};
+
+// Calculates the offset vector of a point
+const calculateOffsetVector = (sourceX, sourceY, targetX, targetY, w, h) => {
+  const xOffset = targetX - sourceX;
+  const yOffset = targetY - sourceY;
+
+  return {
+    position: {
+      x: targetX,
+      y: targetY
+    },
+    angle: Math.atan2(xOffset, yOffset),
+    magnitude: Math.sqrt(Math.pow(xOffset, 2) + Math.pow(yOffset, 2))
+  };
+};
+
+
+/*
+ * Drawing
+ */
+
+// draw a vector from center
+const drawVector = (context, i, j, vector) => {
+  const origin = {
+    x: context.canvas.width  / 2,
+    y: context.canvas.height / 2
+  };
+  const x = origin.x - vector.magnitude * Math.cos(vector.angle);
+  const y = origin.y - vector.magnitude * Math.sin(vector.angle);
+  context.beginPath();
+  context.moveTo(vector.position.x, vector.position.y);
+  context.lineTo(Math.round(x), Math.round(y));
+  context.stroke();
+};
+
+// Gets the color depending on the team
+
+const getColor = () => {
+  if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
+    return kDarkDrawingColor;
+  }
+
+  return kLightDrawingColor;
+};
+
+
+// Draws field on canvas
+
+const drawFieldMatrixOnCanvas = (matrix, context) => {
+
+  context.strokeStyle = getColor();
+  context.clearRect(0, 0, context.canvas.width, context.canvas.height);
+
+  for (let i = 0; i < matrix.length; ++i) {
+    const row = matrix[i];
+    for (let j = 0; j < row.length; ++j) {
+      const vector = row[j]
+
+      if (vector) {
+        drawVector(context, i, j, vector);
+      }
+    }
+  }
+};
+
+/*
+ * Entrypoint
+ */
+
+const run = () => {
+
+  const field = {
+    width: 0,
+    height: 0
+  };
+  const canvas = document.getElementById(kEntrypoint);
+
+  updateFieldFromCanvas(field, canvas);
+
+  const matrix = [[]];
+  updateFieldMatrixFromMouse(field, matrix, kGap);
+
+  const context = canvas.getContext('2d');
+  const drawFunction = () => {
+    drawFieldMatrixOnCanvas(matrix, context);
+    setTimeout(drawFunction, kDrawDelay);
+  }
+
+  setTimeout(drawFunction, 0);
+};
+
+window.addEventListener('load', run);
index 1d9edd8aa8500f960a562c56c06c2bf4b60e3e87..9c0526412361d97bdf1acd43f51414510288f3b0 100644 (file)
Binary files a/jekyll/video/selfie.mp4 and b/jekyll/video/selfie.mp4 differ
index 0aa93b361a246fc7e6936fedc6c3ba905060f601..d9c9e9e868962eb8a27eff85c4dd8712363e436c 100644 (file)
Binary files a/jekyll/video/selfie.webm and b/jekyll/video/selfie.webm differ