├── static ├── robots.txt ├── favicon.ico ├── preview.jpg ├── icons │ ├── icon-48x48.png │ ├── icon-96x96.png │ ├── icon-144x144.png │ ├── icon-192x192.png │ ├── icon-256x256.png │ ├── icon-384x384.png │ ├── icon-512x512.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon-96x96.png │ ├── apple-icon-57x57.png │ ├── apple-icon-60x60.png │ ├── apple-icon-72x72.png │ ├── apple-icon-76x76.png │ ├── apple-icon-114x114.png │ ├── apple-icon-120x120.png │ ├── apple-icon-144x144.png │ ├── apple-icon-152x152.png │ └── apple-icon-180x180.png ├── screens │ └── gatsby-starter-hero-blog.gif └── _headers ├── .eslintignore ├── src ├── components │ ├── Blog │ │ ├── index.js │ │ ├── Blog.js │ │ └── Item.js │ ├── Hero │ │ ├── index.js │ │ └── Hero.js │ ├── List │ │ ├── index.js │ │ └── List.js │ ├── Menu │ │ ├── index.js │ │ ├── Item.js │ │ ├── Expand.js │ │ └── Menu.js │ ├── Page │ │ ├── index.js │ │ └── Page.js │ ├── Post │ │ ├── index.js │ │ ├── Comments.js │ │ ├── Post.js │ │ ├── Author.js │ │ ├── Meta.js │ │ ├── NextPrev.js │ │ └── Share.js │ ├── Seo │ │ ├── index.js │ │ └── Seo.js │ ├── Article │ │ ├── index.js │ │ ├── Article.js │ │ ├── Headline.js │ │ └── Bodytext.js │ ├── Contact │ │ ├── index.js │ │ └── Contact.js │ ├── Footer │ │ ├── index.js │ │ └── Footer.js │ ├── Header │ │ ├── index.js │ │ └── Header.js │ ├── Search │ │ ├── index.js │ │ ├── Hit.js │ │ └── Search.js │ └── AsyncComponent │ │ ├── index.js │ │ └── AsyncComponent.js ├── images │ ├── jpg │ │ └── avatar.jpg │ ├── app-icons │ │ ├── icon.png │ │ └── apple-icon.png │ ├── png │ │ └── hero-background.png │ └── svg-icons │ │ ├── facebook.svg │ │ ├── email.svg │ │ ├── twitter.svg │ │ ├── webpack.svg │ │ ├── gatsby.svg │ │ ├── github.svg │ │ ├── redux.svg │ │ ├── algolia.svg │ │ ├── material-ui.svg │ │ ├── graphql.svg │ │ ├── jss.svg │ │ ├── algolia-full.svg │ │ ├── react.svg │ │ └── search-by-algolia.svg ├── pages │ ├── 404.js │ ├── contact.js │ ├── search.js │ ├── category.js │ └── index.js ├── utils │ ├── helpers.js │ └── algolia.js ├── templates │ ├── PageTemplate.js │ ├── PostTemplate.js │ └── CategoryTemplate.js ├── html.js ├── theme │ └── theme.yaml └── layouts │ └── index.js ├── .prettierrc ├── logo.png ├── content ├── pages │ ├── success │ │ └── index.md │ ├── 2--starters │ │ ├── gatsby-starter-personal-blog.png │ │ ├── gatsby-starter-simple-landing.png │ │ └── index.md │ ├── 3--front-end-dev │ │ └── index.md │ ├── 4--privacy │ │ └── index.md │ ├── 5--terms │ │ └── index.md │ └── 1--about │ │ └── index.md ├── posts │ ├── draft-post │ │ ├── photo-1490474418585-ba9bad8fd0ea.jpg │ │ └── index.md │ ├── 2017-10-03--be-who-you-are │ │ ├── photo-1489824904134-891ab64532f1.jpg │ │ └── index.md │ ├── 2017-10-09--i-am-so-clever │ │ ├── photo-1507124484497-b7f446e65519.jpg │ │ └── index.md │ ├── 2017-10-15--good-friends │ │ ├── photo-1500531279542-fc8490c8ea4d.jpg │ │ └── index.md │ ├── 2017-10-21--like-nonsense │ │ ├── photo-1465070845512-2b2dbdc6df66.jpg │ │ ├── 33893097-e5a70c34-df5a-11e7-8f5e-40e057626770.png │ │ └── index.md │ ├── 2017-10-05--you-only-live-once │ │ ├── photo-1456518563096-0ff5ee08204e.jpg │ │ └── index.md │ ├── 2017-10-07--people-will-forget │ │ ├── photo-1489900464632-5f5907edda24.jpg │ │ └── index.md │ ├── 2017-10-13--there-are-only-two │ │ ├── photo-1451324119451-db0ac857463c.jpg │ │ └── index.md │ ├── 2017-10-17--i-have-not-failed │ │ ├── photo-1463852247062-1bbca38f7805.jpg │ │ └── index.md │ ├── 2017-10-19--i-may-not-have-gone │ │ ├── photo-1507915600431-5292809c5ab7.jpg │ │ └── index.md │ ├── 2017-10-01--two-things-are-infinite │ │ ├── photo-1490474418585-ba9bad8fd0ea.jpg │ │ └── index.md │ └── 2017-10-11--imperfection-is-beauty │ │ ├── photo-1469461084727-4bfb496cf55a.jpg │ │ └── index.md ├── parts │ ├── author.md │ └── footnote.md └── meta │ └── config.js ├── gatsby-browser.js ├── .editorconfig ├── postcss.config.js ├── LICENSE ├── .gitignore ├── .eslintrc.json ├── scripts └── generate-app-icons.sh ├── CODE_OF_CONDUCT.md ├── package.json ├── gatsby-node.js ├── README.md └── gatsby-config.js /static/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | public/* 2 | static/* 3 | .cache/* -------------------------------------------------------------------------------- /src/components/Blog/index.js: -------------------------------------------------------------------------------- 1 | export { default } from "./Blog"; 2 | -------------------------------------------------------------------------------- /src/components/Hero/index.js: -------------------------------------------------------------------------------- 1 | export { default } from "./Hero"; 2 | -------------------------------------------------------------------------------- /src/components/List/index.js: -------------------------------------------------------------------------------- 1 | export { default } from "./List"; 2 | -------------------------------------------------------------------------------- /src/components/Menu/index.js: -------------------------------------------------------------------------------- 1 | export { default } from "./Menu"; 2 | -------------------------------------------------------------------------------- /src/components/Page/index.js: -------------------------------------------------------------------------------- 1 | export { default } from "./Page"; 2 | -------------------------------------------------------------------------------- /src/components/Post/index.js: -------------------------------------------------------------------------------- 1 | export { default } from "./Post"; 2 | -------------------------------------------------------------------------------- /src/components/Seo/index.js: -------------------------------------------------------------------------------- 1 | export { default } from "./Seo"; 2 | -------------------------------------------------------------------------------- /src/components/Article/index.js: -------------------------------------------------------------------------------- 1 | export { default } from "./Article"; 2 | -------------------------------------------------------------------------------- /src/components/Contact/index.js: -------------------------------------------------------------------------------- 1 | export { default } from "./Contact"; 2 | -------------------------------------------------------------------------------- /src/components/Footer/index.js: -------------------------------------------------------------------------------- 1 | export { default } from "./Footer"; 2 | -------------------------------------------------------------------------------- /src/components/Header/index.js: -------------------------------------------------------------------------------- 1 | export { default } from "./Header"; 2 | -------------------------------------------------------------------------------- /src/components/Search/index.js: -------------------------------------------------------------------------------- 1 | export { default } from "./Search"; 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "singleQuote": false 4 | } 5 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/logo.png -------------------------------------------------------------------------------- /src/components/AsyncComponent/index.js: -------------------------------------------------------------------------------- 1 | export { default } from "./AsyncComponent"; 2 | -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/favicon.ico -------------------------------------------------------------------------------- /static/preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/preview.jpg -------------------------------------------------------------------------------- /src/images/jpg/avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/src/images/jpg/avatar.jpg -------------------------------------------------------------------------------- /static/icons/icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/icon-48x48.png -------------------------------------------------------------------------------- /static/icons/icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/icon-96x96.png -------------------------------------------------------------------------------- /src/images/app-icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/src/images/app-icons/icon.png -------------------------------------------------------------------------------- /static/icons/icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/icon-144x144.png -------------------------------------------------------------------------------- /static/icons/icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/icon-192x192.png -------------------------------------------------------------------------------- /static/icons/icon-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/icon-256x256.png -------------------------------------------------------------------------------- /static/icons/icon-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/icon-384x384.png -------------------------------------------------------------------------------- /static/icons/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/icon-512x512.png -------------------------------------------------------------------------------- /static/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/favicon-16x16.png -------------------------------------------------------------------------------- /static/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/favicon-32x32.png -------------------------------------------------------------------------------- /static/icons/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/favicon-96x96.png -------------------------------------------------------------------------------- /src/images/png/hero-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/src/images/png/hero-background.png -------------------------------------------------------------------------------- /static/icons/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/apple-icon-57x57.png -------------------------------------------------------------------------------- /static/icons/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/apple-icon-60x60.png -------------------------------------------------------------------------------- /static/icons/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/apple-icon-72x72.png -------------------------------------------------------------------------------- /static/icons/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/apple-icon-76x76.png -------------------------------------------------------------------------------- /src/images/app-icons/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/src/images/app-icons/apple-icon.png -------------------------------------------------------------------------------- /static/icons/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/apple-icon-114x114.png -------------------------------------------------------------------------------- /static/icons/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/apple-icon-120x120.png -------------------------------------------------------------------------------- /static/icons/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/apple-icon-144x144.png -------------------------------------------------------------------------------- /static/icons/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/apple-icon-152x152.png -------------------------------------------------------------------------------- /static/icons/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/icons/apple-icon-180x180.png -------------------------------------------------------------------------------- /content/pages/success/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Success 3 | --- 4 | 5 | Thank you.
6 | I will answer to your message as soon as possible. 7 | -------------------------------------------------------------------------------- /static/screens/gatsby-starter-hero-blog.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/static/screens/gatsby-starter-hero-blog.gif -------------------------------------------------------------------------------- /content/pages/2--starters/gatsby-starter-personal-blog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/pages/2--starters/gatsby-starter-personal-blog.png -------------------------------------------------------------------------------- /content/pages/2--starters/gatsby-starter-simple-landing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/pages/2--starters/gatsby-starter-simple-landing.png -------------------------------------------------------------------------------- /content/posts/draft-post/photo-1490474418585-ba9bad8fd0ea.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/posts/draft-post/photo-1490474418585-ba9bad8fd0ea.jpg -------------------------------------------------------------------------------- /gatsby-browser.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Implement Gatsby's Browser APIs in this file. 3 | * 4 | * See: https://www.gatsbyjs.org/docs/browser-apis/ 5 | */ 6 | 7 | // You can delete this file if you're not using it -------------------------------------------------------------------------------- /content/posts/2017-10-03--be-who-you-are/photo-1489824904134-891ab64532f1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/posts/2017-10-03--be-who-you-are/photo-1489824904134-891ab64532f1.jpg -------------------------------------------------------------------------------- /content/posts/2017-10-09--i-am-so-clever/photo-1507124484497-b7f446e65519.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/posts/2017-10-09--i-am-so-clever/photo-1507124484497-b7f446e65519.jpg -------------------------------------------------------------------------------- /content/posts/2017-10-15--good-friends/photo-1500531279542-fc8490c8ea4d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/posts/2017-10-15--good-friends/photo-1500531279542-fc8490c8ea4d.jpg -------------------------------------------------------------------------------- /content/posts/2017-10-21--like-nonsense/photo-1465070845512-2b2dbdc6df66.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/posts/2017-10-21--like-nonsense/photo-1465070845512-2b2dbdc6df66.jpg -------------------------------------------------------------------------------- /content/posts/2017-10-05--you-only-live-once/photo-1456518563096-0ff5ee08204e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/posts/2017-10-05--you-only-live-once/photo-1456518563096-0ff5ee08204e.jpg -------------------------------------------------------------------------------- /content/posts/2017-10-07--people-will-forget/photo-1489900464632-5f5907edda24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/posts/2017-10-07--people-will-forget/photo-1489900464632-5f5907edda24.jpg -------------------------------------------------------------------------------- /content/posts/2017-10-13--there-are-only-two/photo-1451324119451-db0ac857463c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/posts/2017-10-13--there-are-only-two/photo-1451324119451-db0ac857463c.jpg -------------------------------------------------------------------------------- /content/posts/2017-10-17--i-have-not-failed/photo-1463852247062-1bbca38f7805.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/posts/2017-10-17--i-have-not-failed/photo-1463852247062-1bbca38f7805.jpg -------------------------------------------------------------------------------- /content/posts/2017-10-19--i-may-not-have-gone/photo-1507915600431-5292809c5ab7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/posts/2017-10-19--i-may-not-have-gone/photo-1507915600431-5292809c5ab7.jpg -------------------------------------------------------------------------------- /content/posts/2017-10-01--two-things-are-infinite/photo-1490474418585-ba9bad8fd0ea.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/posts/2017-10-01--two-things-are-infinite/photo-1490474418585-ba9bad8fd0ea.jpg -------------------------------------------------------------------------------- /content/posts/2017-10-11--imperfection-is-beauty/photo-1469461084727-4bfb496cf55a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/posts/2017-10-11--imperfection-is-beauty/photo-1469461084727-4bfb496cf55a.jpg -------------------------------------------------------------------------------- /content/posts/2017-10-21--like-nonsense/33893097-e5a70c34-df5a-11e7-8f5e-40e057626770.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stackblitz/template-gatsby/master/content/posts/2017-10-21--like-nonsense/33893097-e5a70c34-df5a-11e7-8f5e-40e057626770.png -------------------------------------------------------------------------------- /src/pages/404.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const NotFoundPage = () => ( 4 |
5 |

