We code: Summer edition es una iniciativa inspirada en el Codevember pero orientada a frontend (específicamente a HTML, CSS y JavaScript).
Se desarrollaron interfaces, componentes e interacciones llamativas usando propiedades de CSS y funcionalidades de JavaScript que no usamos comúnmente. Puedes ver esta presentación para conocer un poco más de esta iniciativa.

Spotlight Effect

"Uso de la función de CSS radial-gradient y de JavaScript para dar interactividad." — Henry Zarza

En este ejercicio vimos el uso de la función radial gradient de CSS para hacer un efecto de lupa junto con un poco de JavaScript vanilla. La función radial-gradient() crea una imagen consistente de una transición progresiva entre dos o más colores que se le envíen, puede recibir únicamente dos formas geométricas un círculo o una elipse. Y hasta el momento solamente se puede usar con la propiedad background-image o background. Por ejemplo: background: radial-gradient(red, green); le estamos indicando que queremos que el centro del círculo sea rojo y se vaya propagando hasta el color verde con una difuminación consistente. Una sintaxis más completa para esta propiedad es la siguiente: radial-gradient(circle at center, red 0%, blue 50%, green 100%) En la cual en la primera propiedad le definimos la forma geométrica valida que queremos (circle o ellipse) después le definimos el radio de origen desde el cual queremos empezar a hacer el gradiente (en este caso desde el centro), de ahí lo que hacemos es definir los colores que queremos para nuestro gradiente (podemos definir los que queramos) y el radio hasta el cual queremos que vaya ese color en específico. Para más información de esta propiedad podemos consultar la documentación de Mozilla y este artículo de CSS tricks. Lo primero que hicimos fue definir en nuestro HTML la estructura básica que necesitábamos, un texto con el contenido Press and hold y un contenedor con la clase spotlight. En nuestro CSS colocamos una imagen de fondo en la etiqueta body y otros estilos para que nos ocupará toda la pantalla, reseteamos los estilos por defecto de los navegadores, al título le dimos otros estilos para centrarlo con respecto a toda la pantalla y a la clase spotlight le indicamos que ocupe todo el espacio de la pantalla y le asignamos background-image: radial-gradient(circle, transparent 9rem, rgba(0, 0, 0, 0.55) 10rem); en la cual le indicamos que la figura que queremos es un círculo, el primer color es transparente hasta un radio de 9rem y el color final es de rgba(0, 0, 0, 0.55) que comienza en 10rem hasta el final. Y finalmente en nuestro JavaScript, tenemos inicialmente la selección del elemento spotlight después añadimos unos escuchadores a la página para los eventos mousemove, mousedown y mouseup, de manera respectiva lo que hacemos en estos eventos es: capturar la posición del mouse y asignarla a la función radial-gradient haciendo uso de unos cálculos para colocarlo de la forma en la que queremos, preguntamos si el evento que se disparó es el click cambiamos el valor del último color de la función radial-gradient para hacerlo más oscuro y por último cambiamos este último color por el valor que tenía inicialmente.

See the Pen We code summer 1 by Henry Zarza (@HenryZarza) on CodePen.

See the Pen Radial gradient CSS by Federico Di Rocco (@fededirocco) on CodePen.

See the Pen We code: summer edition - spotlight effect by Gabriel Zanzotti (@SKOLZ) on CodePen.

See the Pen Spotlight by ydzu (@ydzu) on CodePen.

CSS Mask

"Uso de la propiedad de CSS mask y del evento scroll de JavaScript para dar interactividad." — Henry Zarza

