slide1

Alt1040. Noticias acerca de Internet, diseño, música, cine, opiniones, weblogs y medios

Es uno de los weblogs de tecnología más seguidos de la blogosfera hispana.

slide2

Bitelia. Blog de software, internet y servicios web

Software y aplicaciones para mejorar tu vida, guías de uso, trucos, listas, noticias y todo sobre tecnología.

slide3

Xataka. Publicación de noticias sobre gadgets y tecnología.

Últimas tecnologías en electrónica de consumo y novedades tecnológicas en móviles, tablets, informática, etc.

slide4

Wwwhatsnew. Aplicaciones, marketing y noticias en la web.

Servicios que os pueden ser útiles para dibujar, gestionar tareas, hacer amigos, encontrar restaurantes...

slide5

Fayerwayer. Discusiones y opiniones de lo ultimo en tecnología y gadgets

Con secciones dedicadas a Internet, Software o Redes Sociales es un referente a nivel de tecnología en español.

2 de marzo de 2022

Seguridad y Protección de Datos: política de escritorio despejado

shield icon
Una política de escritorio limpio o despejado es una forma sencilla de mantener la seguridad de tu empresa. En términos generales, implica eliminar cualquier información confidencial de tu escritorio o almacenarla de forma adecuada: memorias USB, portátiles, tarjetas de visita y documentos impresos, entre otros. Las sanciones por incumplimiento interno pueden variar desde advertencias hasta multas.


Tras la vuelta a la presencia física en oficinas, os recordamos algunos aspectos de la política de escritorio despejado que todos los empleados y empleadas deben cumplir.



Software


1- Tu PC portátil debe permanecer siempre con candado cuando abandones tu puesto de trabajo aunque se trate de un período corto de tiempo (pausa para el café o similar).

2- No esperes a que automáticamente se active el "salvapantallas" cuando no estés en tu puesto de trabajo.
Bloquea la pantalla con [Windows] + [L] y, similarmente, con [Ctrl] + [Alt] + [Supr] y guarda bajo llave los documentos confidenciales con los que estés trabajando.

Lleva contigo la PKI (Public Key Infrastructure) y la tarjeta identificativa de tu empresa corporativa (en adelante EC). Recuerda no llevar visible la tarjeta identificativa si estás fuera de las instalaciones de EC.

3- No tires información confidencial a la papelera, destruye la información en las trizadoras que se encuentran junto a las impresoras o, si se trata de grandes volúmenes, tíralos en los cubículos cerrados habilitados para información confidencial que después es destruida de forma segura por los proveedores de EC.

Se entiende por información confidencial, entre otras:

  • información que contiene datos personales.
  • datos relativos a ofertas y estrategia de la compañía.
  • informes de auditoría.
  • información específicamente clasificada como confidencial por clientes.
4- Está prohibido anotar contraseñas en post its, notas, agendas o similar que permitan fácil acceso a las mismas. No las compartas con nadie.

5- Si estás ubicado en un despacho o sala de reunión ciérralo con llave cuando salgas.

6- Si utilizas las pizarras en las salas de reuniones, borra la información escrita en ellas antes de abandonar la sala y no olvides la documentación o dispositivos (PC’s u otros que contengan información).

7- No utilices dispositivos personales extraíbles (smarthphone, disco duro, pen dirve, etc) para extraer información de tu compañía. Si se requiere utilizar estos dispositivos, deben estar autorizados y cifrados, siguiendo las políticas de EC.

8- Sé cuidadoso cuando hables por teléfono en la calle o en espacios de EC en relación con la información que comentas, no divulgues información confidencial de EC o sus clientes.

9- Evita dejar tu PC desatendido en el coche si tienes que hacer una parada de camino a casa, suele ser el caso más habitual de robo, incluso si lo metes en el maletero.

10- Mantente alerta sobre los correos de phishing e intentos de ingeniería social (suplantación de la personalidad).

Algunos de los intentos de fraude más recientes corresponden a suplantaciones de identidad de entidades públicas que supuestamente solicitan el envío de una factura correspondiente a un expediente de licitación.

Si observas información confidencial tirada en la papelera, sufres un robo de portátil, detectas actividad sospechosa en tu PC (fruto de un phishing, virus o similar) o cualquier otro tipo de incidente, por favor repórtalo a InfoSec, tu oficina de Seguridad de la Información.








8 de febrero de 2022

Programas que nos ayudan a gestionar nuestros negocios

Software Icon
Las nuevas tecnologías ofrecen muchas oportunidades de crecimiento y expansión en el entorno empresarial. El mundo digital ha revolucionado la forma en que las personas se comunican, interrelacionan y, también, en su modo de consumo. Además, en el entorno laboral, los programas de gestión suponen un importante avance, automatizando todo tipo de procesos para que puedan realizarse de forma ágil, sencilla y en el menor tiempo posible.


Las compañías deben adaptarse al medio digital para mantenerse competitivas y, además, moverse en un entorno cada día más rápido y variable. Nadie puede dudar a estas alturas del siglo XXI que los viejos y obsoletos sistemas mecánicos deben ser sustituidos por procesos automatizados.

Un software de gestion es una herramienta digital que hace más fácil la vida a los emprendedores, empresarios y profesionales autónomos a la hora de llevar todos los aspectos relacionados con su negocio.

Empresas de cualquier tamaño y sector, ya sean grandes corporaciones o pequeñas pymes, encuentran en las nuevas tecnologías muchos beneficios a la hora de gestionar sus negocios.

La instalación de los diferentes tipos de software de gestión empresarial es la clave para optimizar el tiempo y dedicarles más horas a otros aspectos de carácter estratégico.

Por otra parte, contar con toda la información actualizada, ordenada y clasificada, gracias a ese tipo de herramientas, será sumamente útil en la toma de decisiones decisivas sobre el rumbo del negocio.



Software


Tipos de softwares de gestión que toda empresa necesita


Aunque existe una amplia variedad de programas de gestión que ayudan con los diferentes aspectos empresariales de una organización, en este artículo se va a hacer especial mención a los que se consideran imprescindibles y hacen el día a día más fácil de prácticamente cualquier tipo de negocio.

Por ejemplo, los dos primeros que van a enumerarse son los de programas de contabilidad y facturación, esenciales para cualquier ecommerce, el tipo de empresa digital que más crece cada día.

Software de contabilidad


Los programas de contabilidad son esenciales para cualquier negocio, ofreciendo siempre información en tiempo real para ser analizada cuando sea necesario.

Las empresas necesitan este tipo de herramientas para llevar todo el proceso contable de forma ágil, fácil e integral ahorrando tiempo, pues las tareas se vuelven automáticas, presentando los documentos fiscales de la AEAT con un solo clic.

Para elegir un buen software de contabilidad, uno de los requisitos que debe cumplir es que sea escalable para adaptarse a las necesidades de cada empresa en cada momento, sea cual sea el volumen de datos que se manejen.

