From ef49dd459407b6f40e7c985fb2001d34a577c5d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Garc=C3=ADa=20Jim=C3=A9nez?= Date: Thu, 20 Jan 2022 02:58:26 -0600 Subject: [PATCH] =?UTF-8?q?[Revisi=C3=B3n]=202022-01-20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- COPYING | 4 +- NOTICE | 15 +- README.md | 47 +- assets/icons/articles-icon.svg | 0 assets/icons/buho-icon.svg | 0 assets/icons/burger-icon.svg | 0 assets/icons/close-icon.svg | 0 assets/icons/comment-icon.svg | 0 assets/icons/heart-icon.svg | 0 assets/icons/login-icon.svg | 0 assets/icons/profile-icon.svg | 0 assets/icons/write-icon.svg | 0 assets/images/buho.svg | 0 assets/images/nabu-logo.svg | 0 assets/images/paper-plane.svg | 0 assets/scripts/article/article.js | 17 + assets/scripts/home.js | 23 +- .../admin/dashboard/dashboard-desktop.css | 0 assets/styles/admin/dashboard/dashboard.css | 0 .../admin/dashboard/users/users-desktop.css | 0 assets/styles/admin/dashboard/users/users.css | 0 .../edit-article/edit-article-desktop.css | 0 .../admin/edit-article/edit-article.css | 0 .../published-articles-desktop.css | 0 .../published-articles/published-articles.css | 0 assets/styles/admin/users/users-desktop.css | 0 assets/styles/admin/users/users.css | 0 .../styles/components/articles/articles.css | 48 +- .../components/footer/footer-desktop.css | 20 +- assets/styles/components/footer/footer.css | 34 +- .../components/navbar/navbar-desktop.css | 20 +- assets/styles/components/navbar/navbar.css | 27 +- .../components/search/search-desktop.css | 19 +- assets/styles/components/search/search.css | 25 +- assets/styles/normalize.css | 686 +++++++++--------- .../all-articles/all-articles-desktop.css | 19 +- .../all-articles/all-articles-tablet.css | 27 +- .../pages/all-articles/all-articles.css | 41 +- .../styles/pages/article/article-desktop.css | 34 +- assets/styles/pages/article/article.css | 88 ++- .../pages/category/category-desktop.css | 0 assets/styles/pages/category/category.css | 0 .../confirm-password-desktop.css | 0 .../confirm-password/confirm-password.css | 0 .../edit-article/edit-article-desktop.css | 0 .../pages/edit-article/edit-article.css | 0 .../edit-profile/edit-profile-desktop.css | 16 + .../pages/edit-profile/edit-profile.css | 26 + assets/styles/pages/errors/errors-desktop.css | 26 + assets/styles/pages/errors/errors.css | 26 + .../pages/favorites/favorites-desktop.css | 0 assets/styles/pages/favorites/favorites.css | 0 assets/styles/pages/home/home-desktop.css | 27 +- assets/styles/pages/home/home-tablet.css | 29 +- assets/styles/pages/home/home.css | 60 +- assets/styles/pages/login/login-desktop.css | 16 + assets/styles/pages/login/login.css | 29 +- .../post-article/post-article-desktop.css | 16 + .../pages/post-article/post-article.css | 26 + .../styles/pages/profile/profile-desktop.css | 16 + assets/styles/pages/profile/profile.css | 26 + assets/styles/pages/search/search-desktop.css | 0 assets/styles/pages/search/search.css | 0 .../sent-articles/sent-articles-desktop.css | 0 .../pages/sent-articles/sent-articles.css | 0 assets/styles/pages/signup/signup-desktop.css | 19 +- assets/styles/pages/signup/signup.css | 39 +- controllers/adminController.php | 67 +- controllers/articlesController.php | 30 +- controllers/authenticationController.php | 63 ++ controllers/blogController.php | 57 +- controllers/communityController.php | 19 - controllers/profilesController.php | 46 +- controllers/searchController.php | 11 - controllers/usersController.php | 403 +++++----- controllers/verificationsController.php | 55 -- core/config.php | 38 +- core/messages.php | 57 ++ core/requests.php | 46 +- core/routes.php | 55 +- core/utils.php | 44 ++ database/connection.php | 83 --- db/connection.php | 88 +++ {database => db}/db.sql | 45 +- index.php | 16 + libs/csrf.php | 83 ++- libs/emails.php | 83 ++- libs/messages.php | 45 -- libs/php-smtp-2.0.4/.gitignore | 4 + libs/utils.php | 29 - libs/validations.php | 286 +++----- models/adminModel.php | 14 - models/articlesModel.php | 14 - models/authenticationModel.php | 83 +++ models/blogModel.php | 32 +- models/communityModel.php | 14 - models/profilesModel.php | 14 - models/searchModel.php | 14 - models/usersModel.php | 167 +++-- models/verificationsModel.php | 69 -- views/admin/dashboard.php | 39 - views/admin/edit-article.php | 55 -- views/admin/published-articles.php | 49 -- views/admin/users.php | 53 -- views/components/admin-navbar.php | 16 - views/components/articles.php | 48 +- views/components/footer.php | 17 + views/components/head.php | 24 +- views/components/messages.php | 27 +- views/components/navbar.php | 41 +- views/components/pagination.php | 17 + views/components/search.php | 19 +- views/emails/authentication.php | 24 + views/emails/verifications.php | 8 - views/pages/all-articles.php | 28 +- views/pages/article.php | 36 +- views/pages/category.php | 19 - views/pages/confirm-password.php | 33 - views/pages/edit-article.php | 42 -- views/pages/edit-profile.php | 76 -- views/pages/errors.php | 13 +- views/pages/favorites.php | 18 - views/pages/home.php | 51 +- views/pages/login.php | 32 +- views/pages/post-article.php | 42 -- views/pages/profile.php | 38 - views/pages/search.php | 24 - views/pages/sent-articles.php | 34 - views/pages/signup.php | 32 +- 130 files changed, 2477 insertions(+), 2246 deletions(-) mode change 100755 => 100644 assets/icons/articles-icon.svg mode change 100755 => 100644 assets/icons/buho-icon.svg mode change 100755 => 100644 assets/icons/burger-icon.svg mode change 100755 => 100644 assets/icons/close-icon.svg mode change 100755 => 100644 assets/icons/comment-icon.svg mode change 100755 => 100644 assets/icons/heart-icon.svg mode change 100755 => 100644 assets/icons/login-icon.svg mode change 100755 => 100644 assets/icons/profile-icon.svg mode change 100755 => 100644 assets/icons/write-icon.svg mode change 100755 => 100644 assets/images/buho.svg mode change 100755 => 100644 assets/images/nabu-logo.svg mode change 100755 => 100644 assets/images/paper-plane.svg delete mode 100644 assets/styles/admin/dashboard/dashboard-desktop.css delete mode 100644 assets/styles/admin/dashboard/dashboard.css delete mode 100644 assets/styles/admin/dashboard/users/users-desktop.css delete mode 100644 assets/styles/admin/dashboard/users/users.css delete mode 100644 assets/styles/admin/edit-article/edit-article-desktop.css delete mode 100644 assets/styles/admin/edit-article/edit-article.css delete mode 100644 assets/styles/admin/published-articles/published-articles-desktop.css delete mode 100644 assets/styles/admin/published-articles/published-articles.css delete mode 100644 assets/styles/admin/users/users-desktop.css delete mode 100644 assets/styles/admin/users/users.css delete mode 100644 assets/styles/pages/category/category-desktop.css delete mode 100644 assets/styles/pages/category/category.css delete mode 100644 assets/styles/pages/confirm-password/confirm-password-desktop.css delete mode 100644 assets/styles/pages/confirm-password/confirm-password.css delete mode 100644 assets/styles/pages/edit-article/edit-article-desktop.css delete mode 100644 assets/styles/pages/edit-article/edit-article.css delete mode 100644 assets/styles/pages/favorites/favorites-desktop.css delete mode 100644 assets/styles/pages/favorites/favorites.css delete mode 100644 assets/styles/pages/search/search-desktop.css delete mode 100644 assets/styles/pages/search/search.css delete mode 100644 assets/styles/pages/sent-articles/sent-articles-desktop.css delete mode 100644 assets/styles/pages/sent-articles/sent-articles.css create mode 100644 controllers/authenticationController.php delete mode 100644 controllers/communityController.php delete mode 100644 controllers/searchController.php delete mode 100644 controllers/verificationsController.php create mode 100644 core/messages.php create mode 100644 core/utils.php delete mode 100644 database/connection.php create mode 100644 db/connection.php rename {database => db}/db.sql (68%) delete mode 100644 libs/messages.php create mode 100644 libs/php-smtp-2.0.4/.gitignore delete mode 100644 libs/utils.php create mode 100644 models/authenticationModel.php delete mode 100644 models/communityModel.php delete mode 100644 models/searchModel.php delete mode 100644 models/verificationsModel.php delete mode 100644 views/admin/dashboard.php delete mode 100644 views/admin/edit-article.php delete mode 100644 views/admin/published-articles.php delete mode 100644 views/admin/users.php delete mode 100644 views/components/admin-navbar.php create mode 100644 views/emails/authentication.php delete mode 100644 views/emails/verifications.php delete mode 100644 views/pages/category.php delete mode 100644 views/pages/confirm-password.php delete mode 100644 views/pages/edit-article.php delete mode 100644 views/pages/edit-profile.php delete mode 100644 views/pages/favorites.php delete mode 100644 views/pages/post-article.php delete mode 100644 views/pages/profile.php delete mode 100644 views/pages/search.php delete mode 100644 views/pages/sent-articles.php diff --git a/.gitignore b/.gitignore index 7e46835..8d79c59 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -database-config.json -email-config.json +config/ logs/ storage/ diff --git a/COPYING b/COPYING index 0ad25db..be3f7b2 100644 --- a/COPYING +++ b/COPYING @@ -633,8 +633,8 @@ the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, diff --git a/NOTICE b/NOTICE index c6d990a..47b204a 100644 --- a/NOTICE +++ b/NOTICE @@ -1,13 +1,14 @@ -Nabu - A content management system (CMS) for Markdown articles, written in HTML, CSS, JavaScript and PHP. +Nabu - A content management system (CMS) for Markdown articles + for the University of Guanajuato written in HTML, CSS, JavaScript and PHP. -Copyright (C) 2021 Ricardo García Jiménez , - Juan José Ramírez López , - Francisco Solís Martínez , - Fernando Andrés Chávez Gavaldón +Copyright (C) 2021 - Ricardo García Jiménez , + Juan José Ramírez López , + Francisco Solís Martínez , + Fernando Andrés Chávez Gavaldón This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published -by the Free Software Foundation, either version 3 of the License, or +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, diff --git a/README.md b/README.md index cc2cd37..4d626d8 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,49 @@ # Nabu -Un sistema gestor de contenido (CMS) para artículos en `Markdown`, escrito en `HTML`, `CSS`, `JavaScript` y `PHP`. +Un sistema gestor de contenido (CMS) de artículos en `Markdown` para la [Universidad de Guanajuato](https://www.ugto.mx/) escrito en `HTML`, `CSS`, `JavaScript` y `PHP`. -## Archivo de configuración de la base de datos +## Dependencias -Por defecto, `Nabu` escanea el archivo `database-config.json` dentro de la carpeta raíz del proyecto. +## Estructura del proyecto -Estructura del archivo de configuración: +## Configuración de la base de datos + +Por defecto, `Nabu` escanea desde la raíz de la carpeta del programa, el archivo de configuración `config/db.json` ```json { - "dbms": "mysql", - "host": "localhost", - "database": "nabu", - "user": "root", - "password": "root", - "charset": "utf8mb4" + "dbms": "mysql", + "host": "localhost", + "database": "nabu", + "user": "root", + "password": "root", + "charset": "utf8mb4" } ``` -## Archivo de configuración del cliente de correo electrónico +## Configuración del cliente de correo electrónico -Por defecto, `Nabu` escanea el archivo `email-config.json` dentro de la carpeta raíz del proyecto. - -Estructura del archivo de configuración: +Por defecto, `Nabu` escanea desde la raíz de la carpeta del programa, el archivo de configuración `config/email.json` ```json { - "smtp": "smtp.gmail.com", - "port": 587, - "address": "foo@gmail.com", - "password": "xxxxx" + "smtp": "smtp.example.com", + "port": 587, + "address": "foo@example.com", + "password": "xxxxx" } ``` ## Licencia ```text -Nabu - Un sistema gestor de contenido (CMS) para artículos en Markdown, escrito en HTML, CSS, JavaScript y PHP. +Nabu - Un sistema gestor de contenido (CMS) de artículos en Markdown para + la Universidad de Guanajuato escrito en HTML, CSS, JavaScript y PHP. -Copyright (C) 2021 Ricardo García Jiménez , - Juan José Ramírez López , - Francisco Solís Martínez , - Fernando Andrés Chávez Gavaldón +Copyright (C) 2021 - Ricardo García Jiménez , + Juan José Ramírez López , + Francisco Solís Martínez , + Fernando Andrés Chávez Gavaldón Este programa es software libre: puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General de GNU Affero publicada por diff --git a/assets/icons/articles-icon.svg b/assets/icons/articles-icon.svg old mode 100755 new mode 100644 diff --git a/assets/icons/buho-icon.svg b/assets/icons/buho-icon.svg old mode 100755 new mode 100644 diff --git a/assets/icons/burger-icon.svg b/assets/icons/burger-icon.svg old mode 100755 new mode 100644 diff --git a/assets/icons/close-icon.svg b/assets/icons/close-icon.svg old mode 100755 new mode 100644 diff --git a/assets/icons/comment-icon.svg b/assets/icons/comment-icon.svg old mode 100755 new mode 100644 diff --git a/assets/icons/heart-icon.svg b/assets/icons/heart-icon.svg old mode 100755 new mode 100644 diff --git a/assets/icons/login-icon.svg b/assets/icons/login-icon.svg old mode 100755 new mode 100644 diff --git a/assets/icons/profile-icon.svg b/assets/icons/profile-icon.svg old mode 100755 new mode 100644 diff --git a/assets/icons/write-icon.svg b/assets/icons/write-icon.svg old mode 100755 new mode 100644 diff --git a/assets/images/buho.svg b/assets/images/buho.svg old mode 100755 new mode 100644 diff --git a/assets/images/nabu-logo.svg b/assets/images/nabu-logo.svg old mode 100755 new mode 100644 diff --git a/assets/images/paper-plane.svg b/assets/images/paper-plane.svg old mode 100755 new mode 100644 diff --git a/assets/scripts/article/article.js b/assets/scripts/article/article.js index 5678b08..8227f24 100644 --- a/assets/scripts/article/article.js +++ b/assets/scripts/article/article.js @@ -1,3 +1,20 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + const post = document.querySelector('.post__copy'); const heart = document.querySelector('.icon'); diff --git a/assets/scripts/home.js b/assets/scripts/home.js index 4bcbf59..4f26ce7 100644 --- a/assets/scripts/home.js +++ b/assets/scripts/home.js @@ -1,9 +1,25 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + 'use strict'; const controlMenu = document.querySelector('#control-menu'); const menu = document.querySelector('#menu'); const overlay = document.querySelector('.overlay'); - controlMenu.addEventListener('click', () => { menu.classList.add('nav__menu-isactive'); overlay.classList.add('overlay__is-active'); @@ -17,7 +33,6 @@ overlay.addEventListener('click', () => { }) /* - Home head.php home.php @@ -33,6 +48,4 @@ overlay.addEventListener('click', () => { articles.css articles-desktop.css articles.js - - -*/ \ No newline at end of file +*/ diff --git a/assets/styles/admin/dashboard/dashboard-desktop.css b/assets/styles/admin/dashboard/dashboard-desktop.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/admin/dashboard/dashboard.css b/assets/styles/admin/dashboard/dashboard.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/admin/dashboard/users/users-desktop.css b/assets/styles/admin/dashboard/users/users-desktop.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/admin/dashboard/users/users.css b/assets/styles/admin/dashboard/users/users.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/admin/edit-article/edit-article-desktop.css b/assets/styles/admin/edit-article/edit-article-desktop.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/admin/edit-article/edit-article.css b/assets/styles/admin/edit-article/edit-article.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/admin/published-articles/published-articles-desktop.css b/assets/styles/admin/published-articles/published-articles-desktop.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/admin/published-articles/published-articles.css b/assets/styles/admin/published-articles/published-articles.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/admin/users/users-desktop.css b/assets/styles/admin/users/users-desktop.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/admin/users/users.css b/assets/styles/admin/users/users.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/components/articles/articles.css b/assets/styles/components/articles/articles.css index 09bdc99..faa92f3 100644 --- a/assets/styles/components/articles/articles.css +++ b/assets/styles/components/articles/articles.css @@ -1,23 +1,42 @@ -/* Orden de los estilos -1. Posicionamineto -2. Modelo de caja -3. Tipografia -4. Visuales -5. Otros -Metodologia => BEM +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . */ + +/* +* Orden de los estilos +* 1. Posicionamiento +* 2. Modelo de caja +* 3. Tipografía +* 4. Visuales +* 5. Otros +* Metodología => BEM +*/ + .skeleton { opacity: 0.8; animation: skeleton-loading 1s linear infinite alternate; } -@keyframes skeleton-loading { - 0%{ - background-color: hsl(200, 20%, 70%); +@keyframes skeleton-loading { + 0% { + background-color: hsl(200, 20%, 70%); } - + 100% { - background-color: hsl(200, 20%, 95%); + background-color: hsl(200, 20%, 95%); } } @@ -71,7 +90,6 @@ Metodologia => BEM margin-bottom: 8px; font-size: 1.6rem; font-weight: 600; - } .card__copy { @@ -85,7 +103,7 @@ Metodologia => BEM justify-content: space-between; } -/*Imagen de perfil*/ +/* Imagen de perfil */ .profile { display: block; min-width: 25px; @@ -142,4 +160,4 @@ Metodologia => BEM .card__stats-numcom { font-size: 1.2rem; font-weight: 600; -} \ No newline at end of file +} diff --git a/assets/styles/components/footer/footer-desktop.css b/assets/styles/components/footer/footer-desktop.css index c8d91dc..79eb385 100644 --- a/assets/styles/components/footer/footer-desktop.css +++ b/assets/styles/components/footer/footer-desktop.css @@ -1,8 +1,26 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + .rights { display: flex; flex-direction: column; gap: 8px; } + .rights__info { font-size: 1.2rem; } @@ -10,4 +28,4 @@ .media__icon svg{ width: 25px; height: 25px; -} \ No newline at end of file +} diff --git a/assets/styles/components/footer/footer.css b/assets/styles/components/footer/footer.css index 29cbf84..b58b54d 100644 --- a/assets/styles/components/footer/footer.css +++ b/assets/styles/components/footer/footer.css @@ -1,10 +1,28 @@ -/* Orden de los estilos -1. Posicionamineto -2. Modelo de caja -3. Tipografia -4. Visuales -5. Otros -Metodologia => BEM +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* +* Orden de los estilos +* 1. Posicionamiento +* 2. Modelo de caja +* 3. Tipografía +* 4. Visuales +* 5. Otros +* Metodología => BEM */ .footer { @@ -38,4 +56,4 @@ Metodologia => BEM align-items: center; text-decoration: none; cursor: pointer; -} \ No newline at end of file +} diff --git a/assets/styles/components/navbar/navbar-desktop.css b/assets/styles/components/navbar/navbar-desktop.css index 0c902ea..802dbb0 100644 --- a/assets/styles/components/navbar/navbar-desktop.css +++ b/assets/styles/components/navbar/navbar-desktop.css @@ -1,3 +1,20 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + .overlay, .nav__item-logo, .nav__burger-icon { @@ -32,7 +49,6 @@ order: 2; } - .nav__item a { padding: 10px 15px; border-radius: 40px; @@ -66,5 +82,3 @@ .nav__item span { display: none; } - - diff --git a/assets/styles/components/navbar/navbar.css b/assets/styles/components/navbar/navbar.css index e2dca69..2b84c30 100644 --- a/assets/styles/components/navbar/navbar.css +++ b/assets/styles/components/navbar/navbar.css @@ -1,4 +1,21 @@ -/* Estilos al menu */ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* Estilos para el menú */ .nav { width: 100%; display: flex; @@ -34,7 +51,7 @@ cursor: pointer; } -/* Estilos para menú */ +/* Estilos para el menú */ .nav__menu { width: 65%; display: flex; @@ -65,10 +82,6 @@ display: block; } -.nav__logo-menu{ - width: 100%; -} - .nav__item { /* background-color: hsla(237, 58%, 69%, 0.4); */ display: flex; @@ -129,7 +142,7 @@ background-image: url('../../../icons/write-icon.svg'); } -/* Estilos para la visualizacion del menu */ +/* Estilos para la visualización del menú */ .overlay { opacity: 0; position: fixed; diff --git a/assets/styles/components/search/search-desktop.css b/assets/styles/components/search/search-desktop.css index 5fec811..7ab4d66 100644 --- a/assets/styles/components/search/search-desktop.css +++ b/assets/styles/components/search/search-desktop.css @@ -1,3 +1,20 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + .search__content { width: 50em; -} \ No newline at end of file +} diff --git a/assets/styles/components/search/search.css b/assets/styles/components/search/search.css index 5d7ae82..92ec8b0 100644 --- a/assets/styles/components/search/search.css +++ b/assets/styles/components/search/search.css @@ -1,6 +1,25 @@ -/* .search__container { +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* +.search__container { text-align: center; -} */ +} +*/ .search__content { position: relative; @@ -31,4 +50,4 @@ background-image: url(../../../icons/glass-icon.svg); background-position: center; background-repeat: no-repeat; -} \ No newline at end of file +} diff --git a/assets/styles/normalize.css b/assets/styles/normalize.css index 2d20891..43750b1 100644 --- a/assets/styles/normalize.css +++ b/assets/styles/normalize.css @@ -8,8 +8,7 @@ * 2. Prevent adjustments of font size after orientation changes in iOS. */ -/* Base Styles to nabu project */ -/* Estilos base */ +/* Estilos base para Nabu */ :root { --color-background: hsl(197, 24%, 94%); --color-primary-red: hsl(355, 83%, 71%); @@ -19,351 +18,350 @@ --color-secundary-background: hsl(0, 0%, 91%); } - * { +* { box-sizing: border-box; margin: 0; padding: 0; } +html { + font-size: 62.5%; + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} - html { - font-size: 62.5%; - line-height: 1.15; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ - } - - /* Sections - ========================================================================== */ - - /** - * Remove the margin in all browsers. - */ - - body { - font-family: 'Poppins', sans-serif; - margin: 0; - } - - /** - * Render the `main` element consistently in IE. - */ - - main { - display: block; - } - - /** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ - - h1 { - font-size: 2em; - margin: 0.67em 0; - } - - /* Grouping content - ========================================================================== */ - - /** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ - - hr { - box-sizing: content-box; /* 1 */ - height: 0; /* 1 */ - overflow: visible; /* 2 */ - } - - /** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - - pre { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ - } - - /* Text-level semantics - ========================================================================== */ - - /** - * Remove the gray background on active links in IE 10. - */ - - a { - background-color: transparent; - } - - /** - * 1. Remove the bottom border in Chrome 57- - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ - - abbr[title] { - border-bottom: none; /* 1 */ - text-decoration: underline; /* 2 */ - text-decoration: underline dotted; /* 2 */ - } - - /** - * Add the correct font weight in Chrome, Edge, and Safari. - */ - - b, - strong { - font-weight: bolder; - } - - /** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - - code, - kbd, - samp { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ - } - - /** - * Add the correct font size in all browsers. - */ - - small { - font-size: 80%; - } - - /** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ - - sub, - sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; - } - - sub { - bottom: -0.25em; - } - - sup { - top: -0.5em; - } - - /* Embedded content - ========================================================================== */ - - /** - * Remove the border on images inside links in IE 10. - */ - - img { - border-style: none; - } - - /* Forms - ========================================================================== */ - - /** - * 1. Change the font styles in all browsers. - * 2. Remove the margin in Firefox and Safari. - */ - - button, - input, - optgroup, - select, - textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 1 */ - line-height: 1.15; /* 1 */ - margin: 0; /* 2 */ - } - - /** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ - - button, - input { /* 1 */ - overflow: visible; - } - - /** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ - - button, - select { /* 1 */ - text-transform: none; - } - - /** - * Correct the inability to style clickable types in iOS and Safari. - */ - - button, - [type="button"], - [type="reset"], - [type="submit"] { - -webkit-appearance: button; - } - - /** - * Remove the inner border and padding in Firefox. - */ - - button::-moz-focus-inner, - [type="button"]::-moz-focus-inner, - [type="reset"]::-moz-focus-inner, - [type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; - } - - /** - * Restore the focus styles unset by the previous rule. - */ - - button:-moz-focusring, - [type="button"]:-moz-focusring, - [type="reset"]:-moz-focusring, - [type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; - } - - /** - * Correct the padding in Firefox. - */ - - fieldset { - padding: 0.35em 0.75em 0.625em; - } - - /** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ - - legend { - box-sizing: border-box; /* 1 */ - color: inherit; /* 2 */ - display: table; /* 1 */ - max-width: 100%; /* 1 */ - padding: 0; /* 3 */ - white-space: normal; /* 1 */ - } - - /** - * Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ - - progress { - vertical-align: baseline; - } - - /** - * Remove the default vertical scrollbar in IE 10+. - */ - - textarea { - overflow: auto; - } - - /** - * 1. Add the correct box sizing in IE 10. - * 2. Remove the padding in IE 10. - */ - - [type="checkbox"], - [type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ - } - - /** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ - - [type="number"]::-webkit-inner-spin-button, - [type="number"]::-webkit-outer-spin-button { - height: auto; - } - - /** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ - - [type="search"] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ - } - - /** - * Remove the inner padding in Chrome and Safari on macOS. - */ - - [type="search"]::-webkit-search-decoration { - -webkit-appearance: none; - } - - /** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ - - ::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ - } - - /* Interactive - ========================================================================== */ - - /* - * Add the correct display in Edge, IE 10+, and Firefox. - */ - - details { - display: block; - } - - /* - * Add the correct display in all browsers. - */ - - summary { - display: list-item; - } - - /* Misc - ========================================================================== */ - - /** - * Add the correct display in IE 10+. - */ - - template { - display: none; - } - - /** - * Add the correct display in IE 10. - */ - - [hidden] { - display: none; - } \ No newline at end of file +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + font-family: 'Poppins', sans-serif; + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} diff --git a/assets/styles/pages/all-articles/all-articles-desktop.css b/assets/styles/pages/all-articles/all-articles-desktop.css index 2ead87b..4e30922 100644 --- a/assets/styles/pages/all-articles/all-articles-desktop.css +++ b/assets/styles/pages/all-articles/all-articles-desktop.css @@ -1,4 +1,21 @@ -/* Estilos para el CTA desktop*/ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* Estilos para el CTA desktop */ .CTA { min-height: 340px; diff --git a/assets/styles/pages/all-articles/all-articles-tablet.css b/assets/styles/pages/all-articles/all-articles-tablet.css index ead1d82..9ebaeee 100644 --- a/assets/styles/pages/all-articles/all-articles-tablet.css +++ b/assets/styles/pages/all-articles/all-articles-tablet.css @@ -1,4 +1,22 @@ -/* Estilos desktop para el buscador*/ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* Estilos desktop para el buscador */ + .searcher__content { width: 95%; display: flex; @@ -6,7 +24,6 @@ justify-content: center; align-items: center; gap: 10%; - } .searcher__image { @@ -19,8 +36,7 @@ background-size: cover; } - -/*Estilos desktop para los artículos*/ +/* Estilos desktop para los artículos */ .articles { margin: 0 auto; @@ -59,6 +75,7 @@ } /* Texto del CTA */ + .CTA__title { font-size: 2.6rem; line-height: 5.4rem; @@ -67,4 +84,4 @@ .CTA__description { font-size: 1.6rem; line-height: 2.2rem; -} \ No newline at end of file +} diff --git a/assets/styles/pages/all-articles/all-articles.css b/assets/styles/pages/all-articles/all-articles.css index 029253b..81dd9e7 100644 --- a/assets/styles/pages/all-articles/all-articles.css +++ b/assets/styles/pages/all-articles/all-articles.css @@ -1,16 +1,36 @@ -/* Orden de los estilos -1. Posicionamineto -2. Modelo de caja -3. Tipografia -4. Visuales -5. Otros -Metodologia => BEM +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . */ + +/* +* Orden de los estilos +* 1. Posicionamiento +* 2. Modelo de caja +* 3. Tipografía +* 4. Visuales +* 5. Otros +* Metodología => BEM +*/ + body { background-color: var(--color-background); } -/* Estilos al header */ +/* Estilos del header */ + .header { width: 90%; margin: 0 auto; @@ -18,7 +38,7 @@ body { background-color: var(--color-background); } -/*Estilos para la seccion de los artículos*/ +/* Estilos para la sección de artículos */ .articles__data { display: flex; @@ -54,7 +74,6 @@ body { width: 90%; padding: 20px 0; text-align: center; - } .CTA__title { @@ -104,4 +123,4 @@ body { background-color: var(--color-primary-red); color: #fff; border: none; -} \ No newline at end of file +} diff --git a/assets/styles/pages/article/article-desktop.css b/assets/styles/pages/article/article-desktop.css index d59462b..cc97a22 100644 --- a/assets/styles/pages/article/article-desktop.css +++ b/assets/styles/pages/article/article-desktop.css @@ -1,4 +1,22 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + /* Fix the width to se in a tablet and desktop */ + .nav, .post__head, .post__copy, @@ -7,7 +25,8 @@ width: 80%; } -/* Estilso al header */ +/* Estilos del header */ + header { box-shadow: inset 0 0 0 100vh rgba(0,0,0,0.4); } @@ -16,7 +35,7 @@ header:hover { box-shadow: inset 0 0 0 100vh rgba(0,0,0,0.2); } -/* Estilos al nav bar */ +/* Estilos para el navbar */ .nav__logo-wrapper{ width: 100px; } @@ -34,8 +53,8 @@ header:hover { color: #FFF; } +/* Estilos de la sección de otros posts */ -/* Estilos a la seccion de otros posts */ .popular-posts { width: 100%; background-color: initial; @@ -52,7 +71,8 @@ header:hover { scroll-snap-type: initial; } -/* Estilos para la seccion del autor */ +/* Estilos de la sección del autor */ + .author-info__title { font-size: 2.4rem; } @@ -61,7 +81,7 @@ header:hover { font-size: 1.4rem; } -/* Seccion de comentarios */ +/* Sección de comentarios */ .comments__form { max-width: 660px; @@ -72,11 +92,13 @@ header:hover { } /* Text area */ + .comments__textarea { font-size: 1.4rem; } -/* Boton mandar comentario */ +/* Botón para enviar un comentario */ + .comments__button { font-size: 1.4rem; } diff --git a/assets/styles/pages/article/article.css b/assets/styles/pages/article/article.css index e9cb9a6..d434691 100644 --- a/assets/styles/pages/article/article.css +++ b/assets/styles/pages/article/article.css @@ -1,16 +1,36 @@ -/* Orden de los estilos -1. Posicionamineto -2. Modelo de caja -3. Tipografia -4. Visuales -5. Otros -Metodologia => BEM +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* +* Orden de los estilos +* 1. Posicionamiento +* 2. Modelo de caja +* 3. Tipografía +* 4. Visuales +* 5. Otros +* Metodología => BEM */ body { background-color: var(--color-background); } -/* Estilos al header */ + +/* Estilos del header */ + header { min-width: 320px; width: 100%; @@ -22,19 +42,19 @@ header { box-shadow: inset 0 0 0 100vh rgba(0,0,0,0.2); } - header::before { - content: ""; - position: absolute; - z-index: 1; - left: 0; - right: 0; - top: 0; - bottom: 0; - background: rgba(0, 0, 0, .5); + content: ""; + position: absolute; + z-index: 1; + left: 0; + right: 0; + top: 0; + bottom: 0; + background: rgba(0, 0, 0, .5); } -/* Sobreescribiendo estilos del componente nav */ +/* Sobrescribe los estilos del componente nav */ + .nav { background-color: initial; padding-bottom: 50px; @@ -48,7 +68,8 @@ header::before { z-index: 2; } -/* Liston del navbar */ +/* Listón del navbar */ + .nav__polygon { display: initial; width: 80px; @@ -74,7 +95,8 @@ header::before { width: 100%; } -/* Estilos al texto del post */ +/* Estilos del texto del post */ + .post__head { width: 90%; margin: 0 auto; @@ -126,6 +148,7 @@ header::before { } /* Post text */ + .post__body { width: 100%; padding-top: 10px; @@ -147,6 +170,7 @@ header::before { } /* Estilos para el like */ + .icon { width: 30px; height: 30px; @@ -184,6 +208,7 @@ header::before { } /* Estilos generales de las etiquetas */ + .post__copy > p:not(p:first-child) { margin-top: 2.8rem; } @@ -208,7 +233,8 @@ header::before { margin-top: 1rem; } -/* Estilos para la seccion de otros post para mostrar */ +/* Estilos de la sección de otros post para mostrar */ + .popular-posts { width: 100%; min-width: 320px; @@ -232,21 +258,23 @@ header::before { gap: 0 20px; padding: 15px 20px; overflow-x: scroll; - margin-left:auto; + margin-left: auto; scroll-snap-type: x mandatory; } -/* Estilos a la barra del scroll */ +/* Estilos de la barra de scroll */ + .pupular-cards__container::-webkit-scrollbar { - width: 2px; - height: 2px; + width: 2px; + height: 2px; } .popular-cards__container::-webkit-scrollbar-thumb { - background-color: var(--color-secondary-purple); + background-color: var(--color-secondary-purple); } -/* Estilos para la seccion del autor */ +/* Estilos de la sección del autor */ + .author-info__container { width: 90%; margin: 0 auto; @@ -287,7 +315,8 @@ header::before { line-height: 1.4rem; } -/* Estilos para la caja de comentarios */ +/* Estilos de la caja de comentarios */ + .comments { width: 100%; padding: 40px 0; @@ -355,7 +384,8 @@ header::before { transform: scale(1.1); } -/* Estilos para el footer */ +/* Estilos del footer */ + .footer { background-color: var(--color-black); } diff --git a/assets/styles/pages/category/category-desktop.css b/assets/styles/pages/category/category-desktop.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/pages/category/category.css b/assets/styles/pages/category/category.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/pages/confirm-password/confirm-password-desktop.css b/assets/styles/pages/confirm-password/confirm-password-desktop.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/pages/confirm-password/confirm-password.css b/assets/styles/pages/confirm-password/confirm-password.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/pages/edit-article/edit-article-desktop.css b/assets/styles/pages/edit-article/edit-article-desktop.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/pages/edit-article/edit-article.css b/assets/styles/pages/edit-article/edit-article.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/pages/edit-profile/edit-profile-desktop.css b/assets/styles/pages/edit-profile/edit-profile-desktop.css index e69de29..0d801f0 100644 --- a/assets/styles/pages/edit-profile/edit-profile-desktop.css +++ b/assets/styles/pages/edit-profile/edit-profile-desktop.css @@ -0,0 +1,16 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ diff --git a/assets/styles/pages/edit-profile/edit-profile.css b/assets/styles/pages/edit-profile/edit-profile.css index e69de29..79f65d9 100644 --- a/assets/styles/pages/edit-profile/edit-profile.css +++ b/assets/styles/pages/edit-profile/edit-profile.css @@ -0,0 +1,26 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* +* Orden de los estilos +* 1. Posicionamiento +* 2. Modelo de caja +* 3. Tipografía +* 4. Visuales +* 5. Otros +* Metodología => BEM +*/ diff --git a/assets/styles/pages/errors/errors-desktop.css b/assets/styles/pages/errors/errors-desktop.css index e69de29..79f65d9 100644 --- a/assets/styles/pages/errors/errors-desktop.css +++ b/assets/styles/pages/errors/errors-desktop.css @@ -0,0 +1,26 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* +* Orden de los estilos +* 1. Posicionamiento +* 2. Modelo de caja +* 3. Tipografía +* 4. Visuales +* 5. Otros +* Metodología => BEM +*/ diff --git a/assets/styles/pages/errors/errors.css b/assets/styles/pages/errors/errors.css index e69de29..79f65d9 100644 --- a/assets/styles/pages/errors/errors.css +++ b/assets/styles/pages/errors/errors.css @@ -0,0 +1,26 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* +* Orden de los estilos +* 1. Posicionamiento +* 2. Modelo de caja +* 3. Tipografía +* 4. Visuales +* 5. Otros +* Metodología => BEM +*/ diff --git a/assets/styles/pages/favorites/favorites-desktop.css b/assets/styles/pages/favorites/favorites-desktop.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/pages/favorites/favorites.css b/assets/styles/pages/favorites/favorites.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/pages/home/home-desktop.css b/assets/styles/pages/home/home-desktop.css index 92fccbc..205bfb3 100644 --- a/assets/styles/pages/home/home-desktop.css +++ b/assets/styles/pages/home/home-desktop.css @@ -1,9 +1,27 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + .hero__img-wrapper { flex-basis: 50%; max-width: 450px; } -/* Estilos para la seccion de los post mas populares */ +/* Estilos de la sección de los post más populares */ + .popular-posts { width: 90%; display: flex; @@ -37,7 +55,6 @@ min-width: initial; width: 80px; transition: all ease-in-out 400ms; - } .popular-cards__container .card:hover:not(.card:last-child) { @@ -53,6 +70,8 @@ opacity: 1; } -/* .popular-cards__container .card:hover:not(.card:last-child) ~ .card:last-child { +/* +.popular-cards__container .card:hover:not(.card:last-child) ~ .card:last-child { right: -200px; -} */ +} +*/ diff --git a/assets/styles/pages/home/home-tablet.css b/assets/styles/pages/home/home-tablet.css index e3836ff..8eaa1cf 100644 --- a/assets/styles/pages/home/home-tablet.css +++ b/assets/styles/pages/home/home-tablet.css @@ -1,4 +1,21 @@ -/* Estilos para el header */ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* Estilos del header */ .hero { flex-direction: row-reverse; @@ -16,10 +33,9 @@ flex-basis: 50%; } - .hero__CTA { - margin: 0; - margin-bottom: 10px; + margin: 0; + margin-bottom: 10px; } .hero__secundary-CTA { @@ -30,7 +46,7 @@ margin: 0; } -/* Estilos para la seccion de posts mas recientes */ +/* Estilos de la sección de los posts más recientes */ .recent__posts { width: 90%; @@ -46,6 +62,3 @@ .CTA__button { width: 40%; } - - - diff --git a/assets/styles/pages/home/home.css b/assets/styles/pages/home/home.css index 799e04b..8aac20e 100644 --- a/assets/styles/pages/home/home.css +++ b/assets/styles/pages/home/home.css @@ -1,16 +1,36 @@ -/* Orden de los estilos -1. Posicionamineto -2. Modelo de caja -3. Tipografia -4. Visuales -5. Otros -Metodologia => BEM +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . */ + +/* +* Orden de los estilos +* 1. Posicionamiento +* 2. Modelo de caja +* 3. Tipografía +* 4. Visuales +* 5. Otros +* Metodología => BEM +*/ + body { background-color: var(--color-background); } -/* Estilos al header */ +/* Estilos del header */ + .header { width: 90%; margin: 0 auto; @@ -20,7 +40,8 @@ body { background-color: var(--color-background); } -/* Estilos para el hero */ +/* Estilos del hero */ + .hero { display: flex; flex-direction: column; @@ -66,7 +87,7 @@ body { color: #FFF; } -/* Estilos a la seccion de posts populares */ +/* Estilos de la sección de los posts más populares */ .popular-posts { width: 100%; @@ -91,21 +112,21 @@ body { gap: 0 20px; padding: 15px 20px; overflow-x: scroll; - margin-left:auto; + margin-left: auto; scroll-snap-type: x mandatory; } -/* Estilos a la barra del scroll */ +/* Estilos de la barra de scroll */ .cards__container::-webkit-scrollbar { - width: 2px; - height: 2px; + width: 2px; + height: 2px; } - + .cards__container::-webkit-scrollbar-thumb { - background-color: var(--color-secondary-purple); + background-color: var(--color-secondary-purple); } -/* Estilos para la seccion de posts mas recientes */ +/* Estilos de la sección de los posts más recientes */ .recent__posts { width: 100%; @@ -116,7 +137,7 @@ body { } .recent-posts__title { - margin-bottom: 15px; + margin-bottom: 15px; } .recent-cards__container { @@ -126,7 +147,7 @@ body { gap: 30px 0; } -/* Estilos para el CTA del final de la pagina*/ +/* Estilos para el CTA del final de la página */ .CTA { position: relative; @@ -149,7 +170,6 @@ body { height: 63px; background-image: url(../../../images/paper-plane.svg); background-position: center; - } .CTA__container { diff --git a/assets/styles/pages/login/login-desktop.css b/assets/styles/pages/login/login-desktop.css index e69de29..0d801f0 100644 --- a/assets/styles/pages/login/login-desktop.css +++ b/assets/styles/pages/login/login-desktop.css @@ -0,0 +1,16 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ diff --git a/assets/styles/pages/login/login.css b/assets/styles/pages/login/login.css index 13cd0ce..09adc22 100644 --- a/assets/styles/pages/login/login.css +++ b/assets/styles/pages/login/login.css @@ -1,3 +1,30 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* +* Orden de los estilos +* 1. Posicionamiento +* 2. Modelo de caja +* 3. Tipografía +* 4. Visuales +* 5. Otros +* Metodología => BEM +*/ + .sign-up__text { max-width: 310px; } @@ -16,4 +43,4 @@ .login-plane { display: none; } -} \ No newline at end of file +} diff --git a/assets/styles/pages/post-article/post-article-desktop.css b/assets/styles/pages/post-article/post-article-desktop.css index e69de29..0d801f0 100644 --- a/assets/styles/pages/post-article/post-article-desktop.css +++ b/assets/styles/pages/post-article/post-article-desktop.css @@ -0,0 +1,16 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ diff --git a/assets/styles/pages/post-article/post-article.css b/assets/styles/pages/post-article/post-article.css index e69de29..79f65d9 100644 --- a/assets/styles/pages/post-article/post-article.css +++ b/assets/styles/pages/post-article/post-article.css @@ -0,0 +1,26 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* +* Orden de los estilos +* 1. Posicionamiento +* 2. Modelo de caja +* 3. Tipografía +* 4. Visuales +* 5. Otros +* Metodología => BEM +*/ diff --git a/assets/styles/pages/profile/profile-desktop.css b/assets/styles/pages/profile/profile-desktop.css index e69de29..0d801f0 100644 --- a/assets/styles/pages/profile/profile-desktop.css +++ b/assets/styles/pages/profile/profile-desktop.css @@ -0,0 +1,16 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ diff --git a/assets/styles/pages/profile/profile.css b/assets/styles/pages/profile/profile.css index e69de29..79f65d9 100644 --- a/assets/styles/pages/profile/profile.css +++ b/assets/styles/pages/profile/profile.css @@ -0,0 +1,26 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* +* Orden de los estilos +* 1. Posicionamiento +* 2. Modelo de caja +* 3. Tipografía +* 4. Visuales +* 5. Otros +* Metodología => BEM +*/ diff --git a/assets/styles/pages/search/search-desktop.css b/assets/styles/pages/search/search-desktop.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/pages/search/search.css b/assets/styles/pages/search/search.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/pages/sent-articles/sent-articles-desktop.css b/assets/styles/pages/sent-articles/sent-articles-desktop.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/pages/sent-articles/sent-articles.css b/assets/styles/pages/sent-articles/sent-articles.css deleted file mode 100644 index e69de29..0000000 diff --git a/assets/styles/pages/signup/signup-desktop.css b/assets/styles/pages/signup/signup-desktop.css index d45d0b3..5839431 100644 --- a/assets/styles/pages/signup/signup-desktop.css +++ b/assets/styles/pages/signup/signup-desktop.css @@ -1,3 +1,20 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + .wrapper { display: flex; max-width: 900px; @@ -62,4 +79,4 @@ .sign-up__container:hover > .sign-up__button { color: white; -} \ No newline at end of file +} diff --git a/assets/styles/pages/signup/signup.css b/assets/styles/pages/signup/signup.css index 11d10b1..8d42e12 100644 --- a/assets/styles/pages/signup/signup.css +++ b/assets/styles/pages/signup/signup.css @@ -1,3 +1,30 @@ +/* +* Este archivo es parte de Nabu. +* +* Nabu es software libre: puedes redistribuirlo y/o modificarlo +* bajo los términos de la Licencia Pública General de GNU Affero publicada por +* la Free Software Foundation, ya sea la versión 3 de la Licencia, o +* (a su elección) cualquier versión posterior. +* +* Nabu se distribuye con la esperanza de que sea de utilidad, +* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de +* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la +* Licencia Pública General de GNU Affero para obtener más detalles. +* +* Debería haber recibido una copia de la Licencia Pública General de GNU Affero +* junto con este programa. De lo contrario, consulte . +*/ + +/* +* Orden de los estilos +* 1. Posicionamiento +* 2. Modelo de caja +* 3. Tipografía +* 4. Visuales +* 5. Otros +* Metodología => BEM +*/ + html { position: relative; min-height: 100%; @@ -22,7 +49,7 @@ body { margin: 30px auto; } -/* Section del header */ +/* Sección del header */ .header__logo-container { display: inline-block; @@ -66,8 +93,7 @@ body { background-size: cover; } - -/* Section del form */ +/* Sección del form */ .form__container { margin: 15px 0; @@ -145,12 +171,13 @@ body { font-size: 1rem; } -/* Oculatar imagen */ +/* Oculta la imagen */ + .form__image-container { display: none; } -/* Cambios a los estilos del footer */ +/* Cambia los estilos del footer */ .footer { position: absolute; @@ -165,4 +192,4 @@ body { .footer .media svg path { fill: var(--color-background); -} \ No newline at end of file +} diff --git a/controllers/adminController.php b/controllers/adminController.php index 3d73b53..9c7b2c1 100644 --- a/controllers/adminController.php +++ b/controllers/adminController.php @@ -1,58 +1,23 @@ . +*/ defined('NABU') || exit(); -require_once 'models/adminModel.php'; - class adminController { - static public function admin() { - if (empty($_GET['section'])) { - self::dashboard(); - } - else { - switch ($_GET['section']) { - case 'authorize': - self::authorize_article(); - break; - case 'delete': - self::delete_article(); - break; - case 'edit': - self::edit_article(); - break; - case 'published': - self::published_articles(); - break; - case 'users': - self::users(); - break; - default: - utils::redirect(NABU_ROUTES['admin']); - } - } - } - static private function dashboard() { - require_once 'views/admin/dashboard.php'; - } - - static private function authorize_article() { - require_once 'views/pages/confirm-password.php'; - } - - static private function delete_article() { - require_once 'views/pages/confirm-password.php'; - } - - static private function edit_article() { - require_once 'views/admin/edit-article.php'; - } - - static private function published_articles() { - require_once 'views/admin/published-articles.php'; - } - - static private function users() { - require_once 'views/admin/users.php'; - } } diff --git a/controllers/articlesController.php b/controllers/articlesController.php index a0d15ac..156eb17 100644 --- a/controllers/articlesController.php +++ b/controllers/articlesController.php @@ -1,9 +1,23 @@ . +*/ defined('NABU') || exit(); -require_once 'models/articlesModel.php'; - class articlesController { static public function all_articles() { require_once 'views/pages/all-articles.php'; @@ -12,16 +26,4 @@ class articlesController { static public function article() { require_once 'views/pages/article.php'; } - - static public function category() { - require_once 'views/pages/category.php'; - } - - static public function post_article() { - require_once 'views/pages/post-article.php'; - } - - static public function sent_articles() { - require_once 'views/pages/sent-articles.php'; - } } diff --git a/controllers/authenticationController.php b/controllers/authenticationController.php new file mode 100644 index 0000000..60cb933 --- /dev/null +++ b/controllers/authenticationController.php @@ -0,0 +1,63 @@ +. +*/ + +defined('NABU') || exit(); + +require_once 'models/authenticationModel.php'; + +class authenticationController { + public static function authentication() { + if (empty($_GET['user']) || empty($_GET['key'])) + utils::redirect(NABU_ROUTES['home']); + + $authenticationModel = new authenticationModel(); + + // Busca los datos de autenticación de e-mail de un usuario. + $user = $authenticationModel -> get($_GET['user']); + + if (empty($user['hash']) || empty($user['expiration']) || !empty($user['activated'])) + utils::redirect(NABU_ROUTES['home']); + + // Reconstruye el hash con la llave de autenticación de la URL. + $hash = hash_hmac('sha256', $user['email'], $_GET['key']); + + if (!hash_equals($user['hash'], $hash)) + utils::redirect(NABU_ROUTES['home']); + + // Valida si el hash de autenticación de e-mail está expirado. + if (time() > $user['expiration']) { + unset($authenticationModel); + + require_once 'models/usersModel.php'; + + $usersModel = new usersModel(); + $usersModel -> delete($user['id']); + + messages::add('Tu cuenta ha expirado, por favor vuelve a registrarte'); + + utils::redirect(NABU_ROUTES['signup']); + } + + // Activa la cuenta del usuario y crea su perfil. + $authenticationModel -> activate($user['id']); + + messages::add('Tu dirección de correo electrónico se ha verificado correctamente'); + + utils::redirect(NABU_ROUTES['login']); + } +} diff --git a/controllers/blogController.php b/controllers/blogController.php index 6dc37f3..6638bdd 100644 --- a/controllers/blogController.php +++ b/controllers/blogController.php @@ -1,31 +1,50 @@ . +*/ defined('NABU') || exit(); -require_once 'models/blogModel.php'; - class blogController { - // Renderiza la página de errores. - static public function errors() { - /* - if (empty($_SESSION['errors'])) { - utils::redirect(NABU_ROUTES['home']); - } - */ + // Renderiza la página principal del sitio web. + static public function home() { + require_once 'models/blogModel.php'; - // Define el código HTTP de respuesta. - http_response_code($_SESSION['errors']['code']); + $blogModel = new blogModel(); - $error = $_SESSION['errors']['message']; + $articles = array(); + $recent_articles = array(); - unset($_SESSION['errors']); + require_once 'views/pages/home.php'; + } - messages::get(); + // Renderiza la página de errores. + static public function errors() { + if (empty($_SESSION['errors'])) + utils::redirect(NABU_ROUTES['home']); - require_once 'views/pages/errors.php'; - } + // Define el código HTTP de respuesta. + http_response_code($_SESSION['errors']['code']); - static public function home() { - require_once 'views/pages/home.php'; - } + $error = $_SESSION['errors']['message']; + + unset($_SESSION['errors']); + + messages::get(); + + require_once 'views/pages/errors.php'; + } } diff --git a/controllers/communityController.php b/controllers/communityController.php deleted file mode 100644 index 498adce..0000000 --- a/controllers/communityController.php +++ /dev/null @@ -1,19 +0,0 @@ -. +*/ defined('NABU') || exit(); -require_once 'models/profilesModel.php'; - class profilesController { - static public function profile() { - if (empty($_GET['page'])) { - self::view(); - } - else { - switch ($_GET['page']) { - case 'delete': - self::delete_profile(); - break; - case 'edit': - self::edit_profile(); - break; - default: - utils::redirect(NABU_ROUTES['home']); - } - } - } - static private function view() { - require_once 'views/pages/profile.php'; - } - - static private function delete_profile() { - require_once 'views/pages/confirm-password.php'; - } - - static private function edit_profile() { - require_once 'views/pages/edit-profile.php'; - } } diff --git a/controllers/searchController.php b/controllers/searchController.php deleted file mode 100644 index 76863bb..0000000 --- a/controllers/searchController.php +++ /dev/null @@ -1,11 +0,0 @@ -. +*/ defined('NABU') || exit(); require_once 'models/usersModel.php'; -// Registra, define credenciales de acceso y cierra sesiones de usuario. class usersController { - // Renderiza la página de registro de usuarios - // y registra un usuario con el método POST. - static public function signup() { - // Renderiza la página de registro de usuarios. - if (empty($_POST['signup-submit'])) { - // Redirecciona a home si existe una sesión de usuario. - utils::session_exists(NABU_ROUTES['home']); + // Renderiza la página de registro de usuarios + // y registra usuarios con el método POST. + static public function signup() { + if (empty($_POST['signup-form'])) { + // Redirecciona a "home" si existe una sesión de usuario. + utils::session_exists(NABU_ROUTES['home']); - $token = csrf::generate(); - $messages = messages::get(); + $token = csrf::generate(); + $messages = messages::get(); - require_once 'views/pages/signup.php'; + require_once 'views/pages/signup.php'; - exit(); - } - - csrf::validate($_POST['csrf']); - - $validations = new validations(NABU_ROUTES['signup']); - - // Valida el formulario de registro de usuarios. - $data = $validations -> validate_form($_POST, array( - array('name', 'exists' => true, 'trim_all' => true, 'min_lenght' => 5, 'max_lenght' => 255), - array('username', 'exists' => true, 'trim' => true, 'min_lenght' => 1, 'max_lenght' => 255, 'not_spaces' => true), - array('email', 'exists' => true, 'is_email' => true, 'trim' => true, 'min_lenght' => 5, 'max_lenght' => 255, 'not_spaces' => true), - array('password', 'exists' => true, 'min_lenght' => 6, 'max_lenght' => 255, 'not_spaces' => true, 'equal' => $_POST['confirm-password']) - )); - - // Formatea en minúsculas la dirección de e-mail. - $data['email'] = strtolower($data['email']); - - $usersModel = new usersModel(); - - $users = $usersModel -> find($data['username'], $data['email']); - - $msg = 'Existe una cuenta registrada con el mismo apodo o dirección de correo electrónico, por favor inténtalo de nuevo'; - $route = NABU_ROUTES['signup']; - - // Valida si la cuenta es única y elimina cuentas con hash expirado. - foreach ($users as $user) { - // Valida si es una cuenta inactiva. - if (empty($user['activated']) && !empty($user['hash_expiration'])) { - // Valida si es una cuenta con hash expirado. - if (time() > $user['hash_expiration']) { - $usersModel -> delete($user['id']); - } - else { - messages::add($msg); - messages::exist($route); - } - } - else { - messages::add($msg); - messages::exist($route); - } - } - - // Genera una llave aleatoria de verificación de e-mail. - $key = bin2hex(random_bytes(32)); - - // Genera un hash de verificación de e-mail. - $hash = hash_hmac('sha256', $data['email'], $key); - - require_once 'libs/emails.php'; - - $emails = new emails(); - $emails -> prepare($data['email'], $data['name']); - - // Genera una URL de verificación de e-mail. - $url = NABU_ROUTES['verifications'] . '&user=' . urlencode($data['username']) . '&key=' . $key; - - $username = utils::escape($data['username']); - - $body = require_once 'views/emails/verifications.php'; - - // Envía primero la URL de verificación de e-mail antes de registrar un usuario. - if (!$emails -> send('¡Ya casi está listo!', $body)) { - messages::errors('tuvimos un problema al enviar tu mensaje de verificación de e-mail', 500); - } - - // Cifra la contraseña. - $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT, array('cost' => 12)); - - // Establece la fecha de registro. - $data['creation_date'] = utils::current_date(); - - // Registra el nuevo usuario. - $usersModel -> save($data); - - // Consulta el id del nuevo usuario. - $user = $usersModel -> get('username', $data['username']); - - unset($usersModel); - - // Establece la fecha de expiración del hash - // de verificación de e-mail (1 hora). - $verification = array( - 'id' => $user['id'], - 'hash' => $hash, - 'expiration' => time() + 60 * 60 - ); - - require_once 'models/verificationsModel.php'; - - $verificationsModel = new verificationsModel(); - - // Registra el hash de verificación de e-mail. - $verificationsModel -> save($verification); - - messages::add('Su cuenta se ha registrado correctamente, por favor verifica tu dirección de correo electrónico'); - - utils::redirect(NABU_ROUTES['signup']); + exit(); } - // Renderiza la página de inicio de sesión y asigna credeciales - // de acceso a los usuarios con el método POST. - static public function login() { - // Renderiza la página de inicio de sesión. - if (empty($_POST['login-submit'])) { - // Redirecciona a home si existe una sesión de usuario. - utils::session_exists(NABU_ROUTES['home']); + csrf::validate($_POST['csrf']); - $token = csrf::generate(); - $messages = messages::get(); + $validations = new validations(NABU_ROUTES['signup']); - require_once 'views/pages/login.php'; + // Valida el formulario de registro de usuarios. + $data = $validations -> validate($_POST, array( + array('field' => 'name', 'trim_all' => true, 'min_length' => 5, 'max_length' => 255), + array('field' => 'username', 'trim' => true, 'min_length' => 1, 'max_length' => 255, 'not_spaces' => true), + array('field' => 'email', 'trim' => true, 'min_length' => 5, 'max_length' => 255, 'not_spaces' => true, 'type' => 'email'), + array('field' => 'password', 'min_length' => 6, 'max_length' => 255, 'not_spaces' => true, 'equal' => $_POST['confirm-password']), + )); - exit(); - } + // Formatea en minúsculas la dirección de e-mail. + $data['email'] = strtolower($data['email']); - csrf::validate($_POST['csrf']); + $usersModel = new usersModel(); - $validations = new validations(NABU_ROUTES['login']); + $users = $usersModel -> find($data['username'], $data['email']); - // Valida el formulario de inicio de sesión. - $data = $validations -> validate_form($_POST, array( - array('identity', 'exists' => true, 'trim' => true, 'min_lenght' => 1, 'max_lenght' => 255, 'not_spaces' => true), - array('password', 'exists' => true, 'min_lenght' => 6, 'max_lenght' => 255, 'not_spaces' => true) - )); + $msg = 'Existe un cuenta registrada con el mismo apodo o dirección de correo electrónico, por favor inténtelo de nuevo'; + $route = NABU_ROUTES['signup']; - $column = 'username'; - - // Selecciona el tipo de identificación (por apodo o e-mail). - if (filter_var($data['identity'], FILTER_VALIDATE_EMAIL)) { - $column = 'email'; - $data['identity'] = strtolower($data['identity']); - } - - $usersModel = new usersModel(); - - // Busca el usuario de acceso. - $user = $usersModel -> get($column, $data['identity']); - - $msg = 'La identificación de sesión o la contraseña es incorrecta'; - $route = NABU_ROUTES['login']; - - // Valida si existe el usuario. - if (empty($user)) { - messages::add($msg); - messages::exist($route); - } - - // Valida la contraseña del usuario. - if (password_verify($data['password'], $user['password'])) { - // Valida si el usuario tiene fecha de expiración del hash de verificación de e-mail. - if (empty($user['hash_expiration'])) { - // Define las credenciales de acceso si es una cuenta activa. - if (empty($user['activated'])) { - messages::add($msg); - } - else { - $_SESSION['user'] = array( - 'id' => $user['id'], - 'username' => $user['username'], - 'role' => $user['role'] - ); - } - } - else { - // Valida si es una cuenta inactiva. - if (empty($user['activated'])) { - // Valida si es una cuenta con hash expirado. - if (time() > $user['hash_expiration']) { - $userModel -> delete($user['id']); - messages::add('Tu cuenta a expirado, por favor vuelva a registrarse'); - } - else { - messages::add('Por favor confirma tu dirección de correo electrónico'); - } - } - else { - messages::add($msg); - } - } - } + // Valida si la cuenta es única y elimina cuentas con autenticación expirada. + foreach ($users as $user) { + // Valida si es una cuenta inactiva. + if (empty($user['activated']) && !empty($user['expiration'])) { + // Valida si la autenticación está expirada. + if (time() > $user['expiration']) + $usersModel -> delete($user['id']); else { - messages::add($msg); + messages::add($msg); + messages::check($route); } - - messages::exist($route); - - // Redirecciona al panel de administración en base al rol. - if ($user['role'] == 'admin') { - utils::redirect(NABU_ROUTES['admin']); - } - - // Redirecciona al perfil del usuario. - utils::redirect(NABU_ROUTES['profile'] . '&user=' . urlencode($user['username'])); + } + else { + messages::add($msg); + messages::check($route); + } } - // Cierra una sesión de usuario. - static public function logout() { - session_unset(); - session_destroy(); - utils::redirect(NABU_ROUTES['home']); + // Genera una llave aleatoria de autenticación de e-mail. + $key = bin2hex(random_bytes(32)); + + // Genera un hash de autenticación de e-mail. + $hash = hash_hmac('sha256', $data['email'], $key); + + require_once 'libs/emails.php'; + + $emails = new emails(); + $emails -> prepare($data['email'], $data['name']); + + // Genera una URL de autenticación de e-mail. + $url = NABU_ROUTES['authentication'] . '&user=' . urlencode($data['username']) . '&key=' . $key; + + $username = utils::escape($data['username']); + + $body = require_once 'views/emails/authentication.php'; + + // Envía primero la URL de autenticación de e-mail antes de registrar al usuario. + if (!$emails -> send('¡Ya casi está listo!', $body)) + messages::errors('Tuvimos un problema al enviar tu mensaje de autenticación de e-mail', 500); + + // Cifra la contraseña. + $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT, array('cost' => 12)); + + $data['registration_date'] = utils::current_date(); + + // Registra el nuevo usuario. + $usersModel -> save($data); + + // Consulta el id del nuevo usuario. + $user = $usersModel -> get('username', $data['username']); + + unset($usersModel); + + // Define la fecha de expiración de la autenticación de e-mail. + $authentication = array( + 'id' => $user['id'], + 'hash' => $hash, + 'expiration' => time() + 60 * 60 + ); + + require_once 'models/authenticationModel.php'; + + $authenticationModel = new authenticationModel(); + + // Registra el hash de autenticación de e-mail. + $authenticationModel -> save($authentication); + + messages::add('Su cuenta se ha registrado correctamente, por favor verifica tu dirección de correo electrónico'); + + utils::redirect(NABU_ROUTES['signup']); + } + + // Renderiza la página de inicio de sesión + // y asigna credenciales de acceso con el método POST. + static public function login() { + if (empty($_POST['login-form'])) { + utils::session_exists(NABU_ROUTES['home']); + + $token = csrf::generate(); + $messages = messages::get(); + + require_once 'views/pages/login.php'; + + exit(); } + + csrf::validate($_POST['csrf']); + + $validations = new validations(NABU_ROUTES['login']); + + // Valida el formulario de inicio de sesión. + $data = $validations -> validate($_POST, array( + array('field' => 'identity', 'trim' => true, 'min_length' => 1, 'max_length' => 255, 'not_spaces' => true), + array('field' => 'password', 'min_length' => 6, 'max_length' => 255, 'not_spaces' => true), + )); + + $column = 'username'; + + // Selecciona el tipo de identificación (por apodo o e-mail). + if (filter_var($data['identity'], FILTER_VALIDATE_EMAIL)) { + $column = 'email'; + $data['identity'] = strtolower($data['identity']); + } + + $usersModel = new usersModel(); + + // Busca el usuario de acceso. + $user = $usersModel -> get($column, $data['identity']); + + $msg = 'La identificación de sesión o la contraseña son incorrectas'; + $route = NABU_ROUTES['login']; + + // Valida si existe el usuario. + if (empty($user)) { + messages::add($msg); + utils::redirect($route); + } + + // Valida la contraseña del usuario. + if (!password_verify($data['password'], $user['password'])) { + messages::add($msg); + utils::redirect($route); + } + + // Valida si el usuario tiene fecha de expiración del hash de autenticación de e-mail. + if (empty($user['expiration'])) { + // Define las credenciales de acceso si es una cuenta activa. + if (empty($user['activated'])) + messages::add($msg); + else + $_SESSION['user'] = array( + 'id' => $user['id'], + 'username' => $user['username'], + 'role' => $user['role'] + ); + } + else { + // Valida si es una cuenta inactiva. + if (empty($user['activated'])) { + // Valida si es una cuenta con hash expirado. + if (time() > $user['expiration']) { + $usersModel -> delete($user['id']); + messages::add('Tu cuenta ha expirado, por favor vuelve a registrarte'); + } + else + messages::add('Por favor confirma tu dirección de correo electrónico'); + } + else + messages:add($msg); + } + + messages::check($route); + + // Redireccion al panel de administración en base al role. + if ($user['role'] == 'admin') + utils::redirect(NABU_ROUTES['admin']); + + // Redirecciona al perfil del usuario. + utils::redirect(NABU_ROUTES['profile'] . '&user=' . urlencode($user['username'])); + } + + // Cierra una sesión de usuario. + static public function logout() { + session_unset(); + session_destroy(); + utils::redirect(NABU_ROUTES['home']); + } } diff --git a/controllers/verificationsController.php b/controllers/verificationsController.php deleted file mode 100644 index 1698728..0000000 --- a/controllers/verificationsController.php +++ /dev/null @@ -1,55 +0,0 @@ - get($_GET['user']); - - if (empty($user['hash']) || empty($user['hash_expiration']) || - !empty($user['activated'])) { - utils::redirect(NABU_ROUTES['home']); - } - - // Reconstruye el hash con la llave de verificación de la URL. - $hash = hash_hmac('sha256', $user['email'], $_GET['key']); - - // Valida la autentificación del hash. - if (!hash_equals($user['hash'], $hash)) { - utils::redirect(NABU_ROUTES['home']); - } - - // Valida si el hash de verificación de e-mail está expirado - // y elimina el usuario. - if (time() > $user['hash_expiration']) { - unset($verificationsModel); - - require_once 'models/usersModel.php'; - - $usersModel = new usersModel(); - $usersModel -> delete($user['id']); - - messages::add('Tu cuenta ha expirado, por favor vuelva a registrarse'); - - utils::redirect(NABU_ROUTES['signup']); - } - - // Activa la cuenta del usuario y crea su perfil. - $verificationsModel -> activate($user['id']); - - messages::add('Tu dirección de correo electrónico se ha verificado correctamente'); - - utils::redirect(NABU_ROUTES['login']); - } -} diff --git a/core/config.php b/core/config.php index 1b62691..40f6b63 100644 --- a/core/config.php +++ b/core/config.php @@ -1,4 +1,20 @@ . +*/ defined('NABU') || exit(); @@ -8,13 +24,13 @@ define('NABU_DIRECTORY', array( 'avatars' => NABU_URL . '/storage/avatars', 'backgrounds' => NABU_URL . '/storage/backgrounds', 'covers' => NABU_URL . '/storage/covers', - 'database' => './database-config.json', - 'email' => './email-config.json', + 'db' => 'config/db.json', + 'email' => 'config/email.json', 'icons' => NABU_URL . '/assets/icons', 'images' => NABU_URL . '/assets/images', - 'storage-avatars' => './storage/avatars', - 'storage-backgrounds' => './storage/backgrounds', - 'storage-covers' => './storage/covers', + 'storage-avatars' => 'storage/avatars', + 'storage-backgrounds' => 'storage/backgrounds', + 'storage-covers' => 'storage/covers', 'scripts' => NABU_URL . '/assets/scripts', 'styles' => NABU_URL . '/assets/styles', )); @@ -33,21 +49,21 @@ define('NABU_DEFAULT', array( date_default_timezone_set('America/Mexico_City'); /* -// Nivel de reporte de errores (todos los errores). +// Establece el nivel de reporte de errores "todos los errores". ini_set('error_reporting', E_ALL); -// No muestra en pantalla todos los errores. +// Desactiva en pantalla todos los errores. ini_set('display_errors', 'Off'); -// No muestra en pantalla todos los errores de inicio de ejecución de PHP. +// Desactiva en pantalla todos los errores de inicio de ejecución de PHP. ini_set('display_startup_errors', false); -// No registra mensajes repetidos. +// Desactiva el registro de mensajes repetidos sobre la última línea. ini_set('ignore_repeated_errros', true); -// Selecciona el manejador de errores de PHP 'error_log'. +// Habilita el registro de errores desde un archivo externo. ini_set('log_errors', true); -// Define la ruta del archivo de registro de errores para 'error_log'. +// Define la ruta del archivo de registro de errores. ini_set('error_log', 'logs/errors.log'); */ diff --git a/core/messages.php b/core/messages.php new file mode 100644 index 0000000..a9f010e --- /dev/null +++ b/core/messages.php @@ -0,0 +1,57 @@ +. +*/ + +defined('NABU') || exit(); + +// Administra mensajes sobre advertencias, avisos y errores. +class messages { + // Agrega nuevos mensajes. + static public function add(string $message) { + if (empty($_SESSION['messages'])) + $_SESSION['messages'] = array(); + + array_push($_SESSION['messages'], $message); + } + + // @return un array de mensajes. + static public function get() { + if (empty($_SESSION['messages'])) + return array(); + + $messages = $_SESSION['messages']; + + unset($_SESSION['messages']); + + return $messages; + } + + // Muestra los mensajes almacenados en una página. + static public function check(string $route) { + if (isset($_SESSION['messages'])) + utils::redirect($route); + } + + // Define un mensaje de error y redirecciona a la página de errores. + static public function errors(string $message, int $code) { + $_SESSION['errors'] = array( + 'message' => $message, + 'code' => $code + ); + utils::redirect(NABU_ROUTES['errors']); + } +} diff --git a/core/requests.php b/core/requests.php index 7a17f87..47364bc 100644 --- a/core/requests.php +++ b/core/requests.php @@ -1,41 +1,53 @@ . +*/ defined('NABU') || exit(); session_start(); require_once 'core/config.php'; -require_once 'libs/utils.php'; -require_once 'libs/messages.php'; +require_once 'core/utils.php'; +require_once 'core/messages.php'; +require_once 'db/connection.php'; require_once 'libs/csrf.php'; require_once 'libs/validations.php'; -require_once 'database/connection.php'; $components = require 'core/routes.php'; $routes = array(); // Genera la URL completa de todas las rutas. -foreach ($components as $alias => $component) { - $routes[$alias] = NABU_URL . '/index.php?view=' . $component['route']; -} +foreach ($components as $alias => $component) + $routes[$alias] = NABU_URL . '/index.php?view=' . $component['route']; define('NABU_ROUTES', $routes); // Selecciona el controlador y la vista de una ruta solicitada. -if (!empty($_GET['view'])) { - foreach ($components as $alias => $component) { - if ($component['route'] == $_GET['view']) { - $controller = $component['controller']; - $view = $component['view']; - break; - } +if (isset($_GET['view'])) + foreach ($components as $alias => $component) + if ($component['route'] == $_GET['view']) { + $controller = $component['controller']; + $view = $component['view']; + break; } -} -if (empty($controller) || empty($view)) { - utils::redirect(NABU_ROUTES['home']); -} +if (empty($controller) || empty($view)) + utils::redirect(NABU_ROUTES['home']); unset($components, $routes); diff --git a/core/routes.php b/core/routes.php index ef6ef0a..8d69bb1 100644 --- a/core/routes.php +++ b/core/routes.php @@ -1,30 +1,37 @@ . +*/ defined('NABU') || exit(); return array( - 'admin' => array('route' => 'admin', 'controller' => 'adminController', 'view' => 'admin'), - 'all-articles' => array('route' => 'all-articles', 'controller' => 'articlesController', 'view' => 'all_articles'), - 'article' => array('route' => 'article', 'controller' => 'articlesController', 'view' => 'article'), - 'authorize-article' => array('route' => 'admin§ion=authorize', 'controller' => 'adminController', 'view' => 'admin'), - 'category' => array('route' => 'category', 'controller' => 'articlesController', 'view' => 'category'), - 'comment' => array('route' => 'comment', 'controller' => 'communityController', 'view' => 'comment'), - 'delete-profile' => array('route' => 'profile&page=delete', 'controller' => 'profilesController', 'view' => 'profile'), - 'delete-article' => array('route' => 'admin§ion=delete', 'controller' => 'adminController', 'view' => 'delete_article'), - 'edit-article' => array('route' => 'admin§ion=edit', 'controller' => 'adminController', 'view' => 'edit_article'), - 'edit-profile' => array('route' => 'profile&page=edit', 'controller' => 'profilesController', 'view' => 'edit_profile'), - 'errors' => array('route' => 'errors', 'controller' => 'blogController', 'view' => 'errors'), - 'home' => array('route' => 'home', 'controller' => 'blogController', 'view' => 'home'), - 'favorites' => array('route' => 'favorites', 'controller' => 'communityController', 'view' => 'favorites'), - 'like' => array('route' => 'like', 'controller' => 'communityController', 'view' => 'like'), - 'login' => array('route' => 'login', 'controller' => 'usersController', 'view' => 'login'), - 'logout' => array('route' => 'logout', 'controller' => 'usersController', 'view' => 'logout'), - 'post-article' => array('route' => 'post-article', 'controller' => 'articlesController', 'view' => 'post_article'), - 'profile' => array('route' => 'profile', 'controller' => 'profilesController', 'view' => 'profile'), - 'published-articles' => array('route' => 'admin§ion=published', 'controller' => 'adminController', 'view' => 'admin'), - 'search' => array('route' => 'search', 'controller' => 'searchController', 'view' => 'search'), - 'sent-articles' => array('route' => 'sent-articles', 'controller' => 'articlesController', 'view' => 'sent_articles'), - 'signup' => array('route' => 'signup', 'controller' => 'usersController', 'view' => 'signup'), - 'users' => array('route' => 'admin§ion=users', 'controller' => 'adminController', 'view' => 'admin'), - 'verifications' => array('route' => 'verifications', 'controller' => 'verificationsController', 'view' => 'verifications'), + 'authentication' => array('route' => 'authentication', 'controller' => 'authenticationController', 'view' => 'authentication'), + 'all-articles' => array('route' => 'all-articles', 'controller' => 'articlesController', 'view' => 'all_articles'), + 'article' => array('route' => 'article', 'controller' => 'articlesController', 'view' => 'article'), + 'delete-profile' => array('route' => 'delete-profile', 'controller' => 'profilesController', 'view' => 'delete'), + 'edit-profile' => array('route' => 'edit-profile', 'controller' => 'profilesController', 'view' => 'edit'), + 'errors' => array('route' => 'errors', 'controller' => 'blogController', 'view' => 'errors'), + 'favorites' => array('route' => 'favorites', 'controller' => 'profilesController', 'view' => 'favorites'), + 'home' => array('route' => 'home', 'controller' => 'blogController', 'view' => 'home'), + 'login' => array('route' => 'login', 'controller' => 'usersController', 'view' => 'login'), + 'logout' => array('route' => 'logout', 'controller' => 'usersController', 'view' => 'logout'), + 'post-article' => array('route' => 'post-article', 'controller' => 'articlesController', 'view' => 'post_article'), + 'profile' => array('route' => 'profile', 'controller' => 'profilesController', 'view' => 'profile'), + 'search' => array('route' => 'search', 'controller' => 'articlesController', 'view' => 'search'), + 'sent-articles' => array('route' => 'sent-articles', 'controller' => 'profilesController', 'view' => 'sent_articles'), + 'signup' => array('route' => 'signup', 'controller' => 'usersController', 'view' => 'signup'), ); diff --git a/core/utils.php b/core/utils.php new file mode 100644 index 0000000..f601ec5 --- /dev/null +++ b/core/utils.php @@ -0,0 +1,44 @@ +. +*/ + +defined('NABU') || exit(); + +// Colección de herramientas propias para Nabu. +class utils { + // Redirecciona a una ruta y termina la ejecución de todos los scripts de PHP. + static public function redirect(string $route) { + header('Location: ' . $route); + exit(); + } + + // Redirecciona a una ruta si existe una sesión de usuario. + static public function session_exists(string $route) { + if (isset($_SESSION['user'])) + self::redirect($route); + } + + // @return un string escapado para HTML. + static public function escape(string $str) { + return htmlentities($str, ENT_COMPAT | ENT_HTML5, 'UTF-8'); + } + + // @return la fecha actual. + static public function current_date() { + return date('Y-m-d H:i:s'); + } +} diff --git a/database/connection.php b/database/connection.php deleted file mode 100644 index b511e62..0000000 --- a/database/connection.php +++ /dev/null @@ -1,83 +0,0 @@ - PDO::CASE_NATURAL, - // Define el manejador de errores de 'PDO' por excepciones, utiliza el objeto 'PDOException'. - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - // Deshabilita las consultas preparadas de 'PDO' y utiliza el sistema nativo del SGBD. - PDO::ATTR_EMULATE_PREPARES => false, - // Define por defecto los resultados de las consultas como arrays asociativos. - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC - ); - - // Origen de la base de datos. - $dsn = $config['dbms'] . ':host=' . $config['host'] . ';dbname=' . $config['database']; - - try { - // Configuración y conexión de la base de datos. - $this -> pdo = new PDO($dsn, $config['user'], $config['password'], $options); - - // Define la codificación de caracteres para el cliente del SGBD y los resultados de las consultas. - $this -> pdo -> exec('SET CHARSET ' . $config['charset']); - } - catch (PDOException $e) { - exit($e -> getMessage()); - } - } - - protected function errors(string $exception, string $error) { - // error_log($exception); - - messages::errors('¡Lo sentimos mucho! 😞, ' . $error . ', por favor inténtalo más tarde', 500); - } - - // @return el alias de un id de role. - protected function role_format($id) { - $role = 'user'; - - if ($id == 1) { - $role = 'admin'; - } - - if ($id == 2) { - $role = 'moderator'; - } - - return $role; - } - - // Finaliza la conexión con la base de datos. - public function __destruct() { - $this -> pdo = null; - } -} diff --git a/db/connection.php b/db/connection.php new file mode 100644 index 0000000..65667bd --- /dev/null +++ b/db/connection.php @@ -0,0 +1,88 @@ +. +*/ + +defined('NABU') || exit(); + +// Realiza la conexión con la base de datos. +class dbconnection { + protected $pdo; + + public function __construct() { + if (!file_exists(NABU_DIRECTORY['db'])) + messages::errors('No se encontró el archivo de configuración de la base de datos ' . NABU_DIRECTORY['db'], 500); + + // Lee el archivo de configuración de la base de datos. + $config = file_get_contents(NABU_DIRECTORY['db']); + $config = json_decode($config, true); + + $params = array('dbms', 'host', 'database', 'user', 'password', 'charset'); + + foreach ($params as $param) + if (empty($config[$param])) + messages::errors('Define el parámetro "' . $param . '" en el archivo de configuración de la base de datos', 500); + + // Parámetros de configuración para la conexión de la base de datos. + $options = array( + // Mantiene el nombre de las columnas como en la base de datos. + PDO::ATTR_CASE => PDO::CASE_NATURAL, + // Define los errores de "PDO" por excepciones, utiliza el objeto "PDOException". + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + // Desactiva las consultas preparadas por PDO y utiliza el sistema nativo del SGBD. + PDO::ATTR_EMULATE_PREPARES => false, + // Por defecto, retorna los resultados de las consultas como arrays asociativos. + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC + ); + + // Origen de la base de datos. + $dsn = $config['dbms'] . ':host=' . $config['host'] . ';dbname=' . $config['database']; + + try { + // Realiza la conexión con la base de datos. + $this -> pdo = new PDO($dsn, $config['user'], $config['password'], $options); + + // Establece la codificación de caracteres para el cliente del SGBD y los resultados de las consultas. + $this -> pdo -> exec('SET CHARSET ' . $config['charset']); + } + catch (PDOException $e) { + messages::errors($e -> getMessage(), 500); + } + } + + protected function errors(string $exception, string $error) { + error_log($exception); + + messages::errors('¡Lo sentimos mucho! 😞, ' . $error . ', por favor inténtelo más tarde', 500); + } + + // @return el alias de un id de role. + protected function role(int $id) { + $role = 'user'; + + if ($id == 1) + $role = 'admin'; + if ($id == 2) + $role = 'moderator'; + + return $role; + } + + // Finaliza la conexión con la base de datos. + public function __destruct() { + $this -> pdo = null; + } +} diff --git a/database/db.sql b/db/db.sql similarity index 68% rename from database/db.sql rename to db/db.sql index 3b6fa86..d33aa9b 100644 --- a/database/db.sql +++ b/db/db.sql @@ -16,26 +16,26 @@ CREATE TABLE IF NOT EXISTS `roles` ( ); CREATE TABLE IF NOT EXISTS `users` ( - `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, - `role_id` TINYINT UNSIGNED NOT NULL DEFAULT 3, - `name` VARCHAR(255) NOT NULL, - `username` VARCHAR(255) NOT NULL, - `email` VARCHAR(255), - `password` VARCHAR(255) NOT NULL, - `activated` TINYINT(1) NOT NULL DEFAULT FALSE, - `creation_date` DATETIME(0) NOT NULL, - CONSTRAINT users_id_pk PRIMARY KEY(id), - CONSTRAINT users_username_uk UNIQUE(username), - CONSTRAINT users_email_uk UNIQUE(email), - CONSTRAINT users_role_id_fk FOREIGN KEY(role_id) REFERENCES roles(id) ON UPDATE RESTRICT ON DELETE RESTRICT + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `role_id` TINYINT UNSIGNED NOT NULL DEFAULT 3, + `name` VARCHAR(255) NOT NULL, + `username` VARCHAR(255) NOT NULL, + `email` VARCHAR(255), + `password` VARCHAR(255) NOT NULL, + `activated` TINYINT(1) NOT NULL DEFAULT FALSE, + `registration_date` DATETIME(0) NOT NULL, + CONSTRAINT users_id_pk PRIMARY KEY(id), + CONSTRAINT users_username_uk UNIQUE(username), + CONSTRAINT users_email_uk UNIQUE(email), + CONSTRAINT users_role_id_fk FOREIGN KEY(role_id) REFERENCES roles(id) ON UPDATE RESTRICT ON DELETE RESTRICT ); -CREATE TABLE IF NOT EXISTS `verifications` ( +CREATE TABLE IF NOT EXISTS `authentications` ( `id` INT UNSIGNED NOT NULL, `hash` VARCHAR(255) NOT NULL, `expiration` INT UNSIGNED NOT NULL, - CONSTRAINT verifications_id_pk PRIMARY KEY(id), - CONSTRAINT verifications_id_fk FOREIGN KEY(id) REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE + CONSTRAINT authentications_id_pk PRIMARY KEY(id), + CONSTRAINT authentications_id_fk FOREIGN KEY(id) REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS `profiles` ( @@ -66,21 +66,6 @@ CREATE TABLE IF NOT EXISTS `articles` ( CONSTRAINT articles_cover_uk UNIQUE(cover) ); -CREATE TABLE IF NOT EXISTS `categories` ( - `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, - `name` VARCHAR(50) NOT NULL, - CONSTRAINT categories_id_pk PRIMARY KEY(id), - CONSTRAINT categories_name_uk UNIQUE(name) -); - -CREATE TABLE IF NOT EXISTS `categories_article` ( - `article_id` INT UNSIGNED NOT NULL, - `categorie_id` INT UNSIGNED NOT NULL, - CONSTRAINT categories_article_pk PRIMARY KEY(article_id, categorie_id), - CONSTRAINT categories_article_article_id_fk FOREIGN KEY(article_id) REFERENCES articles(id) ON UPDATE RESTRICT ON DELETE RESTRICT, - CONSTRAINT categories_categorie_id_fk FOREIGN KEY(categorie_id) REFERENCES categories(id) ON UPDATE RESTRICT ON DELETE RESTRICT -); - CREATE TABLE IF NOT EXISTS `authorizations` ( `article_id` INT UNSIGNED NOT NULL, `user_id` INT UNSIGNED NOT NULL, diff --git a/index.php b/index.php index e1a8da6..b890bf0 100644 --- a/index.php +++ b/index.php @@ -1,4 +1,20 @@ . +*/ define('NABU', true); diff --git a/libs/csrf.php b/libs/csrf.php index 0e2c626..8d94057 100644 --- a/libs/csrf.php +++ b/libs/csrf.php @@ -1,50 +1,63 @@ . +*/ defined('NABU') || exit(); -// Valida formularios contra ataques CSRF. +// Valida formularios contra ataques CSRF, class csrf { - private const size = 32; - private const hash = 'sha256'; - private const secret = 'rWO!KJ9&*Wk@'; - private const expiration = 4; // Horas. + private const size = 32; + private const hash = 'sha256'; + private const secret = 'YyL$62x*qXtl'; + private const expiration = 4; // Horas. - // Elimina la variable de sesión. - private static function destroy() { - unset($_SESSION['csrf']); - } + // Genera un token en base a bytes aleatorios. + public static function generate() { + $key = bin2hex(random_bytes(self::size)); - private static function errors(string $error) { - self::destroy(); - messages::errors($error, 400); - } + $_SESSION['csrf'] = array( + 'token' => hash_hmac(self::hash, self::secret, $key), + 'expiration' => time() + (60 * 60 * self::expiration) + ); - // Genera un token en base a bytes aleatorios. - public static function generate() { - $key = bin2hex(random_bytes(self::size)); + return $_SESSION['csrf']['token']; + } - $_SESSION['csrf'] = array( - 'token' => hash_hmac(self::hash, self::secret, $key), - 'expiration' => time() + (60 * 60 * self::expiration) - ); + // Elimina la variable de sesión. + private static function destroy() { + unset($_SESSION['csrf']); + } - return $_SESSION['csrf']['token']; - } + private static function errors(string $error) { + self::destroy(); + messages::errors($error, 400); + } - // Valida si un token no está expirado y es igual al generado. - public static function validate($token2) { - if (empty($_SESSION['csrf']) || empty($token2)) { - self::errors('El token del formulario es inválido'); - } + // Valida si un token no está expirado y es igual al generado. + public static function validate($token2) { + if (empty($_SESSION['csrf']) || empty($token2)) + self::errors('El token del formulario no es válido'); - if (time() > $_SESSION['csrf']['expiration']) { - self::errors('El formulario ha expirado, por favor recargue la página web'); - } + if (time() > $_SESSION['csrf']['expiration']) + self::errors('El formulario ha expirado'); - if (!hash_equals($_SESSION['csrf']['token'], $token2)) { - self::errors('Los tokens del formulario no coinciden'); - } + if (!hash_equals($_SESSION['csrf']['token'], $token2)) + self::errors('Los tokens del formulario no coinciden'); - self::destroy(); - } + self::destroy(); + } } diff --git a/libs/emails.php b/libs/emails.php index c6c9869..8e55b86 100644 --- a/libs/emails.php +++ b/libs/emails.php @@ -1,4 +1,20 @@ . +*/ defined('NABU') || exit(); @@ -8,50 +24,43 @@ use Snipworks\Smtp\Email; // Envía mensajes de e-mail en formato HTML. class emails { - private $mail; + private $mail; - private function errors(string $error) { - messages::errors($error, 400); - } + private function errors(string $error) { + messages::errors($error, 500); + } - public function __construct() { - if (!file_exists(NABU_DIRECTORY['email'])) { - $this -> errors('Create a e-mail config file'); - } + public function __construct() { + if (!file_exists(NABU_DIRECTORY['email'])) + $this -> errors('No se encontró el archivo de configuración del cliente de correo electrónico ' . NABU_DIRECTORY['email']); - // Carga el archivo de configuración del cliente de e-mail. - $config = file_get_contents(NABU_DIRECTORY['email']); + // Carga el archivo de configuración del cliente de e-mail. + $config = file_get_contents(NABU_DIRECTORY['email']); + $config = json_decode($config, true); - if ($config === false) { - $this -> errors('The e-mail config file is invalid'); - } + $params = array('smtp', 'port', 'address', 'password'); - $config = json_decode($config, true); + foreach ($params as $param) + if (empty($config[$param])) + messages::errors('Define el parámetro "' . $param . '" en el archivo de configuración del cliente correo electrónico', 500); - $keys = array('smtp', 'port', 'address', 'password'); + // Configura el cliente de e-mail. + $this -> mail = new Email($config['smtp'], $config['port']); + $this -> mail -> setProtocol(Email::TLS); + $this -> mail -> setLogin($config['address'], $config['password']); + $this -> mail -> setFrom($config['address'], NABU_DEFAULT['website-name']); + } - foreach ($keys as $key) { - if (empty($config[$key])) { - $this -> errors('Set "' . $key . '" in e-mail config file'); - } - } + // Define el destinatario del mensaje, + public function prepare(string $destinatary, string $name) { + $this -> mail -> addTo($destinatary, $name); + } - // Configura el cliente del e-mail. - $this -> mail = new Email($config['smtp'], $config['port']); - $this -> mail -> setProtocol(Email::TLS); - $this -> mail -> setLogin($config['address'], $config['password']); - $this -> mail -> setFrom($config['address'], NABU_DEFAULT['website-name']); - } + // Envía un mensaje de e-mail HTML. + public function send(string $subject, string $body) { + $this -> mail -> setSubject($subject); + $this -> mail -> setHtmlMessage($body); - // Define el destinatario del mensaje. - public function prepare(string $destinatary, string $name) { - $this -> mail -> addTo($destinatary, $name); - } - - // Envía un mensaje de e-mail HTML. - public function send(string $subject, string $body) { - $this -> mail -> setSubject($subject); - $this -> mail -> setHtmlMessage($body); - return $this -> mail -> send(); - } + return $this -> mail -> send(); + } } diff --git a/libs/messages.php b/libs/messages.php deleted file mode 100644 index 7dd7604..0000000 --- a/libs/messages.php +++ /dev/null @@ -1,45 +0,0 @@ - $message, - 'code' => $code - ); - - utils::redirect(NABU_ROUTES['errors']); - } -} diff --git a/libs/php-smtp-2.0.4/.gitignore b/libs/php-smtp-2.0.4/.gitignore new file mode 100644 index 0000000..8535aa1 --- /dev/null +++ b/libs/php-smtp-2.0.4/.gitignore @@ -0,0 +1,4 @@ +/.idea/ +/vendor/ + +composer.lock diff --git a/libs/utils.php b/libs/utils.php deleted file mode 100644 index 95f03ae..0000000 --- a/libs/utils.php +++ /dev/null @@ -1,29 +0,0 @@ -. +*/ defined('NABU') || exit(); // Valida los campos de un formulario. class validations { - private $route; - private $field; - private $value; + private $route; + private $field; + private $value; - // Define la ruta de redirección para mostrar mensajes sobre campos inválidos. - public function __construct(string $route) { - $this -> route = $route; + public function __construct(string $route) { + $this -> route = $route; + } + + // Muestra errores fatales. + private function errors(string $error) { + messages::errors($error, 500); + } + + // Elimina espacios sobrantes y de principio y fin de un string. + private function trim_all() { + $this -> value = trim(preg_replace('/\s+/', ' ', $this -> value)); + } + + // Valida la longitud de un string. + private function validate_length(int $min, int $max) { + $length = strlen($this -> value); + + if ($length < $min || $length > $max) + messages::add('El campo "' . $this -> field . '" no respeta los límites establecidos'); + } + + // Valida si un string contiene espacios. + private function is_space() { + $str = $this -> value; + + if (preg_replace('/\s+/', '', $str) !== $str) + messages::add('El campo "' . $this -> field . '" contiene espacios'); + } + + // Valida si una dirección de correo electrónico pertenece a la Universidad de Guanajuato. + private function is_email() { + $email = $this -> value; + + if (filter_var($email, FILTER_VALIDATE_EMAIL)) { + if (!str_ends_with($email, '@ugto.mx')) + messages::add('Registrate con tu dirección de correo electrónico institucional de la Universidad de Guanajuato'); + } + else + messages::add('El campo "' . $this -> field . '" contiene una dirección de correo electrónico no válido'); + } + + // Valida si dos datos son iguales. + private function equal($foo) { + if ($this -> value !== $foo) + messages::add('El campo "' . $this -> field . '" no coincide'); + } + + // Valida y selecciona los campos de un formulario, + // @return un array asociativo con los valores de los campos que son válidos. + public function validate(array $form, array $params) { + $data = array(); + + foreach ($params as $param) { + if (empty($param['field'])) + $this -> errors('Define el nombre del campo del formulario en la validación'); + + // Nombre del campo. + $this -> field = $param['field']; + + // Valida si el campo es obligatorio u opcional (default: obligatorio). + if (empty($form[$this -> field])) { + if (empty($param['optional'])) + messages::add('El campo "' . $this -> field . '" es obligatorio'); + + continue; + } + + // Define el tipo de dato del campo (default: string). + $type = empty($param['type']) ? 'string' : $param['type']; + + // Dato del campo. + $this -> value = $form[$this -> field]; + + // Realiza acciones en base a "$type". + if ($type == 'string' || $type == 'email') { + // Selecciona el tipo de limpieza de espacios. + if (isset($param['trim'])) + $this -> value = trim($this -> value); + elseif (isset($param['trim_all'])) + $this -> trim_all(); + + if (isset($param['min_length']) && isset($param['max_length'])) + $this -> validate_length($param['min_length'], $param['max_length']); + + if (isset($param['not_spaces'])) + $this -> is_space(); + + if ($type == 'email') + $this -> is_email(); + } + elseif ($type == 'image') { + // + } + + if (isset($param['equal'])) + $this -> equal($param['equal']); + + $data[$this -> field] = $this -> value; } - // Muestra errores fatales. - private function errors(string $error) { - messages::errors($error, 400); - } + messages::check($this -> route); - // Valida si la información de un archivo proviene - // de la variable global '$_FILE'. - private function is_file() { - $file = $this -> value; - return is_array($file) && !empty($file['tmp_name']); - } - - // Elimina espacios sobrantes y de principio y fin de un string. - private function trim_all() { - return trim(preg_replace('/\s+/', ' ', $this -> value)); - } - - // Valida la longitud de un string. - private function string_lenght(int $min, int $max) { - $length = strlen($this -> value); - - if ($length < $min || $length > $max) { - messages::add('El campo "' . $this -> field . '" no respeta los límites establecidos'); - } - } - - // Valida si un string contiene espacios. - private function is_space() { - $str = $this -> value; - - if (preg_replace('/\s+/', '', $str) !== $str) { - messages::add('El campo "' . $this -> field . '" contiene espacios'); - } - } - - // Valida si una dirección de correo electrónico es de la Universidad de Guanajuato. - private function is_email() { - $email = $this -> value; - - if (filter_var($email, FILTER_VALIDATE_EMAIL)) { - if (!str_ends_with($email, '@ugto.mx')) { - messages::add('Registrate con tu dirección de correo electrónico institucional de la Universidad de Guanajuato'); - } - } - else { - messages::add('El campo "' . $this -> field . '" contiene una dirección de correo electrónico no válido'); - } - } - - // Valida el tamaño y el formato de una imagen. - private function is_image() { - $size = $this -> value['size']; - - if ($size > NABU_DEFAULT['image-size']) { - messages::add('Por favor elija una imagen de diferente peso'); - } - - $formats = explode(',', NABU_DEFAULT['image-formats']); - - foreach ($formats as $format) { - if (trim($format) == $this -> value['type']) { - $extension = $format; - break; - } - } - - if (empty($extension)) { - messages::add('Formato de imagen inválido'); - } - } - - // Valida si dos datos son iguales. - private function equal($foo) { - if ($this -> value !== $foo) { - messages::add('El campo "' . $this -> field . '" no coincide'); - } - } - - // Valida y selecciona los campos de un formulario; - // @return un array asociativo con los valores de los campos que son válidos. - public function validate_form(array $form, array $options) { - $data = array(); - - foreach ($options as $option) { - if (empty($option[0]) || !is_string($option[0])) { - $this -> errors('Not found field name'); - } - - $type = 'string'; - - // Define el tipo de dato del campo (dafault: string). - if (!empty($option['is_email'])) { - $type = 'is_email'; - } - elseif (!empty($option['is_image'])) { - $type = 'is_image'; - } - - // Nombre del campo. - $this -> field = $option[0]; - - // Valida si un campo es obligatorio u opcional. - if (empty($form[$this -> field])) { - if (!empty($option['exists'])) { - messages::add('El campo "' . $this -> field . '" es obligatorio'); - } - continue; - } - - // Dato del campo. - $this -> value = $form[$this -> field]; - - // Valida si un campo es un archivo y si es obligatorio u opcional. - if ($type == 'is_image') { - if (!$this -> is_file()) { - if (!empty($option['exists'])) { - messages::add('El campo "' . $this -> field . '" require obligatoriamente de un archivo de imagen'); - } - continue; - } - } - - // Realiza acciones en base a '$type'. - if ($type == 'string' || $type == 'is_email') { - // Selecciona el tipo de limpieza de espacios. - if (!empty($option['trim_all'])) { - $this -> value = $this -> trim_all(); - } - elseif (!empty($option['trim'])) { - $this -> value = trim($this -> value); - } - - if (!empty($option['min_lenght']) && !empty($option['max_lenght'])) { - $this -> string_lenght($option['min_lenght'], $option['max_lenght']); - } - - if (!empty($option['not_spaces'])) { - $this -> is_space(); - } - } - - if ($type == 'is_email') { - $this -> is_email(); - } - - if ($type == 'is_image') { - $this -> is_image(); - } - - if (array_key_exists('equal', $option)) { - $this -> equal($option['equal']); - } - - $data[$this -> field] = $this -> value; - } - - messages::exist($this -> route); - - return $data; - } + return $data; + } } diff --git a/models/adminModel.php b/models/adminModel.php index bc4dba9..e69de29 100644 --- a/models/adminModel.php +++ b/models/adminModel.php @@ -1,14 +0,0 @@ - pdo = null; - } -} diff --git a/models/articlesModel.php b/models/articlesModel.php index e8995ca..e69de29 100644 --- a/models/articlesModel.php +++ b/models/articlesModel.php @@ -1,14 +0,0 @@ - pdo = null; - } -} diff --git a/models/authenticationModel.php b/models/authenticationModel.php new file mode 100644 index 0000000..a5fb78c --- /dev/null +++ b/models/authenticationModel.php @@ -0,0 +1,83 @@ +. +*/ + +defined('NABU') || exit(); + +class authenticationModel extends dbConnection { + public function __construct() { + parent::__construct(); + } + + // Registra el hash de autenticación de e-mail con tiempo de expiración. + public function save(array $authentication) { + $query = 'INSERT INTO authentications(id, hash, expiration) VALUES(:id, :hash, :expiration)'; + + try { + $this -> pdo -> prepare($query) -> execute($authentication); + } + catch (PDOException $e) { + $this -> errors($e -> getMessage(), 'tuvimos un problema para registrar tu clave de verificación de dirección de correo electrónico'); + } + } + + // @return un array asociativo con los datos de autenticación de e-mail de un usuario. + public function get(string $username) { + $query = 'SELECT u.id, u.email, u.activated, a.hash, a.expiration ' . + 'FROM users AS u LEFT JOIN authentications AS a ON u.id = a.id ' . + 'WHERE u.username = ? LIMIT 1'; + + try { + $prepare = $this -> pdo -> prepare($query); + + $prepare -> execute(array($username)); + + $user = $prepare -> fetch(); + + if (empty($user)) + $user = array(); + + return $user; + } + catch (PDOException $e) { + $this -> errors($e -> getMessage(), 'tuvimos un problema para validar tu dirección de correo electrónico'); + } + } + + // Activa la cuenta, elimina la autenticación y crea el perfil de un usuario. + public function activate(int $id) { + $query_activate = 'UPDATE users SET activated = TRUE WHERE id = ?'; + $query_delete = 'DELETE FROM authentications WHERE id = ?'; + $query_profile = 'INSERT INTO profiles(id) VALUES(?)'; + + $id = array($id); + + try { + $this -> pdo -> prepare($query_activate) -> execute($id); + $this -> pdo -> prepare($query_delete) -> execute($id); + $this -> pdo -> prepare($query_profile) -> execute($id); + } + catch (PDOException $e) { + $this -> errors($e -> getMessage(), 'tuvimos un problema para activar tu cuenta de usuario'); + } + } + + public function __destruct() { + parent::__destruct(); + $this -> pdo = null; + } +} diff --git a/models/blogModel.php b/models/blogModel.php index bad0598..2137688 100644 --- a/models/blogModel.php +++ b/models/blogModel.php @@ -1,14 +1,30 @@ . +*/ defined('NABU') || exit(); -class blogModel extends connection { - public function __construct() { - parent::__construct(); - } +class blogModel extends dbConnection { + public function __construct() { + parent::__construct(); + } - public function __destruct() { - parent::__destruct(); - $this -> pdo = null; - } + public function __destruct() { + parent::__destruct(); + $this -> pdo = null; + } } diff --git a/models/communityModel.php b/models/communityModel.php deleted file mode 100644 index 4e51cc2..0000000 --- a/models/communityModel.php +++ /dev/null @@ -1,14 +0,0 @@ - pdo = null; - } -} diff --git a/models/profilesModel.php b/models/profilesModel.php index bdf0bd4..e69de29 100644 --- a/models/profilesModel.php +++ b/models/profilesModel.php @@ -1,14 +0,0 @@ - pdo = null; - } -} diff --git a/models/searchModel.php b/models/searchModel.php deleted file mode 100644 index 7add11c..0000000 --- a/models/searchModel.php +++ /dev/null @@ -1,14 +0,0 @@ - pdo = null; - } -} diff --git a/models/usersModel.php b/models/usersModel.php index bcbde26..08ef8e4 100644 --- a/models/usersModel.php +++ b/models/usersModel.php @@ -1,92 +1,105 @@ . +*/ defined('NABU') || exit(); -// Manipula los datos de los usuarios. -class usersModel extends connection { - public function __construct() { - parent::__construct(); +class usersModel extends dbConnection { + public function __construct() { + parent::__construct(); + } + + // @return una lista de arrays asociativos con los datos de los usuarios. + public function find(string $username, string $email) { + $query = 'SELECT u.id, u.username, u.email, u.password, u.activated, u.registration_date,' . + 'a.hash, a.expiration FROM users AS u ' . + 'LEFT JOIN authentications AS a ON u.id = a.id ' . + 'WHERE u.username = ? OR u.email = ? LIMIT 2'; + + try { + $prepare = $this -> pdo -> prepare($query); + + $prepare -> execute(array($username, $email)); + + $users = $prepare -> fetchAll(); + + if (empty($users)) + $users = array(); + + return $users; } - - // @return un lista de arrays asociativos con los datos de los usuarios. - public function find(string $username, string $email) { - $query = 'SELECT u.id, u.username, u.email, u.password, u.activated, u.creation_date,' . - 'v.hash, v.expiration AS hash_expiration FROM users AS u ' . - 'LEFT JOIN verifications AS v on u.id = v.id ' . - 'WHERE u.username = ? OR u.email = ? LIMIT 2'; - - try { - $prepare = $this -> pdo -> prepare($query); - - $prepare -> execute(array($username, $email)); - - $users = $prepare -> fetchAll(); - - if (empty($users)) { - return array(); - } - - return $users; - } - catch (PDOException $e) { - $this -> errors($e -> getMessage(), 'tuvimos un problema para validar si tu apodo y dirección de correo electrónico son únicos'); - } + catch (PDOException $e) { + $this -> errors($e -> getMessage(), 'tuvimos un problema para validar si tu apodo y dirección de correo electrónico son únicos'); } + } - // Registra un nuevo usuario. - public function save(array $data) { - $query = 'INSERT INTO users(name, username, email, password, creation_date) ' . - 'VALUES(:name, :username, :email, :password, :creation_date)'; + // Elimina un usuario. + public function delete(int $id) { + $query = 'DELETE FROM users WHERE id = ?'; - try { - $this -> pdo -> prepare($query) -> execute($data); - } - catch (PDOException $e) { - $this -> errors($e -> getMessage(), 'tuvimos un problema para registrar tu cuenta de usuario'); - } + try { + $this -> pdo -> prepare($query) -> execute(array($id)); } - - // @return un array asociativo con los datos de un solo usuario. - public function get(string $column, $pattern) { - $query = 'SELECT u.id, u.role_id AS role, u.username, u.email, u.password, u.activated, u.creation_date,' . - 'v.hash, v.expiration AS hash_expiration FROM users AS u ' . - 'LEFT JOIN verifications AS v on u.id = v.id ' . - 'WHERE u.' . $column . ' = ? LIMIT 1'; - - try { - $prepare = $this -> pdo -> prepare($query); - - $prepare -> execute(array($pattern)); - - $user = $prepare -> fetch(); - - if (empty($user)) { - return array(); - } - - $user['role'] = $this -> role_format($user['role']); - - return $user; - } - catch (PDOException $e) { - $this -> errors($e -> getMessage(), 'tuvimos un problema para buscar tu cuenta de usuario'); - } + catch (PDOException $e) { + $this -> errors($e -> getMessage(), 'tuvimos un problema para eliminar una cuenta de usuario'); } + } - // Elimina un usuario. - public function delete(int $id) { - $query = 'DELETE FROM users WHERE id = ?'; + // Registra un nuevo usuario. + public function save(array $data) { + $query = 'INSERT INTO users(name, username, email, password, registration_date) ' . + 'VALUES(:name, :username, :email, :password, :registration_date)'; - try { - $this -> pdo -> prepare($query) -> execute(array($id)); - } - catch (PDOException) { - $this -> errors($e -> getMessage(), 'tuvimos un problema para eliminar una cuenta de usuario'); - } + try { + $this -> pdo -> prepare($query) -> execute($data); } - - public function __destruct() { - parent::__destruct(); - $this -> pdo = null; + catch (PDOException $e) { + $this -> errors($e -> getMessage(), 'tuvimos un problema para registrar tu cuenta de usuario'); } + } + + // @return un array asociativo con los datos de un solo usuario. + public function get(string $column, $pattern) { + $query = 'SELECT u.id, u.role_id AS role, u.username, u.email, u.password, u.activated, u.registration_date,' . + 'a.hash, a.expiration FROM users AS u ' . + 'LEFT JOIN authentications AS a ON u.id = a.id ' . + 'WHERE u.' . $column . ' = ? LIMIT 1'; + + try { + $prepare = $this -> pdo -> prepare($query); + + $prepare -> execute(array($pattern)); + + $user = $prepare -> fetch(); + + if (empty($user)) + return array(); + + $user['role'] = $this -> role($user['role']); + + return $user; + } + catch (PDOException $e) { + $this -> errors($e -> getMessage(), 'tuvimos un problema para validar si tu apodo y dirección de correo electrónico son únicos'); + } + } + + public function __destruct() { + parent::__destruct(); + $this -> pdo = null; + } } diff --git a/models/verificationsModel.php b/models/verificationsModel.php deleted file mode 100644 index 324a28f..0000000 --- a/models/verificationsModel.php +++ /dev/null @@ -1,69 +0,0 @@ - pdo -> prepare($query) -> execute($verification); - } - catch (PDOException $e) { - $this -> errors($e -> getMessage(), 'tuvimos un problema para registrar tu clave de verificación de dirección de correo electrónico'); - } - } - - // @return un array asociativo con los datos de verificación de e-mail de un usuario. - public function get(string $username) { - $query = 'SELECT u.id, u.email, u.activated, v.hash, v.expiration as hash_expiration ' . - 'FROM users AS u LEFT JOIN verifications AS v ON u.id = v.id ' . - 'WHERE u.username = ? LIMIT 1'; - - try { - $prepare = $this -> pdo -> prepare($query); - - $prepare -> execute(array($username)); - - $user = $prepare -> fetch(); - - if (empty($user)) { - return array(); - } - - return $user; - } - catch (PDOException $e) { - $this -> errors($e -> getMessage(), 'tuvimos un problema para validar tu dirección de correo electrónico'); - } - } - - // Activa la cuenta, elimina la verificación y crea el perfil de un usuario. - public function activate(int $id) { - $query_activate = 'UPDATE users SET activated = TRUE WHERE id = ?'; - $query_delete = 'DELETE FROM verifications WHERE id = ?'; - $query_profile = 'INSERT INTO profiles(id) VALUES(?)'; - - $id = array($id); - - try { - $this -> pdo -> prepare($query_activate) -> execute($id); - $this -> pdo -> prepare($query_delete) -> execute($id); - $this -> pdo -> prepare($query_profile) -> execute($id); - } - catch (PDOException $e) { - $this -> errors($e -> getMessage(), 'tuvimos un problema para activar tu cuenta de usuario'); - } - } - - public function __destruct() { - parent::__destruct(); - $this -> pdo = null; - } -} diff --git a/views/admin/dashboard.php b/views/admin/dashboard.php deleted file mode 100644 index e7be032..0000000 --- a/views/admin/dashboard.php +++ /dev/null @@ -1,39 +0,0 @@ - - - - ''), -) ?> - - - - -