En este ejercicio vimos la propiedad mask de CSS junto con JavaScript vanilla para hacer una animación con el scroll. Antes de comenzar la explicación del ejercicio es importante dar un poco de contexto de la propiedad mask. Esta propiedad es un shorthand para asignar todas las propiedades de enmascaramiento; el proceso de enmascaramiento con esta propiedad consiste en ocultar un elemento (parcial o totalmente) a partir de una imagen con unas especificaciones o puntos que le damos. La sintaxis para utilizar esta propiedad es la siguiente: mask: [mask-reference] || [masking-mode] || [mask-position] || [mask-repeat] || [geometry-box] || [compositing-operator] En donde mask-reference hace referencia a la propiedad mask-image en la cual le especificamos la imagen a partir de la cual queremos empezar a hacer el proceso de enmascaramiento, luego vienen las propiedades para asignar el tipo de enmascaramiento que queremos, para esto utilizamos la propiedad mask-mode en la cual especificamos como la imagen que estamos utilizando para la máscara va a hacer tratada, existen dos posibles valores alpha mask o luminance mask. Luego viene la posición, el cual corresponde a la propiedad mask-position esta propiedad se comporta de la misma forma en la que se comporta la propiedad background-position, es decir, mediante esta propiedad especificamos las coordenadas tanto en X como en Y en la cual queremos que se ubique la imagen que tenemos definida como máscara, la siguiente propiedad corresponde a mask-size en la cual definimos el tamaño de la imagen que estamos colocando como máscara, las siguientes propiedades mask-repeat y mask-origin sirven consecutivamente para definir si queremos que la imagen se repita y el punto de origen en el cual queremos que se ubique la imagen, la siguiente propiedad corresponde a mask-clip, la cual nos sirve para determinar el área de pintura de la máscara que determina el área de un elemento que se ve afectado por una máscara, el contenido pintado (visible) de un elemento se ve restringido a esta área que definimos y por último la propiedad mask-composite nos sirve para especificar cómo se compone una imagen que estamos usando como máscara cuando queremos definir varias imágenes como enmascaramiento. Para más información de esta propiedad podemos consultar la documentación de Codrops, Mozilla y CSS tricks.
Y ahora sí, lo que hicimos en este ejercicio fue definir un h2 con la clase title para darle estilos en nuestro CSS, luego definimos un SVG con forma de flecha hacia abajo y con CSS lo que hicimos fue hacer una animación para que la flecha hiciera un efecto de levitación y por último definimos un div con el id cover el cual va a tener la máscara, en nuestro CSS tenemos lo común, es decir, la definición de los estilos de los navegadores, algunas propiedades para el título y la animación del SVG, lo importante acá son las propiedades mask-image y mask-size en la cual le definimos la url de la imagen con la cual vamos a hacer el enmascaramiento y el tamaño de esa imagen. En nuestro JavaScript tenemos definidos los frames por segundo desde el cual queremos empezar a mover el size de esa máscara, luego obtenemos el elemento cover y las dimensiones de la pantalla, añadimos un escuchador del evento scroll para la ventana y en este hacemos una serie de cálculos para ir cambiando el valor de la propiedad mask-size para dar el efecto de movimiento de la máscara.

See the Pen We code summer edition - Mask by Henry Zarza (@HenryZarza) on CodePen.

See the Pen Hitch - Mask in steps by ydzu (@ydzu) on CodePen.

See the Pen We code: summer edition - CSS mask by Gabriel Zanzotti (@SKOLZ) on CodePen.

See the Pen Mask scroll CSS by Federico Di Rocco (@fededirocco) on CodePen.

See the Pen Wolox Mask by Dorian Alvarado (@Dorian30) on CodePen.

Posicionamiento dinámico

"Uso de la propiedad position: sticky para posicionar elementos basado en el scroll del usuario." — Damian Finkelstein