De este modo, el mismo programa le puede servir a una compañía a lo largo del tiempo, desde sus inicios, cuando cuenta con pocos clientes y proveedores, para ir adaptándose a sus etapas de desarrollo y expansión. Esta capacidad es sumamente importante para no tener que ir cambiando de programa a medida que la empresa crece.

Software de facturación


Como cabe suponer, la principal función de un programa de facturación es permitir facturar de forma rápida e intuitiva. En este sentido, ahorra una gran cantidad de tiempo automatizando estos procedimientos manuales y gestionando todo el proceso de forma global.

Un buen software de facturación debe ser eficaz y fácil de usar, además de aportar funcionalidades e información de valor añadido a las empresas, como datos sobre su salud financiera.

Así mismo, deben permitir el análisis del negocio para identificar necesidades, prioridades y evaluar soluciones. Por último, igual que en el caso anterior, deben ser escalables para que no sea necesario cambiar de programa cuando ya se está habituado a él.

Cabe destacar, en este sentido, las soluciones para ecommerce y cualquier otro modelo de empresa que permiten integrar los programas de facturación con la contabilidad, ahorrando tiempo en tareas de mecanización contable.

Software de nóminas


Los programas de nóminas son las soluciones de gestión laboral y RRHH para despachos profesionales y empresas.

Consiguen, en un entorno sencillo e intuitivo, ahorro de tiempo, la máxima productividad y flexibilidad, además de garantía de actualización legal y un potente motor de cálculo de nóminas.

Software fiscal


El software fiscal, por su parte, es el que se encarga de la presentación, de forma eficiente y segura, de los diferentes tipos de impuestos, tanto de las personas físicas (IRPF, Patrimonio, Sucesiones) como jurídicas (IVA e IS).

Colaboran directamente con la AEAT, de forma que se incorporan inmediatamente en su programa todas las novedades legales y los cambios en los modelos de gestión de los impuestos.

Además de la rapidez con la que incorporan los añadidos legales, cuentan con herramientas que facilitan la aplicación de la normativa fiscal y detectan a aquellos clientes que se ven afectados por dichos cambios.

Cabe destacar que se trata de una herramienta sumamente efectiva que ha sido desarrollada especialmente con el objetivo de desempeñar las labores fiscales en tiempo, y de la forma más ágil y sencilla posible.









31 de enero de 2022

Los papeles de Pandora, Python y el aprendizaje automático

Python Icon
A finales del año 2021 vieron la luz los papeles de Pandora, estos son un conjunto de aproximadamente 12 millones de documentos filtrados (unos 3 TeraBytes), que formaban parte de una investigación periodística. Provienen de una filtración de documentos confidenciales de 14 despachos de abogados especializados en la creación de sociedades en varios paraísos fiscales, entre ellos, Panamá, Islas Vírgenes Británicas o Bahamas.


A través de esta información se han puesto al descubierto las fortunas secretas de líderes mundiales, grandes empresarios, funcionarios públicos, y en general, multitud de evasores que se mantenían al margen de la ley.

Entre algunos personajes populares, destacan el presidente de Chile, el ex-director del FMI, el rey de Jordania, el primer ministro checo, o Tony Blair, o incluso estrellas del mundo del espectáculo como Julio Iglesias, Shakira, Claudia Schiffer o Pep Guardiola.

Todos estos datos vienen a exponer diversos sistemas que se usaban para evitar los controles fiscales sobre dichas fortunas, siendo la base para multitud de acusaciones de corrupción, lavado de dinero o evasión fiscal.

Los documentos incluyen datos de más de 5 décadas, aunque la mayoría se refieren a los últimos 20 años, e incluyen información sobre 30.000 beneficiarios.

Además de su gran volumen, eran de diversa procedencia, idioma y formato, documentos escritos a mano, hojas de cálculo, correos electrónicos, imágenes, ficheros PDF de más de 10.000 páginas, pasaportes, extractos bancarios, declaraciones de impuestos, contratos, ... Lo cual le añade complejidad a la hora de analizarlos y poder extraer conclusiones de los mismos.

El reto estaba en poder obtener resultados y sacar a la luz los secretos en un tiempo razonable. Y en eso Python y las últimas técnicas de aprendizaje automático tuvieron un papel crucial.


Machine Learning


Tan solo una pequeña fracción de dichos documentos, el 4%, estaban estructurados, es decir, contenían los datos organizados en tablas. Esos fueron los más simples de analizar, se organizaron por empresa, se eliminaron duplicados y se combinaron en un documento maestro, de esta manera todos los datos estaban juntos y su interpretación fue mucho más directa.

En otros archivos, como documentos escritos, archivos en formato PDF, ... se usó Python para automatizar la extracción y su posterior estructuración dentro de lo posible.

Pero para el resto de documentos, los casos más complejos, se usaron técnicas de Machine Learning o aprendizaje automático, a través de la librería Scikit-Learn de Python.

De esta manera, se identificaron, separaron y clasificaron formularios concretos de documentos mayores. Incluso muchos de estos formularios estaban escritos a mano, y se tuvieron que emplear técnicas de reconocimiento de escritura manual.

Cuando todos esos datos finalmente se pudieron estructurar, se generaron unas listas que vinculaban a los beneficiarios con las empresas, y posteriormente se usaron librerías de visualización de datos para crear modelos visuales e incluso poder realizar búsquedas sobre dichos datos.
De esta manera, los investigadores obtuvieron una herramienta que les permitía rastrear las conexiones entre personas y empresas a través de la maraña de documentos, y descubrir a los evasores.

En la Universidad Internacional de Valencia y de manera específica en el Curso Experto de Programación Python se estudia dicho lenguaje y las técnicas más populares de inteligencia artificial, como el aprendizaje automático, redes neuronales, ciencia de datos, automatización, ... Todas ellas disciplinas clave en la resolución del caso de los papeles de Pandora.


* Artículo de Iván Fuertes Torrecilla *


Iván Fuertes Torrecilla


Senior Render Engine & SDK Programmer for Augmented Reality at Wikitude




22 de enero de 2022

Introducción al uso de la API de Blogger v3

API Blogger
Una API o Interfaz de Programación de Aplicaciones (Application Programming Interface) es un protocolo que define cómo los dispositivos y las aplicaciones se comunican entre sí. Describe cómo los clientes que consumen las APIs pueden acceder a los recursos y qué métodos funcionan con su arquitectura.


A la hora de crear una API para la integración de software, el diseño REST (REpresentational State Transfer) destaca como el enfoque de arquitectura para el diseño de servicios web y se refiere al conjunto de reglas específicas que establecen como estos servicios se comunican a través de internet.

