From 7783edb6ae7c77b3cf1b6cb3525a2ec092bef0fe Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 22 Jul 2019 14:32:27 +0200 Subject: [PATCH 01/12] create Gatsby --- .gitignore | 65 ++ global-site/.editorconfig | 26 + global-site/.eslintignore | 3 + global-site/.eslintrc.js | 59 + global-site/.ghost.json | 10 + .../.github/ISSUE_TEMPLATE/---bug-report.md | 36 + .../.github/ISSUE_TEMPLATE/--anything-else.md | 25 + global-site/.gitignore | 75 ++ global-site/LICENSE | 22 + global-site/README.md | 85 ++ global-site/gatsby-browser.js | 32 + global-site/gatsby-config.js | 184 +++ global-site/gatsby-node.js | 210 ++++ global-site/netlify.toml | 6 + global-site/package.json | 57 + .../gatsby-plugin-ghost-manifest/.babelrc | 10 + .../gatsby-plugin-ghost-manifest/common.js | 55 + .../gatsby-node.js | 104 ++ .../gatsby-ssr.js | 61 + .../gatsby-plugin-ghost-manifest/index.js | 1 + .../gatsby-plugin-ghost-manifest/package.json | 36 + .../src/common.js | 62 + .../src/gatsby-node.js | 71 ++ .../src/gatsby-ssr.js | 67 ++ global-site/src/components/common/Layout.js | 133 +++ .../src/components/common/Navigation.js | 41 + .../src/components/common/Pagination.js | 36 + global-site/src/components/common/PostCard.js | 59 + global-site/src/components/common/index.js | 4 + .../src/components/common/meta/ArticleMeta.js | 167 +++ .../src/components/common/meta/AuthorMeta.js | 93 ++ .../src/components/common/meta/ImageMeta.js | 26 + .../src/components/common/meta/MetaData.js | 118 ++ .../src/components/common/meta/WebsiteMeta.js | 107 ++ .../common/meta/getAuthorProperties.js | 37 + .../src/components/common/meta/index.js | 1 + global-site/src/images/ghost-icon.png | Bin 0 -> 7935 bytes global-site/src/pages/404.js | 18 + global-site/src/styles/app.css | 1018 +++++++++++++++++ global-site/src/templates/author.js | 96 ++ global-site/src/templates/index.js | 65 ++ global-site/src/templates/page.js | 64 ++ global-site/src/templates/post.js | 70 ++ global-site/src/templates/tag.js | 78 ++ global-site/src/utils/fragments.js | 239 ++++ global-site/src/utils/rss/generate-feed.js | 121 ++ global-site/src/utils/siteConfig.js | 16 + global-site/static/_headers | 18 + global-site/static/_redirects | 5 + global-site/static/favicon.ico | Bin 0 -> 15086 bytes global-site/static/favicon.png | Bin 0 -> 6792 bytes global-site/static/images/icons/avatar.svg | 1 + global-site/static/images/icons/facebook.svg | 1 + global-site/static/images/icons/rss.svg | 1 + global-site/static/images/icons/twitter.svg | 1 + global-site/static/images/logo.svg | 1 + global-site/static/robots.txt | 2 + package.json | 21 + 58 files changed, 4020 insertions(+) create mode 100644 .gitignore create mode 100644 global-site/.editorconfig create mode 100644 global-site/.eslintignore create mode 100644 global-site/.eslintrc.js create mode 100644 global-site/.ghost.json create mode 100644 global-site/.github/ISSUE_TEMPLATE/---bug-report.md create mode 100644 global-site/.github/ISSUE_TEMPLATE/--anything-else.md create mode 100644 global-site/.gitignore create mode 100755 global-site/LICENSE create mode 100755 global-site/README.md create mode 100755 global-site/gatsby-browser.js create mode 100755 global-site/gatsby-config.js create mode 100755 global-site/gatsby-node.js create mode 100644 global-site/netlify.toml create mode 100755 global-site/package.json create mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/.babelrc create mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/common.js create mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-node.js create mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-ssr.js create mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/index.js create mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/package.json create mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/src/common.js create mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-node.js create mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-ssr.js create mode 100644 global-site/src/components/common/Layout.js create mode 100644 global-site/src/components/common/Navigation.js create mode 100644 global-site/src/components/common/Pagination.js create mode 100644 global-site/src/components/common/PostCard.js create mode 100644 global-site/src/components/common/index.js create mode 100644 global-site/src/components/common/meta/ArticleMeta.js create mode 100644 global-site/src/components/common/meta/AuthorMeta.js create mode 100644 global-site/src/components/common/meta/ImageMeta.js create mode 100644 global-site/src/components/common/meta/MetaData.js create mode 100644 global-site/src/components/common/meta/WebsiteMeta.js create mode 100644 global-site/src/components/common/meta/getAuthorProperties.js create mode 100644 global-site/src/components/common/meta/index.js create mode 100644 global-site/src/images/ghost-icon.png create mode 100755 global-site/src/pages/404.js create mode 100644 global-site/src/styles/app.css create mode 100755 global-site/src/templates/author.js create mode 100755 global-site/src/templates/index.js create mode 100755 global-site/src/templates/page.js create mode 100755 global-site/src/templates/post.js create mode 100755 global-site/src/templates/tag.js create mode 100644 global-site/src/utils/fragments.js create mode 100644 global-site/src/utils/rss/generate-feed.js create mode 100644 global-site/src/utils/siteConfig.js create mode 100644 global-site/static/_headers create mode 100644 global-site/static/_redirects create mode 100644 global-site/static/favicon.ico create mode 100644 global-site/static/favicon.png create mode 100644 global-site/static/images/icons/avatar.svg create mode 100644 global-site/static/images/icons/facebook.svg create mode 100644 global-site/static/images/icons/rss.svg create mode 100644 global-site/static/images/icons/twitter.svg create mode 100644 global-site/static/images/logo.svg create mode 100755 global-site/static/robots.txt create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6811179 --- /dev/null +++ b/.gitignore @@ -0,0 +1,65 @@ + +packages/*/yarn.lock +packages/*/package-lock.json + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +junit.xml + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules +examples/biz-website/public/ +examples/blog/public/ +*.un~ +dist +bin/published.js + +# Build Path of Test Fixtures +test/**/public +.gatsby-context.js +.DS_Store +public/ +node_modules/ +.cache/ +.netlify + +# IDE specific +.idea/ +.vscode/ +*.sw* + +# misc +.serverless/ + +# lock files +yarn.lock +package-lock.json + +# starters are special; we want to persist the lock files +!starters/*/package-lock.json +!themes/gatsby-starter-blog-theme/package-lock.json +!themes/gatsby-starter-notes-theme/package-lock.json +!themes/gatsby-starter-theme/package-lock.json +!themes/gatsby-starter-theme-workspace/package-lock.json diff --git a/global-site/.editorconfig b/global-site/.editorconfig new file mode 100644 index 0000000..a2a28b4 --- /dev/null +++ b/global-site/.editorconfig @@ -0,0 +1,26 @@ +# http://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.hbs] +insert_final_newline = false + +[*.json] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[Makefile] +indent_style = tab diff --git a/global-site/.eslintignore b/global-site/.eslintignore new file mode 100644 index 0000000..0ec517c --- /dev/null +++ b/global-site/.eslintignore @@ -0,0 +1,3 @@ +public/** +plugins/**/*.js +!plugins/*/src/*.js diff --git a/global-site/.eslintrc.js b/global-site/.eslintrc.js new file mode 100644 index 0000000..8c9d861 --- /dev/null +++ b/global-site/.eslintrc.js @@ -0,0 +1,59 @@ +module.exports = { + 'parser': 'babel-eslint', + 'parserOptions': { + 'ecmaVersion': 6, + 'ecmaFeatures': { + 'jsx': true, + 'experimentalObjectRestSpread': true + } + }, + plugins: ['ghost', 'react'], + extends: [ + 'plugin:ghost/node', + 'plugin:ghost/ember', + 'plugin:react/recommended' + ], + "settings": { + "react": { + "createClass": "createReactClass", + "pragma": "React", + "version": "16.0", + "flowVersion": "0.53" + }, + "propWrapperFunctions": ["forbidExtraProps"] + }, + "rules": { + "ghost/sort-imports-es6-autofix/sort-imports-es6": "off", + "ghost/ember/use-ember-get-and-set": "off", + "no-console": "off", + "no-inner-declarations": "off", + "valid-jsdoc": "off", + "require-jsdoc": "off", + "quotes": ["error", "backtick"], + "consistent-return": ["error"], + "arrow-body-style": [ + "error", + "as-needed", + { "requireReturnForObjectLiteral": true } + ], + "jsx-quotes": ["error", "prefer-double"], + "semi": ["error", "never"], + "object-curly-spacing": ["error", "always"], + "comma-dangle": [ + "error", + { + "arrays": "always-multiline", + "objects": "always-multiline", + "imports": "always-multiline", + "exports": "always-multiline", + "functions": "ignore" + } + ], + "react/prop-types": [ + "error", + { + "ignore": ["children"] + } + ] + } +}; diff --git a/global-site/.ghost.json b/global-site/.ghost.json new file mode 100644 index 0000000..9124d5e --- /dev/null +++ b/global-site/.ghost.json @@ -0,0 +1,10 @@ +{ + "development": { + "apiUrl": "https://gatsby.ghost.io", + "contentApiKey": "9cc5c67c358edfdd81455149d0" + }, + "production": { + "apiUrl": "https://gatsby.ghost.io", + "contentApiKey": "9cc5c67c358edfdd81455149d0" + } +} diff --git a/global-site/.github/ISSUE_TEMPLATE/---bug-report.md b/global-site/.github/ISSUE_TEMPLATE/---bug-report.md new file mode 100644 index 0000000..9879e51 --- /dev/null +++ b/global-site/.github/ISSUE_TEMPLATE/---bug-report.md @@ -0,0 +1,36 @@ +--- +name: "\U0001F41B Bug report" +about: Report reproducible software issues so we can improve + +--- + +Welcome to the Gatsby Starter Ghost GitHub repo! ๐Ÿ‘‹๐ŸŽ‰ + +We use GitHub only for bug reports ๐Ÿ› + +Anything else should be posted to https://forum.ghost.org ๐Ÿ‘ซ + +For questions related to the usage of Gatsby or GraphQL, please check out their docs at https://www.gatsbyjs.org/ and https://graphql.org/ + +๐ŸšจFor support, help & questions use https://forum.ghost.org/c/help +๐Ÿ’กFor feature requests & ideas you can post and vote on https://forum.ghost.org/c/Ideas + +If your issue is with Gatsby.js itself, please report it at the Gatsby repo โžก๏ธย https://github.com/gatsbyjs/gatsby/issues/new. + +### Issue Summary + +A summary of the issue and the browser/OS environment in which it occurs. + +### To Reproduce + +1. This is the first step +2. This is the second step, etc. + +Any other info e.g. Why do you consider this to be a bug? What did you expect to happen instead? + +### Technical details: + +* Ghost Version: +* Gatsby Version: +* Node Version: +* OS: diff --git a/global-site/.github/ISSUE_TEMPLATE/--anything-else.md b/global-site/.github/ISSUE_TEMPLATE/--anything-else.md new file mode 100644 index 0000000..c2ae0e2 --- /dev/null +++ b/global-site/.github/ISSUE_TEMPLATE/--anything-else.md @@ -0,0 +1,25 @@ +--- +name: "\U0001F4A1Anything else" +about: "For help, support, features & ideas - please use https://forum.ghost.org \U0001F46B " + +--- + +--------------^ Click "Preview" for a nicer view! + +We use GitHub only for bug reports ๐Ÿ› + +Anything else should be posted to https://forum.ghost.org ๐Ÿ‘ซ. + +๐ŸšจFor support, help & questions use https://forum.ghost.org/c/help +๐Ÿ’กFor feature requests & ideas you can post and vote on https://forum.ghost.org/c/Ideas + +Alternatively, check out these resources below. Thanks! ๐Ÿ˜. + +- [Forum](https://forum.ghost.org/c/help) +- [Gatsby API reference](https://docs.ghost.org/api/gatsby/) +- [Content API Docs](https://docs.ghost.org/api/content/) +- [Gatsby.js](https://www.gatsbyjs.org) +- [GraphQL](https://graphql.org/) +- [Feature Requests / Ideas](https://forum.ghost.org/c/Ideas) +- [Contributing Guide](https://docs.ghost.org/docs/contributing) +- [Self-hoster Docs](https://docs.ghost.org/) diff --git a/global-site/.gitignore b/global-site/.gitignore new file mode 100644 index 0000000..631a24b --- /dev/null +++ b/global-site/.gitignore @@ -0,0 +1,75 @@ +# Node template + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# IDE +.idea/* +*.iml +*.sublime-* + +# OSX +.DS_Store +.vscode + +# Docs Custom +.cache/ +public +yarn-error.log +.netlify/ diff --git a/global-site/LICENSE b/global-site/LICENSE new file mode 100755 index 0000000..bdd5f8d --- /dev/null +++ b/global-site/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2013-2019 Ghost Foundation + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/global-site/README.md b/global-site/README.md new file mode 100755 index 0000000..00dad11 --- /dev/null +++ b/global-site/README.md @@ -0,0 +1,85 @@ +# Gatsby Starter Ghost + +A starter template to build lightning fast websites with [Ghost](https://ghost.org) & [Gatsby](https://gatsbyjs.org) + +**Demo:** https://gatsby.ghost.org + +  + +![gatsby-starter-ghost](https://user-images.githubusercontent.com/120485/50913567-8ab8e380-142c-11e9-9e78-de02ded12fc6.jpg) + +  + + +# Installing + +```bash +# With Gatsby CLI +gatsby new gatsby-starter-ghost https://github.com/TryGhost/gatsby-starter-ghost.git +``` + +```bash +# From Source +git clone https://github.com/TryGhost/gatsby-starter-ghost.git +cd gatsby-starter-ghost +``` + +Then install dependencies + +```bash +yarn +``` + +  + +# Running + +Start the development server. You now have a Gatsby site pulling content from headless Ghost. + +```bash +gatsby develop +``` + +By default, the starter will populate content from a default Ghost install located at https://gatsby.ghost.io. + +To use your own install, edit the `.ghost.json` config file with your credentials. You can find your `contentApiKey` in the "Integrations" screen in Ghost Admin. The minimum required version for Ghost is `2.10.0` in order to use this starter without issues. + +  + +# Deploying with Netlify + +The starter contains three config files specifically for deploying with Netlify. A `netlify.toml` file for build settings, a `/static/_headers` file with default security headers set for all routes, and `/static/_redirects` to set Netlify custom domain redirects. + +To deploy to your Netlify account, hit the button below. + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/TryGhost/gatsby-starter-ghost) + +Content API Keys are generally not considered to be sensitive information, they exist so that they can be changed in the event of abuse; so most people commit it directly to their `.ghost.json` config file. If you prefer to keep this information out of your repository you can remove this config and set [Netlify ENV variables](https://www.netlify.com/docs/continuous-deployment/#build-environment-variables) for production builds instead. + +Once deployed, you can set up a [Ghost + Netlify Integration](https://docs.ghost.org/integrations/netlify/) to use deploy hooks from Ghost to trigger Netlify rebuilds. That way, any time data changes in Ghost, your site will rebuild on Netlify. + +  + +# Optimising + +You can disable the default Ghost Handlebars Theme front-end by enabling the `Make this site private` flag within your Ghost settings. This enables password protection in front of the Ghost install and sets `` so your Gatsby front-end becomes the source of truth for SEO. + +  + +# Extra options + +```bash +# Run a production build, locally +gatsby build + +# Serve a production build, locally +gatsby serve +``` + +Gatsby `develop` uses the `development` config in `.ghost.json` - while Gatsby `build` uses the `production` config. + +  + +# Copyright & License + +Copyright (c) 2013-2019 Ghost Foundation - Released under the [MIT license](LICENSE). diff --git a/global-site/gatsby-browser.js b/global-site/gatsby-browser.js new file mode 100755 index 0000000..abf0eb7 --- /dev/null +++ b/global-site/gatsby-browser.js @@ -0,0 +1,32 @@ +/* eslint-disable */ +/** + * Trust All Scripts + * + * This is a dirty little script for iterating over script tags + * of your Ghost posts and adding them to the document head. + * + * This works for any script that then injects content into the page + * via ids/classnames etc. + * + */ +var trustAllScripts = function () { + var scriptNodes = document.querySelectorAll('.load-external-scripts script'); + + for (var i = 0; i < scriptNodes.length; i += 1) { + var node = scriptNodes[i]; + var s = document.createElement('script'); + s.type = node.type || 'text/javascript'; + + if (node.attributes.src) { + s.src = node.attributes.src.value; + } else { + s.innerHTML = node.innerHTML; + } + + document.getElementsByTagName('head')[0].appendChild(s); + } +}; + +exports.onRouteUpdate = function () { + trustAllScripts(); +}; diff --git a/global-site/gatsby-config.js b/global-site/gatsby-config.js new file mode 100755 index 0000000..cd8ad83 --- /dev/null +++ b/global-site/gatsby-config.js @@ -0,0 +1,184 @@ +const path = require(`path`) + +const config = require(`./src/utils/siteConfig`) +const generateRSSFeed = require(`./src/utils/rss/generate-feed`) + +let ghostConfig + +try { + ghostConfig = require(`./.ghost`) +} catch (e) { + ghostConfig = { + production: { + apiUrl: process.env.GHOST_API_URL, + contentApiKey: process.env.GHOST_CONTENT_API_KEY, + }, + } +} finally { + const { apiUrl, contentApiKey } = process.env.NODE_ENV === `development` ? ghostConfig.development : ghostConfig.production + + if (!apiUrl || !contentApiKey || contentApiKey.match(//)) { + throw new Error(`GHOST_API_URL and GHOST_CONTENT_API_KEY are required to build. Check the README.`) // eslint-disable-line + } +} + +/** +* This is the place where you can tell Gatsby which plugins to use +* and set them up the way you want. +* +* Further info ๐Ÿ‘‰๐Ÿผ https://www.gatsbyjs.org/docs/gatsby-config/ +* +*/ +module.exports = { + siteMetadata: { + siteUrl: config.siteUrl, + }, + plugins: [ + /** + * Content Plugins + */ + { + resolve: `gatsby-source-filesystem`, + options: { + path: path.join(__dirname, `src`, `pages`), + name: `pages`, + }, + }, + // Setup for optimised images. + // See https://www.gatsbyjs.org/packages/gatsby-image/ + { + resolve: `gatsby-source-filesystem`, + options: { + path: path.join(__dirname, `src`, `images`), + name: `images`, + }, + }, + `gatsby-plugin-sharp`, + `gatsby-transformer-sharp`, + { + resolve: `gatsby-source-ghost`, + options: + process.env.NODE_ENV === `development` + ? ghostConfig.development + : ghostConfig.production, + }, + /** + * Utility Plugins + */ + { + resolve: `gatsby-plugin-ghost-manifest`, + options: { + short_name: config.shortTitle, + start_url: `/`, + background_color: config.backgroundColor, + theme_color: config.themeColor, + display: `minimal-ui`, + icon: `static/${config.siteIcon}`, + query: ` + { + allGhostSettings { + edges { + node { + title + description + } + } + } + } + `, + }, + }, + { + resolve: `gatsby-plugin-feed`, + options: { + query: ` + { + allGhostSettings { + edges { + node { + title + description + } + } + } + } + `, + feeds: [ + generateRSSFeed(config), + ], + }, + }, + { + resolve: `gatsby-plugin-advanced-sitemap`, + options: { + query: ` + { + allGhostPost { + edges { + node { + id + slug + updated_at + created_at + feature_image + } + } + } + allGhostPage { + edges { + node { + id + slug + updated_at + created_at + feature_image + } + } + } + allGhostTag { + edges { + node { + id + slug + feature_image + } + } + } + allGhostAuthor { + edges { + node { + id + slug + profile_image + } + } + } + }`, + mapping: { + allGhostPost: { + sitemap: `posts`, + }, + allGhostTag: { + sitemap: `tags`, + }, + allGhostAuthor: { + sitemap: `authors`, + }, + allGhostPage: { + sitemap: `pages`, + }, + }, + exclude: [ + `/dev-404-page`, + `/404`, + `/404.html`, + `/offline-plugin-app-shell-fallback`, + ], + createLinkInHead: true, + }, + }, + `gatsby-plugin-react-helmet`, + `gatsby-plugin-force-trailing-slashes`, + `gatsby-plugin-offline`, + ], +} diff --git a/global-site/gatsby-node.js b/global-site/gatsby-node.js new file mode 100755 index 0000000..e21814d --- /dev/null +++ b/global-site/gatsby-node.js @@ -0,0 +1,210 @@ +const path = require(`path`) +const { postsPerPage } = require(`./src/utils/siteConfig`) +const { paginate } = require(`gatsby-awesome-pagination`) + +/** + * Here is the place where Gatsby creates the URLs for all the + * posts, tags, pages and authors that we fetched from the Ghost site. + */ +exports.createPages = async ({ graphql, actions }) => { + const { createPage } = actions + + const result = await graphql(` + { + allGhostPost(sort: { order: ASC, fields: published_at }) { + edges { + node { + slug + } + } + } + allGhostTag(sort: { order: ASC, fields: name }) { + edges { + node { + slug + url + postCount + } + } + } + allGhostAuthor(sort: { order: ASC, fields: name }) { + edges { + node { + slug + url + postCount + } + } + } + allGhostPage(sort: { order: ASC, fields: published_at }) { + edges { + node { + slug + url + } + } + } + allGhostPage(sort: { order: ASC, fields: published_at }) { + edges { + node { + slug + url + } + } + } + } + `) + + // Check for any errors + if (result.errors) { + throw new Error(result.errors) + } + + // Extract query results + const tags = result.data.allGhostTag.edges + const authors = result.data.allGhostAuthor.edges + const pages = result.data.allGhostPage.edges + const posts = result.data.allGhostPost.edges + + // Load templates + const indexTemplate = path.resolve(`./src/templates/index.js`) + const tagsTemplate = path.resolve(`./src/templates/tag.js`) + const authorTemplate = path.resolve(`./src/templates/author.js`) + const pageTemplate = path.resolve(`./src/templates/page.js`) + const postTemplate = path.resolve(`./src/templates/post.js`) + + // Create tag pages + tags.forEach(({ node }) => { + const totalPosts = node.postCount !== null ? node.postCount : 0 + const numberOfPages = Math.ceil(totalPosts / postsPerPage) + + // This part here defines, that our tag pages will use + // a `/tag/:slug/` permalink. + node.url = `/tag/${node.slug}/` + + Array.from({ length: numberOfPages }).forEach((_, i) => { + const currentPage = i + 1 + const prevPageNumber = currentPage <= 1 ? null : currentPage - 1 + const nextPageNumber = + currentPage + 1 > numberOfPages ? null : currentPage + 1 + const previousPagePath = prevPageNumber + ? prevPageNumber === 1 + ? node.url + : `${node.url}page/${prevPageNumber}/` + : null + const nextPagePath = nextPageNumber + ? `${node.url}page/${nextPageNumber}/` + : null + + createPage({ + path: i === 0 ? node.url : `${node.url}page/${i + 1}/`, + component: tagsTemplate, + context: { + // Data passed to context is available + // in page queries as GraphQL variables. + slug: node.slug, + limit: postsPerPage, + skip: i * postsPerPage, + numberOfPages: numberOfPages, + humanPageNumber: currentPage, + prevPageNumber: prevPageNumber, + nextPageNumber: nextPageNumber, + previousPagePath: previousPagePath, + nextPagePath: nextPagePath, + }, + }) + }) + }) + + // Create author pages + authors.forEach(({ node }) => { + const totalPosts = node.postCount !== null ? node.postCount : 0 + const numberOfPages = Math.ceil(totalPosts / postsPerPage) + + // This part here defines, that our author pages will use + // a `/author/:slug/` permalink. + node.url = `/author/${node.slug}/` + + Array.from({ length: numberOfPages }).forEach((_, i) => { + const currentPage = i + 1 + const prevPageNumber = currentPage <= 1 ? null : currentPage - 1 + const nextPageNumber = + currentPage + 1 > numberOfPages ? null : currentPage + 1 + const previousPagePath = prevPageNumber + ? prevPageNumber === 1 + ? node.url + : `${node.url}page/${prevPageNumber}/` + : null + const nextPagePath = nextPageNumber + ? `${node.url}page/${nextPageNumber}/` + : null + + createPage({ + path: i === 0 ? node.url : `${node.url}page/${i + 1}/`, + component: authorTemplate, + context: { + // Data passed to context is available + // in page queries as GraphQL variables. + slug: node.slug, + limit: postsPerPage, + skip: i * postsPerPage, + numberOfPages: numberOfPages, + humanPageNumber: currentPage, + prevPageNumber: prevPageNumber, + nextPageNumber: nextPageNumber, + previousPagePath: previousPagePath, + nextPagePath: nextPagePath, + }, + }) + }) + }) + + // Create pages + pages.forEach(({ node }) => { + // This part here defines, that our pages will use + // a `/:slug/` permalink. + node.url = `/${node.slug}/` + + createPage({ + path: node.url, + component: pageTemplate, + context: { + // Data passed to context is available + // in page queries as GraphQL variables. + slug: node.slug, + }, + }) + }) + + // Create post pages + posts.forEach(({ node }) => { + // This part here defines, that our posts will use + // a `/:slug/` permalink. + node.url = `/${node.slug}/` + + createPage({ + path: node.url, + component: postTemplate, + context: { + // Data passed to context is available + // in page queries as GraphQL variables. + slug: node.slug, + }, + }) + }) + + // Create pagination + paginate({ + createPage, + items: posts, + itemsPerPage: postsPerPage, + component: indexTemplate, + pathPrefix: ({ pageNumber }) => { + if (pageNumber === 0) { + return `/` + } else { + return `/page` + } + }, + }) +} diff --git a/global-site/netlify.toml b/global-site/netlify.toml new file mode 100644 index 0000000..cc1d28b --- /dev/null +++ b/global-site/netlify.toml @@ -0,0 +1,6 @@ +[build] + command = "gatsby build" + publish = "public/" + +[template] + incoming-hooks = ["Ghost"] diff --git a/global-site/package.json b/global-site/package.json new file mode 100755 index 0000000..24e0550 --- /dev/null +++ b/global-site/package.json @@ -0,0 +1,57 @@ +{ + "name": "gatsby-starter-ghost", + "description": "A starter template to build lightning fast websites with Ghost and Gatsby", + "version": "1.0.0", + "license": "MIT", + "author": "Ghost Foundation", + "homepage": "https://docs.ghost.org/api/gatsby/", + "repository": { + "type": "git", + "url": "git+https://github.com/tryghost/gatsby-starter-ghost.git" + }, + "engines": { + "node": ">= 8.9.0" + }, + "bugs": { + "url": "https://github.com/tryghost/gatsby-starter-ghost/issues" + }, + "keywords": [ + "gatsby", + "ghost" + ], + "main": "n/a", + "scripts": { + "serve": "gatsby build && NODE_ENV=production gatsby serve", + "build": "gatsby build", + "dev": "gatsby develop", + "lint": "eslint . --ext .js --cache", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "devDependencies": { + "eslint": "6.1.0", + "eslint-plugin-ghost": "0.4.0", + "eslint-plugin-react": "7.14.2" + }, + "dependencies": { + "@tryghost/helpers": "1.1.6", + "@tryghost/helpers-gatsby": "1.0.9", + "cheerio": "1.0.0-rc.3", + "gatsby": "2.13.32", + "gatsby-awesome-pagination": "0.3.4", + "gatsby-image": "2.2.6", + "gatsby-plugin-advanced-sitemap": "1.3.1", + "gatsby-plugin-feed": "2.3.5", + "gatsby-plugin-force-trailing-slashes": "1.0.4", + "gatsby-plugin-manifest": "2.2.3", + "gatsby-plugin-offline": "2.2.4", + "gatsby-plugin-react-helmet": "3.1.2", + "gatsby-plugin-sharp": "2.2.8", + "gatsby-source-filesystem": "2.1.5", + "gatsby-source-ghost": "3.4.4", + "gatsby-transformer-sharp": "2.2.4", + "lodash": "4.17.15", + "react": "16.8.6", + "react-dom": "16.8.6", + "react-helmet": "5.2.1" + } +} diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/.babelrc b/global-site/plugins/gatsby-plugin-ghost-manifest/.babelrc new file mode 100644 index 0000000..c204150 --- /dev/null +++ b/global-site/plugins/gatsby-plugin-ghost-manifest/.babelrc @@ -0,0 +1,10 @@ +{ + "presets": [ + [ + "babel-preset-gatsby-package", + { + "browser": true + } + ] + ] +} \ No newline at end of file diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/common.js b/global-site/plugins/gatsby-plugin-ghost-manifest/common.js new file mode 100644 index 0000000..893ccdf --- /dev/null +++ b/global-site/plugins/gatsby-plugin-ghost-manifest/common.js @@ -0,0 +1,55 @@ +"use strict"; + +var fs = require("fs"); // default icons for generating icons + + +exports.defaultIcons = [{ + src: "icons/icon-48x48.png", + sizes: "48x48", + type: "image/png" +}, { + src: "icons/icon-72x72.png", + sizes: "72x72", + type: "image/png" +}, { + src: "icons/icon-96x96.png", + sizes: "96x96", + type: "image/png" +}, { + src: "icons/icon-144x144.png", + sizes: "144x144", + type: "image/png" +}, { + src: "icons/icon-192x192.png", + sizes: "192x192", + type: "image/png" +}, { + src: "icons/icon-256x256.png", + sizes: "256x256", + type: "image/png" +}, { + src: "icons/icon-384x384.png", + sizes: "384x384", + type: "image/png" +}, { + src: "icons/icon-512x512.png", + sizes: "512x512", + type: "image/png" +}]; +/** + * Check if the icon exists on the filesystem + * + * @param {String} srcIcon Path of the icon + */ + +exports.doesIconExist = function doesIconExist(srcIcon) { + try { + return fs.statSync(srcIcon).isFile(); + } catch (e) { + if (e.code === "ENOENT") { + return false; + } else { + throw e; + } + } +}; \ No newline at end of file diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-node.js b/global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-node.js new file mode 100644 index 0000000..f8b855f --- /dev/null +++ b/global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-node.js @@ -0,0 +1,104 @@ +"use strict"; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); + +var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); + +var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); + +var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); + +var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); + +var fs = require("fs"); + +var path = require("path"); + +var Promise = require("bluebird"); + +var sharp = require("sharp"); + +var _require = require("./common.js"), + defaultIcons = _require.defaultIcons, + doesIconExist = _require.doesIconExist; + +sharp.simd(true); + +function generateIcons(icons, srcIcon) { + return Promise.map(icons, function (icon) { + var size = parseInt(icon.sizes.substring(0, icon.sizes.lastIndexOf("x"))); + var imgPath = path.join("public", icon.src); + return sharp(srcIcon).resize(size).toFile(imgPath).then(function () {}); + }); +} + +exports.onPostBuild = +/*#__PURE__*/ +function () { + var _ref2 = (0, _asyncToGenerator2.default)( + /*#__PURE__*/ + _regenerator.default.mark(function _callee(_ref, pluginOptions) { + var graphql, icon, manifest, _ref3, data, siteTitle, iconPath; + + return _regenerator.default.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + graphql = _ref.graphql; + icon = pluginOptions.icon, manifest = (0, _objectWithoutPropertiesLoose2.default)(pluginOptions, ["icon"]); + _context.next = 4; + return graphql(pluginOptions.query); + + case 4: + _ref3 = _context.sent; + data = _ref3.data; + siteTitle = data.allGhostSettings.edges[0].node.title || "No Title"; + manifest = (0, _extends2.default)({}, manifest, { + name: siteTitle // Delete options we won't pass to the manifest.webmanifest. + + }); + delete manifest.plugins; + delete manifest.legacy; + delete manifest.theme_color_in_head; + delete manifest.query; // If icons are not manually defined, use the default icon set. + + if (!manifest.icons) { + manifest.icons = defaultIcons; + } // Determine destination path for icons. + + + iconPath = path.join("public", path.dirname(manifest.icons[0].src)); //create destination directory if it doesn't exist + + if (!fs.existsSync(iconPath)) { + fs.mkdirSync(iconPath); + } + + fs.writeFileSync(path.join("public", "manifest.webmanifest"), JSON.stringify(manifest)); // Only auto-generate icons if a src icon is defined. + + if (icon !== undefined) { + // Check if the icon exists + if (!doesIconExist(icon)) { + Promise.reject("icon (" + icon + ") does not exist as defined in gatsby-config.js. Make sure the file exists relative to the root of the site."); + } + + generateIcons(manifest.icons, icon).then(function () { + //images have been generated + console.log("done generating icons for manifest"); + Promise.resolve(); + }); + } else { + Promise.resolve(); + } + + case 17: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + return function (_x, _x2) { + return _ref2.apply(this, arguments); + }; +}(); \ No newline at end of file diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-ssr.js b/global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-ssr.js new file mode 100644 index 0000000..f2304ac --- /dev/null +++ b/global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-ssr.js @@ -0,0 +1,61 @@ +"use strict"; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); + +var _react = _interopRequireDefault(require("react")); + +var _gatsby = require("gatsby"); + +var _common = require("./common.js"); + +exports.onRenderBody = function (_ref, pluginOptions) { + var setHeadComponents = _ref.setHeadComponents; + // We use this to build a final array to pass as the argument to setHeadComponents at the end of onRenderBody. + var headComponents = []; + var icons = pluginOptions.icons || _common.defaultIcons; // If icons were generated, also add a favicon link. + + if (pluginOptions.icon) { + var favicon = icons && icons.length ? icons[0].src : null; + + if (favicon) { + headComponents.push(_react.default.createElement("link", { + key: "gatsby-plugin-manifest-icon-link", + rel: "shortcut icon", + href: (0, _gatsby.withPrefix)(favicon) + })); + } + } // Add manifest link tag. + + + headComponents.push(_react.default.createElement("link", { + key: "gatsby-plugin-manifest-link", + rel: "manifest", + href: (0, _gatsby.withPrefix)("/manifest.webmanifest") + })); // The user has an option to opt out of the theme_color meta tag being inserted into the head. + + if (pluginOptions.theme_color) { + var insertMetaTag = Object.keys(pluginOptions).includes("theme_color_in_head") ? pluginOptions.theme_color_in_head : true; + + if (insertMetaTag) { + headComponents.push(_react.default.createElement("meta", { + key: "gatsby-plugin-manifest-meta", + name: "theme-color", + content: pluginOptions.theme_color + })); + } + } + + if (pluginOptions.legacy) { + var iconLinkTags = icons.map(function (icon) { + return _react.default.createElement("link", { + key: "gatsby-plugin-manifest-apple-touch-icon-" + icon.sizes, + rel: "apple-touch-icon", + sizes: icon.sizes, + href: (0, _gatsby.withPrefix)("" + icon.src) + }); + }); + headComponents = [].concat(headComponents, iconLinkTags); + } + + setHeadComponents(headComponents); +}; \ No newline at end of file diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/index.js b/global-site/plugins/gatsby-plugin-ghost-manifest/index.js new file mode 100644 index 0000000..625c089 --- /dev/null +++ b/global-site/plugins/gatsby-plugin-ghost-manifest/index.js @@ -0,0 +1 @@ +// noop \ No newline at end of file diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/package.json b/global-site/plugins/gatsby-plugin-ghost-manifest/package.json new file mode 100644 index 0000000..44385b2 --- /dev/null +++ b/global-site/plugins/gatsby-plugin-ghost-manifest/package.json @@ -0,0 +1,36 @@ +{ + "name": "gatsby-plugin-ghost-manifest", + "description": "Gatsby plugin which adds a manifest.webmanifest to make sites progressive web apps", + "version": "0.0.1", + "author": "Ghost Foundation", + "dependencies": { + "@babel/runtime": "7.5.5", + "bluebird": "3.5.5", + "sharp": "0.22.1" + }, + "devDependencies": { + "@babel/cli": "7.5.5", + "@babel/core": "7.5.5", + "babel-preset-gatsby-package": "0.2.2", + "cross-env": "^5.1.4" + }, + "keywords": [ + "gatsby", + "gatsby-plugin", + "favicon", + "icons", + "manifest.webmanifest", + "progressive-web-app", + "pwa" + ], + "license": "MIT", + "main": "index.js", + "peerDependencies": { + "gatsby": ">2.0.0-alpha" + }, + "scripts": { + "build": "babel src --out-dir . --ignore **/__tests__", + "prepare": "cross-env NODE_ENV=production npm run build", + "watch": "babel -w src --out-dir . --ignore **/__tests__" + } +} diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/src/common.js b/global-site/plugins/gatsby-plugin-ghost-manifest/src/common.js new file mode 100644 index 0000000..297f01b --- /dev/null +++ b/global-site/plugins/gatsby-plugin-ghost-manifest/src/common.js @@ -0,0 +1,62 @@ +const fs = require(`fs`) + +// default icons for generating icons +exports.defaultIcons = [ + { + src: `icons/icon-48x48.png`, + sizes: `48x48`, + type: `image/png`, + }, + { + src: `icons/icon-72x72.png`, + sizes: `72x72`, + type: `image/png`, + }, + { + src: `icons/icon-96x96.png`, + sizes: `96x96`, + type: `image/png`, + }, + { + src: `icons/icon-144x144.png`, + sizes: `144x144`, + type: `image/png`, + }, + { + src: `icons/icon-192x192.png`, + sizes: `192x192`, + type: `image/png`, + }, + { + src: `icons/icon-256x256.png`, + sizes: `256x256`, + type: `image/png`, + }, + { + src: `icons/icon-384x384.png`, + sizes: `384x384`, + type: `image/png`, + }, + { + src: `icons/icon-512x512.png`, + sizes: `512x512`, + type: `image/png`, + }, +] + +/** + * Check if the icon exists on the filesystem + * + * @param {String} srcIcon Path of the icon + */ +exports.doesIconExist = function doesIconExist(srcIcon) { + try { + return fs.statSync(srcIcon).isFile() + } catch (e) { + if (e.code === `ENOENT`) { + return false + } else { + throw e + } + } +} diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-node.js b/global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-node.js new file mode 100644 index 0000000..4c201b9 --- /dev/null +++ b/global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-node.js @@ -0,0 +1,71 @@ +const fs = require(`fs`) +const path = require(`path`) +const Promise = require(`bluebird`) +const sharp = require(`sharp`) +const { defaultIcons, doesIconExist } = require(`./common.js`) + +sharp.simd(true) + +function generateIcons(icons, srcIcon) { + return Promise.map(icons, (icon) => { + const size = parseInt(icon.sizes.substring(0, icon.sizes.lastIndexOf(`x`))) + const imgPath = path.join(`public`, icon.src) + + return sharp(srcIcon) + .resize(size) + .toFile(imgPath) + .then(() => { }) + }) +} + +exports.onPostBuild = async ({ graphql }, pluginOptions) => { + let { icon, ...manifest } = pluginOptions + + const { data } = await graphql(pluginOptions.query) + const siteTitle = data.allGhostSettings.edges[0].node.title || `No Title` + manifest = { + ...manifest, + name: siteTitle, + } + + // Delete options we won't pass to the manifest.webmanifest. + delete manifest.plugins + delete manifest.legacy + delete manifest.theme_color_in_head + delete manifest.query + + // If icons are not manually defined, use the default icon set. + if (!manifest.icons) { + manifest.icons = defaultIcons + } + + // Determine destination path for icons. + const iconPath = path.join(`public`, path.dirname(manifest.icons[0].src)) + + //create destination directory if it doesn't exist + if (!fs.existsSync(iconPath)) { + fs.mkdirSync(iconPath) + } + + fs.writeFileSync( + path.join(`public`, `manifest.webmanifest`), + JSON.stringify(manifest) + ) + + // Only auto-generate icons if a src icon is defined. + if (icon !== undefined) { + // Check if the icon exists + if (!doesIconExist(icon)) { + Promise.reject( + `icon (${icon}) does not exist as defined in gatsby-config.js. Make sure the file exists relative to the root of the site.` + ) + } + generateIcons(manifest.icons, icon).then(() => { + //images have been generated + console.log(`done generating icons for manifest`) + Promise.resolve() + }) + } else { + Promise.resolve() + } +} diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-ssr.js b/global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-ssr.js new file mode 100644 index 0000000..27137fb --- /dev/null +++ b/global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-ssr.js @@ -0,0 +1,67 @@ +import React from "react" +import { withPrefix } from "gatsby" +import { defaultIcons } from "./common.js" + +exports.onRenderBody = ({ setHeadComponents }, pluginOptions) => { + // We use this to build a final array to pass as the argument to setHeadComponents at the end of onRenderBody. + let headComponents = [] + + const icons = pluginOptions.icons || defaultIcons + + // If icons were generated, also add a favicon link. + if (pluginOptions.icon) { + let favicon = icons && icons.length ? icons[0].src : null + + if (favicon) { + headComponents.push( + + ) + } + } + + // Add manifest link tag. + headComponents.push( + + ) + // The user has an option to opt out of the theme_color meta tag being inserted into the head. + if (pluginOptions.theme_color) { + let insertMetaTag = Object.keys(pluginOptions).includes( + `theme_color_in_head` + ) + ? pluginOptions.theme_color_in_head + : true + + if (insertMetaTag) { + headComponents.push( + + ) + } + } + + if (pluginOptions.legacy) { + const iconLinkTags = icons.map(icon => ( + + )) + + headComponents = [...headComponents, ...iconLinkTags] + } + + setHeadComponents(headComponents) +} \ No newline at end of file diff --git a/global-site/src/components/common/Layout.js b/global-site/src/components/common/Layout.js new file mode 100644 index 0000000..6218a86 --- /dev/null +++ b/global-site/src/components/common/Layout.js @@ -0,0 +1,133 @@ +import React from 'react' +import PropTypes from 'prop-types' +import Helmet from 'react-helmet' +import { Link, StaticQuery, graphql } from 'gatsby' +import Img from 'gatsby-image' + +import { Navigation } from '.' +import config from '../../utils/siteConfig' + +// Styles +import '../../styles/app.css' + +/** +* Main layout component +* +* The Layout component wraps around each page and template. +* It also provides the header, footer as well as the main +* styles, and meta data for each page. +* +*/ +const DefaultLayout = ({ data, children, bodyClass, isHome }) => { + const site = data.allGhostSettings.edges[0].node + const twitterUrl = site.twitter ? `https://twitter.com/${site.twitter.replace(/^@/, ``)}` : null + const facebookUrl = site.facebook ? `https://www.facebook.com/${site.facebook.replace(/^\//, ``)}` : null + + return ( + <> + + + + + + +
+ +
+ {/* The main header section on top of the screen */} +
+
+
+
+ + {site.logo ? + {site.title} + : {site.title} + } + +
+
+ { site.twitter && Twitter} + { site.facebook && Facebook} + RSS Feed +
+
+ { isHome ? +
+

{site.title}

+

{site.description}

+
: + null} + +
+
+ +
+ {/* All the main content gets inserted here, index.js, post.js */} + {children} +
+ +
+ +
+ {/* The footer at the very bottom of the screen */} +
+
+
+ {site.title} ยฉ 2019 — Published with Ghost +
+
+ +
+
+
+ +
+
+ + + ) +} + +DefaultLayout.propTypes = { + children: PropTypes.node.isRequired, + bodyClass: PropTypes.string, + isHome: PropTypes.bool, + data: PropTypes.shape({ + allGhostSettings: PropTypes.object.isRequired, + }).isRequired, +} + +const DefaultLayoutSettingsQuery = props => ( + } + /> +) + +export default DefaultLayoutSettingsQuery diff --git a/global-site/src/components/common/Navigation.js b/global-site/src/components/common/Navigation.js new file mode 100644 index 0000000..d0baf23 --- /dev/null +++ b/global-site/src/components/common/Navigation.js @@ -0,0 +1,41 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { Link } from 'gatsby' + +/** +* Navigation component +* +* The Navigation component takes an array of your Ghost +* navigation property that is fetched from the settings. +* It differentiates between absolute (external) and relative link (internal). +* You can pass it a custom class for your own styles, but it will always fallback +* to a `site-nav-item` class. +* +*/ +const Navigation = ({ data, navClass }) => ( + <> + {data.map((navItem, i) => { + if (navItem.url.match(/^\s?http(s?)/gi)) { + return {navItem.label} + } else { + return {navItem.label} + } + })} + +) + +Navigation.defaultProps = { + navClass: `site-nav-item`, +} + +Navigation.propTypes = { + data: PropTypes.arrayOf( + PropTypes.shape({ + label: PropTypes.string.isRequired, + url: PropTypes.string.isRequired, + }).isRequired, + ).isRequired, + navClass: PropTypes.string, +} + +export default Navigation diff --git a/global-site/src/components/common/Pagination.js b/global-site/src/components/common/Pagination.js new file mode 100644 index 0000000..6baa043 --- /dev/null +++ b/global-site/src/components/common/Pagination.js @@ -0,0 +1,36 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { Link } from 'gatsby' + +const Pagination = ({ pageContext }) => { + const { previousPagePath, nextPagePath, humanPageNumber, numberOfPages } = pageContext + + return ( + + ) +} + +Pagination.propTypes = { + pageContext: PropTypes.object.isRequired, +} + +export default Pagination diff --git a/global-site/src/components/common/PostCard.js b/global-site/src/components/common/PostCard.js new file mode 100644 index 0000000..a89fe48 --- /dev/null +++ b/global-site/src/components/common/PostCard.js @@ -0,0 +1,59 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { Link } from 'gatsby' +import { Tags } from '@tryghost/helpers-gatsby' +import { readingTime as readingTimeHelper } from '@tryghost/helpers' + +const PostCard = ({ post }) => { + const url = `/${post.slug}/` + const readingTime = readingTimeHelper(post) + + return ( + +
+ {post.feature_image && +
} + {post.tags &&
} + {post.featured && Featured} +

{post.title}

+
+
{post.excerpt}
+
+
+
+ {post.primary_author.profile_image ? + {post.primary_author.name}/ : + {post.primary_author.name}/ + } +
+ { post.primary_author.name } +
+
+
{readingTime}
+
+
+ + ) +} + +PostCard.propTypes = { + post: PropTypes.shape({ + title: PropTypes.string.isRequired, + feature_image: PropTypes.string, + featured: PropTypes.bool, + tags: PropTypes.arrayOf( + PropTypes.shape({ + name: PropTypes.string, + }) + ), + excerpt: PropTypes.string.isRequired, + primary_author: PropTypes.shape({ + name: PropTypes.string.isRequired, + profile_image: PropTypes.string, + }).isRequired, + }).isRequired, +} + +export default PostCard diff --git a/global-site/src/components/common/index.js b/global-site/src/components/common/index.js new file mode 100644 index 0000000..9e6d7ed --- /dev/null +++ b/global-site/src/components/common/index.js @@ -0,0 +1,4 @@ +export { default as Layout } from './Layout' +export { default as PostCard } from './PostCard' +export { default as Pagination } from './Pagination' +export { default as Navigation } from './Navigation' diff --git a/global-site/src/components/common/meta/ArticleMeta.js b/global-site/src/components/common/meta/ArticleMeta.js new file mode 100644 index 0000000..e2b7696 --- /dev/null +++ b/global-site/src/components/common/meta/ArticleMeta.js @@ -0,0 +1,167 @@ +import React from 'react' +import Helmet from "react-helmet" +import { StaticQuery, graphql } from 'gatsby' +import PropTypes from 'prop-types' +import _ from 'lodash' +import url from 'url' + +import getAuthorProperties from './getAuthorProperties' +import ImageMeta from './ImageMeta' +import config from '../../../utils/siteConfig' + +import { tags as tagsHelper } from '@tryghost/helpers' + +const ArticleMetaGhost = ({ data, settings, canonical }) => { + const ghostPost = data + settings = settings.allGhostSettings.edges[0].node + + const author = getAuthorProperties(ghostPost.primary_author) + const publicTags = _.map(tagsHelper(ghostPost, { visibility: `public`, fn: tag => tag }), `name`) + const primaryTag = publicTags[0] || `` + const shareImage = ghostPost.feature_image ? ghostPost.feature_image : _.get(settings, `cover_image`, null) + const publisherLogo = (settings.logo || config.siteIcon) ? url.resolve(config.siteUrl, (settings.logo || config.siteIcon)) : null + + return ( + <> + + {ghostPost.meta_title || ghostPost.title} + + + + + + + + + + + {publicTags.map((keyword, i) => ())} + {author.facebookUrl && } + + + + + + + {primaryTag && } + {primaryTag && } + + {settings.twitter && } + {settings.twitter && } + + + + + ) +} + +ArticleMetaGhost.propTypes = { + data: PropTypes.shape({ + title: PropTypes.string.isRequired, + published_at: PropTypes.string.isRequired, + updated_at: PropTypes.string.isRequired, + meta_title: PropTypes.string, + meta_description: PropTypes.string, + primary_author: PropTypes.object.isRequired, + feature_image: PropTypes.string, + tags: PropTypes.arrayOf( + PropTypes.shape({ + name: PropTypes.string, + slug: PropTypes.string, + visibility: PropTypes.string, + }) + ), + primaryTag: PropTypes.shape({ + name: PropTypes.string, + }), + og_title: PropTypes.string, + og_description: PropTypes.string, + twitter_title: PropTypes.string, + twitter_description: PropTypes.string, + excerpt: PropTypes.string.isRequired, + }).isRequired, + settings: PropTypes.shape({ + allGhostSettings: PropTypes.object.isRequired, + }).isRequired, + canonical: PropTypes.string.isRequired, +} + +const ArticleMetaQuery = props => ( + } + /> +) + +export default ArticleMetaQuery diff --git a/global-site/src/components/common/meta/AuthorMeta.js b/global-site/src/components/common/meta/AuthorMeta.js new file mode 100644 index 0000000..85d8cee --- /dev/null +++ b/global-site/src/components/common/meta/AuthorMeta.js @@ -0,0 +1,93 @@ +import React from 'react' +import Helmet from 'react-helmet' +import PropTypes from 'prop-types' +import _ from 'lodash' +import { StaticQuery, graphql } from 'gatsby' + +import ImageMeta from './ImageMeta' +import getAuthorProperties from './getAuthorProperties' +import config from '../../../utils/siteConfig' + +const AuthorMeta = ({ data, settings, canonical }) => { + settings = settings.allGhostSettings.edges[0].node + + const author = getAuthorProperties(data) + const shareImage = author.image || _.get(settings, `cover_image`, null) + const title = `${data.name} - ${settings.title}` + const description = data.bio || config.siteDescriptionMeta || settings.description + + return ( + <> + + {title} + + + + + + + + + + + {settings.twitter && } + {settings.twitter && } + + + + + ) +} + +AuthorMeta.propTypes = { + data: PropTypes.shape({ + name: PropTypes.string, + bio: PropTypes.string, + profile_image: PropTypes.string, + website: PropTypes.string, + twitter: PropTypes.string, + facebook: PropTypes.string, + }).isRequired, + settings: PropTypes.shape({ + allGhostSettings: PropTypes.object.isRequired, + }).isRequired, + canonical: PropTypes.string.isRequired, +} + +const AuthorMetaQuery = props => ( + } + /> +) + +export default AuthorMetaQuery diff --git a/global-site/src/components/common/meta/ImageMeta.js b/global-site/src/components/common/meta/ImageMeta.js new file mode 100644 index 0000000..cb6d96e --- /dev/null +++ b/global-site/src/components/common/meta/ImageMeta.js @@ -0,0 +1,26 @@ +import React from 'react' +import Helmet from 'react-helmet' +import PropTypes from 'prop-types' +import config from '../../../utils/siteConfig' + +const ImageMeta = ({ image }) => { + if (!image) { + return null + } + + return ( + + + + + + + + ) +} + +ImageMeta.propTypes = { + image: PropTypes.string, +} + +export default ImageMeta diff --git a/global-site/src/components/common/meta/MetaData.js b/global-site/src/components/common/meta/MetaData.js new file mode 100644 index 0000000..498cf4a --- /dev/null +++ b/global-site/src/components/common/meta/MetaData.js @@ -0,0 +1,118 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { StaticQuery, graphql } from 'gatsby' +import url from 'url' + +import config from '../../../utils/siteConfig' +import ArticleMeta from './ArticleMeta' +import WebsiteMeta from './WebsiteMeta' +import AuthorMeta from './AuthorMeta' + +/** +* MetaData will generate all relevant meta data information incl. +* JSON-LD (schema.org), Open Graph (Facebook) and Twitter properties. +* +*/ +const MetaData = ({ + data, + settings, + title, + description, + image, + location, +}) => { + const canonical = url.resolve(config.siteUrl, location.pathname) + const { ghostPost, ghostTag, ghostAuthor, ghostPage } = data + settings = settings.allGhostSettings.edges[0].node + + if (ghostPost) { + return ( + + ) + } else if (ghostTag) { + return ( + + ) + } else if (ghostAuthor) { + return ( + + ) + } else if (ghostPage) { + return ( + + ) + } else { + title = title || config.siteTitleMeta || settings.title + description = description || config.siteDescriptionMeta || settings.description + image = image || settings.cover_image || null + + image = image ? url.resolve(config.siteUrl, image) : null + + return ( + + ) + } +} + +MetaData.defaultProps = { + data: {}, +} + +MetaData.propTypes = { + data: PropTypes.shape({ + ghostPost: PropTypes.object, + ghostTag: PropTypes.object, + ghostAuthor: PropTypes.object, + ghostPage: PropTypes.object, + }).isRequired, + settings: PropTypes.shape({ + allGhostSettings: PropTypes.object.isRequired, + }).isRequired, + location: PropTypes.shape({ + pathname: PropTypes.string.isRequired, + }).isRequired, + title: PropTypes.string, + description: PropTypes.string, + image: PropTypes.string, +} + +const MetaDataQuery = props => ( + } + /> +) + +export default MetaDataQuery diff --git a/global-site/src/components/common/meta/WebsiteMeta.js b/global-site/src/components/common/meta/WebsiteMeta.js new file mode 100644 index 0000000..80f283a --- /dev/null +++ b/global-site/src/components/common/meta/WebsiteMeta.js @@ -0,0 +1,107 @@ +import React from 'react' +import Helmet from "react-helmet" +import PropTypes from 'prop-types' +import _ from 'lodash' +import { StaticQuery, graphql } from 'gatsby' +import url from 'url' + +import ImageMeta from './ImageMeta' +import config from '../../../utils/siteConfig' + +const WebsiteMeta = ({ data, settings, canonical, title, description, image, type }) => { + settings = settings.allGhostSettings.edges[0].node + + const publisherLogo = url.resolve(config.siteUrl, (settings.logo || config.siteIcon)) + let shareImage = image || data.feature_image || _.get(settings, `cover_image`, null) + + shareImage = shareImage ? url.resolve(config.siteUrl, shareImage) : null + + description = description || data.meta_description || data.description || config.siteDescriptionMeta || settings.description + title = `${title || data.meta_title || data.name || data.title} - ${settings.title}` + + return ( + <> + + {title} + + + + + + + + + + + {settings.twitter && } + {settings.twitter && } + + + + + ) +} + +WebsiteMeta.propTypes = { + data: PropTypes.shape({ + title: PropTypes.string, + feature_image: PropTypes.string, + description: PropTypes.string, + bio: PropTypes.string, + profile_image: PropTypes.string, + }).isRequired, + settings: PropTypes.shape({ + allGhostSettings: PropTypes.object.isRequired, + }).isRequired, + canonical: PropTypes.string.isRequired, + title: PropTypes.string, + description: PropTypes.string, + image: PropTypes.string, + type: PropTypes.oneOf([`WebSite`, `Series`]).isRequired, +} + +const WebsiteMetaQuery = props => ( + } + /> +) + +export default WebsiteMetaQuery diff --git a/global-site/src/components/common/meta/getAuthorProperties.js b/global-site/src/components/common/meta/getAuthorProperties.js new file mode 100644 index 0000000..330041a --- /dev/null +++ b/global-site/src/components/common/meta/getAuthorProperties.js @@ -0,0 +1,37 @@ +import _ from 'lodash' +import PropTypes from 'prop-types' + +export const getAuthorProperties = (primaryAuthor) => { + let authorProfiles = [] + + authorProfiles.push( + primaryAuthor.website ? primaryAuthor.website : null, + primaryAuthor.twitter ? `https://twitter.com/${primaryAuthor.twitter.replace(/^@/, ``)}/` : null, + primaryAuthor.facebook ? `https://www.facebook.com/${primaryAuthor.facebook.replace(/^\//, ``)}/` : null + ) + + authorProfiles = _.compact(authorProfiles) + + return { + name: primaryAuthor.name || null, + sameAsArray: authorProfiles.length ? `["${_.join(authorProfiles, `", "`)}"]` : null, + image: primaryAuthor.profile_image || null, + facebookUrl: primaryAuthor.facebook ? `https://www.facebook.com/${primaryAuthor.facebook.replace(/^\//, ``)}/` : null, + } +} + +getAuthorProperties.defaultProps = { + fetchAuthorData: false, +} + +getAuthorProperties.PropTypes = { + primaryAuthor: PropTypes.shape({ + name: PropTypes.string.isRequired, + profile_image: PropTypes.string, + website: PropTypes.string, + twitter: PropTypes.string, + facebook: PropTypes.string, + }).isRequired, +} + +export default getAuthorProperties diff --git a/global-site/src/components/common/meta/index.js b/global-site/src/components/common/meta/index.js new file mode 100644 index 0000000..a691cbb --- /dev/null +++ b/global-site/src/components/common/meta/index.js @@ -0,0 +1 @@ +export { default as MetaData } from './MetaData' diff --git a/global-site/src/images/ghost-icon.png b/global-site/src/images/ghost-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c498281bae956434fedf862d75213aa88dc0abc7 GIT binary patch literal 7935 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 O+H=2;NA ( + +
+
+

Error 404

+
+ Page not found, return home to start over +
+
+
+
+) + +export default NotFoundPage diff --git a/global-site/src/styles/app.css b/global-site/src/styles/app.css new file mode 100644 index 0000000..5b28c10 --- /dev/null +++ b/global-site/src/styles/app.css @@ -0,0 +1,1018 @@ +/* App.css +/* ---------------------------------------------------------- /* + +These are just some base styles to get you started. You delete +these and start over using your toolset of choice, or evolve +what's here to work the way you'd like it to. + +# Table of Contents + +- Vars +- Reset +- Defaults +- Layout +- Tag Archives +- Author Archives +- Pagination +- Footer + +/* Variables +/* ---------------------------------------------------------- */ + +:root { + + /* Colours */ + --color-primary: #3eb0ef; + --color-base: #15171A; + --color-secondary: #5B7A81; + --color-border: #c7d5d8; + --color-bg: #f5f5f5; + + /* Fonts */ + --font-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + --font-serif: Georgia, Times, serif; + --font-mono: Menlo, Courier, monospace; + --font-light: 100; + --font-normal: 400; + --font-bold: 700; + --font-heavy: 800; + + /* Sizes */ + --height: 4rem; + --margin: 2rem; + --radius: 0.6rem; + +} + + +/* Reset +/* ---------------------------------------------------------- */ + +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + font-size: 100%; + vertical-align: baseline; +} +body { + line-height: 1; +} +ol, +ul { + list-style: none; +} +blockquote, +q { + quotes: none; +} +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ""; + content: none; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +img { + max-width: 100%; +} +html { + box-sizing: border-box; + font-family: sans-serif; + + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +*, +*:before, +*:after { + box-sizing: inherit; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +b, +strong { + font-weight: bold; +} +i, +em, +dfn { + font-style: italic; +} +h1 { + margin: 0.67em 0; + font-size: 2em; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +mark { + background-color: #fdffb6; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + color: inherit; + font: inherit; +} +button { + overflow: visible; + border: none; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + + -webkit-appearance: button; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input:focus { + outline: none; +} +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + box-sizing: content-box; + + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} + +/* Defaults +/* ---------------------------------------------------------- */ + +html { + overflow-x: hidden; + overflow-y: scroll; + font-size: 62.5%; + background: var(--color-base); + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +body { + overflow-x: hidden; + color: #3c484e; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; + font-size: 1.5rem; + line-height: 1.6em; + font-weight: 400; + font-style: normal; + letter-spacing: 0; + text-rendering: optimizeLegibility; + background: #fff; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -moz-font-feature-settings: "liga" on; +} + +::selection { + text-shadow: none; + background: #cbeafb; +} + +hr { + position: relative; + display: block; + width: 100%; + margin: 1.8em 0 2.4em; + padding: 0; + height: 1px; + border: 0; + border-top: 1px solid #e3e9ed; +} + +audio, +canvas, +iframe, +img, +svg, +video { + vertical-align: middle; +} + +fieldset { + margin: 0; + padding: 0; + border: 0; +} + +textarea { + resize: vertical; +} + +p, +ul, +ol, +dl, +blockquote { + margin: 0 0 1.5em 0; +} + +ol, +ul { + padding-left: 1.3em; + padding-right: 1.5em; +} + +ol ol, +ul ul, +ul ol, +ol ul { + margin: 0.5em 0 1em; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +ul, +ol { + max-width: 100%; +} + +li { + margin: 0.5em 0; + padding-left: 0.3em; + line-height: 1.6em; +} + +dt { + float: left; + margin: 0 20px 0 0; + width: 120px; + font-weight: 500; + text-align: right; +} + +dd { + margin: 0 0 5px 0; + text-align: left; +} + +blockquote { + margin: 0.3em 0 1.8em; + padding: 0 1.6em 0 1.6em; + border-left: #cbeafb 0.5em solid; +} + +blockquote p { + margin: 0.8em 0; + font-size: 1.2em; + font-weight: 300; +} + +blockquote small { + display: inline-block; + margin: 0.8em 0 0.8em 1.5em; + font-size: 0.9em; + opacity: 0.8; +} +/* Quotation marks */ +blockquote small:before { + content: "\2014 \00A0"; +} + +blockquote cite { + font-weight: bold; +} +blockquote cite a { + font-weight: normal; +} + +a { + color: #26a8ed; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + color: var(--color-base); + line-height: 1.15; + font-weight: 700; + text-rendering: optimizeLegibility; +} + +h1 { + margin: 0 0 0.5em 0; + font-size: 4rem; + font-weight: 700; +} +@media (max-width: 500px) { + h1 { + font-size: 2rem; + } +} + +h2 { + margin: 1.5em 0 0.5em 0; + font-size: 2rem; +} +@media (max-width: 500px) { + h2 { + font-size: 1.8rem; + } +} + +h3 { + margin: 1.5em 0 0.5em 0; + font-size: 1.8rem; + font-weight: 500; +} +@media (max-width: 500px) { + h3 { + font-size: 1.7rem; + } +} + +h4 { + margin: 1.5em 0 0.5em 0; + font-size: 1.6rem; + font-weight: 500; +} + +h5 { + margin: 1.5em 0 0.5em 0; + font-size: 1.4rem; + font-weight: 500; +} + +h6 { + margin: 1.5em 0 0.5em 0; + font-size: 1.4rem; + font-weight: 500; +} + +/* Layout +/* ---------------------------------------------------------- */ + +.viewport { + display: flex; + flex-direction: column; + justify-content: space-between; + min-height: 100vh; +} + +.container { + max-width: 1120px; + margin: 0 auto; + padding: 0 4vw; +} + +.content { + margin: 0 auto; + font-size: 2rem; + line-height: 1.7em; +} + +.content-body { + display: flex; + flex-direction: column; + font-family: var(--font-serif); +} + +.post-full-content { + max-width: 720px; + margin: 0 auto; + background: #fff; +} + +.post-feature-image img { + margin: 0 0 3vw; + width: 100%; + height: 500px; + object-fit: cover; +} + +.content-body h1, +.content-body h2, +.content-body h3, +.content-body h4, +.content-body h5, +.content-body h6 { + font-family: var(--font-sans-serif); +} + +.content-body h1 { + margin: 1.0em 0 0.5em 0; + font-size: 3.4rem; + font-weight: 700; +} +@media (max-width: 500px) { + .content-body h1 { + font-size: 2.8rem; + } +} + +.content-title { + margin: 0 0 0.8em; + font-size: 5rem; +} +@media (max-width: 500px) { + .content-title { + margin: 0.8em 0; + font-size: 3.4rem; + } + .content { + font-size: 1.8rem; + } +} + +.content-body h2 { + margin: 0.8em 0 0.4em 0; + font-size: 3.2rem; + font-weight: 700; +} +@media (max-width: 500px) { + .content-body h2 { + font-size: 2.6rem; + } +} + +.content-body h3 { + margin: 0.5em 0 0.2em 0; + font-size: 2.8rem; + font-weight: 700; +} +@media (max-width: 500px) { + .content-body h3 { + font-size: 2.2rem; + } +} + +.content-body h4 { + margin: 0.5em 0 0.2em 0; + font-size: 2.4rem; + font-weight: 700; +} +@media (max-width: 500px) { + .content-body h4 { + font-size: 2.2rem; + } +} + +.content-body h5 { + display: block; + margin: 0.5em 0; + padding: 1em 0 1.5em; + border: 0; + font-family: Georgia,serif; + color: var(--color-primary); + font-style: italic; + font-size: 3.2rem; + line-height: 1.35em; + text-align: center; +} + +.content-body h6 { + margin: 0.5em 0 0.2em 0; + font-size: 2.0rem; + font-weight: 700; +} + +.content-body figure { + margin: 0.4em 0 1.6em; + font-size: 2.8rem; + font-weight: 700; +} + +.content-body pre { + margin: 0.4em 0 1.8em; + font-size: 1.6rem; + line-height: 1.4em; + white-space: pre-wrap; + padding: 20px; + background: var(--color-base); + color: #fff; + border-radius: 12px; +} + +/* Header +/* ---------------------------------------------------------- */ + +.site-head { + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + background: var(--color-base); +} + +.site-nav-item { + display: inline-block; + padding: 5px 10px; + color: #fff; + opacity: 0.7; +} + +.site-nav-item:hover { + text-decoration: none; + opacity: 1; +} + +.site-nav-icon { + height: 15px; + margin: -5px 0 0; +} + +.site-logo { + height: 25px; +} + +.site-mast { + display: flex; + align-items: center; + justify-content: space-between; +} + +.site-mast-right { + display: flex; + align-items: center; + margin: 0 -10px 0 20px; +} + +.site-mast-right .site-nav-item:last-child { + padding-right: 0; +} + +.site-banner { + max-width: 80%; + margin: 0 auto; + padding: 10vw 0; + text-align: center; +} + +.site-banner-title { + margin: 0; + padding: 0; + color: #fff; + font-size: 4rem; + line-height: 1.3em; +} + +.site-banner-desc { + margin: 5px 0 0 0; + padding: 0; + font-size: 2.4rem; + line-height: 1.3em; + opacity: 0.7; +} + +.site-nav { + display: flex; + align-items: center; + justify-content: space-between; + margin: 15px 0 0 0; +} + +.site-nav-left { + margin: 0 20px 0 -10px; +} + +.site-nav-right { + margin: 0 -10px 0 20px; +} + +.site-nav-button { + display: inline-block; + padding: 5px 10px; + border: #fff 1px solid; + color: #fff; + font-size: 1.3rem; + line-height: 1em; + border-radius: var(--radius); + opacity: 0.7; +} + +.site-nav-button:hover { + text-decoration: none; +} + +/* Main +/* ---------------------------------------------------------- */ + +.site-main { + padding: 4vw 0; +} + +/* Index +/* ---------------------------------------------------------- */ + +.post-feed { + display: grid; + justify-content: space-between; + grid-gap: 30px; + grid-template-columns: 1fr 1fr 1fr; +} + +@media (max-width: 980px) { + .post-feed { + grid-template-columns: 1fr 1fr; + } +} +@media (max-width: 680px) { + .post-feed { + grid-template-columns: 1fr; + } +} + +.post-card { + color: inherit; + text-decoration: none; +} + +.post-card:hover { + text-decoration: none; +} + +.post-card-tags { + margin: 0 0 5px 0; + font-size: 1.4rem; + line-height: 1.15em; + color: var(--color-secondary); +} + + +.post-card-title { + margin: 0 0 10px 0; + padding: 0; +} + +.post-card-excerpt { + font-size: 1.6rem; + line-height: 1.55em; +} + +.post-card-image { + margin: 0 0 10px 0; + width: auto; + height: 200px; + background: var(--color-secondary) no-repeat center center; + background-size: cover; +} + +.post-card-footer { + display: flex; + align-items: center; + justify-content: space-between; + margin: 10px 0 0 0; + color: var(--color-secondary); +} + +.post-card-footer-left { + display: flex; + align-items: center; +} + +.post-card-footer-right { + display: flex; + flex-direction: column; +} + +.post-card-avatar { + width: 30px; + height: 30px; + margin: 0 7px 0 0; + border-radius: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.post-card-avatar .author-profile-image { + display: block; + width: 100%; + background: var(--color-secondary); + border-radius: 100%; + object-fit: cover; +} + +.post-card-avatar .default-avatar { + width: 26px; +} + + +/* Tag Archives +/* ---------------------------------------------------------- */ + +.tag-header { + max-width: 690px; + margin: 0 0 4vw; +} + +.tag-header h1 { + margin: 0 0 1rem 0; +} + +.tag-header p { + margin: 0; + color: var(--color-secondary); + font-size: 2.2rem; + line-height: 1.3em; +} + +@media (max-width: 500px) { + .tag-header { + border-bottom: var(--color-bg) 1px solid; + padding-bottom: 4vw; + } + .tag-header p { + font-size: 1.7rem; + } +} + + +/* Author Archives +/* ---------------------------------------------------------- */ + +.author-header { + display: flex; + justify-content: space-between; + margin: 0 0 4vw; +} + +.author-header h1 { + margin: 0 0 1rem 0; +} + +.author-header p { + margin: 0; + color: var(--color-secondary); + font-size: 2.2rem; + line-height: 1.3em; +} + +.author-header-image { + flex: 0 0 auto; + margin: 0 0 0 4vw; + height: 120px; + width: 120px; + border-radius: 100%; + overflow: hidden; +} + +.author-header-meta { + display: flex; + margin: 1rem 0 0 0; +} + +.author-header-item { + display: block; + padding: 2px 10px; +} + +.author-header-item:first-child { + padding-left: 0; +} + +@media (max-width: 500px) { + .author-header { + border-bottom: var(--color-bg) 1px solid; + padding-bottom: 4vw; + } + .author-header p { + font-size: 1.7rem; + } + .author-header-image { + height: 80px; + width: 80px; + } +} + + +/* Pagination +/* ---------------------------------------------------------- */ + +.pagination { + position: relative; + display: flex; + justify-content: space-between; + align-items: center; + margin: 4vw 0 0; +} + +.pagination a { + display: inline-block; + padding: 10px 15px; + border: var(--color-border) 1px solid; + color: var(--color-secondary); + text-decoration: none; + font-size: 1.4rem; + line-height: 1em; + border-radius: var(--radius); +} + +.pagination-location { + position: absolute; + left: 50%; + width: 100px; + margin-left: -50px; + text-align: center; + color: var(--color-secondary); + font-size: 1.3rem; +} + + +/* Footer +/* ---------------------------------------------------------- */ + +.site-foot { + padding: 20px 0 40px 0; + color: rgba(255,255,255,0.7); + font-size: 1.3rem; + background: var(--color-base); +} + +.site-foot-nav { + display: flex; + align-items: center; + justify-content: space-between; +} + +.site-foot-nav a { + color: rgba(255,255,255,0.7); +} + +.site-foot-nav a:hover { + text-decoration: none; + color: rgba(255,255,255,1); +} + +.site-foot-nav-right a { + display: inline-block; + padding: 2px 5px; +} + +.site-foot-nav-right a:last-child { + padding-right: 0; +} diff --git a/global-site/src/templates/author.js b/global-site/src/templates/author.js new file mode 100755 index 0000000..8950dfa --- /dev/null +++ b/global-site/src/templates/author.js @@ -0,0 +1,96 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { graphql } from 'gatsby' + +import { Layout, PostCard, Pagination } from '../components/common' +import { MetaData } from '../components/common/meta' + +/** +* Author page (/author/:slug) +* +* Loads all posts for the requested author incl. pagination. +* +*/ +const Author = ({ data, location, pageContext }) => { + const author = data.ghostAuthor + const posts = data.allGhostPost.edges + const twitterUrl = author.twitter ? `https://twitter.com/${author.twitter.replace(/^@/, ``)}` : null + const facebookUrl = author.facebook ? `https://www.facebook.com/${author.facebook.replace(/^\//, ``)}` : null + + return ( + <> + + +
+
+
+

{author.name}

+ {author.bio &&

{author.bio}

} +
+ {author.website && Website} + {twitterUrl && Twitter} + {facebookUrl && Facebook} +
+
+
+ {author.profile_image && {author.name}} +
+
+
+ {posts.map(({ node }) => ( + // The tag below includes the markup for each post - components/common/PostCard.js + + ))} +
+ +
+
+ + ) +} + +Author.propTypes = { + data: PropTypes.shape({ + ghostAuthor: PropTypes.shape({ + name: PropTypes.string.isRequired, + cover_image: PropTypes.string, + profile_image: PropTypes.string, + website: PropTypes.string, + bio: PropTypes.string, + location: PropTypes.string, + facebook: PropTypes.string, + twitter: PropTypes.string, + }), + allGhostPost: PropTypes.object.isRequired, + }).isRequired, + location: PropTypes.shape({ + pathname: PropTypes.string.isRequired, + }).isRequired, + pageContext: PropTypes.object, +} + +export default Author + +export const pageQuery = graphql` + query GhostAuthorQuery($slug: String!, $limit: Int!, $skip: Int!) { + ghostAuthor(slug: { eq: $slug }) { + ...GhostAuthorFields + } + allGhostPost( + sort: { order: DESC, fields: [published_at] }, + filter: {authors: {elemMatch: {slug: {eq: $slug}}}}, + limit: $limit, + skip: $skip + ) { + edges { + node { + ...GhostPostFields + } + } + } + } +` diff --git a/global-site/src/templates/index.js b/global-site/src/templates/index.js new file mode 100755 index 0000000..af6b09c --- /dev/null +++ b/global-site/src/templates/index.js @@ -0,0 +1,65 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { graphql } from 'gatsby' + +import { Layout, PostCard, Pagination } from '../components/common' +import { MetaData } from '../components/common/meta' + +/** +* Main index page (home page) +* +* Loads all posts from Ghost and uses pagination to navigate through them. +* The number of posts that should appear per page can be setup +* in /utils/siteConfig.js under `postsPerPage`. +* +*/ +const Index = ({ data, location, pageContext }) => { + const posts = data.allGhostPost.edges + + return ( + <> + + +
+
+ {posts.map(({ node }) => ( + // The tag below includes the markup for each post - components/common/PostCard.js + + ))} +
+ +
+
+ + ) +} + +Index.propTypes = { + data: PropTypes.shape({ + allGhostPost: PropTypes.object.isRequired, + }).isRequired, + location: PropTypes.shape({ + pathname: PropTypes.string.isRequired, + }).isRequired, + pageContext: PropTypes.object, +} + +export default Index + +// This page query loads all posts sorted descending by published date +// The `limit` and `skip` values are used for pagination +export const pageQuery = graphql` + query GhostPostQuery($limit: Int!, $skip: Int!) { + allGhostPost( + sort: { order: DESC, fields: [published_at] }, + limit: $limit, + skip: $skip + ) { + edges { + node { + ...GhostPostFields + } + } + } + } +` diff --git a/global-site/src/templates/page.js b/global-site/src/templates/page.js new file mode 100755 index 0000000..ac3ef23 --- /dev/null +++ b/global-site/src/templates/page.js @@ -0,0 +1,64 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { graphql } from 'gatsby' +import Helmet from 'react-helmet' + +import { Layout } from '../components/common' +import { MetaData } from '../components/common/meta' + +/** +* Single page (/:slug) +* +* This file renders a single page and loads all the content. +* +*/ +const Page = ({ data, location }) => { + const page = data.ghostPage + + return ( + <> + + + + + +
+
+

{page.title}

+ + {/* The main page content */} +
+
+
+
+ + ) +} + +Page.propTypes = { + data: PropTypes.shape({ + ghostPage: PropTypes.shape({ + title: PropTypes.string.isRequired, + html: PropTypes.string.isRequired, + feature_image: PropTypes.string, + }).isRequired, + }).isRequired, + location: PropTypes.object.isRequired, +} + +export default Page + +export const postQuery = graphql` + query($slug: String!) { + ghostPage(slug: { eq: $slug }) { + ...GhostPageFields + } + } +` diff --git a/global-site/src/templates/post.js b/global-site/src/templates/post.js new file mode 100755 index 0000000..491ff7c --- /dev/null +++ b/global-site/src/templates/post.js @@ -0,0 +1,70 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { graphql } from 'gatsby' +import Helmet from 'react-helmet' + +import { Layout } from '../components/common' +import { MetaData } from '../components/common/meta' + +/** +* Single post view (/:slug) +* +* This file renders a single post and loads all the content. +* +*/ +const Post = ({ data, location }) => { + const post = data.ghostPost + + return ( + <> + + + + + +
+
+ { post.feature_image ? +
+ { +
: null } +
+

{post.title}

+ + {/* The main post content */ } +
+
+
+
+
+ + ) +} + +Post.propTypes = { + data: PropTypes.shape({ + ghostPost: PropTypes.shape({ + title: PropTypes.string.isRequired, + html: PropTypes.string.isRequired, + feature_image: PropTypes.string, + }).isRequired, + }).isRequired, + location: PropTypes.object.isRequired, +} + +export default Post + +export const postQuery = graphql` + query($slug: String!) { + ghostPost(slug: { eq: $slug }) { + ...GhostPostFields + } + } +` diff --git a/global-site/src/templates/tag.js b/global-site/src/templates/tag.js new file mode 100755 index 0000000..75caa20 --- /dev/null +++ b/global-site/src/templates/tag.js @@ -0,0 +1,78 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { graphql } from 'gatsby' + +import { Layout, PostCard, Pagination } from '../components/common' +import { MetaData } from '../components/common/meta' + +/** +* Tag page (/tag/:slug) +* +* Loads all posts for the requested tag incl. pagination. +* +*/ +const Tag = ({ data, location, pageContext }) => { + const tag = data.ghostTag + const posts = data.allGhostPost.edges + + return ( + <> + + +
+
+

{tag.name}

+ {tag.description ?

{tag.description}

: null } +
+
+ {posts.map(({ node }) => ( + // The tag below includes the markup for each post - components/common/PostCard.js + + ))} +
+ +
+
+ + ) +} + +Tag.propTypes = { + data: PropTypes.shape({ + ghostTag: PropTypes.shape({ + name: PropTypes.string.isRequired, + description: PropTypes.string, + }), + allGhostPost: PropTypes.object.isRequired, + }).isRequired, + location: PropTypes.shape({ + pathname: PropTypes.string.isRequired, + }).isRequired, + pageContext: PropTypes.object, +} + +export default Tag + +export const pageQuery = graphql` + query GhostTagQuery($slug: String!, $limit: Int!, $skip: Int!) { + ghostTag(slug: { eq: $slug }) { + ...GhostTagFields + } + allGhostPost( + sort: { order: DESC, fields: [published_at] }, + filter: {tags: {elemMatch: {slug: {eq: $slug}}}}, + limit: $limit, + skip: $skip + ) { + edges { + node { + ...GhostPostFields + } + } + } + } +` diff --git a/global-site/src/utils/fragments.js b/global-site/src/utils/fragments.js new file mode 100644 index 0000000..9701934 --- /dev/null +++ b/global-site/src/utils/fragments.js @@ -0,0 +1,239 @@ +import { graphql } from 'gatsby' + +/** +* These so called fragments are the fields we query on each template. +* A fragment make queries a bit more reuseable, so instead of typing and +* remembering every possible field, you can just use +* ...GhostPostFields +* for example to load all post fields into your GraphQL query. +* +* Further info ๐Ÿ‘‰๐Ÿผ https://www.gatsbyjs.org/docs/graphql-reference/#fragments +* +*/ + +// Used for tag archive pages +export const ghostTagFields = graphql` + fragment GhostTagFields on GhostTag { + slug + name + visibility + feature_image + description + meta_title + meta_description + } +` + +// Used for author pages +export const ghostAuthorFields = graphql` + fragment GhostAuthorFields on GhostAuthor { + slug + name + bio + cover_image + profile_image + location + website + twitter + facebook + } +` + +// Used for single posts +export const ghostPostFields = graphql` + fragment GhostPostFields on GhostPost { + # Main fields + id + title + slug + featured + feature_image + excerpt + custom_excerpt + + # Dates formatted + created_at_pretty: created_at(formatString: "DD MMMM, YYYY") + published_at_pretty: published_at(formatString: "DD MMMM, YYYY") + updated_at_pretty: updated_at(formatString: "DD MMMM, YYYY") + + # Dates unformatted + created_at + published_at + updated_at + + # SEO + meta_title + meta_description + og_description + og_image + og_title + twitter_description + twitter_image + twitter_title + + # Authors + authors { + name + slug + bio + # email + profile_image + twitter + facebook + website + } + primary_author { + name + slug + bio + # email + profile_image + twitter + facebook + website + } + + # Tags + primary_tag { + name + slug + description + feature_image + meta_description + meta_title + visibility + } + tags { + name + slug + description + feature_image + meta_description + meta_title + visibility + } + + # Content + plaintext + html + + # Additional fields + url + uuid + page + codeinjection_foot + codeinjection_head + codeinjection_styles + comment_id + } +` + +// Used for single pages +export const ghostPageFields = graphql` + fragment GhostPageFields on GhostPage { + # Main fields + title + slug + featured + feature_image + excerpt + custom_excerpt + + # Dates formatted + created_at_pretty: created_at(formatString: "DD MMMM, YYYY") + published_at_pretty: published_at(formatString: "DD MMMM, YYYY") + updated_at_pretty: updated_at(formatString: "DD MMMM, YYYY") + + # Dates unformatted + created_at + published_at + updated_at + + # SEO + meta_title + meta_description + og_description + og_image + og_title + twitter_description + twitter_image + twitter_title + + # Authors + authors { + name + slug + bio + # email + profile_image + twitter + facebook + website + } + primary_author { + name + slug + bio + # email + profile_image + twitter + facebook + website + } + + # Tags + primary_tag { + name + slug + description + feature_image + meta_description + meta_title + visibility + } + tags { + name + slug + description + feature_image + meta_description + meta_title + visibility + } + + # Content + plaintext + html + + # Additional fields + url + uuid + page + codeinjection_foot + codeinjection_head + codeinjection_styles + comment_id + } +` + +// Used for settings +export const ghostSettingsFields = graphql` + fragment GhostSettingsFields on GhostSettings { + title + description + logo + icon + cover_image + facebook + twitter + lang + timezone + codeinjection_head + codeinjection_foot + codeinjection_styles + navigation { + label + url + } + } +` diff --git a/global-site/src/utils/rss/generate-feed.js b/global-site/src/utils/rss/generate-feed.js new file mode 100644 index 0000000..9dcad19 --- /dev/null +++ b/global-site/src/utils/rss/generate-feed.js @@ -0,0 +1,121 @@ +const cheerio = require(`cheerio`) +const tagsHelper = require(`@tryghost/helpers`).tags +const _ = require(`lodash`) + +const generateItem = function generateItem(post) { + const itemUrl = post.url + const html = post.html + const htmlContent = cheerio.load(html, { decodeEntities: false, xmlMode: true }) + const item = { + title: post.title, + description: post.excerpt, + guid: post.id, + url: itemUrl, + date: post.published_at, + categories: _.map(tagsHelper(post, { visibility: `public`, fn: tag => tag }), `name`), + author: post.primary_author ? post.primary_author.name : null, + custom_elements: [], + } + let imageUrl + + if (post.feature_image) { + imageUrl = post.feature_image + + // Add a media content tag + item.custom_elements.push({ + 'media:content': { + _attr: { + url: imageUrl, + medium: `image`, + }, + }, + }) + + // Also add the image to the content, because not all readers support media:content + htmlContent(`p`).first().before(``) + htmlContent(`img`).attr(`alt`, post.title) + } + + item.custom_elements.push({ + 'content:encoded': { + _cdata: htmlContent.html(), + }, + }) + return item +} + +const generateRSSFeed = function generateRSSFeed(siteConfig) { + return { + serialize: ({ query: { allGhostPost } }) => allGhostPost.edges.map(edge => Object.assign({}, generateItem(edge.node))), + setup: ({ query: { allGhostSettings } }) => { + const siteTitle = allGhostSettings.edges[0].node.title || `No Title` + const siteDescription = allGhostSettings.edges[0].node.description || `No Description` + const feed = { + title: siteTitle, + description: siteDescription, + // generator: `Ghost ` + data.safeVersion, + generator: `Ghost 2.9`, + feed_url: `${siteConfig.siteUrl}/rss/`, + site_url: `${siteConfig.siteUrl}/`, + image_url: `${siteConfig.siteUrl}/${siteConfig.siteIcon}`, + ttl: `60`, + custom_namespaces: { + content: `http://purl.org/rss/1.0/modules/content/`, + media: `http://search.yahoo.com/mrss/`, + }, + } + return { + ...feed, + } + }, + query: ` + { + allGhostPost( + sort: {order: DESC, fields: published_at} + ) { + edges { + node { + # Main fields + id + title + slug + featured + feature_image + + # Dates unformatted + created_at + published_at + updated_at + + # SEO + excerpt + meta_title + meta_description + + # Authors + authors { + name + } + primary_author { + name + } + tags { + name + visibility + } + + # Content + html + + # Additional fields + url + } + } + } + } + `, + output: `/rss`, + } +} + +module.exports = generateRSSFeed diff --git a/global-site/src/utils/siteConfig.js b/global-site/src/utils/siteConfig.js new file mode 100644 index 0000000..1bfca8a --- /dev/null +++ b/global-site/src/utils/siteConfig.js @@ -0,0 +1,16 @@ +module.exports = { + siteUrl: `https://gatsby.ghost.org`, // Site domain. Do not include a trailing slash! + + postsPerPage: 12, // Number of posts shown on paginated pages (changes this requires sometimes to delete the cache) + + siteTitleMeta: `Ghost Gatsby Starter`, // This allows an alternative site title for meta data for pages. + siteDescriptionMeta: `A starter template to build amazing static websites with Ghost and Gatsby`, // This allows an alternative site description for meta data for pages. + + shareImageWidth: 1000, // Change to the width of your default share image + shareImageHeight: 523, // Change to the height of your default share image + + shortTitle: `Ghost`, // Used for App manifest e.g. Mobile Home Screen + siteIcon: `favicon.png`, // Logo in /static dir used for SEO, RSS, and App manifest + backgroundColor: `#e9e9e9`, // Used for Offline Manifest + themeColor: `#15171A`, // Used for Offline Manifest +} diff --git a/global-site/static/_headers b/global-site/static/_headers new file mode 100644 index 0000000..a7e3864 --- /dev/null +++ b/global-site/static/_headers @@ -0,0 +1,18 @@ +# This is recommended to prevent the caching of the service worker file itself +# https://www.netlify.com/blog/2018/06/28/5-pro-tips-and-plugins-for-optimizing-your-gatsby---netlify-site/#4-get-your-service-workers-um-working +/sw.js # Gatsby's default service worker file path + Cache-Control: no-cache + +/rss + content-type: application/rss+xml; charset=UTF-8 + +# These are default recommended security headers, for Netlify +# https://www.netlify.com/docs/headers-and-basic-auth/ + +/* + Referrer-Policy: no-referrer-when-downgrade + Strict-Transport-Security: max-age=31536000 + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-Xss-Protection: 1; mode=block + Feature-Policy: accelerometer 'none'; camera 'none'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; payment 'none'; usb 'none' diff --git a/global-site/static/_redirects b/global-site/static/_redirects new file mode 100644 index 0000000..106824d --- /dev/null +++ b/global-site/static/_redirects @@ -0,0 +1,5 @@ +# Netlify redirects file, edit with your domain +# https://www.netlify.com/docs/redirects/ + +https://gatsby-starter-ghost.netlify.com/* https://gatsby.ghost.org/:splat 301! +http://gatsby-starter-ghost.netlify.com/* https://gatsby.ghost.org/:splat 301! diff --git a/global-site/static/favicon.ico b/global-site/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c24e3c410330d199710adb42c6a1f624ef87c013 GIT binary patch literal 15086 zcmeHOX>b%p6dnqz{G$cGEPv*QTK*FSLP$2*T;vWR2PqFw!4hH#B7$5cuyPfLMM)v2 zf+)om!WoXp8L^Nn;Yb2Xgak+|NjL=aPf~fluXlSg+00~SCp+0Jq}3P9v1?8 z-Vs*UACo4_CrGK(C2((M%IN%8o5Q- z?ux{_+8f8anI9j*XBTTkSKm3v=t^F!n!e55?MK=2xrrwrr1$9z}CB#LE_DQ|44P~e^k^?5NrHm6PY*@Br z5!F;zQElz-RC~QMUAtC8>({QLeJDso{J{*yqO7-=1 zWcGV-|2~a=r;uDj2MR(SWoAEMLx&S%DK>f_<>zKnb5oO<8Pw9!LLZKOSG6B`l$rg2 z4IR)G>^^``@<(J+)7`sfW(Zq97&A(>A9*YG0~I-IZ{{R!N{g5fm(%h~)MFQlb@gtA2oJYwwo_dnhN)EUVEv#=n?G25j* zXhTfY8|v7Q?`V7Kt&{vR_11SG$Cys}UE1(8q|*P{{z1uH;d-Zo+-xi z!ucKw2I0K`Ca|4q18`G$Za8uLD7Ch>Qd?VFPzjj8h7Kp%08Fd%zu7!#RPXHk&+9L* zEzM2l>z9#zX63;4u3yfqzv(FnbmrI7W@gx~KYQjhL5CCLN6ww2-X2NIzgj}8zga=6 zR(>560v0fVE%i8+Vjb#w{qlZuwy$T_o+YMJc0Vn+7@P1_46k1?QP#-C{Ce&8_9bHo zte#oFa=r`%+jXzWzU;-ODoM;0u^G9UR-MfF;njiP= z-L39zG5+wqfHhqE12%LxW54zNqt+&wKTx`_gZ=Y7Uv#qH>HQ=2QFrd#mL>(1mh9Y4 z@v%e1I{^RBnlV*;M`=NTE%$AD?|XO465T^-?dp}(*w8@D%}ru251$zlc$lu%RMRID z#;fB3<0Fs9$?;=HsENNBzynNRLq~V*G?Is2;KN5aC$LI5xAMmXR%)_aeD44Un80>o z?Ca^q8HaV!KO2OtUILarkH2o6XIp2WIyjwt+ygu^Mi~m-!O$t=tHHnu1%`+X_dq{8 z)wWG>-dKB>#_tB_hI{-JaqMu8U&}Z=V)FbRgysDKwGCl>e?zvxdw)j6nOc~Fy*2?8*wdg(YX{FUuW)%O)4xo? z*6WW49i`9-8+`4CZht*vayb4CLL3}-6%yjw_oK+840VzZGLW^S6EbK|YH}Ry-Ls2s)z?#f zU7eRW7GHPs2CZDNT*XEnW%XPq`5?1*Pl>>=vxkEW;yy;_LTC6)9Q#@j@_IkW+KnAS ze_l>HH8kAOgBI~>+}i*d#jYU>3_I;d9{_v7yg9VHq?mS1 z(u5*WwoAhY8OQ>|?ihd^&IJAK$1}<$t`#218)ypb?ogomwEXa$XU;4t-m%q7+c~vD zK7PpB^*?-^i}7dkTn>X4vcT}~KW!V0@{q~P$)Lu@2Ho**r4X{fu%jP#;oV-kcmW+c zu%8YFNRU~&c%i^BYNM5M?Kro>ujT2Eti%C^h^rvBVnA9w@U`UAmP@=q()idYai06* z4;#sdzTfyQ6^$FC&P8t(=F<9gt7$XK;4E044F{qZyl4l`E^pteHyvsxPaNZZju!3S zxM97@4_UkC&N#y?$jh>HuL`kW+{J^xw{6|5>POrh78FPj_F^ye2FS6FVMt~#|c6nWo3sC2p;fCz5Xfg1K@6aMrxwi zXJW63Jjzh#&o7^WnaTPOA1bBGmoCz!ixo_jKB^F9hYywt9zFeD`;+PDkuth=wMN`; z$Gv$$HC3Vvb%>4X$xAz={h4X7Ig!#*;@R$4UbB#z*w1Y&-M@z_E}WzD=gx9^Uab4r zFK_s69e=Ct6MoRsk237h;b+`^zjv>h9z3{Dznm%;cHpi>b@dg&qbCphF*eY@BlELq zWF8Zz*%`xx&*6XI>x`ccV-VQ*UXdhqA(eUQD^4Mccfj`hqj?8yy}zDr%uJB|4{t4J A_5c6? literal 0 HcmV?d00001 diff --git a/global-site/static/favicon.png b/global-site/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..6458c1f5972525e340123b59979848fd128fe2f3 GIT binary patch literal 6792 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 8 \ No newline at end of file diff --git a/global-site/static/images/icons/facebook.svg b/global-site/static/images/icons/facebook.svg new file mode 100644 index 0000000..1fa8867 --- /dev/null +++ b/global-site/static/images/icons/facebook.svg @@ -0,0 +1 @@ + diff --git a/global-site/static/images/icons/rss.svg b/global-site/static/images/icons/rss.svg new file mode 100644 index 0000000..025a148 --- /dev/null +++ b/global-site/static/images/icons/rss.svg @@ -0,0 +1 @@ + diff --git a/global-site/static/images/icons/twitter.svg b/global-site/static/images/icons/twitter.svg new file mode 100644 index 0000000..45f34cc --- /dev/null +++ b/global-site/static/images/icons/twitter.svg @@ -0,0 +1 @@ + diff --git a/global-site/static/images/logo.svg b/global-site/static/images/logo.svg new file mode 100644 index 0000000..cb6e72d --- /dev/null +++ b/global-site/static/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/global-site/static/robots.txt b/global-site/static/robots.txt new file mode 100755 index 0000000..c2a49f4 --- /dev/null +++ b/global-site/static/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow: / diff --git a/package.json b/package.json new file mode 100644 index 0000000..3de56c7 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "osoc", + "version": "1.0.0", + "description": "", + "main": "index.js", + "dependencies": {}, + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/opensummerofcode/global-site.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/opensummerofcode/global-site/issues" + }, + "homepage": "https://github.com/opensummerofcode/global-site#readme" +} From d3c6f2dbda58bfb03e71079c203f3f628023d1bc Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 22 Jul 2019 16:00:48 +0200 Subject: [PATCH 02/12] it didn't work so I did a reset of everything and now it's okay --- {global-site => gatsby-site}/.gitignore | 26 +- gatsby-site/.prettierrc | 7 + gatsby-site/LICENSE | 22 + gatsby-site/README.md | 97 ++ gatsby-site/gatsby-browser.js | 7 + gatsby-site/gatsby-config.js | 44 + gatsby-site/gatsby-node.js | 7 + gatsby-site/gatsby-ssr.js | 7 + gatsby-site/package.json | 43 + gatsby-site/src/components/header.js | 61 + gatsby-site/src/components/image.js | 32 + gatsby-site/src/components/layout.css | 622 ++++++++++ gatsby-site/src/components/layout.js | 58 + gatsby-site/src/components/seo.js | 88 ++ gatsby-site/src/images/gatsby-astronaut.png | Bin 0 -> 167273 bytes gatsby-site/src/images/gatsby-icon.png | Bin 0 -> 21212 bytes gatsby-site/src/pages/404.js | 14 + gatsby-site/src/pages/index.js | 21 + gatsby-site/src/pages/page-2.js | 16 + global-site/.editorconfig | 26 - global-site/.eslintignore | 3 - global-site/.eslintrc.js | 59 - global-site/.ghost.json | 10 - .../.github/ISSUE_TEMPLATE/---bug-report.md | 36 - .../.github/ISSUE_TEMPLATE/--anything-else.md | 25 - global-site/LICENSE | 22 - global-site/README.md | 85 -- global-site/gatsby-browser.js | 32 - global-site/gatsby-config.js | 184 --- global-site/gatsby-node.js | 210 ---- global-site/netlify.toml | 6 - global-site/package.json | 57 - .../gatsby-plugin-ghost-manifest/.babelrc | 10 - .../gatsby-plugin-ghost-manifest/common.js | 55 - .../gatsby-node.js | 104 -- .../gatsby-ssr.js | 61 - .../gatsby-plugin-ghost-manifest/index.js | 1 - .../gatsby-plugin-ghost-manifest/package.json | 36 - .../src/common.js | 62 - .../src/gatsby-node.js | 71 -- .../src/gatsby-ssr.js | 67 -- global-site/src/components/common/Layout.js | 133 --- .../src/components/common/Navigation.js | 41 - .../src/components/common/Pagination.js | 36 - global-site/src/components/common/PostCard.js | 59 - global-site/src/components/common/index.js | 4 - .../src/components/common/meta/ArticleMeta.js | 167 --- .../src/components/common/meta/AuthorMeta.js | 93 -- .../src/components/common/meta/ImageMeta.js | 26 - .../src/components/common/meta/MetaData.js | 118 -- .../src/components/common/meta/WebsiteMeta.js | 107 -- .../common/meta/getAuthorProperties.js | 37 - .../src/components/common/meta/index.js | 1 - global-site/src/images/ghost-icon.png | Bin 7935 -> 0 bytes global-site/src/pages/404.js | 18 - global-site/src/styles/app.css | 1018 ----------------- global-site/src/templates/author.js | 96 -- global-site/src/templates/index.js | 65 -- global-site/src/templates/page.js | 64 -- global-site/src/templates/post.js | 70 -- global-site/src/templates/tag.js | 78 -- global-site/src/utils/fragments.js | 239 ---- global-site/src/utils/rss/generate-feed.js | 121 -- global-site/src/utils/siteConfig.js | 16 - global-site/static/_headers | 18 - global-site/static/_redirects | 5 - global-site/static/favicon.ico | Bin 15086 -> 0 bytes global-site/static/favicon.png | Bin 6792 -> 0 bytes global-site/static/images/icons/avatar.svg | 1 - global-site/static/images/icons/facebook.svg | 1 - global-site/static/images/icons/rss.svg | 1 - global-site/static/images/icons/twitter.svg | 1 - global-site/static/images/logo.svg | 1 - global-site/static/robots.txt | 2 - 74 files changed, 1156 insertions(+), 3875 deletions(-) rename {global-site => gatsby-site}/.gitignore (85%) create mode 100644 gatsby-site/.prettierrc create mode 100644 gatsby-site/LICENSE create mode 100644 gatsby-site/README.md create mode 100644 gatsby-site/gatsby-browser.js create mode 100644 gatsby-site/gatsby-config.js create mode 100644 gatsby-site/gatsby-node.js create mode 100644 gatsby-site/gatsby-ssr.js create mode 100644 gatsby-site/package.json create mode 100644 gatsby-site/src/components/header.js create mode 100644 gatsby-site/src/components/image.js create mode 100644 gatsby-site/src/components/layout.css create mode 100644 gatsby-site/src/components/layout.js create mode 100644 gatsby-site/src/components/seo.js create mode 100644 gatsby-site/src/images/gatsby-astronaut.png create mode 100644 gatsby-site/src/images/gatsby-icon.png create mode 100644 gatsby-site/src/pages/404.js create mode 100644 gatsby-site/src/pages/index.js create mode 100644 gatsby-site/src/pages/page-2.js delete mode 100644 global-site/.editorconfig delete mode 100644 global-site/.eslintignore delete mode 100644 global-site/.eslintrc.js delete mode 100644 global-site/.ghost.json delete mode 100644 global-site/.github/ISSUE_TEMPLATE/---bug-report.md delete mode 100644 global-site/.github/ISSUE_TEMPLATE/--anything-else.md delete mode 100755 global-site/LICENSE delete mode 100755 global-site/README.md delete mode 100755 global-site/gatsby-browser.js delete mode 100755 global-site/gatsby-config.js delete mode 100755 global-site/gatsby-node.js delete mode 100644 global-site/netlify.toml delete mode 100755 global-site/package.json delete mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/.babelrc delete mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/common.js delete mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-node.js delete mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-ssr.js delete mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/index.js delete mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/package.json delete mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/src/common.js delete mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-node.js delete mode 100644 global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-ssr.js delete mode 100644 global-site/src/components/common/Layout.js delete mode 100644 global-site/src/components/common/Navigation.js delete mode 100644 global-site/src/components/common/Pagination.js delete mode 100644 global-site/src/components/common/PostCard.js delete mode 100644 global-site/src/components/common/index.js delete mode 100644 global-site/src/components/common/meta/ArticleMeta.js delete mode 100644 global-site/src/components/common/meta/AuthorMeta.js delete mode 100644 global-site/src/components/common/meta/ImageMeta.js delete mode 100644 global-site/src/components/common/meta/MetaData.js delete mode 100644 global-site/src/components/common/meta/WebsiteMeta.js delete mode 100644 global-site/src/components/common/meta/getAuthorProperties.js delete mode 100644 global-site/src/components/common/meta/index.js delete mode 100644 global-site/src/images/ghost-icon.png delete mode 100755 global-site/src/pages/404.js delete mode 100644 global-site/src/styles/app.css delete mode 100755 global-site/src/templates/author.js delete mode 100755 global-site/src/templates/index.js delete mode 100755 global-site/src/templates/page.js delete mode 100755 global-site/src/templates/post.js delete mode 100755 global-site/src/templates/tag.js delete mode 100644 global-site/src/utils/fragments.js delete mode 100644 global-site/src/utils/rss/generate-feed.js delete mode 100644 global-site/src/utils/siteConfig.js delete mode 100644 global-site/static/_headers delete mode 100644 global-site/static/_redirects delete mode 100644 global-site/static/favicon.ico delete mode 100644 global-site/static/favicon.png delete mode 100644 global-site/static/images/icons/avatar.svg delete mode 100644 global-site/static/images/icons/facebook.svg delete mode 100644 global-site/static/images/icons/rss.svg delete mode 100644 global-site/static/images/icons/twitter.svg delete mode 100644 global-site/static/images/logo.svg delete mode 100755 global-site/static/robots.txt diff --git a/global-site/.gitignore b/gatsby-site/.gitignore similarity index 85% rename from global-site/.gitignore rename to gatsby-site/.gitignore index 631a24b..e86fe25 100644 --- a/global-site/.gitignore +++ b/gatsby-site/.gitignore @@ -1,5 +1,3 @@ -# Node template - # Logs logs *.log @@ -31,7 +29,7 @@ bower_components # node-waf configuration .lock-wscript -# Compiled binary addons (https://nodejs.org/api/addons.html) +# Compiled binary addons (http://nodejs.org/api/addons.html) build/Release # Dependency directories @@ -53,23 +51,19 @@ typings/ # Output of 'npm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # dotenv environment variables file .env -# IDE -.idea/* -*.iml -*.sublime-* +# gatsby files +.cache/ +public -# OSX +# Mac files .DS_Store -.vscode -# Docs Custom -.cache/ -public +# Yarn yarn-error.log -.netlify/ +.pnp/ +.pnp.js +# Yarn Integrity file +.yarn-integrity diff --git a/gatsby-site/.prettierrc b/gatsby-site/.prettierrc new file mode 100644 index 0000000..48e90e8 --- /dev/null +++ b/gatsby-site/.prettierrc @@ -0,0 +1,7 @@ +{ + "endOfLine": "lf", + "semi": false, + "singleQuote": false, + "tabWidth": 2, + "trailingComma": "es5" +} diff --git a/gatsby-site/LICENSE b/gatsby-site/LICENSE new file mode 100644 index 0000000..5169a5e --- /dev/null +++ b/gatsby-site/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 gatsbyjs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/gatsby-site/README.md b/gatsby-site/README.md new file mode 100644 index 0000000..11e2af0 --- /dev/null +++ b/gatsby-site/README.md @@ -0,0 +1,97 @@ + +

+ + Gatsby + +

+

+ Gatsby's default starter +

+ +Kick off your project with this default boilerplate. This starter ships with the main Gatsby configuration files you might need to get up and running blazing fast with the blazing fast app generator for React. + +_Have another more specific idea? You may want to check out our vibrant collection of [official and community-created starters](https://www.gatsbyjs.org/docs/gatsby-starters/)._ + +## ๐Ÿš€ Quick start + +1. **Create a Gatsby site.** + + Use the Gatsby CLI to create a new site, specifying the default starter. + + ```sh + # create a new Gatsby site using the default starter + gatsby new my-default-starter https://github.com/gatsbyjs/gatsby-starter-default + ``` + +1. **Start developing.** + + Navigate into your new siteโ€™s directory and start it up. + + ```sh + cd my-default-starter/ + gatsby develop + ``` + +1. **Open the source code and start editing!** + + Your site is now running at `http://localhost:8000`! + + _Note: You'll also see a second link: _`http://localhost:8000/___graphql`_. This is a tool you can use to experiment with querying your data. Learn more about using this tool in the [Gatsby tutorial](https://www.gatsbyjs.org/tutorial/part-five/#introducing-graphiql)._ + + Open the `my-default-starter` directory in your code editor of choice and edit `src/pages/index.js`. Save your changes and the browser will update in real time! + +## ๐Ÿง What's inside? + +A quick look at the top-level files and directories you'll see in a Gatsby project. + + . + โ”œโ”€โ”€ node_modules + โ”œโ”€โ”€ src + โ”œโ”€โ”€ .gitignore + โ”œโ”€โ”€ .prettierrc + โ”œโ”€โ”€ gatsby-browser.js + โ”œโ”€โ”€ gatsby-config.js + โ”œโ”€โ”€ gatsby-node.js + โ”œโ”€โ”€ gatsby-ssr.js + โ”œโ”€โ”€ LICENSE + โ”œโ”€โ”€ package-lock.json + โ”œโ”€โ”€ package.json + โ””โ”€โ”€ README.md + +1. **`/node_modules`**: This directory contains all of the modules of code that your project depends on (npm packages) are automatically installed. + +2. **`/src`**: This directory will contain all of the code related to what you will see on the front-end of your site (what you see in the browser) such as your site header or a page template. `src` is a convention for โ€œsource codeโ€. + +3. **`.gitignore`**: This file tells git which files it should not track / not maintain a version history for. + +4. **`.prettierrc`**: This is a configuration file for [Prettier](https://prettier.io/). Prettier is a tool to help keep the formatting of your code consistent. + +5. **`gatsby-browser.js`**: This file is where Gatsby expects to find any usage of the [Gatsby browser APIs](https://www.gatsbyjs.org/docs/browser-apis/) (if any). These allow customization/extension of default Gatsby settings affecting the browser. + +6. **`gatsby-config.js`**: This is the main configuration file for a Gatsby site. This is where you can specify information about your site (metadata) like the site title and description, which Gatsby plugins youโ€™d like to include, etc. (Check out the [config docs](https://www.gatsbyjs.org/docs/gatsby-config/) for more detail). + +7. **`gatsby-node.js`**: This file is where Gatsby expects to find any usage of the [Gatsby Node APIs](https://www.gatsbyjs.org/docs/node-apis/) (if any). These allow customization/extension of default Gatsby settings affecting pieces of the site build process. + +8. **`gatsby-ssr.js`**: This file is where Gatsby expects to find any usage of the [Gatsby server-side rendering APIs](https://www.gatsbyjs.org/docs/ssr-apis/) (if any). These allow customization of default Gatsby settings affecting server-side rendering. + +9. **`LICENSE`**: Gatsby is licensed under the MIT license. + +10. **`package-lock.json`** (See `package.json` below, first). This is an automatically generated file based on the exact versions of your npm dependencies that were installed for your project. **(You wonโ€™t change this file directly).** + +11. **`package.json`**: A manifest file for Node.js projects, which includes things like metadata (the projectโ€™s name, author, etc). This manifest is how npm knows which packages to install for your project. + +12. **`README.md`**: A text file containing useful reference information about your project. + +## ๐ŸŽ“ Learning Gatsby + +Looking for more guidance? Full documentation for Gatsby lives [on the website](https://www.gatsbyjs.org/). Here are some places to start: + +- **For most developers, we recommend starting with our [in-depth tutorial for creating a site with Gatsby](https://www.gatsbyjs.org/tutorial/).** It starts with zero assumptions about your level of ability and walks through every step of the process. + +- **To dive straight into code samples, head [to our documentation](https://www.gatsbyjs.org/docs/).** In particular, check out the _Guides_, _API Reference_, and _Advanced Tutorials_ sections in the sidebar. + +## ๐Ÿ’ซ Deploy + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/gatsbyjs/gatsby-starter-default) + + diff --git a/gatsby-site/gatsby-browser.js b/gatsby-site/gatsby-browser.js new file mode 100644 index 0000000..b1e5c31 --- /dev/null +++ b/gatsby-site/gatsby-browser.js @@ -0,0 +1,7 @@ +/** + * Implement Gatsby's Browser APIs in this file. + * + * See: https://www.gatsbyjs.org/docs/browser-apis/ + */ + +// You can delete this file if you're not using it diff --git a/gatsby-site/gatsby-config.js b/gatsby-site/gatsby-config.js new file mode 100644 index 0000000..26bcad4 --- /dev/null +++ b/gatsby-site/gatsby-config.js @@ -0,0 +1,44 @@ +module.exports = { + siteMetadata: { + title: `Gatsby Default Starter`, + description: `Kick off your next, great Gatsby project with this default starter. This barebones starter ships with the main Gatsby configuration files you might need.`, + author: `@gatsbyjs`, + menuLinks:[ + { + name:'home', + link:'/' + }, + { + name:'page2', + link:'/page-2' + } + ] + }, + plugins: [ + `gatsby-plugin-react-helmet`, + { + resolve: `gatsby-source-filesystem`, + options: { + name: `images`, + path: `${__dirname}/src/images`, + }, + }, + `gatsby-transformer-sharp`, + `gatsby-plugin-sharp`, + { + resolve: `gatsby-plugin-manifest`, + options: { + name: `gatsby-starter-default`, + short_name: `starter`, + start_url: `/`, + background_color: `#663399`, + theme_color: `#663399`, + display: `minimal-ui`, + icon: `src/images/gatsby-icon.png`, // This path is relative to the root of the site. + }, + }, + // this (optional) plugin enables Progressive Web App + Offline functionality + // To learn more, visit: https://gatsby.dev/offline + // `gatsby-plugin-offline`, + ], +} diff --git a/gatsby-site/gatsby-node.js b/gatsby-site/gatsby-node.js new file mode 100644 index 0000000..2f42665 --- /dev/null +++ b/gatsby-site/gatsby-node.js @@ -0,0 +1,7 @@ +/** + * Implement Gatsby's Node APIs in this file. + * + * See: https://www.gatsbyjs.org/docs/node-apis/ + */ + +// You can delete this file if you're not using it diff --git a/gatsby-site/gatsby-ssr.js b/gatsby-site/gatsby-ssr.js new file mode 100644 index 0000000..b17b8fc --- /dev/null +++ b/gatsby-site/gatsby-ssr.js @@ -0,0 +1,7 @@ +/** + * Implement Gatsby's SSR (Server Side Rendering) APIs in this file. + * + * See: https://www.gatsbyjs.org/docs/ssr-apis/ + */ + +// You can delete this file if you're not using it diff --git a/gatsby-site/package.json b/gatsby-site/package.json new file mode 100644 index 0000000..2cb0061 --- /dev/null +++ b/gatsby-site/package.json @@ -0,0 +1,43 @@ +{ + "name": "gatsby-starter-default", + "private": true, + "description": "A simple starter to get up and developing quickly with Gatsby", + "version": "0.1.0", + "author": "Kyle Mathews ", + "dependencies": { + "gatsby": "^2.13.31", + "gatsby-image": "^2.2.6", + "gatsby-plugin-manifest": "^2.2.3", + "gatsby-plugin-offline": "^2.2.4", + "gatsby-plugin-react-helmet": "^3.1.2", + "gatsby-plugin-sharp": "^2.2.8", + "gatsby-source-filesystem": "^2.1.5", + "gatsby-transformer-sharp": "^2.2.4", + "prop-types": "^15.7.2", + "react": "^16.8.6", + "react-dom": "^16.8.6", + "react-helmet": "^5.2.1" + }, + "devDependencies": { + "prettier": "^1.18.2" + }, + "keywords": [ + "gatsby" + ], + "license": "MIT", + "scripts": { + "build": "gatsby build", + "develop": "gatsby develop", + "format": "prettier --write src/**/*.{js,jsx}", + "start": "npm run develop", + "serve": "gatsby serve", + "test": "echo \"Write tests! -> https://gatsby.dev/unit-testing\"" + }, + "repository": { + "type": "git", + "url": "https://github.com/gatsbyjs/gatsby-starter-default" + }, + "bugs": { + "url": "https://github.com/gatsbyjs/gatsby/issues" + } +} diff --git a/gatsby-site/src/components/header.js b/gatsby-site/src/components/header.js new file mode 100644 index 0000000..81a28ac --- /dev/null +++ b/gatsby-site/src/components/header.js @@ -0,0 +1,61 @@ +import { Link } from "gatsby" +import PropTypes from "prop-types" +import React from "react" + +const Header = ({ siteTitle, menuLinks }) => ( +
+
+

+ + {siteTitle} + +

+
+ +
+
+
+) + +Header.propTypes = { + siteTitle: PropTypes.string, +} + +Header.defaultProps = { + siteTitle: ``, +} + +export default Header diff --git a/gatsby-site/src/components/image.js b/gatsby-site/src/components/image.js new file mode 100644 index 0000000..e61edb6 --- /dev/null +++ b/gatsby-site/src/components/image.js @@ -0,0 +1,32 @@ +import React from "react" +import { useStaticQuery, graphql } from "gatsby" +import Img from "gatsby-image" + +/* + * This component is built using `gatsby-image` to automatically serve optimized + * images with lazy loading and reduced file sizes. The image is loaded using a + * `useStaticQuery`, which allows us to load the image from directly within this + * component, rather than having to pass the image data down from pages. + * + * For more information, see the docs: + * - `gatsby-image`: https://gatsby.dev/gatsby-image + * - `useStaticQuery`: https://www.gatsbyjs.org/docs/use-static-query/ + */ + +const Image = () => { + const data = useStaticQuery(graphql` + query { + placeholderImage: file(relativePath: { eq: "gatsby-astronaut.png" }) { + childImageSharp { + fluid(maxWidth: 300) { + ...GatsbyImageSharpFluid + } + } + } + } + `) + + return +} + +export default Image diff --git a/gatsby-site/src/components/layout.css b/gatsby-site/src/components/layout.css new file mode 100644 index 0000000..b6f6332 --- /dev/null +++ b/gatsby-site/src/components/layout.css @@ -0,0 +1,622 @@ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; +} +audio:not([controls]) { + display: none; + height: 0; +} +progress { + vertical-align: baseline; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; + -webkit-text-decoration-skip: objects; +} +a:active, +a:hover { + outline-width: 0; +} +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted; +} +b, +strong { + font-weight: inherit; + font-weight: bolder; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +mark { + background-color: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +img { + border-style: none; +} +svg:not(:root) { + overflow: hidden; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +figure { + margin: 1em 40px; +} +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} +button, +input, +optgroup, +select, +textarea { + font: inherit; + margin: 0; +} +optgroup { + font-weight: 700; +} +button, +input { + overflow: visible; +} +button, +select { + text-transform: none; +} +[type="reset"], +[type="submit"], +button, +html [type="button"] { + -webkit-appearance: button; +} +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner, +button::-moz-focus-inner { + border-style: none; + padding: 0; +} +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring, +button:-moz-focusring { + outline: 1px dotted ButtonText; +} +fieldset { + border: 1px solid silver; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} +textarea { + overflow: auto; +} +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + padding: 0; +} +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-input-placeholder { + color: inherit; + opacity: 0.54; +} +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} +html { + font: 112.5%/1.45em georgia, serif; + box-sizing: border-box; + overflow-y: scroll; +} +* { + box-sizing: inherit; +} +*:before { + box-sizing: inherit; +} +*:after { + box-sizing: inherit; +} +body { + color: hsla(0, 0%, 0%, 0.8); + font-family: georgia, serif; + font-weight: normal; + word-wrap: break-word; + font-kerning: normal; + -moz-font-feature-settings: "kern", "liga", "clig", "calt"; + -ms-font-feature-settings: "kern", "liga", "clig", "calt"; + -webkit-font-feature-settings: "kern", "liga", "clig", "calt"; + font-feature-settings: "kern", "liga", "clig", "calt"; +} +img { + max-width: 100%; + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +h1 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 2.25rem; + line-height: 1.1; +} +h2 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 1.62671rem; + line-height: 1.1; +} +h3 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 1.38316rem; + line-height: 1.1; +} +h4 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 1rem; + line-height: 1.1; +} +h5 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 0.85028rem; + line-height: 1.1; +} +h6 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 0.78405rem; + line-height: 1.1; +} +hgroup { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +ul { + margin-left: 1.45rem; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + list-style-position: outside; + list-style-image: none; +} +ol { + margin-left: 1.45rem; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + list-style-position: outside; + list-style-image: none; +} +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +dd { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +p { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +figure { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +pre { + margin-left: 0; + margin-right: 0; + margin-top: 0; + margin-bottom: 1.45rem; + font-size: 0.85rem; + line-height: 1.42; + background: hsla(0, 0%, 0%, 0.04); + border-radius: 3px; + overflow: auto; + word-wrap: normal; + padding: 1.45rem; +} +table { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + font-size: 1rem; + line-height: 1.45rem; + border-collapse: collapse; + width: 100%; +} +fieldset { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +blockquote { + margin-left: 1.45rem; + margin-right: 1.45rem; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +form { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +noscript { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +iframe { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +hr { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: calc(1.45rem - 1px); + background: hsla(0, 0%, 0%, 0.2); + border: none; + height: 1px; +} +address { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +b { + font-weight: bold; +} +strong { + font-weight: bold; +} +dt { + font-weight: bold; +} +th { + font-weight: bold; +} +li { + margin-bottom: calc(1.45rem / 2); +} +ol li { + padding-left: 0; +} +ul li { + padding-left: 0; +} +li > ol { + margin-left: 1.45rem; + margin-bottom: calc(1.45rem / 2); + margin-top: calc(1.45rem / 2); +} +li > ul { + margin-left: 1.45rem; + margin-bottom: calc(1.45rem / 2); + margin-top: calc(1.45rem / 2); +} +blockquote *:last-child { + margin-bottom: 0; +} +li *:last-child { + margin-bottom: 0; +} +p *:last-child { + margin-bottom: 0; +} +li > p { + margin-bottom: calc(1.45rem / 2); +} +code { + font-size: 0.85rem; + line-height: 1.45rem; +} +kbd { + font-size: 0.85rem; + line-height: 1.45rem; +} +samp { + font-size: 0.85rem; + line-height: 1.45rem; +} +abbr { + border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); + cursor: help; +} +acronym { + border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); + cursor: help; +} +abbr[title] { + border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); + cursor: help; + text-decoration: none; +} +thead { + text-align: left; +} +td, +th { + text-align: left; + border-bottom: 1px solid hsla(0, 0%, 0%, 0.12); + font-feature-settings: "tnum"; + -moz-font-feature-settings: "tnum"; + -ms-font-feature-settings: "tnum"; + -webkit-font-feature-settings: "tnum"; + padding-left: 0.96667rem; + padding-right: 0.96667rem; + padding-top: 0.725rem; + padding-bottom: calc(0.725rem - 1px); +} +th:first-child, +td:first-child { + padding-left: 0; +} +th:last-child, +td:last-child { + padding-right: 0; +} +tt, +code { + background-color: hsla(0, 0%, 0%, 0.04); + border-radius: 3px; + font-family: "SFMono-Regular", Consolas, "Roboto Mono", "Droid Sans Mono", + "Liberation Mono", Menlo, Courier, monospace; + padding: 0; + padding-top: 0.2em; + padding-bottom: 0.2em; +} +pre code { + background: none; + line-height: 1.42; +} +code:before, +code:after, +tt:before, +tt:after { + letter-spacing: -0.2em; + content: " "; +} +pre code:before, +pre code:after, +pre tt:before, +pre tt:after { + content: ""; +} +@media only screen and (max-width: 480px) { + html { + font-size: 100%; + } +} diff --git a/gatsby-site/src/components/layout.js b/gatsby-site/src/components/layout.js new file mode 100644 index 0000000..30d47ef --- /dev/null +++ b/gatsby-site/src/components/layout.js @@ -0,0 +1,58 @@ +/** + * Layout component that queries for data + * with Gatsby's useStaticQuery component + * + * See: https://www.gatsbyjs.org/docs/use-static-query/ + */ + +import React from "react" +import PropTypes from "prop-types" +import { useStaticQuery, graphql } from "gatsby" + +import Header from "./header" +import "./layout.css" + +const Layout = ({ children }) => { + const data = useStaticQuery(graphql` + query SiteTitleQuery { + site { + siteMetadata { + title + menuLinks { + name + link + } + } + } + } + `) + + return ( + <> +
+ +
+ +
{children}
+
+ ยฉ {new Date().getFullYear()}, Built with + {` `} + Gatsby +
+
+ + ) +} + +Layout.propTypes = { + children: PropTypes.node.isRequired, +} + +export default Layout diff --git a/gatsby-site/src/components/seo.js b/gatsby-site/src/components/seo.js new file mode 100644 index 0000000..e15f599 --- /dev/null +++ b/gatsby-site/src/components/seo.js @@ -0,0 +1,88 @@ +/** + * SEO component that queries for data with + * Gatsby's useStaticQuery React hook + * + * See: https://www.gatsbyjs.org/docs/use-static-query/ + */ + +import React from "react" +import PropTypes from "prop-types" +import Helmet from "react-helmet" +import { useStaticQuery, graphql } from "gatsby" + +function SEO({ description, lang, meta, title }) { + const { site } = useStaticQuery( + graphql` + query { + site { + siteMetadata { + title + description + author + } + } + } + ` + ) + + const metaDescription = description || site.siteMetadata.description + + return ( + + ) +} + +SEO.defaultProps = { + lang: `en`, + meta: [], + description: ``, +} + +SEO.propTypes = { + description: PropTypes.string, + lang: PropTypes.string, + meta: PropTypes.arrayOf(PropTypes.object), + title: PropTypes.string.isRequired, +} + +export default SEO diff --git a/gatsby-site/src/images/gatsby-astronaut.png b/gatsby-site/src/images/gatsby-astronaut.png new file mode 100644 index 0000000000000000000000000000000000000000..da58ece0a8c5b4f0e4d25fa443e65278349b4f3a GIT binary patch literal 167273 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

RzA~%3+!rm2%Do1R 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 NNQ%mdR0!#R{eKbVnbrUR literal 0 HcmV?d00001 diff --git a/gatsby-site/src/images/gatsby-icon.png b/gatsby-site/src/images/gatsby-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..908bc78a7f5596fab5a638d6ac07e331dc4c74d4 GIT binary patch literal 21212 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 Pwx}U%bK8?;ra1Edyv(7f literal 0 HcmV?d00001 diff --git a/gatsby-site/src/pages/404.js b/gatsby-site/src/pages/404.js new file mode 100644 index 0000000..bc4c31d --- /dev/null +++ b/gatsby-site/src/pages/404.js @@ -0,0 +1,14 @@ +import React from "react" + +import Layout from "../components/layout" +import SEO from "../components/seo" + +const NotFoundPage = () => ( + + +

NOT FOUND

+

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

+ +) + +export default NotFoundPage diff --git a/gatsby-site/src/pages/index.js b/gatsby-site/src/pages/index.js new file mode 100644 index 0000000..7eb6257 --- /dev/null +++ b/gatsby-site/src/pages/index.js @@ -0,0 +1,21 @@ +import React from "react" +import { Link } from "gatsby" + +import Layout from "../components/layout" +import Image from "../components/image" +import SEO from "../components/seo" + +const IndexPage = () => ( + + +

Hi people

+

Welcome to your new Gatsby site.

+

Now go build something great.

+
+ +
+ Go to page 2 +
+) + +export default IndexPage diff --git a/gatsby-site/src/pages/page-2.js b/gatsby-site/src/pages/page-2.js new file mode 100644 index 0000000..666c23e --- /dev/null +++ b/gatsby-site/src/pages/page-2.js @@ -0,0 +1,16 @@ +import React from "react" +import { Link } from "gatsby" + +import Layout from "../components/layout" +import SEO from "../components/seo" + +const SecondPage = () => ( + + +

Hi from the second page

+

Welcome to page 2

+ Go back to the homepage +
+) + +export default SecondPage diff --git a/global-site/.editorconfig b/global-site/.editorconfig deleted file mode 100644 index a2a28b4..0000000 --- a/global-site/.editorconfig +++ /dev/null @@ -1,26 +0,0 @@ -# http://editorconfig.org - -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 4 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true - -[*.hbs] -insert_final_newline = false - -[*.json] -indent_size = 2 - -[*.md] -trim_trailing_whitespace = false - -[*.{yml,yaml}] -indent_size = 2 - -[Makefile] -indent_style = tab diff --git a/global-site/.eslintignore b/global-site/.eslintignore deleted file mode 100644 index 0ec517c..0000000 --- a/global-site/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -public/** -plugins/**/*.js -!plugins/*/src/*.js diff --git a/global-site/.eslintrc.js b/global-site/.eslintrc.js deleted file mode 100644 index 8c9d861..0000000 --- a/global-site/.eslintrc.js +++ /dev/null @@ -1,59 +0,0 @@ -module.exports = { - 'parser': 'babel-eslint', - 'parserOptions': { - 'ecmaVersion': 6, - 'ecmaFeatures': { - 'jsx': true, - 'experimentalObjectRestSpread': true - } - }, - plugins: ['ghost', 'react'], - extends: [ - 'plugin:ghost/node', - 'plugin:ghost/ember', - 'plugin:react/recommended' - ], - "settings": { - "react": { - "createClass": "createReactClass", - "pragma": "React", - "version": "16.0", - "flowVersion": "0.53" - }, - "propWrapperFunctions": ["forbidExtraProps"] - }, - "rules": { - "ghost/sort-imports-es6-autofix/sort-imports-es6": "off", - "ghost/ember/use-ember-get-and-set": "off", - "no-console": "off", - "no-inner-declarations": "off", - "valid-jsdoc": "off", - "require-jsdoc": "off", - "quotes": ["error", "backtick"], - "consistent-return": ["error"], - "arrow-body-style": [ - "error", - "as-needed", - { "requireReturnForObjectLiteral": true } - ], - "jsx-quotes": ["error", "prefer-double"], - "semi": ["error", "never"], - "object-curly-spacing": ["error", "always"], - "comma-dangle": [ - "error", - { - "arrays": "always-multiline", - "objects": "always-multiline", - "imports": "always-multiline", - "exports": "always-multiline", - "functions": "ignore" - } - ], - "react/prop-types": [ - "error", - { - "ignore": ["children"] - } - ] - } -}; diff --git a/global-site/.ghost.json b/global-site/.ghost.json deleted file mode 100644 index 9124d5e..0000000 --- a/global-site/.ghost.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "development": { - "apiUrl": "https://gatsby.ghost.io", - "contentApiKey": "9cc5c67c358edfdd81455149d0" - }, - "production": { - "apiUrl": "https://gatsby.ghost.io", - "contentApiKey": "9cc5c67c358edfdd81455149d0" - } -} diff --git a/global-site/.github/ISSUE_TEMPLATE/---bug-report.md b/global-site/.github/ISSUE_TEMPLATE/---bug-report.md deleted file mode 100644 index 9879e51..0000000 --- a/global-site/.github/ISSUE_TEMPLATE/---bug-report.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: "\U0001F41B Bug report" -about: Report reproducible software issues so we can improve - ---- - -Welcome to the Gatsby Starter Ghost GitHub repo! ๐Ÿ‘‹๐ŸŽ‰ - -We use GitHub only for bug reports ๐Ÿ› - -Anything else should be posted to https://forum.ghost.org ๐Ÿ‘ซ - -For questions related to the usage of Gatsby or GraphQL, please check out their docs at https://www.gatsbyjs.org/ and https://graphql.org/ - -๐ŸšจFor support, help & questions use https://forum.ghost.org/c/help -๐Ÿ’กFor feature requests & ideas you can post and vote on https://forum.ghost.org/c/Ideas - -If your issue is with Gatsby.js itself, please report it at the Gatsby repo โžก๏ธย https://github.com/gatsbyjs/gatsby/issues/new. - -### Issue Summary - -A summary of the issue and the browser/OS environment in which it occurs. - -### To Reproduce - -1. This is the first step -2. This is the second step, etc. - -Any other info e.g. Why do you consider this to be a bug? What did you expect to happen instead? - -### Technical details: - -* Ghost Version: -* Gatsby Version: -* Node Version: -* OS: diff --git a/global-site/.github/ISSUE_TEMPLATE/--anything-else.md b/global-site/.github/ISSUE_TEMPLATE/--anything-else.md deleted file mode 100644 index c2ae0e2..0000000 --- a/global-site/.github/ISSUE_TEMPLATE/--anything-else.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -name: "\U0001F4A1Anything else" -about: "For help, support, features & ideas - please use https://forum.ghost.org \U0001F46B " - ---- - ---------------^ Click "Preview" for a nicer view! - -We use GitHub only for bug reports ๐Ÿ› - -Anything else should be posted to https://forum.ghost.org ๐Ÿ‘ซ. - -๐ŸšจFor support, help & questions use https://forum.ghost.org/c/help -๐Ÿ’กFor feature requests & ideas you can post and vote on https://forum.ghost.org/c/Ideas - -Alternatively, check out these resources below. Thanks! ๐Ÿ˜. - -- [Forum](https://forum.ghost.org/c/help) -- [Gatsby API reference](https://docs.ghost.org/api/gatsby/) -- [Content API Docs](https://docs.ghost.org/api/content/) -- [Gatsby.js](https://www.gatsbyjs.org) -- [GraphQL](https://graphql.org/) -- [Feature Requests / Ideas](https://forum.ghost.org/c/Ideas) -- [Contributing Guide](https://docs.ghost.org/docs/contributing) -- [Self-hoster Docs](https://docs.ghost.org/) diff --git a/global-site/LICENSE b/global-site/LICENSE deleted file mode 100755 index bdd5f8d..0000000 --- a/global-site/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2013-2019 Ghost Foundation - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/global-site/README.md b/global-site/README.md deleted file mode 100755 index 00dad11..0000000 --- a/global-site/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# Gatsby Starter Ghost - -A starter template to build lightning fast websites with [Ghost](https://ghost.org) & [Gatsby](https://gatsbyjs.org) - -**Demo:** https://gatsby.ghost.org - -  - -![gatsby-starter-ghost](https://user-images.githubusercontent.com/120485/50913567-8ab8e380-142c-11e9-9e78-de02ded12fc6.jpg) - -  - - -# Installing - -```bash -# With Gatsby CLI -gatsby new gatsby-starter-ghost https://github.com/TryGhost/gatsby-starter-ghost.git -``` - -```bash -# From Source -git clone https://github.com/TryGhost/gatsby-starter-ghost.git -cd gatsby-starter-ghost -``` - -Then install dependencies - -```bash -yarn -``` - -  - -# Running - -Start the development server. You now have a Gatsby site pulling content from headless Ghost. - -```bash -gatsby develop -``` - -By default, the starter will populate content from a default Ghost install located at https://gatsby.ghost.io. - -To use your own install, edit the `.ghost.json` config file with your credentials. You can find your `contentApiKey` in the "Integrations" screen in Ghost Admin. The minimum required version for Ghost is `2.10.0` in order to use this starter without issues. - -  - -# Deploying with Netlify - -The starter contains three config files specifically for deploying with Netlify. A `netlify.toml` file for build settings, a `/static/_headers` file with default security headers set for all routes, and `/static/_redirects` to set Netlify custom domain redirects. - -To deploy to your Netlify account, hit the button below. - -[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/TryGhost/gatsby-starter-ghost) - -Content API Keys are generally not considered to be sensitive information, they exist so that they can be changed in the event of abuse; so most people commit it directly to their `.ghost.json` config file. If you prefer to keep this information out of your repository you can remove this config and set [Netlify ENV variables](https://www.netlify.com/docs/continuous-deployment/#build-environment-variables) for production builds instead. - -Once deployed, you can set up a [Ghost + Netlify Integration](https://docs.ghost.org/integrations/netlify/) to use deploy hooks from Ghost to trigger Netlify rebuilds. That way, any time data changes in Ghost, your site will rebuild on Netlify. - -  - -# Optimising - -You can disable the default Ghost Handlebars Theme front-end by enabling the `Make this site private` flag within your Ghost settings. This enables password protection in front of the Ghost install and sets `` so your Gatsby front-end becomes the source of truth for SEO. - -  - -# Extra options - -```bash -# Run a production build, locally -gatsby build - -# Serve a production build, locally -gatsby serve -``` - -Gatsby `develop` uses the `development` config in `.ghost.json` - while Gatsby `build` uses the `production` config. - -  - -# Copyright & License - -Copyright (c) 2013-2019 Ghost Foundation - Released under the [MIT license](LICENSE). diff --git a/global-site/gatsby-browser.js b/global-site/gatsby-browser.js deleted file mode 100755 index abf0eb7..0000000 --- a/global-site/gatsby-browser.js +++ /dev/null @@ -1,32 +0,0 @@ -/* eslint-disable */ -/** - * Trust All Scripts - * - * This is a dirty little script for iterating over script tags - * of your Ghost posts and adding them to the document head. - * - * This works for any script that then injects content into the page - * via ids/classnames etc. - * - */ -var trustAllScripts = function () { - var scriptNodes = document.querySelectorAll('.load-external-scripts script'); - - for (var i = 0; i < scriptNodes.length; i += 1) { - var node = scriptNodes[i]; - var s = document.createElement('script'); - s.type = node.type || 'text/javascript'; - - if (node.attributes.src) { - s.src = node.attributes.src.value; - } else { - s.innerHTML = node.innerHTML; - } - - document.getElementsByTagName('head')[0].appendChild(s); - } -}; - -exports.onRouteUpdate = function () { - trustAllScripts(); -}; diff --git a/global-site/gatsby-config.js b/global-site/gatsby-config.js deleted file mode 100755 index cd8ad83..0000000 --- a/global-site/gatsby-config.js +++ /dev/null @@ -1,184 +0,0 @@ -const path = require(`path`) - -const config = require(`./src/utils/siteConfig`) -const generateRSSFeed = require(`./src/utils/rss/generate-feed`) - -let ghostConfig - -try { - ghostConfig = require(`./.ghost`) -} catch (e) { - ghostConfig = { - production: { - apiUrl: process.env.GHOST_API_URL, - contentApiKey: process.env.GHOST_CONTENT_API_KEY, - }, - } -} finally { - const { apiUrl, contentApiKey } = process.env.NODE_ENV === `development` ? ghostConfig.development : ghostConfig.production - - if (!apiUrl || !contentApiKey || contentApiKey.match(//)) { - throw new Error(`GHOST_API_URL and GHOST_CONTENT_API_KEY are required to build. Check the README.`) // eslint-disable-line - } -} - -/** -* This is the place where you can tell Gatsby which plugins to use -* and set them up the way you want. -* -* Further info ๐Ÿ‘‰๐Ÿผ https://www.gatsbyjs.org/docs/gatsby-config/ -* -*/ -module.exports = { - siteMetadata: { - siteUrl: config.siteUrl, - }, - plugins: [ - /** - * Content Plugins - */ - { - resolve: `gatsby-source-filesystem`, - options: { - path: path.join(__dirname, `src`, `pages`), - name: `pages`, - }, - }, - // Setup for optimised images. - // See https://www.gatsbyjs.org/packages/gatsby-image/ - { - resolve: `gatsby-source-filesystem`, - options: { - path: path.join(__dirname, `src`, `images`), - name: `images`, - }, - }, - `gatsby-plugin-sharp`, - `gatsby-transformer-sharp`, - { - resolve: `gatsby-source-ghost`, - options: - process.env.NODE_ENV === `development` - ? ghostConfig.development - : ghostConfig.production, - }, - /** - * Utility Plugins - */ - { - resolve: `gatsby-plugin-ghost-manifest`, - options: { - short_name: config.shortTitle, - start_url: `/`, - background_color: config.backgroundColor, - theme_color: config.themeColor, - display: `minimal-ui`, - icon: `static/${config.siteIcon}`, - query: ` - { - allGhostSettings { - edges { - node { - title - description - } - } - } - } - `, - }, - }, - { - resolve: `gatsby-plugin-feed`, - options: { - query: ` - { - allGhostSettings { - edges { - node { - title - description - } - } - } - } - `, - feeds: [ - generateRSSFeed(config), - ], - }, - }, - { - resolve: `gatsby-plugin-advanced-sitemap`, - options: { - query: ` - { - allGhostPost { - edges { - node { - id - slug - updated_at - created_at - feature_image - } - } - } - allGhostPage { - edges { - node { - id - slug - updated_at - created_at - feature_image - } - } - } - allGhostTag { - edges { - node { - id - slug - feature_image - } - } - } - allGhostAuthor { - edges { - node { - id - slug - profile_image - } - } - } - }`, - mapping: { - allGhostPost: { - sitemap: `posts`, - }, - allGhostTag: { - sitemap: `tags`, - }, - allGhostAuthor: { - sitemap: `authors`, - }, - allGhostPage: { - sitemap: `pages`, - }, - }, - exclude: [ - `/dev-404-page`, - `/404`, - `/404.html`, - `/offline-plugin-app-shell-fallback`, - ], - createLinkInHead: true, - }, - }, - `gatsby-plugin-react-helmet`, - `gatsby-plugin-force-trailing-slashes`, - `gatsby-plugin-offline`, - ], -} diff --git a/global-site/gatsby-node.js b/global-site/gatsby-node.js deleted file mode 100755 index e21814d..0000000 --- a/global-site/gatsby-node.js +++ /dev/null @@ -1,210 +0,0 @@ -const path = require(`path`) -const { postsPerPage } = require(`./src/utils/siteConfig`) -const { paginate } = require(`gatsby-awesome-pagination`) - -/** - * Here is the place where Gatsby creates the URLs for all the - * posts, tags, pages and authors that we fetched from the Ghost site. - */ -exports.createPages = async ({ graphql, actions }) => { - const { createPage } = actions - - const result = await graphql(` - { - allGhostPost(sort: { order: ASC, fields: published_at }) { - edges { - node { - slug - } - } - } - allGhostTag(sort: { order: ASC, fields: name }) { - edges { - node { - slug - url - postCount - } - } - } - allGhostAuthor(sort: { order: ASC, fields: name }) { - edges { - node { - slug - url - postCount - } - } - } - allGhostPage(sort: { order: ASC, fields: published_at }) { - edges { - node { - slug - url - } - } - } - allGhostPage(sort: { order: ASC, fields: published_at }) { - edges { - node { - slug - url - } - } - } - } - `) - - // Check for any errors - if (result.errors) { - throw new Error(result.errors) - } - - // Extract query results - const tags = result.data.allGhostTag.edges - const authors = result.data.allGhostAuthor.edges - const pages = result.data.allGhostPage.edges - const posts = result.data.allGhostPost.edges - - // Load templates - const indexTemplate = path.resolve(`./src/templates/index.js`) - const tagsTemplate = path.resolve(`./src/templates/tag.js`) - const authorTemplate = path.resolve(`./src/templates/author.js`) - const pageTemplate = path.resolve(`./src/templates/page.js`) - const postTemplate = path.resolve(`./src/templates/post.js`) - - // Create tag pages - tags.forEach(({ node }) => { - const totalPosts = node.postCount !== null ? node.postCount : 0 - const numberOfPages = Math.ceil(totalPosts / postsPerPage) - - // This part here defines, that our tag pages will use - // a `/tag/:slug/` permalink. - node.url = `/tag/${node.slug}/` - - Array.from({ length: numberOfPages }).forEach((_, i) => { - const currentPage = i + 1 - const prevPageNumber = currentPage <= 1 ? null : currentPage - 1 - const nextPageNumber = - currentPage + 1 > numberOfPages ? null : currentPage + 1 - const previousPagePath = prevPageNumber - ? prevPageNumber === 1 - ? node.url - : `${node.url}page/${prevPageNumber}/` - : null - const nextPagePath = nextPageNumber - ? `${node.url}page/${nextPageNumber}/` - : null - - createPage({ - path: i === 0 ? node.url : `${node.url}page/${i + 1}/`, - component: tagsTemplate, - context: { - // Data passed to context is available - // in page queries as GraphQL variables. - slug: node.slug, - limit: postsPerPage, - skip: i * postsPerPage, - numberOfPages: numberOfPages, - humanPageNumber: currentPage, - prevPageNumber: prevPageNumber, - nextPageNumber: nextPageNumber, - previousPagePath: previousPagePath, - nextPagePath: nextPagePath, - }, - }) - }) - }) - - // Create author pages - authors.forEach(({ node }) => { - const totalPosts = node.postCount !== null ? node.postCount : 0 - const numberOfPages = Math.ceil(totalPosts / postsPerPage) - - // This part here defines, that our author pages will use - // a `/author/:slug/` permalink. - node.url = `/author/${node.slug}/` - - Array.from({ length: numberOfPages }).forEach((_, i) => { - const currentPage = i + 1 - const prevPageNumber = currentPage <= 1 ? null : currentPage - 1 - const nextPageNumber = - currentPage + 1 > numberOfPages ? null : currentPage + 1 - const previousPagePath = prevPageNumber - ? prevPageNumber === 1 - ? node.url - : `${node.url}page/${prevPageNumber}/` - : null - const nextPagePath = nextPageNumber - ? `${node.url}page/${nextPageNumber}/` - : null - - createPage({ - path: i === 0 ? node.url : `${node.url}page/${i + 1}/`, - component: authorTemplate, - context: { - // Data passed to context is available - // in page queries as GraphQL variables. - slug: node.slug, - limit: postsPerPage, - skip: i * postsPerPage, - numberOfPages: numberOfPages, - humanPageNumber: currentPage, - prevPageNumber: prevPageNumber, - nextPageNumber: nextPageNumber, - previousPagePath: previousPagePath, - nextPagePath: nextPagePath, - }, - }) - }) - }) - - // Create pages - pages.forEach(({ node }) => { - // This part here defines, that our pages will use - // a `/:slug/` permalink. - node.url = `/${node.slug}/` - - createPage({ - path: node.url, - component: pageTemplate, - context: { - // Data passed to context is available - // in page queries as GraphQL variables. - slug: node.slug, - }, - }) - }) - - // Create post pages - posts.forEach(({ node }) => { - // This part here defines, that our posts will use - // a `/:slug/` permalink. - node.url = `/${node.slug}/` - - createPage({ - path: node.url, - component: postTemplate, - context: { - // Data passed to context is available - // in page queries as GraphQL variables. - slug: node.slug, - }, - }) - }) - - // Create pagination - paginate({ - createPage, - items: posts, - itemsPerPage: postsPerPage, - component: indexTemplate, - pathPrefix: ({ pageNumber }) => { - if (pageNumber === 0) { - return `/` - } else { - return `/page` - } - }, - }) -} diff --git a/global-site/netlify.toml b/global-site/netlify.toml deleted file mode 100644 index cc1d28b..0000000 --- a/global-site/netlify.toml +++ /dev/null @@ -1,6 +0,0 @@ -[build] - command = "gatsby build" - publish = "public/" - -[template] - incoming-hooks = ["Ghost"] diff --git a/global-site/package.json b/global-site/package.json deleted file mode 100755 index 24e0550..0000000 --- a/global-site/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "gatsby-starter-ghost", - "description": "A starter template to build lightning fast websites with Ghost and Gatsby", - "version": "1.0.0", - "license": "MIT", - "author": "Ghost Foundation", - "homepage": "https://docs.ghost.org/api/gatsby/", - "repository": { - "type": "git", - "url": "git+https://github.com/tryghost/gatsby-starter-ghost.git" - }, - "engines": { - "node": ">= 8.9.0" - }, - "bugs": { - "url": "https://github.com/tryghost/gatsby-starter-ghost/issues" - }, - "keywords": [ - "gatsby", - "ghost" - ], - "main": "n/a", - "scripts": { - "serve": "gatsby build && NODE_ENV=production gatsby serve", - "build": "gatsby build", - "dev": "gatsby develop", - "lint": "eslint . --ext .js --cache", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "devDependencies": { - "eslint": "6.1.0", - "eslint-plugin-ghost": "0.4.0", - "eslint-plugin-react": "7.14.2" - }, - "dependencies": { - "@tryghost/helpers": "1.1.6", - "@tryghost/helpers-gatsby": "1.0.9", - "cheerio": "1.0.0-rc.3", - "gatsby": "2.13.32", - "gatsby-awesome-pagination": "0.3.4", - "gatsby-image": "2.2.6", - "gatsby-plugin-advanced-sitemap": "1.3.1", - "gatsby-plugin-feed": "2.3.5", - "gatsby-plugin-force-trailing-slashes": "1.0.4", - "gatsby-plugin-manifest": "2.2.3", - "gatsby-plugin-offline": "2.2.4", - "gatsby-plugin-react-helmet": "3.1.2", - "gatsby-plugin-sharp": "2.2.8", - "gatsby-source-filesystem": "2.1.5", - "gatsby-source-ghost": "3.4.4", - "gatsby-transformer-sharp": "2.2.4", - "lodash": "4.17.15", - "react": "16.8.6", - "react-dom": "16.8.6", - "react-helmet": "5.2.1" - } -} diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/.babelrc b/global-site/plugins/gatsby-plugin-ghost-manifest/.babelrc deleted file mode 100644 index c204150..0000000 --- a/global-site/plugins/gatsby-plugin-ghost-manifest/.babelrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "presets": [ - [ - "babel-preset-gatsby-package", - { - "browser": true - } - ] - ] -} \ No newline at end of file diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/common.js b/global-site/plugins/gatsby-plugin-ghost-manifest/common.js deleted file mode 100644 index 893ccdf..0000000 --- a/global-site/plugins/gatsby-plugin-ghost-manifest/common.js +++ /dev/null @@ -1,55 +0,0 @@ -"use strict"; - -var fs = require("fs"); // default icons for generating icons - - -exports.defaultIcons = [{ - src: "icons/icon-48x48.png", - sizes: "48x48", - type: "image/png" -}, { - src: "icons/icon-72x72.png", - sizes: "72x72", - type: "image/png" -}, { - src: "icons/icon-96x96.png", - sizes: "96x96", - type: "image/png" -}, { - src: "icons/icon-144x144.png", - sizes: "144x144", - type: "image/png" -}, { - src: "icons/icon-192x192.png", - sizes: "192x192", - type: "image/png" -}, { - src: "icons/icon-256x256.png", - sizes: "256x256", - type: "image/png" -}, { - src: "icons/icon-384x384.png", - sizes: "384x384", - type: "image/png" -}, { - src: "icons/icon-512x512.png", - sizes: "512x512", - type: "image/png" -}]; -/** - * Check if the icon exists on the filesystem - * - * @param {String} srcIcon Path of the icon - */ - -exports.doesIconExist = function doesIconExist(srcIcon) { - try { - return fs.statSync(srcIcon).isFile(); - } catch (e) { - if (e.code === "ENOENT") { - return false; - } else { - throw e; - } - } -}; \ No newline at end of file diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-node.js b/global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-node.js deleted file mode 100644 index f8b855f..0000000 --- a/global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-node.js +++ /dev/null @@ -1,104 +0,0 @@ -"use strict"; - -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - -var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); - -var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); - -var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); - -var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); - -var fs = require("fs"); - -var path = require("path"); - -var Promise = require("bluebird"); - -var sharp = require("sharp"); - -var _require = require("./common.js"), - defaultIcons = _require.defaultIcons, - doesIconExist = _require.doesIconExist; - -sharp.simd(true); - -function generateIcons(icons, srcIcon) { - return Promise.map(icons, function (icon) { - var size = parseInt(icon.sizes.substring(0, icon.sizes.lastIndexOf("x"))); - var imgPath = path.join("public", icon.src); - return sharp(srcIcon).resize(size).toFile(imgPath).then(function () {}); - }); -} - -exports.onPostBuild = -/*#__PURE__*/ -function () { - var _ref2 = (0, _asyncToGenerator2.default)( - /*#__PURE__*/ - _regenerator.default.mark(function _callee(_ref, pluginOptions) { - var graphql, icon, manifest, _ref3, data, siteTitle, iconPath; - - return _regenerator.default.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - graphql = _ref.graphql; - icon = pluginOptions.icon, manifest = (0, _objectWithoutPropertiesLoose2.default)(pluginOptions, ["icon"]); - _context.next = 4; - return graphql(pluginOptions.query); - - case 4: - _ref3 = _context.sent; - data = _ref3.data; - siteTitle = data.allGhostSettings.edges[0].node.title || "No Title"; - manifest = (0, _extends2.default)({}, manifest, { - name: siteTitle // Delete options we won't pass to the manifest.webmanifest. - - }); - delete manifest.plugins; - delete manifest.legacy; - delete manifest.theme_color_in_head; - delete manifest.query; // If icons are not manually defined, use the default icon set. - - if (!manifest.icons) { - manifest.icons = defaultIcons; - } // Determine destination path for icons. - - - iconPath = path.join("public", path.dirname(manifest.icons[0].src)); //create destination directory if it doesn't exist - - if (!fs.existsSync(iconPath)) { - fs.mkdirSync(iconPath); - } - - fs.writeFileSync(path.join("public", "manifest.webmanifest"), JSON.stringify(manifest)); // Only auto-generate icons if a src icon is defined. - - if (icon !== undefined) { - // Check if the icon exists - if (!doesIconExist(icon)) { - Promise.reject("icon (" + icon + ") does not exist as defined in gatsby-config.js. Make sure the file exists relative to the root of the site."); - } - - generateIcons(manifest.icons, icon).then(function () { - //images have been generated - console.log("done generating icons for manifest"); - Promise.resolve(); - }); - } else { - Promise.resolve(); - } - - case 17: - case "end": - return _context.stop(); - } - } - }, _callee, this); - })); - - return function (_x, _x2) { - return _ref2.apply(this, arguments); - }; -}(); \ No newline at end of file diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-ssr.js b/global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-ssr.js deleted file mode 100644 index f2304ac..0000000 --- a/global-site/plugins/gatsby-plugin-ghost-manifest/gatsby-ssr.js +++ /dev/null @@ -1,61 +0,0 @@ -"use strict"; - -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - -var _react = _interopRequireDefault(require("react")); - -var _gatsby = require("gatsby"); - -var _common = require("./common.js"); - -exports.onRenderBody = function (_ref, pluginOptions) { - var setHeadComponents = _ref.setHeadComponents; - // We use this to build a final array to pass as the argument to setHeadComponents at the end of onRenderBody. - var headComponents = []; - var icons = pluginOptions.icons || _common.defaultIcons; // If icons were generated, also add a favicon link. - - if (pluginOptions.icon) { - var favicon = icons && icons.length ? icons[0].src : null; - - if (favicon) { - headComponents.push(_react.default.createElement("link", { - key: "gatsby-plugin-manifest-icon-link", - rel: "shortcut icon", - href: (0, _gatsby.withPrefix)(favicon) - })); - } - } // Add manifest link tag. - - - headComponents.push(_react.default.createElement("link", { - key: "gatsby-plugin-manifest-link", - rel: "manifest", - href: (0, _gatsby.withPrefix)("/manifest.webmanifest") - })); // The user has an option to opt out of the theme_color meta tag being inserted into the head. - - if (pluginOptions.theme_color) { - var insertMetaTag = Object.keys(pluginOptions).includes("theme_color_in_head") ? pluginOptions.theme_color_in_head : true; - - if (insertMetaTag) { - headComponents.push(_react.default.createElement("meta", { - key: "gatsby-plugin-manifest-meta", - name: "theme-color", - content: pluginOptions.theme_color - })); - } - } - - if (pluginOptions.legacy) { - var iconLinkTags = icons.map(function (icon) { - return _react.default.createElement("link", { - key: "gatsby-plugin-manifest-apple-touch-icon-" + icon.sizes, - rel: "apple-touch-icon", - sizes: icon.sizes, - href: (0, _gatsby.withPrefix)("" + icon.src) - }); - }); - headComponents = [].concat(headComponents, iconLinkTags); - } - - setHeadComponents(headComponents); -}; \ No newline at end of file diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/index.js b/global-site/plugins/gatsby-plugin-ghost-manifest/index.js deleted file mode 100644 index 625c089..0000000 --- a/global-site/plugins/gatsby-plugin-ghost-manifest/index.js +++ /dev/null @@ -1 +0,0 @@ -// noop \ No newline at end of file diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/package.json b/global-site/plugins/gatsby-plugin-ghost-manifest/package.json deleted file mode 100644 index 44385b2..0000000 --- a/global-site/plugins/gatsby-plugin-ghost-manifest/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "gatsby-plugin-ghost-manifest", - "description": "Gatsby plugin which adds a manifest.webmanifest to make sites progressive web apps", - "version": "0.0.1", - "author": "Ghost Foundation", - "dependencies": { - "@babel/runtime": "7.5.5", - "bluebird": "3.5.5", - "sharp": "0.22.1" - }, - "devDependencies": { - "@babel/cli": "7.5.5", - "@babel/core": "7.5.5", - "babel-preset-gatsby-package": "0.2.2", - "cross-env": "^5.1.4" - }, - "keywords": [ - "gatsby", - "gatsby-plugin", - "favicon", - "icons", - "manifest.webmanifest", - "progressive-web-app", - "pwa" - ], - "license": "MIT", - "main": "index.js", - "peerDependencies": { - "gatsby": ">2.0.0-alpha" - }, - "scripts": { - "build": "babel src --out-dir . --ignore **/__tests__", - "prepare": "cross-env NODE_ENV=production npm run build", - "watch": "babel -w src --out-dir . --ignore **/__tests__" - } -} diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/src/common.js b/global-site/plugins/gatsby-plugin-ghost-manifest/src/common.js deleted file mode 100644 index 297f01b..0000000 --- a/global-site/plugins/gatsby-plugin-ghost-manifest/src/common.js +++ /dev/null @@ -1,62 +0,0 @@ -const fs = require(`fs`) - -// default icons for generating icons -exports.defaultIcons = [ - { - src: `icons/icon-48x48.png`, - sizes: `48x48`, - type: `image/png`, - }, - { - src: `icons/icon-72x72.png`, - sizes: `72x72`, - type: `image/png`, - }, - { - src: `icons/icon-96x96.png`, - sizes: `96x96`, - type: `image/png`, - }, - { - src: `icons/icon-144x144.png`, - sizes: `144x144`, - type: `image/png`, - }, - { - src: `icons/icon-192x192.png`, - sizes: `192x192`, - type: `image/png`, - }, - { - src: `icons/icon-256x256.png`, - sizes: `256x256`, - type: `image/png`, - }, - { - src: `icons/icon-384x384.png`, - sizes: `384x384`, - type: `image/png`, - }, - { - src: `icons/icon-512x512.png`, - sizes: `512x512`, - type: `image/png`, - }, -] - -/** - * Check if the icon exists on the filesystem - * - * @param {String} srcIcon Path of the icon - */ -exports.doesIconExist = function doesIconExist(srcIcon) { - try { - return fs.statSync(srcIcon).isFile() - } catch (e) { - if (e.code === `ENOENT`) { - return false - } else { - throw e - } - } -} diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-node.js b/global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-node.js deleted file mode 100644 index 4c201b9..0000000 --- a/global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-node.js +++ /dev/null @@ -1,71 +0,0 @@ -const fs = require(`fs`) -const path = require(`path`) -const Promise = require(`bluebird`) -const sharp = require(`sharp`) -const { defaultIcons, doesIconExist } = require(`./common.js`) - -sharp.simd(true) - -function generateIcons(icons, srcIcon) { - return Promise.map(icons, (icon) => { - const size = parseInt(icon.sizes.substring(0, icon.sizes.lastIndexOf(`x`))) - const imgPath = path.join(`public`, icon.src) - - return sharp(srcIcon) - .resize(size) - .toFile(imgPath) - .then(() => { }) - }) -} - -exports.onPostBuild = async ({ graphql }, pluginOptions) => { - let { icon, ...manifest } = pluginOptions - - const { data } = await graphql(pluginOptions.query) - const siteTitle = data.allGhostSettings.edges[0].node.title || `No Title` - manifest = { - ...manifest, - name: siteTitle, - } - - // Delete options we won't pass to the manifest.webmanifest. - delete manifest.plugins - delete manifest.legacy - delete manifest.theme_color_in_head - delete manifest.query - - // If icons are not manually defined, use the default icon set. - if (!manifest.icons) { - manifest.icons = defaultIcons - } - - // Determine destination path for icons. - const iconPath = path.join(`public`, path.dirname(manifest.icons[0].src)) - - //create destination directory if it doesn't exist - if (!fs.existsSync(iconPath)) { - fs.mkdirSync(iconPath) - } - - fs.writeFileSync( - path.join(`public`, `manifest.webmanifest`), - JSON.stringify(manifest) - ) - - // Only auto-generate icons if a src icon is defined. - if (icon !== undefined) { - // Check if the icon exists - if (!doesIconExist(icon)) { - Promise.reject( - `icon (${icon}) does not exist as defined in gatsby-config.js. Make sure the file exists relative to the root of the site.` - ) - } - generateIcons(manifest.icons, icon).then(() => { - //images have been generated - console.log(`done generating icons for manifest`) - Promise.resolve() - }) - } else { - Promise.resolve() - } -} diff --git a/global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-ssr.js b/global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-ssr.js deleted file mode 100644 index 27137fb..0000000 --- a/global-site/plugins/gatsby-plugin-ghost-manifest/src/gatsby-ssr.js +++ /dev/null @@ -1,67 +0,0 @@ -import React from "react" -import { withPrefix } from "gatsby" -import { defaultIcons } from "./common.js" - -exports.onRenderBody = ({ setHeadComponents }, pluginOptions) => { - // We use this to build a final array to pass as the argument to setHeadComponents at the end of onRenderBody. - let headComponents = [] - - const icons = pluginOptions.icons || defaultIcons - - // If icons were generated, also add a favicon link. - if (pluginOptions.icon) { - let favicon = icons && icons.length ? icons[0].src : null - - if (favicon) { - headComponents.push( - - ) - } - } - - // Add manifest link tag. - headComponents.push( - - ) - // The user has an option to opt out of the theme_color meta tag being inserted into the head. - if (pluginOptions.theme_color) { - let insertMetaTag = Object.keys(pluginOptions).includes( - `theme_color_in_head` - ) - ? pluginOptions.theme_color_in_head - : true - - if (insertMetaTag) { - headComponents.push( - - ) - } - } - - if (pluginOptions.legacy) { - const iconLinkTags = icons.map(icon => ( - - )) - - headComponents = [...headComponents, ...iconLinkTags] - } - - setHeadComponents(headComponents) -} \ No newline at end of file diff --git a/global-site/src/components/common/Layout.js b/global-site/src/components/common/Layout.js deleted file mode 100644 index 6218a86..0000000 --- a/global-site/src/components/common/Layout.js +++ /dev/null @@ -1,133 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import Helmet from 'react-helmet' -import { Link, StaticQuery, graphql } from 'gatsby' -import Img from 'gatsby-image' - -import { Navigation } from '.' -import config from '../../utils/siteConfig' - -// Styles -import '../../styles/app.css' - -/** -* Main layout component -* -* The Layout component wraps around each page and template. -* It also provides the header, footer as well as the main -* styles, and meta data for each page. -* -*/ -const DefaultLayout = ({ data, children, bodyClass, isHome }) => { - const site = data.allGhostSettings.edges[0].node - const twitterUrl = site.twitter ? `https://twitter.com/${site.twitter.replace(/^@/, ``)}` : null - const facebookUrl = site.facebook ? `https://www.facebook.com/${site.facebook.replace(/^\//, ``)}` : null - - return ( - <> - - - - - - -
- -
- {/* The main header section on top of the screen */} -
-
- - { isHome ? -
-

{site.title}

-

{site.description}

-
: - null} - -
-
- -
- {/* All the main content gets inserted here, index.js, post.js */} - {children} -
- -
- -
- {/* The footer at the very bottom of the screen */} -
-
-
- {site.title} ยฉ 2019 — Published with Ghost -
-
- -
-
-
- -
-
- - - ) -} - -DefaultLayout.propTypes = { - children: PropTypes.node.isRequired, - bodyClass: PropTypes.string, - isHome: PropTypes.bool, - data: PropTypes.shape({ - allGhostSettings: PropTypes.object.isRequired, - }).isRequired, -} - -const DefaultLayoutSettingsQuery = props => ( - } - /> -) - -export default DefaultLayoutSettingsQuery diff --git a/global-site/src/components/common/Navigation.js b/global-site/src/components/common/Navigation.js deleted file mode 100644 index d0baf23..0000000 --- a/global-site/src/components/common/Navigation.js +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Link } from 'gatsby' - -/** -* Navigation component -* -* The Navigation component takes an array of your Ghost -* navigation property that is fetched from the settings. -* It differentiates between absolute (external) and relative link (internal). -* You can pass it a custom class for your own styles, but it will always fallback -* to a `site-nav-item` class. -* -*/ -const Navigation = ({ data, navClass }) => ( - <> - {data.map((navItem, i) => { - if (navItem.url.match(/^\s?http(s?)/gi)) { - return {navItem.label} - } else { - return {navItem.label} - } - })} - -) - -Navigation.defaultProps = { - navClass: `site-nav-item`, -} - -Navigation.propTypes = { - data: PropTypes.arrayOf( - PropTypes.shape({ - label: PropTypes.string.isRequired, - url: PropTypes.string.isRequired, - }).isRequired, - ).isRequired, - navClass: PropTypes.string, -} - -export default Navigation diff --git a/global-site/src/components/common/Pagination.js b/global-site/src/components/common/Pagination.js deleted file mode 100644 index 6baa043..0000000 --- a/global-site/src/components/common/Pagination.js +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Link } from 'gatsby' - -const Pagination = ({ pageContext }) => { - const { previousPagePath, nextPagePath, humanPageNumber, numberOfPages } = pageContext - - return ( - - ) -} - -Pagination.propTypes = { - pageContext: PropTypes.object.isRequired, -} - -export default Pagination diff --git a/global-site/src/components/common/PostCard.js b/global-site/src/components/common/PostCard.js deleted file mode 100644 index a89fe48..0000000 --- a/global-site/src/components/common/PostCard.js +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Link } from 'gatsby' -import { Tags } from '@tryghost/helpers-gatsby' -import { readingTime as readingTimeHelper } from '@tryghost/helpers' - -const PostCard = ({ post }) => { - const url = `/${post.slug}/` - const readingTime = readingTimeHelper(post) - - return ( - -
- {post.feature_image && -
} - {post.tags &&
} - {post.featured && Featured} -

{post.title}

-
-
{post.excerpt}
-
-
-
- {post.primary_author.profile_image ? - {post.primary_author.name}/ : - {post.primary_author.name}/ - } -
- { post.primary_author.name } -
-
-
{readingTime}
-
-
- - ) -} - -PostCard.propTypes = { - post: PropTypes.shape({ - title: PropTypes.string.isRequired, - feature_image: PropTypes.string, - featured: PropTypes.bool, - tags: PropTypes.arrayOf( - PropTypes.shape({ - name: PropTypes.string, - }) - ), - excerpt: PropTypes.string.isRequired, - primary_author: PropTypes.shape({ - name: PropTypes.string.isRequired, - profile_image: PropTypes.string, - }).isRequired, - }).isRequired, -} - -export default PostCard diff --git a/global-site/src/components/common/index.js b/global-site/src/components/common/index.js deleted file mode 100644 index 9e6d7ed..0000000 --- a/global-site/src/components/common/index.js +++ /dev/null @@ -1,4 +0,0 @@ -export { default as Layout } from './Layout' -export { default as PostCard } from './PostCard' -export { default as Pagination } from './Pagination' -export { default as Navigation } from './Navigation' diff --git a/global-site/src/components/common/meta/ArticleMeta.js b/global-site/src/components/common/meta/ArticleMeta.js deleted file mode 100644 index e2b7696..0000000 --- a/global-site/src/components/common/meta/ArticleMeta.js +++ /dev/null @@ -1,167 +0,0 @@ -import React from 'react' -import Helmet from "react-helmet" -import { StaticQuery, graphql } from 'gatsby' -import PropTypes from 'prop-types' -import _ from 'lodash' -import url from 'url' - -import getAuthorProperties from './getAuthorProperties' -import ImageMeta from './ImageMeta' -import config from '../../../utils/siteConfig' - -import { tags as tagsHelper } from '@tryghost/helpers' - -const ArticleMetaGhost = ({ data, settings, canonical }) => { - const ghostPost = data - settings = settings.allGhostSettings.edges[0].node - - const author = getAuthorProperties(ghostPost.primary_author) - const publicTags = _.map(tagsHelper(ghostPost, { visibility: `public`, fn: tag => tag }), `name`) - const primaryTag = publicTags[0] || `` - const shareImage = ghostPost.feature_image ? ghostPost.feature_image : _.get(settings, `cover_image`, null) - const publisherLogo = (settings.logo || config.siteIcon) ? url.resolve(config.siteUrl, (settings.logo || config.siteIcon)) : null - - return ( - <> - - {ghostPost.meta_title || ghostPost.title} - - - - - - - - - - - {publicTags.map((keyword, i) => ())} - {author.facebookUrl && } - - - - - - - {primaryTag && } - {primaryTag && } - - {settings.twitter && } - {settings.twitter && } - - - - - ) -} - -ArticleMetaGhost.propTypes = { - data: PropTypes.shape({ - title: PropTypes.string.isRequired, - published_at: PropTypes.string.isRequired, - updated_at: PropTypes.string.isRequired, - meta_title: PropTypes.string, - meta_description: PropTypes.string, - primary_author: PropTypes.object.isRequired, - feature_image: PropTypes.string, - tags: PropTypes.arrayOf( - PropTypes.shape({ - name: PropTypes.string, - slug: PropTypes.string, - visibility: PropTypes.string, - }) - ), - primaryTag: PropTypes.shape({ - name: PropTypes.string, - }), - og_title: PropTypes.string, - og_description: PropTypes.string, - twitter_title: PropTypes.string, - twitter_description: PropTypes.string, - excerpt: PropTypes.string.isRequired, - }).isRequired, - settings: PropTypes.shape({ - allGhostSettings: PropTypes.object.isRequired, - }).isRequired, - canonical: PropTypes.string.isRequired, -} - -const ArticleMetaQuery = props => ( - } - /> -) - -export default ArticleMetaQuery diff --git a/global-site/src/components/common/meta/AuthorMeta.js b/global-site/src/components/common/meta/AuthorMeta.js deleted file mode 100644 index 85d8cee..0000000 --- a/global-site/src/components/common/meta/AuthorMeta.js +++ /dev/null @@ -1,93 +0,0 @@ -import React from 'react' -import Helmet from 'react-helmet' -import PropTypes from 'prop-types' -import _ from 'lodash' -import { StaticQuery, graphql } from 'gatsby' - -import ImageMeta from './ImageMeta' -import getAuthorProperties from './getAuthorProperties' -import config from '../../../utils/siteConfig' - -const AuthorMeta = ({ data, settings, canonical }) => { - settings = settings.allGhostSettings.edges[0].node - - const author = getAuthorProperties(data) - const shareImage = author.image || _.get(settings, `cover_image`, null) - const title = `${data.name} - ${settings.title}` - const description = data.bio || config.siteDescriptionMeta || settings.description - - return ( - <> - - {title} - - - - - - - - - - - {settings.twitter && } - {settings.twitter && } - - - - - ) -} - -AuthorMeta.propTypes = { - data: PropTypes.shape({ - name: PropTypes.string, - bio: PropTypes.string, - profile_image: PropTypes.string, - website: PropTypes.string, - twitter: PropTypes.string, - facebook: PropTypes.string, - }).isRequired, - settings: PropTypes.shape({ - allGhostSettings: PropTypes.object.isRequired, - }).isRequired, - canonical: PropTypes.string.isRequired, -} - -const AuthorMetaQuery = props => ( - } - /> -) - -export default AuthorMetaQuery diff --git a/global-site/src/components/common/meta/ImageMeta.js b/global-site/src/components/common/meta/ImageMeta.js deleted file mode 100644 index cb6d96e..0000000 --- a/global-site/src/components/common/meta/ImageMeta.js +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react' -import Helmet from 'react-helmet' -import PropTypes from 'prop-types' -import config from '../../../utils/siteConfig' - -const ImageMeta = ({ image }) => { - if (!image) { - return null - } - - return ( - - - - - - - - ) -} - -ImageMeta.propTypes = { - image: PropTypes.string, -} - -export default ImageMeta diff --git a/global-site/src/components/common/meta/MetaData.js b/global-site/src/components/common/meta/MetaData.js deleted file mode 100644 index 498cf4a..0000000 --- a/global-site/src/components/common/meta/MetaData.js +++ /dev/null @@ -1,118 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { StaticQuery, graphql } from 'gatsby' -import url from 'url' - -import config from '../../../utils/siteConfig' -import ArticleMeta from './ArticleMeta' -import WebsiteMeta from './WebsiteMeta' -import AuthorMeta from './AuthorMeta' - -/** -* MetaData will generate all relevant meta data information incl. -* JSON-LD (schema.org), Open Graph (Facebook) and Twitter properties. -* -*/ -const MetaData = ({ - data, - settings, - title, - description, - image, - location, -}) => { - const canonical = url.resolve(config.siteUrl, location.pathname) - const { ghostPost, ghostTag, ghostAuthor, ghostPage } = data - settings = settings.allGhostSettings.edges[0].node - - if (ghostPost) { - return ( - - ) - } else if (ghostTag) { - return ( - - ) - } else if (ghostAuthor) { - return ( - - ) - } else if (ghostPage) { - return ( - - ) - } else { - title = title || config.siteTitleMeta || settings.title - description = description || config.siteDescriptionMeta || settings.description - image = image || settings.cover_image || null - - image = image ? url.resolve(config.siteUrl, image) : null - - return ( - - ) - } -} - -MetaData.defaultProps = { - data: {}, -} - -MetaData.propTypes = { - data: PropTypes.shape({ - ghostPost: PropTypes.object, - ghostTag: PropTypes.object, - ghostAuthor: PropTypes.object, - ghostPage: PropTypes.object, - }).isRequired, - settings: PropTypes.shape({ - allGhostSettings: PropTypes.object.isRequired, - }).isRequired, - location: PropTypes.shape({ - pathname: PropTypes.string.isRequired, - }).isRequired, - title: PropTypes.string, - description: PropTypes.string, - image: PropTypes.string, -} - -const MetaDataQuery = props => ( - } - /> -) - -export default MetaDataQuery diff --git a/global-site/src/components/common/meta/WebsiteMeta.js b/global-site/src/components/common/meta/WebsiteMeta.js deleted file mode 100644 index 80f283a..0000000 --- a/global-site/src/components/common/meta/WebsiteMeta.js +++ /dev/null @@ -1,107 +0,0 @@ -import React from 'react' -import Helmet from "react-helmet" -import PropTypes from 'prop-types' -import _ from 'lodash' -import { StaticQuery, graphql } from 'gatsby' -import url from 'url' - -import ImageMeta from './ImageMeta' -import config from '../../../utils/siteConfig' - -const WebsiteMeta = ({ data, settings, canonical, title, description, image, type }) => { - settings = settings.allGhostSettings.edges[0].node - - const publisherLogo = url.resolve(config.siteUrl, (settings.logo || config.siteIcon)) - let shareImage = image || data.feature_image || _.get(settings, `cover_image`, null) - - shareImage = shareImage ? url.resolve(config.siteUrl, shareImage) : null - - description = description || data.meta_description || data.description || config.siteDescriptionMeta || settings.description - title = `${title || data.meta_title || data.name || data.title} - ${settings.title}` - - return ( - <> - - {title} - - - - - - - - - - - {settings.twitter && } - {settings.twitter && } - - - - - ) -} - -WebsiteMeta.propTypes = { - data: PropTypes.shape({ - title: PropTypes.string, - feature_image: PropTypes.string, - description: PropTypes.string, - bio: PropTypes.string, - profile_image: PropTypes.string, - }).isRequired, - settings: PropTypes.shape({ - allGhostSettings: PropTypes.object.isRequired, - }).isRequired, - canonical: PropTypes.string.isRequired, - title: PropTypes.string, - description: PropTypes.string, - image: PropTypes.string, - type: PropTypes.oneOf([`WebSite`, `Series`]).isRequired, -} - -const WebsiteMetaQuery = props => ( - } - /> -) - -export default WebsiteMetaQuery diff --git a/global-site/src/components/common/meta/getAuthorProperties.js b/global-site/src/components/common/meta/getAuthorProperties.js deleted file mode 100644 index 330041a..0000000 --- a/global-site/src/components/common/meta/getAuthorProperties.js +++ /dev/null @@ -1,37 +0,0 @@ -import _ from 'lodash' -import PropTypes from 'prop-types' - -export const getAuthorProperties = (primaryAuthor) => { - let authorProfiles = [] - - authorProfiles.push( - primaryAuthor.website ? primaryAuthor.website : null, - primaryAuthor.twitter ? `https://twitter.com/${primaryAuthor.twitter.replace(/^@/, ``)}/` : null, - primaryAuthor.facebook ? `https://www.facebook.com/${primaryAuthor.facebook.replace(/^\//, ``)}/` : null - ) - - authorProfiles = _.compact(authorProfiles) - - return { - name: primaryAuthor.name || null, - sameAsArray: authorProfiles.length ? `["${_.join(authorProfiles, `", "`)}"]` : null, - image: primaryAuthor.profile_image || null, - facebookUrl: primaryAuthor.facebook ? `https://www.facebook.com/${primaryAuthor.facebook.replace(/^\//, ``)}/` : null, - } -} - -getAuthorProperties.defaultProps = { - fetchAuthorData: false, -} - -getAuthorProperties.PropTypes = { - primaryAuthor: PropTypes.shape({ - name: PropTypes.string.isRequired, - profile_image: PropTypes.string, - website: PropTypes.string, - twitter: PropTypes.string, - facebook: PropTypes.string, - }).isRequired, -} - -export default getAuthorProperties diff --git a/global-site/src/components/common/meta/index.js b/global-site/src/components/common/meta/index.js deleted file mode 100644 index a691cbb..0000000 --- a/global-site/src/components/common/meta/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as MetaData } from './MetaData' diff --git a/global-site/src/images/ghost-icon.png b/global-site/src/images/ghost-icon.png deleted file mode 100644 index c498281bae956434fedf862d75213aa88dc0abc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7935 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 O+H=2;NA ( - -
-
-