Lorem ipsum dolor sit amet consectetur adipisicing elit. Eum, sunt! Magni, ut! Repellat, corrupti alias! Dolorem aperiam molestiae reprehenderit commodi! Aspernatur soluta commodi, facere magni atque voluptatum officia quia necessitatibus! Enim repudiandae consectetur aperiam dolorem officiis consequatur dicta harum culpa doloremque magni reiciendis ipsa non temporibus, facere aspernatur, commodi labore quod assumenda eveniet rem odit! Repellendus nihil obcaecati doloremque aperiam! Veniam, sapiente omnis quis aperiam modi ea beatae aut veritatis nobis, ipsum molestias dolores tempore cum voluptate qui doloribus itaque quidem minima aspernatur. Et iure, est pariatur aut autem sequi! Aperiam aliquam blanditiis dolores officia! Adipisci explicabo nesciunt quidem. Odit natus quisquam voluptatum asperiores saepe laborum molestias rem, consectetur, perferendis voluptas exercitationem sed? Veritatis sed molestias excepturi quibusdam asperiores autem? Quidem ipsum praesentium omnis consequuntur illum temporibus fuga sit dolor saepe impedit, laborum iusto iure rem et blanditiis, sequi eos quam commodi cupiditate reprehenderit enim vitae. Rerum magni amet aspernatur. Minima dolores, quaerat quod ullam nihil, incidunt nemo ut ipsam omnis reprehenderit nam laborum est neque a, asperiores dicta exercitationem possimus? Earum, eveniet magnam inventore quas magni consequatur exercitationem corporis! Ducimus debitis, architecto aut necessitatibus laudantium facere quidem quam ab sed! Deserunt amet dolorum reprehenderit odio delectus! Aliquid ducimus, labore molestiae, laborum earum doloribus ut doloremque tempora porro fugiat facere! Officiis, nisi! Maxime alias quaerat vel provident sint rem quod autem reprehenderit? Incidunt temporibus unde, cumque necessitatibus ab ex molestiae veniam deserunt eum veritatis doloribus omnis asperiores beatae, hic reprehenderit? Dolor facere doloribus eveniet deserunt aspernatur quibusdam itaque minima quos labore officia cupiditate corporis odit quo, magni nostrum dolorem, repudiandae culpa deleniti rerum? Quod ipsum vel harum impedit. Aliquid, placeat! Laboriosam consequatur explicabo, dignissimos officiis non nemo assumenda, a maiores porro necessitatibus perferendis hic sunt quasi aliquid rem quaerat eligendi vitae, quia vel dicta et veritatis facilis expedita! Illo, magni. Adipisci id dolorem suscipit vero saepe nostrum est, aperiam dolores rerum voluptatibus et illo laudantium esse maxime corrupti odio ipsa hic dicta. A quidem vel recusandae voluptate delectus, sequi nihil? Atque itaque ab consequuntur quidem assumenda, facere sint a repellendus dolores ducimus fugiat odio neque consequatur animi aut, tempora eveniet exercitationem in deleniti! Ratione in dicta labore soluta. Magni, voluptate.

See the Pen Timeline sticky - Capi by Henry Zarza (@HenryZarza) on CodePen.

See the Pen Position: sticky example - Capi by Henry Zarza (@HenryZarza) on CodePen.

See the Pen qLMaWB by Uvita (@osvaldofernandez92) on CodePen.

See the Pen Position sticky CSS by Federico Di Rocco (@fededirocco) on CodePen.

See the Pen Position sticky CSS by Federico Di Rocco (@fededirocco) on CodePen.

CSS variables y filters

"Uso de la propiedad filter y variables de CSS junto con JavaScript." — Henry Zarza

