├── .gitignore ├── LICENSE ├── README.md ├── adeviento_web ├── __init__.py ├── adeviento_web.py ├── components │ ├── button.py │ ├── day.py │ ├── github.py │ ├── header_text.py │ └── link_icon.py ├── constants.py ├── styles │ ├── colors.py │ ├── fonts.py │ └── styles.py └── views │ ├── author.py │ ├── calendar.py │ ├── footer.py │ ├── header.py │ ├── instructions.py │ ├── navbar.py │ └── partners.py ├── assets ├── avatar.jpg ├── calendar │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── css │ └── main.css ├── elgato.png ├── favicon.ico ├── gift.png ├── js │ ├── countdown.js │ └── snow.js ├── logo.png ├── mouredev.png ├── mouredevpro.png ├── nuwe.png ├── preview.jpg └── raiola.png ├── build.sh ├── images └── preview.gif ├── local_build.sh ├── public ├── 404 │ └── index.html ├── 404.html ├── _next │ └── static │ │ ├── T16C-hRtD-1WimmMH9Q6S │ │ ├── _buildManifest.js │ │ └── _ssgManifest.js │ │ ├── chunks │ │ ├── 346-2c50c61a3d9c062f.js │ │ ├── framework-64ad27b21261a9ce.js │ │ ├── main-b748fd380e7af983.js │ │ ├── pages │ │ │ ├── 404-db12dd41ea12cc8e.js │ │ │ ├── _app-1c50f954773d3ce0.js │ │ │ ├── _error-7a92967bea80186d.js │ │ │ └── index-2b84bf8ff9277386.js │ │ ├── polyfills-42372ed130431b0a.js │ │ └── webpack-2df7a8d27de1794c.js │ │ └── css │ │ └── 3466babf96b7dfd6.css ├── avatar.jpg ├── elgato.png ├── favicon.ico ├── gift.png ├── index.html ├── js │ ├── countdown.js │ └── snow.js ├── logo.png ├── mouredev.png ├── mouredevpro.png ├── nuwe.png ├── preview.jpg ├── raiola.png ├── robots.txt ├── sitemap-0.xml └── sitemap.xml ├── requirements.txt ├── rxconfig.py └── vercel.json /.gitignore: -------------------------------------------------------------------------------- 1 | *.db 2 | *.py[cod] 3 | .venv 4 | .web 5 | __pycache__/ 6 | assets/external/ 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Calendario de aDEViento Web 2 | 3 | [![Python](https://img.shields.io/badge/Python-3.11+-yellow?style=for-the-badge&logo=python&logoColor=white&labelColor=101010)](https://python.org) 4 | [![Reflex](https://img.shields.io/badge/Reflex-0.6.4+-5646ED?style=for-the-badge&logo=python&logoColor=white&labelColor=101010)](https://reflex.dev) 5 | [![NES.css](https://img.shields.io/badge/NES.css-2.3.0-007bff?style=for-the-badge&logo=css3&logoColor=white&labelColor=101010)](https://nostalgic-css.github.io/NES.css) 6 | [![Vercel](https://img.shields.io/badge/Vercel-static-gray?style=for-the-badge&logo=vercel&logoColor=white&labelColor=101010)](https://vercel.com) 7 | 8 | ## Proyecto web "Calendario de aDEViento" con Python puro y Reflex 9 | 10 | ![https://adviento.dev](./images/preview.gif) 11 | 12 | > El "Calendario de aDEViento" es una actividad en la que cada día (durante el adviento) se sortea un regalo relacionado con programación y desarrollo de software (libros, cursos…). Su finalidad es ayudar a compartir conocimiento y fomentar el aprendizaje en comunidad. 13 | 14 | ### Visita [https://adviento.dev](https://adviento.dev) 15 | 16 | #### Desarrollo realizado en directo desde [Twitch](https://twitch.tv/mouredev) 17 | > ##### Si consideras útil el proyecto, apóyalo haciendo "★ Star" en el repositorio. ¡Gracias! 18 | 19 | ## Tutorial en vídeo 20 | 21 | 22 | 23 | - [Introducción](https://youtu.be/h8Tn0ITRoQs) 24 | - [Lección 1 - Configuración](https://youtu.be/h8Tn0ITRoQs?t=115) 25 | - [Lección 2 - Navbar](https://youtu.be/h8Tn0ITRoQs?t=1547) 26 | - [Lección 3 - Header](https://youtu.be/h8Tn0ITRoQs?t=2665) 27 | - [Lección 4 - Footer](https://youtu.be/h8Tn0ITRoQs?t=4499) 28 | - [Lección 5 - Instructions](https://youtu.be/h8Tn0ITRoQs?t=5207) 29 | - [Lección 6 - Author](https://youtu.be/h8Tn0ITRoQs?t=5985) 30 | - [Lección 7 - Partners](https://youtu.be/h8Tn0ITRoQs?t=7394) 31 | - [Lección 8 - Calendar](https://youtu.be/h8Tn0ITRoQs?t=7821) 32 | - [Lección 9 - Repository](https://youtu.be/h8Tn0ITRoQs?t=9077) 33 | - [Lección 10 - Snow](https://youtu.be/h8Tn0ITRoQs?t=9679) 34 | - [Lección 11 - Deploy](https://youtu.be/h8Tn0ITRoQs?t=9849) 35 | - [Conclusiones](https://youtu.be/h8Tn0ITRoQs?t=11505) 36 | 37 | > Tienes un canal llamado **"python"** en el servidor de **[Discord](https://mouredev.com/discord)** de la comunidad para preguntar, compartir y ayudar. 38 | 39 | ## Proyecto 40 | 41 | Esta es la estructura general del proyecto. 42 | 43 | * **adeviento_web**: código fuente principal 44 | * **adeviento_web.py**: index del sitio web 45 | * **constants.py**: constantes utilizadas en el sitio 46 | * **styles**: directorio de estilos (css, colores y fuentes) 47 | * **views**: directorio de vistas (secciones gráficas) 48 | * **components**: directorio de componentes (elementos gráficos con menor entidad que una vista) 49 | * **assets**: recursos gráficos y utilidades JavaScript (nive y cuenta atrás) 50 | * **rxconfig.py**: configuración principal del proyecto (por defecto) 51 | * **requirements.txt**: dependencias del proyecto para su ejecución 52 | * **assets**: recursos gráficos y utilidades JavaScript (nive y cuenta atrás) 53 | * **local_build.sh**: script de generación estática de la web para producción en local 54 | * **build.sh**: script de generación estática de la web para producción en remoto 55 | * **[generado] public**: empaquetado estático del proyecto que se despliega en producción (HTML, CSS, JS e imágenes) 56 | 57 | ## Configuración en local 58 | 59 | 1. Haz un `Fork` del repositorio. 60 | 61 | 2. Clona ese repositorio en tu máquina local. 62 | 63 | ```bash 64 | git clone https://github.com//adeviento-web.git 65 | ``` 66 | 67 | 3. Navega al directorio del proyecto. 68 | 69 | ```bash 70 | cd adeviento 71 | ``` 72 | 73 | 4. Crea un entorno virtual. 74 | 75 | ```bash 76 | python3 -m venv venv 77 | ``` 78 | 79 | 5. Activa el entorno virtual. 80 | 81 | ```bash 82 | source venv/bin/activate 83 | ``` 84 | 85 | 6. Instala las dependencias. 86 | 87 | ```bash 88 | python -m pip install -r requirements.txt 89 | ``` 90 | 91 | 7. Inicializa el proyecto de Reflex. 92 | 93 | ```bash 94 | reflex init 95 | ``` 96 | 97 | 8. Ejecuta el proyecto en local. 98 | 99 | ```bash 100 | reflex run 101 | ``` 102 | 103 | *Podrás acceder a él entrando en la url `http://localhost:3000/` desde el navegador.* 104 | 105 | > Tienes más la información sobre [Reflex](https://reflex.dev/) en su [documentación oficial](https://reflex.dev/docs). 106 | 107 | ## Despliegue 108 | 109 | Para realizar el despliegue del proyecto se ha creado un archivo `local_build.sh` que se encarga de ejecutar el flujo necesario para generar el directorio `public` con todos los recursos estáticos que necesita el servidor web. 110 | 111 | Todo el proceso de empaquetado para producción podría ser delegado en el servidor, pero el repositorio cuenta siempre con el directorio `public` para que así puedas revisar el contenido estático de la web sin necesidad de ejecutar el script `local_build.sh`. 112 | 113 | ```bash 114 | source .venv/bin/activate 115 | pip install --upgrade pip 116 | pip install -r requirements.txt 117 | reflex init 118 | reflex export --frontend-only 119 | rm -fr public 120 | unzip frontend.zip -d public 121 | rm -f frontend.zip 122 | deactivate 123 | ``` 124 | 125 | *Básicamente, prepera el entorno, instala dependencias, inicializa el proyecto, crea la construcción de producción, y la descomprime.* 126 | 127 | Puedes configurar el servidor para que realice la tarea de empaquetado y despliegue ejecutando `build.sh`. 128 | 129 | > El proyecto se puede desplegar en cualquier proveedor o servidor que soporte recursos estáticos. 130 | > 131 | > [adviento.dev](https://adviento.dev) se encuentra desplegado en [Vercel](https://vercel.com). 132 | 133 | Configuración en Vercel: 134 | 135 | * Se ha asociado el repositorio de GitHub al proyecto (para que cada `push` en la rama `main` desencadene un nuevo despliegue) 136 | * Build & Development Settings: Other 137 | * Root Directory: `public` (que contiene el empaquetado estático para producción) 138 | * Custom Domain: adviento.dev 139 | 140 | ## Recursos utilizados 141 | 142 | ![Python](https://img.shields.io/github/stars/python/cpython?label=Python&style=social) 143 | ![Reflex](https://img.shields.io/github/stars/reflex-dev/reflex?label=Reflex&style=social) 144 | ![NES.css](https://img.shields.io/github/stars/nostalgic-css/NES.css?label=NES.css&style=social) 145 | ![Vercel](https://img.shields.io/github/stars/vercel/vercel?label=Vercel&style=social) 146 | 147 | * Lenguaje: [Python](https://www.python.org/) 148 | * Framework: [Reflex](https://reflex.dev/) 149 | * CSS: [NES.css](https://nostalgic-css.github.io/NES.css/) 150 | * Fuente: [Press Start 2P](https://fonts.google.com/specimen/Press+Start+2P) 151 | * Hosting: [Vercel](https://vercel.com/) 152 | 153 | ## Curso de Python y Reflex 154 | 155 | 156 | 157 | Curso gratis para aprender desarrollo frontend Web con Python puro desde cero con Reflex. Las tecnologías usadas para desarrollar el proyecto del "Calendario de aDEViento". También tengo un curso de Python desde cero para principiantes. 158 | 159 | [![Curso Python Web](https://img.shields.io/github/stars/mouredev/python-web?label=Curso%20Python%20web&style=social)](https://github.com/mouredev/python-web) 160 | [![Curso Python](https://img.shields.io/github/stars/mouredev/hello-python?label=Curso%20Python&style=social)](https://github.com/mouredev/python-web) 161 | 162 | #### Puedes apoyar mi trabajo haciendo "☆ Star" en el repo. ¡Gracias! 163 | 164 | ## Únete al campus de programación de la comunidad 165 | 166 | ![https://mouredev.pro](https://raw.githubusercontent.com/mouredev/mouredev/refs/heads/master/pro.jpg) 167 | 168 | #### Te presento [mouredev pro](https://mouredev.pro), mi proyecto más importante para ayudarte a estudiar programación y desarrollo de software de manera diferente. 169 | 170 | > **¿Buscas un extra?** Aquí encontrarás mis cursos editados por lecciones individuales, para avanzar a tu ritmo y guardar el progreso. También dispondrás de ejercicios y correcciones, test para validar tus conocimientos, examen y certificado público de finalización, soporte, foro de estudiantes, reunionnes grupales, cursos exclusivos y mucho más. 171 | > 172 | > Entra en **[mouredev.pro](https://mouredev.pro)** y utiliza el cupón **"PRO"** con un 10% de descuento en tu primera suscripción. 173 | 174 | ## ![https://mouredev.com](https://raw.githubusercontent.com/mouredev/mouredev/master/mouredev_emote.png) Hola, mi nombre es Brais Moure. 175 | ### Freelance full-stack iOS & Android engineer 176 | 177 | [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCxPD7bsocoAMq8Dj18kmGyQ?style=social)](https://youtube.com/mouredevapps?sub_confirmation=1) 178 | [![Twitch Status](https://img.shields.io/twitch/status/mouredev?style=social)](https://twitch.com/mouredev) 179 | [![Discord](https://img.shields.io/discord/729672926432985098?style=social&label=Discord&logo=discord)](https://mouredev.com/discord) 180 | [![Twitter Follow](https://img.shields.io/twitter/follow/mouredev?style=social)](https://twitter.com/mouredev) 181 | ![GitHub Followers](https://img.shields.io/github/followers/mouredev?style=social) 182 | ![GitHub Followers](https://img.shields.io/github/stars/mouredev?style=social) 183 | 184 | Soy ingeniero de software desde 2010. Desde 2018 combino mi trabajo desarrollando Apps con la creación de contenido formativo sobre programación y tecnología en diferentes redes sociales como **[@mouredev](https://moure.dev)**. 185 | 186 | Si quieres unirte a nuestra comunidad de desarrollo, aprender programación, mejorar tus habilidades y ayudar a la continuidad del proyecto, puedes encontrarnos en: 187 | 188 | [![Twitch](https://img.shields.io/badge/Twitch-Programación_en_directo-9146FF?style=for-the-badge&logo=twitch&logoColor=white&labelColor=101010)](https://twitch.tv/mouredev) 189 | [![Discord](https://img.shields.io/badge/Discord-Servidor_de_la_comunidad-5865F2?style=for-the-badge&logo=discord&logoColor=white&labelColor=101010)](https://mouredev.com/discord) [![Pro](https://img.shields.io/badge/Cursos-mouredev.pro-FF5500?style=for-the-badge&logo=gnometerminal&logoColor=white&labelColor=101010)](https://moure.dev) 190 | [![Link](https://img.shields.io/badge/Links_de_interés-moure.dev-14a1f0?style=for-the-badge&logo=Linktree&logoColor=white&labelColor=101010)](https://moure.dev) [![Web](https://img.shields.io/badge/GitHub-MoureDev-087ec4?style=for-the-badge&logo=github&logoColor=white&labelColor=101010)](https://github.com/mouredev) 191 | -------------------------------------------------------------------------------- /adeviento_web/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/adeviento_web/__init__.py -------------------------------------------------------------------------------- /adeviento_web/adeviento_web.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | import adeviento_web.styles.styles as styles 3 | from adeviento_web.styles.styles import Size 4 | from adeviento_web.views.navbar import navbar 5 | from adeviento_web.views.header import header 6 | from adeviento_web.views.instructions import instructions 7 | from adeviento_web.views.calendar import calendar 8 | from adeviento_web.views.partners import partners 9 | from adeviento_web.views.author import author 10 | from adeviento_web.views.footer import footer 11 | from adeviento_web.components.github import github 12 | 13 | title = "Calendario de aDEViento 2024 | 24 días. 24 regalos." 14 | description = "Por cuarto año, ¡aquí está el calendario de adviento sorpresa de nuestra comunidad de developers! Del 1 al 24 de diciembre." 15 | preview = "https://adviento.dev/preview.jpg" 16 | 17 | 18 | def index() -> rx.Component: 19 | return rx.box( 20 | rx.script("document.documentElement.lang='es'"), 21 | rx.script(src="/js/snow.js"), 22 | navbar(), 23 | rx.vstack( 24 | header(), 25 | calendar(), 26 | partners(), 27 | instructions(), 28 | author(), 29 | footer(), 30 | github(), 31 | align="center", 32 | width="100%", 33 | spacing=Size.VERY_BIG.value 34 | ) 35 | ) 36 | 37 | 38 | app = rx.App( 39 | stylesheets=styles.STYLESHEETS, 40 | style=styles.BASE_STYLE, 41 | head_components=[ 42 | rx.script(src="https://www.googletagmanager.com/gtag/js?id=G-Y6GDVB3FJB"), 43 | rx.script( 44 | """ 45 | window.dataLayer = window.dataLayer || []; 46 | function gtag(){dataLayer.push(arguments);} 47 | gtag('js', new Date()); 48 | gtag('config', 'G-Y6GDVB3FJB'); 49 | """ 50 | ), 51 | ], 52 | ) 53 | 54 | 55 | app.add_page( 56 | index, 57 | title=title, 58 | description=description, 59 | image=preview, 60 | meta=[ 61 | {"name": "og:type", "content": "website"}, 62 | {"name": "og:title", "content": title}, 63 | {"name": "og:description", "content": description}, 64 | {"name": "og:image", "content": preview}, 65 | {"name": "twitter:card", "content": "summary_large_image"}, 66 | {"name": "twitter:site", "content": "@mouredev"} 67 | ] 68 | ) 69 | -------------------------------------------------------------------------------- /adeviento_web/components/button.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | 3 | 4 | def button(text: str, url: str) -> rx.Component: 5 | return rx.el.button( 6 | text, 7 | class_name="nes-btn is-error", 8 | on_click=rx.redirect( 9 | url, 10 | external=True 11 | ) 12 | ) 13 | -------------------------------------------------------------------------------- /adeviento_web/components/day.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | from adeviento_web.styles.styles import Size, Color 3 | 4 | 5 | def day(number: int, text: str = "", url: str = "", finished=False) -> rx.Component: 6 | return rx.box( 7 | rx.cond( 8 | url != "", 9 | rx.link( 10 | rx.image( 11 | src=f"calendar/{number}.png", 12 | alt=text, 13 | padding=Size.SMALL.value 14 | ), 15 | href=url, 16 | is_external=True, 17 | position="absolute" 18 | ) 19 | ), 20 | rx.cond( 21 | url == "", 22 | rx.image( 23 | src="gift.png", 24 | alt=f"Regalo asociado al día {number}", 25 | position="absolute", 26 | padding=Size.SMALL.value 27 | ) 28 | ), 29 | rx.text( 30 | number, 31 | padding=Size.DEFAULT.value, 32 | position="absolute" 33 | ), 34 | bg=Color.ACCENT.value if finished else Color.TERTIARY.value if url != "" else Color.SECONDARY.value, 35 | aspect_ratio="1", 36 | position="relative" 37 | ) 38 | -------------------------------------------------------------------------------- /adeviento_web/components/github.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | import adeviento_web.constants as constants 3 | from adeviento_web.styles.styles import Size 4 | 5 | 6 | def github() -> rx.Component: 7 | return rx.link( 8 | 9 | rx.vstack( 10 | rx.vstack( 11 | rx.el.span( 12 | "Proyecto" 13 | ), 14 | rx.el.span( 15 | "en GitHub" 16 | ), 17 | align_items="start", 18 | class_name="nes-balloon from-right is-dark", 19 | margin_bottom=Size.BIG.value 20 | ), 21 | rx.box( 22 | rx.el.span( 23 | constants.VERSION, 24 | class_name="is-error" 25 | ), 26 | class_name="nes-badge" 27 | ) 28 | ), 29 | rx.box( 30 | class_name="nes-octocat animate" 31 | ), 32 | href=constants.GITHUB_REPO_URL, 33 | is_external=True, 34 | align_items="end", 35 | display="flex", 36 | margin_top=Size.ZERO.value 37 | ) 38 | -------------------------------------------------------------------------------- /adeviento_web/components/header_text.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | from adeviento_web.styles.styles import Size, TextColor 3 | 4 | 5 | def header_text(icon: str, text: str, dark=True) -> rx.Component: 6 | return rx.hstack( 7 | rx.box( 8 | class_name=f"nes-icon is-medium {icon}" 9 | ), 10 | rx.heading( 11 | text, 12 | size="md", 13 | color=TextColor.ACCENT.value if dark else TextColor.SECONDARY.value 14 | ), 15 | spacing=Size.DEFAULT.value, 16 | padding_bottom=Size.BUTTON.value, 17 | align="center" 18 | ) 19 | -------------------------------------------------------------------------------- /adeviento_web/components/link_icon.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | 3 | 4 | def link_icon(icon: str, url: str) -> rx.Component: 5 | return rx.el.i( 6 | "", 7 | class_name=f"nes-icon {icon} is-medium", 8 | on_click=rx.redirect( 9 | url, 10 | external=True 11 | ) 12 | ) 13 | -------------------------------------------------------------------------------- /adeviento_web/constants.py: -------------------------------------------------------------------------------- 1 | VERSION = "2.2.0" 2 | 3 | MOUREDEV_URL = "https://moure.dev" 4 | 5 | YOUTUBE_URL = "https://youtube.com/@mouredev" 6 | TWITCH_URL = "https://twitch.tv/mouredev" 7 | GITHUB_URL = "https://github.com/mouredev" 8 | GITHUB_REPO_URL = "https://github.com/mouredev/adeviento-web" 9 | DISCORD_URL = "https://discord.gg/mouredev" 10 | # DISCORD_EVENT_URL = "https://discord.gg/jzj4GSWN?event=1176580187559825492" 11 | TWITTER_URL = "https://x.com/mouredev" 12 | ADEVIENTO_HASHTAG_URL = "https://x.com/search?q=%23aDEViento2024&src=typed_query" 13 | -------------------------------------------------------------------------------- /adeviento_web/styles/colors.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class Color(Enum): 5 | ACCENT = "#EA5940" 6 | PRIMARY = "#212529" 7 | SECONDARY = "#D3D3D3" 8 | TERTIARY = "#37946E" 9 | 10 | 11 | class TextColor(Enum): 12 | ACCENT = "#EA5940 !important" 13 | PRIMARY = "#FFFFFF" 14 | SECONDARY = "#212529" 15 | TERTIARY = "#D3D3D3" 16 | -------------------------------------------------------------------------------- /adeviento_web/styles/fonts.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class Font(Enum): 5 | DEFAULT = "Press Start 2P" 6 | -------------------------------------------------------------------------------- /adeviento_web/styles/styles.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | from enum import Enum 3 | from .fonts import Font 4 | from .colors import Color, TextColor 5 | 6 | MAX_WIDTH = "1000px" 7 | FLEX_DIRECTION = ["column", "column", "column", "row", "row"] 8 | 9 | 10 | class Size(Enum): 11 | ZERO = "0px !important" 12 | SMALL = "0.5em" 13 | MEDIUM = "0.8em" 14 | DEFAULT = "1em" 15 | BIG = "2em" 16 | BUTTON = "2.75em" 17 | VERY_BIG = "4em" 18 | 19 | 20 | STYLESHEETS = [ 21 | "/css/main.css", 22 | "https://unpkg.com/nes.css@latest/css/nes.min.css", 23 | "https://fonts.googleapis.com/css?family=Press+Start+2P&display=swap" 24 | ] 25 | 26 | BASE_STYLE = { 27 | "font_family": Font.DEFAULT.value, 28 | "color": TextColor.PRIMARY.value, 29 | "background": Color.PRIMARY.value, 30 | rx.heading: { 31 | "font_family": Font.DEFAULT.value, 32 | "color": TextColor.ACCENT.value 33 | }, 34 | rx.link: { 35 | "text_decoration": "none", 36 | "_hover": { 37 | "color": TextColor.ACCENT.value, 38 | "text_decoration": "none" 39 | } 40 | }, 41 | rx.el.span: { 42 | "font_size": Size.MEDIUM.value 43 | }, 44 | rx.button: { 45 | "margin_bottom": Size.DEFAULT.value, 46 | "height": Size.BUTTON.value, 47 | "color": f"{TextColor.SECONDARY.value} !important", 48 | "_hover": { 49 | "color": f"{TextColor.PRIMARY.value} !important" 50 | } 51 | } 52 | } 53 | 54 | max_width_style = dict( 55 | align_items="start", 56 | padding_x=Size.BIG.value, 57 | width="100%", 58 | max_width=MAX_WIDTH 59 | ) 60 | -------------------------------------------------------------------------------- /adeviento_web/views/author.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | import datetime 3 | import adeviento_web.constants as constants 4 | import adeviento_web.styles.styles as styles 5 | from adeviento_web.styles.styles import Size, Color, TextColor 6 | from adeviento_web.components.header_text import header_text 7 | from adeviento_web.components.button import button 8 | 9 | 10 | def author() -> rx.Component: 11 | return rx.vstack( 12 | header_text( 13 | "like", 14 | "Hola, mi nombre es Brais Moure" 15 | ), 16 | rx.flex( 17 | rx.image( 18 | src="avatar.jpg", 19 | width="128px", 20 | height="128px", 21 | bg=Color.PRIMARY.value, 22 | padding="2px", 23 | border=f"4px solid {Color.SECONDARY.value}", 24 | border_radius="50%", 25 | margin_right=Size.SMALL.value, 26 | margin_bottom=Size.SMALL.value 27 | ), 28 | rx.vstack( 29 | rx.el.span( 30 | f"Soy ingeniero de software desde hace más de { 31 | _experience()} años." 32 | ), 33 | rx.el.span( 34 | "En 2018 comencé a divulgar contenido sobre programación y desarrollo de software en redes sociales como ", 35 | rx.el.span( 36 | "@mouredev", 37 | color=TextColor.ACCENT.value, 38 | font_size=Size.DEFAULT.value 39 | ), 40 | "." 41 | ), 42 | _author_buttons(), 43 | width="100%", 44 | align_items="start" 45 | ), 46 | align_items="start", 47 | spacing=Size.BIG.value, 48 | flex_direction=styles.FLEX_DIRECTION 49 | ), 50 | style=styles.max_width_style 51 | ) 52 | 53 | 54 | def _author_buttons() -> rx.Component: 55 | return rx.flex( 56 | button( 57 | "YouTube", 58 | constants.YOUTUBE_URL 59 | ), 60 | button( 61 | "Twitch", 62 | constants.TWITCH_URL 63 | ), 64 | button( 65 | "Discord", 66 | constants.DISCORD_URL 67 | ), 68 | align_items="start", 69 | flex_direction=styles.FLEX_DIRECTION 70 | ) 71 | 72 | 73 | def _experience() -> int: 74 | return datetime.date.today().year - 2010 75 | -------------------------------------------------------------------------------- /adeviento_web/views/calendar.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | import adeviento_web.constants as constants 3 | import adeviento_web.styles.styles as styles 4 | from adeviento_web.styles.styles import Size 5 | from adeviento_web.styles.colors import TextColor 6 | from adeviento_web.components.header_text import header_text 7 | from adeviento_web.components.button import button 8 | from adeviento_web.components.day import day 9 | 10 | 11 | _gifts = [ 12 | ( 13 | "Git y GitHub desde cero: Guía de estudio teórico-práctica paso a paso más curso en vídeo", 14 | "https://x.com/MoureDev/status/1863584564389498883", 15 | "https://mouredev.link/libro-git" 16 | ), 17 | ( 18 | "Suscripción mensual a mouredev pro: Estudia programación de manera diferente", 19 | "https://x.com/MoureDev/status/1863948284823224616", 20 | "https://mouredev.pro" 21 | ), 22 | ( 23 | "Entiende la tecnología: Desde la caída de Megaupload hasta los secretos de la IA", 24 | "https://x.com/MoureDev/status/1864305488852115509", 25 | "https://amzn.to/41g9Fsx" 26 | ), 27 | ( 28 | "Dominando JavaScript: Técnicas avanzadas para el desarrollo web moderno", 29 | "https://x.com/MoureDev/status/1864671641638252558", 30 | "https://amzn.to/4glh3av" 31 | ), 32 | ( 33 | "Código Sostenible: Cómo programar código fácil de mantener", 34 | "https://x.com/MoureDev/status/1865031348630569137", 35 | "https://savvily.es/libros/codigo-sostenible" 36 | ), 37 | ( 38 | "Suscripción mensual a Commit Academy", 39 | "https://x.com/MoureDev/status/1865405635010953329", 40 | "https://www.commitacademy.io" 41 | ), 42 | ( 43 | "Ultimate Python: de cero a experto", 44 | "https://x.com/MoureDev/status/1865764060899528831", 45 | "https://amzn.to/4f1Hd0Q" 46 | ), 47 | ( 48 | "Aprender a programar con C#", 49 | "https://x.com/MoureDev/status/1866118735733391715", 50 | "https://amzn.to/3D5m4FK" 51 | ), 52 | ( 53 | "Git y GitHub desde cero: Guía de estudio teórico-práctica paso a paso más curso en vídeo", 54 | "https://x.com/MoureDev/status/1866474265555464506", 55 | "https://mouredev.link/libro-git" 56 | ), 57 | ( 58 | "Suscripción mensual a mouredev pro: Estudia programación de manera diferente", 59 | "https://x.com/MoureDev/status/1866846649496056029", 60 | "https://mouredev.pro" 61 | ), 62 | ( 63 | "Curso Jetpack Compose o Firebase AppCademy", 64 | "https://x.com/MoureDev/status/1867211119858741427", 65 | "https://www.appcademy.dev" 66 | ), 67 | ( 68 | "Suscripción mensual a Hack4u: Aprende ciberseguridad", 69 | "https://x.com/MoureDev/status/1867571444101919104", 70 | "https://hack4u.io" 71 | ), 72 | ( 73 | "El programador pragmático: Viaje a la maestría", 74 | "https://x.com/MoureDev/status/1867953183001088098", 75 | "https://amzn.to/4g9awQx" 76 | ), 77 | ( 78 | "Suscripción mensual a Metal Code: Cursos enfocados al aprendizaje por conceptos", 79 | "https://x.com/MoureDev/status/1868286906120991048", 80 | "https://courses.metalcode.io" 81 | ), 82 | ( 83 | "Suscripción mensual a Hola Mundo: Cursos de programación para todo el mundo", 84 | "https://x.com/MoureDev/status/1868664418483273859", 85 | "https://academia.holamundo.io" 86 | ), 87 | ( 88 | "Git y GitHub desde cero: Guía de estudio teórico-práctica paso a paso más curso en vídeo", 89 | "https://x.com/MoureDev/status/1869019301396779037", 90 | "https://mouredev.link/libro-git" 91 | ), 92 | ( 93 | "Suscripción mensual a mouredev pro: Estudia programación de manera diferente", 94 | "https://x.com/MoureDev/status/1869421281998946500", 95 | "https://mouredev.pro" 96 | ), 97 | ( 98 | "No todo es programar: 10 habilidades que todo programador necesita", 99 | "https://x.com/MoureDev/status/1869749468855484767", 100 | "https://amzn.to/3ZMCDPw" 101 | ), 102 | ( 103 | "Clean JavaScript: Código Limpio, SOLID y testing", 104 | "https://x.com/MoureDev/status/1870103870837264610", 105 | "https://cleanjavascript.es" 106 | ), 107 | ( 108 | "Patrones de diseño", 109 | "https://x.com/MoureDev/status/1870471993562476946", 110 | "https://refactoring.guru/es/design-patterns/book" 111 | ), 112 | ( 113 | "Curso intensivo de Python", 114 | "https://x.com/MoureDev/status/1870849647360766330", 115 | "https://amzn.to/4gnfg4Y" 116 | ), 117 | ( 118 | "Dominio .dev (o .com) anual en Raiola Networks", 119 | "https://x.com/MoureDev/status/1871213692160721380", 120 | "https://mouredev.link/raiola" 121 | ), 122 | ( 123 | "Git y GitHub desde cero: Guía de estudio teórico-práctica paso a paso más curso en vídeo", 124 | "https://x.com/MoureDev/status/1871557969256783996", 125 | "https://mouredev.link/libro-git" 126 | ), 127 | ( 128 | "Suscripción anual a mouredev pro: Estudia programación de manera diferente", 129 | "https://x.com/MoureDev/status/1871934793124061382", 130 | "https://mouredev.pro" 131 | ) 132 | ] 133 | 134 | _current_day = len(_gifts) - 1 135 | 136 | 137 | def calendar() -> rx.Component: 138 | return rx.vstack( 139 | header_text( 140 | "heart", 141 | "Calendario 2024.¡Feliz Navidad!" 142 | ), 143 | # rx.vstack( 144 | # rx.text( 145 | # "El regalo de hoy", 146 | # class_name="title", 147 | # color=TextColor.ACCENT.value 148 | # ), 149 | # rx.flex( 150 | # rx.box( 151 | # day( 152 | # _current_day + 1, 153 | # _gift_name(_current_day), 154 | # _gift_url(_current_day), 155 | # ), 156 | # height="14em", 157 | # width="14em", 158 | # aspect_ratio="1", 159 | # margin_right=Size.BIG.value 160 | # ), 161 | # rx.vstack( 162 | # rx.el.span( 163 | # f"Día {_current_day + 1}"), 164 | # rx.link( 165 | # _gift_name(_current_day), 166 | # href=_gift_info(_current_day), 167 | # is_external=True 168 | # ), 169 | # rx.spacer(), 170 | # rx.flex( 171 | # button( 172 | # "Participa", 173 | # _gift_url(_current_day) 174 | # ), 175 | # rx.cond( 176 | # _current_day > 1, 177 | # button( 178 | # f"Día {_current_day}", 179 | # _gift_url(_current_day - 1) 180 | # ) 181 | # ), 182 | # align_items="start", 183 | # flex_direction=styles.FLEX_DIRECTION 184 | # ), 185 | # align_items="start", 186 | # margin_top=Size.BIG.value 187 | # ), 188 | # flex_direction=styles.FLEX_DIRECTION 189 | # ), 190 | # width="100%", 191 | # class_name="nes-container is-dark with-title", 192 | # align_items="start" 193 | # ), 194 | rx.grid( 195 | *[ 196 | day( 197 | number + 1, 198 | _gift_name(number), 199 | _gift_url(number), 200 | # False if len(_gifts) - 1 == number else True 201 | True, # finalizado 202 | ) 203 | for _, number in enumerate(range(0, _current_day + 1)) 204 | ], 205 | *[ 206 | day(number) 207 | for _, number in enumerate(range(_current_day + 2, 25)) 208 | ], 209 | columns=rx.breakpoints( 210 | initial="2", 211 | xs="3", 212 | sm="4", 213 | md="5", 214 | lg="6", 215 | xl="6" 216 | ), 217 | spacing=Size.DEFAULT.value, 218 | width="100%", 219 | padding_y=Size.BIG.value 220 | ), 221 | # rx.vstack( 222 | # rx.hstack( 223 | # rx.text( 224 | # "Próximo regalo y ganadores en", 225 | # # "Calendario 2024 en", 226 | # margin_right=Size.DEFAULT.value 227 | # ), 228 | # rx.text( 229 | # id="countdown", 230 | # margin_left=Size.ZERO.value 231 | # ), 232 | # align_items="start", 233 | # flex_direction=styles.FLEX_DIRECTION 234 | # ), 235 | # # button( 236 | # # "Recordar", 237 | # # constants.DISCORD_EVENT_URL 238 | # # ), 239 | # rx.el.span( 240 | # "• Los regalos son sorpresa, permanecerán ocultos hasta el día de su publicación. No olvides pasarte por aquí cada día para descubrir un nuevo sorteo." 241 | # ), 242 | # rx.el.span( 243 | # "• Puedes seleccionar cada regalo para conocer a los ganadores una vez se haya publicado el nuevo sorteo (aparecerá en rojo)." 244 | # ), 245 | # class_name="nes-container is-dark", 246 | # align_items="start", 247 | # width="100%" 248 | # ), 249 | # rx.script(src="/js/countdown.js"), 250 | style=styles.max_width_style 251 | ) 252 | 253 | 254 | def _gift_name(gift) -> str: 255 | gift_index = gift 256 | if len(_gifts) > gift_index: 257 | return _gifts[gift_index][0] 258 | return "" 259 | 260 | 261 | def _gift_url(gift) -> str: 262 | gift_index = gift 263 | if len(_gifts) > gift_index: 264 | return _gifts[gift_index][1] 265 | return "" 266 | 267 | 268 | def _gift_info(gift) -> str: 269 | gift_index = gift 270 | if len(_gifts) > gift_index: 271 | return _gifts[gift_index][2] 272 | return "" 273 | -------------------------------------------------------------------------------- /adeviento_web/views/footer.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | import adeviento_web.constants as constants 3 | import adeviento_web.styles.styles as styles 4 | from adeviento_web.styles.styles import Size, TextColor 5 | 6 | 7 | def footer() -> rx.Component: 8 | return rx.hstack( 9 | rx.center( 10 | rx.vstack( 11 | rx.text( 12 | "Calendario de aDEViento 2024", 13 | font_size=Size.MEDIUM.value, 14 | margin_bottom=Size.ZERO.value 15 | ), 16 | rx.link( 17 | "Creado con ", 18 | rx.el.i(class_name="nes-icon is-small heart"), 19 | " (y gracias a ti) por MoureDev by Brais Moure", 20 | href=constants.MOUREDEV_URL, 21 | is_external=True, 22 | font_size=Size.MEDIUM.value, 23 | color=TextColor.TERTIARY.value 24 | ), 25 | align_items="start", 26 | spacing=Size.MEDIUM.value 27 | ), 28 | rx.spacer(), 29 | rx.image( 30 | src="logo.png", 31 | alt="Logo MoureDev. Una letra \"eme\" entre dos corchetes.", 32 | class_name="nes-avatar is-large" 33 | ), 34 | width="100%" 35 | ), 36 | padding_bottom=Size.BIG.value, 37 | style=styles.max_width_style 38 | ) 39 | -------------------------------------------------------------------------------- /adeviento_web/views/header.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | import adeviento_web.constants as constants 3 | import adeviento_web.styles.styles as styles 4 | from adeviento_web.styles.styles import Size, TextColor 5 | from adeviento_web.components.button import button 6 | 7 | 8 | def header() -> rx.Component: 9 | return rx.vstack( 10 | rx.heading( 11 | "Calendario de aDEViento 2024", 12 | size="lg", 13 | padding_bottom=Size.DEFAULT.value 14 | ), 15 | rx.flex( 16 | rx.image( 17 | src="mouredev.png", 18 | alt="Imagen pixel art de MoureDev con estilo navideño.", 19 | width="16em", 20 | height="16em", 21 | margin_right=Size.BIG.value 22 | ), 23 | rx.vstack( 24 | rx.box( 25 | rx.text("24 días. 24 regalos."), 26 | rx.text("Del 1 al 24 de diciembre."), 27 | class_name="nes-balloon from-left is-dark" 28 | ), 29 | rx.el.span( 30 | "Por cuarto año, ¡aquí está el calendario de adviento sorpresa de nuestra ", 31 | rx.el.span( 32 | "comunidad de developers", 33 | color=TextColor.ACCENT.value, 34 | font_size=Size.DEFAULT.value 35 | ), 36 | "!" 37 | ), 38 | rx.el.span( 39 | "Una actividad en la que cada día sortearé un regalo relacionado con programación y desarrollo de software (libros, cursos…)." 40 | ), 41 | rx.el.span( 42 | "Su finalidad es ayudar a compartir conocimiento y fomentar el aprendizaje en comunidad." 43 | ), 44 | button( 45 | "Discord", 46 | constants.DISCORD_URL 47 | ), 48 | rx.link( 49 | "#aDEViento2024", 50 | href=constants.ADEVIENTO_HASHTAG_URL, 51 | is_external=True, 52 | color=TextColor.TERTIARY.value 53 | ), 54 | align_items="start" 55 | ), 56 | flex_direction=styles.FLEX_DIRECTION 57 | ), 58 | padding_top=Size.VERY_BIG.value, 59 | style=styles.max_width_style 60 | ) 61 | -------------------------------------------------------------------------------- /adeviento_web/views/instructions.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | import adeviento_web.constants as constants 3 | import adeviento_web.styles.styles as styles 4 | from adeviento_web.styles.styles import TextColor 5 | from adeviento_web.components.button import button 6 | 7 | 8 | def instructions() -> rx.Component: 9 | return rx.box( 10 | rx.vstack( 11 | rx.text( 12 | "¿Cómo funciona el evento?", 13 | class_name="title", 14 | color=TextColor.ACCENT.value 15 | ), 16 | rx.el.span( 17 | "• Del 1 al 24 de diciembre descubriré cada día un nuevo regalo en el calendario." 18 | ), 19 | rx.el.span( 20 | "• Puedes participar desde cualquier parte del mundo." 21 | ), 22 | rx.el.span( 23 | "• Sólo tendrás que hacer Retweet a la publicación que enlazaré desde esta web. Tu cuenta de Twitter/X tiene que ser pública." 24 | ), 25 | button( 26 | "Twitter/X", 27 | constants.TWITTER_URL 28 | ), 29 | rx.el.span( 30 | "• Al día siguiente realizaré el sorteo de forma pública y compartiré el ganador en la web y en Twitter/X." 31 | ), 32 | rx.el.span( 33 | "• ¡Vuelta a empezar! Publicaré un nuevo regalo y comenzará de nuevo el proceso." 34 | ), 35 | class_name="nes-container is-dark with-title", 36 | align_items="start", 37 | width="100%" 38 | ), 39 | style=styles.max_width_style 40 | ) 41 | -------------------------------------------------------------------------------- /adeviento_web/views/navbar.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | import adeviento_web.constants as constants 3 | from adeviento_web.styles.styles import Size, Color 4 | from adeviento_web.components.link_icon import link_icon 5 | 6 | 7 | def navbar() -> rx.Component: 8 | return rx.vstack( 9 | rx.hstack( 10 | rx.image( 11 | src="mouredev.png", 12 | alt="Imagen pixel art de MoureDev con estilo navideño.", 13 | width="3em", 14 | height="3em" 15 | ), 16 | rx.text("aDEViento 2024"), 17 | rx.spacer(), 18 | rx.tablet_and_desktop( 19 | link_icon( 20 | "youtube", 21 | constants.YOUTUBE_URL 22 | ) 23 | ), 24 | link_icon( 25 | "twitch", 26 | constants.TWITCH_URL 27 | ), 28 | link_icon( 29 | "github", 30 | constants.GITHUB_URL 31 | ), 32 | align="center", 33 | width="100%" 34 | ), 35 | bg=Color.PRIMARY.value, 36 | position="sticky", 37 | border_bottom=f"0.25em solid {Color.SECONDARY.value}", 38 | padding_x=Size.BIG.value, 39 | padding_y=Size.DEFAULT.value, 40 | z_index="999", 41 | top="0", 42 | width="100%" 43 | ) 44 | -------------------------------------------------------------------------------- /adeviento_web/views/partners.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | import adeviento_web.styles.styles as styles 3 | from adeviento_web.styles.styles import Size, Color 4 | from adeviento_web.components.header_text import header_text 5 | 6 | 7 | def partners() -> rx.Component: 8 | return rx.vstack( 9 | rx.vstack( 10 | header_text( 11 | "star", 12 | "Con la ayuda de", 13 | False 14 | ), 15 | rx.grid( 16 | _partner_link( 17 | "elgato.png", 18 | "https://e.lga.to/MoureDev", 19 | "Elgato" 20 | ), 21 | _partner_link( 22 | "raiola.png", 23 | "https://mouredev.link/raiola", 24 | "Raiola Networks" 25 | ), 26 | _partner_link( 27 | "nuwe.png", 28 | "https://nuwe.io", 29 | "NUWE" 30 | ), 31 | _partner_link( 32 | "mouredevpro.png", 33 | "https://mouredev.pro", 34 | "mouredev pro" 35 | ), 36 | columns=rx.breakpoints( 37 | initial="2", 38 | xs="2", 39 | sm="4", 40 | md="4", 41 | lg="4", 42 | xl="4" 43 | ), 44 | spacing=Size.VERY_BIG.value 45 | ), 46 | padding_y=Size.VERY_BIG.value, 47 | style=styles.max_width_style 48 | ), 49 | bg=Color.ACCENT.value, 50 | align="center", 51 | width="100%" 52 | ) 53 | 54 | 55 | def _partner_link(image: str, url: str, alt: str) -> rx.Component: 56 | return rx.link( 57 | rx.image( 58 | src=image, 59 | width="100%", 60 | height="100%", 61 | alt=alt 62 | ), 63 | href=url, 64 | is_external=True 65 | ) 66 | -------------------------------------------------------------------------------- /assets/avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/avatar.jpg -------------------------------------------------------------------------------- /assets/calendar/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/1.png -------------------------------------------------------------------------------- /assets/calendar/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/10.png -------------------------------------------------------------------------------- /assets/calendar/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/11.png -------------------------------------------------------------------------------- /assets/calendar/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/12.png -------------------------------------------------------------------------------- /assets/calendar/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/13.png -------------------------------------------------------------------------------- /assets/calendar/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/14.png -------------------------------------------------------------------------------- /assets/calendar/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/15.png -------------------------------------------------------------------------------- /assets/calendar/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/16.png -------------------------------------------------------------------------------- /assets/calendar/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/17.png -------------------------------------------------------------------------------- /assets/calendar/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/18.png -------------------------------------------------------------------------------- /assets/calendar/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/19.png -------------------------------------------------------------------------------- /assets/calendar/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/2.png -------------------------------------------------------------------------------- /assets/calendar/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/20.png -------------------------------------------------------------------------------- /assets/calendar/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/21.png -------------------------------------------------------------------------------- /assets/calendar/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/22.png -------------------------------------------------------------------------------- /assets/calendar/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/23.png -------------------------------------------------------------------------------- /assets/calendar/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/24.png -------------------------------------------------------------------------------- /assets/calendar/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/3.png -------------------------------------------------------------------------------- /assets/calendar/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/4.png -------------------------------------------------------------------------------- /assets/calendar/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/5.png -------------------------------------------------------------------------------- /assets/calendar/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/6.png -------------------------------------------------------------------------------- /assets/calendar/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/7.png -------------------------------------------------------------------------------- /assets/calendar/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/8.png -------------------------------------------------------------------------------- /assets/calendar/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/calendar/9.png -------------------------------------------------------------------------------- /assets/css/main.css: -------------------------------------------------------------------------------- 1 | /* Debería ser suficiente el rx.link del styles.py */ 2 | a { 3 | color: #FFFFFF !important; 4 | } 5 | a:hover { 6 | color: #EA5940 !important; 7 | } 8 | -------------------------------------------------------------------------------- /assets/elgato.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/elgato.png -------------------------------------------------------------------------------- /assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/favicon.ico -------------------------------------------------------------------------------- /assets/gift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/gift.png -------------------------------------------------------------------------------- /assets/js/countdown.js: -------------------------------------------------------------------------------- 1 | var countDownDate = new Date("Dec 25, 2024 15:00:00 UTC").getTime(); 2 | 3 | var x = setInterval(function () { 4 | 5 | var now = new Date().getTime(); 6 | var distance = countDownDate - now; 7 | 8 | var days = Math.floor(distance / (1000 * 60 * 60 * 24)); 9 | var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); 10 | var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); 11 | var seconds = Math.floor((distance % (1000 * 60)) / 1000); 12 | 13 | document.getElementById("countdown").innerHTML = days + "d " + hours + "h " 14 | + minutes + "m " + seconds + "s "; 15 | 16 | if (distance < 0) { 17 | clearInterval(x); 18 | document.getElementById("countdown").innerHTML = "¡Comienza el calendario de aDEViento!"; 19 | } 20 | }, 1000); -------------------------------------------------------------------------------- /assets/js/snow.js: -------------------------------------------------------------------------------- 1 | /** @license 2 | * DHTML Snowstorm! JavaScript-based snow for web pages 3 | * Making it snow on the internets since 2003. You're welcome. 4 | * ----------------------------------------------------------- 5 | * Version 1.44.20131215 (Previous rev: 1.44.20131208) 6 | * Copyright (c) 2007, Scott Schiller. All rights reserved. 7 | * Code provided under the BSD License 8 | * http://schillmania.com/projects/snowstorm/license.txt 9 | */ 10 | 11 | /*jslint nomen: true, plusplus: true, sloppy: true, vars: true, white: true */ 12 | /*global window, document, navigator, clearInterval, setInterval */ 13 | 14 | var snowStorm = (function (window, document) { 15 | 16 | // --- common properties --- 17 | 18 | this.autoStart = true; // Whether the snow should start automatically or not. 19 | this.excludeMobile = false; // Snow is likely to be bad news for mobile phones' CPUs (and batteries.) Enable at your own risk. 20 | this.flakesMax = 128; // Limit total amount of snow made (falling + sticking) 21 | this.flakesMaxActive = 64; // Limit amount of snow falling at once (less = lower CPU use) 22 | this.animationInterval = 33; // Theoretical "miliseconds per frame" measurement. 20 = fast + smooth, but high CPU use. 50 = more conservative, but slower 23 | this.useGPU = true; // Enable transform-based hardware acceleration, reduce CPU load. 24 | this.className = null; // CSS class name for further customization on snow elements 25 | this.flakeBottom = null; // Integer for Y axis snow limit, 0 or null for "full-screen" snow effect 26 | this.followMouse = false; // Snow movement can respond to the user's mouse 27 | this.snowColor = '#fff'; // Don't eat (or use?) yellow snow. 28 | this.snowCharacter = '•'; // • = bullet, · is square on some systems etc. 29 | this.snowStick = true; // Whether or not snow should "stick" at the bottom. When off, will never collect. 30 | this.targetElement = null; // element which snow will be appended to (null = document.body) - can be an element ID eg. 'myDiv', or a DOM node reference 31 | this.useMeltEffect = true; // When recycling fallen snow (or rarely, when falling), have it "melt" and fade out if browser supports it 32 | this.useTwinkleEffect = false; // Allow snow to randomly "flicker" in and out of view while falling 33 | this.usePositionFixed = false; // true = snow does not shift vertically when scrolling. May increase CPU load, disabled by default - if enabled, used only where supported 34 | this.usePixelPosition = false; // Whether to use pixel values for snow top/left vs. percentages. Auto-enabled if body is position:relative or targetElement is specified. 35 | this.accessibility = true; // Hide snow from screen readers 36 | 37 | // --- less-used bits --- 38 | 39 | this.freezeOnBlur = true; // Only snow when the window is in focus (foreground.) Saves CPU. 40 | this.flakeLeftOffset = 0; // Left margin/gutter space on edge of container (eg. browser window.) Bump up these values if seeing horizontal scrollbars. 41 | this.flakeRightOffset = 0; // Right margin/gutter space on edge of container 42 | this.flakeWidth = 15; // Max pixel width reserved for snow element 43 | this.flakeHeight = 15; // Max pixel height reserved for snow element 44 | this.vMaxX = 3; // Maximum X velocity range for snow 45 | this.vMaxY = 4; // Maximum Y velocity range for snow 46 | this.zIndex = 0; // CSS stacking order applied to each snowflake 47 | 48 | // --- "No user-serviceable parts inside" past this point, yadda yadda --- 49 | 50 | var storm = this, 51 | features, 52 | // UA sniffing and backCompat rendering mode checks for fixed position, etc. 53 | isIE = navigator.userAgent.match(/msie/i), 54 | isIE6 = navigator.userAgent.match(/msie 6/i), 55 | isMobile = navigator.userAgent.match(/mobile|opera m(ob|in)/i), 56 | isBackCompatIE = (isIE && document.compatMode === 'BackCompat'), 57 | noFixed = (isBackCompatIE || isIE6), 58 | screenX = null, screenX2 = null, screenY = null, scrollY = null, docHeight = null, vRndX = null, vRndY = null, 59 | windOffset = 1, 60 | windMultiplier = 2, 61 | flakeTypes = 6, 62 | fixedForEverything = false, 63 | targetElementIsRelative = false, 64 | opacitySupported = (function () { 65 | try { 66 | document.createElement('div').style.opacity = '0.5'; 67 | } catch (e) { 68 | return false; 69 | } 70 | return true; 71 | }()), 72 | didInit = false, 73 | docFrag = document.createDocumentFragment(); 74 | 75 | features = (function () { 76 | 77 | var getAnimationFrame; 78 | 79 | /** 80 | * hat tip: paul irish 81 | * http://paulirish.com/2011/requestanimationframe-for-smart-animating/ 82 | * https://gist.github.com/838785 83 | */ 84 | 85 | function timeoutShim(callback) { 86 | window.setTimeout(callback, 1000 / (storm.animationInterval || 20)); 87 | } 88 | 89 | var _animationFrame = (window.requestAnimationFrame || 90 | window.webkitRequestAnimationFrame || 91 | window.mozRequestAnimationFrame || 92 | window.oRequestAnimationFrame || 93 | window.msRequestAnimationFrame || 94 | timeoutShim); 95 | 96 | // apply to window, avoid "illegal invocation" errors in Chrome 97 | getAnimationFrame = _animationFrame ? function () { 98 | return _animationFrame.apply(window, arguments); 99 | } : null; 100 | 101 | var testDiv; 102 | 103 | testDiv = document.createElement('div'); 104 | 105 | function has(prop) { 106 | 107 | // test for feature support 108 | var result = testDiv.style[prop]; 109 | return (result !== undefined ? prop : null); 110 | 111 | } 112 | 113 | // note local scope. 114 | var localFeatures = { 115 | 116 | transform: { 117 | ie: has('-ms-transform'), 118 | moz: has('MozTransform'), 119 | opera: has('OTransform'), 120 | webkit: has('webkitTransform'), 121 | w3: has('transform'), 122 | prop: null // the normalized property value 123 | }, 124 | 125 | getAnimationFrame: getAnimationFrame 126 | 127 | }; 128 | 129 | localFeatures.transform.prop = ( 130 | localFeatures.transform.w3 || 131 | localFeatures.transform.moz || 132 | localFeatures.transform.webkit || 133 | localFeatures.transform.ie || 134 | localFeatures.transform.opera 135 | ); 136 | 137 | testDiv = null; 138 | 139 | return localFeatures; 140 | 141 | }()); 142 | 143 | this.timer = null; 144 | this.flakes = []; 145 | this.disabled = false; 146 | this.active = false; 147 | this.meltFrameCount = 20; 148 | this.meltFrames = []; 149 | 150 | this.setXY = function (o, x, y) { 151 | 152 | if (!o) { 153 | return false; 154 | } 155 | 156 | if (storm.usePixelPosition || targetElementIsRelative) { 157 | 158 | o.style.left = (x - storm.flakeWidth) + 'px'; 159 | o.style.top = (y - storm.flakeHeight) + 'px'; 160 | 161 | } else if (noFixed) { 162 | 163 | o.style.right = (100 - (x / screenX * 100)) + '%'; 164 | // avoid creating vertical scrollbars 165 | o.style.top = (Math.min(y, docHeight - storm.flakeHeight)) + 'px'; 166 | 167 | } else { 168 | 169 | if (!storm.flakeBottom) { 170 | 171 | // if not using a fixed bottom coordinate... 172 | o.style.right = (100 - (x / screenX * 100)) + '%'; 173 | o.style.bottom = (100 - (y / screenY * 100)) + '%'; 174 | 175 | } else { 176 | 177 | // absolute top. 178 | o.style.right = (100 - (x / screenX * 100)) + '%'; 179 | o.style.top = (Math.min(y, docHeight - storm.flakeHeight)) + 'px'; 180 | 181 | } 182 | 183 | } 184 | 185 | }; 186 | 187 | this.events = (function () { 188 | 189 | var old = (!window.addEventListener && window.attachEvent), slice = Array.prototype.slice, 190 | evt = { 191 | add: (old ? 'attachEvent' : 'addEventListener'), 192 | remove: (old ? 'detachEvent' : 'removeEventListener') 193 | }; 194 | 195 | function getArgs(oArgs) { 196 | var args = slice.call(oArgs), len = args.length; 197 | if (old) { 198 | args[1] = 'on' + args[1]; // prefix 199 | if (len > 3) { 200 | args.pop(); // no capture 201 | } 202 | } else if (len === 3) { 203 | args.push(false); 204 | } 205 | return args; 206 | } 207 | 208 | function apply(args, sType) { 209 | var element = args.shift(), 210 | method = [evt[sType]]; 211 | if (old) { 212 | element[method](args[0], args[1]); 213 | } else { 214 | element[method].apply(element, args); 215 | } 216 | } 217 | 218 | function addEvent() { 219 | apply(getArgs(arguments), 'add'); 220 | } 221 | 222 | function removeEvent() { 223 | apply(getArgs(arguments), 'remove'); 224 | } 225 | 226 | return { 227 | add: addEvent, 228 | remove: removeEvent 229 | }; 230 | 231 | }()); 232 | 233 | function rnd(n, min) { 234 | if (isNaN(min)) { 235 | min = 0; 236 | } 237 | return (Math.random() * n) + min; 238 | } 239 | 240 | function plusMinus(n) { 241 | return (parseInt(rnd(2), 10) === 1 ? n * -1 : n); 242 | } 243 | 244 | this.randomizeWind = function () { 245 | var i; 246 | vRndX = plusMinus(rnd(storm.vMaxX, 0.2)); 247 | vRndY = rnd(storm.vMaxY, 0.2); 248 | if (this.flakes) { 249 | for (i = 0; i < this.flakes.length; i++) { 250 | if (this.flakes[i].active) { 251 | this.flakes[i].setVelocities(); 252 | } 253 | } 254 | } 255 | }; 256 | 257 | this.scrollHandler = function () { 258 | var i; 259 | // "attach" snowflakes to bottom of window if no absolute bottom value was given 260 | scrollY = (storm.flakeBottom ? 0 : parseInt(window.scrollY || document.documentElement.scrollTop || (noFixed ? document.body.scrollTop : 0), 10)); 261 | if (isNaN(scrollY)) { 262 | scrollY = 0; // Netscape 6 scroll fix 263 | } 264 | if (!fixedForEverything && !storm.flakeBottom && storm.flakes) { 265 | for (i = 0; i < storm.flakes.length; i++) { 266 | if (storm.flakes[i].active === 0) { 267 | storm.flakes[i].stick(); 268 | } 269 | } 270 | } 271 | }; 272 | 273 | this.resizeHandler = function () { 274 | if (window.innerWidth || window.innerHeight) { 275 | screenX = window.innerWidth - 16 - storm.flakeRightOffset; 276 | screenY = (storm.flakeBottom || window.innerHeight); 277 | } else { 278 | screenX = (document.documentElement.clientWidth || document.body.clientWidth || document.body.scrollWidth) - (!isIE ? 8 : 0) - storm.flakeRightOffset; 279 | screenY = storm.flakeBottom || document.documentElement.clientHeight || document.body.clientHeight || document.body.scrollHeight; 280 | } 281 | docHeight = document.body.offsetHeight; 282 | screenX2 = parseInt(screenX / 2, 10); 283 | }; 284 | 285 | this.resizeHandlerAlt = function () { 286 | screenX = storm.targetElement.offsetWidth - storm.flakeRightOffset; 287 | screenY = storm.flakeBottom || storm.targetElement.offsetHeight; 288 | screenX2 = parseInt(screenX / 2, 10); 289 | docHeight = document.body.offsetHeight; 290 | }; 291 | 292 | this.freeze = function () { 293 | // pause animation 294 | if (!storm.disabled) { 295 | storm.disabled = 1; 296 | } else { 297 | return false; 298 | } 299 | storm.timer = null; 300 | }; 301 | 302 | this.resume = function () { 303 | if (storm.disabled) { 304 | storm.disabled = 0; 305 | } else { 306 | return false; 307 | } 308 | storm.timerInit(); 309 | }; 310 | 311 | this.toggleSnow = function () { 312 | if (!storm.flakes.length) { 313 | // first run 314 | storm.start(); 315 | } else { 316 | storm.active = !storm.active; 317 | if (storm.active) { 318 | storm.show(); 319 | storm.resume(); 320 | } else { 321 | storm.stop(); 322 | storm.freeze(); 323 | } 324 | } 325 | }; 326 | 327 | this.stop = function () { 328 | var i; 329 | this.freeze(); 330 | for (i = 0; i < this.flakes.length; i++) { 331 | this.flakes[i].o.style.display = 'none'; 332 | } 333 | storm.events.remove(window, 'scroll', storm.scrollHandler); 334 | storm.events.remove(window, 'resize', storm.resizeHandler); 335 | if (storm.freezeOnBlur) { 336 | if (isIE) { 337 | storm.events.remove(document, 'focusout', storm.freeze); 338 | storm.events.remove(document, 'focusin', storm.resume); 339 | } else { 340 | storm.events.remove(window, 'blur', storm.freeze); 341 | storm.events.remove(window, 'focus', storm.resume); 342 | } 343 | } 344 | }; 345 | 346 | this.show = function () { 347 | var i; 348 | for (i = 0; i < this.flakes.length; i++) { 349 | this.flakes[i].o.style.display = 'block'; 350 | } 351 | }; 352 | 353 | this.SnowFlake = function (type, x, y) { 354 | var s = this; 355 | this.type = type; 356 | this.x = x || parseInt(rnd(screenX - 20), 10); 357 | this.y = (!isNaN(y) ? y : -rnd(screenY) - 12); 358 | this.vX = null; 359 | this.vY = null; 360 | this.vAmpTypes = [1, 1.2, 1.4, 1.6, 1.8]; // "amplification" for vX/vY (based on flake size/type) 361 | this.vAmp = this.vAmpTypes[this.type] || 1; 362 | this.melting = false; 363 | this.meltFrameCount = storm.meltFrameCount; 364 | this.meltFrames = storm.meltFrames; 365 | this.meltFrame = 0; 366 | this.twinkleFrame = 0; 367 | this.active = 1; 368 | this.fontSize = (10 + (this.type / 5) * 10); 369 | this.o = document.createElement('div'); 370 | this.o.innerHTML = storm.snowCharacter; 371 | if (storm.className) { 372 | this.o.setAttribute('class', storm.className); 373 | } 374 | this.o.style.color = storm.snowColor; 375 | this.o.style.position = (fixedForEverything ? 'fixed' : 'absolute'); 376 | if (storm.useGPU && features.transform.prop) { 377 | // GPU-accelerated snow. 378 | this.o.style[features.transform.prop] = 'translate3d(0px, 0px, 0px)'; 379 | } 380 | this.o.style.width = storm.flakeWidth + 'px'; 381 | this.o.style.height = storm.flakeHeight + 'px'; 382 | this.o.style.fontFamily = 'arial,verdana'; 383 | this.o.style.cursor = 'default'; 384 | this.o.style.overflow = 'hidden'; 385 | this.o.style.fontWeight = 'normal'; 386 | this.o.style.zIndex = storm.zIndex; 387 | if (storm.accessibility) { 388 | this.o.setAttribute('aria-hidden', storm.accessibility); 389 | } 390 | docFrag.appendChild(this.o); 391 | 392 | this.refresh = function () { 393 | if (isNaN(s.x) || isNaN(s.y)) { 394 | // safety check 395 | return false; 396 | } 397 | storm.setXY(s.o, s.x, s.y); 398 | }; 399 | 400 | this.stick = function () { 401 | if (noFixed || (storm.targetElement !== document.documentElement && storm.targetElement !== document.body)) { 402 | s.o.style.top = (screenY + scrollY - storm.flakeHeight) + 'px'; 403 | } else if (storm.flakeBottom) { 404 | s.o.style.top = storm.flakeBottom + 'px'; 405 | } else { 406 | s.o.style.display = 'none'; 407 | s.o.style.top = 'auto'; 408 | s.o.style.bottom = '0%'; 409 | s.o.style.position = 'fixed'; 410 | s.o.style.display = 'block'; 411 | } 412 | }; 413 | 414 | this.vCheck = function () { 415 | if (s.vX >= 0 && s.vX < 0.2) { 416 | s.vX = 0.2; 417 | } else if (s.vX < 0 && s.vX > -0.2) { 418 | s.vX = -0.2; 419 | } 420 | if (s.vY >= 0 && s.vY < 0.2) { 421 | s.vY = 0.2; 422 | } 423 | }; 424 | 425 | this.move = function () { 426 | var vX = s.vX * windOffset, yDiff; 427 | s.x += vX; 428 | s.y += (s.vY * s.vAmp); 429 | if (s.x >= screenX || screenX - s.x < storm.flakeWidth) { // X-axis scroll check 430 | s.x = 0; 431 | } else if (vX < 0 && s.x - storm.flakeLeftOffset < -storm.flakeWidth) { 432 | s.x = screenX - storm.flakeWidth - 1; // flakeWidth; 433 | } 434 | s.refresh(); 435 | yDiff = screenY + scrollY - s.y + storm.flakeHeight; 436 | if (yDiff < storm.flakeHeight) { 437 | s.active = 0; 438 | if (storm.snowStick) { 439 | s.stick(); 440 | } else { 441 | s.recycle(); 442 | } 443 | } else { 444 | if (storm.useMeltEffect && s.active && s.type < 3 && !s.melting && Math.random() > 0.998) { 445 | // ~1/1000 chance of melting mid-air, with each frame 446 | s.melting = true; 447 | s.melt(); 448 | // only incrementally melt one frame 449 | // s.melting = false; 450 | } 451 | if (storm.useTwinkleEffect) { 452 | if (s.twinkleFrame < 0) { 453 | if (Math.random() > 0.97) { 454 | s.twinkleFrame = parseInt(Math.random() * 8, 10); 455 | } 456 | } else { 457 | s.twinkleFrame--; 458 | if (!opacitySupported) { 459 | s.o.style.visibility = (s.twinkleFrame && s.twinkleFrame % 2 === 0 ? 'hidden' : 'visible'); 460 | } else { 461 | s.o.style.opacity = (s.twinkleFrame && s.twinkleFrame % 2 === 0 ? 0 : 1); 462 | } 463 | } 464 | } 465 | } 466 | }; 467 | 468 | this.animate = function () { 469 | // main animation loop 470 | // move, check status, die etc. 471 | s.move(); 472 | }; 473 | 474 | this.setVelocities = function () { 475 | s.vX = vRndX + rnd(storm.vMaxX * 0.12, 0.1); 476 | s.vY = vRndY + rnd(storm.vMaxY * 0.12, 0.1); 477 | }; 478 | 479 | this.setOpacity = function (o, opacity) { 480 | if (!opacitySupported) { 481 | return false; 482 | } 483 | o.style.opacity = opacity; 484 | }; 485 | 486 | this.melt = function () { 487 | if (!storm.useMeltEffect || !s.melting) { 488 | s.recycle(); 489 | } else { 490 | if (s.meltFrame < s.meltFrameCount) { 491 | s.setOpacity(s.o, s.meltFrames[s.meltFrame]); 492 | s.o.style.fontSize = s.fontSize - (s.fontSize * (s.meltFrame / s.meltFrameCount)) + 'px'; 493 | s.o.style.lineHeight = storm.flakeHeight + 2 + (storm.flakeHeight * 0.75 * (s.meltFrame / s.meltFrameCount)) + 'px'; 494 | s.meltFrame++; 495 | } else { 496 | s.recycle(); 497 | } 498 | } 499 | }; 500 | 501 | this.recycle = function () { 502 | s.o.style.display = 'none'; 503 | s.o.style.position = (fixedForEverything ? 'fixed' : 'absolute'); 504 | s.o.style.bottom = 'auto'; 505 | s.setVelocities(); 506 | s.vCheck(); 507 | s.meltFrame = 0; 508 | s.melting = false; 509 | s.setOpacity(s.o, 1); 510 | s.o.style.padding = '0px'; 511 | s.o.style.margin = '0px'; 512 | s.o.style.fontSize = s.fontSize + 'px'; 513 | s.o.style.lineHeight = (storm.flakeHeight + 2) + 'px'; 514 | s.o.style.textAlign = 'center'; 515 | s.o.style.verticalAlign = 'baseline'; 516 | s.x = parseInt(rnd(screenX - storm.flakeWidth - 20), 10); 517 | s.y = parseInt(rnd(screenY) * -1, 10) - storm.flakeHeight; 518 | s.refresh(); 519 | s.o.style.display = 'block'; 520 | s.active = 1; 521 | }; 522 | 523 | this.recycle(); // set up x/y coords etc. 524 | this.refresh(); 525 | 526 | }; 527 | 528 | this.snow = function () { 529 | var active = 0, flake = null, i, j; 530 | for (i = 0, j = storm.flakes.length; i < j; i++) { 531 | if (storm.flakes[i].active === 1) { 532 | storm.flakes[i].move(); 533 | active++; 534 | } 535 | if (storm.flakes[i].melting) { 536 | storm.flakes[i].melt(); 537 | } 538 | } 539 | if (active < storm.flakesMaxActive) { 540 | flake = storm.flakes[parseInt(rnd(storm.flakes.length), 10)]; 541 | if (flake.active === 0) { 542 | flake.melting = true; 543 | } 544 | } 545 | if (storm.timer) { 546 | features.getAnimationFrame(storm.snow); 547 | } 548 | }; 549 | 550 | this.mouseMove = function (e) { 551 | if (!storm.followMouse) { 552 | return true; 553 | } 554 | var x = parseInt(e.clientX, 10); 555 | if (x < screenX2) { 556 | windOffset = -windMultiplier + (x / screenX2 * windMultiplier); 557 | } else { 558 | x -= screenX2; 559 | windOffset = (x / screenX2) * windMultiplier; 560 | } 561 | }; 562 | 563 | this.createSnow = function (limit, allowInactive) { 564 | var i; 565 | for (i = 0; i < limit; i++) { 566 | storm.flakes[storm.flakes.length] = new storm.SnowFlake(parseInt(rnd(flakeTypes), 10)); 567 | if (allowInactive || i > storm.flakesMaxActive) { 568 | storm.flakes[storm.flakes.length - 1].active = -1; 569 | } 570 | } 571 | storm.targetElement.appendChild(docFrag); 572 | }; 573 | 574 | this.timerInit = function () { 575 | storm.timer = true; 576 | storm.snow(); 577 | }; 578 | 579 | this.init = function () { 580 | var i; 581 | for (i = 0; i < storm.meltFrameCount; i++) { 582 | storm.meltFrames.push(1 - (i / storm.meltFrameCount)); 583 | } 584 | storm.randomizeWind(); 585 | storm.createSnow(storm.flakesMax); // create initial batch 586 | storm.events.add(window, 'resize', storm.resizeHandler); 587 | storm.events.add(window, 'scroll', storm.scrollHandler); 588 | if (storm.freezeOnBlur) { 589 | if (isIE) { 590 | storm.events.add(document, 'focusout', storm.freeze); 591 | storm.events.add(document, 'focusin', storm.resume); 592 | } else { 593 | storm.events.add(window, 'blur', storm.freeze); 594 | storm.events.add(window, 'focus', storm.resume); 595 | } 596 | } 597 | storm.resizeHandler(); 598 | storm.scrollHandler(); 599 | if (storm.followMouse) { 600 | storm.events.add(isIE ? document : window, 'mousemove', storm.mouseMove); 601 | } 602 | storm.animationInterval = Math.max(20, storm.animationInterval); 603 | storm.timerInit(); 604 | }; 605 | 606 | this.start = function (bFromOnLoad) { 607 | if (!didInit) { 608 | didInit = true; 609 | } else if (bFromOnLoad) { 610 | // already loaded and running 611 | return true; 612 | } 613 | if (typeof storm.targetElement === 'string') { 614 | var targetID = storm.targetElement; 615 | storm.targetElement = document.getElementById(targetID); 616 | if (!storm.targetElement) { 617 | throw new Error('Snowstorm: Unable to get targetElement "' + targetID + '"'); 618 | } 619 | } 620 | if (!storm.targetElement) { 621 | storm.targetElement = (document.body || document.documentElement); 622 | } 623 | if (storm.targetElement !== document.documentElement && storm.targetElement !== document.body) { 624 | // re-map handler to get element instead of screen dimensions 625 | storm.resizeHandler = storm.resizeHandlerAlt; 626 | //and force-enable pixel positioning 627 | storm.usePixelPosition = true; 628 | } 629 | storm.resizeHandler(); // get bounding box elements 630 | storm.usePositionFixed = (storm.usePositionFixed && !noFixed && !storm.flakeBottom); // whether or not position:fixed is to be used 631 | if (window.getComputedStyle) { 632 | // attempt to determine if body or user-specified snow parent element is relatlively-positioned. 633 | try { 634 | targetElementIsRelative = (window.getComputedStyle(storm.targetElement, null).getPropertyValue('position') === 'relative'); 635 | } catch (e) { 636 | // oh well 637 | targetElementIsRelative = false; 638 | } 639 | } 640 | fixedForEverything = storm.usePositionFixed; 641 | if (screenX && screenY && !storm.disabled) { 642 | storm.init(); 643 | storm.active = true; 644 | } 645 | }; 646 | 647 | function doDelayedStart() { 648 | window.setTimeout(function () { 649 | storm.start(true); 650 | }, 20); 651 | // event cleanup 652 | storm.events.remove(isIE ? document : window, 'mousemove', doDelayedStart); 653 | } 654 | 655 | function doStart() { 656 | if (!storm.excludeMobile || !isMobile) { 657 | doDelayedStart(); 658 | } 659 | // event cleanup 660 | storm.events.remove(window, 'load', doStart); 661 | } 662 | 663 | // hooks for starting the snow 664 | if (storm.autoStart) { 665 | storm.events.add(window, 'load', doStart, false); 666 | } 667 | 668 | return this; 669 | 670 | }(window, document)); -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/logo.png -------------------------------------------------------------------------------- /assets/mouredev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/mouredev.png -------------------------------------------------------------------------------- /assets/mouredevpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/mouredevpro.png -------------------------------------------------------------------------------- /assets/nuwe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/nuwe.png -------------------------------------------------------------------------------- /assets/preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/preview.jpg -------------------------------------------------------------------------------- /assets/raiola.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/assets/raiola.png -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | python3 -m venv .venv 2 | source .venv/bin/activate 3 | pip install --upgrade pip 4 | pip install -r requirements.txt 5 | rm -rf public 6 | reflex init 7 | reflex export --frontend-only 8 | rm -fr public 9 | unzip frontend.zip -d public 10 | rm -f frontend.zip 11 | deactivate -------------------------------------------------------------------------------- /images/preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/images/preview.gif -------------------------------------------------------------------------------- /local_build.sh: -------------------------------------------------------------------------------- 1 | source .venv/bin/activate 2 | pip install --upgrade pip 3 | pip install -r requirements.txt 4 | reflex init 5 | reflex export --frontend-only 6 | rm -fr public 7 | unzip frontend.zip -d public 8 | rm -f frontend.zip 9 | deactivate -------------------------------------------------------------------------------- /public/404.html: -------------------------------------------------------------------------------- 1 | 404 - Not Found
-------------------------------------------------------------------------------- /public/404/index.html: -------------------------------------------------------------------------------- 1 | 404 - Not Found
-------------------------------------------------------------------------------- /public/_next/static/T16C-hRtD-1WimmMH9Q6S/_buildManifest.js: -------------------------------------------------------------------------------- 1 | self.__BUILD_MANIFEST=function(s){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":[s,"static/chunks/pages/index-2b84bf8ff9277386.js"],"/404":[s,"static/chunks/pages/404-db12dd41ea12cc8e.js"],"/_error":["static/chunks/pages/_error-7a92967bea80186d.js"],sortedPages:["/","/404","/_app","/_error"]}}("static/chunks/346-2c50c61a3d9c062f.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB(); -------------------------------------------------------------------------------- /public/_next/static/T16C-hRtD-1WimmMH9Q6S/_ssgManifest.js: -------------------------------------------------------------------------------- 1 | self.__SSG_MANIFEST=new Set,self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB(); -------------------------------------------------------------------------------- /public/_next/static/chunks/346-2c50c61a3d9c062f.js: -------------------------------------------------------------------------------- 1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[346],{2377:function(t,e,a){"use strict";a.d(e,{Z:function(){return s}});var r=a(7294),n={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let o=t=>t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),s=((t,e)=>{let a=(0,r.forwardRef)((a,s)=>{let{color:i="currentColor",size:l=24,strokeWidth:d=2,absoluteStrokeWidth:c,className:u="",children:h,...m}=a;return(0,r.createElement)("svg",{ref:s,...n,width:l,height:l,stroke:i,strokeWidth:c?24*Number(d)/Number(l):d,className:["lucide","lucide-".concat(o(t)),u].join(" "),...m},[...e.map(t=>{let[e,a]=t;return(0,r.createElement)(e,a)}),...Array.isArray(h)?h:[h]])});return a.displayName="".concat(t),a})("WifiOff",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]])},9008:function(t,e,a){t.exports=a(3867)},2729:function(t,e,a){"use strict";function r(t,e){return e||(e=t.slice(0)),Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))}a.d(e,{_:function(){return r}})},4712:function(t,e,a){"use strict";a.d(e,{Am:function(){return g},x7:function(){return x}});var r=a(7294),n=a(3935),o=t=>{switch(t){case"success":return l;case"info":return c;case"warning":return d;case"error":return u;default:return null}},s=Array(12).fill(0),i=({visible:t})=>r.createElement("div",{className:"sonner-loading-wrapper","data-visible":t},r.createElement("div",{className:"sonner-spinner"},s.map((t,e)=>r.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${e}`})))),l=r.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},r.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),d=r.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},r.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),c=r.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},r.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),u=r.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},r.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),h=()=>{let[t,e]=r.useState(document.hidden);return r.useEffect(()=>{let t=()=>{e(document.hidden)};return document.addEventListener("visibilitychange",t),()=>window.removeEventListener("visibilitychange",t)},[]),t},m=1,f=new class{constructor(){this.subscribe=t=>(this.subscribers.push(t),()=>{let e=this.subscribers.indexOf(t);this.subscribers.splice(e,1)}),this.publish=t=>{this.subscribers.forEach(e=>e(t))},this.addToast=t=>{this.publish(t),this.toasts=[...this.toasts,t]},this.create=t=>{var e;let{message:a,...r}=t,n="number"==typeof(null==t?void 0:t.id)||(null==(e=t.id)?void 0:e.length)>0?t.id:m++,o=this.toasts.find(t=>t.id===n),s=void 0===t.dismissible||t.dismissible;return o?this.toasts=this.toasts.map(e=>e.id===n?(this.publish({...e,...t,id:n,title:a}),{...e,...t,id:n,dismissible:s,title:a}):e):this.addToast({title:a,...r,dismissible:s,id:n}),n},this.dismiss=t=>(t||this.toasts.forEach(t=>{this.subscribers.forEach(e=>e({id:t.id,dismiss:!0}))}),this.subscribers.forEach(e=>e({id:t,dismiss:!0})),t),this.message=(t,e)=>this.create({...e,message:t}),this.error=(t,e)=>this.create({...e,message:t,type:"error"}),this.success=(t,e)=>this.create({...e,type:"success",message:t}),this.info=(t,e)=>this.create({...e,type:"info",message:t}),this.warning=(t,e)=>this.create({...e,type:"warning",message:t}),this.loading=(t,e)=>this.create({...e,type:"loading",message:t}),this.promise=(t,e)=>{let a;if(!e)return;void 0!==e.loading&&(a=this.create({...e,promise:t,type:"loading",message:e.loading,description:"function"!=typeof e.description?e.description:void 0}));let r=t instanceof Promise?t:t(),n=void 0!==a;return r.then(async t=>{if(p(t)&&!t.ok){n=!1;let r="function"==typeof e.error?await e.error(`HTTP error! status: ${t.status}`):e.error,o="function"==typeof e.description?await e.description(`HTTP error! status: ${t.status}`):e.description;this.create({id:a,type:"error",message:r,description:o})}else if(void 0!==e.success){n=!1;let r="function"==typeof e.success?await e.success(t):e.success,o="function"==typeof e.description?await e.description(t):e.description;this.create({id:a,type:"success",message:r,description:o})}}).catch(async t=>{if(void 0!==e.error){n=!1;let r="function"==typeof e.error?await e.error(t):e.error,o="function"==typeof e.description?await e.description(t):e.description;this.create({id:a,type:"error",message:r,description:o})}}).finally(()=>{var t;n&&(this.dismiss(a),a=void 0),null==(t=e.finally)||t.call(e)}),a},this.custom=(t,e)=>{let a=(null==e?void 0:e.id)||m++;return this.create({jsx:t(a),id:a,...e}),a},this.subscribers=[],this.toasts=[]}},p=t=>t&&"object"==typeof t&&"ok"in t&&"boolean"==typeof t.ok&&"status"in t&&"number"==typeof t.status,g=Object.assign((t,e)=>{let a=(null==e?void 0:e.id)||m++;return f.addToast({title:t,...e,id:a}),a},{success:f.success,info:f.info,warning:f.warning,error:f.error,custom:f.custom,message:f.message,promise:f.promise,dismiss:f.dismiss,loading:f.loading},{getHistory:()=>f.toasts});function v(t){return void 0!==t.label}function b(...t){return t.filter(Boolean).join(" ")}!function(t,{insertAt:e}={}){if(!t||"undefined"==typeof document)return;let a=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css","top"===e&&a.firstChild?a.insertBefore(r,a.firstChild):a.appendChild(r),r.styleSheet?r.styleSheet.cssText=t:r.appendChild(document.createTextNode(t))}(`:where(html[dir="ltr"]),:where([data-sonner-toaster][dir="ltr"]){--toast-icon-margin-start: -3px;--toast-icon-margin-end: 4px;--toast-svg-margin-start: -1px;--toast-svg-margin-end: 0px;--toast-button-margin-start: auto;--toast-button-margin-end: 0;--toast-close-button-start: 0;--toast-close-button-end: unset;--toast-close-button-transform: translate(-35%, -35%)}:where(html[dir="rtl"]),:where([data-sonner-toaster][dir="rtl"]){--toast-icon-margin-start: 4px;--toast-icon-margin-end: -3px;--toast-svg-margin-start: 0px;--toast-svg-margin-end: -1px;--toast-button-margin-start: 0;--toast-button-margin-end: auto;--toast-close-button-start: unset;--toast-close-button-end: 0;--toast-close-button-transform: translate(35%, -35%)}:where([data-sonner-toaster]){position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1: hsl(0, 0%, 99%);--gray2: hsl(0, 0%, 97.3%);--gray3: hsl(0, 0%, 95.1%);--gray4: hsl(0, 0%, 93%);--gray5: hsl(0, 0%, 90.9%);--gray6: hsl(0, 0%, 88.7%);--gray7: hsl(0, 0%, 85.8%);--gray8: hsl(0, 0%, 78%);--gray9: hsl(0, 0%, 56.1%);--gray10: hsl(0, 0%, 52.3%);--gray11: hsl(0, 0%, 43.5%);--gray12: hsl(0, 0%, 9%);--border-radius: 8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:none;z-index:999999999}:where([data-sonner-toaster][data-x-position="right"]){right:max(var(--offset),env(safe-area-inset-right))}:where([data-sonner-toaster][data-x-position="left"]){left:max(var(--offset),env(safe-area-inset-left))}:where([data-sonner-toaster][data-x-position="center"]){left:50%;transform:translate(-50%)}:where([data-sonner-toaster][data-y-position="top"]){top:max(var(--offset),env(safe-area-inset-top))}:where([data-sonner-toaster][data-y-position="bottom"]){bottom:max(var(--offset),env(safe-area-inset-bottom))}:where([data-sonner-toast]){--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);filter:blur(0);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:none;overflow-wrap:anywhere}:where([data-sonner-toast][data-styled="true"]){padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px #0000001a;width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}:where([data-sonner-toast]:focus-visible){box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast][data-y-position="top"]){top:0;--y: translateY(-100%);--lift: 1;--lift-amount: calc(1 * var(--gap))}:where([data-sonner-toast][data-y-position="bottom"]){bottom:0;--y: translateY(100%);--lift: -1;--lift-amount: calc(var(--lift) * var(--gap))}:where([data-sonner-toast]) :where([data-description]){font-weight:400;line-height:1.4;color:inherit}:where([data-sonner-toast]) :where([data-title]){font-weight:500;line-height:1.5;color:inherit}:where([data-sonner-toast]) :where([data-icon]){display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}:where([data-sonner-toast][data-promise="true"]) :where([data-icon])>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}:where([data-sonner-toast]) :where([data-icon])>*{flex-shrink:0}:where([data-sonner-toast]) :where([data-icon]) svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}:where([data-sonner-toast]) :where([data-content]){display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;cursor:pointer;outline:none;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}:where([data-sonner-toast]) :where([data-button]):focus-visible{box-shadow:0 0 0 2px #0006}:where([data-sonner-toast]) :where([data-button]):first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}:where([data-sonner-toast]) :where([data-cancel]){color:var(--normal-text);background:rgba(0,0,0,.08)}:where([data-sonner-toast][data-theme="dark"]) :where([data-cancel]){background:rgba(255,255,255,.3)}:where([data-sonner-toast]) :where([data-close-button]){position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;background:var(--gray1);color:var(--gray12);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}:where([data-sonner-toast]) :where([data-close-button]):focus-visible{box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast]) :where([data-disabled="true"]){cursor:not-allowed}:where([data-sonner-toast]):hover :where([data-close-button]):hover{background:var(--gray2);border-color:var(--gray5)}:where([data-sonner-toast][data-swiping="true"]):before{content:"";position:absolute;left:0;right:0;height:100%;z-index:-1}:where([data-sonner-toast][data-y-position="top"][data-swiping="true"]):before{bottom:50%;transform:scaleY(3) translateY(50%)}:where([data-sonner-toast][data-y-position="bottom"][data-swiping="true"]):before{top:50%;transform:scaleY(3) translateY(-50%)}:where([data-sonner-toast][data-swiping="false"][data-removed="true"]):before{content:"";position:absolute;inset:0;transform:scaleY(2)}:where([data-sonner-toast]):after{content:"";position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}:where([data-sonner-toast][data-mounted="true"]){--y: translateY(0);opacity:1}:where([data-sonner-toast][data-expanded="false"][data-front="false"]){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}:where([data-sonner-toast])>*{transition:opacity .4s}:where([data-sonner-toast][data-expanded="false"][data-front="false"][data-styled="true"])>*{opacity:0}:where([data-sonner-toast][data-visible="false"]){opacity:0;pointer-events:none}:where([data-sonner-toast][data-mounted="true"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}:where([data-sonner-toast][data-removed="true"][data-front="true"][data-swipe-out="false"]){--y: translateY(calc(var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="false"]){--y: translateY(40%);opacity:0;transition:transform .5s,opacity .2s}:where([data-sonner-toast][data-removed="true"][data-front="false"]):before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount, 0px));transition:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation:swipe-out .2s ease-out forwards}@keyframes swipe-out{0%{transform:translateY(calc(var(--lift) * var(--offset) + var(--swipe-amount)));opacity:1}to{transform:translateY(calc(var(--lift) * var(--offset) + var(--swipe-amount) + var(--lift) * -100%));opacity:0}}@media (max-width: 600px){[data-sonner-toaster]{position:fixed;--mobile-offset: 16px;right:var(--mobile-offset);left:var(--mobile-offset);width:100%}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset)}[data-sonner-toaster][data-y-position=bottom]{bottom:20px}[data-sonner-toaster][data-y-position=top]{top:20px}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset);right:var(--mobile-offset);transform:none}}[data-sonner-toaster][data-theme=light]{--normal-bg: #fff;--normal-border: var(--gray4);--normal-text: var(--gray12);--success-bg: hsl(143, 85%, 96%);--success-border: hsl(145, 92%, 91%);--success-text: hsl(140, 100%, 27%);--info-bg: hsl(208, 100%, 97%);--info-border: hsl(221, 91%, 91%);--info-text: hsl(210, 92%, 45%);--warning-bg: hsl(49, 100%, 97%);--warning-border: hsl(49, 91%, 91%);--warning-text: hsl(31, 92%, 45%);--error-bg: hsl(359, 100%, 97%);--error-border: hsl(359, 100%, 94%);--error-text: hsl(360, 100%, 45%)}[data-sonner-toaster][data-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg: #000;--normal-border: hsl(0, 0%, 20%);--normal-text: var(--gray1)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg: #fff;--normal-border: var(--gray3);--normal-text: var(--gray12)}[data-sonner-toaster][data-theme=dark]{--normal-bg: #000;--normal-border: hsl(0, 0%, 20%);--normal-text: var(--gray1);--success-bg: hsl(150, 100%, 6%);--success-border: hsl(147, 100%, 12%);--success-text: hsl(150, 86%, 65%);--info-bg: hsl(215, 100%, 6%);--info-border: hsl(223, 100%, 12%);--info-text: hsl(216, 87%, 65%);--warning-bg: hsl(64, 100%, 6%);--warning-border: hsl(60, 100%, 12%);--warning-text: hsl(46, 87%, 65%);--error-bg: hsl(358, 76%, 10%);--error-border: hsl(357, 89%, 16%);--error-text: hsl(358, 100%, 81%)}[data-rich-colors=true][data-sonner-toast][data-type=success],[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info],[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning],[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error],[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size: 16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:nth-child(1){animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}to{opacity:.15}}@media (prefers-reduced-motion){[data-sonner-toast],[data-sonner-toast]>*,.sonner-loading-bar{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)} 2 | `);var y=t=>{var e,a,n,s,l,d,c,u,m,f;let{invert:p,toast:g,unstyled:b,interacting:y,setHeights:w,visibleToasts:x,heights:k,index:E,toasts:N,expanded:B,removeToast:C,defaultRichColors:M,closeButton:S,style:T,cancelButtonStyle:z,actionButtonStyle:R,className:j="",descriptionClassName:I="",duration:Y,position:L,gap:P,loadingIcon:A,expandByDefault:H,classNames:$,icons:D,closeButtonAriaLabel:O="Close toast",pauseWhenPageIsHidden:W,cn:U}=t,[V,_]=r.useState(!1),[F,K]=r.useState(!1),[X,Z]=r.useState(!1),[q,G]=r.useState(!1),[J,Q]=r.useState(0),[tt,te]=r.useState(0),ta=r.useRef(null),tr=r.useRef(null),tn=0===E,to=E+1<=x,ts=g.type,ti=!1!==g.dismissible,tl=g.className||"",td=g.descriptionClassName||"",tc=r.useMemo(()=>k.findIndex(t=>t.toastId===g.id)||0,[k,g.id]),tu=r.useMemo(()=>{var t;return null!=(t=g.closeButton)?t:S},[g.closeButton,S]),th=r.useMemo(()=>g.duration||Y||4e3,[g.duration,Y]),tm=r.useRef(0),tf=r.useRef(0),tp=r.useRef(0),tg=r.useRef(null),[tv,tb]=L.split("-"),ty=r.useMemo(()=>k.reduce((t,e,a)=>a>=tc?t:t+e.height,0),[k,tc]),tw=h(),tx=g.invert||p,tk="loading"===ts;tf.current=r.useMemo(()=>tc*P+ty,[tc,ty]),r.useEffect(()=>{_(!0)},[]),r.useLayoutEffect(()=>{if(!V)return;let t=tr.current,e=t.style.height;t.style.height="auto";let a=t.getBoundingClientRect().height;t.style.height=e,te(a),w(t=>t.find(t=>t.toastId===g.id)?t.map(t=>t.toastId===g.id?{...t,height:a}:t):[{toastId:g.id,height:a,position:g.position},...t])},[V,g.title,g.description,w,g.id]);let tE=r.useCallback(()=>{K(!0),Q(tf.current),w(t=>t.filter(t=>t.toastId!==g.id)),setTimeout(()=>{C(g)},200)},[g,C,w,tf]);return r.useEffect(()=>{if(g.promise&&"loading"===ts||g.duration===1/0||"loading"===g.type)return;let t,e=th;return B||y||W&&tw?(()=>{if(tp.current{var t;null==(t=g.onAutoClose)||t.call(g,g),tE()},e)),()=>clearTimeout(t)},[B,y,H,g,th,tE,g.promise,ts,W,tw]),r.useEffect(()=>{let t=tr.current;if(t){let e=t.getBoundingClientRect().height;return te(e),w(t=>[{toastId:g.id,height:e,position:g.position},...t]),()=>w(t=>t.filter(t=>t.toastId!==g.id))}},[w,g.id]),r.useEffect(()=>{g.delete&&tE()},[tE,g.delete]),r.createElement("li",{"aria-live":g.important?"assertive":"polite","aria-atomic":"true",role:"status",tabIndex:0,ref:tr,className:U(j,tl,null==$?void 0:$.toast,null==(e=null==g?void 0:g.classNames)?void 0:e.toast,null==$?void 0:$.default,null==$?void 0:$[ts],null==(a=null==g?void 0:g.classNames)?void 0:a[ts]),"data-sonner-toast":"","data-rich-colors":null!=(n=g.richColors)?n:M,"data-styled":!(g.jsx||g.unstyled||b),"data-mounted":V,"data-promise":!!g.promise,"data-removed":F,"data-visible":to,"data-y-position":tv,"data-x-position":tb,"data-index":E,"data-front":tn,"data-swiping":X,"data-dismissible":ti,"data-type":ts,"data-invert":tx,"data-swipe-out":q,"data-expanded":!!(B||H&&V),style:{"--index":E,"--toasts-before":E,"--z-index":N.length-E,"--offset":`${F?J:tf.current}px`,"--initial-height":H?"auto":`${tt}px`,...T,...g.style},onPointerDown:t=>{tk||!ti||(ta.current=new Date,Q(tf.current),t.target.setPointerCapture(t.pointerId),"BUTTON"!==t.target.tagName&&(Z(!0),tg.current={x:t.clientX,y:t.clientY}))},onPointerUp:()=>{var t,e,a,r;if(q||!ti)return;tg.current=null;let n=Number((null==(t=tr.current)?void 0:t.style.getPropertyValue("--swipe-amount").replace("px",""))||0),o=new Date().getTime()-(null==(e=ta.current)?void 0:e.getTime());if(Math.abs(n)>=20||Math.abs(n)/o>.11){Q(tf.current),null==(a=g.onDismiss)||a.call(g,g),tE(),G(!0);return}null==(r=tr.current)||r.style.setProperty("--swipe-amount","0px"),Z(!1)},onPointerMove:t=>{var e;if(!tg.current||!ti)return;let a=t.clientY-tg.current.y,r=t.clientX-tg.current.x,n=("top"===tv?Math.min:Math.max)(0,a),o="touch"===t.pointerType?10:2;Math.abs(n)>o?null==(e=tr.current)||e.style.setProperty("--swipe-amount",`${a}px`):Math.abs(r)>o&&(tg.current=null)}},tu&&!g.jsx?r.createElement("button",{"aria-label":O,"data-disabled":tk,"data-close-button":!0,onClick:tk||!ti?()=>{}:()=>{var t;tE(),null==(t=g.onDismiss)||t.call(g,g)},className:U(null==$?void 0:$.closeButton,null==(s=null==g?void 0:g.classNames)?void 0:s.closeButton)},r.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},r.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),r.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"}))):null,g.jsx||r.isValidElement(g.title)?g.jsx||g.title:r.createElement(r.Fragment,null,ts||g.icon||g.promise?r.createElement("div",{"data-icon":"",className:U(null==$?void 0:$.icon,null==(l=null==g?void 0:g.classNames)?void 0:l.icon)},g.promise||"loading"===g.type&&!g.icon?g.icon||(null!=D&&D.loading?r.createElement("div",{className:"sonner-loader","data-visible":"loading"===ts},D.loading):A?r.createElement("div",{className:"sonner-loader","data-visible":"loading"===ts},A):r.createElement(i,{visible:"loading"===ts})):null,"loading"!==g.type?g.icon||(null==D?void 0:D[ts])||o(ts):null):null,r.createElement("div",{"data-content":"",className:U(null==$?void 0:$.content,null==(d=null==g?void 0:g.classNames)?void 0:d.content)},r.createElement("div",{"data-title":"",className:U(null==$?void 0:$.title,null==(c=null==g?void 0:g.classNames)?void 0:c.title)},g.title),g.description?r.createElement("div",{"data-description":"",className:U(I,td,null==$?void 0:$.description,null==(u=null==g?void 0:g.classNames)?void 0:u.description)},g.description):null),r.isValidElement(g.cancel)?g.cancel:g.cancel&&v(g.cancel)?r.createElement("button",{"data-button":!0,"data-cancel":!0,style:g.cancelButtonStyle||z,onClick:t=>{var e,a;v(g.cancel)&&ti&&(null==(a=(e=g.cancel).onClick)||a.call(e,t),tE())},className:U(null==$?void 0:$.cancelButton,null==(m=null==g?void 0:g.classNames)?void 0:m.cancelButton)},g.cancel.label):null,r.isValidElement(g.action)?g.action:g.action&&v(g.action)?r.createElement("button",{"data-button":!0,"data-action":!0,style:g.actionButtonStyle||R,onClick:t=>{var e,a;v(g.action)&&(t.defaultPrevented||(null==(a=(e=g.action).onClick)||a.call(e,t),tE()))},className:U(null==$?void 0:$.actionButton,null==(f=null==g?void 0:g.classNames)?void 0:f.actionButton)},g.action.label):null))};function w(){if("undefined"==typeof window||"undefined"==typeof document)return"ltr";let t=document.documentElement.getAttribute("dir");return"auto"!==t&&t?t:window.getComputedStyle(document.documentElement).direction}var x=t=>{let{invert:e,position:a="bottom-right",hotkey:o=["altKey","KeyT"],expand:s,closeButton:i,className:l,offset:d,theme:c="light",richColors:u,duration:h,style:m,visibleToasts:p=3,toastOptions:g,dir:v=w(),gap:x=14,loadingIcon:k,icons:E,containerAriaLabel:N="Notifications",pauseWhenPageIsHidden:B,cn:C=b}=t,[M,S]=r.useState([]),T=r.useMemo(()=>Array.from(new Set([a].concat(M.filter(t=>t.position).map(t=>t.position)))),[M,a]),[z,R]=r.useState([]),[j,I]=r.useState(!1),[Y,L]=r.useState(!1),[P,A]=r.useState("system"!==c?c:"undefined"!=typeof window&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),H=r.useRef(null),$=o.join("+").replace(/Key/g,"").replace(/Digit/g,""),D=r.useRef(null),O=r.useRef(!1),W=r.useCallback(t=>{var e;null!=(e=M.find(e=>e.id===t.id))&&e.delete||f.dismiss(t.id),S(e=>e.filter(({id:e})=>e!==t.id))},[M]);return r.useEffect(()=>f.subscribe(t=>{if(t.dismiss){S(e=>e.map(e=>e.id===t.id?{...e,delete:!0}:e));return}setTimeout(()=>{n.flushSync(()=>{S(e=>{let a=e.findIndex(e=>e.id===t.id);return -1!==a?[...e.slice(0,a),{...e[a],...t},...e.slice(a+1)]:[t,...e]})})})}),[]),r.useEffect(()=>{if("system"!==c){A(c);return}"system"===c&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?A("dark"):A("light")),"undefined"!=typeof window&&window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",({matches:t})=>{A(t?"dark":"light")})},[c]),r.useEffect(()=>{M.length<=1&&I(!1)},[M]),r.useEffect(()=>{let t=t=>{var e,a;o.every(e=>t[e]||t.code===e)&&(I(!0),null==(e=H.current)||e.focus()),"Escape"===t.code&&(document.activeElement===H.current||null!=(a=H.current)&&a.contains(document.activeElement))&&I(!1)};return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[o]),r.useEffect(()=>{if(H.current)return()=>{D.current&&(D.current.focus({preventScroll:!0}),D.current=null,O.current=!1)}},[H.current]),M.length?r.createElement("section",{"aria-label":`${N} ${$}`,tabIndex:-1},T.map((t,a)=>{var n;let[o,c]=t.split("-");return r.createElement("ol",{key:t,dir:"auto"===v?w():v,tabIndex:-1,ref:H,className:l,"data-sonner-toaster":!0,"data-theme":P,"data-y-position":o,"data-x-position":c,style:{"--front-toast-height":`${(null==(n=z[0])?void 0:n.height)||0}px`,"--offset":"number"==typeof d?`${d}px`:d||"32px","--width":"356px","--gap":`${x}px`,...m},onBlur:t=>{O.current&&!t.currentTarget.contains(t.relatedTarget)&&(O.current=!1,D.current&&(D.current.focus({preventScroll:!0}),D.current=null))},onFocus:t=>{t.target instanceof HTMLElement&&"false"===t.target.dataset.dismissible||O.current||(O.current=!0,D.current=t.relatedTarget)},onMouseEnter:()=>I(!0),onMouseMove:()=>I(!0),onMouseLeave:()=>{Y||I(!1)},onPointerDown:t=>{t.target instanceof HTMLElement&&"false"===t.target.dataset.dismissible||L(!0)},onPointerUp:()=>L(!1)},M.filter(e=>!e.position&&0===a||e.position===t).map((a,n)=>{var o,l;return r.createElement(y,{key:a.id,icons:E,index:n,toast:a,defaultRichColors:u,duration:null!=(o=null==g?void 0:g.duration)?o:h,className:null==g?void 0:g.className,descriptionClassName:null==g?void 0:g.descriptionClassName,invert:e,visibleToasts:p,closeButton:null!=(l=null==g?void 0:g.closeButton)?l:i,interacting:Y,position:t,style:null==g?void 0:g.style,unstyled:null==g?void 0:g.unstyled,classNames:null==g?void 0:g.classNames,cancelButtonStyle:null==g?void 0:g.cancelButtonStyle,actionButtonStyle:null==g?void 0:g.actionButtonStyle,removeToast:W,toasts:M.filter(t=>t.position==a.position),heights:z.filter(t=>t.position==a.position),setHeights:R,expandByDefault:s,gap:x,loadingIcon:k,expanded:j,pauseWhenPageIsHidden:B,cn:C})}))})):null}}}]); -------------------------------------------------------------------------------- /public/_next/static/chunks/pages/404-db12dd41ea12cc8e.js: -------------------------------------------------------------------------------- 1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[197],{394:function(e,t,n){(window.__NEXT_P=window.__NEXT_P||[]).push(["/404",function(){return n(6367)}])},6367:function(e,t,n){"use strict";n.r(t),n.d(t,{Div_64093a13086094dda35345330da0660b:function(){return x},Fragment_ecc7fc8159e7de57fc1e48e5f03b41bb:function(){return w},Toaster_9d6e054b03c6e5d1bea1c0a5576b4e6d:function(){return C},default:function(){return v}});var o=n(2729),r=n(5944),i=n(7294),c=n(8039),s=n(9654),a=n(2377),u=n(917),d=n(4712),l=n(3954),f=n(2918),h=n.n(f),m=n(1163);let p=()=>{let[e,t]=(0,i.useState)(!1),n=(0,i.useRef)(!1),o=(0,m.useRouter)();return(0,i.useEffect)(()=>{o.isReady&&!n.current&&(n.current=!0,o.replace({pathname:window.location.pathname,query:window.location.search.slice(1)}).then(()=>{"/404"===o.pathname&&t(!0)}).catch(e=>{t(!0)}))},[o.isReady]),e};var g=n(9008),_=n.n(g);function Z(){let e=(0,o._)(["\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n"]);return Z=function(){return e},e}function x(){let[e,t]=(0,i.useContext)(c.EventLoopContext);return(0,r.tZ)("div",{css:{position:"fixed",width:"100vw",height:"0"},title:"Connection Error: "+(t.length>0?t[t.length-1].message:""),children:(0,r.tZ)(w,{})})}function C(){let{resolvedColorMode:e}=(0,i.useContext)(c.ColorModeContext);s.refs.__toast=d.Am;let[t,n]=(0,i.useContext)(c.EventLoopContext),o={description:"Check if server is reachable at "+(0,s.getBackendURL)(l.Ks).href,closeButton:!0,duration:12e4,id:"websocket-error"},[a,u]=(0,i.useState)(!1);return(0,i.useEffect)(()=>{n.length>=2?a||d.Am.error("Cannot connect to server: ".concat(n.length>0?n[n.length-1].message:"","."),{...o,onDismiss:()=>u(!0)}):(d.Am.dismiss("websocket-error"),u(!1))},[n]),(0,r.tZ)(d.x7,{closeButton:!1,expand:!0,position:"bottom-right",richColors:!0,theme:e})}function w(){let[e,t]=(0,i.useContext)(c.EventLoopContext);return(0,r.tZ)(i.Fragment,{children:(0,s.isTrue)(t.length>0)?(0,r.tZ)(i.Fragment,{children:(0,r.tZ)(a.Z,{css:{color:"crimson",zIndex:9999,position:"fixed",bottom:"33px",right:"33px",animation:b+" 1s infinite"},size:32})}):(0,r.tZ)(i.Fragment,{})})}let b=(0,u.keyframes)(Z());function v(){let e=p();return(0,r.BX)(i.Fragment,{children:[(0,r.BX)(i.Fragment,{children:[(0,r.tZ)(x,{}),(0,r.tZ)(C,{})]}),(0,r.tZ)(i.Fragment,{children:(0,s.isTrue)(e)?(0,r.tZ)(i.Fragment,{children:(0,r.tZ)(h(),{statusCode:404})}):(0,r.tZ)(i.Fragment,{})}),(0,r.BX)(_(),{children:[(0,r.tZ)("title",{children:"404 - Not Found"}),(0,r.tZ)("meta",{content:"The page was not found",name:"description"}),(0,r.tZ)("meta",{content:"favicon.ico",property:"og:image"})]})]})}},2918:function(e,t,n){e.exports=n(2111)}},function(e){e.O(0,[346,888,774,179],function(){return e(e.s=394)}),_N_E=e.O()}]); -------------------------------------------------------------------------------- /public/_next/static/chunks/pages/_error-7a92967bea80186d.js: -------------------------------------------------------------------------------- 1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[820],{1981:function(n,_,u){(window.__NEXT_P=window.__NEXT_P||[]).push(["/_error",function(){return u(2111)}])}},function(n){n.O(0,[888,774,179],function(){return n(n.s=1981)}),_N_E=n.O()}]); -------------------------------------------------------------------------------- /public/_next/static/chunks/pages/index-2b84bf8ff9277386.js: -------------------------------------------------------------------------------- 1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[405],{5557:function(e,t,n){(window.__NEXT_P=window.__NEXT_P||[]).push(["/",function(){return n(9828)}])},9828:function(e,t,n){"use strict";n.r(t),n.d(t,{Button_448bf31aa98f039c87efe69a4dcf2067:function(){return F},Button_52004ecd9616538ec3ff37165456098f:function(){return v},Button_ded0f9c377345940e170ca3aa9eea8cd:function(){return E},Button_e27c1f51720545c9586f449705a673b6:function(){return I},Div_64093a13086094dda35345330da0660b:function(){return C},Fragment_ecc7fc8159e7de57fc1e48e5f03b41bb:function(){return X},I_7652df4ca062925a9eb147d4d1552750:function(){return N},I_d351a7924f361be3a0521cf7480c278d:function(){return L},I_f160ddca456fb9d0fde10565a8244ea9:function(){return k},Link_15b05c76a43b1770fe0832ddfb19f582:function(){return D},Link_23e0b7f567097607cdaae673d1013600:function(){return y},Link_7731e27d0140cf30f823769d334606eb:function(){return _},Link_a72585802e5f43c74214674e7cb4f3d6:function(){return R},Link_b943428f382c8ac3548040217ba09940:function(){return w},Link_d0ee4a437a6264f5f2b311719ebcd6fb:function(){return B},Link_e5daed4549b9d7d963c1fd4f8400b6db:function(){return S},Toaster_9d6e054b03c6e5d1bea1c0a5576b4e6d:function(){return H},default:function(){return z}});var a=n(2729),i=n(5944),r=n(7294),s=n(8039),o=n(9654),c=n(2377),l=n(917),d=n(4712),m=n(3954),g=n(275),h=n(4298),p=n.n(h),u=n(1664),Z=n.n(u),f=n(9008),x=n.n(f);function b(){let e=(0,a._)(["\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n"]);return b=function(){return e},e}function F(){let[e,t]=(0,r.useContext)(s.EventLoopContext),n=(0,r.useCallback)(function(){for(var t=arguments.length,n=Array(t),a=0;a0?t[t.length-1].message:""),children:(0,i.tZ)(X,{})})}function _(){return(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},color:"#D3D3D3"},target:"_blank",children:(0,i.tZ)(Z(),{href:"https://x.com/search?q=%23aDEViento2024&src=typed_query",passHref:!0,children:"#aDEViento2024"})})}function S(){return(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"}},target:"_blank",children:(0,i.tZ)(Z(),{href:"https://nuwe.io",passHref:!0,children:(0,i.tZ)("img",{alt:"NUWE",css:{width:"100%",height:"100%"},src:"nuwe.png"})})})}function X(){let[e,t]=(0,r.useContext)(s.EventLoopContext);return(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(t.length>0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(c.Z,{css:{color:"crimson",zIndex:9999,position:"fixed",bottom:"33px",right:"33px",animation:T+" 1s infinite"},size:32})}):(0,i.tZ)(r.Fragment,{})})}function E(){let[e,t]=(0,r.useContext)(s.EventLoopContext),n=(0,r.useCallback)(function(){for(var t=arguments.length,n=Array(t),a=0;a{n.length>=2?c||d.Am.error("Cannot connect to server: ".concat(n.length>0?n[n.length-1].message:"","."),{...a,onDismiss:()=>l(!0)}):(d.Am.dismiss("websocket-error"),l(!1))},[n]),(0,i.tZ)(d.x7,{closeButton:!1,expand:!0,position:"bottom-right",richColors:!0,theme:e})}function z(){let e=(0,r.useRef)(null);return o.refs.ref_countdown=e,(0,i.BX)(r.Fragment,{children:[(0,i.BX)(r.Fragment,{children:[(0,i.tZ)(C,{}),(0,i.tZ)(H,{})]}),(0,i.BX)(g.Box,{children:[(0,i.tZ)(p(),{strategy:"afterInteractive",children:"document.documentElement.lang='es'"}),(0,i.tZ)(p(),{src:"/js/snow.js",strategy:"afterInteractive"}),(0,i.tZ)(g.Flex,{align:"start",className:"rx-Stack",css:{background:"#212529",position:"sticky",borderBottom:"0.25em solid #D3D3D3",paddingInlineStart:"2em",paddingInlineEnd:"2em",paddingTop:"1em",paddingBottom:"1em",zIndex:"999",top:"0",width:"100%"},direction:"column",gap:"3",children:(0,i.BX)(g.Flex,{align:"center",className:"rx-Stack",css:{width:"100%"},direction:"row",gap:"3",children:[(0,i.tZ)("img",{alt:"Imagen pixel art de MoureDev con estilo navide\xf1o.",css:{width:"3em",height:"3em"},src:"mouredev.png"}),(0,i.tZ)(g.Text,{as:"p",children:"aDEViento 2024"}),(0,i.tZ)(g.Flex,{css:{flex:1,justifySelf:"stretch",alignSelf:"stretch"}}),(0,i.tZ)(g.Box,{css:{"@media screen and (min-width: 0)":{display:"none"},"@media screen and (min-width: 30em)":{display:"block"},"@media screen and (min-width: 48em)":{display:"block"},"@media screen and (min-width: 62em)":{display:"block"}},children:(0,i.tZ)(N,{})}),(0,i.tZ)(L,{}),(0,i.tZ)(k,{})]})}),(0,i.BX)(g.Flex,{align:"center",className:"rx-Stack",css:{width:"100%"},direction:"column",gap:"4em",children:[(0,i.BX)(g.Flex,{align:"start",className:"rx-Stack",css:{alignItems:"start",paddingInlineStart:"2em",paddingInlineEnd:"2em",width:"100%",maxWidth:"1000px",paddingTop:"4em"},direction:"column",gap:"3",children:[(0,i.tZ)(g.Heading,{css:{fontFamily:"Press Start 2P","--default-font-family":"Press Start 2P",color:"#EA5940 !important",paddingBottom:"1em"},size:"lg",children:"Calendario de aDEViento 2024"}),(0,i.BX)(g.Flex,{css:{"@media screen and (min-width: 0)":{flexDirection:"column"},"@media screen and (min-width: 30em)":{flexDirection:"column"},"@media screen and (min-width: 48em)":{flexDirection:"column"},"@media screen and (min-width: 62em)":{flexDirection:"row"},"@media screen and (min-width: 80em)":{flexDirection:"row"}},children:[(0,i.tZ)("img",{alt:"Imagen pixel art de MoureDev con estilo navide\xf1o.",css:{width:"16em",height:"16em",marginRight:"2em"},src:"mouredev.png"}),(0,i.BX)(g.Flex,{align:"start",className:"rx-Stack",css:{alignItems:"start"},direction:"column",gap:"3",children:[(0,i.BX)(g.Box,{className:"nes-balloon from-left is-dark",children:[(0,i.tZ)(g.Text,{as:"p",children:"24 d\xedas. 24 regalos."}),(0,i.tZ)(g.Text,{as:"p",children:"Del 1 al 24 de diciembre."})]}),(0,i.BX)("span",{css:{fontSize:"0.8em"},children:["Por cuarto a\xf1o, \xa1aqu\xed est\xe1 el calendario de adviento sorpresa de nuestra ",(0,i.tZ)("span",{css:{fontSize:"1em",color:"#EA5940 !important"},children:"comunidad de developers"}),"!"]}),(0,i.tZ)("span",{css:{fontSize:"0.8em"},children:"Una actividad en la que cada d\xeda sortear\xe9 un regalo relacionado con programaci\xf3n y desarrollo de software (libros, cursos…)."}),(0,i.tZ)("span",{css:{fontSize:"0.8em"},children:"Su finalidad es ayudar a compartir conocimiento y fomentar el aprendizaje en comunidad."}),(0,i.tZ)(E,{}),(0,i.tZ)(_,{})]})]})]}),(0,i.BX)(g.Flex,{align:"start",className:"rx-Stack",css:{alignItems:"start",paddingInlineStart:"2em",paddingInlineEnd:"2em",width:"100%",maxWidth:"1000px"},direction:"column",gap:"3",children:[(0,i.BX)(g.Flex,{align:"center",className:"rx-Stack",css:{paddingBottom:"2.75em"},direction:"row",gap:"1em",children:[(0,i.tZ)(g.Box,{className:"nes-icon is-medium heart"}),(0,i.tZ)(g.Heading,{css:{fontFamily:"Press Start 2P","--default-font-family":"Press Start 2P",color:"#EA5940 !important"},size:"md",children:"Calendario 2024"})]}),(0,i.BX)(g.Flex,{align:"start",className:"rx-Stack nes-container is-dark",css:{alignItems:"start",width:"100%"},direction:"column",gap:"3",children:[(0,i.BX)(g.Flex,{align:"start",className:"rx-Stack",css:{alignItems:"start","@media screen and (min-width: 0)":{flexDirection:"column"},"@media screen and (min-width: 30em)":{flexDirection:"column"},"@media screen and (min-width: 48em)":{flexDirection:"column"},"@media screen and (min-width: 62em)":{flexDirection:"row"},"@media screen and (min-width: 80em)":{flexDirection:"row"}},direction:"row",gap:"3",children:[(0,i.tZ)(g.Text,{as:"p",css:{marginRight:"1em"},children:"Calendario 2024 en"}),(0,i.tZ)(g.Text,{as:"p",css:{marginLeft:"0px !important"},id:"countdown",ref:e})]}),(0,i.tZ)("span",{css:{fontSize:"0.8em"},children:"• Los regalos son sorpresa, permanecer\xe1n ocultos hasta el d\xeda de su publicaci\xf3n. No olvides pasarte por aqu\xed cada d\xeda para descubrir un nuevo sorteo."}),(0,i.tZ)("span",{css:{fontSize:"0.8em"},children:"• Puedes seleccionar cada regalo para conocer a los ganadores una vez se haya publicado el nuevo sorteo (aparecer\xe1 en rojo)."})]}),(0,i.BX)(g.Grid,{columns:{initial:"2",xs:"3",sm:"4",md:"5",lg:"6",xl:"6"},css:{width:"100%",paddingTop:"2em",paddingBottom:"2em"},gap:"1em",children:[(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/1.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 1",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:1})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/2.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 2",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:2})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/3.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 3",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:3})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/4.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 4",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:4})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/5.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 5",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:5})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/6.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 6",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:6})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/7.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 7",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:7})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/8.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 8",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:8})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/9.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 9",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:9})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/10.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 10",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:10})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/11.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 11",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:11})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/12.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 12",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:12})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/13.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 13",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:13})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/14.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 14",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:14})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/15.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 15",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:15})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/16.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 16",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:16})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/17.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 17",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:17})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/18.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 18",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:18})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/19.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 19",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:19})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/20.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 20",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:20})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/21.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 21",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:21})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/22.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 22",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:22})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/23.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 23",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:23})]}),(0,i.BX)(g.Box,{css:{background:"#D3D3D3",aspectRatio:"1",position:"relative"},children:[(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!1)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)(g.Link,{asChild:!0,css:{textDecoration:"none","&:hover":{color:"var(--accent-8)"},position:"absolute"},target:"_blank",children:(0,i.tZ)(Z(),{href:"",passHref:!0,children:(0,i.tZ)("img",{alt:"",css:{padding:"0.5em"},src:"calendar/24.png"})})})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(r.Fragment,{children:(0,o.isTrue)(!0)?(0,i.tZ)(r.Fragment,{children:(0,i.tZ)("img",{alt:"Regalo asociado al d\xeda 24",css:{position:"absolute",padding:"0.5em"},src:"gift.png"})}):(0,i.tZ)(r.Fragment,{})}),(0,i.tZ)(g.Text,{as:"p",css:{padding:"1em",position:"absolute"},children:24})]})]}),(0,i.tZ)(p(),{src:"/js/countdown.js",strategy:"afterInteractive"})]}),(0,i.tZ)(g.Flex,{align:"center",className:"rx-Stack",css:{background:"#EA5940",width:"100%"},direction:"column",gap:"3",children:(0,i.BX)(g.Flex,{align:"start",className:"rx-Stack",css:{alignItems:"start",paddingInlineStart:"2em",paddingInlineEnd:"2em",width:"100%",maxWidth:"1000px",paddingTop:"4em",paddingBottom:"4em"},direction:"column",gap:"3",children:[(0,i.BX)(g.Flex,{align:"center",className:"rx-Stack",css:{paddingBottom:"2.75em"},direction:"row",gap:"1em",children:[(0,i.tZ)(g.Box,{className:"nes-icon is-medium star"}),(0,i.tZ)(g.Heading,{css:{fontFamily:"Press Start 2P","--default-font-family":"Press Start 2P",color:"#212529"},size:"md",children:"Con la ayuda de"})]}),(0,i.BX)(g.Grid,{columns:{initial:"2",xs:"2",sm:"4",md:"4",lg:"4",xl:"4"},gap:"4em",children:[(0,i.tZ)(y,{}),(0,i.tZ)(w,{}),(0,i.tZ)(S,{}),(0,i.tZ)(R,{})]})]})}),(0,i.tZ)(g.Box,{css:{alignItems:"start",paddingInlineStart:"2em",paddingInlineEnd:"2em",width:"100%",maxWidth:"1000px"},children:(0,i.BX)(g.Flex,{align:"start",className:"rx-Stack nes-container is-dark with-title",css:{alignItems:"start",width:"100%"},direction:"column",gap:"3",children:[(0,i.tZ)(g.Text,{as:"p",className:"title",css:{color:"#EA5940 !important"},children:"\xbfC\xf3mo funciona el evento?"}),(0,i.tZ)("span",{css:{fontSize:"0.8em"},children:"• Del 1 al 24 de diciembre descubrir\xe9 cada d\xeda un nuevo regalo en el calendario."}),(0,i.tZ)("span",{css:{fontSize:"0.8em"},children:"• Puedes participar desde cualquier parte del mundo."}),(0,i.tZ)("span",{css:{fontSize:"0.8em"},children:"• S\xf3lo tendr\xe1s que hacer Retweet a la publicaci\xf3n que enlazar\xe9 desde esta web. Tu cuenta de Twitter/X tiene que ser p\xfablica."}),(0,i.tZ)(v,{}),(0,i.tZ)("span",{css:{fontSize:"0.8em"},children:"• Al d\xeda siguiente realizar\xe9 el sorteo de forma p\xfablica y compartir\xe9 el ganador en la web y en Twitter/X."}),(0,i.tZ)("span",{css:{fontSize:"0.8em"},children:"• \xa1Vuelta a empezar! Publicar\xe9 un nuevo regalo y comenzar\xe1 de nuevo el proceso."})]})}),(0,i.BX)(g.Flex,{align:"start",className:"rx-Stack",css:{alignItems:"start",paddingInlineStart:"2em",paddingInlineEnd:"2em",width:"100%",maxWidth:"1000px"},direction:"column",gap:"3",children:[(0,i.BX)(g.Flex,{align:"center",className:"rx-Stack",css:{paddingBottom:"2.75em"},direction:"row",gap:"1em",children:[(0,i.tZ)(g.Box,{className:"nes-icon is-medium like"}),(0,i.tZ)(g.Heading,{css:{fontFamily:"Press Start 2P","--default-font-family":"Press Start 2P",color:"#EA5940 !important"},size:"md",children:"Hola, mi nombre es Brais Moure"})]}),(0,i.BX)(g.Flex,{css:{alignItems:"start","@media screen and (min-width: 0)":{flexDirection:"column"},"@media screen and (min-width: 30em)":{flexDirection:"column"},"@media screen and (min-width: 48em)":{flexDirection:"column"},"@media screen and (min-width: 62em)":{flexDirection:"row"},"@media screen and (min-width: 80em)":{flexDirection:"row"}},gap:"2em",children:[(0,i.tZ)("img",{css:{width:"128px",height:"128px",background:"#212529",padding:"2px",border:"4px solid #D3D3D3",borderRadius:"50%",marginRight:"0.5em",marginBottom:"0.5em"},src:"avatar.jpg"}),(0,i.BX)(g.Flex,{align:"start",className:"rx-Stack",css:{width:"100%",alignItems:"start"},direction:"column",gap:"3",children:[(0,i.tZ)("span",{css:{fontSize:"0.8em"},children:"Soy ingeniero de software desde hace m\xe1s de 14 a\xf1os."}),(0,i.BX)("span",{css:{fontSize:"0.8em"},children:["En 2018 comenc\xe9 a divulgar contenido sobre programaci\xf3n y desarrollo de software en redes sociales como ",(0,i.tZ)("span",{css:{fontSize:"1em",color:"#EA5940 !important"},children:"@mouredev"}),"."]}),(0,i.BX)(g.Flex,{css:{alignItems:"start","@media screen and (min-width: 0)":{flexDirection:"column"},"@media screen and (min-width: 30em)":{flexDirection:"column"},"@media screen and (min-width: 48em)":{flexDirection:"column"},"@media screen and (min-width: 62em)":{flexDirection:"row"},"@media screen and (min-width: 80em)":{flexDirection:"row"}},children:[(0,i.tZ)(F,{}),(0,i.tZ)(I,{}),(0,i.tZ)(E,{})]})]})]})]}),(0,i.tZ)(g.Flex,{align:"start",className:"rx-Stack",css:{alignItems:"start",paddingInlineStart:"2em",paddingInlineEnd:"2em",width:"100%",maxWidth:"1000px",paddingBottom:"2em"},direction:"row",gap:"3",children:(0,i.BX)(g.Flex,{css:{display:"flex",alignItems:"center",justifyContent:"center",width:"100%"},children:[(0,i.BX)(g.Flex,{align:"start",className:"rx-Stack",css:{alignItems:"start"},direction:"column",gap:"0.8em",children:[(0,i.tZ)(g.Text,{as:"p",css:{fontSize:"0.8em",marginBottom:"0px !important"},children:"Calendario de aDEViento 2024"}),(0,i.tZ)(B,{})]}),(0,i.tZ)(g.Flex,{css:{flex:1,justifySelf:"stretch",alignSelf:"stretch"}}),(0,i.tZ)("img",{alt:'Logo MoureDev. Una letra "eme" entre dos corchetes.',className:"nes-avatar is-large",src:"logo.png"})]})}),(0,i.tZ)(D,{})]})]}),(0,i.BX)(x(),{children:[(0,i.tZ)("title",{children:"Calendario de aDEViento 2024 | 24 d\xedas. 24 regalos."}),(0,i.tZ)("meta",{content:"Por cuarto a\xf1o, \xa1aqu\xed est\xe1 el calendario de adviento sorpresa de nuestra comunidad de developers! Del 1 al 24 de diciembre.",name:"description"}),(0,i.tZ)("meta",{content:"https://adviento.dev/preview.jpg",property:"og:image"}),(0,i.tZ)("meta",{content:"website",name:"og:type"}),(0,i.tZ)("meta",{content:"Calendario de aDEViento 2024 | 24 d\xedas. 24 regalos.",name:"og:title"}),(0,i.tZ)("meta",{content:"Por cuarto a\xf1o, \xa1aqu\xed est\xe1 el calendario de adviento sorpresa de nuestra comunidad de developers! Del 1 al 24 de diciembre.",name:"og:description"}),(0,i.tZ)("meta",{content:"https://adviento.dev/preview.jpg",name:"og:image"}),(0,i.tZ)("meta",{content:"summary_large_image",name:"twitter:card"}),(0,i.tZ)("meta",{content:"@mouredev",name:"twitter:site"})]})]})}},4298:function(e,t,n){e.exports=n(3381)}},function(e){e.O(0,[346,888,774,179],function(){return e(e.s=5557)}),_N_E=e.O()}]); -------------------------------------------------------------------------------- /public/_next/static/chunks/webpack-2df7a8d27de1794c.js: -------------------------------------------------------------------------------- 1 | !function(){"use strict";var t,e,n,r,o,u,f={},i={};function c(t){var e=i[t];if(void 0!==e)return e.exports;var n=i[t]={exports:{}},r=!0;try{f[t].call(n.exports,n,n.exports,c),r=!1}finally{r&&delete i[t]}return n.exports}c.m=f,t=[],c.O=function(e,n,r,o){if(n){o=o||0;for(var u=t.length;u>0&&t[u-1][2]>o;u--)t[u]=t[u-1];t[u]=[n,r,o];return}for(var f=1/0,u=0;u=o&&Object.keys(c.O).every(function(t){return c.O[t](n[l])})?n.splice(l--,1):(i=!1,oCalendario de aDEViento 2024 | 24 días. 24 regalos.
Imagen pixel art de MoureDev con estilo navideño.

aDEViento 2024

Calendario de aDEViento 2024

Imagen pixel art de MoureDev con estilo navideño.

24 días. 24 regalos.

Del 1 al 24 de diciembre.

Por cuarto año, ¡aquí está el calendario de adviento sorpresa de nuestra comunidad de developers!Una actividad en la que cada día sortearé un regalo relacionado con programación y desarrollo de software (libros, cursos…).Su finalidad es ayudar a compartir conocimiento y fomentar el aprendizaje en comunidad.#aDEViento2024

Calendario 2024

Calendario 2024 en

• Los regalos son sorpresa, permanecerán ocultos hasta el día de su publicación. No olvides pasarte por aquí cada día para descubrir un nuevo sorteo.• Puedes seleccionar cada regalo para conocer a los ganadores una vez se haya publicado el nuevo sorteo (aparecerá en rojo).
Regalo asociado al día 1

1

Regalo asociado al día 2

2

Regalo asociado al día 3

3

Regalo asociado al día 4

4

Regalo asociado al día 5

5

Regalo asociado al día 6

6

Regalo asociado al día 7

7

Regalo asociado al día 8

8

Regalo asociado al día 9

9

Regalo asociado al día 10

10

Regalo asociado al día 11

11

Regalo asociado al día 12

12

Regalo asociado al día 13

13

Regalo asociado al día 14

14

Regalo asociado al día 15

15

Regalo asociado al día 16

16

Regalo asociado al día 17

17

Regalo asociado al día 18

18

Regalo asociado al día 19

19

Regalo asociado al día 20

20

Regalo asociado al día 21

21

Regalo asociado al día 22

22

Regalo asociado al día 23

23

Regalo asociado al día 24

24

Con la ayuda de

ElgatoRaiola NetworksNUWEmouredev pro

¿Cómo funciona el evento?

• Del 1 al 24 de diciembre descubriré cada día un nuevo regalo en el calendario.• Puedes participar desde cualquier parte del mundo.• Sólo tendrás que hacer Retweet a la publicación que enlazaré desde esta web. Tu cuenta de Twitter/X tiene que ser pública.• Al día siguiente realizaré el sorteo de forma pública y compartiré el ganador en la web y en Twitter/X.• ¡Vuelta a empezar! Publicaré un nuevo regalo y comenzará de nuevo el proceso.

Hola, mi nombre es Brais Moure

Soy ingeniero de software desde hace más de 14 años.En 2018 comencé a divulgar contenido sobre programación y desarrollo de software en redes sociales como @mouredev.

Calendario de aDEViento 2024

Creado con (y gracias a ti) por MoureDev by Brais Moure
Logo MoureDev. Una letra "eme" entre dos corchetes.
Proyectoen GitHub
2.2.0
-------------------------------------------------------------------------------- /public/js/countdown.js: -------------------------------------------------------------------------------- 1 | var countDownDate = new Date("Dec 1, 2024 14:00:00 UTC").getTime(); 2 | 3 | var x = setInterval(function () { 4 | 5 | var now = new Date().getTime(); 6 | var distance = countDownDate - now; 7 | 8 | var days = Math.floor(distance / (1000 * 60 * 60 * 24)); 9 | var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); 10 | var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); 11 | var seconds = Math.floor((distance % (1000 * 60)) / 1000); 12 | 13 | document.getElementById("countdown").innerHTML = days + "d " + hours + "h " 14 | + minutes + "m " + seconds + "s "; 15 | 16 | if (distance < 0) { 17 | clearInterval(x); 18 | document.getElementById("countdown").innerHTML = "¡Comienza el calendario de aDEViento!"; 19 | } 20 | }, 1000); -------------------------------------------------------------------------------- /public/js/snow.js: -------------------------------------------------------------------------------- 1 | /** @license 2 | * DHTML Snowstorm! JavaScript-based snow for web pages 3 | * Making it snow on the internets since 2003. You're welcome. 4 | * ----------------------------------------------------------- 5 | * Version 1.44.20131215 (Previous rev: 1.44.20131208) 6 | * Copyright (c) 2007, Scott Schiller. All rights reserved. 7 | * Code provided under the BSD License 8 | * http://schillmania.com/projects/snowstorm/license.txt 9 | */ 10 | 11 | /*jslint nomen: true, plusplus: true, sloppy: true, vars: true, white: true */ 12 | /*global window, document, navigator, clearInterval, setInterval */ 13 | 14 | var snowStorm = (function (window, document) { 15 | 16 | // --- common properties --- 17 | 18 | this.autoStart = true; // Whether the snow should start automatically or not. 19 | this.excludeMobile = false; // Snow is likely to be bad news for mobile phones' CPUs (and batteries.) Enable at your own risk. 20 | this.flakesMax = 128; // Limit total amount of snow made (falling + sticking) 21 | this.flakesMaxActive = 64; // Limit amount of snow falling at once (less = lower CPU use) 22 | this.animationInterval = 33; // Theoretical "miliseconds per frame" measurement. 20 = fast + smooth, but high CPU use. 50 = more conservative, but slower 23 | this.useGPU = true; // Enable transform-based hardware acceleration, reduce CPU load. 24 | this.className = null; // CSS class name for further customization on snow elements 25 | this.flakeBottom = null; // Integer for Y axis snow limit, 0 or null for "full-screen" snow effect 26 | this.followMouse = false; // Snow movement can respond to the user's mouse 27 | this.snowColor = '#fff'; // Don't eat (or use?) yellow snow. 28 | this.snowCharacter = '•'; // • = bullet, · is square on some systems etc. 29 | this.snowStick = true; // Whether or not snow should "stick" at the bottom. When off, will never collect. 30 | this.targetElement = null; // element which snow will be appended to (null = document.body) - can be an element ID eg. 'myDiv', or a DOM node reference 31 | this.useMeltEffect = true; // When recycling fallen snow (or rarely, when falling), have it "melt" and fade out if browser supports it 32 | this.useTwinkleEffect = false; // Allow snow to randomly "flicker" in and out of view while falling 33 | this.usePositionFixed = false; // true = snow does not shift vertically when scrolling. May increase CPU load, disabled by default - if enabled, used only where supported 34 | this.usePixelPosition = false; // Whether to use pixel values for snow top/left vs. percentages. Auto-enabled if body is position:relative or targetElement is specified. 35 | this.accessibility = true; // Hide snow from screen readers 36 | 37 | // --- less-used bits --- 38 | 39 | this.freezeOnBlur = true; // Only snow when the window is in focus (foreground.) Saves CPU. 40 | this.flakeLeftOffset = 0; // Left margin/gutter space on edge of container (eg. browser window.) Bump up these values if seeing horizontal scrollbars. 41 | this.flakeRightOffset = 0; // Right margin/gutter space on edge of container 42 | this.flakeWidth = 15; // Max pixel width reserved for snow element 43 | this.flakeHeight = 15; // Max pixel height reserved for snow element 44 | this.vMaxX = 3; // Maximum X velocity range for snow 45 | this.vMaxY = 4; // Maximum Y velocity range for snow 46 | this.zIndex = 0; // CSS stacking order applied to each snowflake 47 | 48 | // --- "No user-serviceable parts inside" past this point, yadda yadda --- 49 | 50 | var storm = this, 51 | features, 52 | // UA sniffing and backCompat rendering mode checks for fixed position, etc. 53 | isIE = navigator.userAgent.match(/msie/i), 54 | isIE6 = navigator.userAgent.match(/msie 6/i), 55 | isMobile = navigator.userAgent.match(/mobile|opera m(ob|in)/i), 56 | isBackCompatIE = (isIE && document.compatMode === 'BackCompat'), 57 | noFixed = (isBackCompatIE || isIE6), 58 | screenX = null, screenX2 = null, screenY = null, scrollY = null, docHeight = null, vRndX = null, vRndY = null, 59 | windOffset = 1, 60 | windMultiplier = 2, 61 | flakeTypes = 6, 62 | fixedForEverything = false, 63 | targetElementIsRelative = false, 64 | opacitySupported = (function () { 65 | try { 66 | document.createElement('div').style.opacity = '0.5'; 67 | } catch (e) { 68 | return false; 69 | } 70 | return true; 71 | }()), 72 | didInit = false, 73 | docFrag = document.createDocumentFragment(); 74 | 75 | features = (function () { 76 | 77 | var getAnimationFrame; 78 | 79 | /** 80 | * hat tip: paul irish 81 | * http://paulirish.com/2011/requestanimationframe-for-smart-animating/ 82 | * https://gist.github.com/838785 83 | */ 84 | 85 | function timeoutShim(callback) { 86 | window.setTimeout(callback, 1000 / (storm.animationInterval || 20)); 87 | } 88 | 89 | var _animationFrame = (window.requestAnimationFrame || 90 | window.webkitRequestAnimationFrame || 91 | window.mozRequestAnimationFrame || 92 | window.oRequestAnimationFrame || 93 | window.msRequestAnimationFrame || 94 | timeoutShim); 95 | 96 | // apply to window, avoid "illegal invocation" errors in Chrome 97 | getAnimationFrame = _animationFrame ? function () { 98 | return _animationFrame.apply(window, arguments); 99 | } : null; 100 | 101 | var testDiv; 102 | 103 | testDiv = document.createElement('div'); 104 | 105 | function has(prop) { 106 | 107 | // test for feature support 108 | var result = testDiv.style[prop]; 109 | return (result !== undefined ? prop : null); 110 | 111 | } 112 | 113 | // note local scope. 114 | var localFeatures = { 115 | 116 | transform: { 117 | ie: has('-ms-transform'), 118 | moz: has('MozTransform'), 119 | opera: has('OTransform'), 120 | webkit: has('webkitTransform'), 121 | w3: has('transform'), 122 | prop: null // the normalized property value 123 | }, 124 | 125 | getAnimationFrame: getAnimationFrame 126 | 127 | }; 128 | 129 | localFeatures.transform.prop = ( 130 | localFeatures.transform.w3 || 131 | localFeatures.transform.moz || 132 | localFeatures.transform.webkit || 133 | localFeatures.transform.ie || 134 | localFeatures.transform.opera 135 | ); 136 | 137 | testDiv = null; 138 | 139 | return localFeatures; 140 | 141 | }()); 142 | 143 | this.timer = null; 144 | this.flakes = []; 145 | this.disabled = false; 146 | this.active = false; 147 | this.meltFrameCount = 20; 148 | this.meltFrames = []; 149 | 150 | this.setXY = function (o, x, y) { 151 | 152 | if (!o) { 153 | return false; 154 | } 155 | 156 | if (storm.usePixelPosition || targetElementIsRelative) { 157 | 158 | o.style.left = (x - storm.flakeWidth) + 'px'; 159 | o.style.top = (y - storm.flakeHeight) + 'px'; 160 | 161 | } else if (noFixed) { 162 | 163 | o.style.right = (100 - (x / screenX * 100)) + '%'; 164 | // avoid creating vertical scrollbars 165 | o.style.top = (Math.min(y, docHeight - storm.flakeHeight)) + 'px'; 166 | 167 | } else { 168 | 169 | if (!storm.flakeBottom) { 170 | 171 | // if not using a fixed bottom coordinate... 172 | o.style.right = (100 - (x / screenX * 100)) + '%'; 173 | o.style.bottom = (100 - (y / screenY * 100)) + '%'; 174 | 175 | } else { 176 | 177 | // absolute top. 178 | o.style.right = (100 - (x / screenX * 100)) + '%'; 179 | o.style.top = (Math.min(y, docHeight - storm.flakeHeight)) + 'px'; 180 | 181 | } 182 | 183 | } 184 | 185 | }; 186 | 187 | this.events = (function () { 188 | 189 | var old = (!window.addEventListener && window.attachEvent), slice = Array.prototype.slice, 190 | evt = { 191 | add: (old ? 'attachEvent' : 'addEventListener'), 192 | remove: (old ? 'detachEvent' : 'removeEventListener') 193 | }; 194 | 195 | function getArgs(oArgs) { 196 | var args = slice.call(oArgs), len = args.length; 197 | if (old) { 198 | args[1] = 'on' + args[1]; // prefix 199 | if (len > 3) { 200 | args.pop(); // no capture 201 | } 202 | } else if (len === 3) { 203 | args.push(false); 204 | } 205 | return args; 206 | } 207 | 208 | function apply(args, sType) { 209 | var element = args.shift(), 210 | method = [evt[sType]]; 211 | if (old) { 212 | element[method](args[0], args[1]); 213 | } else { 214 | element[method].apply(element, args); 215 | } 216 | } 217 | 218 | function addEvent() { 219 | apply(getArgs(arguments), 'add'); 220 | } 221 | 222 | function removeEvent() { 223 | apply(getArgs(arguments), 'remove'); 224 | } 225 | 226 | return { 227 | add: addEvent, 228 | remove: removeEvent 229 | }; 230 | 231 | }()); 232 | 233 | function rnd(n, min) { 234 | if (isNaN(min)) { 235 | min = 0; 236 | } 237 | return (Math.random() * n) + min; 238 | } 239 | 240 | function plusMinus(n) { 241 | return (parseInt(rnd(2), 10) === 1 ? n * -1 : n); 242 | } 243 | 244 | this.randomizeWind = function () { 245 | var i; 246 | vRndX = plusMinus(rnd(storm.vMaxX, 0.2)); 247 | vRndY = rnd(storm.vMaxY, 0.2); 248 | if (this.flakes) { 249 | for (i = 0; i < this.flakes.length; i++) { 250 | if (this.flakes[i].active) { 251 | this.flakes[i].setVelocities(); 252 | } 253 | } 254 | } 255 | }; 256 | 257 | this.scrollHandler = function () { 258 | var i; 259 | // "attach" snowflakes to bottom of window if no absolute bottom value was given 260 | scrollY = (storm.flakeBottom ? 0 : parseInt(window.scrollY || document.documentElement.scrollTop || (noFixed ? document.body.scrollTop : 0), 10)); 261 | if (isNaN(scrollY)) { 262 | scrollY = 0; // Netscape 6 scroll fix 263 | } 264 | if (!fixedForEverything && !storm.flakeBottom && storm.flakes) { 265 | for (i = 0; i < storm.flakes.length; i++) { 266 | if (storm.flakes[i].active === 0) { 267 | storm.flakes[i].stick(); 268 | } 269 | } 270 | } 271 | }; 272 | 273 | this.resizeHandler = function () { 274 | if (window.innerWidth || window.innerHeight) { 275 | screenX = window.innerWidth - 16 - storm.flakeRightOffset; 276 | screenY = (storm.flakeBottom || window.innerHeight); 277 | } else { 278 | screenX = (document.documentElement.clientWidth || document.body.clientWidth || document.body.scrollWidth) - (!isIE ? 8 : 0) - storm.flakeRightOffset; 279 | screenY = storm.flakeBottom || document.documentElement.clientHeight || document.body.clientHeight || document.body.scrollHeight; 280 | } 281 | docHeight = document.body.offsetHeight; 282 | screenX2 = parseInt(screenX / 2, 10); 283 | }; 284 | 285 | this.resizeHandlerAlt = function () { 286 | screenX = storm.targetElement.offsetWidth - storm.flakeRightOffset; 287 | screenY = storm.flakeBottom || storm.targetElement.offsetHeight; 288 | screenX2 = parseInt(screenX / 2, 10); 289 | docHeight = document.body.offsetHeight; 290 | }; 291 | 292 | this.freeze = function () { 293 | // pause animation 294 | if (!storm.disabled) { 295 | storm.disabled = 1; 296 | } else { 297 | return false; 298 | } 299 | storm.timer = null; 300 | }; 301 | 302 | this.resume = function () { 303 | if (storm.disabled) { 304 | storm.disabled = 0; 305 | } else { 306 | return false; 307 | } 308 | storm.timerInit(); 309 | }; 310 | 311 | this.toggleSnow = function () { 312 | if (!storm.flakes.length) { 313 | // first run 314 | storm.start(); 315 | } else { 316 | storm.active = !storm.active; 317 | if (storm.active) { 318 | storm.show(); 319 | storm.resume(); 320 | } else { 321 | storm.stop(); 322 | storm.freeze(); 323 | } 324 | } 325 | }; 326 | 327 | this.stop = function () { 328 | var i; 329 | this.freeze(); 330 | for (i = 0; i < this.flakes.length; i++) { 331 | this.flakes[i].o.style.display = 'none'; 332 | } 333 | storm.events.remove(window, 'scroll', storm.scrollHandler); 334 | storm.events.remove(window, 'resize', storm.resizeHandler); 335 | if (storm.freezeOnBlur) { 336 | if (isIE) { 337 | storm.events.remove(document, 'focusout', storm.freeze); 338 | storm.events.remove(document, 'focusin', storm.resume); 339 | } else { 340 | storm.events.remove(window, 'blur', storm.freeze); 341 | storm.events.remove(window, 'focus', storm.resume); 342 | } 343 | } 344 | }; 345 | 346 | this.show = function () { 347 | var i; 348 | for (i = 0; i < this.flakes.length; i++) { 349 | this.flakes[i].o.style.display = 'block'; 350 | } 351 | }; 352 | 353 | this.SnowFlake = function (type, x, y) { 354 | var s = this; 355 | this.type = type; 356 | this.x = x || parseInt(rnd(screenX - 20), 10); 357 | this.y = (!isNaN(y) ? y : -rnd(screenY) - 12); 358 | this.vX = null; 359 | this.vY = null; 360 | this.vAmpTypes = [1, 1.2, 1.4, 1.6, 1.8]; // "amplification" for vX/vY (based on flake size/type) 361 | this.vAmp = this.vAmpTypes[this.type] || 1; 362 | this.melting = false; 363 | this.meltFrameCount = storm.meltFrameCount; 364 | this.meltFrames = storm.meltFrames; 365 | this.meltFrame = 0; 366 | this.twinkleFrame = 0; 367 | this.active = 1; 368 | this.fontSize = (10 + (this.type / 5) * 10); 369 | this.o = document.createElement('div'); 370 | this.o.innerHTML = storm.snowCharacter; 371 | if (storm.className) { 372 | this.o.setAttribute('class', storm.className); 373 | } 374 | this.o.style.color = storm.snowColor; 375 | this.o.style.position = (fixedForEverything ? 'fixed' : 'absolute'); 376 | if (storm.useGPU && features.transform.prop) { 377 | // GPU-accelerated snow. 378 | this.o.style[features.transform.prop] = 'translate3d(0px, 0px, 0px)'; 379 | } 380 | this.o.style.width = storm.flakeWidth + 'px'; 381 | this.o.style.height = storm.flakeHeight + 'px'; 382 | this.o.style.fontFamily = 'arial,verdana'; 383 | this.o.style.cursor = 'default'; 384 | this.o.style.overflow = 'hidden'; 385 | this.o.style.fontWeight = 'normal'; 386 | this.o.style.zIndex = storm.zIndex; 387 | if (storm.accessibility) { 388 | this.o.setAttribute('aria-hidden', storm.accessibility); 389 | } 390 | docFrag.appendChild(this.o); 391 | 392 | this.refresh = function () { 393 | if (isNaN(s.x) || isNaN(s.y)) { 394 | // safety check 395 | return false; 396 | } 397 | storm.setXY(s.o, s.x, s.y); 398 | }; 399 | 400 | this.stick = function () { 401 | if (noFixed || (storm.targetElement !== document.documentElement && storm.targetElement !== document.body)) { 402 | s.o.style.top = (screenY + scrollY - storm.flakeHeight) + 'px'; 403 | } else if (storm.flakeBottom) { 404 | s.o.style.top = storm.flakeBottom + 'px'; 405 | } else { 406 | s.o.style.display = 'none'; 407 | s.o.style.top = 'auto'; 408 | s.o.style.bottom = '0%'; 409 | s.o.style.position = 'fixed'; 410 | s.o.style.display = 'block'; 411 | } 412 | }; 413 | 414 | this.vCheck = function () { 415 | if (s.vX >= 0 && s.vX < 0.2) { 416 | s.vX = 0.2; 417 | } else if (s.vX < 0 && s.vX > -0.2) { 418 | s.vX = -0.2; 419 | } 420 | if (s.vY >= 0 && s.vY < 0.2) { 421 | s.vY = 0.2; 422 | } 423 | }; 424 | 425 | this.move = function () { 426 | var vX = s.vX * windOffset, yDiff; 427 | s.x += vX; 428 | s.y += (s.vY * s.vAmp); 429 | if (s.x >= screenX || screenX - s.x < storm.flakeWidth) { // X-axis scroll check 430 | s.x = 0; 431 | } else if (vX < 0 && s.x - storm.flakeLeftOffset < -storm.flakeWidth) { 432 | s.x = screenX - storm.flakeWidth - 1; // flakeWidth; 433 | } 434 | s.refresh(); 435 | yDiff = screenY + scrollY - s.y + storm.flakeHeight; 436 | if (yDiff < storm.flakeHeight) { 437 | s.active = 0; 438 | if (storm.snowStick) { 439 | s.stick(); 440 | } else { 441 | s.recycle(); 442 | } 443 | } else { 444 | if (storm.useMeltEffect && s.active && s.type < 3 && !s.melting && Math.random() > 0.998) { 445 | // ~1/1000 chance of melting mid-air, with each frame 446 | s.melting = true; 447 | s.melt(); 448 | // only incrementally melt one frame 449 | // s.melting = false; 450 | } 451 | if (storm.useTwinkleEffect) { 452 | if (s.twinkleFrame < 0) { 453 | if (Math.random() > 0.97) { 454 | s.twinkleFrame = parseInt(Math.random() * 8, 10); 455 | } 456 | } else { 457 | s.twinkleFrame--; 458 | if (!opacitySupported) { 459 | s.o.style.visibility = (s.twinkleFrame && s.twinkleFrame % 2 === 0 ? 'hidden' : 'visible'); 460 | } else { 461 | s.o.style.opacity = (s.twinkleFrame && s.twinkleFrame % 2 === 0 ? 0 : 1); 462 | } 463 | } 464 | } 465 | } 466 | }; 467 | 468 | this.animate = function () { 469 | // main animation loop 470 | // move, check status, die etc. 471 | s.move(); 472 | }; 473 | 474 | this.setVelocities = function () { 475 | s.vX = vRndX + rnd(storm.vMaxX * 0.12, 0.1); 476 | s.vY = vRndY + rnd(storm.vMaxY * 0.12, 0.1); 477 | }; 478 | 479 | this.setOpacity = function (o, opacity) { 480 | if (!opacitySupported) { 481 | return false; 482 | } 483 | o.style.opacity = opacity; 484 | }; 485 | 486 | this.melt = function () { 487 | if (!storm.useMeltEffect || !s.melting) { 488 | s.recycle(); 489 | } else { 490 | if (s.meltFrame < s.meltFrameCount) { 491 | s.setOpacity(s.o, s.meltFrames[s.meltFrame]); 492 | s.o.style.fontSize = s.fontSize - (s.fontSize * (s.meltFrame / s.meltFrameCount)) + 'px'; 493 | s.o.style.lineHeight = storm.flakeHeight + 2 + (storm.flakeHeight * 0.75 * (s.meltFrame / s.meltFrameCount)) + 'px'; 494 | s.meltFrame++; 495 | } else { 496 | s.recycle(); 497 | } 498 | } 499 | }; 500 | 501 | this.recycle = function () { 502 | s.o.style.display = 'none'; 503 | s.o.style.position = (fixedForEverything ? 'fixed' : 'absolute'); 504 | s.o.style.bottom = 'auto'; 505 | s.setVelocities(); 506 | s.vCheck(); 507 | s.meltFrame = 0; 508 | s.melting = false; 509 | s.setOpacity(s.o, 1); 510 | s.o.style.padding = '0px'; 511 | s.o.style.margin = '0px'; 512 | s.o.style.fontSize = s.fontSize + 'px'; 513 | s.o.style.lineHeight = (storm.flakeHeight + 2) + 'px'; 514 | s.o.style.textAlign = 'center'; 515 | s.o.style.verticalAlign = 'baseline'; 516 | s.x = parseInt(rnd(screenX - storm.flakeWidth - 20), 10); 517 | s.y = parseInt(rnd(screenY) * -1, 10) - storm.flakeHeight; 518 | s.refresh(); 519 | s.o.style.display = 'block'; 520 | s.active = 1; 521 | }; 522 | 523 | this.recycle(); // set up x/y coords etc. 524 | this.refresh(); 525 | 526 | }; 527 | 528 | this.snow = function () { 529 | var active = 0, flake = null, i, j; 530 | for (i = 0, j = storm.flakes.length; i < j; i++) { 531 | if (storm.flakes[i].active === 1) { 532 | storm.flakes[i].move(); 533 | active++; 534 | } 535 | if (storm.flakes[i].melting) { 536 | storm.flakes[i].melt(); 537 | } 538 | } 539 | if (active < storm.flakesMaxActive) { 540 | flake = storm.flakes[parseInt(rnd(storm.flakes.length), 10)]; 541 | if (flake.active === 0) { 542 | flake.melting = true; 543 | } 544 | } 545 | if (storm.timer) { 546 | features.getAnimationFrame(storm.snow); 547 | } 548 | }; 549 | 550 | this.mouseMove = function (e) { 551 | if (!storm.followMouse) { 552 | return true; 553 | } 554 | var x = parseInt(e.clientX, 10); 555 | if (x < screenX2) { 556 | windOffset = -windMultiplier + (x / screenX2 * windMultiplier); 557 | } else { 558 | x -= screenX2; 559 | windOffset = (x / screenX2) * windMultiplier; 560 | } 561 | }; 562 | 563 | this.createSnow = function (limit, allowInactive) { 564 | var i; 565 | for (i = 0; i < limit; i++) { 566 | storm.flakes[storm.flakes.length] = new storm.SnowFlake(parseInt(rnd(flakeTypes), 10)); 567 | if (allowInactive || i > storm.flakesMaxActive) { 568 | storm.flakes[storm.flakes.length - 1].active = -1; 569 | } 570 | } 571 | storm.targetElement.appendChild(docFrag); 572 | }; 573 | 574 | this.timerInit = function () { 575 | storm.timer = true; 576 | storm.snow(); 577 | }; 578 | 579 | this.init = function () { 580 | var i; 581 | for (i = 0; i < storm.meltFrameCount; i++) { 582 | storm.meltFrames.push(1 - (i / storm.meltFrameCount)); 583 | } 584 | storm.randomizeWind(); 585 | storm.createSnow(storm.flakesMax); // create initial batch 586 | storm.events.add(window, 'resize', storm.resizeHandler); 587 | storm.events.add(window, 'scroll', storm.scrollHandler); 588 | if (storm.freezeOnBlur) { 589 | if (isIE) { 590 | storm.events.add(document, 'focusout', storm.freeze); 591 | storm.events.add(document, 'focusin', storm.resume); 592 | } else { 593 | storm.events.add(window, 'blur', storm.freeze); 594 | storm.events.add(window, 'focus', storm.resume); 595 | } 596 | } 597 | storm.resizeHandler(); 598 | storm.scrollHandler(); 599 | if (storm.followMouse) { 600 | storm.events.add(isIE ? document : window, 'mousemove', storm.mouseMove); 601 | } 602 | storm.animationInterval = Math.max(20, storm.animationInterval); 603 | storm.timerInit(); 604 | }; 605 | 606 | this.start = function (bFromOnLoad) { 607 | if (!didInit) { 608 | didInit = true; 609 | } else if (bFromOnLoad) { 610 | // already loaded and running 611 | return true; 612 | } 613 | if (typeof storm.targetElement === 'string') { 614 | var targetID = storm.targetElement; 615 | storm.targetElement = document.getElementById(targetID); 616 | if (!storm.targetElement) { 617 | throw new Error('Snowstorm: Unable to get targetElement "' + targetID + '"'); 618 | } 619 | } 620 | if (!storm.targetElement) { 621 | storm.targetElement = (document.body || document.documentElement); 622 | } 623 | if (storm.targetElement !== document.documentElement && storm.targetElement !== document.body) { 624 | // re-map handler to get element instead of screen dimensions 625 | storm.resizeHandler = storm.resizeHandlerAlt; 626 | //and force-enable pixel positioning 627 | storm.usePixelPosition = true; 628 | } 629 | storm.resizeHandler(); // get bounding box elements 630 | storm.usePositionFixed = (storm.usePositionFixed && !noFixed && !storm.flakeBottom); // whether or not position:fixed is to be used 631 | if (window.getComputedStyle) { 632 | // attempt to determine if body or user-specified snow parent element is relatlively-positioned. 633 | try { 634 | targetElementIsRelative = (window.getComputedStyle(storm.targetElement, null).getPropertyValue('position') === 'relative'); 635 | } catch (e) { 636 | // oh well 637 | targetElementIsRelative = false; 638 | } 639 | } 640 | fixedForEverything = storm.usePositionFixed; 641 | if (screenX && screenY && !storm.disabled) { 642 | storm.init(); 643 | storm.active = true; 644 | } 645 | }; 646 | 647 | function doDelayedStart() { 648 | window.setTimeout(function () { 649 | storm.start(true); 650 | }, 20); 651 | // event cleanup 652 | storm.events.remove(isIE ? document : window, 'mousemove', doDelayedStart); 653 | } 654 | 655 | function doStart() { 656 | if (!storm.excludeMobile || !isMobile) { 657 | doDelayedStart(); 658 | } 659 | // event cleanup 660 | storm.events.remove(window, 'load', doStart); 661 | } 662 | 663 | // hooks for starting the snow 664 | if (storm.autoStart) { 665 | storm.events.add(window, 'load', doStart, false); 666 | } 667 | 668 | return this; 669 | 670 | }(window, document)); -------------------------------------------------------------------------------- /public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/public/logo.png -------------------------------------------------------------------------------- /public/mouredev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/public/mouredev.png -------------------------------------------------------------------------------- /public/mouredevpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/public/mouredevpro.png -------------------------------------------------------------------------------- /public/nuwe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/public/nuwe.png -------------------------------------------------------------------------------- /public/preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/public/preview.jpg -------------------------------------------------------------------------------- /public/raiola.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouredev/adeviento-web/6e4cc14f9ec187fbd61c50091ec9d7d0c7204553/public/raiola.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # * 2 | User-agent: * 3 | Allow: / 4 | 5 | # Host 6 | Host: http://localhost:3000 7 | 8 | # Sitemaps 9 | Sitemap: http://localhost:3000/sitemap.xml 10 | -------------------------------------------------------------------------------- /public/sitemap-0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | http://localhost:3000/2024-11-25T09:26:07.029Zdaily0.7 4 | -------------------------------------------------------------------------------- /public/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | http://localhost:3000/sitemap-0.xml 4 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | reflex==0.6.4 2 | -------------------------------------------------------------------------------- /rxconfig.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | 3 | config = rx.Config( 4 | app_name="adeviento_web", 5 | ) -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "builds": [ 4 | { 5 | "src": "build.sh", 6 | "use": "@vercel/static-build", 7 | "config": { 8 | "distDir": "public" 9 | } 10 | } 11 | ], 12 | "routes": [ 13 | { 14 | "src": "/(.*)", 15 | "dest": "/$1" 16 | } 17 | ] 18 | } --------------------------------------------------------------------------------