El estilo arquitectónico REST está compuesto por varios principios:

  • sin estado: las aplicaciones REST deben comunicarse con los recursos sin estado, es decir, no deben almacenar ningún contexto ni información de sesión.
  • separación cliente-servidor: la API se expone en un servidor y es consumida por clientes (apps, servicios).
  • sistema en capas: los componentes de los sistemas REST no deben poder ver más allá de su capa. Cada componente no debe influir en otro componente de la arquitectura.
  • cacheable: los datos del servidor REST deben marcarse como almacenables o no en caché. En caso afirmativo, el cliente puede reutilizar datos de la respuesta para solicitudes equivalentes posteriores.
  • interfaz uniforme: se hace hincapié en una interfaz uniforme entre los componentes (identificación y manipulación de recursos, hipermedia y mensajes autodescriptivos).

REST es independiente de cualquier protocolo subyacente y no está necesariamente unido a HTTP pero en las implementaciones más comunes de API REST, se usa HTTP como protocolo de aplicación.

De forma muy resumida, REST es un estilo arquitectónico y las API REST son servicios web que lo implementan.
Para complicar más las cosas, los desarrolladores llaman a una API HTTP que usa un estilo CRUD (Create, Read, Update, Delete) un servicio RESTful.

La API de Blogger v3 permite que las aplicaciones cliente vean y actualicen el contenido de Blogger. Tu aplicación cliente puede usar Blogger API v3 para crear nuevas publicaciones en tu blog, editar o eliminar publicaciones existentes y consultar publicaciones que coincidan con criterios concretos.

Cada solicitud que se envía a las APIs de Blogger debe identificar tu aplicación ante Google. Hay dos formas de identificar una aplicación: usando un token OAuth 2.0 (que también autoriza la solicitud) y/o usando la clave API de la aplicación.

  • si la solicitud requiere autorización (como una solicitud de datos privados de una persona), la aplicación debe proporcionar un token de OAuth 2.0 con la solicitud.
  • si la solicitud no requiere autorización (como una solicitud de datos públicos), la aplicación debe proporcionar una clave API o un token de OAuth 2.0, o ambos, la opción que consideres más conveniente.

Una vez que tengas una clave API, tu aplicación puede añadir el parámetro de consulta a todas las URL de solicitud con key=yourAPIKey

El formato específico para las URI de la API de Blogger es:
https://www.googleapis.com/blogger/v3/users/userId
https://www.googleapis.com/blogger/v3/users/self
https://www.googleapis.com/blogger/v3/users/userId/blogs
https://www.googleapis.com/blogger/v3/users/self/blogs
https://www.googleapis.com/blogger/v3/blogs/blogId
https://www.googleapis.com/blogger/v3/blogs/byurl
https://www.googleapis.com/blogger/v3/blogs/blogId/posts
https://www.googleapis.com/blogger/v3/blogs/blogId/posts/bypath
https://www.googleapis.com/blogger/v3/blogs/blogId/posts/search
https://www.googleapis.com/blogger/v3/blogs/blogId/posts/postId
https://www.googleapis.com/blogger/v3/blogs/blogId/posts/postId/comments
https://www.googleapis.com/blogger/v3/blogs/blogId/posts/postId/comments/commentId
https://www.googleapis.com/blogger/v3/blogs/blogId/pages
https://www.googleapis.com/blogger/v3/blogs/blogId/pages/pageId

Pongamos en práctica algunos métodos de la API de Blogger.

1- vamos a mostrar información del Blog usando la siguiente url:
https://www.googleapis.com/blogger/v3/blogs/byurl?url=https://www.tecnoblog.guru&key=yourAPIKey
<div id="api-blogger-v3" class="api-blogger-v3"></div>
<script>
function handleResponse1(response){
	document.getElementById("api-blogger-v3").innerHTML += "<div><a href='" + response.url + "' title='" + response.title + " target='_blank'>" + response.name + "</a></div><div>" + response.description + "</div><div>" + (response.published).substring(0,10) + "</div>";
}
</script>
<script async="true" defer="true" src="https://www.googleapis.com/blogger/v3/blogs/byurl?url=https://www.tecnoblog.guru&callback=handleResponse&key=yourAPIKey"></script>


2- ahora vamos a mostrar una lista con los cinco últimos post publicados en TecnoBlog invocando a la url:
https://www.googleapis.com/blogger/v3/blogs/blogId/posts
<div id="api-blogger-v3-2" class="api-blogger-v3"></div>
<script>
function handleResponse2(response){
  for(var i=0; i<5; i++){
	document.getElementById("api-blogger-v3-2").innerHTML += "<div><a href='" + response.items[i].url + "' title='" + response.items[i].title + " target='_blank'>" + response.items[i].title + "</a></div>" + (response.items[i].published).substring(0,10) + "<br/>" + "<div class='article'><em>" + response.items[i].content.substr(0,840) + "...</em></div><hr/>";
  }
}
</script>
<script async="async" defer="defer" src="https://www.googleapis.com/blogger/v3/blogs/5415513870832441455/posts?callback=handleResponse2&key=yourAPIKey"></script>


3- por último, vamos a mostrar cinco artículos publicados en la categoría "ciberseguridad" llamando a la siguiente url con el parámetro 'q' como etiqueta a buscar:
https://www.googleapis.com/blogger/v3/blogs/5415513870832441455/posts/search?q=ciberseguridad&callback=handleResponse&key=yourAPIKey
<div id="api-blogger-v3-3" class="api-blogger-v3"></div>
<script>
function handleResponse3(response) {
  for(var i=0; i<5; i++) {
	document.getElementById("api-blogger-v3-3").innerHTML += "<div><a href='" + response.items[i].url + "' title='" + response.items[i].title + " target='_blank'>" + response.items[i].title + "</a></div>" + (response.items[i].published).substring(0,10) + "<br/>" + "<div class='article'><em>" + response.items[i].content.substr(0,840) + "...</em></div><hr/>";
  }
}
</script>
<script async="async" defer="defer" src="https://www.googleapis.com/blogger/v3/blogs/5415513870832441455/posts/search?q=ciberseguridad&callback=handleResponse3&key=yourAPIKey"></script>



11 de diciembre de 2021

Introducción a la automatización robótica de procesos (RPA)

Robotic Process Automation
Con un número creciente de empresas que tratan de optimizar sus estrategias de transformación digital, se ha producido un aumento en la adopción del sistema RPA (Robotic Process Automation) para automatizar los procesos administrativos. Esto ha llevado a un crecimiento exponencial en el mercado global de RPA que ya estaba valorado en $1.4B en 2019 y se espera que alcance los $11B en 2027.


La pandemia de COVID-19 ha llevado a muchas empresas a adoptar tecnologías de computación en la nube y trabajo remoto. Además, los equipos de TI se han visto presionados para reducir la carga de trabajo y los costos operativos.

Una encuesta reciente reveló que las empresas están aumentando el uso de RPA aproximadamente un 5% para:

- reducir los costos extraordinarios al automatizar las tareas operativas y de back office, como los procesos de TI basados en reglas, las actualizaciones del sistema o la incorporación de nuevas contrataciones.

- apoyar a la fuerza de trabajo remota, por ejemplo, automatizando la recopilación de datos de múltiples fuentes para la generación de informes.


RPA


¿Qué es la automatización robótica de procesos?


Es una tecnología que imita e integra las interacciones de los usuarios humanos con las aplicaciones o sistemas informáticos, automatizando los procesos de trabajo de la misma manera que lo haría un usuario.

Estos robots son entrenados para seguir unas instrucciones específicas y ejecutar ciertas tareas, tareas como por ejemplo cuando un usuario tiene que acceder a un correo electrónico o a un directorio compartido y extraer 'x' ficheros para realizar ciertas modificaciones o verificaciones dentro de estos ficheros.

Una vez finalizadas estas tareas, tiene que compartir estos ficheros a través de una plataforma web o un repositorio común.
El robot podría hacer estas mismas tareas del mismo modo que las gestiona un usuario humano.

¿Qué ventajas tiene el uso de RPA?


Son numerosas las ventajas del rpa, destacando la agilidad operacional puesto que un robot es cinco veces más rápido que una persona.

Son herramientas que monitorizan la ejecución completa del robot, por lo tanto desde el punto de vista de auditoría, son herramientas bastante seguras.

Se trata de herramientas no invasivas ya que interactúan con la interfaz permitiendo atacar a la mayoría de las aplicaciones.

Tambien son herramientas muy escalables, muy precisas y que trabajan de forma continua (24x7 los 365 días del año) por lo que van a estar siempre disponibles.

Por otro lado permiten que las personas se enfoquen en el talento ya que el objetivo es aportar valor en las empresas y no realizar tareas repetitivas que no generen ningún tipo de valor añadido.

Además, son herramientas con un ROI muy elevado ya que existe una rápida recuperación de la inversión con perídos de payback inferiores a un año.

¿Qué tipos de procesos son candidatos a ser robotizados o automatizados?


Siempre se busca un patrón con una serie de características como por ejemplo que los procesos sean estándar, es decir, que no tengan ambiguedad y que estén procedimentados.

También es necesario que estos procesos estén basados en reglas ya que tenemos que entrenar al robot y decirle cuales son los pasos que tienen que seguir para ejecutar estas tareas.

Tienen que ser procesos con datos electrónicos cuyo formato siempre sea digital. Procesos en los que el tiempo de ejecución sea mejorable, procesos repetitivos, procesos desarrollados en sistemas estables y procesos que ya sean maduros, estén en funcionamiento y bien definidos.

En RR.HH. podrían ocuparse de:

  • verificación del historial del empleado
  • gestión de viajes y gastos
  • gestión de asistencia
  • gestión de nóminas
  • gestionar los datos de los empleados
  • añadir datos para revisiones de desempeño
  • gestionar la baja de los empleados

En el departamento financiero:

  • automatización de nóminas
  • preparar informes financieros
  • mantenimiento de registros

En el departamento de TI:

  • descargar software con licencia
  • instalar y actualizar software disponible en servidores preasignados y máquinas de usuarios
  • monitorizar y guardar datos de rendimiento de un servidor
  • automatizar notificaciones de problemas en un servidor o tiempos de inactividad
  • automatizar copias de seguridad
  • sincronizar, eliminar y vaciar carpetas




7 de diciembre de 2021

Cuenta atrás para la Navidad