Error 404

-
- Page not found, return home to start over -
-
-
-
-) - -export default NotFoundPage diff --git a/global-site/src/styles/app.css b/global-site/src/styles/app.css deleted file mode 100644 index 5b28c10..0000000 --- a/global-site/src/styles/app.css +++ /dev/null @@ -1,1018 +0,0 @@ -/* App.css -/* ---------------------------------------------------------- /* - -These are just some base styles to get you started. You delete -these and start over using your toolset of choice, or evolve -what's here to work the way you'd like it to. - -# Table of Contents - -- Vars -- Reset -- Defaults -- Layout -- Tag Archives -- Author Archives -- Pagination -- Footer - -/* Variables -/* ---------------------------------------------------------- */ - -:root { - - /* Colours */ - --color-primary: #3eb0ef; - --color-base: #15171A; - --color-secondary: #5B7A81; - --color-border: #c7d5d8; - --color-bg: #f5f5f5; - - /* Fonts */ - --font-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; - --font-serif: Georgia, Times, serif; - --font-mono: Menlo, Courier, monospace; - --font-light: 100; - --font-normal: 400; - --font-bold: 700; - --font-heavy: 800; - - /* Sizes */ - --height: 4rem; - --margin: 2rem; - --radius: 0.6rem; - -} - - -/* Reset -/* ---------------------------------------------------------- */ - -html, -body, -div, -span, -applet, -object, -iframe, -h1, -h2, -h3, -h4, -h5, -h6, -p, -blockquote, -pre, -a, -abbr, -acronym, -address, -big, -cite, -code, -del, -dfn, -em, -img, -ins, -kbd, -q, -s, -samp, -small, -strike, -strong, -sub, -sup, -tt, -var, -dl, -dt, -dd, -ol, -ul, -li, -fieldset, -form, -label, -legend, -table, -caption, -tbody, -tfoot, -thead, -tr, -th, -td, -article, -aside, -canvas, -details, -embed, -figure, -figcaption, -footer, -header, -hgroup, -menu, -nav, -output, -ruby, -section, -summary, -time, -mark, -audio, -video { - margin: 0; - padding: 0; - border: 0; - font: inherit; - font-size: 100%; - vertical-align: baseline; -} -body { - line-height: 1; -} -ol, -ul { - list-style: none; -} -blockquote, -q { - quotes: none; -} -blockquote:before, -blockquote:after, -q:before, -q:after { - content: ""; - content: none; -} -table { - border-spacing: 0; - border-collapse: collapse; -} -img { - max-width: 100%; -} -html { - box-sizing: border-box; - font-family: sans-serif; - - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; -} -*, -*:before, -*:after { - box-sizing: inherit; -} -a { - background-color: transparent; -} -a:active, -a:hover { - outline: 0; -} -b, -strong { - font-weight: bold; -} -i, -em, -dfn { - font-style: italic; -} -h1 { - margin: 0.67em 0; - font-size: 2em; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -mark { - background-color: #fdffb6; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - margin: 0; - color: inherit; - font: inherit; -} -button { - overflow: visible; - border: none; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - - -webkit-appearance: button; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -input { - line-height: normal; -} -input:focus { - outline: none; -} -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - box-sizing: content-box; - - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -legend { - padding: 0; - border: 0; -} -textarea { - overflow: auto; -} -table { - border-spacing: 0; - border-collapse: collapse; -} -td, -th { - padding: 0; -} - -/* Defaults -/* ---------------------------------------------------------- */ - -html { - overflow-x: hidden; - overflow-y: scroll; - font-size: 62.5%; - background: var(--color-base); - - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -body { - overflow-x: hidden; - color: #3c484e; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; - font-size: 1.5rem; - line-height: 1.6em; - font-weight: 400; - font-style: normal; - letter-spacing: 0; - text-rendering: optimizeLegibility; - background: #fff; - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -moz-font-feature-settings: "liga" on; -} - -::selection { - text-shadow: none; - background: #cbeafb; -} - -hr { - position: relative; - display: block; - width: 100%; - margin: 1.8em 0 2.4em; - padding: 0; - height: 1px; - border: 0; - border-top: 1px solid #e3e9ed; -} - -audio, -canvas, -iframe, -img, -svg, -video { - vertical-align: middle; -} - -fieldset { - margin: 0; - padding: 0; - border: 0; -} - -textarea { - resize: vertical; -} - -p, -ul, -ol, -dl, -blockquote { - margin: 0 0 1.5em 0; -} - -ol, -ul { - padding-left: 1.3em; - padding-right: 1.5em; -} - -ol ol, -ul ul, -ul ol, -ol ul { - margin: 0.5em 0 1em; -} - -ul { - list-style: disc; -} - -ol { - list-style: decimal; -} - -ul, -ol { - max-width: 100%; -} - -li { - margin: 0.5em 0; - padding-left: 0.3em; - line-height: 1.6em; -} - -dt { - float: left; - margin: 0 20px 0 0; - width: 120px; - font-weight: 500; - text-align: right; -} - -dd { - margin: 0 0 5px 0; - text-align: left; -} - -blockquote { - margin: 0.3em 0 1.8em; - padding: 0 1.6em 0 1.6em; - border-left: #cbeafb 0.5em solid; -} - -blockquote p { - margin: 0.8em 0; - font-size: 1.2em; - font-weight: 300; -} - -blockquote small { - display: inline-block; - margin: 0.8em 0 0.8em 1.5em; - font-size: 0.9em; - opacity: 0.8; -} -/* Quotation marks */ -blockquote small:before { - content: "\2014 \00A0"; -} - -blockquote cite { - font-weight: bold; -} -blockquote cite a { - font-weight: normal; -} - -a { - color: #26a8ed; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin-top: 0; - color: var(--color-base); - line-height: 1.15; - font-weight: 700; - text-rendering: optimizeLegibility; -} - -h1 { - margin: 0 0 0.5em 0; - font-size: 4rem; - font-weight: 700; -} -@media (max-width: 500px) { - h1 { - font-size: 2rem; - } -} - -h2 { - margin: 1.5em 0 0.5em 0; - font-size: 2rem; -} -@media (max-width: 500px) { - h2 { - font-size: 1.8rem; - } -} - -h3 { - margin: 1.5em 0 0.5em 0; - font-size: 1.8rem; - font-weight: 500; -} -@media (max-width: 500px) { - h3 { - font-size: 1.7rem; - } -} - -h4 { - margin: 1.5em 0 0.5em 0; - font-size: 1.6rem; - font-weight: 500; -} - -h5 { - margin: 1.5em 0 0.5em 0; - font-size: 1.4rem; - font-weight: 500; -} - -h6 { - margin: 1.5em 0 0.5em 0; - font-size: 1.4rem; - font-weight: 500; -} - -/* Layout -/* ---------------------------------------------------------- */ - -.viewport { - display: flex; - flex-direction: column; - justify-content: space-between; - min-height: 100vh; -} - -.container { - max-width: 1120px; - margin: 0 auto; - padding: 0 4vw; -} - -.content { - margin: 0 auto; - font-size: 2rem; - line-height: 1.7em; -} - -.content-body { - display: flex; - flex-direction: column; - font-family: var(--font-serif); -} - -.post-full-content { - max-width: 720px; - margin: 0 auto; - background: #fff; -} - -.post-feature-image img { - margin: 0 0 3vw; - width: 100%; - height: 500px; - object-fit: cover; -} - -.content-body h1, -.content-body h2, -.content-body h3, -.content-body h4, -.content-body h5, -.content-body h6 { - font-family: var(--font-sans-serif); -} - -.content-body h1 { - margin: 1.0em 0 0.5em 0; - font-size: 3.4rem; - font-weight: 700; -} -@media (max-width: 500px) { - .content-body h1 { - font-size: 2.8rem; - } -} - -.content-title { - margin: 0 0 0.8em; - font-size: 5rem; -} -@media (max-width: 500px) { - .content-title { - margin: 0.8em 0; - font-size: 3.4rem; - } - .content { - font-size: 1.8rem; - } -} - -.content-body h2 { - margin: 0.8em 0 0.4em 0; - font-size: 3.2rem; - font-weight: 700; -} -@media (max-width: 500px) { - .content-body h2 { - font-size: 2.6rem; - } -} - -.content-body h3 { - margin: 0.5em 0 0.2em 0; - font-size: 2.8rem; - font-weight: 700; -} -@media (max-width: 500px) { - .content-body h3 { - font-size: 2.2rem; - } -} - -.content-body h4 { - margin: 0.5em 0 0.2em 0; - font-size: 2.4rem; - font-weight: 700; -} -@media (max-width: 500px) { - .content-body h4 { - font-size: 2.2rem; - } -} - -.content-body h5 { - display: block; - margin: 0.5em 0; - padding: 1em 0 1.5em; - border: 0; - font-family: Georgia,serif; - color: var(--color-primary); - font-style: italic; - font-size: 3.2rem; - line-height: 1.35em; - text-align: center; -} - -.content-body h6 { - margin: 0.5em 0 0.2em 0; - font-size: 2.0rem; - font-weight: 700; -} - -.content-body figure { - margin: 0.4em 0 1.6em; - font-size: 2.8rem; - font-weight: 700; -} - -.content-body pre { - margin: 0.4em 0 1.8em; - font-size: 1.6rem; - line-height: 1.4em; - white-space: pre-wrap; - padding: 20px; - background: var(--color-base); - color: #fff; - border-radius: 12px; -} - -/* Header -/* ---------------------------------------------------------- */ - -.site-head { - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - background: var(--color-base); -} - -.site-nav-item { - display: inline-block; - padding: 5px 10px; - color: #fff; - opacity: 0.7; -} - -.site-nav-item:hover { - text-decoration: none; - opacity: 1; -} - -.site-nav-icon { - height: 15px; - margin: -5px 0 0; -} - -.site-logo { - height: 25px; -} - -.site-mast { - display: flex; - align-items: center; - justify-content: space-between; -} - -.site-mast-right { - display: flex; - align-items: center; - margin: 0 -10px 0 20px; -} - -.site-mast-right .site-nav-item:last-child { - padding-right: 0; -} - -.site-banner { - max-width: 80%; - margin: 0 auto; - padding: 10vw 0; - text-align: center; -} - -.site-banner-title { - margin: 0; - padding: 0; - color: #fff; - font-size: 4rem; - line-height: 1.3em; -} - -.site-banner-desc { - margin: 5px 0 0 0; - padding: 0; - font-size: 2.4rem; - line-height: 1.3em; - opacity: 0.7; -} - -.site-nav { - display: flex; - align-items: center; - justify-content: space-between; - margin: 15px 0 0 0; -} - -.site-nav-left { - margin: 0 20px 0 -10px; -} - -.site-nav-right { - margin: 0 -10px 0 20px; -} - -.site-nav-button { - display: inline-block; - padding: 5px 10px; - border: #fff 1px solid; - color: #fff; - font-size: 1.3rem; - line-height: 1em; - border-radius: var(--radius); - opacity: 0.7; -} - -.site-nav-button:hover { - text-decoration: none; -} - -/* Main -/* ---------------------------------------------------------- */ - -.site-main { - padding: 4vw 0; -} - -/* Index -/* ---------------------------------------------------------- */ - -.post-feed { - display: grid; - justify-content: space-between; - grid-gap: 30px; - grid-template-columns: 1fr 1fr 1fr; -} - -@media (max-width: 980px) { - .post-feed { - grid-template-columns: 1fr 1fr; - } -} -@media (max-width: 680px) { - .post-feed { - grid-template-columns: 1fr; - } -} - -.post-card { - color: inherit; - text-decoration: none; -} - -.post-card:hover { - text-decoration: none; -} - -.post-card-tags { - margin: 0 0 5px 0; - font-size: 1.4rem; - line-height: 1.15em; - color: var(--color-secondary); -} - - -.post-card-title { - margin: 0 0 10px 0; - padding: 0; -} - -.post-card-excerpt { - font-size: 1.6rem; - line-height: 1.55em; -} - -.post-card-image { - margin: 0 0 10px 0; - width: auto; - height: 200px; - background: var(--color-secondary) no-repeat center center; - background-size: cover; -} - -.post-card-footer { - display: flex; - align-items: center; - justify-content: space-between; - margin: 10px 0 0 0; - color: var(--color-secondary); -} - -.post-card-footer-left { - display: flex; - align-items: center; -} - -.post-card-footer-right { - display: flex; - flex-direction: column; -} - -.post-card-avatar { - width: 30px; - height: 30px; - margin: 0 7px 0 0; - border-radius: 100%; - display: flex; - align-items: center; - justify-content: center; -} - -.post-card-avatar .author-profile-image { - display: block; - width: 100%; - background: var(--color-secondary); - border-radius: 100%; - object-fit: cover; -} - -.post-card-avatar .default-avatar { - width: 26px; -} - - -/* Tag Archives -/* ---------------------------------------------------------- */ - -.tag-header { - max-width: 690px; - margin: 0 0 4vw; -} - -.tag-header h1 { - margin: 0 0 1rem 0; -} - -.tag-header p { - margin: 0; - color: var(--color-secondary); - font-size: 2.2rem; - line-height: 1.3em; -} - -@media (max-width: 500px) { - .tag-header { - border-bottom: var(--color-bg) 1px solid; - padding-bottom: 4vw; - } - .tag-header p { - font-size: 1.7rem; - } -} - - -/* Author Archives -/* ---------------------------------------------------------- */ - -.author-header { - display: flex; - justify-content: space-between; - margin: 0 0 4vw; -} - -.author-header h1 { - margin: 0 0 1rem 0; -} - -.author-header p { - margin: 0; - color: var(--color-secondary); - font-size: 2.2rem; - line-height: 1.3em; -} - -.author-header-image { - flex: 0 0 auto; - margin: 0 0 0 4vw; - height: 120px; - width: 120px; - border-radius: 100%; - overflow: hidden; -} - -.author-header-meta { - display: flex; - margin: 1rem 0 0 0; -} - -.author-header-item { - display: block; - padding: 2px 10px; -} - -.author-header-item:first-child { - padding-left: 0; -} - -@media (max-width: 500px) { - .author-header { - border-bottom: var(--color-bg) 1px solid; - padding-bottom: 4vw; - } - .author-header p { - font-size: 1.7rem; - } - .author-header-image { - height: 80px; - width: 80px; - } -} - - -/* Pagination -/* ---------------------------------------------------------- */ - -.pagination { - position: relative; - display: flex; - justify-content: space-between; - align-items: center; - margin: 4vw 0 0; -} - -.pagination a { - display: inline-block; - padding: 10px 15px; - border: var(--color-border) 1px solid; - color: var(--color-secondary); - text-decoration: none; - font-size: 1.4rem; - line-height: 1em; - border-radius: var(--radius); -} - -.pagination-location { - position: absolute; - left: 50%; - width: 100px; - margin-left: -50px; - text-align: center; - color: var(--color-secondary); - font-size: 1.3rem; -} - - -/* Footer -/* ---------------------------------------------------------- */ - -.site-foot { - padding: 20px 0 40px 0; - color: rgba(255,255,255,0.7); - font-size: 1.3rem; - background: var(--color-base); -} - -.site-foot-nav { - display: flex; - align-items: center; - justify-content: space-between; -} - -.site-foot-nav a { - color: rgba(255,255,255,0.7); -} - -.site-foot-nav a:hover { - text-decoration: none; - color: rgba(255,255,255,1); -} - -.site-foot-nav-right a { - display: inline-block; - padding: 2px 5px; -} - -.site-foot-nav-right a:last-child { - padding-right: 0; -} diff --git a/global-site/src/templates/author.js b/global-site/src/templates/author.js deleted file mode 100755 index 8950dfa..0000000 --- a/global-site/src/templates/author.js +++ /dev/null @@ -1,96 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { graphql } from 'gatsby' - -import { Layout, PostCard, Pagination } from '../components/common' -import { MetaData } from '../components/common/meta' - -/** -* Author page (/author/:slug) -* -* Loads all posts for the requested author incl. pagination. -* -*/ -const Author = ({ data, location, pageContext }) => { - const author = data.ghostAuthor - const posts = data.allGhostPost.edges - const twitterUrl = author.twitter ? `https://twitter.com/${author.twitter.replace(/^@/, ``)}` : null - const facebookUrl = author.facebook ? `https://www.facebook.com/${author.facebook.replace(/^\//, ``)}` : null - - return ( - <> - - -
-
-
-

{author.name}

- {author.bio &&

{author.bio}

} -
- {author.website && Website} - {twitterUrl && Twitter} - {facebookUrl && Facebook} -
-
-
- {author.profile_image && {author.name}} -
-
-
- {posts.map(({ node }) => ( - // The tag below includes the markup for each post - components/common/PostCard.js - - ))} -
- -
-
- - ) -} - -Author.propTypes = { - data: PropTypes.shape({ - ghostAuthor: PropTypes.shape({ - name: PropTypes.string.isRequired, - cover_image: PropTypes.string, - profile_image: PropTypes.string, - website: PropTypes.string, - bio: PropTypes.string, - location: PropTypes.string, - facebook: PropTypes.string, - twitter: PropTypes.string, - }), - allGhostPost: PropTypes.object.isRequired, - }).isRequired, - location: PropTypes.shape({ - pathname: PropTypes.string.isRequired, - }).isRequired, - pageContext: PropTypes.object, -} - -export default Author - -export const pageQuery = graphql` - query GhostAuthorQuery($slug: String!, $limit: Int!, $skip: Int!) { - ghostAuthor(slug: { eq: $slug }) { - ...GhostAuthorFields - } - allGhostPost( - sort: { order: DESC, fields: [published_at] }, - filter: {authors: {elemMatch: {slug: {eq: $slug}}}}, - limit: $limit, - skip: $skip - ) { - edges { - node { - ...GhostPostFields - } - } - } - } -` diff --git a/global-site/src/templates/index.js b/global-site/src/templates/index.js deleted file mode 100755 index af6b09c..0000000 --- a/global-site/src/templates/index.js +++ /dev/null @@ -1,65 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { graphql } from 'gatsby' - -import { Layout, PostCard, Pagination } from '../components/common' -import { MetaData } from '../components/common/meta' - -/** -* Main index page (home page) -* -* Loads all posts from Ghost and uses pagination to navigate through them. -* The number of posts that should appear per page can be setup -* in /utils/siteConfig.js under `postsPerPage`. -* -*/ -const Index = ({ data, location, pageContext }) => { - const posts = data.allGhostPost.edges - - return ( - <> - - -
-
- {posts.map(({ node }) => ( - // The tag below includes the markup for each post - components/common/PostCard.js - - ))} -
- -
-
- - ) -} - -Index.propTypes = { - data: PropTypes.shape({ - allGhostPost: PropTypes.object.isRequired, - }).isRequired, - location: PropTypes.shape({ - pathname: PropTypes.string.isRequired, - }).isRequired, - pageContext: PropTypes.object, -} - -export default Index - -// This page query loads all posts sorted descending by published date -// The `limit` and `skip` values are used for pagination -export const pageQuery = graphql` - query GhostPostQuery($limit: Int!, $skip: Int!) { - allGhostPost( - sort: { order: DESC, fields: [published_at] }, - limit: $limit, - skip: $skip - ) { - edges { - node { - ...GhostPostFields - } - } - } - } -` diff --git a/global-site/src/templates/page.js b/global-site/src/templates/page.js deleted file mode 100755 index ac3ef23..0000000 --- a/global-site/src/templates/page.js +++ /dev/null @@ -1,64 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { graphql } from 'gatsby' -import Helmet from 'react-helmet' - -import { Layout } from '../components/common' -import { MetaData } from '../components/common/meta' - -/** -* Single page (/:slug) -* -* This file renders a single page and loads all the content. -* -*/ -const Page = ({ data, location }) => { - const page = data.ghostPage - - return ( - <> - - - - - -
-
-

{page.title}

- - {/* The main page content */} -
-
-
-
- - ) -} - -Page.propTypes = { - data: PropTypes.shape({ - ghostPage: PropTypes.shape({ - title: PropTypes.string.isRequired, - html: PropTypes.string.isRequired, - feature_image: PropTypes.string, - }).isRequired, - }).isRequired, - location: PropTypes.object.isRequired, -} - -export default Page - -export const postQuery = graphql` - query($slug: String!) { - ghostPage(slug: { eq: $slug }) { - ...GhostPageFields - } - } -` diff --git a/global-site/src/templates/post.js b/global-site/src/templates/post.js deleted file mode 100755 index 491ff7c..0000000 --- a/global-site/src/templates/post.js +++ /dev/null @@ -1,70 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { graphql } from 'gatsby' -import Helmet from 'react-helmet' - -import { Layout } from '../components/common' -import { MetaData } from '../components/common/meta' - -/** -* Single post view (/:slug) -* -* This file renders a single post and loads all the content. -* -*/ -const Post = ({ data, location }) => { - const post = data.ghostPost - - return ( - <> - - - - - -
-
- { post.feature_image ? -
- { -
: null } -
-

{post.title}

- - {/* The main post content */ } -
-
-
-
-
- - ) -} - -Post.propTypes = { - data: PropTypes.shape({ - ghostPost: PropTypes.shape({ - title: PropTypes.string.isRequired, - html: PropTypes.string.isRequired, - feature_image: PropTypes.string, - }).isRequired, - }).isRequired, - location: PropTypes.object.isRequired, -} - -export default Post - -export const postQuery = graphql` - query($slug: String!) { - ghostPost(slug: { eq: $slug }) { - ...GhostPostFields - } - } -` diff --git a/global-site/src/templates/tag.js b/global-site/src/templates/tag.js deleted file mode 100755 index 75caa20..0000000 --- a/global-site/src/templates/tag.js +++ /dev/null @@ -1,78 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { graphql } from 'gatsby' - -import { Layout, PostCard, Pagination } from '../components/common' -import { MetaData } from '../components/common/meta' - -/** -* Tag page (/tag/:slug) -* -* Loads all posts for the requested tag incl. pagination. -* -*/ -const Tag = ({ data, location, pageContext }) => { - const tag = data.ghostTag - const posts = data.allGhostPost.edges - - return ( - <> - - -
-
-

{tag.name}

- {tag.description ?

{tag.description}

: null } -
-
- {posts.map(({ node }) => ( - // The tag below includes the markup for each post - components/common/PostCard.js - - ))} -
- -
-
- - ) -} - -Tag.propTypes = { - data: PropTypes.shape({ - ghostTag: PropTypes.shape({ - name: PropTypes.string.isRequired, - description: PropTypes.string, - }), - allGhostPost: PropTypes.object.isRequired, - }).isRequired, - location: PropTypes.shape({ - pathname: PropTypes.string.isRequired, - }).isRequired, - pageContext: PropTypes.object, -} - -export default Tag - -export const pageQuery = graphql` - query GhostTagQuery($slug: String!, $limit: Int!, $skip: Int!) { - ghostTag(slug: { eq: $slug }) { - ...GhostTagFields - } - allGhostPost( - sort: { order: DESC, fields: [published_at] }, - filter: {tags: {elemMatch: {slug: {eq: $slug}}}}, - limit: $limit, - skip: $skip - ) { - edges { - node { - ...GhostPostFields - } - } - } - } -` diff --git a/global-site/src/utils/fragments.js b/global-site/src/utils/fragments.js deleted file mode 100644 index 9701934..0000000 --- a/global-site/src/utils/fragments.js +++ /dev/null @@ -1,239 +0,0 @@ -import { graphql } from 'gatsby' - -/** -* These so called fragments are the fields we query on each template. -* A fragment make queries a bit more reuseable, so instead of typing and -* remembering every possible field, you can just use -* ...GhostPostFields -* for example to load all post fields into your GraphQL query. -* -* Further info ๐Ÿ‘‰๐Ÿผ https://www.gatsbyjs.org/docs/graphql-reference/#fragments -* -*/ - -// Used for tag archive pages -export const ghostTagFields = graphql` - fragment GhostTagFields on GhostTag { - slug - name - visibility - feature_image - description - meta_title - meta_description - } -` - -// Used for author pages -export const ghostAuthorFields = graphql` - fragment GhostAuthorFields on GhostAuthor { - slug - name - bio - cover_image - profile_image - location - website - twitter - facebook - } -` - -// Used for single posts -export const ghostPostFields = graphql` - fragment GhostPostFields on GhostPost { - # Main fields - id - title - slug - featured - feature_image - excerpt - custom_excerpt - - # Dates formatted - created_at_pretty: created_at(formatString: "DD MMMM, YYYY") - published_at_pretty: published_at(formatString: "DD MMMM, YYYY") - updated_at_pretty: updated_at(formatString: "DD MMMM, YYYY") - - # Dates unformatted - created_at - published_at - updated_at - - # SEO - meta_title - meta_description - og_description - og_image - og_title - twitter_description - twitter_image - twitter_title - - # Authors - authors { - name - slug - bio - # email - profile_image - twitter - facebook - website - } - primary_author { - name - slug - bio - # email - profile_image - twitter - facebook - website - } - - # Tags - primary_tag { - name - slug - description - feature_image - meta_description - meta_title - visibility - } - tags { - name - slug - description - feature_image - meta_description - meta_title - visibility - } - - # Content - plaintext - html - - # Additional fields - url - uuid - page - codeinjection_foot - codeinjection_head - codeinjection_styles - comment_id - } -` - -// Used for single pages -export const ghostPageFields = graphql` - fragment GhostPageFields on GhostPage { - # Main fields - title - slug - featured - feature_image - excerpt - custom_excerpt - - # Dates formatted - created_at_pretty: created_at(formatString: "DD MMMM, YYYY") - published_at_pretty: published_at(formatString: "DD MMMM, YYYY") - updated_at_pretty: updated_at(formatString: "DD MMMM, YYYY") - - # Dates unformatted - created_at - published_at - updated_at - - # SEO - meta_title - meta_description - og_description - og_image - og_title - twitter_description - twitter_image - twitter_title - - # Authors - authors { - name - slug - bio - # email - profile_image - twitter - facebook - website - } - primary_author { - name - slug - bio - # email - profile_image - twitter - facebook - website - } - - # Tags - primary_tag { - name - slug - description - feature_image - meta_description - meta_title - visibility - } - tags { - name - slug - description - feature_image - meta_description - meta_title - visibility - } - - # Content - plaintext - html - - # Additional fields - url - uuid - page - codeinjection_foot - codeinjection_head - codeinjection_styles - comment_id - } -` - -// Used for settings -export const ghostSettingsFields = graphql` - fragment GhostSettingsFields on GhostSettings { - title - description - logo - icon - cover_image - facebook - twitter - lang - timezone - codeinjection_head - codeinjection_foot - codeinjection_styles - navigation { - label - url - } - } -` diff --git a/global-site/src/utils/rss/generate-feed.js b/global-site/src/utils/rss/generate-feed.js deleted file mode 100644 index 9dcad19..0000000 --- a/global-site/src/utils/rss/generate-feed.js +++ /dev/null @@ -1,121 +0,0 @@ -const cheerio = require(`cheerio`) -const tagsHelper = require(`@tryghost/helpers`).tags -const _ = require(`lodash`) - -const generateItem = function generateItem(post) { - const itemUrl = post.url - const html = post.html - const htmlContent = cheerio.load(html, { decodeEntities: false, xmlMode: true }) - const item = { - title: post.title, - description: post.excerpt, - guid: post.id, - url: itemUrl, - date: post.published_at, - categories: _.map(tagsHelper(post, { visibility: `public`, fn: tag => tag }), `name`), - author: post.primary_author ? post.primary_author.name : null, - custom_elements: [], - } - let imageUrl - - if (post.feature_image) { - imageUrl = post.feature_image - - // Add a media content tag - item.custom_elements.push({ - 'media:content': { - _attr: { - url: imageUrl, - medium: `image`, - }, - }, - }) - - // Also add the image to the content, because not all readers support media:content - htmlContent(`p`).first().before(``) - htmlContent(`img`).attr(`alt`, post.title) - } - - item.custom_elements.push({ - 'content:encoded': { - _cdata: htmlContent.html(), - }, - }) - return item -} - -const generateRSSFeed = function generateRSSFeed(siteConfig) { - return { - serialize: ({ query: { allGhostPost } }) => allGhostPost.edges.map(edge => Object.assign({}, generateItem(edge.node))), - setup: ({ query: { allGhostSettings } }) => { - const siteTitle = allGhostSettings.edges[0].node.title || `No Title` - const siteDescription = allGhostSettings.edges[0].node.description || `No Description` - const feed = { - title: siteTitle, - description: siteDescription, - // generator: `Ghost ` + data.safeVersion, - generator: `Ghost 2.9`, - feed_url: `${siteConfig.siteUrl}/rss/`, - site_url: `${siteConfig.siteUrl}/`, - image_url: `${siteConfig.siteUrl}/${siteConfig.siteIcon}`, - ttl: `60`, - custom_namespaces: { - content: `http://purl.org/rss/1.0/modules/content/`, - media: `http://search.yahoo.com/mrss/`, - }, - } - return { - ...feed, - } - }, - query: ` - { - allGhostPost( - sort: {order: DESC, fields: published_at} - ) { - edges { - node { - # Main fields - id - title - slug - featured - feature_image - - # Dates unformatted - created_at - published_at - updated_at - - # SEO - excerpt - meta_title - meta_description - - # Authors - authors { - name - } - primary_author { - name - } - tags { - name - visibility - } - - # Content - html - - # Additional fields - url - } - } - } - } - `, - output: `/rss`, - } -} - -module.exports = generateRSSFeed diff --git a/global-site/src/utils/siteConfig.js b/global-site/src/utils/siteConfig.js deleted file mode 100644 index 1bfca8a..0000000 --- a/global-site/src/utils/siteConfig.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - siteUrl: `https://gatsby.ghost.org`, // Site domain. Do not include a trailing slash! - - postsPerPage: 12, // Number of posts shown on paginated pages (changes this requires sometimes to delete the cache) - - siteTitleMeta: `Ghost Gatsby Starter`, // This allows an alternative site title for meta data for pages. - siteDescriptionMeta: `A starter template to build amazing static websites with Ghost and Gatsby`, // This allows an alternative site description for meta data for pages. - - shareImageWidth: 1000, // Change to the width of your default share image - shareImageHeight: 523, // Change to the height of your default share image - - shortTitle: `Ghost`, // Used for App manifest e.g. Mobile Home Screen - siteIcon: `favicon.png`, // Logo in /static dir used for SEO, RSS, and App manifest - backgroundColor: `#e9e9e9`, // Used for Offline Manifest - themeColor: `#15171A`, // Used for Offline Manifest -} diff --git a/global-site/static/_headers b/global-site/static/_headers deleted file mode 100644 index a7e3864..0000000 --- a/global-site/static/_headers +++ /dev/null @@ -1,18 +0,0 @@ -# This is recommended to prevent the caching of the service worker file itself -# https://www.netlify.com/blog/2018/06/28/5-pro-tips-and-plugins-for-optimizing-your-gatsby---netlify-site/#4-get-your-service-workers-um-working -/sw.js # Gatsby's default service worker file path - Cache-Control: no-cache - -/rss - content-type: application/rss+xml; charset=UTF-8 - -# These are default recommended security headers, for Netlify -# https://www.netlify.com/docs/headers-and-basic-auth/ - -/* - Referrer-Policy: no-referrer-when-downgrade - Strict-Transport-Security: max-age=31536000 - X-Content-Type-Options: nosniff - X-Frame-Options: SAMEORIGIN - X-Xss-Protection: 1; mode=block - Feature-Policy: accelerometer 'none'; camera 'none'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; payment 'none'; usb 'none' diff --git a/global-site/static/_redirects b/global-site/static/_redirects deleted file mode 100644 index 106824d..0000000 --- a/global-site/static/_redirects +++ /dev/null @@ -1,5 +0,0 @@ -# Netlify redirects file, edit with your domain -# https://www.netlify.com/docs/redirects/ - -https://gatsby-starter-ghost.netlify.com/* https://gatsby.ghost.org/:splat 301! -http://gatsby-starter-ghost.netlify.com/* https://gatsby.ghost.org/:splat 301! diff --git a/global-site/static/favicon.ico b/global-site/static/favicon.ico deleted file mode 100644 index c24e3c410330d199710adb42c6a1f624ef87c013..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeHOX>b%p6dnqz{G$cGEPv*QTK*FSLP$2*T;vWR2PqFw!4hH#B7$5cuyPfLMM)v2 zf+)om!WoXp8L^Nn;Yb2Xgak+|NjL=aPf~fluXlSg+00~SCp+0Jq}3P9v1?8 z-Vs*UACo4_CrGK(C2((M%IN%8o5Q- z?ux{_+8f8anI9j*XBTTkSKm3v=t^F!n!e55?MK=2xrrwrr1$9z}CB#LE_DQ|44P~e^k^?5NrHm6PY*@Br z5!F;zQElz-RC~QMUAtC8>({QLeJDso{J{*yqO7-=1 zWcGV-|2~a=r;uDj2MR(SWoAEMLx&S%DK>f_<>zKnb5oO<8Pw9!LLZKOSG6B`l$rg2 z4IR)G>^^``@<(J+)7`sfW(Zq97&A(>A9*YG0~I-IZ{{R!N{g5fm(%h~)MFQlb@gtA2oJYwwo_dnhN)EUVEv#=n?G25j* zXhTfY8|v7Q?`V7Kt&{vR_11SG$Cys}UE1(8q|*P{{z1uH;d-Zo+-xi z!ucKw2I0K`Ca|4q18`G$Za8uLD7Ch>Qd?VFPzjj8h7Kp%08Fd%zu7!#RPXHk&+9L* zEzM2l>z9#zX63;4u3yfqzv(FnbmrI7W@gx~KYQjhL5CCLN6ww2-X2NIzgj}8zga=6 zR(>560v0fVE%i8+Vjb#w{qlZuwy$T_o+YMJc0Vn+7@P1_46k1?QP#-C{Ce&8_9bHo zte#oFa=r`%+jXzWzU;-ODoM;0u^G9UR-MfF;njiP= z-L39zG5+wqfHhqE12%LxW54zNqt+&wKTx`_gZ=Y7Uv#qH>HQ=2QFrd#mL>(1mh9Y4 z@v%e1I{^RBnlV*;M`=NTE%$AD?|XO465T^-?dp}(*w8@D%}ru251$zlc$lu%RMRID z#;fB3<0Fs9$?;=HsENNBzynNRLq~V*G?Is2;KN5aC$LI5xAMmXR%)_aeD44Un80>o z?Ca^q8HaV!KO2OtUILarkH2o6XIp2WIyjwt+ygu^Mi~m-!O$t=tHHnu1%`+X_dq{8 z)wWG>-dKB>#_tB_hI{-JaqMu8U&}Z=V)FbRgysDKwGCl>e?zvxdw)j6nOc~Fy*2?8*wdg(YX{FUuW)%O)4xo? z*6WW49i`9-8+`4CZht*vayb4CLL3}-6%yjw_oK+840VzZGLW^S6EbK|YH}Ry-Ls2s)z?#f zU7eRW7GHPs2CZDNT*XEnW%XPq`5?1*Pl>>=vxkEW;yy;_LTC6)9Q#@j@_IkW+KnAS ze_l>HH8kAOgBI~>+}i*d#jYU>3_I;d9{_v7yg9VHq?mS1 z(u5*WwoAhY8OQ>|?ihd^&IJAK$1}<$t`#218)ypb?ogomwEXa$XU;4t-m%q7+c~vD zK7PpB^*?-^i}7dkTn>X4vcT}~KW!V0@{q~P$)Lu@2Ho**r4X{fu%jP#;oV-kcmW+c zu%8YFNRU~&c%i^BYNM5M?Kro>ujT2Eti%C^h^rvBVnA9w@U`UAmP@=q()idYai06* z4;#sdzTfyQ6^$FC&P8t(=F<9gt7$XK;4E044F{qZyl4l`E^pteHyvsxPaNZZju!3S zxM97@4_UkC&N#y?$jh>HuL`kW+{J^xw{6|5>POrh78FPj_F^ye2FS6FVMt~#|c6nWo3sC2p;fCz5Xfg1K@6aMrxwi zXJW63Jjzh#&o7^WnaTPOA1bBGmoCz!ixo_jKB^F9hYywt9zFeD`;+PDkuth=wMN`; z$Gv$$HC3Vvb%>4X$xAz={h4X7Ig!#*;@R$4UbB#z*w1Y&-M@z_E}WzD=gx9^Uab4r zFK_s69e=Ct6MoRsk237h;b+`^zjv>h9z3{Dznm%;cHpi>b@dg&qbCphF*eY@BlELq zWF8Zz*%`xx&*6XI>x`ccV-VQ*UXdhqA(eUQD^4Mccfj`hqj?8yy}zDr%uJB|4{t4J A_5c6? diff --git a/global-site/static/favicon.png b/global-site/static/favicon.png deleted file mode 100644 index 6458c1f5972525e340123b59979848fd128fe2f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6792 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 8 \ No newline at end of file diff --git a/global-site/static/images/icons/facebook.svg b/global-site/static/images/icons/facebook.svg deleted file mode 100644 index 1fa8867..0000000 --- a/global-site/static/images/icons/facebook.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/global-site/static/images/icons/rss.svg b/global-site/static/images/icons/rss.svg deleted file mode 100644 index 025a148..0000000 --- a/global-site/static/images/icons/rss.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/global-site/static/images/icons/twitter.svg b/global-site/static/images/icons/twitter.svg deleted file mode 100644 index 45f34cc..0000000 --- a/global-site/static/images/icons/twitter.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/global-site/static/images/logo.svg b/global-site/static/images/logo.svg deleted file mode 100644 index cb6e72d..0000000 --- a/global-site/static/images/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/global-site/static/robots.txt b/global-site/static/robots.txt deleted file mode 100755 index c2a49f4..0000000 --- a/global-site/static/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Allow: / From d114018290b56d0824d99dd187e0cc651e2ac9a9 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 22 Jul 2019 16:55:15 +0200 Subject: [PATCH 03/12] skeleton stuff and exploring gatsby --- gatsby-site/gatsby-config.js | 14 +++++++++++--- gatsby-site/package.json | 1 + gatsby-site/src/components/custom.css | 8 ++++++++ gatsby-site/src/components/header.js | 16 ++++++---------- gatsby-site/src/components/layout.css | 6 +++++- gatsby-site/src/components/layout.js | 5 ++--- gatsby-site/src/pages/index.js | 8 +++++--- 7 files changed, 38 insertions(+), 20 deletions(-) create mode 100644 gatsby-site/src/components/custom.css diff --git a/gatsby-site/gatsby-config.js b/gatsby-site/gatsby-config.js index 26bcad4..9c0631e 100644 --- a/gatsby-site/gatsby-config.js +++ b/gatsby-site/gatsby-config.js @@ -1,6 +1,6 @@ module.exports = { siteMetadata: { - title: `Gatsby Default Starter`, + title: `open Summer of Code`, description: `Kick off your next, great Gatsby project with this default starter. This barebones starter ships with the main Gatsby configuration files you might need.`, author: `@gatsbyjs`, menuLinks:[ @@ -9,9 +9,17 @@ module.exports = { link:'/' }, { - name:'page2', + name:'About', link:'/page-2' - } + }, + { + name:'Take a look!', + link:'/page-2' + }, + { + name:'Contact', + link:'/page-2' + } ] }, plugins: [ diff --git a/gatsby-site/package.json b/gatsby-site/package.json index 2cb0061..5ff8daf 100644 --- a/gatsby-site/package.json +++ b/gatsby-site/package.json @@ -11,6 +11,7 @@ "gatsby-plugin-offline": "^2.2.4", "gatsby-plugin-react-helmet": "^3.1.2", "gatsby-plugin-sharp": "^2.2.8", + "gatsby-plugin-web-font-loader": "^1.0.4", "gatsby-source-filesystem": "^2.1.5", "gatsby-transformer-sharp": "^2.2.4", "prop-types": "^15.7.2", diff --git a/gatsby-site/src/components/custom.css b/gatsby-site/src/components/custom.css new file mode 100644 index 0000000..8d1ecb0 --- /dev/null +++ b/gatsby-site/src/components/custom.css @@ -0,0 +1,8 @@ +.landingPage{ + height: 90vh; + background: pink; +} + +header { + background: #000; +} \ No newline at end of file diff --git a/gatsby-site/src/components/header.js b/gatsby-site/src/components/header.js index 81a28ac..3584e37 100644 --- a/gatsby-site/src/components/header.js +++ b/gatsby-site/src/components/header.js @@ -3,17 +3,13 @@ import PropTypes from "prop-types" import React from "react" const Header = ({ siteTitle, menuLinks }) => ( -
+

@@ -24,7 +20,7 @@ const Header = ({ siteTitle, menuLinks }) => ( textDecoration: `none`, }} > - {siteTitle} + {siteTitle}

diff --git a/gatsby-site/src/components/layout.css b/gatsby-site/src/components/layout.css index b6f6332..61f0607 100644 --- a/gatsby-site/src/components/layout.css +++ b/gatsby-site/src/components/layout.css @@ -64,6 +64,10 @@ h1 { font-size: 2em; margin: 0.67em 0; } + +header { + height: 10vh; +} mark { background-color: #ff0; color: #000; @@ -185,7 +189,7 @@ textarea { font: inherit; } html { - font: 112.5%/1.45em georgia, serif; + /* font: 112.5%/1.45em georgia, serif; */ box-sizing: border-box; overflow-y: scroll; } diff --git a/gatsby-site/src/components/layout.js b/gatsby-site/src/components/layout.js index 30d47ef..6126cd6 100644 --- a/gatsby-site/src/components/layout.js +++ b/gatsby-site/src/components/layout.js @@ -11,6 +11,7 @@ import { useStaticQuery, graphql } from "gatsby" import Header from "./header" import "./layout.css" +import "./custom.css" const Layout = ({ children }) => { const data = useStaticQuery(graphql` @@ -33,9 +34,7 @@ const Layout = ({ children }) => {
diff --git a/gatsby-site/src/pages/index.js b/gatsby-site/src/pages/index.js index 7eb6257..a700466 100644 --- a/gatsby-site/src/pages/index.js +++ b/gatsby-site/src/pages/index.js @@ -8,9 +8,11 @@ import SEO from "../components/seo" const IndexPage = () => ( -

Hi people

-

Welcome to your new Gatsby site.

-

Now go build something great.

+
+

Hi people

+

Welcome to your new Gatsby site.

+

Now go build something great.

+
From 34f04eae7558e9fc6de2dec6d173dcd817cc0535 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 22 Jul 2019 17:00:14 +0200 Subject: [PATCH 04/12] Content part 1 --- gatsby-site/src/pages/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gatsby-site/src/pages/index.js b/gatsby-site/src/pages/index.js index a700466..b30c063 100644 --- a/gatsby-site/src/pages/index.js +++ b/gatsby-site/src/pages/index.js @@ -9,9 +9,9 @@ const IndexPage = () => (
-

Hi people

-

Welcome to your new Gatsby site.

-

Now go build something great.

+

open Summer of Code is going international!

+

New chapters or something

+

yeay, fun!

From 729851722521dc422c9f219cf55e457454ed5919 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 22 Jul 2019 20:50:08 +0200 Subject: [PATCH 05/12] Fonts from Google --- gatsby-site/gatsby-config.js | 13 ++++++-- gatsby-site/package.json | 1 + gatsby-site/src/components/custom.css | 14 ++++++-- gatsby-site/src/components/header.js | 15 ++++----- gatsby-site/src/components/layout.css | 11 ++----- gatsby-site/src/images/logo-osoc-color.svg | 38 ++++++++++++++++++++++ gatsby-site/src/pages/index.js | 34 +++++++++++++++---- 7 files changed, 98 insertions(+), 28 deletions(-) create mode 100644 gatsby-site/src/images/logo-osoc-color.svg diff --git a/gatsby-site/gatsby-config.js b/gatsby-site/gatsby-config.js index 9c0631e..db0a401 100644 --- a/gatsby-site/gatsby-config.js +++ b/gatsby-site/gatsby-config.js @@ -22,9 +22,16 @@ module.exports = { } ] }, - plugins: [ + plugins: [ { + resolve: 'gatsby-plugin-web-font-loader', + options: { + google: { + families: ['Open Sans', 'Montserrat'] + } + } + }, `gatsby-plugin-react-helmet`, - { + { resolve: `gatsby-source-filesystem`, options: { name: `images`, @@ -45,6 +52,8 @@ module.exports = { icon: `src/images/gatsby-icon.png`, // This path is relative to the root of the site. }, }, + + // this (optional) plugin enables Progressive Web App + Offline functionality // To learn more, visit: https://gatsby.dev/offline // `gatsby-plugin-offline`, diff --git a/gatsby-site/package.json b/gatsby-site/package.json index 5ff8daf..ae02099 100644 --- a/gatsby-site/package.json +++ b/gatsby-site/package.json @@ -16,6 +16,7 @@ "gatsby-transformer-sharp": "^2.2.4", "prop-types": "^15.7.2", "react": "^16.8.6", + "react-bootstrap": "^1.0.0-beta.9", "react-dom": "^16.8.6", "react-helmet": "^5.2.1" }, diff --git a/gatsby-site/src/components/custom.css b/gatsby-site/src/components/custom.css index 8d1ecb0..b817a03 100644 --- a/gatsby-site/src/components/custom.css +++ b/gatsby-site/src/components/custom.css @@ -1,8 +1,18 @@ .landingPage{ - height: 90vh; + min-height: 70vh; background: pink; + padding: 5vh 2rem; } header { - background: #000; + background: #FFF; +} + +.logo img { + width: 5rem; + display: block; +} + +nav ul li a{ + text-decoration: none; } \ No newline at end of file diff --git a/gatsby-site/src/components/header.js b/gatsby-site/src/components/header.js index 3584e37..c221ea3 100644 --- a/gatsby-site/src/components/header.js +++ b/gatsby-site/src/components/header.js @@ -1,7 +1,7 @@ import { Link } from "gatsby" import PropTypes from "prop-types" import React from "react" - +import Logo from "../images/logo-osoc-color.svg" const Header = ({ siteTitle, menuLinks }) => (
( }} > -

- {siteTitle} + open summer of code logo, very abstract, fun but professional -

+ +