From 9e3d50f606589940110d05717fcfc8f0440dd346 Mon Sep 17 00:00:00 2001 From: moudev Date: Thu, 16 Apr 2020 15:16:13 -0600 Subject: [PATCH 1/9] Update index page to get content from Wordpress API Updating index page with the feature to show data extracted from the Wordpress API, this data is extracted from a page that needs to have the name 'content-page-home' because the page will be searched by its URL Slug. If the page hasn't been created a message with the instructions will be displayed. The index page gets and passes it to the layout component that contains the Header component, after the data is passed from layout component to Header component. Important; for this to works it is important install the Advanced Custom Fields plugin in our WP backend and create specific fields, this fields names are in the index page graqhql query. https://www.wpgraphql.com/acf/ - Adding validations in gatsby-node file to create pages from data of the Wordpress API - Updating .eslintrc file whit rule to pass error that occurred for the validations added in gatsby-config - Updating the index page to get custom fields from the Wordpress API - Updating the header component to display data from the Wordpress API --- .eslintrc | 1 + gatsby-node.js | 100 ++++++++++++------------ src/components/header.js | 163 ++++++++++++++++++++++---------------- src/components/layout.js | 5 +- src/pages/index.js | 165 ++++++++++++++++++--------------------- 5 files changed, 226 insertions(+), 208 deletions(-) diff --git a/.eslintrc b/.eslintrc index 482dc93..200c8a7 100644 --- a/.eslintrc +++ b/.eslintrc @@ -15,6 +15,7 @@ "semi": ["error", "never"], "comma-dangle": ["error", "never"], "quotes": ["error", "double", { "avoidEscape": true }], + "no-unused-expressions": [2, { allowShortCircuit: true }], // gatsby-node.js "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }], "react/no-danger": 0, "react/prop-types": 0, diff --git a/gatsby-node.js b/gatsby-node.js index d961312..c9915b4 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -30,18 +30,19 @@ exports.createPages = async ({ graphql, actions }) => { } `) - postResults.data.wpgraphql.posts.edges.forEach(({ node }) => { - createPage({ - path: node.slug, - component: path.resolve("./src/templates/blog-page-template.js"), - context: { - // This is the $slug variable - // passed to blog-post.js - slug: node.slug, - databaseId: node.databaseId - } + Array.isArray(postResults.data.wpgraphql.posts.edges) + && postResults.data.wpgraphql.posts.edges.forEach(({ node }) => { + createPage({ + path: node.slug, + component: path.resolve("./src/templates/blog-page-template.js"), + context: { + // This is the $slug variable + // passed to blog-post.js + slug: node.slug, + databaseId: node.databaseId + } + }) }) - }) /** * Create Pages @@ -70,18 +71,19 @@ exports.createPages = async ({ graphql, actions }) => { } `) - pageResults.data.wpgraphql.pages.edges.forEach(({ node }) => { - createPage({ - path: node.slug, - component: path.resolve("./src/templates/blog-page-template.js"), - context: { - // This is the $slug variable - // passed to blog-post.js - slug: node.slug, - databaseId: node.databaseId - } + Array.isArray(pageResults.data.wpgraphql.pages.edges) + && pageResults.data.wpgraphql.pages.edges.forEach(({ node }) => { + createPage({ + path: node.slug, + component: path.resolve("./src/templates/blog-page-template.js"), + context: { + // This is the $slug variable + // passed to blog-post.js + slug: node.slug, + databaseId: node.databaseId + } + }) }) - }) /** * Create Category Pages @@ -102,20 +104,21 @@ exports.createPages = async ({ graphql, actions }) => { } `) - categoryPageResults.data.wpgraphql.categories.edges.forEach(({ node }) => { - createPage({ - path: `/category/${node.slug}`, - component: path.resolve("./src/templates/category-posts-list-template.js"), - context: { - // This is the $slug variable - // passed to blog-post.js - slug: node.slug, - databaseId: node.databaseId, - name: node.name, - typeList: "category" - } + Array.isArray(categoryPageResults.data.wpgraphql.categories.edges) + && categoryPageResults.data.wpgraphql.categories.edges.forEach(({ node }) => { + createPage({ + path: `/category/${node.slug}`, + component: path.resolve("./src/templates/category-posts-list-template.js"), + context: { + // This is the $slug variable + // passed to blog-post.js + slug: node.slug, + databaseId: node.databaseId, + name: node.name, + typeList: "category" + } + }) }) - }) /** * Create Tags Pages @@ -136,18 +139,19 @@ exports.createPages = async ({ graphql, actions }) => { } `) - tagPageResults.data.wpgraphql.tags.edges.forEach(({ node }) => { - createPage({ - path: `/tag/${node.slug}`, - component: path.resolve("./src/templates/tag-posts-list-template.js"), - context: { - // This is the $slug variable - // passed to blog-post.js - slug: node.slug, - databaseId: node.databaseId, - name: node.name, - typeList: "tag" - } + Array.isArray(tagPageResults.data.wpgraphql.tags.edges) + && tagPageResults.data.wpgraphql.tags.edges.forEach(({ node }) => { + createPage({ + path: `/tag/${node.slug}`, + component: path.resolve("./src/templates/tag-posts-list-template.js"), + context: { + // This is the $slug variable + // passed to blog-post.js + slug: node.slug, + databaseId: node.databaseId, + name: node.name, + typeList: "tag" + } + }) }) - }) } diff --git a/src/components/header.js b/src/components/header.js index 74e86b6..9a5884c 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -1,82 +1,96 @@ -import { Link, graphql, StaticQuery } from "gatsby" import React from "react" +import { Link } from "gatsby" import styled from "styled-components" import tw from "twin.macro" -import { theme as CustomTheme } from "../../tailwind.config" +import _ from "lodash" +import { theme as CustomTheme } from "../../tailwind.config" import ThemeContext from "../context/ThemeContext" import ElSalvadorConectadoLogo from "../images/elsalvadorconectado-logo.svg" const blueTransparentColor = "rgba(23, 72, 237, 0.85)" -const Header = () => ( - { - // Set ImageData - const imageFluid = data.desktop.childImageSharp.fluid - return ( - -
- - {(theme) => ( -
- -
- - El texto se lee El Salvador Conectado con un logotipo formando una especie de abrazo - - - {/* */} - -

- - {"El Salvador es más "} - - si está conectado -

- - +const Header = ({ data = {}, headerVh = 100 }) => { + const height = headerVh + const page = _.get(data, "wpgraphql.page", {}) + const header = _.get(data, "wpgraphql.page.customFields.bodySectionHeader", {}) + const firstSlogan = _.get(header, "firstSlogan", "") + const secondSlogan = _.get(header, "secondSlogan", "") + const joinButton = _.get(header, "joinButton", { tex: "", href: "" }) + const backgroundImage = _.get(header, "backgroundImage", { wpUrl: "" }) + const errorMessageTitle = `Error: No existe página en Wordpress con URL slug + "content-page-home", se debe de crear desde + el administrador de Wordpress con el nombre ya mencionado. + + Además Wordpress necesita las instalación de ciertos plugins, + puedes encontrar la guía para implementarlo de forma local en la + Wiki del repositorio.` + const errorMessageBody = "https://github.com/svconectado/website/wiki" + return ( + +
+ + {(theme) => ( +
+ +
+ + El texto se lee El Salvador Conectado con un logotipo formando una especie de abrazo + + + {/* */} + {!page && ( +
+ + {errorMessageTitle} + +
+                      { errorMessageBody }
+                    
+
+ )} + {page && ( +

+ + {firstSlogan} + + {secondSlogan} +

+ )} + {page && ( + -
- )} - -
- - ) - }} - /> -) + )} +
+
+ )} + +
+ + ) +} const StyledWrapper = styled.div` .header__hero { - background-image: url(${(props) => props.imageFluid.src}); + background-image: url(${(props) => props.backgroundImage.wpUrl}); ${tw`bg-local bg-center bg-no-repeat bg-cover`} ${tw`relative`} @@ -94,7 +108,8 @@ const StyledWrapper = styled.div` z-index: 1; &__text { - ${tw`h-screen flex flex-col justify-around items-center`} + height: ${(props) => props.headerVh}vh; + ${tw`flex flex-col justify-around items-center`} ${tw`text-4xl`} &__logo { @@ -108,13 +123,21 @@ const StyledWrapper = styled.div` &__message { ${tw`text-center font-bold`} - ${tw`flex flex-col justify-center items-center`} + ${tw`flex flex-col justify-center items-center text-3xl`} &__light { ${tw`font-normal`} } } + &__error { + ${tw`flex flex-col items-center justify-center w-full pb-40`} + ${tw`text-sm`} + pre { + ${tw`w-full mt-4`} + } + } + &__button { ${tw`text-2xl font-bold underline`} @@ -169,6 +192,10 @@ const StyledWrapper = styled.div` &__button { ${tw`pt-8`} } + + &__error { + ${tw`pt-32 pb-0`} + } } } } diff --git a/src/components/layout.js b/src/components/layout.js index bc50244..29cc092 100644 --- a/src/components/layout.js +++ b/src/components/layout.js @@ -6,11 +6,11 @@ import Footer from "./footer" import "./layout.css" import "./layoutPreview.scss" -const Layout = ({ children }) => ( +const Layout = ({ children, data, headerVh }) => ( {(theme) => (
-
+
{children}
@@ -20,6 +20,7 @@ const Layout = ({ children }) => ( ) + Layout.propTypes = { children: PropTypes.node.isRequired } diff --git a/src/pages/index.js b/src/pages/index.js index ad8fa87..247dbb8 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -1,57 +1,15 @@ import React from "react" -import { Link, graphql } from "gatsby" +import { graphql } from "gatsby" import Layout from "../components/layout" import SEO from "../components/seo" const IndexPage = ({ data }) => ( - + // headerVh = vh units of the Viewport +
-

My Blog

-

Posts

- {data.wpgraphql.posts.edges.map(({ node }) => ( -
- -
- -
-
- ))} -
-
-
-

Pages

- {data.wpgraphql.pages.edges.map(({ node }) => ( -
- -
- -
-
- ))} -
-
-
-

Categories

- {data.wpgraphql.categories.edges.map(({ node }) => ( -
- -
- -
- ))} -
-
-
-

Tags

- {data.wpgraphql.tags.edges.map(({ node }) => ( -
- -
- -
- ))} + Content from WP
) @@ -59,57 +17,84 @@ const IndexPage = ({ data }) => ( export default IndexPage export const pageQuery = graphql` - query GET_POSTS { + query { wpgraphql { - posts(first: 1000, after: null) { - edges { - node { - databaseId - slug - title - date - content(format: RENDERED) - featuredImage { - altText - link - mediaItemUrl - uri + page(id: "jcontent-page-home", idType: URI) { + id + customFields { + bodySectionHeader { + firstSlogan + secondSlogan + joinButton { + text + href + } + backgroundImage { + alt + authorName + authorProfile + sourceUrl + wpUrl } } - } - } - pages(first: 1000, after: null) { - edges { - node { - databaseId - slug + bodySectionMotivations { title - date - content(format: RENDERED) - featuredImage { - altText - link - mediaItemUrl - uri + firstDescription + secondDescription + motivationsList { + access { + icon + text + } + build { + icon + text + } + citizens { + icon + text + } + fight { + icon + text + } + help { + icon + text + } } } - } - } - categories(first: 1000) { - edges { - node { - databaseId - name - slug + bodySectionAboutUs { + title + firstDescription + secondDescription + moreButton { + text + href + } + image { + alt + authorName + authorProfile + sourceUrl + wpUrl + } } - } - } - tags(first: 1000) { - edges { - node { - databaseId - name - slug + bodySectionInitiatives { + title + firstDescription + secondDescription + moreButton { + text + href + } + image { + alt + authorName + authorProfile + sourceUrl + wpUrl + } } } } From e8e301941ae378d606b31d9e3d0bba1bd43fe0e6 Mon Sep 17 00:00:00 2001 From: moudev Date: Mon, 20 Apr 2020 15:33:18 -0600 Subject: [PATCH 2/9] Update index page to show data from Wordpress API Adding styled sections of information in the index page, this data is from the WP API. The sections added are; - Our motivations - About Us - Our Initiatives - Adding text-color in tailwind config file - Adding sections in the index page file, the data of these sections are custom fields created in the WP backend with the plugin "Advanced Custom Fields", if you want to see the names of these ACFs you can look at 'src/pages/index.js' file on its graphql query or you can look at; https://github.com/svconectado/website/wiki --- src/components/header.js | 2 +- src/pages/index.js | 328 +++++++++++++++++++++++++++++++++++++-- tailwind.config.js | 4 +- 3 files changed, 321 insertions(+), 13 deletions(-) diff --git a/src/components/header.js b/src/components/header.js index 9a5884c..1ec78c5 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -165,7 +165,7 @@ const StyledWrapper = styled.div` } @media (min-width: ${CustomTheme.extend.screens.tablet}) { - .hero__container__text__button__href { + .header__hero__container__text__button__href { ${tw`text-3xl`} } diff --git a/src/pages/index.js b/src/pages/index.js index 247dbb8..cf80d5f 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -1,25 +1,331 @@ import React from "react" -import { graphql } from "gatsby" +import { graphql, Link } from "gatsby" +import styled from "styled-components" +import _ from "lodash" +import tw from "twin.macro" +import { theme as CustomTheme } from "../../tailwind.config" import Layout from "../components/layout" import SEO from "../components/seo" -const IndexPage = ({ data }) => ( - // headerVh = vh units of the Viewport - - -
- Content from WP -
-
-) +const IndexPage = ({ data }) => { + const page = _.get(data, "wpgraphql.page", {}) + const sectionMotivations = _.get(data, "wpgraphql.page.customFields.bodySectionMotivations", {}) + const sectionAboutUs = _.get(data, "wpgraphql.page.customFields.bodySectionAboutUs", {}) + const sectionInitiatives = _.get(data, "wpgraphql.page.customFields.bodySectionInitiatives", {}) + const notFoundPageMessageError = "No existe la página solicitada" + return ( + // headerVh = vh units of the Viewport + + +
+ {!page && ( + + { notFoundPageMessageError } + + )} + {page && ( + +
+

+ { _.get(sectionMotivations, "title", "") } +

+ + { _.get(sectionMotivations, "firstDescription", "") } + + + { _.get(sectionMotivations, "secondDescription", "") } + +
+ { + _.map(_.get(sectionMotivations, "motivationsList", []), (m) => ( +
+
+ {m.text} +
+ + { m.text } + +
+ )) + } +
+
+
+ )} + {page && ( + +
+
+

+ { _.get(sectionAboutUs, "title", "") } +

+
+ + { _.get(sectionAboutUs, "firstDescription", "") } + + + { _.get(sectionAboutUs, "secondDescription", "") } + + + { _.get(sectionAboutUs, "moreButton.text", "") } + +
+
+ {_.get(sectionAboutUs, +
+
+ + )} + {page && ( + +
+

+ { _.get(sectionInitiatives, "title", "") } +

+ + { _.get(sectionInitiatives, "firstDescription", "") } + + + { _.get(sectionInitiatives, "secondDescription", "") } + + + { _.get(sectionInitiatives, "moreButton.text", "") } + +
+
+ )} +
+ + ) +} + +const StyleError = styled.div` + ${tw`font-poppins`} + ${tw`flex flex-col justify-center items-center py-20`} +` + +const StyleSectionMotivations = styled.div` + .motivations { + ${tw`font-poppins text-center`} + ${tw`flex flex-col justify-center items-center pt-4 pb-12`} + + &__title { + ${tw`font-semibold`} + font-size: 2rem; + } + + &__first-description { + ${tw`mt-4 font-light`} + } + + &__second-description { + ${tw`mt-4 font-light`} + } + + &__list { + ${tw`flex flex-col justify-center items-center`} + + &__item { + ${tw`flex flex-col justify-center items-center mt-8 w-1/2`} + + &__icon { + ${tw`rounded-full shadow p-4 h-24 w-24`} + ${tw`flex flex-col justify-center items-center`} + + &__img { + ${tw`p-0 m-0`} + } + } + + &__text { + ${tw`mt-4 text-xl text-blue`} + } + } + } + } + +@media (min-width: ${CustomTheme.extend.screens.tablet}) { + .motivations { + ${tw`pb-12`} + + &__list { + ${tw`flex-row`} + + &__item { + ${tw`w-full`} + + &__icon { + ${tw`h-20 w-20`} + } + + &__text { + ${tw`text-sm`} + } + } + } + } +} + +@media (min-width: ${CustomTheme.extend.screens.laptop}) { + .motivations { + ${tw`pb-16`} + + &__list { + &__item { + ${tw`px-4`} + &__text { + ${tw`text-base`} + } + } + } + } +} + +@media (min-width: ${CustomTheme.extend.screens.desktop}) { + .motivations { + &__list { + &__item { + ${tw`px-8`} + } + } + } +} +` +const StyleSectionAboutUs = styled.div` + .aboutus { + ${tw`font-poppins text-center`} + ${tw`py-12 relative`} + + &::before, &::after { + content: ''; + height: 2px; + ${tw`absolute bg-gray w-full inset-0`} + } + + &::after { + ${tw`top-auto bottom-0`} + } + + &__text { + ${tw`flex flex-col`} + + &__title { + ${tw`font-semibold text-2xl`} + } + + &__img { + ${tw`rounded my-4 h-48`} + ${tw`bg-local bg-center bg-no-repeat bg-cover`} + background-image: url(${(props) => props.image.wpUrl}); + } + + &__first-description { + ${tw`mt-4 font-light`} + } + + &__second-description { + ${tw`mt-4 font-light`} + } + + &__more-button { + ${tw`mt-8`} + ${tw`font-semibold underline`} + } + } + + &__media { + ${tw`hidden`} + } + } + +@media (min-width: ${CustomTheme.extend.screens.tablet}) { + .aboutus { + &__text { + &__img { + ${tw`bg-bottom`} + } + } + } +} + +@media (min-width: ${CustomTheme.extend.screens.laptop}) { + .aboutus { + ${tw`flex justify-between pt-16`} + ${tw`text-left`} + + &__text { + ${tw`flex-col w-6/12`} + + &__title { + ${tw`text-3xl`} + } + + &__img { + ${tw`hidden`} + } + } + + &__media { + ${tw`flex justify-center items-center w-5/12`} + } + } +} +` +const StyleSectionInitiatives = styled.div` + .initiatives { + ${tw`flex flex-col justify-center py-12`} + ${tw`font-poppins text-center`} + + &__title { + ${tw`font-semibold`} + font-size: 2rem; + } + + &__first-description { + ${tw`mt-4 font-light`} + } + + &__second-description { + ${tw`mt-4 font-light`} + } + + &__more-button { + ${tw`mt-8`} + ${tw`font-semibold underline`} + } + } + +@media (min-width: ${CustomTheme.extend.screens.laptop}) { + .initiatives { + ${tw`text-left`} + } +} +` export default IndexPage export const pageQuery = graphql` query { wpgraphql { - page(id: "jcontent-page-home", idType: URI) { + page(id: "content-page-home", idType: URI) { id customFields { bodySectionHeader { diff --git a/tailwind.config.js b/tailwind.config.js index bd0378e..aeeca29 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -4,13 +4,15 @@ module.exports = { colors: { gray: "#E9E9E9", graytext: "#555555", + blue: "#1748ED", separator: "#D6DFE0" }, backgroundColor: (theme) => ({ gray: theme("colors.gray") }), textColor: (theme) => ({ - gray: theme("colors.graytext") + gray: theme("colors.graytext"), + blue: theme("colors.blue") }), fontFamily: { montserrat: "Montserrat, sans-serif", From e89da7e9ad8246ead41960c96e6be00243b4f4b6 Mon Sep 17 00:00:00 2001 From: moudev Date: Tue, 21 Apr 2020 00:46:28 -0600 Subject: [PATCH 3/9] Add author credits of images used in header and the index page --- src/components/header.js | 18 ++++++++++++- src/pages/index.js | 58 +++++++++++++++++++++++++++++++++++----- 2 files changed, 68 insertions(+), 8 deletions(-) diff --git a/src/components/header.js b/src/components/header.js index 1ec78c5..db235c4 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -80,6 +80,14 @@ const Header = ({ data = {}, headerVh = 100 }) => {
)}
+ + { _.get(backgroundImage, "authorName", "") } +
)} @@ -149,7 +157,7 @@ const StyledWrapper = styled.div` content: ''; ${tw`absolute inset-0 h-full w-1/12`} background-color: #8ca2ec; - opacity: 0.50; + opacity: 0.3; transition: width 1s ease-out; } @@ -161,6 +169,14 @@ const StyledWrapper = styled.div` } } } + + &__credit { + ${tw`underline text-xs bottom-0 right-0`} + ${tw`absolute mr-4`} + min-width: auto; + min-height: auto; + opacity: 0.3; + } } } diff --git a/src/pages/index.js b/src/pages/index.js index cf80d5f..f39d4e2 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -67,7 +67,16 @@ const IndexPage = ({ data }) => {

{ _.get(sectionAboutUs, "title", "") }

-
+ { _.get(sectionAboutUs, "firstDescription", "") } @@ -82,11 +91,21 @@ const IndexPage = ({ data }) => {
@@ -232,9 +251,18 @@ const StyleSectionAboutUs = styled.div` } &__img { + ${tw`flex items-end justify-end`} + ${tw`text-xs text-white`} ${tw`rounded my-4 h-48`} ${tw`bg-local bg-center bg-no-repeat bg-cover`} background-image: url(${(props) => props.image.wpUrl}); + + &__credit { + ${tw`underline mr-4`} + min-width: auto; + min-height: auto; + opacity: 0.3; + } } &__first-description { @@ -284,7 +312,23 @@ const StyleSectionAboutUs = styled.div` } &__media { - ${tw`flex justify-center items-center w-5/12`} + ${tw`flex justify-center items-center w-5/12 text-white`} + + &__container { + ${tw`relative`} + + &__img { + ${tw`mb-0`} + } + + &__img__credit { + ${tw`underline text-xs`} + ${tw`absolute mr-4 bottom-0 right-0`} + min-width: auto; + min-height: auto; + opacity: 0.3; + } + } } } } From fb39e71999698af7644447247d414109696053e5 Mon Sep 17 00:00:00 2001 From: moudev Date: Tue, 21 Apr 2020 10:50:35 -0600 Subject: [PATCH 4/9] Update gatsby-config file to use the .env file - Adding dotenv package --- gatsby-config.js | 4 +++- package.json | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gatsby-config.js b/gatsby-config.js index eef3476..6221537 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -1,3 +1,4 @@ +require('dotenv').config() module.exports = { siteMetadata: { title: "El Salvador Conectado", @@ -23,7 +24,8 @@ module.exports = { // This is field under which it's accessible fieldName: "wpgraphql", // Url to query from - url: "https://dev-gatsby-wpgraphql-starter.pantheonsite.io/graphql" + url: `${process.env.WP_API_URL || + "https://svc-staging-wordpress.de.quenecesito.org/graphql"}`, } }, { diff --git a/package.json b/package.json index 97c9ec1..d3aab03 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ }, "devDependencies": { "babel-eslint": "^10.1.0", + "dotenv": "^8.2.0", "eslint": "^6.8.0", "eslint-config-airbnb": "^18.1.0", "eslint-loader": "^4.0.0", From 5a973b623ac7e6c993701de4c97fc614df271242 Mon Sep 17 00:00:00 2001 From: moudev Date: Tue, 21 Apr 2020 14:49:55 -0600 Subject: [PATCH 5/9] Add prettier plugin in ESLint rules - Adding prettier rules in the ESLint config file - Fixing warnings files with the rules of prettier --- .eslintrc | 6 +- .prettierrc | 5 +- gatsby-config.js | 8 +- gatsby-node.js | 20 ++-- package.json | 8 +- src/components/cardPostListComponent.js | 29 +++--- src/components/footer.js | 40 ++++---- src/components/header.js | 24 +++-- src/components/layout.js | 5 +- src/components/postsListComponent.js | 19 ++-- src/components/seo.js | 4 +- src/context/ThemeContext.js | 3 +- src/pages/index.js | 121 +++++++++++++----------- src/templates/blog-page-template.js | 32 +++---- 14 files changed, 173 insertions(+), 151 deletions(-) diff --git a/.eslintrc b/.eslintrc index 200c8a7..a7751be 100644 --- a/.eslintrc +++ b/.eslintrc @@ -3,7 +3,8 @@ "extends": [ "eslint:recommended", "plugin:react/recommended", - "airbnb" + "airbnb", + "plugin:prettier/recommended" ], "globals": { "window": true, @@ -20,6 +21,7 @@ "react/no-danger": 0, "react/prop-types": 0, "react/state-in-constructor": 0, - "linebreak-style": 0 + "linebreak-style": 0, + "react/jsx-one-expression-per-line": 0 } } \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index 48e90e8..e48e561 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,5 +3,8 @@ "semi": false, "singleQuote": false, "tabWidth": 2, - "trailingComma": "es5" + "trailingComma": "none", + "arrowParens": "always", + "bracketSpacing": true, + "jsxBracketSameLine": false } diff --git a/gatsby-config.js b/gatsby-config.js index 6221537..e2310fe 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -1,8 +1,10 @@ -require('dotenv').config() +require("dotenv").config() + module.exports = { siteMetadata: { title: "El Salvador Conectado", - description: "Sitio web hecho en Gatsby con GraphQL. Para el contenido se usa WordPress https://elsalvadorconectado.org", + description: + "Sitio web hecho en Gatsby con GraphQL. Para el contenido se usa WordPress https://elsalvadorconectado.org", author: "@elsalvadorconectado" }, plugins: [ @@ -25,7 +27,7 @@ module.exports = { fieldName: "wpgraphql", // Url to query from url: `${process.env.WP_API_URL || - "https://svc-staging-wordpress.de.quenecesito.org/graphql"}`, + "https://svc-staging-wordpress.de.quenecesito.org/graphql"}` } }, { diff --git a/gatsby-node.js b/gatsby-node.js index c9915b4..607323e 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -30,8 +30,8 @@ exports.createPages = async ({ graphql, actions }) => { } `) - Array.isArray(postResults.data.wpgraphql.posts.edges) - && postResults.data.wpgraphql.posts.edges.forEach(({ node }) => { + Array.isArray(postResults.data.wpgraphql.posts.edges) && + postResults.data.wpgraphql.posts.edges.forEach(({ node }) => { createPage({ path: node.slug, component: path.resolve("./src/templates/blog-page-template.js"), @@ -71,8 +71,8 @@ exports.createPages = async ({ graphql, actions }) => { } `) - Array.isArray(pageResults.data.wpgraphql.pages.edges) - && pageResults.data.wpgraphql.pages.edges.forEach(({ node }) => { + Array.isArray(pageResults.data.wpgraphql.pages.edges) && + pageResults.data.wpgraphql.pages.edges.forEach(({ node }) => { createPage({ path: node.slug, component: path.resolve("./src/templates/blog-page-template.js"), @@ -104,11 +104,13 @@ exports.createPages = async ({ graphql, actions }) => { } `) - Array.isArray(categoryPageResults.data.wpgraphql.categories.edges) - && categoryPageResults.data.wpgraphql.categories.edges.forEach(({ node }) => { + Array.isArray(categoryPageResults.data.wpgraphql.categories.edges) && + categoryPageResults.data.wpgraphql.categories.edges.forEach(({ node }) => { createPage({ path: `/category/${node.slug}`, - component: path.resolve("./src/templates/category-posts-list-template.js"), + component: path.resolve( + "./src/templates/category-posts-list-template.js" + ), context: { // This is the $slug variable // passed to blog-post.js @@ -139,8 +141,8 @@ exports.createPages = async ({ graphql, actions }) => { } `) - Array.isArray(tagPageResults.data.wpgraphql.tags.edges) - && tagPageResults.data.wpgraphql.tags.edges.forEach(({ node }) => { + Array.isArray(tagPageResults.data.wpgraphql.tags.edges) && + tagPageResults.data.wpgraphql.tags.edges.forEach(({ node }) => { createPage({ path: `/tag/${node.slug}`, component: path.resolve("./src/templates/tag-posts-list-template.js"), diff --git a/package.json b/package.json index d3aab03..2b84614 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,8 @@ "author": "Son muchos ", "dependencies": { "babel-plugin-styled-components": "^1.10.7", + "eslint-config-prettier": "^6.10.1", + "eslint-plugin-prettier": "^3.1.3", "font-awesome": "^4.7.0", "gatsby": "^2.19.7", "gatsby-background-image": "^1.0.1", @@ -28,11 +30,11 @@ "react-helmet": "^5.2.1", "styled-components": "^5.0.1", "tailwindcss": "^1.2.0", - "twin.macro": "^1.0.0-alpha.8" + "twin.macro": "^1.0.0-alpha.8", + "dotenv": "^8.2.0" }, "devDependencies": { "babel-eslint": "^10.1.0", - "dotenv": "^8.2.0", "eslint": "^6.8.0", "eslint-config-airbnb": "^18.1.0", "eslint-loader": "^4.0.0", @@ -50,7 +52,7 @@ "scripts": { "build": "gatsby build", "develop": "gatsby develop", - "format": "prettier --write \"**/*.{json,md}\"", + "format": "prettier --write \"**/*.{js, jsx, json,md}\"", "start": "npm run develop", "serve": "gatsby serve", "clean": "gatsby clean", diff --git a/src/components/cardPostListComponent.js b/src/components/cardPostListComponent.js index 1871eb4..4ebd902 100644 --- a/src/components/cardPostListComponent.js +++ b/src/components/cardPostListComponent.js @@ -9,9 +9,7 @@ import { theme as CustomTheme } from "../../tailwind.config" const PostCardList = ({ post }) => { const data = useStaticQuery(graphql` query { - desktop: file( - relativePath: { eq: "elsalvadorconectado-cover.png" } - ) { + desktop: file(relativePath: { eq: "elsalvadorconectado-cover.png" }) { childImageSharp { fluid(quality: 90, maxWidth: 1920) { ...GatsbyImageSharpFluid_withWebp @@ -22,9 +20,15 @@ const PostCardList = ({ post }) => { `) const coverDefault = data.desktop.childImageSharp.fluid.src - const cover = post.featuredImage ? post.featuredImage.mediaItemUrl : coverDefault + const cover = post.featuredImage + ? post.featuredImage.mediaItemUrl + : coverDefault const date = moment(post.date).format("DD MMM YYYY") - const author = `${_.get(post, "author.name", "")} ${_.get(post, "author.lastname", "")}` + const author = `${_.get(post, "author.name", "")} ${_.get( + post, + "author.lastname", + "" + )}` return ( @@ -37,18 +41,14 @@ const PostCardList = ({ post }) => { />
- { post.title } + {post.title} - - { author } - + {author}  ·  - - { date } - + {date} {post.tags.edges && (
@@ -58,10 +58,7 @@ const PostCardList = ({ post }) => { className="card__details__tags__element" key={tag.node.id} > - - # - {tag.node.name} - + #{tag.node.name} ))}
diff --git a/src/components/footer.js b/src/components/footer.js index cc5676a..3f88e27 100644 --- a/src/components/footer.js +++ b/src/components/footer.js @@ -99,38 +99,38 @@ const StyledFooter = styled.div` } } -@media (min-width: ${CustomTheme.extend.screens.laptop}) { - .footer__container { - ${tw`flex-row py-10`} + @media (min-width: ${CustomTheme.extend.screens.laptop}) { + .footer__container { + ${tw`flex-row py-10`} - &__logo { - ${tw`w-1/2`} + &__logo { + ${tw`w-1/2`} - &__img { - ${tw`mb-0`} + &__img { + ${tw`mb-0`} + } } - } - &__text { - ${tw`w-1/2`} + &__text { + ${tw`w-1/2`} - &__menu { - ${tw`flex-row justify-end`} + &__menu { + ${tw`flex-row justify-end`} - &__element { - ${tw`ml-4`} + &__element { + ${tw`ml-4`} + } } - } - &__social { - ${tw`flex-row justify-end`} + &__social { + ${tw`flex-row justify-end`} - &__element { - ${tw`text-right text-2xl`} + &__element { + ${tw`text-right text-2xl`} + } } } } } -} ` export default Footer diff --git a/src/components/header.js b/src/components/header.js index db235c4..399f37c 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -13,7 +13,11 @@ const blueTransparentColor = "rgba(23, 72, 237, 0.85)" const Header = ({ data = {}, headerVh = 100 }) => { const height = headerVh const page = _.get(data, "wpgraphql.page", {}) - const header = _.get(data, "wpgraphql.page.customFields.bodySectionHeader", {}) + const header = _.get( + data, + "wpgraphql.page.customFields.bodySectionHeader", + {} + ) const firstSlogan = _.get(header, "firstSlogan", "") const secondSlogan = _.get(header, "secondSlogan", "") const joinButton = _.get(header, "joinButton", { tex: "", href: "" }) @@ -37,7 +41,11 @@ const Header = ({ data = {}, headerVh = 100 }) => { {(theme) => (
-
@@ -51,12 +59,8 @@ const Header = ({ data = {}, headerVh = 100 }) => { {/* */} {!page && (
- - {errorMessageTitle} - -
-                      { errorMessageBody }
-                    
+ {errorMessageTitle} +
{errorMessageBody}
)} {page && ( @@ -75,7 +79,7 @@ const Header = ({ data = {}, headerVh = 100 }) => { target="_blank" rel="noopener noreferrer" > - { joinButton.text } + {joinButton.text}
)} @@ -86,7 +90,7 @@ const Header = ({ data = {}, headerVh = 100 }) => { target="_blank" rel="noopener noreferrer" > - { _.get(backgroundImage, "authorName", "") } + {_.get(backgroundImage, "authorName", "")}
)} diff --git a/src/components/layout.js b/src/components/layout.js index 29cc092..1ce314f 100644 --- a/src/components/layout.js +++ b/src/components/layout.js @@ -11,16 +11,13 @@ const Layout = ({ children, data, headerVh }) => ( {(theme) => (
-
- {children} -
+
{children}
)}
) - Layout.propTypes = { children: PropTypes.node.isRequired } diff --git a/src/components/postsListComponent.js b/src/components/postsListComponent.js index 97968a2..aaaf989 100644 --- a/src/components/postsListComponent.js +++ b/src/components/postsListComponent.js @@ -14,16 +14,19 @@ const PostsListComponent = ({ data, typeList }) => ( />
-

+

{!data.wpgraphql[typeList].posts.edges && ( -

- No hay publicaciones disponibles -

+

+ No hay publicaciones disponibles +

)} - {data.wpgraphql[typeList].posts.edges - && data.wpgraphql[typeList].posts.edges.map(({ node }) => ( - - ))} + {data.wpgraphql[typeList].posts.edges && + data.wpgraphql[typeList].posts.edges.map(({ node }) => ( + + ))}

diff --git a/src/components/seo.js b/src/components/seo.js index 6f0b929..3e3d13e 100644 --- a/src/components/seo.js +++ b/src/components/seo.js @@ -10,9 +10,7 @@ import PropTypes from "prop-types" import Helmet from "react-helmet" import { useStaticQuery, graphql } from "gatsby" -function SEO({ - description, lang, meta, title -}) { +function SEO({ description, lang, meta, title }) { const { site } = useStaticQuery( graphql` query { diff --git a/src/context/ThemeContext.js b/src/context/ThemeContext.js index 05b59fc..2704003 100644 --- a/src/context/ThemeContext.js +++ b/src/context/ThemeContext.js @@ -7,7 +7,8 @@ const defaultState = { const ThemeContext = React.createContext(defaultState) // Getting dark mode information from OS! // You need macOS Mojave + Safari Technology Preview Release 68 to test this currently. -const supportsDarkMode = () => window.matchMedia("(prefers-color-scheme: dark)").matches === true +const supportsDarkMode = () => + window.matchMedia("(prefers-color-scheme: dark)").matches === true class ThemeProvider extends React.Component { state = { dark: false diff --git a/src/pages/index.js b/src/pages/index.js index f39d4e2..a1258a8 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -10,9 +10,21 @@ import SEO from "../components/seo" const IndexPage = ({ data }) => { const page = _.get(data, "wpgraphql.page", {}) - const sectionMotivations = _.get(data, "wpgraphql.page.customFields.bodySectionMotivations", {}) - const sectionAboutUs = _.get(data, "wpgraphql.page.customFields.bodySectionAboutUs", {}) - const sectionInitiatives = _.get(data, "wpgraphql.page.customFields.bodySectionInitiatives", {}) + const sectionMotivations = _.get( + data, + "wpgraphql.page.customFields.bodySectionMotivations", + {} + ) + const sectionAboutUs = _.get( + data, + "wpgraphql.page.customFields.bodySectionAboutUs", + {} + ) + const sectionInitiatives = _.get( + data, + "wpgraphql.page.customFields.bodySectionInitiatives", + {} + ) const notFoundPageMessageError = "No existe la página solicitada" return ( // headerVh = vh units of the Viewport @@ -21,24 +33,25 @@ const IndexPage = ({ data }) => {
{!page && ( - { notFoundPageMessageError } + {notFoundPageMessageError} )} {page && (

- { _.get(sectionMotivations, "title", "") } + {_.get(sectionMotivations, "title", "")}

- { _.get(sectionMotivations, "firstDescription", "") } + {_.get(sectionMotivations, "firstDescription", "")} - { _.get(sectionMotivations, "secondDescription", "") } + {_.get(sectionMotivations, "secondDescription", "")}
- { - _.map(_.get(sectionMotivations, "motivationsList", []), (m) => ( + {_.map( + _.get(sectionMotivations, "motivationsList", []), + (m) => (
{ />
- { m.text } + {m.text}
- )) - } + ) + )}
@@ -65,7 +78,7 @@ const IndexPage = ({ data }) => {

- { _.get(sectionAboutUs, "title", "") } + {_.get(sectionAboutUs, "title", "")}

- { _.get(sectionAboutUs, "firstDescription", "") } + {_.get(sectionAboutUs, "firstDescription", "")} - { _.get(sectionAboutUs, "secondDescription", "") } + {_.get(sectionAboutUs, "secondDescription", "")} - { _.get(sectionAboutUs, "moreButton.text", "") } + {_.get(sectionAboutUs, "moreButton.text", "")}
@@ -103,7 +116,7 @@ const IndexPage = ({ data }) => { target="_blank" rel="noopener noreferrer" > - { _.get(sectionAboutUs, "image.authorName", "") } + {_.get(sectionAboutUs, "image.authorName", "")}
@@ -114,19 +127,19 @@ const IndexPage = ({ data }) => {

- { _.get(sectionInitiatives, "title", "") } + {_.get(sectionInitiatives, "title", "")}

- { _.get(sectionInitiatives, "firstDescription", "") } + {_.get(sectionInitiatives, "firstDescription", "")} - { _.get(sectionInitiatives, "secondDescription", "") } + {_.get(sectionInitiatives, "secondDescription", "")} - { _.get(sectionInitiatives, "moreButton.text", "") } + {_.get(sectionInitiatives, "moreButton.text", "")}
@@ -181,52 +194,52 @@ const StyleSectionMotivations = styled.div` } } -@media (min-width: ${CustomTheme.extend.screens.tablet}) { - .motivations { - ${tw`pb-12`} + @media (min-width: ${CustomTheme.extend.screens.tablet}) { + .motivations { + ${tw`pb-12`} - &__list { - ${tw`flex-row`} + &__list { + ${tw`flex-row`} - &__item { - ${tw`w-full`} + &__item { + ${tw`w-full`} - &__icon { - ${tw`h-20 w-20`} - } + &__icon { + ${tw`h-20 w-20`} + } - &__text { - ${tw`text-sm`} + &__text { + ${tw`text-sm`} + } } } } } -} -@media (min-width: ${CustomTheme.extend.screens.laptop}) { - .motivations { - ${tw`pb-16`} + @media (min-width: ${CustomTheme.extend.screens.laptop}) { + .motivations { + ${tw`pb-16`} - &__list { - &__item { - ${tw`px-4`} - &__text { - ${tw`text-base`} + &__list { + &__item { + ${tw`px-4`} + &__text { + ${tw`text-base`} + } } } } } -} -@media (min-width: ${CustomTheme.extend.screens.desktop}) { - .motivations { - &__list { - &__item { - ${tw`px-8`} + @media (min-width: ${CustomTheme.extend.screens.desktop}) { + .motivations { + &__list { + &__item { + ${tw`px-8`} + } } } } -} ` const StyleSectionAboutUs = styled.div` .aboutus { @@ -357,11 +370,11 @@ const StyleSectionInitiatives = styled.div` } } -@media (min-width: ${CustomTheme.extend.screens.laptop}) { - .initiatives { - ${tw`text-left`} + @media (min-width: ${CustomTheme.extend.screens.laptop}) { + .initiatives { + ${tw`text-left`} + } } -} ` export default IndexPage diff --git a/src/templates/blog-page-template.js b/src/templates/blog-page-template.js index d2d8305..b728925 100644 --- a/src/templates/blog-page-template.js +++ b/src/templates/blog-page-template.js @@ -10,20 +10,25 @@ import Layout from "../components/layout" import SEO from "../components/seo" const BlogPageTemplate = ({ data }) => { - const { wpgraphql: { post } } = data + const { + wpgraphql: { post } + } = data const date = moment(post.date).format("DD MMM YYYY") - const author = `${_.get(post, "author.name", "")} ${_.get(post, "author.lastname", "")}` + const author = `${_.get(post, "author.name", "")} ${_.get( + post, + "author.lastname", + "" + )}` return ( - +
{post.featuredImage && (
@@ -34,15 +39,11 @@ const BlogPageTemplate = ({ data }) => { />
- - { author } - + {author}  ·  - - { date } - + {date}
{post.tags.edges && (
@@ -52,10 +53,7 @@ const BlogPageTemplate = ({ data }) => { className="publication__details__tags__element" key={tag.node.id} > - - # - {tag.node.name} - + #{tag.node.name} ))}
From db3a37fa03299b82020601e34a40c968c1c7d8d8 Mon Sep 17 00:00:00 2001 From: moudev Date: Fri, 24 Apr 2020 09:32:35 -0600 Subject: [PATCH 6/9] Update blog and page templates, one file for each type - Adding page-template with the difference that this template doesn't show the title and author information --- gatsby-node.js | 4 +- ...blog-page-template.js => blog-template.js} | 0 src/templates/page-template.js | 64 +++++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) rename src/templates/{blog-page-template.js => blog-template.js} (100%) create mode 100644 src/templates/page-template.js diff --git a/gatsby-node.js b/gatsby-node.js index 607323e..f4f6f32 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -34,7 +34,7 @@ exports.createPages = async ({ graphql, actions }) => { postResults.data.wpgraphql.posts.edges.forEach(({ node }) => { createPage({ path: node.slug, - component: path.resolve("./src/templates/blog-page-template.js"), + component: path.resolve("./src/templates/blog-template.js"), context: { // This is the $slug variable // passed to blog-post.js @@ -75,7 +75,7 @@ exports.createPages = async ({ graphql, actions }) => { pageResults.data.wpgraphql.pages.edges.forEach(({ node }) => { createPage({ path: node.slug, - component: path.resolve("./src/templates/blog-page-template.js"), + component: path.resolve("./src/templates/page-template.js"), context: { // This is the $slug variable // passed to blog-post.js diff --git a/src/templates/blog-page-template.js b/src/templates/blog-template.js similarity index 100% rename from src/templates/blog-page-template.js rename to src/templates/blog-template.js diff --git a/src/templates/page-template.js b/src/templates/page-template.js new file mode 100644 index 0000000..5a6c92d --- /dev/null +++ b/src/templates/page-template.js @@ -0,0 +1,64 @@ +import React from "react" +import { graphql } from "gatsby" + +import Layout from "../components/layout" +import SEO from "../components/seo" + +const BlogPageTemplate = ({ data }) => { + const { + wpgraphql: { post } + } = data + return ( + + +
+
+
+
+
+ + ) +} + +export default BlogPageTemplate + +export const query = graphql` + query($databaseId: ID!) { + wpgraphql { + post(id: $databaseId, idType: DATABASE_ID) { + title + date + content(format: RENDERED) + categories { + edges { + node { + name + } + } + } + author { + name + lastName + } + tags { + edges { + node { + name + slug + } + } + } + excerpt(format: RENDERED) + featuredImage { + altText + title(format: RENDERED) + mediaItemUrl + slug + } + } + } + } +` From 86d195b98643672a1a5edc4cf442d3e355d55a30 Mon Sep 17 00:00:00 2001 From: moudev Date: Sat, 25 Apr 2020 23:33:56 -0600 Subject: [PATCH 7/9] Add menu component to display menu options in a top navbar The header component only will be displayed on the main page of the website. The menu component has a scroll eventListener, this event is to set the menu background when the route is "/" because the menu component won't have background and image when is in the top of the page, in the other pages, the menu will have background and image and the scroll eventListener will be disabled. - Updating menu component file - Updating layout component to receive showHeader prop - Updating the page-template to display the title page --- src/components/header.js | 15 +- src/components/layout.css | 25 --- src/components/layout.js | 12 +- src/components/menu.js | 397 ++++++++++++++++++++++++++++++--- src/pages/index.js | 2 +- src/templates/page-template.js | 20 +- tailwind.config.js | 6 +- 7 files changed, 405 insertions(+), 72 deletions(-) diff --git a/src/components/header.js b/src/components/header.js index 399f37c..697ae84 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -10,7 +10,7 @@ import ElSalvadorConectadoLogo from "../images/elsalvadorconectado-logo.svg" const blueTransparentColor = "rgba(23, 72, 237, 0.85)" -const Header = ({ data = {}, headerVh = 100 }) => { +const Header = ({ data, headerVh }) => { const height = headerVh const page = _.get(data, "wpgraphql.page", {}) const header = _.get( @@ -39,15 +39,8 @@ const Header = ({ data = {}, headerVh = 100 }) => { >
- {(theme) => ( + {() => (
-
( +const Layout = ({ children, data, headerVh, showHeader, inspectScroll }) => ( {(theme) => (
-
+ + {showHeader &&
}
{children}
@@ -18,8 +19,9 @@ const Layout = ({ children, data, headerVh }) => (
) -Layout.propTypes = { - children: PropTypes.node.isRequired +Layout.defaultProps = { + headerVh: 100, + showHeader: false } export default Layout diff --git a/src/components/menu.js b/src/components/menu.js index 5085be2..e4cab54 100644 --- a/src/components/menu.js +++ b/src/components/menu.js @@ -1,12 +1,373 @@ import React from "react" import { StaticQuery, graphql, Link } from "gatsby" +import styled from "styled-components" +import tw from "twin.macro" +import _ from "lodash" -export default () => ( +import { theme as CustomTheme } from "../../tailwind.config" +import ElSalvadorConectadoLogo from "../images/elsalvadorconectado-logo.svg" + +class Menu extends React.Component { + state = { + classNameBg: "", + showMobile: false + } + + componentDidMount() { + window.addEventListener("scroll", this.handleScroll) + + const { inspectScroll } = this.props + if (!inspectScroll) { + this.setState({ classNameBg: "--bg-blue" }) + } + } + + handleScroll = () => { + const { classNameBg } = this.state + const { inspectScroll } = this.props + if (inspectScroll) { + if (window.pageYOffset > 500) { + this.setState({ classNameBg: "--bg-blue" }) + } else if (classNameBg) { + this.setState({ classNameBg: "--not-bg" }) + } + } else { + this.setState({ classNameBg: "--bg-blue" }) + } + } + + handleMobileList = () => { + const { showMobile } = this.state + this.setState({ showMobile: !showMobile }) + } + + handleSubMenu = (param) => { + if (param.target.nodeName === "I") { + param.target.parentNode.parentNode.parentNode.classList.remove("--show") + } else if (param.target.lastChild.nodeName === "UL") { + param.target.lastChild.classList.add("--show") + } + } + + render() { + const { data } = this.props + const { classNameBg, showMobile } = this.state + const menuItems = _.get(data, "wpgraphql.menuItems") + return ( + + + + + ) + } +} + +const StyledWrapper = styled.div` + z-index: 2; + ${tw`fixed w-full`} + ${tw`font-poppins`} + + &.--bg-blue { + ${tw`bg-baseBlue`} + } + + &.--not-bg { + ${tw`bg-transparent`} + } + + .menu__mobile { + ${tw`justify-between py-4`} + + &__logo { + ${tw`h-8`} + + img { + ${tw`h-full`} + } + } + + &__bar-icon { + ${tw`text-3xl`} + ${tw`self-end`} + } + + &__list { + ${tw`invisible bg-baseBlue`} + ${tw`fixed w-full h-full inset-0 flex flex-col p-4`} + transition: transform 0.35s, opacity 0.45s, visibility 0.45s; + transform: translate(0, -100%); + opacity: 0; + + &.--show { + ${tw`visible`} + transform: translate(0); + opacity: 1; + } + + &__item { + border-color: rgba(255, 255, 255, 0.3); + ${tw`flex justify-center items-center border-b`} + + &.--has-items::after { + content: "\f105"; + font-family: fontAwesome; + ${tw`text-xl`} + } + + &.--close { + ${tw`text-3xl`} + ${tw`self-end border-b-0`} + } + + &__container { + ${tw`w-full`} + ${tw`text-left`} + } + + &__href { + ${tw`py-4`} + } + + &__sub-menu { + ${tw`invisible bg-baseBlue`} + ${tw`fixed w-full h-full inset-0 flex flex-col p-4`} + transition: transform 0.35s, opacity 0.45s, visibility 0.45s; + transform: translate(105%, 0); + opacity: 0; + z-index: 2; + + &.--show { + ${tw`visible`} + transform: translate(0); + opacity: 1; + } + + &__item { + border-color: rgba(255, 255, 255, 0.3); + ${tw`flex justify-start items-center border-b`} + ${tw`text-left`} + + &.--close { + ${tw`text-3xl`} + ${tw`justify-end border-b-0`} + } + + &__href { + ${tw`w-full py-4`} + } + } + } + } + } + } + + .menu { + ${tw`hidden`} + } + + @media (min-width: ${CustomTheme.extend.screens.laptop}) { + .menu { + ${tw`text-sm`} + ${tw`flex justify-between items-center py-4`} + + &__logo { + ${tw`h-8`} + + img { + ${tw`h-full`} + } + } + + &__list { + ${tw`text-xs`} + + &__item { + ${tw`flex justify-end items-center relative mb-0 mr-4`} + + &.--has-items::after { + content: "\f107"; + font-family: fontAwesome; + margin-left: 5px; + } + + &:hover { + ${tw`underline`} + } + + &:hover > ul { + opacity: 1; + ${tw`visible`} + } + + &__sub-menu__list { + ${tw`text-blue text-xs`} + ${tw`invisible absolute bg-white rounded p-2 pb-0 border-b-4 border-blue`} + ${tw`flex flex-col justify-center`} + width: 250px; + top: 30px; + opacity: 0; + box-shadow: 1px 1px 30px rgba(0, 0, 0, 0.08); + transition: transform 0.35s, visibility 0.35s, opacity 0.35s; + + &__item { + ${tw`text-right`} + ${tw`border-b pb-2`} + + &:hover > [class*="__href"]{ + ${tw`underline`} + } + + &__href { + ${tw`text-blue text-right`} + } + } + } + } + } + } + + .menu__mobile { + ${tw`hidden`} + } + } +` + +export default ({ inspectScroll }) => ( ( } } `} - render={(data) => ( - - )} + render={(data) => } /> ) + +Menu.defaultProps = { + data: {}, + inspectScroll: false +} diff --git a/src/pages/index.js b/src/pages/index.js index a1258a8..8760bad 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -28,7 +28,7 @@ const IndexPage = ({ data }) => { const notFoundPageMessageError = "No existe la página solicitada" return ( // headerVh = vh units of the Viewport - +
{!page && ( diff --git a/src/templates/page-template.js b/src/templates/page-template.js index 5a6c92d..00f63e3 100644 --- a/src/templates/page-template.js +++ b/src/templates/page-template.js @@ -1,5 +1,7 @@ import React from "react" import { graphql } from "gatsby" +import styled from "styled-components" +import tw from "twin.macro" import Layout from "../components/layout" import SEO from "../components/seo" @@ -11,18 +13,32 @@ const BlogPageTemplate = ({ data }) => { return ( -
+
+

-

+
) } +const LayoutWrapper = styled.div` + .publication { + ${tw`pt-12`} + + &__title { + ${tw`font-semibold mb-8`} + } + } +` + export default BlogPageTemplate export const query = graphql` diff --git a/tailwind.config.js b/tailwind.config.js index aeeca29..cf648a9 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -8,7 +8,8 @@ module.exports = { separator: "#D6DFE0" }, backgroundColor: (theme) => ({ - gray: theme("colors.gray") + gray: theme("colors.gray"), + baseBlue: theme("colors.blue") }), textColor: (theme) => ({ gray: theme("colors.graytext"), @@ -26,7 +27,8 @@ module.exports = { "10xl": "8rem" }, borderColor: (theme) => ({ - separator: theme("colors.separator") + separator: theme("colors.separator"), + blue: theme("colors.blue") }), // https://tailwindcss.com/docs/breakpoints // https://tailwindcss.com/docs/container From 3bb1ba5739edc5c7c96b6f774a728ae6b3871526 Mon Sep 17 00:00:00 2001 From: moudev Date: Mon, 27 Apr 2020 21:49:48 -0600 Subject: [PATCH 8/9] Update graphql query and HTML structure of the menu component options --- src/components/footer.js | 10 +- src/components/layoutPreview.scss | 18 ++-- src/components/menu.js | 152 +++++++++++++++++++++++------- src/templates/page-template.js | 2 +- 4 files changed, 138 insertions(+), 44 deletions(-) diff --git a/src/components/footer.js b/src/components/footer.js index 3f88e27..b9407df 100644 --- a/src/components/footer.js +++ b/src/components/footer.js @@ -87,13 +87,17 @@ const StyledFooter = styled.div` &__menu { ${tw`flex flex-col justify-center items-center my-4`} ${tw`font-medium`} + + &__element { + ${tw`my-2`} + } } &__social { ${tw`flex justify-center items-center`} &__element { - ${tw`text-center text-3xl`} + ${tw`text-center text-3xl mx-4`} } } } @@ -118,7 +122,7 @@ const StyledFooter = styled.div` ${tw`flex-row justify-end`} &__element { - ${tw`ml-4`} + ${tw`ml-4 my-0`} } } @@ -126,7 +130,7 @@ const StyledFooter = styled.div` ${tw`flex-row justify-end`} &__element { - ${tw`text-right text-2xl`} + ${tw`text-right text-2xl ml-8 mr-0`} } } } diff --git a/src/components/layoutPreview.scss b/src/components/layoutPreview.scss index c7830fe..e4d26f5 100644 --- a/src/components/layoutPreview.scss +++ b/src/components/layoutPreview.scss @@ -10,7 +10,7 @@ h6 { line-height: 1.5; @apply font-montserrat font-medium; - @apply mt-5 mb-4; + @apply mt-10 mb-4; } h1, @@ -139,16 +139,20 @@ @apply italic; } - [class*="center"] { - @apply text-center; + figure { + @apply flex flex-col justify-center items-start; } - [class*="left"] { - @apply text-left; + figure[class*="center"] { + @apply items-center; } - [class*="right"] { - @apply text-right; + figure[class*="left"] { + @apply items-start; + } + + figure[class*="right"] { + @apply items-end; } img[class*="center"], diff --git a/src/components/menu.js b/src/components/menu.js index e4cab54..f31ec33 100644 --- a/src/components/menu.js +++ b/src/components/menu.js @@ -87,17 +87,33 @@ class Menu extends React.Component { onClick={this.handleSubMenu} className="menu__mobile__list__item__container" > + {/* eslint-disable-next-line */} {node.url !== "#" ? ( - - {node.label} - + node.connectedObject.slug || node.url === "/" ? ( + + {node.label} + + ) : ( + + {node.label} + + ) ) : ( -
+ {node.label} -
+ )} {_.get(node, "childItems.edges") && (
    @@ -113,15 +129,38 @@ class Menu extends React.Component { {_.map(node.childItems.edges, ({ node: node_ }) => (
  • - - {node_.label} - + {/* eslint-disable-next-line */} + {node_.url !== "#" ? ( + node_.connectedObject.slug || + node_.url === "/" ? ( + + {node_.label} + + ) : ( + + {node_.label} + + ) + ) : ( + + {node_.label} + + )}
  • ))}
@@ -156,29 +195,67 @@ class Menu extends React.Component { "childItems.edges" ) && "--has-items"}`} > + {/* eslint-disable-next-line */} {node.url !== "#" ? ( - - {node.label} - + node.connectedObject.slug || node.url === "/" ? ( + + {node.label} + + ) : ( + + {node.label} + + ) ) : ( -
{node.label}
+ {node.label} )} {_.get(node, "childItems.edges") && (
    {_.map(node.childItems.edges, ({ node: node_ }) => (
  • - - {node_.label} - + {/* eslint-disable-next-line */} + {node_.url !== "#" ? ( + node_.connectedObject.slug || node_.url === "/" ? ( + + {node_.label} + + ) : ( + + {node_.label} + + ) + ) : ( + + {node_.label} + + )}
  • ))}
@@ -254,10 +331,14 @@ const StyledWrapper = styled.div` ${tw`text-left`} } - &__href { + &__href, &__text { ${tw`py-4`} } + &__text { + ${tw`inline-block`} + } + &__sub-menu { ${tw`invisible bg-baseBlue`} ${tw`fixed w-full h-full inset-0 flex flex-col p-4`} @@ -282,9 +363,13 @@ const StyledWrapper = styled.div` ${tw`justify-end border-b-0`} } - &__href { + &__href, &__text { ${tw`w-full py-4`} } + + &__text { + ${tw`inline-block`} + } } } } @@ -312,7 +397,8 @@ const StyledWrapper = styled.div` ${tw`text-xs`} &__item { - ${tw`flex justify-end items-center relative mb-0 mr-4`} + ${tw`flex justify-end items-center relative mb-0 ml-4`} + ${tw`cursor-pointer`} &.--has-items::after { content: "\f107"; @@ -367,7 +453,7 @@ export default ({ inspectScroll }) => ( query={graphql` query MenuQuery { wpgraphql { - menuItems(where: { location: MENU_1 }) { + menuItems(where: { location: PRIMARY }) { edges { node { label diff --git a/src/templates/page-template.js b/src/templates/page-template.js index 00f63e3..6ab70eb 100644 --- a/src/templates/page-template.js +++ b/src/templates/page-template.js @@ -34,7 +34,7 @@ const LayoutWrapper = styled.div` ${tw`pt-12`} &__title { - ${tw`font-semibold mb-8`} + ${tw`font-semibold mt-6 mb-8`} } } ` From 6c251da65f18d77b1ff34837b8d058058c52ebc9 Mon Sep 17 00:00:00 2001 From: moudev Date: Thu, 30 Apr 2020 23:15:37 -0600 Subject: [PATCH 9/9] Update 404 page design - Adding 404 image --- src/images/404.png | Bin 0 -> 48384 bytes src/pages/404.js | 31 +++++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/images/404.png diff --git a/src/images/404.png b/src/images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..1055e981302ae0887a8deb32cca7b861b7b9aa05 GIT binary patch literal 48384 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 J@@FPN{}0J#s}%qM literal 0 HcmV?d00001 diff --git a/src/pages/404.js b/src/pages/404.js index bc4c31d..8e21188 100644 --- a/src/pages/404.js +++ b/src/pages/404.js @@ -1,14 +1,41 @@ import React from "react" +import styled from "styled-components" +import tw from "twin.macro" +import { theme as CustomTheme } from "../../tailwind.config" import Layout from "../components/layout" import SEO from "../components/seo" +import notFoundImage from "../images/404.png" const NotFoundPage = () => ( -

NOT FOUND

-

You just hit a route that doesn't exist... the sadness.

+ + No encontrado +

No encontrado

+

+ El contenido solicitado no está disponible. +

+
) +const StyledWrapper = styled.div` + ${tw`flex flex-col justify-center items-center`} + ${tw`font-montserrat`} + ${tw`mt-20`} + + @media (min-width: ${CustomTheme.extend.screens.laptop}) { + .not-found { + &__image { + ${tw`w-2/6`} + } + } + } +` + export default NotFoundPage