Christmas Icon
TecnoBlog les desea a todos sus lectores Feliz Navidad con esta animación realizada con jQuery. Si lo deseas, puedes descargar y modificar el ejemplo para añadirlo a tu página web siguiendo las instrucciones detalladas más abajo.
(Fuente: https://codepen.io/JorgeAguilar/).





Para componer la animación, tendrás que incorporar código html, adaptar los estilos correspondientes importando la fuente de Google Mountains of Christmas con tres imágenes de fondo y código javascript con la librería jQuery.

Código HTML
<section class="countdownSection">
  <div class="decorations">
    <div class="decoration" data-pos="bottom left"></div>
    <div class="decoration" data-pos="top right"></div>
    <div class="snow"></div>
    <div class="santaWrapper">
      <div class="santa">
        <div class="hat">
          <div></div>
          <div></div>
        </div>
        <div class="face">
          <div class="eyeBrows left"></div>
          <div class="eyeBrows right"></div>
          <div class="eye left"></div>
          <div class="eye right"></div>
          <div class="nose"></div>
          <div class="cheek left"></div>
          <div class="cheek right"></div>
          <div class="beard">
            <div></div>
            <div></div>
            <div></div>
          </div>
        </div>
        <div class="body">
          <div class="sweater"></div>
          <div class="hand left">
            <div class="inner"></div>
          </div>
          <div class="hand right"></div>
        </div>
      </div>
      <div class="rope"></div>
      <div class="rope back"></div>
      <div class="sled"></div>
      <div class="reindeer">
        <div class="face">
          <div class="ear"></div>
          <div class="horn right"></div>
          <div class="horn left"></div>
        </div>
        <div class="body">
          <div class="foot front">
            <div class="inner">
              <div class="extension"></div>
            </div>
          </div>
          <div class="foot back">
            <div class="inner">
              <div class="extension"></div>
            </div>
          </div>
          <div class="tail"></div>
        </div>
      </div>
      <div class="reindeer second">
        <div class="rope"></div>
        <div class="face">
          <div class="ear"></div>
          <div class="horn right"></div>
          <div class="horn left"></div>
        </div>
        <div class="body">
          <div class="foot front">
            <div class="inner">
              <div class="extension"></div>
            </div>
          </div>
          <div class="foot back">
            <div class="inner">
              <div class="extension"></div>
            </div>
          </div>
          <div class="tail"></div>
        </div>
      </div>
    </div>
  </div>
  <div class="container">
    <div class="counterWrapper">
      <p>Sólo quedan ...</p>
      <div class="countdown"></div>
      <p>para Navidad</p>
    </div>
  </div>
</section>

Código CSS
<style>
@import url("https://fonts.googleapis.com/css2?family=Mountains+of+Christmas:wght@700&display=swap");
@keyframes santa__mov {
  0%, 100% {
    bottom: 0;
    left: 0;
    transform: translateX(-100%) rotate(-10deg);
  }
  30% {
    bottom: 100%;
    left: 100%;
    transform: translateX(100%) rotate(-10deg);
  }
  40% {
    bottom: 0;
    left: 100%;
    transform: translateX(100%) rotateY(180deg);
  }
  70% {
    bottom: 0;
    left: 0;
    transform: translateX(-100%) rotateY(180deg);
  }
}
@keyframes santa__hand-left {
  0% {
    transform: rotate(15deg);
  }
  100% {
    transform: rotate(-30deg);
  }
}
@keyframes santa__hand-right {
  0% {
    transform: rotate(15deg);
  }
  100% {
    transform: rotate(-6deg);
  }
}
@keyframes rope__left {
  0% {
    transform: rotate(2deg);
  }
  100% {
    transform: rotate(5deg);
  }
}
@keyframes rope__right {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(-4deg);
  }
}
@keyframes rope__inner {
  0% {
    transform: rotate(-15deg);
  }
  100% {
    transform: rotate(-15deg) translateY(3px);
  }
}
@keyframes reindeer__leg-front {
  0% {
    transform: rotate(-24deg);
  }
  100% {
    transform: rotate(-13deg);
  }
}
@keyframes reindeer__leg-front-extension {
  0% {
    transform: rotate(131deg);
  }
  100% {
    transform: rotate(0);
  }
}
@keyframes reindeer__leg-back {
  0% {
    transform: rotate(-73deg);
  }
  100% {
    transform: rotate(-95deg);
  }
}
@keyframes reindeer__leg-back-extension {
  0% {
    top: 4px;
    left: -4px;
    transform: rotate(50deg);
  }
  100% {
    top: 0;
    left: 0;
    transform: rotate(0);
  }
}
@keyframes snow {
  0% {
    fill-opacity: 1;
  }
  100% {
    fill-opacity: 0;
    transform: translateY(50%);
  }
}
body {
  overflow-x: hidden;
  color: #fff;
  margin: 0 auto;
  background-color: #005b38;
}
body * {
  font-family: "Mountains of Christmas", cursive;
}
body p, body h1, body h2, body h3, body h4, body h5, body h6 {
  margin: 0;
}
body a {
  color: #fff;
  text-decoration: none;
}
body ul, body li {
  padding: 0;
  margin: 0;
  list-style-type: none;
}
.countdownSection {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  align-content: center;
  width: 100%;
  min-height: 100vh;
  box-sizing: border-box;
  position: relative;
  overflow: hidden;
}
.countdownSection:before, .countdownSection:after {
  content: "";
  position: absolute;
}
.countdownSection:before {
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: radial-gradient(rgba(255, 255, 255, 0.3), transparent);
  pointer-events: none;
}
.countdownSection:after {
  width: 90%;
  height: 90%;
  /*border: 1px solid rgba(255, 255, 255, 0.1);*/
}
.countdownSection .decorations {
  pointer-events: none;
}
.countdownSection .decorations .decoration {
  background-image: url("https://1.bp.blogspot.com/-09R6SpYy5r4/Ya9Utjdp4_I/AAAAAAAAGKQ/Tfki5OHHtrAcQceK8O4A4HVt0TU3JDiLgCNcBGAsYHQ/s0/decoration.png");
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  position: absolute;
  width: 500px;
  height: 500px;
  filter: blur(3px);
  z-index: 1;
}
.countdownSection .decorations .decoration[data-pos="top left"] {
  top: 0;
  left: 0;
  transform: rotate(90deg);
}
.countdownSection .decorations .decoration[data-pos="top right"] {
  top: 0;
  right: 0;
  transform: rotate(180deg);
}
.countdownSection .decorations .decoration[data-pos="bottom left"] {
  bottom: 0;
  left: 0;
}
.countdownSection .decorations .decoration[data-pos="bottom right"] {
  bottom: 0;
  right: 0;
  transform: rotate(-90deg);
}
.countdownSection .decorations .snow {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
}
.countdownSection .decorations .snow .particle {
  fill: #fff;
  animation: snow 5s ease-out infinite;
}
.countdownSection .decorations .snow .particle:nth-child(2n) {
  animation-delay: 1.5s;
}
.countdownSection .decorations .snow .particle:nth-child(3n) {
  animation-delay: 2.5s;
  animation-duration: 5.3s;
}
.countdownSection .decorations .snow .particle:nth-child(4n) {
  animation-delay: 1s;
  animation-duration: 5.2s;
}
.countdownSection .decorations .snow .particle:nth-child(5n) {
  animation-delay: 3s;
}
.countdownSection .decorations .santaWrapper {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 430px;
  height: 155px;
  transform: translateX(-100%);
  animation: santa__mov 15s linear infinite;
}
.countdownSection .decorations .santaWrapper .santa {
  position: absolute;
  left: 0;
  bottom: 0;
  width: 125px;
  height: 107px;
  z-index: 10;
  transform: rotateY(180deg);
}
.countdownSection .decorations .santaWrapper .santa:before, .countdownSection .decorations .santaWrapper .santa:after {
  content: "";
  position: absolute;
  bottom: 0;
  background-color: #520d0d;
}
.countdownSection .decorations .santaWrapper .santa:before {
  left: -10px;
  width: 126px;
  height: 30px;
  border-radius: 10px 50% 10px 50%;
  transform: rotate(0);
  z-index: 10;
}
.countdownSection .decorations .santaWrapper .santa:after {
  left: 70px;
  width: 50px;
  height: 53px;
  border-radius: 50% 10px 22px 10px;
  transform: rotate(8deg);
}
.countdownSection .decorations .santaWrapper .santa .hat > * {
  position: absolute;
  top: 7px;
  left: 31px;
  width: 43px;
  height: 58px;
  border-radius: 50%;
  transform: rotate(28deg);
  background-color: #d63527;
}
.countdownSection .decorations .santaWrapper .santa .hat > *:nth-child(1):before, .countdownSection .decorations .santaWrapper .santa .hat > *:nth-child(1):after {
  content: "";
  position: absolute;
}
.countdownSection .decorations .santaWrapper .santa .hat > *:nth-child(1):before {
  top: 9px;
  left: 45px;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background-color: #fff;
}
.countdownSection .decorations .santaWrapper .santa .hat > *:nth-child(1):after {
  top: 3px;
  left: 19px;
  width: 30px;
  height: 7px;
  border-radius: 50%;
  transform: rotate(22deg);
  background-color: #d63527;
}
.countdownSection .decorations .santaWrapper .santa .hat > *:nth-child(2) {
  position: absolute;
  top: 18px;
  left: 31px;
  width: 44px;
  height: 34px;
  border-radius: 50%;
  transform: rotate(12deg);
  background-color: #fff;
}
.countdownSection .decorations .santaWrapper .santa .face {
  position: absolute;
  top: 25px;
  left: 37px;
  width: 31px;
  height: 17px;
  border-radius: 20px 20px 50% 50%;
  transform: rotate(10deg);
  background-color: #fde2b7;
  z-index: 10;
}
.countdownSection .decorations .santaWrapper .santa .face .eyeBrows {
  position: absolute;
  top: 0;
  left: 0;
  width: 2px;
  height: 7px;
  border-radius: 50%;
  background-color: #fff;
}
.countdownSection .decorations .santaWrapper .santa .face .eyeBrows.left {
  top: 2px;
  left: 22px;
  transform: rotate(-65deg);
}
.countdownSection .decorations .santaWrapper .santa .face .eyeBrows.right {
  top: 1px;
  left: 4px;
  transform: rotate(65deg);
}
.countdownSection .decorations .santaWrapper .santa .face .eye {
  position: absolute;
  top: 8px;
  left: 2px;
  width: 3px;
  height: 4px;
  border-radius: 50%;
  background-color: #000;
}
.countdownSection .decorations .santaWrapper .santa .face .eye.left {
  top: 8px;
  left: 2px;
}
.countdownSection .decorations .santaWrapper .santa .face .eye.right {
  top: 8px;
  left: 20px;
}
.countdownSection .decorations .santaWrapper .santa .face .nose {
  position: absolute;
  top: 10px;
  left: 6px;
  width: 12px;
  height: 9px;
  border-radius: 50%;
  z-index: 10;
  background-color: #f7d194;
}
.countdownSection .decorations .santaWrapper .santa .face .cheek {
  position: absolute;
  top: 10px;
  left: 6px;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  z-index: 10;
  background-color: #f4cfe3;
}
.countdownSection .decorations .santaWrapper .santa .face .cheek.left {
  top: 12px;
  left: -3px;
}
.countdownSection .decorations .santaWrapper .santa .face .cheek.right {
  top: 13px;
  left: 22px;
}
.countdownSection .decorations .santaWrapper .santa .face .beard > * {
  position: absolute;
  top: 8px;
  left: -14px;
  width: 15px;
  height: 17px;
  border-radius: 50%;
  background-color: #fff;
}
.countdownSection .decorations .santaWrapper .santa .face .beard > *:before, .countdownSection .decorations .santaWrapper .santa .face .beard > *:after {
  content: "";
  position: absolute;
  background-color: #fff;
}
.countdownSection .decorations .santaWrapper .santa .face .beard > *:before {
  top: 12px;
  left: 1px;
  width: 15px;
  height: 17px;
  border-radius: 50%;
}
.countdownSection .decorations .santaWrapper .santa .face .beard > *:nth-child(2) {
  top: 16px;
  left: -8px;
  width: 26px;
  height: 30px;
}
.countdownSection .decorations .santaWrapper .santa .face .beard > *:nth-child(2):before {
  top: 16px;
  left: 13px;
  width: 19px;
  height: 17px;
}
.countdownSection .decorations .santaWrapper .santa .face .beard > *:nth-child(2):after {
  top: 1px;
  left: 13px;
  width: 19px;
  height: 17px;
}
.countdownSection .decorations .santaWrapper .santa .face .beard > *:nth-child(3) {
  top: 16px;
  left: 14px;
  width: 27px;
  height: 28px;
}
.countdownSection .decorations .santaWrapper .santa .face .beard > *:nth-child(3):before {
  top: -4px;
  left: 13px;
  width: 17px;
  height: 17px;
}
.countdownSection .decorations .santaWrapper .santa .body {
  position: absolute;
  top: 54px;
  left: 16px;
  width: 88px;
  height: 53px;
}
.countdownSection .decorations .santaWrapper .santa .body:before {
  content: "";
  position: absolute;
  top: -23px;
  right: -10px;
  width: 53px;
  height: 51px;
  border-radius: 42% 50%;
  background-color: #f3f0f0;
  z-index: -1;
}
.countdownSection .decorations .santaWrapper .santa .body .sweater {
  top: -3px;
  left: 10px;
  position: absolute;
  width: 45px;
  height: 39px;
  border-radius: 50% 50% 10% 10%;
  background-color: #d63527;
  z-index: 5;
}
.countdownSection .decorations .santaWrapper .santa .body .sweater:before {
  content: "";
  top: 28px;
  left: 0px;
  position: absolute;
  width: 45px;
  height: 5px;
  background-color: #000;
  transform: rotate(1deg);
}
.countdownSection .decorations .santaWrapper .santa .body .sweater:after {
  content: "";
  top: 27px;
  left: 10px;
  position: absolute;
  width: 7px;
  height: 5px;
  background-color: #000;
  border: 1px solid #fff;
  border-radius: 3px;
  transform: rotate(1deg);
}
.countdownSection .decorations .santaWrapper .santa .body .hand {
  position: absolute;
}
.countdownSection .decorations .santaWrapper .santa .body .hand.left {
  top: 5px;
  left: 19px;
  width: 33px;
  height: 30px;
  overflow: hidden;
}
.countdownSection .decorations .santaWrapper .santa .body .hand.left .inner {
  position: absolute;
  top: 10px;
  left: 8px;
  width: 49px;
  z-index: 100;
  height: 7px;
  border-radius: 10px;
  transform: rotate(12deg);
  background-color: #d63527;
  animation: santa__hand-right 0.3s linear alternate infinite;
}
.countdownSection .decorations .santaWrapper .santa .body .hand.left .inner:before {
  content: "";
  position: absolute;
  width: 8px;
  height: 7px;
  top: -2px;
  left: -6px;
  background-color: #000;
  border-radius: 50%;
  transform: rotate(25deg);
}
.countdownSection .decorations .santaWrapper .santa .body .hand.right {
  top: 4px;
  left: 3px;
  width: 11px;
  height: 7px;
  border-radius: 10px;
  background-color: #d63527;
  transform: rotate(25deg);
  animation: santa__hand-left 0.3s linear alternate infinite;
}
.countdownSection .decorations .santaWrapper .santa .body .hand.right:before {
  content: "";
  position: absolute;
  width: 8px;
  height: 7px;
  top: -2px;
  left: -6px;
  background-color: #000;
  border-radius: 50%;
  transform: rotate(10deg);
}
.countdownSection .decorations .santaWrapper .rope {
  position: absolute;
  top: 92px;
  left: 84px;
  width: 182px;
  height: 33px;
  overflow: hidden;
  z-index: 10;
  transform: rotate(0deg);
  transform-origin: bottom right;
  animation: rope__right 0.3s linear alternate infinite;
}
.countdownSection .decorations .santaWrapper .rope.back {
  top: 85px;
  left: 105px;
  width: 149px;
  transform: rotate(4deg);
  z-index: 0;
  transform-origin: top left;
  animation: rope__left 0.3s linear alternate infinite;
}
.countdownSection .decorations .santaWrapper .rope:after {
  content: "";
  position: absolute;
  bottom: 0;
  left: -12px;
  width: 100%;
  height: 48px;
  border-bottom: 1px solid #fff;
  border-radius: 50%;
}
.countdownSection .decorations .santaWrapper .sled {
  position: absolute;
  bottom: -12px;
  left: 0px;
  width: 145px;
  height: 11px;
  transform: rotate(-3deg);
  border-bottom: 5px solid #690e00;
  border-right: 5px solid #690e00;
  border-radius: 10px;
  z-index: 10;
}
.countdownSection .decorations .santaWrapper .sled:before, .countdownSection .decorations .santaWrapper .sled:after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  width: 5px;
  height: 5px;
  background-color: #690e00;
}
.countdownSection .decorations .santaWrapper .sled:before {
  top: 2px;
  left: 34px;
  height: 9px;
}
.countdownSection .decorations .santaWrapper .sled:after {
  top: 3px;
  left: 108px;
  width: 5px;
  height: 8px;
}
.countdownSection .decorations .santaWrapper .reindeer {
  position: absolute;
  width: 115px;
  height: 155px;
  top: 50px;
  right: 0;
  transform: rotate(14deg) translateX(calc(-100% - 30px));
  z-index: 0;
}
.countdownSection .decorations .santaWrapper .reindeer.second {
  top: 0;
  transform: rotate(14deg);
}
.countdownSection .decorations .santaWrapper .reindeer.second .rope {
  top: 70px;
  left: -55px;
  width: 155px;
  transform: rotate(-15deg);
  animation: rope__inner 0.3s linear alternate infinite;
}
.countdownSection .decorations .santaWrapper .reindeer:before {
  content: "";
  position: absolute;
  top: 65px;
  left: 76px;
  width: 8px;
  height: 31px;
  background-color: #520d0d;
  z-index: 10;
  transform: rotate(-55deg);
}
.countdownSection .decorations .santaWrapper .reindeer:after {
  content: "";
  position: absolute;
}
.countdownSection .decorations .santaWrapper .reindeer .face {
  position: absolute;
  width: 30px;
  height: 22px;
  top: 44px;
  left: 72px;
  border-radius: 10px 10px 50% 50%;
  transform: rotate(-3deg);
  background-color: #cca58b;
}
.countdownSection .decorations .santaWrapper .reindeer .face:before {
  content: "";
  position: absolute;
  background-color: #cca58b;
  width: 29px;
  height: 16px;
  border-radius: 50%;
  top: 0px;
  left: 11px;
  transform: rotate(-49deg);
}
.countdownSection .decorations .santaWrapper .reindeer .face:after {
  content: "";
  position: absolute;
  background-color: #000;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  top: -8px;
  left: 31px;
}
.countdownSection .decorations .santaWrapper .reindeer .face .ear {
  position: absolute;
  width: 21px;
  height: 11px;
  top: 4px;
  left: -18px;
  border-radius: 4px 0 50% 50%;
  transform: rotate(4deg);
  background-color: #cca58b;
}
.countdownSection .decorations .santaWrapper .reindeer .face .ear:before {
  content: "";
  position: absolute;
  top: -2px;
  left: 34px;
  width: 4px;
  height: 5px;
  border-radius: 50%;
  transform: rotate(-35deg);
  background-color: #000;
}
.countdownSection .decorations .santaWrapper .reindeer .face .horn {
  position: absolute;
  width: 29px;
  height: 4px;
  top: -7px;
  left: -21px;
  border-radius: 2px;
  transform: rotate(38deg);
  background-color: #f0dbc2;
}
.countdownSection .decorations .santaWrapper .reindeer .face .horn:before, .countdownSection .decorations .santaWrapper .reindeer .face .horn:after {
  content: "";
  position: absolute;
  background-color: #f0dbc2;
  border-radius: 2px;
}
.countdownSection .decorations .santaWrapper .reindeer .face .horn.left {
  top: -7px;
  left: -21px;
}
.countdownSection .decorations .santaWrapper .reindeer .face .horn.left:before {
  top: -4px;
  left: 6px;
  width: 14px;
  height: 4px;
  transform: rotate(43deg);
}
.countdownSection .decorations .santaWrapper .reindeer .face .horn.left:after {
  top: -4px;
  left: 13px;
  width: 14px;
  height: 4px;
  -webkit-transform: rotate(43deg);
  transform: rotate(53deg);
}
.countdownSection .decorations .santaWrapper .reindeer .face .horn.right {
  top: -12px;
  left: -6px;
  width: 24px;
  transform: rotate(62deg);
}
.countdownSection .decorations .santaWrapper .reindeer .face .horn.right:before {
  top: -3px;
  left: 5px;
  width: 10px;
  height: 4px;
  transform: rotate(43deg);
}
.countdownSection .decorations .santaWrapper .reindeer .face .horn.right:after {
  top: -3px;
  left: 11px;
  width: 10px;
  height: 4px;
  transform: rotate(53deg);
}
.countdownSection .decorations .santaWrapper .reindeer .body {
  position: absolute;
  width: 58px;
  height: 31px;
  top: 84px;
  left: 28px;
  border-radius: 50% 0;
  transform: rotate(-3deg);
  background-color: #cca58b;
}
.countdownSection .decorations .santaWrapper .reindeer .body:before {
  content: "";
  position: absolute;
  width: 46px;
  height: 26px;
  top: -15px;
  left: 32px;
  border-radius: 0 0 50% 50%;
  -webkit-transform: rotate(-3deg);
  transform: rotate(-55deg);
  background-color: #cca58b;
}
.countdownSection .decorations .santaWrapper .reindeer .body:after {
  content: "";
  position: absolute;
  width: 43px;
  height: 26px;
  top: -11px;
  left: 29px;
  border-radius: 0 0 50% 50%;
  -webkit-transform: rotate(-3deg);
  transform: rotate(-30deg);
  background-color: #cca58b;
}
.countdownSection .decorations .santaWrapper .reindeer .body .foot.front .inner {
  position: absolute;
  width: 40px;
  height: 8px;
  top: 13px;
  left: 35px;
  border-radius: 0 50%;
  transform: rotate(-17deg);
  background-color: #cca58b;
  animation: reindeer__leg-front 0.3s linear alternate infinite;
}
.countdownSection .decorations .santaWrapper .reindeer .body .foot.front .inner .extension {
  position: absolute;
  width: 28px;
  height: 8px;
  top: 3px;
  left: 100%;
  border-radius: 2px 50%;
  transform: rotate(131deg);
  background-color: #cca58b;
  transform-origin: top left;
  animation: reindeer__leg-front-extension 0.2s linear alternate infinite;
}
.countdownSection .decorations .santaWrapper .reindeer .body .foot.front .inner .extension:after {
  content: "";
  position: absolute;
  top: 0;
  right: -2px;
  width: 7px;
  height: 8px;
  border-radius: 2px;
  background-color: #000;
}
.countdownSection .decorations .santaWrapper .reindeer .body .foot.back .inner {
  position: absolute;
  width: 56px;
  height: 9px;
  top: 37px;
  left: -29px;
  border-radius: 0 50%;
  transform: rotate(-73deg);
  animation: reindeer__leg-back 0.3s linear alternate infinite;
}
.countdownSection .decorations .santaWrapper .reindeer .body .foot.back .inner:before {
  content: "";
  position: absolute;
  width: 25px;
  height: 16px;
  top: 4px;
  left: 25px;
  border-radius: 0 50%;
  transform: rotate(15deg);
  background-color: #cca58b;
}
.countdownSection .decorations .santaWrapper .reindeer .body .foot.back .inner:after {
  content: "";
  position: absolute;
  right: 0;
  width: 65%;
  height: 100%;
  background-color: #cca58b;
}
.countdownSection .decorations .santaWrapper .reindeer .body .foot.back .inner .extension {
  position: absolute;
  top: 0;
  left: 0;
  width: 28px;
  height: 8px;
  background: #cca58b;
  border-radius: 2px 50%;
  transform-origin: top right;
  animation: reindeer__leg-back-extension 0.2s linear alternate infinite;
}
.countdownSection .decorations .santaWrapper .reindeer .body .foot.back .inner .extension:after {
  content: "";
  position: absolute;
  width: 8px;
  height: 9px;
  top: -2px;
  left: -2px;
  border-radius: 2px 0 2px 2px;
  transform: rotate(14deg);
  background-color: #000;
}
.countdownSection .decorations .santaWrapper .reindeer .body .tail {
  position: absolute;
  width: 27px;
  height: 26px;
  top: 6px;
  left: -8px;
  border-radius: 50% 2px;
  transform: rotate(-17deg);
  background-color: #cca58b;
}
.countdownSection .decorations .santaWrapper .reindeer .body .tail:before {
  content: "";
  position: absolute;
  background-color: #cca58b;
  border-radius: 50%;
  top: -2px;
  left: -3px;
  width: 15px;
  height: 5px;
  transform: rotate(25deg);
}
.countdownSection .container {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  align-content: center;
  width: 90%;
  padding: 50px 0;
}
.countdownSection .container .counterWrapper {
  width: 100%;
  text-align: center;
  position: relative;
  z-index: 1;
}
.countdownSection .container .counterWrapper p {
  background-image: url(https://1.bp.blogspot.com/-r405J-rfC8s/Ya9VLPM0fxI/AAAAAAAAGKY/NjjrqcA3z9ADi47hOcgO-04kNDlB1MtbACNcBGAsYHQ/s0/pattern.jpg);
  background-clip: text;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  font-size: 100px;
}
.countdownSection .container .counterWrapper .countdown {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  align-content: center;
}
.countdownSection .container .counterWrapper .countdown .countdownProp {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  align-content: center;
  width: 240px;
  margin: 10px;
  font-size: 200px;
  line-height: 150px;
  background-image: url(https://1.bp.blogspot.com/-dh6RzhIWc3c/Ya9VaWHJ6CI/AAAAAAAAGKc/Wh5pe28BtiIc1Sh0pvjg8IabFlLK6WRWgCNcBGAsYHQ/s0/pattern1.png);
  background-clip: text;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  text-shadow: 0 0 100px #fff;
}
.countdownSection .container .counterWrapper .countdown .countdownProp:not(:first-child):before {
  content: ":";
}
.countdownSection .container .counterWrapper .countdown .countdownProp:after {
  content: attr(date-count);
  width: 100%;
  font-size: 20px;
  -webkit-text-fill-color: #fff;
  line-height: normal;
}
@media only screen and (max-width: 700px) {
  .countdownSection .decorations .decoration {
    width: 300px;
    height: 300px;
  }
  .countdownSection .container .counterWrapper p {
    font-size: 70px;
  }
  .countdownSection .container .counterWrapper .countdown {
    margin: 20px 0;
  }
  .countdownSection .container .counterWrapper .countdown .countdownProp {
    width: 120px;
    font-size: 100px;
    line-height: 80px;
  }
}
@media only screen and (max-width: 300px) {
  .countdownSection .decorations .santaWrapper {
    display: none;
  }
  .countdownSection .container .counterWrapper p {
    font-size: 50px;
  }
  .countdownSection .container .counterWrapper .countdown .countdownProp {
    display: block;
  }
  .countdownSection .container .counterWrapper .countdown .countdownProp:not(:first-child):before {
    display: none;
  }
  .countdownSection .container .counterWrapper .countdown .countdownProp:after {
    display: block;
  }
}
</style>

Código JavaScript
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script id="rendered-js" >
$(function () {
  $.fn.extend({
    countdown: function (props) {
      props = jQuery.extend({ //Default props
        until: new Date() },
      props);
      const state = {
        days: 0,
        hours: 0,
        minutes: 0,
        seconds: 0 };

      let render = props => {
        const { days, hours, minutes, seconds } = props;
        this.empty();
        this.append(`
        <div class="countdownProp" date-count="${days == 1 ? 'día' : 'días'}">${days}</div>
        <div class="countdownProp" date-count="${hours == 1 ? 'hora' : 'horas'}">${hours < 10 ? '0' + hours : hours}</div>
        <div class="countdownProp" date-count="${minutes == 1 ? 'minuto' : 'minutos'}">${minutes < 10 ? '0' + minutes : minutes}</div>
        <div class="countdownProp" date-count="${seconds == 1 ? 'segundo' : 'segundos'}">${seconds < 10 ? '0' + seconds : seconds}</div>
        `);
      };
      render(state);
      let update = setInterval(function () {
        let counter = props.until - new Date().getTime();
        if (counter <= 0) {
          clearInterval(update);
          return false;
        }
        state.days = Math.floor(counter / (1000 * 60 * 60 * 24));
        state.hours = Math.floor(counter % (1000 * 60 * 60 * 24) / (1000 * 60 * 60));
        state.minutes = Math.floor(counter % (1000 * 60 * 60) / (1000 * 60));
        state.seconds = Math.floor(counter % (1000 * 60) / 1000);
        render(state);
      }, 1000);
      return this;
    },
    snow: function (props) {
      props = jQuery.extend({ //Default props
        amount: 60 },
      props);
      let random = (min, max) => {
        return Math.random() * (max - min) + min;
      };
      let svg = '<svg class="snow" xmlns="http://www.w3.org/2000/svg">';
      for (let index = 0; index < props.amount; index++) {
        svg += `<circle class="particle" r="${random(1, 3)}" cx="${random(1, 100)}%" cy="-${random(1, 100)}" />`;
      }
      svg += '</svg>';
      this.replaceWith(svg);
    } });
  $('.countdown').countdown({
    until: new Date('Dec, 25, 2021') // you can add time optionally ('Dec, 25, 2020 00:00:00')
  });
  $('.snow').snow({
    amount: 100 //Number of particles
  });
});
</script>



Crédito: https://codepen.io/JorgeAguilar


Puedes visualizar la animación a pantalla completa en el siguiente enlace: Cuenta atrás para la Navidad