Artículos envíados

- - - - - - - - - - - - - - - - - - - - - - -
TítuloAutor
PublicarEditarEliminar
- - - diff --git a/views/admin/edit-article.php b/views/admin/edit-article.php deleted file mode 100644 index 6e6f1ed..0000000 --- a/views/admin/edit-article.php +++ /dev/null @@ -1,55 +0,0 @@ - - - - ''), -) ?> - - - - -

Editar artículo

- - - -
- -
-
- -
- -
- Portada del artículo -
- -
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
- - diff --git a/views/admin/published-articles.php b/views/admin/published-articles.php deleted file mode 100644 index 6fe11b1..0000000 --- a/views/admin/published-articles.php +++ /dev/null @@ -1,49 +0,0 @@ - - - - ''), -) ?> - - - - -

Artículos publicados

- - - -
- - - - - - - -
- - - - - - - - - - - - - - - - - - -
TítuloAutor
EditarEliminar
- - - - - diff --git a/views/admin/users.php b/views/admin/users.php deleted file mode 100644 index e732ecd..0000000 --- a/views/admin/users.php +++ /dev/null @@ -1,53 +0,0 @@ - - - - ''), -) ?> - - - - -

Usuarios registrados

- - - -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - -
Nombre completoApodoEstatus
Cambiar a usuarioCambiar a moderadorEliminar
- - - - diff --git a/views/components/admin-navbar.php b/views/components/admin-navbar.php deleted file mode 100644 index 7d4a631..0000000 --- a/views/components/admin-navbar.php +++ /dev/null @@ -1,16 +0,0 @@ - - - -
-

Administración

- -
diff --git a/views/components/articles.php b/views/components/articles.php index 8f0abda..a8cbbae 100644 --- a/views/components/articles.php +++ b/views/components/articles.php @@ -1,40 +1,48 @@ + + + - - -
- Portada del artículo -

Título:

-

Sinopisis:

-

Autor:

-

Número de favoritos:

-

Número de comentarios:

-
diff --git a/views/components/footer.php b/views/components/footer.php index 517aa7a..48dbe62 100644 --- a/views/components/footer.php +++ b/views/components/footer.php @@ -1,3 +1,20 @@ + +