NOT FOUND

6 |

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

7 |
8 | ); 9 | 10 | export default NotFoundPage; 11 | -------------------------------------------------------------------------------- /content/parts/author.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: author 3 | --- 4 | 5 | **Mr. Gatsby** Proin ornare ligula eu tellus tempus elementum. Aenean [bibendum](/) iaculis mi, nec blandit lacus interdum vitae. Vestibulum non nibh risus, a scelerisque purus. Blandit lacus interdum vitae. Vestibulum non nibh risus, a scelerisque purus. 6 | -------------------------------------------------------------------------------- /src/images/svg-icons/facebook.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/images/svg-icons/email.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | 9 | # Change these settings to your own preference 10 | indent_style = space 11 | indent_size = 2 12 | 13 | # We recommend you to keep these unchanged 14 | end_of_line = lf 15 | charset = utf-8 16 | trim_trailing_whitespace = true 17 | insert_final_newline = true 18 | -------------------------------------------------------------------------------- /content/parts/footnote.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: footnote 3 | --- 4 | 5 | * it's a demo site of the [gatsby-starter-hero-blog](https://github.com/greglobinski/gatsby-starter-hero-blog) 6 | * built by [greg lobinski](https://www.greglobinski.com) 7 | * Check [Front-end web development with Greg](https://dev.greglobinski.com) 8 | * delivered by [Netlify](https://www.netlify.com/) 9 | * photos by [unsplash.com](https://unsplash.com) 10 | * graphic by [pixabay.com](https://pixabay.com) 11 | -------------------------------------------------------------------------------- /src/images/svg-icons/twitter.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /static/_headers: -------------------------------------------------------------------------------- 1 | ## Created with gatsby-plugin-netlify 2 | 3 | /* 4 | X-Frame-Options: DENY 5 | X-XSS-Protection: 1; mode=block 6 | X-Content-Type-Options: nosniff 7 | / 8 | # Cache-Control: public, max-age=0, must-revalidate 9 | /*.js 10 | # Cache-Control: public, max-age=31536000, stale-while-revalidate=2592000 11 | /static/* 12 | Cache-Control: public, max-age=31536000, stale-while-revalidate=2592000 13 | /favicon.ico 14 | # Cache-Control: public, max-age=31536000, stale-while-revalidate=2592000 15 | /icons/* 16 | # Cache-Control: public, max-age=31536000, stale-while-revalidate=2592000 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/utils/helpers.js: -------------------------------------------------------------------------------- 1 | export function getScreenWidth() { 2 | if (typeof window !== `undefined`) { 3 | return window.innerWidth; 4 | } 5 | } 6 | 7 | export function isWideScreen() { 8 | if (typeof window !== `undefined`) { 9 | const windowWidth = window.innerWidth; 10 | const mediaQueryL = 1024; 11 | 12 | return windowWidth >= mediaQueryL; 13 | } 14 | } 15 | 16 | export function timeoutThrottlerHandler(timeouts, name, delay, handler) { 17 | if (!timeouts[name]) { 18 | timeouts[name] = setTimeout(() => { 19 | timeouts[name] = null; 20 | handler(); 21 | }, delay); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/images/svg-icons/webpack.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /content/pages/3--front-end-dev/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Front-end web development with Greg 3 | menuTitle: With Greg 4 | --- 5 | 6 | [Front-end web development with Greg](https://dev.greglobinski.com) is a blog I have just launched. 7 | 8 | It will be a home for all instruction and tutorial articles relating to my GatsbyJS starters. The dominant subject areas will be of course GatsbyJS but also ReactJS, EcmaScript 2015+ and CSS in JS. 9 | 10 | If you want to be informed about new content on the blog follow me on Twitter - [@greglobinski](https://twitter.com/greglobinski). 11 | 12 | Are you thinking about a particular subject, relating to the starters, I could write about? Tweet me. 13 | -------------------------------------------------------------------------------- /src/images/svg-icons/gatsby.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = ctx => ({ 2 | plugins: { 3 | "postcss-easy-media-query": { 4 | breakpoints: { 5 | tablet: 600, 6 | desktop: 1024 7 | } 8 | }, 9 | "postcss-text-remove-gap": { 10 | defaultFontFamily: "Open Sans", 11 | defaultLineHeight: "0" 12 | }, 13 | "postcss-nested": {}, 14 | "postcss-cssnext": {} 15 | } 16 | }); 17 | 18 | // "postcss-nested": {}, 19 | // "postcss-sorting": { 20 | // order: ["custom-properties", "dollar-variables", "declarations", "at-rules", "rules"], 21 | // "properties-order": "alphabetical", 22 | // "unspecified-properties-position": "bottom" 23 | // }, 24 | // "postcss-utilities": {}, 25 | // "postcss-cssnext": {} 26 | -------------------------------------------------------------------------------- /src/components/AsyncComponent/AsyncComponent.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | function asyncComponent(getComponent, loadingComponent) { 4 | return class AsyncComponent extends React.Component { 5 | state = { component: null }; 6 | 7 | componentDidMount() { 8 | if (!this.state.component) { 9 | getComponent().then(component => { 10 | this.setState({ component }); 11 | }); 12 | } 13 | } 14 | render() { 15 | const { component: Comp } = this.state; 16 | if (Comp) { 17 | return ; 18 | } 19 | return loadingComponent ? loadingComponent :
Loading...
; 20 | } 21 | }; 22 | } 23 | 24 | export default asyncComponent; 25 | -------------------------------------------------------------------------------- /src/components/Page/Page.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | import Headline from "../Article/Headline"; 5 | import Bodytext from "../Article/Bodytext"; 6 | 7 | const Page = props => { 8 | const { 9 | page: { 10 | html, 11 | frontmatter: { title } 12 | }, 13 | theme 14 | } = props; 15 | 16 | return ( 17 | 18 |
19 | 20 |
21 | 22 |
23 | ); 24 | }; 25 | 26 | Page.propTypes = { 27 | page: PropTypes.object.isRequired, 28 | theme: PropTypes.object.isRequired 29 | }; 30 | 31 | export default Page; 32 | -------------------------------------------------------------------------------- /src/images/svg-icons/github.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /content/pages/2--starters/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Other GatsbyJS starters 3 | menuTitle: Starters 4 | --- 5 | 6 | **HeroBlog** is not my first [GatsbyJS](https://www.gatsbyjs.org/) starter. 7 | 8 | ### PersonalBlog 9 | 10 | ![PersonalBlog](./gatsby-starter-personal-blog.png) 11 | 12 | A ready to use, easy to customize Gatsby starter with 'like app' layout transitions. [Demo](https://gatsby-starter-personal-blog.greglobinski.com/) | [Github repo](https://github.com/greglobinski/gatsby-starter-personal-blog) 13 | 14 | ### SimpleLanding 15 | 16 | ![SimpleLanding](./gatsby-starter-simple-landing.png) 17 | 18 | As the name says, it is a simple landing page starter. 19 | [Demo](https://gatsby-starter-simple-landing.greglobinski.com/) | [Github repo](https://github.com/greglobinski/gatsby-starter-simple-landing) 20 | -------------------------------------------------------------------------------- /src/utils/algolia.js: -------------------------------------------------------------------------------- 1 | module.exports = function(chunksTotal, { node }) { 2 | const { 3 | fields: { slug }, 4 | frontmatter: { title }, 5 | internal: { content } 6 | } = node; 7 | 8 | const noEmojiContent = content.replace(//g, ""); 9 | 10 | const contentChunks = chunkString(noEmojiContent, 5000); 11 | const record = { title, slug, content }; 12 | const recordChunks = contentChunks.reduce((recordChunksTotal, contentChunksItem, idx) => { 13 | return [ 14 | ...recordChunksTotal, 15 | { ...record, ...{ content: contentChunksItem }, objectID: `${slug}${idx}` } 16 | ]; 17 | }, []); 18 | 19 | return [...chunksTotal, ...recordChunks]; 20 | }; 21 | 22 | function chunkString(str, length) { 23 | return str.match(new RegExp("(.|[\r\n]){1," + length + "}", "g")); 24 | } 25 | -------------------------------------------------------------------------------- /src/components/Search/Hit.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { Link } from "gatsby"; 4 | 5 | const Hit = props => { 6 | const { hit } = props; 7 | 8 | return ( 9 | 10 | {hit.title} 11 | 12 | {/* --- STYLES --- */} 13 | 30 | 31 | ); 32 | }; 33 | 34 | Hit.propTypes = { 35 | hit: PropTypes.object.isRequired 36 | }; 37 | 38 | export default Hit; 39 | -------------------------------------------------------------------------------- /content/pages/4--privacy/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Privacy Policy 3 | --- 4 | 5 | Rviverra sodales ipsum gravida nec. Integer gravida nisi ut magna mollis molestie. Nullam pharetra accumsan sagittis. Proin tristique rhoncus orci, eget vulputate nisi sollicitudin et. Quisque lacus augue, mollis non mollis et, ullamcorper in purus. Morbi et sem orci. 6 | 7 | Praesent accumsan odio in ante ullamcorper id pellentesque mauris rhoncus. Duis vitae neque dolor. Duis sed purus at eros bibendum cursus nec a nulla. Donec turpis quam, ultricies id pretium sit amet, gravida eget leo. 8 | 9 | Fusce a metus eu diam varius congue nec nec sapien. Nunc convallis accumsan justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec malesuada vehicula lectus, viverra sodales ipsum gravida nec. Integer gravida nisi ut magna mollis molestie. Nullam pharetra accumsan sagittis. Proin tristique rhoncus orci, eget vulputate nisi sollicitudin et. Quisque lacus augue, mollis non mollis et, ullamcorper in purus. Morbi et sem orci. 10 | -------------------------------------------------------------------------------- /src/components/Post/Comments.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import FacebookProvider, { Comments as FBComments } from "react-facebook"; 4 | 5 | import config from "../../../content/meta/config"; 6 | 7 | const Comments = props => { 8 | const { facebook, slug, theme } = props; 9 | 10 | return ( 11 | 12 |
13 | 14 | 15 | 16 |
17 | 18 | {/* --- STYLES --- */} 19 | 24 |
25 | ); 26 | }; 27 | 28 | Comments.propTypes = { 29 | slug: PropTypes.string.isRequired, 30 | facebook: PropTypes.object.isRequired, 31 | theme: PropTypes.object.isRequired 32 | }; 33 | 34 | export default Comments; 35 | -------------------------------------------------------------------------------- /content/pages/5--terms/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Terms and Conditions 3 | --- 4 | 5 | Fusce a metus eu diam varius congue nec nec sapien. Nunc convallis accumsan justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec malesuada vehicula lectus, viverra sodales ipsum gravida nec. Integer gravida nisi ut magna mollis molestie. Nullam pharetra accumsan sagittis. Proin tristique rhoncus orci, eget vulputate nisi sollicitudin et. Quisque lacus augue, mollis non mollis et, ullamcorper in purus. Morbi et sem orci. 6 | 7 | Rviverra sodales ipsum gravida nec. Integer gravida nisi ut magna mollis molestie. Nullam pharetra accumsan sagittis. Proin tristique rhoncus orci, eget vulputate nisi sollicitudin et. Quisque lacus augue, mollis non mollis et, ullamcorper in purus. Morbi et sem orci. 8 | 9 | Praesent accumsan odio in ante ullamcorper id pellentesque mauris rhoncus. Duis vitae neque dolor. Duis sed purus at eros bibendum cursus nec a nulla. Donec turpis quam, ultricies id pretium sit amet, gravida eget leo. 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 greglobinski 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /src/images/svg-icons/redux.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /content/pages/1--about/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: About 3 | --- 4 | 5 | This is a demo site of the [HeroBlog](https://github.com/greglobinski/gatsby-starter-hero-blog), a [GatsbyJS](https://www.gatsbyjs.org/) starter. 6 | 7 | ### Features: 8 | 9 | * Easy editable content in **Markdown** files (posts, pages and parts) 10 | * **CSS** with `styled-jsx` and `PostCSS` 11 | * **SEO** (sitemap generation, robot.txt, meta and OpenGraph Tags) 12 | * **Social** sharing (Twitter, Facebook, Google, LinkedIn) 13 | * **Comments** (Facebook) 14 | * **Images** lazy loading and `webp` support (gatsby-image) 15 | * Post **categories** (category based post list) 16 | * Full text **searching** (Algolia) 17 | * **Contact** form (Netlify form handling) 18 | * **RSS** feed 19 | * 100% **PWA** (manifest.webmanifest, offline support, favicons) 20 | * Google **Analytics** 21 | * App **favicons** generator (node script) 22 | * Easy customizable base **styles** via `theme` object generated from `yaml` file (fonts, colors, sizes) 23 | * React **v.16** (gatsby-plugin-react-next) 24 | * **Components** lazy loading (social sharing) 25 | * **ESLint** (google config) 26 | * **Prettier** code styling 27 | * Webpack `BundleAnalyzerPlugin` 28 | -------------------------------------------------------------------------------- /src/components/Article/Article.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | const Article = props => { 5 | const { children, theme } = props; 6 | 7 | return ( 8 | 9 |
{children}
10 | 11 | {/* --- STYLES --- */} 12 | 32 |
33 | ); 34 | }; 35 | 36 | Article.propTypes = { 37 | children: PropTypes.node.isRequired, 38 | theme: PropTypes.object.isRequired 39 | }; 40 | 41 | export default Article; 42 | -------------------------------------------------------------------------------- /src/images/svg-icons/algolia.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/components/List/List.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { Link } from "gatsby"; 4 | 5 | const List = props => { 6 | const { edges, theme } = props; 7 | 8 | return ( 9 | 10 | 26 | 27 | {/* --- STYLES --- */} 28 | 40 | 41 | ); 42 | }; 43 | 44 | List.propTypes = { 45 | edges: PropTypes.array.isRequired, 46 | theme: PropTypes.object.isRequired 47 | }; 48 | 49 | export default List; 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | .cache/ 61 | .DS_Store 62 | public/ 63 | yarn-error.log 64 | 65 | # editors 66 | .idea/ 67 | .vscode 68 | 69 | # other 70 | report/ 71 | -------------------------------------------------------------------------------- /src/images/svg-icons/material-ui.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/images/svg-icons/graphql.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pages/contact.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { graphql } from "gatsby"; 4 | import { ThemeContext } from "../layouts"; 5 | import Article from "../components/Article"; 6 | import Contact from "../components/Contact"; 7 | import Headline from "../components/Article/Headline"; 8 | import Seo from "../components/Seo"; 9 | 10 | const ContactPage = props => { 11 | const { 12 | data: { 13 | site: { 14 | siteMetadata: { facebook } 15 | } 16 | } 17 | } = props; 18 | 19 | return ( 20 | 21 | 22 | {theme => ( 23 |
24 |
25 | 26 |
27 | 28 |
29 | )} 30 |
31 | 32 | 33 |
34 | ); 35 | }; 36 | 37 | ContactPage.propTypes = { 38 | data: PropTypes.object.isRequired 39 | }; 40 | 41 | export default ContactPage; 42 | 43 | //eslint-disable-next-line no-undef 44 | export const query = graphql` 45 | query ContactQuery { 46 | site { 47 | siteMetadata { 48 | facebook { 49 | appId 50 | } 51 | } 52 | } 53 | } 54 | `; 55 | -------------------------------------------------------------------------------- /src/templates/PageTemplate.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { graphql } from "gatsby"; 4 | import Seo from "../components/Seo"; 5 | import Article from "../components/Article"; 6 | import Page from "../components/Page"; 7 | import { ThemeContext } from "../layouts"; 8 | 9 | const PageTemplate = props => { 10 | const { 11 | data: { 12 | page, 13 | site: { 14 | siteMetadata: { facebook } 15 | } 16 | } 17 | } = props; 18 | 19 | return ( 20 | 21 | 22 | {theme => ( 23 |
24 | 25 |
26 | )} 27 |
28 | 29 | 30 |
31 | ); 32 | }; 33 | 34 | PageTemplate.propTypes = { 35 | data: PropTypes.object.isRequired 36 | }; 37 | 38 | export default PageTemplate; 39 | 40 | //eslint-disable-next-line no-undef 41 | export const pageQuery = graphql` 42 | query PageByPath($slug: String!) { 43 | page: markdownRemark(fields: { slug: { eq: $slug } }) { 44 | id 45 | html 46 | frontmatter { 47 | title 48 | } 49 | } 50 | site { 51 | siteMetadata { 52 | facebook { 53 | appId 54 | } 55 | } 56 | } 57 | } 58 | `; 59 | -------------------------------------------------------------------------------- /src/images/svg-icons/jss.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "babel-eslint", 3 | "extends": [ 4 | "google", 5 | "prettier", 6 | "prettier/react", 7 | "eslint:recommended", 8 | "plugin:react/recommended" 9 | ], 10 | "parserOptions": { 11 | "ecmaVersion": 2016, 12 | "sourceType": "module", 13 | "ecmaFeatures": { 14 | "jsx": true 15 | } 16 | }, 17 | "plugins": ["prettier", "react", "jsx-a11y", "import", "graphql"], 18 | "env": { 19 | "browser": true, 20 | "es6": true, 21 | "node": true 22 | }, 23 | "rules": { 24 | "arrow-body-style": "off", 25 | "camelcase": "warn", 26 | "func-names": "off", 27 | "global-require": "warn", 28 | "import/no-dynamic-require": "warn", 29 | "import/no-extraneous-dependencies": "off", 30 | "no-console": "off", 31 | "no-multi-assign": "off", 32 | "no-param-reassign": "warn", 33 | "no-plusplus": "off", 34 | "no-shadow": "warn", 35 | "no-underscore-dangle": "warn", 36 | "no-unused-expressions": ["error", { "allowShortCircuit": true, "allowTernary": true }], 37 | "no-nested-ternary": "off", 38 | "no-unused-vars": "warn", 39 | "prefer-destructuring": "off", 40 | "prettier/prettier": ["error"], 41 | "react/jsx-uses-vars": "error" 42 | }, 43 | "overrides": [ 44 | { 45 | "files": ["*.spec.js", "*.integration.js"], 46 | "rules": { 47 | "no-unused-expressions": "off" 48 | } 49 | } 50 | ] 51 | } 52 | -------------------------------------------------------------------------------- /content/meta/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | siteTitle: "HeroBlog - a GatsbyJS starter", // 3 | shortSiteTitle: "HeroBlog - GatsbyJS starter", // <title> ending for posts and pages 4 | siteDescription: "HeroBlog is a GatsbyJS starter.", 5 | siteUrl: "https://gatsby-starter-hero-blog.greglobinski.com", 6 | // pathPrefix: "", 7 | siteImage: "preview.jpg", 8 | siteLanguage: "en", 9 | 10 | /* author */ 11 | authorName: "greg lobinski", 12 | authorTwitterAccount: "greglobinski", 13 | 14 | /* info */ 15 | headerTitle: "greg lobinski", 16 | headerSubTitle: "presents another one GatsbyJS starter", 17 | 18 | /* manifest.json */ 19 | manifestName: "HeroBlog - a GatsbyJS starter", 20 | manifestShortName: "HeroBlog", // max 12 characters 21 | manifestStartUrl: "/index.html", 22 | manifestBackgroundColor: "white", 23 | manifestThemeColor: "#666", 24 | manifestDisplay: "standalone", 25 | 26 | // gravatar 27 | // Use your Gravatar image. If empty then will use src/images/jpg/avatar.jpg 28 | // Replace your email adress with md5-code. 29 | // Example https://www.gravatar.com/avatar/g.strainovic@gmail.com -> 30 | // gravatarImgMd5: "https://www.gravatar.com/avatar/1db853e4df386e8f699e4b35505dd8c6", 31 | gravatarImgMd5: "", 32 | 33 | // social 34 | authorSocialLinks: [ 35 | { name: "github", url: "https://github.com/greglobinski" }, 36 | { name: "twitter", url: "https://twitter.com/greglobinski" }, 37 | { name: "facebook", url: "http://facebook.com/greglobinski" } 38 | ] 39 | }; 40 | -------------------------------------------------------------------------------- /src/components/Blog/Blog.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | 4 | import Item from "./Item"; 5 | 6 | const Blog = props => { 7 | const { posts, theme } = props; 8 | 9 | return ( 10 | <React.Fragment> 11 | <main className="main"> 12 | <ul> 13 | {posts.map(post => { 14 | const { 15 | node, 16 | node: { 17 | fields: { slug } 18 | } 19 | } = post; 20 | return <Item key={slug} post={node} theme={theme} />; 21 | })} 22 | </ul> 23 | </main> 24 | 25 | {/* --- STYLES --- */} 26 | <style jsx>{` 27 | .main { 28 | padding: 0 ${theme.space.inset.default}; 29 | } 30 | 31 | ul { 32 | list-style: none; 33 | margin: 0 auto; 34 | padding: ${`calc(${theme.space.default} * 1.5) 0 calc(${theme.space.default} * 0.5)`}; 35 | } 36 | 37 | @above tablet { 38 | .main { 39 | padding: 0 ${`0 calc(${theme.space.default} * 1.5)`}; 40 | } 41 | ul { 42 | max-width: ${theme.text.maxWidth.tablet}; 43 | } 44 | } 45 | @above desktop { 46 | ul { 47 | max-width: ${theme.text.maxWidth.desktop}; 48 | } 49 | } 50 | `}</style> 51 | </React.Fragment> 52 | ); 53 | }; 54 | 55 | Blog.propTypes = { 56 | posts: PropTypes.array.isRequired, 57 | theme: PropTypes.object.isRequired 58 | }; 59 | 60 | export default Blog; 61 | -------------------------------------------------------------------------------- /src/components/Footer/Footer.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | const Footer = props => { 5 | const { html, theme } = props; 6 | 7 | return ( 8 | <React.Fragment> 9 | <footer className="footer" dangerouslySetInnerHTML={{ __html: html }} /> 10 | 11 | {/* --- STYLES --- */} 12 | <style jsx>{` 13 | .footer { 14 | background: ${theme.color.neutral.white}; 15 | padding: ${theme.space.inset.default}; 16 | padding-top: 0; 17 | padding-bottom: 120px; 18 | 19 | :global(ul) { 20 | list-style: none; 21 | text-align: center; 22 | padding: 0; 23 | 24 | :global(li) { 25 | color: ${theme.color.neutral.gray.g}; 26 | font-size: ${theme.font.size.xxs}; 27 | padding: ${theme.space.xxs} ${theme.space.s}; 28 | position: relative; 29 | display: inline-block; 30 | 31 | &::after { 32 | content: "•"; 33 | position: absolute; 34 | right: ${`calc(${theme.space.xs} * -1)`}; 35 | } 36 | &:last-child::after { 37 | content: ""; 38 | } 39 | } 40 | } 41 | } 42 | 43 | @from-width desktop { 44 | .footer { 45 | padding: 0 1em 1.5em; 46 | } 47 | } 48 | `}</style> 49 | </React.Fragment> 50 | ); 51 | }; 52 | 53 | Footer.propTypes = { 54 | html: PropTypes.string, 55 | theme: PropTypes.object.isRequired 56 | }; 57 | 58 | export default Footer; 59 | -------------------------------------------------------------------------------- /src/components/Article/Headline.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | const Headline = props => { 5 | const { title, children, theme } = props; 6 | 7 | return ( 8 | <React.Fragment> 9 | {title ? <h1>{title}</h1> : <h1>{children}</h1>} 10 | 11 | {/* --- STYLES --- */} 12 | <style jsx>{` 13 | h1 { 14 | font-size: ${theme.font.size.xxl}; 15 | margin: ${theme.space.stack.l}; 16 | animation-name: headlineEntry; 17 | animation-duration: ${theme.time.duration.long}; 18 | 19 | :global(span) { 20 | font-weight: ${theme.font.weight.standard}; 21 | display: block; 22 | font-size: 0.5em; 23 | letter-spacing: 0; 24 | margin: ${theme.space.stack.xs}; 25 | } 26 | 27 | :global(svg) { 28 | height: 0.75em; 29 | fill: ${theme.color.brand.primary}; 30 | } 31 | } 32 | 33 | @keyframes headlineEntry { 34 | from { 35 | opacity: 0.5; 36 | } 37 | to { 38 | opacity: 1; 39 | } 40 | } 41 | 42 | @from-width tablet { 43 | h1 { 44 | font-size: ${`calc(${theme.font.size.xl} * 1.2)`}; 45 | } 46 | } 47 | 48 | @from-width desktop { 49 | h1 { 50 | font-size: ${`calc(${theme.font.size.xl} * 1.4)`}; 51 | } 52 | } 53 | `}</style> 54 | </React.Fragment> 55 | ); 56 | }; 57 | 58 | Headline.propTypes = { 59 | title: PropTypes.string, 60 | children: PropTypes.node, 61 | theme: PropTypes.object.isRequired 62 | }; 63 | 64 | export default Headline; 65 | -------------------------------------------------------------------------------- /src/components/Post/Post.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import "prismjs/themes/prism-okaidia.css"; 4 | 5 | import asyncComponent from "../AsyncComponent"; 6 | import Headline from "../Article/Headline"; 7 | import Bodytext from "../Article/Bodytext"; 8 | import Meta from "./Meta"; 9 | import Author from "./Author"; 10 | import Comments from "./Comments"; 11 | import NextPrev from "./NextPrev"; 12 | 13 | const Share = asyncComponent(() => 14 | import("./Share") 15 | .then(module => { 16 | return module.default; 17 | }) 18 | .catch(error => {}) 19 | ); 20 | 21 | const Post = props => { 22 | const { 23 | post, 24 | post: { 25 | html, 26 | fields: { prefix, slug }, 27 | frontmatter: { title, author, category } 28 | }, 29 | authornote, 30 | facebook, 31 | next: nextPost, 32 | prev: prevPost, 33 | theme 34 | } = props; 35 | 36 | return ( 37 | <React.Fragment> 38 | <header> 39 | <Headline title={title} theme={theme} /> 40 | <Meta prefix={prefix} author={author} category={category} theme={theme} /> 41 | </header> 42 | <Bodytext html={html} theme={theme} /> 43 | <footer> 44 | <Share post={post} theme={theme} /> 45 | <Author note={authornote} theme={theme} /> 46 | <NextPrev next={nextPost} prev={prevPost} theme={theme} /> 47 | <Comments slug={slug} facebook={facebook} theme={theme} /> 48 | </footer> 49 | </React.Fragment> 50 | ); 51 | }; 52 | 53 | Post.propTypes = { 54 | post: PropTypes.object.isRequired, 55 | authornote: PropTypes.string.isRequired, 56 | facebook: PropTypes.object.isRequired, 57 | next: PropTypes.object, 58 | prev: PropTypes.object, 59 | theme: PropTypes.object.isRequired 60 | }; 61 | 62 | export default Post; 63 | -------------------------------------------------------------------------------- /src/components/Post/Author.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | import config from "../../../content/meta/config"; 5 | import avatar from "../../images/jpg/avatar.jpg"; 6 | 7 | const Author = props => { 8 | const { note, theme } = props; 9 | 10 | return ( 11 | <React.Fragment> 12 | <div className="author"> 13 | <div className="avatar"> 14 | <img 15 | src={config.gravatarImgMd5 == "" ? avatar : config.gravatarImgMd5} 16 | alt={config.siteTitle} 17 | /> 18 | </div> 19 | <div className="note" dangerouslySetInnerHTML={{ __html: note }} /> 20 | </div> 21 | 22 | {/* --- STYLES --- */} 23 | <style jsx>{` 24 | .author { 25 | margin: ${theme.space.l} 0; 26 | padding: ${theme.space.l} 0; 27 | border-top: 1px solid ${theme.line.color}; 28 | border-bottom: 1px solid ${theme.line.color}; 29 | } 30 | .avatar { 31 | float: left; 32 | border-radius: 65% 75%; 33 | border: 1px solid ${theme.line.color}; 34 | display: inline-block; 35 | height: 50px; 36 | margin: 5px 20px 0 0; 37 | overflow: hidden; 38 | width: 50px; 39 | } 40 | .avatar img { 41 | width: 100%; 42 | } 43 | .note { 44 | font-size: 0.9em; 45 | line-height: 1.6; 46 | } 47 | @from-width tablet { 48 | .author { 49 | display: flex; 50 | } 51 | .avatar { 52 | flex: 0 0 auto; 53 | } 54 | } 55 | `}</style> 56 | </React.Fragment> 57 | ); 58 | }; 59 | 60 | Author.propTypes = { 61 | note: PropTypes.string.isRequired, 62 | theme: PropTypes.object.isRequired 63 | }; 64 | 65 | export default Author; 66 | -------------------------------------------------------------------------------- /src/components/Post/Meta.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { Link } from "gatsby"; 4 | 5 | import { FaCalendar } from "react-icons/fa/"; 6 | import { FaUser } from "react-icons/fa/"; 7 | import { FaTag } from "react-icons/fa/"; 8 | 9 | const Meta = props => { 10 | const { prefix, author: authorName, category, theme } = props; 11 | 12 | return ( 13 | <p className="meta"> 14 | <span> 15 | <FaCalendar size={18} /> {prefix} 16 | </span> 17 | <span> 18 | <FaUser size={18} /> {authorName} 19 | </span> 20 | {category && ( 21 | <span> 22 | <FaTag size={18} /> 23 | <Link to={`/category/${category.split(" ").join("-")}`}>{category}</Link> 24 | </span> 25 | )} 26 | 27 | {/* --- STYLES --- */} 28 | <style jsx>{` 29 | .meta { 30 | display: flex; 31 | flex-flow: row wrap; 32 | font-size: 0.8em; 33 | margin: ${theme.space.m} 0; 34 | background: transparent; 35 | 36 | :global(svg) { 37 | fill: ${theme.icon.color}; 38 | margin: ${theme.space.inline.xs}; 39 | } 40 | span { 41 | align-items: center; 42 | display: flex; 43 | text-transform: uppercase; 44 | margin: ${theme.space.xs} ${theme.space.s} ${theme.space.xs} 0; 45 | } 46 | } 47 | @from-width tablet { 48 | .meta { 49 | margin: ${`calc(${theme.space.m} * 1.5) 0 ${theme.space.m}`}; 50 | } 51 | } 52 | `}</style> 53 | </p> 54 | ); 55 | }; 56 | 57 | Meta.propTypes = { 58 | prefix: PropTypes.string.isRequired, 59 | author: PropTypes.string.isRequired, 60 | category: PropTypes.string, 61 | theme: PropTypes.object.isRequired 62 | }; 63 | 64 | export default Meta; 65 | -------------------------------------------------------------------------------- /src/pages/search.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { graphql } from "gatsby"; 4 | require("core-js/fn/array/find"); 5 | 6 | import Article from "../components/Article"; 7 | import Search from "../components/Search"; 8 | import { ThemeContext } from "../layouts"; 9 | import Seo from "../components/Seo"; 10 | 11 | import AlgoliaIcon from "!svg-react-loader!../images/svg-icons/search-by-algolia.svg?name=AlgoliaLogo"; 12 | 13 | const SearchPage = props => { 14 | const { 15 | data: { 16 | site: { 17 | siteMetadata: { algolia, facebook } 18 | } 19 | } 20 | } = props; 21 | 22 | return ( 23 | <React.Fragment> 24 | <ThemeContext.Consumer> 25 | {theme => ( 26 | <Article theme={theme}> 27 | <div className="icon"> 28 | <AlgoliaIcon /> 29 | </div> 30 | 31 | <Search algolia={algolia} theme={theme} /> 32 | </Article> 33 | )} 34 | </ThemeContext.Consumer> 35 | 36 | <Seo facebook={facebook} /> 37 | 38 | {/* --- STYLES --- */} 39 | <style jsx>{` 40 | .icon { 41 | display: flex; 42 | justify-content: flex-end; 43 | margin-bottom: 20px; 44 | } 45 | .icon :global(svg) { 46 | height: 30px; 47 | } 48 | `}</style> 49 | </React.Fragment> 50 | ); 51 | }; 52 | 53 | SearchPage.propTypes = { 54 | data: PropTypes.object.isRequired 55 | }; 56 | 57 | export default SearchPage; 58 | 59 | //eslint-disable-next-line no-undef 60 | export const query = graphql` 61 | query SearchQuery { 62 | site { 63 | siteMetadata { 64 | algolia { 65 | appId 66 | searchOnlyApiKey 67 | indexName 68 | } 69 | facebook { 70 | appId 71 | } 72 | } 73 | } 74 | } 75 | `; 76 | -------------------------------------------------------------------------------- /src/components/Seo/Seo.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import Helmet from "react-helmet"; 4 | import config from "../../../content/meta/config"; 5 | 6 | const Seo = props => { 7 | const { data, facebook } = props; 8 | const postTitle = ((data || {}).frontmatter || {}).title; 9 | const postDescription = ((data || {}).frontmatter || {}).description; 10 | const postCover = ((data || {}).frontmatter || {}).cover; 11 | const postSlug = ((data || {}).fields || {}).slug; 12 | 13 | const title = postTitle ? `${postTitle} - ${config.shortSiteTitle}` : config.siteTitle; 14 | const description = postDescription ? postDescription : config.siteDescription; 15 | const image = postCover ? postCover : config.siteImage; 16 | const url = config.siteUrl + config.pathPrefix + postSlug; 17 | 18 | return ( 19 | <Helmet 20 | htmlAttributes={{ 21 | lang: config.siteLanguage, 22 | prefix: "og: http://ogp.me/ns#" 23 | }} 24 | > 25 | {/* General tags */} 26 | <title>{title} 27 | 28 | {/* OpenGraph tags */} 29 | 30 | 31 | 32 | 33 | 34 | 35 | {/* Twitter Card tags */} 36 | 37 | 41 | 42 | ); 43 | }; 44 | 45 | Seo.propTypes = { 46 | data: PropTypes.object, 47 | facebook: PropTypes.object.isRequired 48 | }; 49 | 50 | export default Seo; 51 | -------------------------------------------------------------------------------- /scripts/generate-app-icons.sh: -------------------------------------------------------------------------------- 1 | #!bin/sh 2 | 3 | # Exit the script on any command with non 0 return code 4 | set -e 5 | 6 | npx sharp -i ./src/images/app-icons/icon.png -o ./static/icons/favicon-16x16.png resize 16 7 | npx sharp -i ./src/images/app-icons/icon.png -o ./static/icons/favicon-32x32.png resize 32 8 | npx sharp -i ./src/images/app-icons/icon.png -o ./static/icons/favicon-96x96.png resize 96 9 | npx sharp -i ./src/images/app-icons/icon.png -o ./static/icons/icon-512x512.png resize 512 10 | npx sharp -i ./src/images/app-icons/icon.png -o ./static/icons/icon-384x384.png resize 384 11 | npx sharp -i ./src/images/app-icons/icon.png -o ./static/icons/icon-256x256.png resize 256 12 | npx sharp -i ./src/images/app-icons/icon.png -o ./static/icons/icon-192x192.png resize 192 13 | npx sharp -i ./src/images/app-icons/icon.png -o ./static/icons/icon-144x144.png resize 144 14 | npx sharp -i ./src/images/app-icons/icon.png -o ./static/icons/icon-96x96.png resize 96 15 | npx sharp -i ./src/images/app-icons/icon.png -o ./static/icons/icon-48x48.png resize 48 16 | npx sharp -i ./src/images/app-icons/apple-icon.png -o ./static/icons/apple-icon-180x180.png resize 180 17 | npx sharp -i ./src/images/app-icons/apple-icon.png -o ./static/icons/apple-icon-152x152.png resize 152 18 | npx sharp -i ./src/images/app-icons/apple-icon.png -o ./static/icons/apple-icon-144x144.png resize 144 19 | npx sharp -i ./src/images/app-icons/apple-icon.png -o ./static/icons/apple-icon-120x120.png resize 120 20 | npx sharp -i ./src/images/app-icons/apple-icon.png -o ./static/icons/apple-icon-114x114.png resize 114 21 | npx sharp -i ./src/images/app-icons/apple-icon.png -o ./static/icons/apple-icon-76x76.png resize 76 22 | npx sharp -i ./src/images/app-icons/apple-icon.png -o ./static/icons/apple-icon-72x72.png resize 72 23 | npx sharp -i ./src/images/app-icons/apple-icon.png -o ./static/icons/apple-icon-60x60.png resize 60 24 | npx sharp -i ./src/images/app-icons/apple-icon.png -o ./static/icons/apple-icon-57x57.png resize 57 25 | -------------------------------------------------------------------------------- /src/templates/PostTemplate.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { graphql } from "gatsby"; 4 | require("prismjs/themes/prism-okaidia.css"); 5 | 6 | import Seo from "../components/Seo"; 7 | import Article from "../components/Article"; 8 | import Post from "../components/Post"; 9 | import { ThemeContext } from "../layouts"; 10 | 11 | const PostTemplate = props => { 12 | const { 13 | data: { 14 | post, 15 | authornote: { html: authorNote }, 16 | site: { 17 | siteMetadata: { facebook } 18 | } 19 | }, 20 | pageContext: { next, prev } 21 | } = props; 22 | 23 | return ( 24 | 25 | 26 | {theme => ( 27 |
28 | 36 |
37 | )} 38 |
39 | 40 | 41 |
42 | ); 43 | }; 44 | 45 | PostTemplate.propTypes = { 46 | data: PropTypes.object.isRequired, 47 | pageContext: PropTypes.object.isRequired 48 | }; 49 | 50 | export default PostTemplate; 51 | 52 | //eslint-disable-next-line no-undef 53 | export const postQuery = graphql` 54 | query PostBySlug($slug: String!) { 55 | post: markdownRemark(fields: { slug: { eq: $slug } }) { 56 | id 57 | html 58 | fields { 59 | slug 60 | prefix 61 | } 62 | frontmatter { 63 | title 64 | author 65 | category 66 | cover { 67 | childImageSharp { 68 | resize(width: 300) { 69 | src 70 | } 71 | } 72 | } 73 | } 74 | } 75 | authornote: markdownRemark(fileAbsolutePath: { regex: "/author/" }) { 76 | id 77 | html 78 | } 79 | site { 80 | siteMetadata { 81 | facebook { 82 | appId 83 | } 84 | } 85 | } 86 | } 87 | `; 88 | -------------------------------------------------------------------------------- /content/posts/2017-10-09--i-am-so-clever/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: I am so clever that sometimes I don't understand a single word of what I am saying 3 | category: "testimonies" 4 | cover: photo-1507124484497-b7f446e65519.jpg 5 | author: greg lobinski 6 | --- 7 | 8 | ![unsplash.com](./photo-1507124484497-b7f446e65519.jpg) 9 | 10 | [The Big Oxmox](http://google.com) advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn’t listen. She packed her seven versalia, put her initial into the belt and made herself on the way. 11 | 12 | Fusce a metus eu diam varius congue nec nec sapien. Nunc convallis accumsan justo. **Pellentesque** habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec malesuada vehicula lectus, viverra sodales ipsum gravida nec. 13 | 14 | _Integer gravida_ nisi ut magna mollis molestie. Nullam pharetra accumsan sagittis. Proin tristique rhoncus orci, eget vulputate nisi sollicitudin et. Quisque lacus augue, mollis non mollis et, ullamcorper in purus. Morbi et sem orci. 15 | 16 | ### Proin bibendum ullamcorper rutrum. 17 | 18 | Praesent accumsan odio in ante ullamcorper id pellentesque mauris rhoncus. Duis vitae neque dolor. Duis sed purus at eros bibendum cursus nec a nulla. Donec turpis quam, ultricies id pretium sit amet, gravida eget leo. 19 | 20 | Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim. Sed et felis metus, rhoncus ornare nibh. Ut at magna leo. Suspendisse egestas est ac dolor imperdiet pretium. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 21 | 22 | Nam porttitor, erat sit amet venenatis luctus, augue libero ultrices quam, ut congue nisi risus eu purus. Cras semper consectetur elementum. Nulla vel aliquet libero. Vestibulum eget felis nec purus commodo convallis. Aliquam erat volutpat. 23 | 24 | Proin suscipit luctus orci placerat fringilla. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 25 | -------------------------------------------------------------------------------- /content/posts/2017-10-07--people-will-forget/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: People will forget what you said, people will forget what you did 3 | category: "sayings" 4 | cover: photo-1489900464632-5f5907edda24.jpg 5 | author: greg lobinski 6 | --- 7 | 8 | Fusce a metus eu diam varius congue nec nec sapien. Nunc convallis accumsan justo. **Pellentesque** habitant morbi [tristique](http://google.com) senectus et netus et malesuada fames ac turpis egestas. Donec malesuada vehicula lectus, viverra sodales ipsum gravida nec. _Integer gravida_ nisi ut magna mollis molestie. Nullam pharetra accumsan sagittis. Proin tristique rhoncus orci, eget vulputate nisi sollicitudin et. Quisque lacus augue, mollis non mollis et, ullamcorper in purus. Morbi et sem orci. 9 | 10 | ## On deer horse aboard tritely yikes and much 11 | 12 | The Big Oxmox advised her not to do so, because there were thousands of 13 | bad Commas, wild Question Marks and devious Semikoli, but the Little 14 | Blind Text didn’t listen. She packed her seven versalia, put her initial 15 | into the belt and made herself on the way. 16 | 17 | Praesent accumsan odio in ante ullamcorper id pellentesque mauris rhoncus. Duis vitae neque dolor. Duis sed purus at eros bibendum cursus nec a nulla. Donec turpis quam, ultricies id pretium sit amet, gravida eget leo. 18 | 19 | ![unsplash.com](./photo-1489900464632-5f5907edda24.jpg) 20 | 21 | Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim. Sed et felis metus, rhoncus ornare nibh. Ut at magna leo. Suspendisse egestas est ac dolor imperdiet pretium. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 22 | 23 | Nam porttitor, erat sit amet venenatis luctus, augue libero ultrices quam, ut congue nisi risus eu purus. Cras semper consectetur elementum. Nulla vel aliquet libero. Vestibulum eget felis nec purus commodo convallis. Aliquam erat volutpat. 24 | 25 | Proin suscipit luctus orci placerat fringilla. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 26 | 27 | Proin bibendum ullamcorper rutrum. 28 | -------------------------------------------------------------------------------- /content/posts/2017-10-05--you-only-live-once/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: You only live once 3 | category: "sayings" 4 | cover: photo-1456518563096-0ff5ee08204e.jpg 5 | author: greg lobinski 6 | --- 7 | 8 | Fusce a metus eu diam varius congue nec nec sapien. Nunc convallis accumsan justo. **Pellentesque** habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec malesuada vehicula lectus, viverra sodales ipsum gravida nec. _Integer gravida_ nisi ut magna mollis molestie. Nullam [pharetra](http://google.com) accumsan sagittis. Proin tristique rhoncus orci, eget vulputate nisi sollicitudin et. Quisque lacus augue, mollis non mollis et, ullamcorper in purus. Morbi et sem orci. 9 | 10 | ### On deer horse aboard tritely yikes and much 11 | 12 | Praesent accumsan odio in ante ullamcorper id pellentesque mauris rhoncus. Duis vitae neque dolor. Duis sed purus at eros bibendum cursus nec a nulla. Donec turpis quam, ultricies id pretium sit amet, gravida eget leo. 13 | 14 | ![unsplash.com](./photo-1456518563096-0ff5ee08204e.jpg) 15 | 16 | The Big Oxmox advised her not to do so, because there were thousands of 17 | bad Commas, wild Question Marks and devious Semikoli, but the Little 18 | Blind Text didn’t listen. She packed her seven versalia, put her initial 19 | into the belt and made herself on the way. 20 | 21 | * This however showed weasel 22 | * Well uncritical so misled 23 | * Goodness much until that fluid owl 24 | 25 | Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim. Sed et felis metus, rhoncus ornare nibh. Ut at magna leo. Suspendisse egestas est ac dolor imperdiet pretium. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porttitor, erat sit amet venenatis luctus, augue libero ultrices quam, ut congue nisi risus eu purus. Cras semper consectetur elementum. Nulla vel aliquet libero. Vestibulum eget felis nec purus commodo convallis. Aliquam erat volutpat. 26 | 27 | Proin suscipit luctus orci placerat fringilla. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 28 | -------------------------------------------------------------------------------- /content/posts/2017-10-19--i-may-not-have-gone/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: I may not have gone where I intended to go 3 | category: "testimonies" 4 | cover: photo-1507915600431-5292809c5ab7.jpg 5 | author: greg lobinski 6 | --- 7 | 8 | Proin suscipit luctus orci placerat fringilla. Donec hendrerit laoreet risus eget adipiscing. [Suspendisse](http://google.com) in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac **habitasse** platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 9 | 10 | ## Vestibulum orci tortor, sollicitudin ac euismod non, placerat ac augue. 11 | 12 | Nam porttitor, erat sit amet venenatis luctus, augue libero ultrices quam, ut congue nisi risus eu purus. Cras semper consectetur elementum. Nulla vel aliquet libero. Vestibulum eget felis nec purus commodo convallis. Aliquam erat volutpat. 13 | 14 | ### Vestibulum orci tortor, sollicitudin ac euismod non, placerat ac augue. 15 | 16 | Nam porttitor, erat sit amet venenatis luctus, augue libero ultrices quam, ut congue nisi risus eu purus. Cras semper consectetur elementum. Nulla vel aliquet libero. Vestibulum eget felis nec purus commodo convallis. Aliquam erat volutpat. 17 | 18 | ![unsplash.com](./photo-1507915600431-5292809c5ab7.jpg) 19 | 20 | Proin ornare ligula eu tellus tempus elementum. Aenean bibendum iaculis mi, nec blandit lacus interdum vitae. Vestibulum non nibh risus, a scelerisque purus. Ut vel arcu ac tortor adipiscing hendrerit vel sed massa. Fusce sem libero, lacinia vulputate interdum non, porttitor non quam. Aliquam sed felis ligula. Duis non nulla magna. 21 | 22 | ### Donec hendrerit laoreet risus eget adipiscing. 23 | 24 | Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim. Sed et felis metus, rhoncus ornare nibh. Ut at magna leo. Suspendisse egestas est ac dolor imperdiet pretium. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 25 | 26 | Proin suscipit luctus orci placerat fringilla. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 27 | -------------------------------------------------------------------------------- /src/html.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | export default class HTML extends React.Component { 5 | render() { 6 | return ( 7 | 8 | 9 | 10 | 11 | 12 | {this.props.headComponents} 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | {this.props.preBodyComponents} 31 |
32 | {this.props.postBodyComponents} 33 | 34 | 35 | ); 36 | } 37 | } 38 | 39 | HTML.propTypes = { 40 | htmlAttributes: PropTypes.object, 41 | headComponents: PropTypes.array, 42 | bodyAttributes: PropTypes.object, 43 | preBodyComponents: PropTypes.array, 44 | body: PropTypes.string, 45 | postBodyComponents: PropTypes.array 46 | }; 47 | -------------------------------------------------------------------------------- /content/posts/2017-10-11--imperfection-is-beauty/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Imperfection is beauty, madness is genius 3 | cover: photo-1469461084727-4bfb496cf55a.jpg 4 | author: greg lobinski 5 | --- 6 | 7 | Proin suscipit luctus orci placerat fringilla. Donec hendrerit laoreet risus eget adipiscing. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, [bibendum](http://google.com) eu pulvinar vel, sodales vitae dui. 8 | 9 | ![unsplash.com](./photo-1469461084727-4bfb496cf55a.jpg) 10 | 11 | Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 12 | 13 | Fusce a metus eu diam varius congue nec nec sapien. Vestibulum orci tortor, sollicitudin ac euismod non, placerat ac augue. Nunc convallis accumsan justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec malesuada vehicula lectus, viverra sodales ipsum gravida nec. 14 | 15 | > Proin ornare ligula eu tellus tempus elementum. Aenean bibendum iaculis mi, nec blandit lacus interdum vitae. Vestibulum non nibh risus, a scelerisque purus. Ut vel arcu ac tortor adipiscing hendrerit vel sed massa. Fusce sem libero, lacinia vulputate interdum non, porttitor non quam. Aliquam sed felis ligula. Duis non nulla magna. 16 | 17 | Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim. Sed et felis metus, rhoncus ornare nibh. Ut at magna leo. Suspendisse egestas est ac dolor imperdiet pretium. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porttitor, erat sit amet venenatis luctus, augue libero ultrices quam, ut congue nisi risus eu purus. Cras semper consectetur elementum. 18 | 19 | ### Cras semper consectetur elementum 20 | 21 | Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 22 | 23 | Proin suscipit luctus orci placerat fringilla. Donec hendrerit laoreet risus eget adipiscing. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 24 | -------------------------------------------------------------------------------- /content/posts/2017-10-15--good-friends/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Good friends, good books, and a sleepy conscience 3 | cover: photo-1500531279542-fc8490c8ea4d.jpg 4 | author: greg lobinski 5 | --- 6 | 7 | Proin suscipit luctus orci placerat fringilla. Donec hendrerit laoreet risus eget adipiscing. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, [bibendum](http://google.com) eu pulvinar vel, sodales vitae dui. 8 | 9 | ![unsplash.com](./photo-1500531279542-fc8490c8ea4d.jpg) 10 | 11 | Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 12 | 13 | Fusce a metus eu diam varius congue nec nec sapien. Vestibulum orci tortor, sollicitudin ac euismod non, placerat ac augue. Nunc convallis accumsan justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec malesuada vehicula lectus, viverra sodales ipsum gravida nec. 14 | 15 | > Proin ornare ligula eu tellus tempus elementum. Aenean bibendum iaculis mi, nec blandit lacus interdum vitae. Vestibulum non nibh risus, a scelerisque purus. Ut vel arcu ac tortor adipiscing hendrerit vel sed massa. Fusce sem libero, lacinia vulputate interdum non, porttitor non quam. Aliquam sed felis ligula. Duis non nulla magna. 16 | 17 | Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim. Sed et felis metus, rhoncus ornare nibh. Ut at magna leo. Suspendisse egestas est ac dolor imperdiet pretium. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porttitor, erat sit amet venenatis luctus, augue libero ultrices quam, ut congue nisi risus eu purus. Cras semper consectetur elementum. 18 | 19 | ### Cras semper consectetur elementum 20 | 21 | Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 22 | 23 | Proin suscipit luctus orci placerat fringilla. Donec hendrerit laoreet risus eget adipiscing. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 24 | -------------------------------------------------------------------------------- /content/posts/draft-post/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: This is a draft post 3 | category: "sayings" 4 | cover: photo-1490474418585-ba9bad8fd0ea.jpg 5 | author: greg lobinski 6 | --- 7 | 8 | Proin suscipit luctus orci placerat fringilla. Donec hendrerit laoreet risus eget adipiscing. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, [adipiscing](http://google.com) eu pulvinar vel, sodales vitae dui. :thumbsup: :smile: :sparkler: 9 | 10 | Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 11 | 12 | Fusce a metus eu diam varius congue nec nec sapien. Vestibulum orci tortor, sollicitudin ac euismod non, placerat ac augue. Nunc convallis accumsan justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec malesuada vehicula lectus, viverra sodales ipsum gravida nec. 13 | 14 | > Proin ornare ligula eu tellus tempus elementum. Aenean bibendum iaculis mi, nec blandit lacus interdum vitae. Vestibulum non nibh risus, a scelerisque purus. Ut vel arcu ac tortor adipiscing hendrerit vel sed massa. Fusce sem libero, lacinia vulputate interdum non, porttitor non quam. Aliquam sed felis ligula. Duis non nulla magna. 15 | 16 | Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim. Sed et felis metus, rhoncus ornare nibh. Ut at magna leo. Suspendisse egestas est ac dolor imperdiet pretium. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porttitor, erat sit amet venenatis luctus, augue libero ultrices quam, ut congue nisi risus eu purus. Cras semper consectetur elementum. 17 | 18 | ### Cras semper consectetur elementum 19 | 20 | Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 21 | 22 | ![unsplash.com](./photo-1490474418585-ba9bad8fd0ea.jpg) 23 | 24 | Proin suscipit luctus orci placerat fringilla. Donec hendrerit laoreet risus eget adipiscing. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 25 | -------------------------------------------------------------------------------- /src/templates/CategoryTemplate.js: -------------------------------------------------------------------------------- 1 | import { FaTag } from "react-icons/fa/"; 2 | import PropTypes from "prop-types"; 3 | import React from "react"; 4 | import { graphql } from "gatsby"; 5 | import Seo from "../components/Seo"; 6 | import { ThemeContext } from "../layouts"; 7 | import Article from "../components/Article"; 8 | import Headline from "../components/Article/Headline"; 9 | import List from "../components/List"; 10 | 11 | const CategoryTemplate = props => { 12 | const { 13 | pageContext: { category }, 14 | data: { 15 | allMarkdownRemark: { totalCount, edges }, 16 | site: { 17 | siteMetadata: { facebook } 18 | } 19 | } 20 | } = props; 21 | 22 | return ( 23 | 24 | 25 | {theme => ( 26 |
27 |
28 | 29 | Posts in category 30 | {category} 31 | 32 |

33 | There {totalCount > 1 ? "are" : "is"} {totalCount} post{totalCount > 34 | 1 35 | ? "s" 36 | : ""}{" "} 37 | in the category. 38 |

39 | 40 |
41 |
42 | )} 43 |
44 | 45 | 46 |
47 | ); 48 | }; 49 | 50 | CategoryTemplate.propTypes = { 51 | data: PropTypes.object.isRequired, 52 | pageContext: PropTypes.object.isRequired 53 | }; 54 | 55 | export default CategoryTemplate; 56 | 57 | // eslint-disable-next-line no-undef 58 | export const categoryQuery = graphql` 59 | query PostsByCategory($category: String) { 60 | allMarkdownRemark( 61 | limit: 1000 62 | sort: { fields: [fields___prefix], order: DESC } 63 | filter: { frontmatter: { category: { eq: $category } } } 64 | ) { 65 | totalCount 66 | edges { 67 | node { 68 | fields { 69 | slug 70 | } 71 | excerpt 72 | timeToRead 73 | frontmatter { 74 | title 75 | category 76 | } 77 | } 78 | } 79 | } 80 | site { 81 | siteMetadata { 82 | facebook { 83 | appId 84 | } 85 | } 86 | } 87 | } 88 | `; 89 | -------------------------------------------------------------------------------- /content/posts/2017-10-21--like-nonsense/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: I like nonsense, it wakes up the brain cells 3 | category: "testimonies" 4 | cover: photo-1465070845512-2b2dbdc6df66.jpg 5 | author: greg lobinski 6 | --- 7 | 8 | :100: Proin suscipit luctus orci placerat fringilla. Donec hendrerit laoreet risus eget adipiscing. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 9 | 10 | ![unsplash.com](./photo-1465070845512-2b2dbdc6df66.jpg) 11 | 12 | ### Vestibulum orci tortor, sollicitudin ac euismod non, placerat ac augue. 13 | 14 | Praesent accumsan odio in ante ullamcorper id pellentesque mauris rhoncus. Duis vitae neque dolor. Duis sed purus at eros `bibendum cursus` nec a nulla. Donec turpis quam, ultricies id pretium sit amet, gravida eget leo. 15 | 16 | ```javascript 17 | import { createMuiTheme } from "material-ui/styles"; 18 | import Color from "color"; 19 | import colors from "./colors"; 20 | ``` 21 | 22 | Proin ornare ligula eu tellus tempus elementum. Aenean bibendum iaculis mi, nec blandit lacus interdum vitae. Vestibulum non nibh risus, a scelerisque purus. Ut vel arcu ac tortor adipiscing hendrerit vel sed massa. Fusce sem libero, lacinia vulputate interdum non, porttitor non quam. Aliquam sed felis ligula. Duis non nulla magna. 23 | 24 | ### Donec hendrerit laoreet risus eget adipiscing. 25 | 26 | Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim. Sed et felis metus, rhoncus ornare nibh. Ut at magna leo. Suspendisse egestas est ac dolor imperdiet pretium. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porttitor, erat sit amet venenatis luctus, augue libero ultrices quam, ut congue nisi risus eu purus. Cras semper consectetur elementum. Nulla vel aliquet libero. Vestibulum eget felis nec purus commodo convallis. Aliquam erat volutpat. 27 | 28 | ![test](./33893097-e5a70c34-df5a-11e7-8f5e-40e057626770.png) 29 | 30 | Proin suscipit luctus orci placerat fringilla. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 31 | -------------------------------------------------------------------------------- /content/posts/2017-10-13--there-are-only-two/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: There are only two ways to live your life. 3 | cover: photo-1451324119451-db0ac857463c.jpg 4 | author: greg lobinski 5 | --- 6 | 7 | ![unsplash.com](./photo-1451324119451-db0ac857463c.jpg) 8 | 9 | Proin suscipit luctus orci placerat fringilla. Donec hendrerit laoreet risus eget adipiscing. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur [adipiscing](/i-am-so-clever/) elit. Proin bibendum ullamcorper rutrum. 10 | 11 | Fusce a metus eu diam varius congue nec nec sapien. Nunc convallis accumsan justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec malesuada vehicula lectus, viverra sodales ipsum gravida nec. Integer gravida nisi ut magna mollis molestie. Nullam pharetra accumsan sagittis. Proin tristique rhoncus orci, eget vulputate nisi sollicitudin et. Quisque lacus augue, mollis non mollis et, ullamcorper in purus. Morbi et sem orci. 12 | 13 | ### Vestibulum orci tortor, sollicitudin ac euismod non, placerat ac augue. 14 | 15 | Praesent accumsan odio in ante ullamcorper id pellentesque mauris rhoncus. Duis vitae neque dolor. Duis sed purus at eros bibendum cursus nec a nulla. Donec turpis quam, ultricies id pretium sit amet, gravida eget leo. 16 | 17 | Proin ornare ligula eu tellus tempus elementum. . Vestibulum non nibh risus, a scelerisque purus. Ut vel arcu ac tortor adipiscing hendrerit vel sed massa. Fusce sem libero, lacinia vulputate interdum non, porttitor non quam. Aliquam sed felis ligula. Duis non nulla magna. 18 | 19 | ### Aenean bibendum iaculis mi, nec blandit lacus interdum vitae 20 | 21 | Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim. Sed et felis metus, rhoncus ornare nibh. Ut at magna leo. Suspendisse egestas est ac dolor imperdiet pretium. Lorem ipsum dolor sit amet, consectetur adipiscing elit 22 | 23 | ### Donec hendrerit laoreet risus eget adipiscing. 24 | 25 | Proin suscipit luctus orci placerat fringilla. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 26 | -------------------------------------------------------------------------------- /src/components/Article/Bodytext.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | const Bodytext = props => { 5 | const { html, theme } = props; 6 | 7 | return ( 8 | 9 |
10 | 11 | 76 | 77 | ); 78 | }; 79 | 80 | Bodytext.propTypes = { 81 | html: PropTypes.string.isRequired, 82 | theme: PropTypes.object.isRequired 83 | }; 84 | 85 | export default Bodytext; 86 | -------------------------------------------------------------------------------- /content/posts/2017-10-01--two-things-are-infinite/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Two things are infinite the universe and human stupidity 3 | category: "sayings" 4 | cover: photo-1490474418585-ba9bad8fd0ea.jpg 5 | author: greg lobinski 6 | --- 7 | 8 | Proin suscipit luctus orci placerat fringilla. Donec hendrerit laoreet risus eget adipiscing. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, [adipiscing](http://google.com) eu pulvinar vel, sodales vitae dui. :thumbsup: :smile: :sparkler: 9 | 10 | Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 11 | 12 | Fusce a metus eu diam varius congue nec nec sapien. Vestibulum orci tortor, sollicitudin ac euismod non, placerat ac augue. Nunc convallis accumsan justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec malesuada vehicula lectus, viverra sodales ipsum gravida nec. 13 | 14 | > Proin ornare ligula eu tellus tempus elementum. Aenean bibendum iaculis mi, nec blandit lacus interdum vitae. Vestibulum non nibh risus, a scelerisque purus. Ut vel arcu ac tortor adipiscing hendrerit vel sed massa. Fusce sem libero, lacinia vulputate interdum non, porttitor non quam. Aliquam sed felis ligula. Duis non nulla magna. 15 | 16 | Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim. Sed et felis metus, rhoncus ornare nibh. Ut at magna leo. Suspendisse egestas est ac dolor imperdiet pretium. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porttitor, erat sit amet venenatis luctus, augue libero ultrices quam, ut congue nisi risus eu purus. Cras semper consectetur elementum. 17 | 18 | ### Cras semper consectetur elementum 19 | 20 | Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 21 | 22 | ![unsplash.com](./photo-1490474418585-ba9bad8fd0ea.jpg) 23 | 24 | Proin suscipit luctus orci placerat fringilla. Donec hendrerit laoreet risus eget adipiscing. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 25 | -------------------------------------------------------------------------------- /src/components/Search/Search.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { InstantSearch, SearchBox, Hits, Stats, Pagination } from "react-instantsearch/dom"; 4 | 5 | import Hit from "./Hit"; 6 | 7 | const Search = props => { 8 | const { algolia, theme } = props; 9 | 10 | return ( 11 | 12 |
13 | {algolia && 14 | algolia.appId && ( 15 | 20 | 21 | 22 | 23 | 24 | 25 | )} 26 |
27 | 28 | {/* --- STYLES --- */} 29 | 84 |
85 | ); 86 | }; 87 | 88 | Search.propTypes = { 89 | algolia: PropTypes.object.isRequired, 90 | theme: PropTypes.object.isRequired 91 | }; 92 | 93 | export default Search; 94 | -------------------------------------------------------------------------------- /content/posts/2017-10-03--be-who-you-are/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Be who you are and say what you feel 3 | category: "sayings" 4 | cover: photo-1489824904134-891ab64532f1.jpg 5 | author: greg lobinski 6 | --- 7 | 8 | Proin suscipit luctus orci placerat fringilla. Donec hendrerit laoreet risus eget adipiscing. [Suspendisse](http://google.com) in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 9 | 10 | ## H2 Vestibulum orci tortor, sollicitudin ac euismod non, placerat ac augue. 11 | 12 | Fusce a metus eu diam varius congue nec nec sapien. Nunc convallis accumsan justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec malesuada vehicula lectus. 13 | 14 | ### H3 Vestibulum orci tortor, sollicitudin ac euismod non, placerat ac augue. 15 | 16 | Rviverra sodales ipsum gravida nec. Integer gravida nisi ut magna mollis molestie. Nullam pharetra accumsan sagittis. Proin tristique rhoncus orci, eget vulputate nisi sollicitudin et. Quisque lacus augue, mollis non mollis et, ullamcorper in purus. Morbi et sem orci. 17 | 18 | Praesent accumsan odio in ante ullamcorper id pellentesque mauris rhoncus. Duis vitae neque dolor. Duis sed purus at eros bibendum cursus nec a nulla. Donec turpis quam, ultricies id pretium sit amet, gravida eget leo. 19 | 20 | ![unsplash.com](./photo-1489824904134-891ab64532f1.jpg) 21 | 22 | Proin ornare ligula eu tellus tempus elementum. Aenean bibendum iaculis mi, nec blandit lacus interdum vitae. Vestibulum non nibh risus, a scelerisque purus. Ut vel arcu ac tortor adipiscing hendrerit vel sed massa. Fusce sem libero, lacinia vulputate interdum non, porttitor non quam. Aliquam sed felis ligula. Duis non nulla magna. 23 | 24 | ### Donec hendrerit laoreet risus eget adipiscing. 25 | 26 | Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim. Sed et felis metus, rhoncus ornare nibh. Ut at magna leo. Suspendisse egestas est ac dolor imperdiet pretium. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porttitor, erat sit amet venenatis luctus, augue libero ultrices quam, ut congue nisi risus eu purus. Cras semper consectetur elementum. Nulla vel aliquet libero. Vestibulum eget felis nec purus commodo convallis. Aliquam erat volutpat. 27 | 28 | Proin suscipit luctus orci placerat fringilla. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 29 | -------------------------------------------------------------------------------- /content/posts/2017-10-17--i-have-not-failed/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: I have not failed. I've just found 10,000 ways that won't work 3 | category: "testimonies" 4 | cover: photo-1463852247062-1bbca38f7805.jpg 5 | author: greg lobinski 6 | --- 7 | 8 | Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 9 | 10 | ![unsplash.com](./photo-1463852247062-1bbca38f7805.jpg) 11 | 12 | Proin suscipit luctus orci placerat fringilla. Donec hendrerit laoreet risus eget adipiscing. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. 13 | 14 | Fusce a metus eu diam varius congue nec nec sapien. Nunc convallis accumsan justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec malesuada vehicula lectus, viverra sodales ipsum gravida nec. Integer gravida nisi ut magna mollis molestie. Nullam pharetra accumsan sagittis. Proin tristique rhoncus orci, eget vulputate nisi sollicitudin et. Quisque lacus augue, mollis non mollis et, ullamcorper in purus. Morbi et sem orci. 15 | 16 | ### Vestibulum orci tortor, sollicitudin ac euismod non, placerat ac augue. 17 | 18 | Praesent accumsan odio in ante ullamcorper id pellentesque mauris rhoncus. Duis vitae neque dolor. Duis sed purus at eros bibendum cursus nec a nulla. Donec turpis quam, ultricies id pretium sit amet, gravida eget leo. 19 | 20 | Proin ornare ligula eu tellus tempus elementum. . Vestibulum non nibh risus, a scelerisque purus. Ut vel arcu ac tortor adipiscing hendrerit vel sed massa. Fusce sem libero, lacinia vulputate interdum non, porttitor non quam. Aliquam sed felis ligula. Duis non nulla magna. 21 | 22 | ### Aenean bibendum iaculis mi, nec blandit lacus interdum vitae 23 | 24 | Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim. Sed et felis metus, rhoncus ornare nibh. Ut at magna leo. Suspendisse egestas est ac dolor imperdiet pretium. Lorem ipsum dolor sit amet, consectetur adipiscing elit 25 | 26 | ### Donec hendrerit laoreet risus eget adipiscing. 27 | 28 | Proin suscipit luctus orci placerat fringilla. Suspendisse in urna ligula, a volutpat mauris. Sed enim mi, bibendum eu pulvinar vel, sodales vitae dui. Pellentesque sed sapien lorem, at lacinia urna. In hac habitasse platea dictumst. Vivamus vel justo in leo laoreet ullamcorper non vitae lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin bibendum ullamcorper rutrum. 29 | 30 | Fusce a metus eu diam varius congue nec nec sapien. Nunc convallis accumsan justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec malesuada vehicula lectus, viverra sodales ipsum gravida nec. Integer gravida nisi ut magna mollis molestie. Nullam pharetra accumsan sagittis. Proin tristique rhoncus orci, eget vulputate nisi sollicitudin et. Quisque lacus augue, mollis non mollis et, ullamcorper in purus. Morbi et sem orci. 31 | -------------------------------------------------------------------------------- /src/components/Menu/Item.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { Link } from "gatsby"; 4 | 5 | const Item = props => { 6 | const { theme, item: { label, to, icon: Icon } = {}, onClick } = props; 7 | 8 | return ( 9 | 10 |
  • 11 | 17 | {Icon && } {label} 18 | 19 |
  • 20 | 21 | {/* --- STYLES --- */} 22 | 95 |
    96 | ); 97 | }; 98 | 99 | Item.propTypes = { 100 | item: PropTypes.object, 101 | hidden: PropTypes.bool, 102 | onClick: PropTypes.func, 103 | icon: PropTypes.func, 104 | theme: PropTypes.object.isRequired 105 | }; 106 | 107 | export default Item; 108 | -------------------------------------------------------------------------------- /src/components/Post/NextPrev.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { Link } from "gatsby"; 4 | 5 | import { FaArrowRight } from "react-icons/fa/"; 6 | import { FaArrowLeft } from "react-icons/fa/"; 7 | 8 | const NextPrev = props => { 9 | const { 10 | theme, 11 | next: { 12 | fields: { prefix: nextPrefix, slug: nextSlug } = {}, 13 | frontmatter: { title: nextTitle } = {} 14 | } = {}, 15 | prev: { 16 | fields: { prefix: prevPrefix, slug: prevSlug } = {}, 17 | frontmatter: { title: prevTitle } = {} 18 | } = {} 19 | } = props; 20 | 21 | return ( 22 | 23 |
    24 | {nextSlug && ( 25 | 26 | 27 |

    28 | {nextTitle} 29 |

    30 | 31 | )} 32 | {prevSlug && ( 33 | 34 | 35 |

    36 | {prevTitle} 37 |

    38 | 39 | )} 40 |
    41 | 42 | {/* --- STYLES --- */} 43 | 107 |
    108 | ); 109 | }; 110 | 111 | NextPrev.propTypes = { 112 | next: PropTypes.object, 113 | prev: PropTypes.object, 114 | theme: PropTypes.object.isRequired 115 | }; 116 | 117 | export default NextPrev; 118 | -------------------------------------------------------------------------------- /src/pages/category.js: -------------------------------------------------------------------------------- 1 | import { FaTag } from "react-icons/fa/"; 2 | import PropTypes from "prop-types"; 3 | import React from "react"; 4 | import { graphql } from "gatsby"; 5 | import { ThemeContext } from "../layouts"; 6 | import Article from "../components/Article/"; 7 | import Headline from "../components/Article/Headline"; 8 | import List from "../components/List"; 9 | import Seo from "../components/Seo"; 10 | 11 | const CategoryPage = props => { 12 | const { 13 | data: { 14 | posts: { edges: posts }, 15 | site: { 16 | siteMetadata: { facebook } 17 | } 18 | } 19 | } = props; 20 | 21 | // Create category list 22 | const categories = {}; 23 | posts.forEach(edge => { 24 | const { 25 | node: { 26 | frontmatter: { category } 27 | } 28 | } = edge; 29 | 30 | if (category && category != null) { 31 | if (!categories[category]) { 32 | categories[category] = []; 33 | } 34 | categories[category].push(edge); 35 | } 36 | }); 37 | 38 | const categoryList = []; 39 | 40 | for (var key in categories) { 41 | categoryList.push([key, categories[key]]); 42 | } 43 | 44 | return ( 45 | 46 | 47 | {theme => ( 48 |
    49 |
    50 | 51 |
    52 | {categoryList.map(item => ( 53 |
    54 |

    55 | {item[0]} 56 |

    57 | 58 |
    59 | ))} 60 | {/* --- STYLES --- */} 61 | 70 |
    71 | )} 72 |
    73 | 74 | 75 |
    76 | ); 77 | }; 78 | 79 | CategoryPage.propTypes = { 80 | data: PropTypes.object.isRequired 81 | }; 82 | 83 | export default CategoryPage; 84 | 85 | //eslint-disable-next-line no-undef 86 | export const query = graphql` 87 | query PostsQuery { 88 | posts: allMarkdownRemark( 89 | filter: { fileAbsolutePath: { regex: "//posts/[0-9]+.*--/" } } 90 | sort: { fields: [fields___prefix], order: DESC } 91 | ) { 92 | edges { 93 | node { 94 | excerpt 95 | fields { 96 | slug 97 | prefix 98 | } 99 | frontmatter { 100 | title 101 | category 102 | author 103 | cover { 104 | children { 105 | ... on ImageSharp { 106 | fluid(maxWidth: 800, maxHeight: 360) { 107 | ...GatsbyImageSharpFluid_withWebp 108 | } 109 | } 110 | } 111 | } 112 | } 113 | } 114 | } 115 | } 116 | site { 117 | siteMetadata { 118 | facebook { 119 | appId 120 | } 121 | } 122 | } 123 | } 124 | `; 125 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at greglobinski@gmail.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ 75 | -------------------------------------------------------------------------------- /src/pages/index.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { graphql } from "gatsby"; 4 | import { ThemeContext } from "../layouts"; 5 | import Blog from "../components/Blog"; 6 | import Hero from "../components/Hero"; 7 | import Seo from "../components/Seo"; 8 | 9 | class IndexPage extends React.Component { 10 | separator = React.createRef(); 11 | 12 | scrollToContent = e => { 13 | this.separator.current.scrollIntoView({ block: "start", behavior: "smooth" }); 14 | }; 15 | 16 | render() { 17 | const { 18 | data: { 19 | posts: { edges: posts = [] }, 20 | bgDesktop: { 21 | resize: { src: desktop } 22 | }, 23 | bgTablet: { 24 | resize: { src: tablet } 25 | }, 26 | bgMobile: { 27 | resize: { src: mobile } 28 | }, 29 | site: { 30 | siteMetadata: { facebook } 31 | } 32 | } 33 | } = this.props; 34 | 35 | const backgrounds = { 36 | desktop, 37 | tablet, 38 | mobile 39 | }; 40 | 41 | return ( 42 | 43 | 44 | {theme => ( 45 | 46 | )} 47 | 48 | 49 |
    50 | 51 | 52 | {theme => } 53 | 54 | 55 | 56 | 57 | 63 |
    64 | ); 65 | } 66 | } 67 | 68 | IndexPage.propTypes = { 69 | data: PropTypes.object.isRequired 70 | }; 71 | 72 | export default IndexPage; 73 | 74 | //eslint-disable-next-line no-undef 75 | export const query = graphql` 76 | query IndexQuery { 77 | posts: allMarkdownRemark( 78 | filter: { fileAbsolutePath: { regex: "//posts/[0-9]+.*--/" } } 79 | sort: { fields: [fields___prefix], order: DESC } 80 | ) { 81 | edges { 82 | node { 83 | excerpt 84 | fields { 85 | slug 86 | prefix 87 | } 88 | frontmatter { 89 | title 90 | category 91 | author 92 | cover { 93 | children { 94 | ... on ImageSharp { 95 | fluid(maxWidth: 800, maxHeight: 360) { 96 | ...GatsbyImageSharpFluid_withWebp 97 | } 98 | } 99 | } 100 | } 101 | } 102 | } 103 | } 104 | } 105 | site { 106 | siteMetadata { 107 | facebook { 108 | appId 109 | } 110 | } 111 | } 112 | bgDesktop: imageSharp(fluid: { originalName: { regex: "/hero-background/" } }) { 113 | resize(width: 1200, quality: 90, cropFocus: CENTER) { 114 | src 115 | } 116 | } 117 | bgTablet: imageSharp(fluid: { originalName: { regex: "/hero-background/" } }) { 118 | resize(width: 800, height: 1100, quality: 90, cropFocus: CENTER) { 119 | src 120 | } 121 | } 122 | bgMobile: imageSharp(fluid: { originalName: { regex: "/hero-background/" } }) { 123 | resize(width: 450, height: 850, quality: 90, cropFocus: CENTER) { 124 | src 125 | } 126 | } 127 | } 128 | `; 129 | 130 | //hero-background 131 | -------------------------------------------------------------------------------- /src/theme/theme.yaml: -------------------------------------------------------------------------------- 1 | # OPTIONS 2 | 3 | # SPACE 4 | space : 5 | # space options 6 | default : 20px 7 | xxs: 2px 8 | xs: 5px 9 | s: 10px 10 | m: 20px 11 | l: 40px 12 | xl: 80px 13 | inset: 14 | default : 20px 15 | xs: 5px 16 | s: 10px 17 | m: 20px 18 | l: 40px 19 | stack: 20 | default : 0 0 20px 0 21 | xxs: 0 0 2px 0 22 | xs: 0 0 5px 0 23 | s: 0 0 10px 0 24 | m: 0 0 20px 0 25 | l: 0 0 40px 0 26 | inline: 27 | default : 0 20px 0 0 28 | xxs: 0 2px 0 0 29 | xs: 0 5px 0 0 30 | s: 0 10px 0 0 31 | m: 0 20px 0 0 32 | l: 0 40px 0 0 33 | # SIZE 34 | size: 35 | radius: 36 | default: 10px 37 | small: 5px 38 | # COLOR 39 | color: 40 | # color options 41 | neutral: 42 | white: &color-white '#ffffff' 43 | gray: 44 | a: &color-gray-1 '#fafaf9' 45 | b: &color-gray-2 '#f3f2f2' 46 | c: &color-gray-3 '#ecebea' 47 | d: '#dddbda' 48 | e: '#c9c7c5' 49 | f: '#b0adab' 50 | g: '#969492' 51 | h: '#706e6b' 52 | i: '#514f4d' 53 | j: &color-gray-10 '#3e3e3c' 54 | k: '#2b2826' 55 | black: '#000000' 56 | brand: 57 | primary: &color-brand-primary '#709425' 58 | primaryActive: '#709425' 59 | light: '#709425' 60 | lightActive: '#709425' 61 | dark: '#709425' 62 | darkActive: '#709425' 63 | special: 64 | attention: &color-special-attention orange 65 | # FONT 66 | font: 67 | # font options 68 | family: 69 | initial: 'Arial, sans-serif' 70 | target: &font-family-target 'Open Sans' 71 | weight: 72 | standard: 400 73 | bold: 600 74 | size: 75 | xxs: &font-size-xs .8em 76 | xs: &font-size-xs .95em 77 | s: &font-size-s 1.1em 78 | m: &font-size-m 1.35em 79 | l: &font-size-l 1.7em 80 | xl: &font-size-xl 2em 81 | xxl: &font-size-xl 2.2em 82 | xxxl: &font-size-xxl 2.8em 83 | lineHeight: 84 | xs: &font-line-height-xs 1.1 85 | s: &font-line-height-s 1.2 86 | m: &font-line-height-m 1.3 87 | l: &font-line-height-l 1.4 88 | xl: &font-line-height-l 1.5 89 | xxl: &font-line-height-l 1.6 90 | reset: &font-line-height-reset 1 91 | #TIME 92 | time: 93 | duration: 94 | default: 0.5s 95 | long: 1s 96 | 97 | 98 | # GENERAL TOKENS 99 | background: 100 | color: 101 | primary: *color-white 102 | alt: *color-gray-1 103 | brand: *color-brand-primary 104 | text: 105 | family: *font-family-target 106 | color: 107 | primary: *color-gray-10 108 | primaryInverse: *color-white 109 | brand: *color-brand-primary 110 | attention: *color-special-attention 111 | lineHeight: 112 | default: *font-line-height-l 113 | maxWidth: 114 | tablet: 650px 115 | desktop: 700px 116 | heading: 117 | family: *font-family-target 118 | size: 119 | h1: *font-size-xl 120 | h2: *font-size-l 121 | h3: *font-size-m 122 | lineHeight: 123 | h1: *font-line-height-xs 124 | h2: *font-line-height-xs 125 | h3: *font-line-height-xs 126 | weight: 600 127 | line: 128 | color: *color-gray-3 129 | icon: 130 | color: *color-brand-primary 131 | 132 | 133 | # COMPONENT TOKENS 134 | hero: 135 | h1: 136 | size: *font-size-xxl 137 | color: *color-white 138 | lineHeight: *font-line-height-xs 139 | background: 'linear-gradient(0deg, #E0306E, #6438B5)' 140 | blog: 141 | h1: 142 | size: *font-size-l 143 | lineHeight: *font-line-height-xs 144 | hoverColor: *color-brand-primary 145 | header: 146 | height: 147 | default: 80px 148 | fixed: 50px; 149 | homepage: 100px; 150 | 151 | -------------------------------------------------------------------------------- /src/components/Menu/Expand.js: -------------------------------------------------------------------------------- 1 | import { FaAngleDown } from "react-icons/fa/"; 2 | import PropTypes from "prop-types"; 3 | import React from "react"; 4 | 5 | const Expand = props => { 6 | const { onClick, theme } = props; 7 | 8 | return ( 9 | 10 | 13 | 14 | {/* --- STYLES --- */} 15 | 111 | 112 | ); 113 | }; 114 | 115 | Expand.propTypes = { 116 | onClick: PropTypes.func, 117 | theme: PropTypes.object.isRequired 118 | }; 119 | 120 | export default Expand; 121 | -------------------------------------------------------------------------------- /src/components/Post/Share.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { 4 | FacebookShareButton, 5 | GooglePlusShareButton, 6 | LinkedinShareButton, 7 | TwitterShareButton, 8 | FacebookShareCount, 9 | GooglePlusShareCount, 10 | LinkedinShareCount, 11 | FacebookIcon, 12 | TwitterIcon, 13 | GooglePlusIcon, 14 | LinkedinIcon 15 | } from "react-share"; 16 | 17 | import config from "../../../content/meta/config"; 18 | 19 | const PostShare = props => { 20 | const { 21 | post: { 22 | fields: { slug }, 23 | frontmatter: { title }, 24 | excerpt 25 | }, 26 | theme 27 | } = props; 28 | 29 | const url = config.siteUrl + config.pathPrefix + slug; 30 | 31 | const iconSize = 36; 32 | const filter = count => (count > 0 ? count : ""); 33 | 34 | return ( 35 | 36 |
    37 | SHARE 38 |
    39 | 46 | 47 | 48 | 54 | 55 | 56 | {count =>
    {filter(count)}
    } 57 |
    58 |
    59 | 66 | 67 | 68 | {count =>
    {filter(count)}
    } 69 |
    70 |
    71 | 79 | 80 | 81 | {count =>
    {filter(count)}
    } 82 |
    83 |
    84 |
    85 |
    86 | 87 | {/* --- STYLES --- */} 88 | 121 |
    122 | ); 123 | }; 124 | 125 | PostShare.propTypes = { 126 | post: PropTypes.object.isRequired, 127 | theme: PropTypes.object.isRequired 128 | }; 129 | 130 | export default PostShare; 131 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gatsby-starter-hero-blog", 3 | "version": "2.0.0", 4 | "author": "Greg Lobinski ", 5 | "license": "MIT", 6 | "dependencies": { 7 | "antd": "^3.7.0", 8 | "fontfaceobserver": "^2.0.13", 9 | "gatsby": "^2.0.21", 10 | "gatsby-image": "^2.0.5", 11 | "gatsby-plugin-algolia": "^0.1.0", 12 | "gatsby-plugin-catch-links": "^2.0.2", 13 | "gatsby-plugin-feed": "^2.0.5", 14 | "gatsby-plugin-google-analytics": "^2.0.6", 15 | "gatsby-plugin-layout": "^1.0.2", 16 | "gatsby-plugin-manifest": "^2.0.2", 17 | "gatsby-plugin-netlify": "^2.0.0", 18 | "gatsby-plugin-offline": "^2.0.6", 19 | "gatsby-plugin-react-helmet": "^3.0.0", 20 | "gatsby-plugin-react-svg": "^2.0.0", 21 | "gatsby-plugin-sharp": "^2.0.5", 22 | "gatsby-plugin-sitemap": "^2.0.1", 23 | "gatsby-plugin-styled-jsx": "^3.0.1", 24 | "gatsby-plugin-styled-jsx-postcss": "^2.0.2", 25 | "gatsby-remark-copy-linked-files": "^2.0.5", 26 | "gatsby-remark-emojis": "^0.2.3", 27 | "gatsby-remark-external-links": "^0.0.4", 28 | "gatsby-remark-images": "^2.0.1", 29 | "gatsby-remark-prismjs": "^3.0.0", 30 | "gatsby-remark-responsive-iframe": "^2.0.5", 31 | "gatsby-remark-smartypants": "^2.0.5", 32 | "gatsby-source-filesystem": "^2.0.1", 33 | "gatsby-transformer-remark": "^2.1.3", 34 | "gatsby-transformer-sharp": "^2.1.1", 35 | "js-yaml": "^3.12.0", 36 | "normalize.css": "^8.0.0", 37 | "prismjs": "^1.15.0", 38 | "react": "^16.5.2", 39 | "react-addons-perf": "^15.4.2", 40 | "react-dom": "^16.5.2", 41 | "react-facebook": "^5.0.3", 42 | "react-helmet": "^5.2.0", 43 | "react-icons": "^3.1.0", 44 | "react-instantsearch": "^5.2.2", 45 | "react-md-spinner": "^0.3.0", 46 | "react-obfuscate": "^2.1.4", 47 | "react-share": "^2.2.0", 48 | "react-visibility-sensor": "^4.1.0", 49 | "styled-jsx": "^2.2.7", 50 | "styled-jsx-plugin-postcss": "^0.1.3", 51 | "styled-jsx-plugin-stylelint": "^0.1.0", 52 | "tinycolor2": "^1.4.1", 53 | "typeface-open-sans": "^0.0.54", 54 | "yaml-loader": "^0.5.0" 55 | }, 56 | "keywords": [ 57 | "gatsby" 58 | ], 59 | "scripts": { 60 | "build": "gatsby build", 61 | "develop": "gatsby develop", 62 | "devhost": "gatsby develop --host 192.168.0.112", 63 | "format": "prettier --write 'src/**/*.js'", 64 | "lint-errors": "eslint src/**/*.{js,jsx} --quiet", 65 | "lint": "eslint src/**/*.{js,jsx}", 66 | "stylelint": "stylelint src/**/*.js", 67 | "generate-app-icons": "sh ./scripts/generate-app-icons.sh" 68 | }, 69 | "devDependencies": { 70 | "@mapbox/stylelint-processor-arbitrary-tags": "^0.2.0", 71 | "babel-eslint": "^8.2.6", 72 | "babel-plugin-dynamic-import-webpack": "^1.0.2", 73 | "babel-plugin-import": "^1.8.0", 74 | "babel-plugin-syntax-dynamic-import": "^6.18.0", 75 | "babel-webpack-plugin": "^0.1.1", 76 | "dotenv": "^6.0.0", 77 | "eslint": "^5.1.0", 78 | "eslint-config-google": "^0.9.1", 79 | "eslint-config-prettier": "^2.9.0", 80 | "eslint-plugin-graphql": "^2.1.1", 81 | "eslint-plugin-import": "^2.13.0", 82 | "eslint-plugin-jsx-a11y": "^6.1.1", 83 | "eslint-plugin-prettier": "^2.6.2", 84 | "eslint-plugin-react": "^7.10.0", 85 | "json-loader": "^0.5.7", 86 | "postcss": "^7.0.0", 87 | "postcss-cli": "^5.0.1", 88 | "postcss-cssnext": "^3.1.0", 89 | "postcss-custom-properties": "^7.0.0", 90 | "postcss-custom-selectors": "^4.0.1", 91 | "postcss-easy-media-query": "^1.0.0", 92 | "postcss-load-plugins": "^2.3.0", 93 | "postcss-loader": "^2.1.6", 94 | "postcss-media-variables": "^2.0.1", 95 | "postcss-nested": "^3.0.0", 96 | "postcss-sorting": "^4.0.0", 97 | "postcss-text-remove-gap": "^1.1.1", 98 | "postcss-utilities": "^0.8.0", 99 | "precss": "^3.1.2", 100 | "prettier": "^1.13.7", 101 | "serve": "^9.2.0", 102 | "sharp-cli": "^1.7.0", 103 | "stylelint": "^9.3.0", 104 | "stylelint-config-css-modules": "^1.3.0", 105 | "stylelint-config-standard": "^18.2.0", 106 | "url-loader": "^1.1.1", 107 | "webpack-bundle-analyzer": "^2.13.1" 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /src/images/svg-icons/algolia-full.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/images/svg-icons/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Hero/Hero.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | import { FaArrowDown } from "react-icons/fa/"; 5 | 6 | const Hero = props => { 7 | const { scrollToContent, backgrounds, theme } = props; 8 | 9 | return ( 10 | 11 |
    12 |

    13 | This is a demo site of the heroBlog GatsbyJS starter 14 |

    15 | 18 |
    19 | 20 | {/* --- STYLES --- */} 21 | 131 |
    132 | ); 133 | }; 134 | 135 | Hero.propTypes = { 136 | scrollToContent: PropTypes.func.isRequired, 137 | backgrounds: PropTypes.object.isRequired, 138 | theme: PropTypes.object.isRequired 139 | }; 140 | 141 | export default Hero; 142 | -------------------------------------------------------------------------------- /src/images/svg-icons/search-by-algolia.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/components/Contact/Contact.js: -------------------------------------------------------------------------------- 1 | /* eslint no-unused-vars: 0 */ 2 | 3 | import { navigate } from "gatsby"; 4 | import Button from "antd/lib/button"; 5 | import Form from "antd/lib/form"; 6 | import Input from "antd/lib/input"; 7 | import PropTypes from "prop-types"; 8 | import React from "react"; 9 | 10 | const FormItem = Form.Item; 11 | const { TextArea } = Input; 12 | import "antd/lib/form/style/index.css"; 13 | import "antd/lib/input/style/index.css"; 14 | import "antd/lib/button/style/index.css"; 15 | import { ThemeContext } from "../../layouts"; 16 | 17 | const Contact = props => { 18 | const { getFieldDecorator } = props.form; 19 | 20 | function encode(data) { 21 | return Object.keys(data) 22 | .map(key => encodeURIComponent(key) + "=" + encodeURIComponent(data[key])) 23 | .join("&"); 24 | } 25 | 26 | function handleSubmit(e) { 27 | e.preventDefault(); 28 | props.form.validateFields((err, values) => { 29 | if (!err) { 30 | console.log("Received values of form: ", values); 31 | sendMessage(values); 32 | } 33 | }); 34 | } 35 | 36 | function sendMessage(values) { 37 | fetch("/", { 38 | method: "POST", 39 | headers: { "Content-Type": "application/x-www-form-urlencoded" }, 40 | body: encode({ "form-name": "contact", ...values }) 41 | }) 42 | .then(() => { 43 | console.log("Form submission success"); 44 | navigate("/success"); 45 | }) 46 | .catch(error => { 47 | console.error("Form submission error:", error); 48 | this.handleNetworkError(); 49 | }); 50 | } 51 | 52 | function handleNetworkError(e) { 53 | console.log("submit Error"); 54 | } 55 | 56 | return ( 57 | 58 | 59 | {theme => ( 60 |
    61 |
    67 | 68 | {getFieldDecorator("name", { 69 | rules: [ 70 | { 71 | whitespace: true 72 | } 73 | ] 74 | })()} 75 | 76 | 77 | {getFieldDecorator("email", { 78 | rules: [ 79 | { 80 | required: true, 81 | message: "Please input your e-mail address!", 82 | whitespace: true, 83 | type: "email" 84 | } 85 | ] 86 | })()} 87 | 88 | 89 | {getFieldDecorator("message", { 90 | rules: [ 91 | { required: true, message: "Please input your message!", whitespace: true } 92 | ] 93 | })( 94 |