Las variables en CSS o Custom properties son propiedades definidas que contienen valores específicos que se pueden volver a utilizar en el DOM. Se les conoce como custom properties porque están sujetas a la cascada (su valor puede redefinirse) y heredan su valor de sus padres. Estos dos conceptos (cascada y herencia) son muy propios de las propiedades CSS y no tienen relación con el comportamiento de una variable en un lenguaje de programación.
Para definir una variable lo hacemos de esta forma: elemento { --color: green; } para declararla y elemento { background-color: var(--color, red); para utilizarla, algo importante a mencionar es que no se puede establecer una propiedad para un elemento y esperar recuperarla en la regla del descendiente de un hermano. La propiedad sólo está configurada para el selector de emparejamiento y sus descendientes. El scope de las variables de CSS no tiene scope de bloque sino que, por la herencia, son utilizables en cualquier hijo o descendiente (en el DOM) del elemento en el que fueron declaradas. Es por eso que si queremos que una variable sea global (que sea accesible desde cualquier lugar del proyecto) la declaramos en la pseudoclase :root que apunta al elemento más alto del DOM html pero tiene más especificidad que el selector de etiqueta. Te recomendamos esta presentación para que conozcas un poco más de las variables de CSS, este vídeo de Lea Verou y este artículo interesante.
Los filtros de CSS sirven para aplicar efectos gráficos como el desenfoque, escala de grises o cambio de color de un elemento, principalmente imágenes. Los filtros se usan comúnmente para ajustar la representación de imágenes, fondos y bordes. La sintaxis para usar esta propiedad es la siguiente: filter: [filter-function] en donde filter-function hace referencia a cualquiera de los filtros que existen actualmente, la lista completa la puedes encontrar en este link, W3C y en este artículo.
Lo primero que hicimos fue en nuestro HTML definir una imagen a la cual le vamos a aplicar losfiltros y unos inputs con el id correspondiente a la propiedad de filtro que vamos a utilizar, con los atributos min, max, step y value definimos consecutivamente el mínimo, el máximo, los saltos y el valor inicial del input (todos estos valores corresponden de acuerdo a los valores que recibe cada filtro según la documentación). En nuestro CSS definimos en el elemento raíz (:root) las variables que vamos a usar para cada uno de los filtros sin unidades de medida, seteamos los estilos del navegador y aplicamos otras propiedades para centrar la imagen y los inputs, lo importante acá es que a la clase de la imagen le estamos asignando en la propiedad filter cada uno de las funciones de filtros que vamos a usar, con sus respectivas variables de CSS. Por último en JavaScript, estamos seleccionando todos los inputs que tenemos en nuestro HTML y luego le añadimos el escuchador para el evento input, una vez ahí obtenemos el id y el valor del elemento que cambió, anteriormente habíamos seleccionado la imagen, entonces con la referencia de esa imagen lo que hacemos es decirle (image.style.setProperty(`--${id}`, value)), que a la propiedad con el id que estamos capturando la cambie por el valor que obtenemos (la propiedad corresponde a la variable de CSS).

Create your blend

"Mezclar componentes utilizando la propiedad mix-blend-mode, analizar los distintos resultados que se pueden lograr y la compatibilidad." — Francisco Iglesias

La propiedad CSS mix-blend-mode describe cómo el contenido de un elemento se mezclará con el elemento que está tras él. Con esta propiedad puedes mezclar imágenes o textos y se logra un efecto estilo Photoshop con los siguientes valores: mix-blend-mode: normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|difference|exclusion|hue|saturation|color|luminosity; Los efectos son muy variados y es mejor verlos y compararlos como puedes ver en este ejemplo de CSS Tricks.
Sin embargo, Frank nos mostró un efecto genial y muy práctico con esta propiedad que va más a allá de darle un efecto a una imagen. Se trata de cambiarle el color a un producto. Por ejemplo si tenemos un carro de color rojo con un fondo blanco, podremos cambiar el color del carro a azul, amarillo, verde, etc. No tendríamos que tomarle foto a cada color del producto. Solo necesitamos una foto y nuestra propiedad mix-blend-mode.
Lo primero que necesitamos es tener la imagen sobre fondo blanco. Sobre ella colocaremos un color y este elemento tendrá el mix-blend-mode: hue. Esté hará la magia de cambiar el color de nuestro producto. Si el elemento encima del nuestro carro es de color azul, el carro será azul gracias al valor HUE. Ahora, pensando en el cambio de colores de una manera más dinámica y que nos pueda servir, por ejemplo, para una tienda, vamos a agregar varios colores y mediante Javascript haremos que cuando el usuario haga clic sobre un color dado, el elemento sobrepuesto sobre el carro, cambie su color. Recuerda revisar la compatibilidad.

See the Pen Changing color car by Francisco Iglesias (@FrankIglesias) on CodePen.

Clip-path

"Análisis de la propiedad clip-path de CSS, mostrando sus distintas opciones y su compatibilidad." — Gabriel Zanzotti

Antes de entrar en detalles sobre esta propiedad es importante conocer que es el proceso de “clipping”. Clipping es una operación gráfica que nos permite parcial o completamentamente esconder porciones de un elemento, la porción del elemento que es mostrada o escondida son determinadas por los puntos de quiebre o paths del clipping que definamos. Una vez entendido esto, podemos definir la propiedad clip-path de CSS como una propiedad que crea una región de recorte que establece qué parte de un elemento debe mostrarse (se muestran las partes que están dentro de la región, mientras que las que están fuera están ocultas). Hace parte de las propiedades de enmascaramiento de CSS como la propiedad mask que vimos en el segundo ejercicio del We code. La sintaxis para usar esta propiedad es la siguiente: clip-path: [ clip-source ] | [ basic-shape ] | [ geometry-box ] | none en donde clip-source es la referencia a un clipPath de un elemento SVG que será usado como clip-path, basic-shape hace referencia a alguna de las funciones de clipping que nos provee CSS que son: inset(), circle(), ellipse() y polygon(). Comencemos explicando cada una, con inset() se puede definir un rectángulo interior y todo lo exterior se recortará. Esto facilita recortar efectivamente una imagen o un elemento directamente en el navegador. También puede hacer que el rectángulo se redondee con la palabra clave round y un valor de radio de borde, por ejemplo: clip-path: inset(20% 25% 20% 10%); cuyos valores corresponden a arriba, derecha, abajo e izquierda. Con circle() son definidos con la sintaxis circle(radius at posX posY) en donde el primer valor es el radio del círculo (por defecto es 50% 50%), por ejemplo: clip-path: circle(70% at 70% 20%); definimos una área en forma de círculo con un radio de 70% y que se mueva en X 70% y en Y 20%. Con ellipse() se comporta parecido a radius a diferencia de que en esta definimos la siguiente sintaxis: ellipse(radiusX radiusY at posX posY) agregando un radio de más y por tenemos polygon() en la cual podemos definir cualquier forma que queramos, la sintaxis para esta es la siguiente: clip-path: polygon(0% 20%, 20% 80%); le mandamos las coordenadas en X, Y en las que queremos empezar a realizar los cortes. Es importante mencionar que las unidades de medida que están en los ejemplos está con porcentajes, pero podemos usar píxeles, puntos, rems, ems, etc. Y por último tenemos geometry-box la cual es un poco compleja de explicar puedes conocer más en esta documentación de Mozilla. Puedes encontrar más documentación en este post y en este artículo de Codrops. En este ejercicio realizamos una página parecida a los posters que vimos en la fiesta de fin de año. En nuestro HTML tenemos definimos un h1 con la clase title con el contenido Wolox y luego definimos un div con la clase box y dentro de este otro elemento h1 con la clase box-title. En nuestro CSS tenemos las propiedades que normalmente vemos en el día a día, lo importante a mencionar es la clase .box en la que tenemos la propiedad clip-path: polygon(50px 0, 100% 0, 100% calc(100% - 50px), calc(100% - 50px) 100%, 0 100%, 0 51px); estos valores fueron sacados gracias a esta herramienta.

See the Pen We code: summer edition - CSS clip-path by Gabriel Zanzotti (@SKOLZ) on CodePen.

See the Pen Test - clip path by Henry Zarza (@HenryZarza) on CodePen.

See the Pen Fancy Slider by Murat Gürel (@murat-g-rel) on CodePen.

Comic con Grid

"CSS Grid con la propiedad clip-path para hacer un comic genial." — Henry Zarza

En este ejercicio continuamos repasando la propiedad clip-path junto con un poco de CSS grid para hacer un comic, la teoría importante a mencionar acá es que la propiedad clip-path es animable, pero para poder animarla tenemos que tener una regla de oro, siempre en cada uno de los pasos de nuestra animación los vértices o puntos de quiebre deben de ser iguales; es decir, si yo defino algo como esto: clip-path: polygon(50% 0%, 60% 40%, 100% 50%, 60% 60%); debo de tener en cuenta que en los steps de mi animación debo de tener 4 puntos de coordenadas para poder que funcione.
Ahora sí, explicando un poco el ejercicio que hicimos, en primera instancia en nuestro HTML definimos un div al cual le asignamos la clase content-comic y dentro de este creamos otros 4 divs cada uno con la clase item y en nuestro CSS a la clase .content-comic le agregamos algunas propiedades a destacar son: display: grid; grid-gap: 10px; grid-template-columns: repeat(2, 1fr); para decirle que ese elemento va a ser con el nuevo sistema de grillas de CSS, sino sabes que es CSS Grid puedes leerte este artículo en el cual lo explican muy bien, también la documentación de Mozilla y estos videos; la otra propiedad la usamos para especificar el espaciado que va a haber entre los elementos de la grilla y con la última propiedad le estamos diciendo que queremos 2 columnas. Luego en la clase .item definimos en la propiedad background los estilos generales que van a tener los items, para cada uno de los items definimos una imagen, luego le decimos a cada uno que ocupe 50 espacios a nivel de filas con la propiedad grid-row y con la propiedad grid-column le especificamos que ocupe 2 ó 1 espacio para las 2 columnas que tenemos, luego haciendo uso de la propiedad clip-path empezamos a recortar nuestros items para asemejarlos a los cortes que vemos en un comic normalmente (esto lo hicimos con esta herramienta) y por último es importante mencionar que cuando hicimos los recortes quedaron algunos espacios en blanco, para esto utilizamos márgenes negativos para cuadrar los elementos y que todo se viera estéticamente agradable. Te dejamos este link con una documentación bastante interesante acerca de clip-path.

See the Pen We code - Comic Grid and clip path by Henry Zarza (@HenryZarza) on CodePen.

Principios de animación

"Uso de la biblioteca anime.js para explicar los principios de las animaciones." — Gabriel Porras

En este ejercicio revisamos algunas de las buenas prácticas propuestas por Taras Skytskyi en su artículo “The ultimate guide to proper use of animation in UX” Inicialmente vimos la diferencia entre las animaciones de interfaz de usuario y las animaciones “autónomas”.
Luego vimos las formas de hacer animaciones en la web: via CSS y vía JavaScript. Se definió que las animaciones via CSS deberán ser siempre la primera opción, siempre y cuando, se necesiten funciones especiales, que las librerías de animación de JavaScript siempre tendrán. Posteriormente se hizo una corta presentación de la librería AnimeJS que se seleccionó para los ejemplos por su popularidad y livianeza. Finalmente se comenzaron a ver y aplicar con ejemplos 6 de las reglas definidas en al artículo:
1. Duración y velocidad de una animación en la web
2. Evitar el uso de rebotes y desenfocados
3. Velocidad cuando se animan elementos repetidos (cards, items de una lista…)
4. Cuándo usar una velocidad constante
5. Qué efecto usar cuando un elemento sale de la pantalla
6. Qué efecto usar cuando entra
También está este vídeo en el cual nos habla de los principios de animación y esta presentación.

See the Pen Anime.js - Example transform by Henry Zarza (@HenryZarza) on CodePen.

See the Pen Anime.js - Example Movement by Henry Zarza (@HenryZarza) on CodePen.

Micro interacción con mo.js

"Uso de la biblioteca mo.js para hacer una micro interacción como la de Instagram." — Henry Zarza

En este ejercicio vimos el uso de una biblioteca muy popular de JavaScript llamada mo.js esta biblioteca nos permite realizar micro interacciones y otras cosas geniales de una manera sencilla, su documentación es muy buena y la verdad es que tiene un gran potencial para ser explotado, lastimosamente su creador le dejo de dar soporte en diciembre del 2018, pero es tanta su importancia en la comunidad de desarrolladores que existe un proyecto para mantenerlo y hacerle mejoras. Pero antes de entrar en detalles con su implementación es pertinente explicar que es una micro interacción y de que se compone. Una micro interacción en el ámbito de UI (User Interface), es una animación que se realiza para dar feedback a los usuarios de una interacción que estos tuvieron con un componente de la interfaz. Es algo así como “las transiciones entre interacciones”; ya que esta acción se traduce como una transición en los elementos con los cuáles se está interactuando, aportando un significado a la interfaz que hace mejorar la experiencia de usuario y rompiendo con la estaticidad de esta. Hay que tener en cuenta algunos puntos esenciales a la hora de usar una micro interacción: Objetivo ¿Qué se pretende comunicar al usuario?, Accionador ¿Cuál es la interacción que la activa?, Focus ¿Dónde se centra la acción en la interfaz?, Duración ¿Cuánto tiene que durar la transición? y Velocidad ¿Cómo de rápida debe mostrarse?.
Ahora si entrando en materia, vamos a omitir la explicación del CSS y del HTML, porque son propiedades y elementos que usamos diariamente. Lo primero que debemos de hacer es importar la biblioteca, una vez hecho esto lo primero que tenemos es la creación de una forma con la sintaxis que nos dice la documentación, en este caso decidimos utilizar un corazón hecho con SVG y le dimos el nombre de heart, hacemos uso de la función addShape para añadir la forma, luego definimos las constantes que vamos a usar en nuestro JavaScript, lo próximo que hacemos es definir un círculo el cual será la onda roja que vemos cuando hacemos click en la foto, procedemos a enviarle un objeto con la configuración como nos dice la documentación en este artículo podrás encontrar información interesante también, lo siguiente que hacemos es definir una forma llamada burst la cual nos sirve para hacer un efecto de ráfaga; es decir, los puntos que se dispersan cuando hacemos click en la foto, el objeto de configuración que se le envía lo podemos encontrar en la documentación, lo importante a resaltar acá es la propiedad children mediante esta propiedad le especificamos los estilos y la forma que queremos para los elementos que van a estar presentes en la ráfaga, para más información podemos leer este artículo, por último añadimos un escuchador al evento click para la imagen, en este evento lo que hacemos es llamar al evento tune y replay de cada una de las formas que definimos anteriormente para mandarle las coordenadas en las que vamos a pintar nuestra forma (en nuestro caso las coordenadas donde le dimos click) y para indicarle que queremos que se pueda repetir esa animación. En este artículo hay un tutorial paso a paso y más completo del uso de esta biblioteca.

See the Pen We code - Mo.js by Henry Zarza (@HenryZarza) on CodePen.

Canvas

"Uso de canvas para hacer un tablero en el que se pueda pintar." — Henry Zarza

En este último ejercicio vimos algo llamado canvas el cual es un elemento de HTML que es usado para dibujar gráficos sobre la página web (definimos un lienzo o tablero y a partir de este podemos empezar a dibujar) comúnmente lo hacemos con JavaScript. Puede ser usado para dibujar gráficos, combinar fotos o crear simples y no tan simples animaciones. Para utilizar canvas tenemos que tener un entendimiento de HTML, JavaScript, algo de matemáticas y física (si leíste bien matemáticas y física, para algo nos tenían que servir aparte de atormentarnos la existencia en la universidad y en el colegio), es importante estas últimas porque vamos a estar trabajando por lo general en un plano 2D o 3D, vamos a simular el movimiento de elementos, calcular distancias entre puntos dinámicamente, etc. En fin todo depende de lo que quieras hacer y de lo que dejes volar tu imaginación, para que te sorprendas un poco con lo que puedes hacer con canvas, puedes mirar estos increíbles Codepens: Gravity points, Particle branches, Trail, Canvas bokeh generation, Abysm, Canvas fireworks, Particles y Color smoke.
Canvas es un tema bastante extenso de explicar (Henry se comprometió a dar una capacitación de este tema, mientras tanto puedes leer este tutorial de Mozilla), por lo tanto nos enfocaremos en las propiedades que usamos en el ejercicio que hicimos.
Primero en nuestro HTML definimos la etiqueta canvas con un id que llamamos draw, en nuestro CSS de manera global le asignamos unos estilos para que nuestro canvas ocupe todo el espacio de la pantalla disponible y en donde vamos a hacer la magia es en nuestro JavaScript, en la primera línea obtenemos con JavaScript el elemento con id draw luego obtenemos el contexto en el cual vamos a trabajar nuestro canvas (esto es supremamente importante, de omitir este paso el navegador no sabrá sobre cuál lienzo debe dibujar). Una vez hecho esto le asignamos el width y el height del tamaño de la actual pantalla, ahora vamos a ver con más detalle cada una de las propiedades de canvas que usamos.
Con StrokeStyle definimos el color de la línea, este color se lo podemos pasar con cualquiera de las notaciones de color que existen actualmente en CSS (nombre, hexadecimal, HSL, rgb y rgba). Algo importante es que para definir una línea lo hacemos como definimos una línea en el plano cartesiano; es decir, necesitamos un punto inicial y un punto final, esto lo hacemos con el método lineTo, de la siguiente manera: context.strokeStyle = "red"; context.lineTo(20, 20); context.lineTo(20, 100); con esto creamos una línea de color rojo que comienza en el punto (20, 20) y finaliza en el punto (20, 100), si queremos mover esta línea hacemos uso de otro método que se llama moveTo, por ejemplo: context.moveTo(20, 10) con esto le decimos que quiero que mueva la línea 20 puntos en X y 10 en Y, ahora queremos que los extremos de la línea tenga bordes redondeados, esto lo hacemos con la propiedad lineCap, esta propiedad recibe los parámetros butt (borde plano al final de cada línea), round (bordes redondeados al final) y square (bordes cuadrados al final), por ejemplo: context.lineCap = ‘round’ le estamos diciendo que la línea tendrá bordes redondeados al final, ahora queremos que nuestra línea sea más gruesa, esto lo hacemos con la propiedad lineWidth, por ejemplo context.lineWidth = 70 definimos una línea de grosor de 70 píxeles. Ahora vamos a crear dos líneas de la siguiente manera: context.lineJoin = "round"; context.moveTo(20, 20); context.lineTo(100, 50); context.lineTo(20, 100); lo importante a mencionar acá es la propiedad lineJoin mediante esta propiedad estamos indicando que cuando se cruzan las líneas como queremos el estilo de la intersección, recibe los valores de bevel (esquina biselada), round (esquina redondeada) y miter (esquina afilada).
Listo, esas serán las propiedades que necesitamos para nuestro ejercicio, retomando con nuestro JavaScript, lo siguiente que hacemos es suscribirnos los eventos mousedown, mousemove, mouseup,mouseout y dblclick, en los cuales hacemos consecutivamente cambiamos la variable isDrawing para indicarle que vamos a dibujar y asignamos la posición en X y en Y con las mismas coordenadas en la que estamos moviendo el mouse, en el siguiente llamamos a la función draw en esta validamos que se pueda dibujar en el canvas, luego asignamos el color HSL en el valor de HUE lo cambiamos y luego cuando llega a 360 lo volvemos a cambiar a 0, movemos la línea en las coordenadas de X y Y que asignamos anteriormente, pintamos la línea y aumentamos el grosor de la línea hasta 70 cuando llegamos a 70 lo reiniciamos a 1, en el siguiente evento mouseup y mouseout cambiamos el valor de la variable isDrawing in false para indicar que no vamos a seguir dibujando y en el último evento limpiamos el tablero del canvas haciendo uso de la función context.clearRect().

See the Pen We code - Canvas by Henry Zarza (@HenryZarza) on CodePen.

See the Pen Learning Canvas by Henry Zarza (@HenryZarza) on CodePen.

See the Pen Trace effect by Henry Zarza (@HenryZarza) on CodePen.