From a2f8738ea65bf20817fb9de2f902a30ee1e4c83b Mon Sep 17 00:00:00 2001 From: wpioneer Date: Sun, 20 Aug 2017 14:43:49 +0300 Subject: [PATCH] :bookmark: Upgrade to Gatsby 1.8.12 --- .babelrc | 4 + browserslist => .browserslistrc | 3 +- .eslintrc | 11 +- .gitattributes | 5 +- .gitignore | 7 +- README.md | 75 +- components/ReadNext/index.jsx | 48 - components/ReadNext/style.css | 4 - components/SiteLinks/index.jsx | 59 - components/SiteLinks/style.css | 32 - components/SiteNav/index.jsx | 29 - components/SiteNav/style.css | 24 - components/SitePage/index.jsx | 34 - components/SitePage/style.css | 17 - components/SitePost/index.jsx | 51 - components/SitePost/style.css | 109 - components/SiteSidebar/index.jsx | 64 - components/SiteSidebar/style.css | 67 - config.toml | 14 - gatsby-browser.js | 8 - gatsby-config.js | 165 + gatsby-node.js | 211 +- html.js | 39 - package.json | 63 +- pages/404.md | 7 - pages/_template.jsx | 23 - .../2015-05-06-my-second-post/index.md | 15 - pages/articles/2015-05-28-hi-folks/index.md | 20 - pages/index.jsx | 58 - pages/pages/about/index.md | 15 - pages/pages/contact/index.md | 15 - .../fonts/fontello-771c82e0/LICENSE.txt | 12 + src/assets/fonts/fontello-771c82e0/README.txt | 75 + .../fonts/fontello-771c82e0/config.json | 792 +++++ .../fonts/fontello-771c82e0/css/animation.css | 85 + .../fontello-771c82e0/css/fontello-codes.css | 17 + .../css/fontello-embedded.css | 70 + .../css/fontello-ie7-codes.css | 17 + .../fontello-771c82e0/css/fontello-ie7.css | 28 + .../fonts/fontello-771c82e0/css/fontello.css | 73 + src/assets/fonts/fontello-771c82e0/demo.html | 330 ++ .../fonts/fontello-771c82e0/font/fontello.eot | Bin 0 -> 10268 bytes .../fonts/fontello-771c82e0/font/fontello.svg | 42 + .../fonts/fontello-771c82e0/font/fontello.ttf | Bin 0 -> 10100 bytes .../fontello-771c82e0/font/fontello.woff | Bin 0 -> 6628 bytes .../fontello-771c82e0/font/fontello.woff2 | Bin 0 -> 5696 bytes src/assets/scss/_base.scss | 5 + src/assets/scss/_mixins.scss | 6 + src/assets/scss/_pages.scss | 4 + src/assets/scss/_variables.scss | 37 + src/assets/scss/base/_generic.scss | 182 ++ src/assets/scss/base/_highlight.scss | 137 + src/assets/scss/base/_normalize.scss | 461 +++ src/assets/scss/init.scss | 6 + src/assets/scss/mixins/_breakpoints.scss | 25 + src/assets/scss/mixins/_line-height.scss | 7 + src/assets/scss/mixins/_margin.scss | 23 + src/assets/scss/mixins/_padding.scss | 19 + src/assets/scss/pages/_categories.scss | 18 + src/assets/scss/pages/_tags.scss | 18 + .../CategoryTemplateDetails/index.jsx | 44 + src/components/Links/index.jsx | 65 + src/components/Links/style.scss | 35 + src/components/Menu/index.jsx | 38 + src/components/Menu/style.scss | 30 + src/components/PageTemplateDetails/index.jsx | 32 + src/components/PageTemplateDetails/style.scss | 18 + src/components/Post/index.jsx | 46 + src/components/Post/style.scss | 60 + src/components/PostTemplateDetails/index.jsx | 72 + src/components/PostTemplateDetails/style.scss | 166 + src/components/Sidebar/index.jsx | 74 + src/components/Sidebar/style.scss | 69 + src/components/TagTemplateDetails/index.jsx | 44 + src/html.js | 57 + src/layouts/index.jsx | 24 + src/pages/404.jsx | 49 + .../1.jpg | Bin 0 -> 840478 bytes .../index.md | 20 + .../1.jpg | Bin 0 -> 970706 bytes .../index.md | 52 + .../1.jpg | Bin 0 -> 3011570 bytes .../index.md | 53 + .../Gutenberg.jpg | Bin .../Printing-press.png | Bin .../index.md | 50 +- .../movable-type.jpg | Bin .../42-line-bible.jpg | Bin 0 -> 671242 bytes .../index.md | 74 + .../type-through-time.jpg | Bin 0 -> 117689 bytes src/pages/categories.jsx | 89 + src/pages/index.jsx | 94 + src/pages/pages/2015-05-01---about/1.jpg | Bin 0 -> 2880631 bytes src/pages/pages/2015-05-01---about/index.md | 13 + src/pages/pages/2015-05-01---contact/1.jpg | Bin 0 -> 1158287 bytes src/pages/pages/2015-05-01---contact/index.md | 31 + {pages => src/pages}/photo.jpg | Bin src/pages/tags.jsx | 89 + src/templates/category-template.js | 80 + src/templates/page-template.js | 76 + src/templates/post-template.js | 71 + src/templates/tag-template.js | 80 + static/css/base.css | 42 - static/css/highlight.css | 81 - static/css/reset.css | 118 - static/css/typography.css | 509 --- static/fonts/fontawesome/FontAwesome.otf | Bin 109688 -> 0 bytes .../fonts/fontawesome/fontawesome-webfont.eot | Bin 70807 -> 0 bytes .../fonts/fontawesome/fontawesome-webfont.svg | 655 ---- .../fonts/fontawesome/fontawesome-webfont.ttf | Bin 142072 -> 0 bytes .../fontawesome/fontawesome-webfont.woff | Bin 83588 -> 0 bytes .../fontawesome/fontawesome-webfont.woff2 | Bin 66624 -> 0 bytes static/fonts/fontawesome/style.css | 2731 ----------------- travis.yml | 2 +- wrappers/md.jsx | 34 - 115 files changed, 4734 insertions(+), 5018 deletions(-) create mode 100644 .babelrc rename browserslist => .browserslistrc (61%) delete mode 100644 components/ReadNext/index.jsx delete mode 100644 components/ReadNext/style.css delete mode 100644 components/SiteLinks/index.jsx delete mode 100644 components/SiteLinks/style.css delete mode 100644 components/SiteNav/index.jsx delete mode 100644 components/SiteNav/style.css delete mode 100644 components/SitePage/index.jsx delete mode 100644 components/SitePage/style.css delete mode 100644 components/SitePost/index.jsx delete mode 100644 components/SitePost/style.css delete mode 100644 components/SiteSidebar/index.jsx delete mode 100644 components/SiteSidebar/style.css delete mode 100644 config.toml delete mode 100644 gatsby-browser.js create mode 100644 gatsby-config.js delete mode 100644 html.js delete mode 100644 pages/404.md delete mode 100644 pages/_template.jsx delete mode 100644 pages/articles/2015-05-06-my-second-post/index.md delete mode 100644 pages/articles/2015-05-28-hi-folks/index.md delete mode 100644 pages/index.jsx delete mode 100644 pages/pages/about/index.md delete mode 100644 pages/pages/contact/index.md create mode 100644 src/assets/fonts/fontello-771c82e0/LICENSE.txt create mode 100644 src/assets/fonts/fontello-771c82e0/README.txt create mode 100644 src/assets/fonts/fontello-771c82e0/config.json create mode 100644 src/assets/fonts/fontello-771c82e0/css/animation.css create mode 100644 src/assets/fonts/fontello-771c82e0/css/fontello-codes.css create mode 100644 src/assets/fonts/fontello-771c82e0/css/fontello-embedded.css create mode 100644 src/assets/fonts/fontello-771c82e0/css/fontello-ie7-codes.css create mode 100644 src/assets/fonts/fontello-771c82e0/css/fontello-ie7.css create mode 100644 src/assets/fonts/fontello-771c82e0/css/fontello.css create mode 100644 src/assets/fonts/fontello-771c82e0/demo.html create mode 100644 src/assets/fonts/fontello-771c82e0/font/fontello.eot create mode 100644 src/assets/fonts/fontello-771c82e0/font/fontello.svg create mode 100644 src/assets/fonts/fontello-771c82e0/font/fontello.ttf create mode 100644 src/assets/fonts/fontello-771c82e0/font/fontello.woff create mode 100644 src/assets/fonts/fontello-771c82e0/font/fontello.woff2 create mode 100644 src/assets/scss/_base.scss create mode 100644 src/assets/scss/_mixins.scss create mode 100644 src/assets/scss/_pages.scss create mode 100644 src/assets/scss/_variables.scss create mode 100644 src/assets/scss/base/_generic.scss create mode 100644 src/assets/scss/base/_highlight.scss create mode 100644 src/assets/scss/base/_normalize.scss create mode 100644 src/assets/scss/init.scss create mode 100644 src/assets/scss/mixins/_breakpoints.scss create mode 100644 src/assets/scss/mixins/_line-height.scss create mode 100644 src/assets/scss/mixins/_margin.scss create mode 100644 src/assets/scss/mixins/_padding.scss create mode 100644 src/assets/scss/pages/_categories.scss create mode 100644 src/assets/scss/pages/_tags.scss create mode 100644 src/components/CategoryTemplateDetails/index.jsx create mode 100644 src/components/Links/index.jsx create mode 100644 src/components/Links/style.scss create mode 100644 src/components/Menu/index.jsx create mode 100644 src/components/Menu/style.scss create mode 100644 src/components/PageTemplateDetails/index.jsx create mode 100644 src/components/PageTemplateDetails/style.scss create mode 100644 src/components/Post/index.jsx create mode 100644 src/components/Post/style.scss create mode 100644 src/components/PostTemplateDetails/index.jsx create mode 100644 src/components/PostTemplateDetails/style.scss create mode 100644 src/components/Sidebar/index.jsx create mode 100644 src/components/Sidebar/style.scss create mode 100644 src/components/TagTemplateDetails/index.jsx create mode 100644 src/html.js create mode 100644 src/layouts/index.jsx create mode 100644 src/pages/404.jsx create mode 100644 src/pages/articles/2016-01-09---Perfecting-the-Art-of-Perfection/1.jpg create mode 100644 src/pages/articles/2016-01-09---Perfecting-the-Art-of-Perfection/index.md create mode 100644 src/pages/articles/2016-01-12---The-Origins-of-Social-Stationery-Lettering/1.jpg create mode 100644 src/pages/articles/2016-01-12---The-Origins-of-Social-Stationery-Lettering/index.md create mode 100644 src/pages/articles/2016-02-02---A-Brief-History-of-Typography/1.jpg create mode 100644 src/pages/articles/2016-02-02---A-Brief-History-of-Typography/index.md rename {pages/articles/2015-05-01-hello-world => src/pages/articles/2017-18-08---The-Birth-of-Movable-Type}/Gutenberg.jpg (100%) rename {pages/articles/2015-05-01-hello-world => src/pages/articles/2017-18-08---The-Birth-of-Movable-Type}/Printing-press.png (100%) rename {pages/articles/2015-05-01-hello-world => src/pages/articles/2017-18-08---The-Birth-of-Movable-Type}/index.md (82%) rename {pages/articles/2015-05-01-hello-world => src/pages/articles/2017-18-08---The-Birth-of-Movable-Type}/movable-type.jpg (100%) create mode 100644 src/pages/articles/2017-19-08---Humane-Typography-in-the-Digital-Age/42-line-bible.jpg create mode 100644 src/pages/articles/2017-19-08---Humane-Typography-in-the-Digital-Age/index.md create mode 100644 src/pages/articles/2017-19-08---Humane-Typography-in-the-Digital-Age/type-through-time.jpg create mode 100644 src/pages/categories.jsx create mode 100644 src/pages/index.jsx create mode 100644 src/pages/pages/2015-05-01---about/1.jpg create mode 100644 src/pages/pages/2015-05-01---about/index.md create mode 100644 src/pages/pages/2015-05-01---contact/1.jpg create mode 100644 src/pages/pages/2015-05-01---contact/index.md rename {pages => src/pages}/photo.jpg (100%) create mode 100644 src/pages/tags.jsx create mode 100644 src/templates/category-template.js create mode 100644 src/templates/page-template.js create mode 100644 src/templates/post-template.js create mode 100644 src/templates/tag-template.js delete mode 100644 static/css/base.css delete mode 100644 static/css/highlight.css delete mode 100644 static/css/reset.css delete mode 100644 static/css/typography.css delete mode 100644 static/fonts/fontawesome/FontAwesome.otf delete mode 100644 static/fonts/fontawesome/fontawesome-webfont.eot delete mode 100644 static/fonts/fontawesome/fontawesome-webfont.svg delete mode 100644 static/fonts/fontawesome/fontawesome-webfont.ttf delete mode 100644 static/fonts/fontawesome/fontawesome-webfont.woff delete mode 100644 static/fonts/fontawesome/fontawesome-webfont.woff2 delete mode 100644 static/fonts/fontawesome/style.css delete mode 100644 wrappers/md.jsx diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..21ae4fd --- /dev/null +++ b/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ['react', 'es2015', 'stage-1'], + "plugins": ['add-module-exports'] +} \ No newline at end of file diff --git a/browserslist b/.browserslistrc similarity index 61% rename from browserslist rename to .browserslistrc index 10b76d2..ba7dc9e 100644 --- a/browserslist +++ b/.browserslistrc @@ -1,4 +1,5 @@ # Browsers that we support > 1% -Last 2 versions \ No newline at end of file +Last 2 versions +IE 10 \ No newline at end of file diff --git a/.eslintrc b/.eslintrc index 8edd7ed..5210e5c 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,10 +1,14 @@ { + "parser": "babel-eslint", "extends": "airbnb", "plugins": [ "react", "jsx-a11y", "import" ], + "globals": { + "graphql": true + }, "rules": { "global-require": [0], "react/jsx-filename-extension": [0], @@ -13,7 +17,10 @@ "react/forbid-prop-types": [0], /* to allow importing 'gatsby-helpers' */ "import/no-extraneous-dependencies": [0], + "comma-dangle": ["error", {"functions": "ignore"}], + "arrow-body-style": ["error", "as-needed", { "requireReturnForObjectLiteral": true }], "import/no-unresolved": [0], - "import/extensions": [0] + "import/extensions": [0], + "no-console": "off" } -} +} \ No newline at end of file diff --git a/.gitattributes b/.gitattributes index 1738f75..b8b7606 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,3 @@ $ cat .gitattributes -*.js linguist-language=JavaScript -**/*.js linguist-language=JavaScript -static/css/*.css linguist-vendored \ No newline at end of file +public linguist-vendored +src/assets/fonts linguist-vendored \ No newline at end of file diff --git a/.gitignore b/.gitignore index d5769d3..c39068a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,8 @@ node_modules/ +.cache/ +public/ npm-debug.log - .eslintcache - -public - .gatsby-context.js -pages/.manifest .idea gatsby-starter-lumen.iml \ No newline at end of file diff --git a/README.md b/README.md index 4c41823..68999dc 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,86 @@ +[![Gatsby Version](https://img.shields.io/badge/gatsby-1.8.12-744C9E.svg)](https://github.com/gatsbyjs/gatsby) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/alxshelepenok/gatsby-starter-lumen/master/LICENSE) [![Twitter](https://img.shields.io/twitter/url/https/github.com/alxshelepenok/gatsby-starter-lumen.svg?style=social)](https://twitter.com/intent/tweet?text=Wow:&url=https://github.com/alxshelepenok/gatsby-starter-lumen) + # Lumen -[Gatsby](https://github.com/gatsbyjs/gatsby) starter for creating a blog. +Lumen is a minimal, lightweight and mobile-first starter for creating blogs uses [Gatsby](https://github.com/gatsbyjs/gatsby). ## Features -+ Clean and extensible code. + Lost Grid ([peterramsing/lost](https://github.com/peterramsing/lost)). -+ Beautiful Typography ([matejlatin/Gutenberg](https://github.com/matejlatin/Gutenberg)). ++ Beautiful typography inspired by [matejlatin/Gutenberg](https://github.com/matejlatin/Gutenberg). ++ [Mobile-First](https://medium.com/@mrmrs_/mobile-first-css-48bc4cc3f60f) approach in development. ++ Stylesheet built using SASS and [BEM](http://getbem.com/naming/)-Style naming. ++ Syntax highlighting in code blocks. ++ Sidebar menu built using a configuration block. ++ Archive organized by tags and categories. ++ Automatic RSS generation. ++ Automatic Sitemap generation. ++ Offline support. ++ Google Analitics support. -## Installing +## Folder Structure + +``` +└── src + ├── assets + │   ├── fonts + │   │   └── fontello-771c82e0 + │   │   ├── css + │   │   └── font + │   └── scss + │   ├── base + │   ├── mixins + │   └── pages + ├── components + │   ├── CategoryTemplateDetails + │   ├── Links + │   ├── Menu + │   ├── PageTemplateDetails + │   ├── Post + │   ├── PostTemplateDetails + │   ├── Sidebar + │   └── TagTemplateDetails + ├── layouts + ├── pages + │   ├── articles + │   │   ├── 2016-01-09---Perfecting-the-Art-of-Perfection + │   │   ├── 2016-01-12---The-Origins-of-Social-Stationery-Lettering + │   │   ├── 2016-02-02---A-Brief-History-of-Typography + │   │   ├── 2017-18-08---The-Birth-of-Movable-Type + │   │   └── 2017-19-08---Humane-Typography-in-the-Digital-Age + │   └── pages + │   ├── 2015-05-01---about + │   └── 2015-05-01---contact + └── templates +``` + +## Getting Started Install this starter (assuming Gatsby is installed) by running from your CLI: -`gatsby new lumen https://github.com/wpioneer/gatsby-starter-lumen` +`gatsby new lumen https://github.com/alxshelepenok/gatsby-starter-lumen` -## Running in development +#### Running in Development `gatsby develop` +#### Building +`gatsby build` + +## Screenshot + ![](http://i.imgur.com/422y5GV.png) ## Ports - [Statinamic port](https://github.com/thangngoc89/statinamic-theme-lumen) by [Khoa Nguyen](https://github.com/thangngoc89) +## Contributors + +[alxshelepenok](https://github.com/alxshelepenok) |[abisz](https://github.com/abisz) |[ihororlovskyi](https://github.com/ihororlovskyi) |[vinnymac](https://github.com/vinnymac) |[axelclark](https://github.com/axelclark) |[concreted](https://github.com/concreted) | +:---: |:---: |:---: |:---: |:---: |:---: | +[alxshelepenok](https://github.com/alxshelepenok) |[abisz](https://github.com/abisz) |[ihororlovskyi](https://github.com/ihororlovskyi) |[vinnymac](https://github.com/vinnymac) |[axelclark](https://github.com/axelclark) |[concreted](https://github.com/concreted) | + +[charandas](https://github.com/charandas) |[zollillo](https://github.com/zollillo) |[swapnilmishra](https://github.com/swapnilmishra) | +:---: |:---: |:---: | +[charandas](https://github.com/charandas) |[zollillo](https://github.com/zollillo) |[swapnilmishra](https://github.com/swapnilmishra) | + + ## License The MIT License (MIT) diff --git a/components/ReadNext/index.jsx b/components/ReadNext/index.jsx deleted file mode 100644 index 21deaef..0000000 --- a/components/ReadNext/index.jsx +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router'; -import { include as includes } from 'underscore.string'; -import find from 'lodash/find'; - -import './style.css'; - -class ReadNext extends React.Component { - render() { - const { post } = this.props; - const { pages } = this.props.route; - const { readNext } = post; - - let nextPost; - if (readNext) { - nextPost = find(pages, page => includes(page.path, readNext)); - } - if (!nextPost) { - return React.createElement('noscript', null); - } - - nextPost = find(pages, page => includes(page.path, readNext.slice(1, -1))); - const description = nextPost.data.description; - - return ( -
-
READ THIS NEXT:
-

- - {nextPost.data.title} - -

-

- {description} -

-
- ); - } -} - -ReadNext.propTypes = { - post: React.PropTypes.object.isRequired, - pages: React.PropTypes.array, - route: React.PropTypes.object, -}; - -export default ReadNext; - diff --git a/components/ReadNext/style.css b/components/ReadNext/style.css deleted file mode 100644 index a3e7ead..0000000 --- a/components/ReadNext/style.css +++ /dev/null @@ -1,4 +0,0 @@ -.description { - font-size: responsive 12px 14px; - line-height: 1.6; -} \ No newline at end of file diff --git a/components/SiteLinks/index.jsx b/components/SiteLinks/index.jsx deleted file mode 100644 index cd56af1..0000000 --- a/components/SiteLinks/index.jsx +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react'; -import { config } from 'config'; -import './style.css'; -import '../../static/fonts/fontawesome/style.css'; - -class SiteLinks extends React.Component { - render() { - return ( -
- -
    - {config.siteEmailUrl && ( -
  • - - - -
  • - )} - {config.siteTelegramUrl && ( -
  • - - - -
  • - )} -
-
    - {config.siteRssUrl && ( -
  • - -
  • - )} -
-
- ); - } -} - -export default SiteLinks; diff --git a/components/SiteLinks/style.css b/components/SiteLinks/style.css deleted file mode 100644 index 99de057..0000000 --- a/components/SiteLinks/style.css +++ /dev/null @@ -1,32 +0,0 @@ -.blog-links { - margin-top: 30px; -} -.blog-links ul { - list-style: none; - padding: 0; - margin: 10px 0; - clear: fix-legacy; -} -.blog-links ul > li { - float: left; - margin-right: 5px; - text-align: center; - height: 24px; - width: 24px; - border-radius: 3px; - background: #f4f4f4; -} -.blog-links ul > li:hover { - background: #f4f4f4; -} -.blog-links ul > li > a { - border-bottom: 0; -} -.blog-links ul > li > a > i { - color: #606060; - font-size: 14px; - line-height: 24px; -} -.blog-links ul > li:hover a > i { - color: #444; -} \ No newline at end of file diff --git a/components/SiteNav/index.jsx b/components/SiteNav/index.jsx deleted file mode 100644 index be7ffd8..0000000 --- a/components/SiteNav/index.jsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router'; -import { prefixLink } from 'gatsby-helpers'; -import './style.css'; - -class SiteNav extends React.Component { - render() { - return ( - - ); - } -} - -export default SiteNav; diff --git a/components/SiteNav/style.css b/components/SiteNav/style.css deleted file mode 100644 index 62e173e..0000000 --- a/components/SiteNav/style.css +++ /dev/null @@ -1,24 +0,0 @@ -.blog-nav { - margin: 20px 0px 10px; -} -.blog-nav ul { - list-style: none; - padding-left: 0; -} -.blog-nav ul li { - margin: 10px 0 10px; -} -.blog-nav ul li a { - font-size: 16px; - line-height: 26px; - margin-bottom: 26px; - border-bottom: 0; - font-weight: 400; - color: #222; -} -.blog-nav ul li a.current { - border-bottom: 1px solid; -} -.blog-nav ul li a:hover { - border-bottom: 1px solid; -} diff --git a/components/SitePage/index.jsx b/components/SitePage/index.jsx deleted file mode 100644 index b58e1ad..0000000 --- a/components/SitePage/index.jsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import SiteSidebar from '../SiteSidebar'; -import './style.css'; - -class SitePage extends React.Component { - render() { - const { route } = this.props; - const post = route.page.data; - - return ( -
- -
-
-
-
-
-

{post.title}

-
-
-
-
-
-
-
- ); - } -} - -SitePage.propTypes = { - route: React.PropTypes.object.isRequired, -}; - -export default SitePage; diff --git a/components/SitePage/style.css b/components/SitePage/style.css deleted file mode 100644 index 7107e8c..0000000 --- a/components/SitePage/style.css +++ /dev/null @@ -1,17 +0,0 @@ -.blog-page { - margin-bottom: 40px; -} -.blog-page h1 { - font-size: responsive 20px 36px; - margin-top: 0; -} -.blog-page p { - font-size: 16px; - line-height: 26px; - margin-bottom: 26px; -} -@media (max-width:900px) { - .blog-single .text, .blog-single .footer { - padding: 0 15px; - } -} \ No newline at end of file diff --git a/components/SitePost/index.jsx b/components/SitePost/index.jsx deleted file mode 100644 index c92aec7..0000000 --- a/components/SitePost/index.jsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from 'react'; -import moment from 'moment'; -import { Link } from 'react-router'; -import { prefixLink } from 'gatsby-helpers'; -import { config } from 'config'; -import ReadNext from '../ReadNext'; -import './style.css'; -import '../../static/css/highlight.css'; - -class SitePost extends React.Component { - render() { - const { route } = this.props; - const post = route.page.data; - const home = ( -
- All Articles -
- ); - - return ( -
- {home} -
-
-

{post.title}

-
-
- Published {moment(post.date).format('D MMM YYYY')} -
-
-
- -
-

- {config.siteDescr} - -
{config.siteAuthor} on Twitter -
-

-
-
-
- ); - } -} - -SitePost.propTypes = { - route: React.PropTypes.object.isRequired, -}; - -export default SitePost; diff --git a/components/SitePost/style.css b/components/SitePost/style.css deleted file mode 100644 index 5e54d55..0000000 --- a/components/SitePost/style.css +++ /dev/null @@ -1,109 +0,0 @@ -.blog-post { - margin-bottom: 30px; -} -.blog-post:last-child { - margin-bottom: 10px; -} -.blog-post h2 { - margin-top: 10px; - line-height: 30px; - margin-bottom: 20px; -} -.blog-post h2 a { - color: #222; -} -.blog-post h2 a:hover, -.blog-post h2 a:focus { - border-bottom: 1px solid; -} -.blog-post p { - font-size: 16px; - line-height: 26px; - margin-bottom: 26px; -} -.blog-post time { - font-size: 14px; - color: #222; - font-weight: 500; - text-transform: uppercase; -} -.blog-post .blog-category { - font-size: 14px; - color: #f7a046; - font-weight: 500; - text-transform: uppercase; -} -.blog-post .readmore { - font-size: 16px; - color: #5d93ff; -} -.blog-post .readmore:hover { - border-bottom: 1px solid; -} -.blog-single { - max-width: 945px; - margin-left: auto; - margin-right: auto; -} -.blog-single h1 { - text-align: center; - margin-top: 30px; -} -.blog-single .text { - line-height: 31px; - margin-bottom: 31px; -} -.blog-single h1, .blog-single .date-published, .blog-single .text *:not(div) { - max-width: 630px; - margin-left: auto; - margin-right: auto; -} -.blog-single .text img { - max-width: 100%; - height: auto; -} -.blog-single .footer { - max-width: 630px; - margin-left: auto; - margin-right: auto; - line-height: 31px; - margin-bottom: 31px; -} -.gohome { - position: fixed; - left: 20px; - font-size: 16px; - text-align: center; - padding: 8px 16px; - color: #999; - background: #f4f4f4; - font-weight: 400; - border-radius: 3px; -} -.gohome:focus { - color: #444; - background: #f4f4f4; - border: 0; -} -.gohome:hover { - color: #444; - background: #f4f4f4; - border: 0; -} -@media (max-width:900px) { - .blog-single h1 { - margin-top: 15px; - } - .blog-single .text, .blog-single .footer { - padding: 0 15px; - line-height: 26px; - margin-bottom: 26px; - } - .gohome { - position: static; - margin: 20px auto 0; - text-align: center; - width: 85px; - display: block; - } -} \ No newline at end of file diff --git a/components/SiteSidebar/index.jsx b/components/SiteSidebar/index.jsx deleted file mode 100644 index 5726111..0000000 --- a/components/SiteSidebar/index.jsx +++ /dev/null @@ -1,64 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router'; -import { prefixLink } from 'gatsby-helpers'; -import { config } from 'config'; -import SiteNav from '../SiteNav'; -import SiteLinks from '../SiteLinks'; -import './style.css'; -import profilePic from '../../pages/photo.jpg'; - -class SiteSidebar extends React.Component { - render() { - const { location } = this.props; - const isHome = location.pathname === prefixLink('/'); - - /* eslint-disable jsx-a11y/img-redundant-alt*/ - const header = ( -
- - Profile picture of the author - - { isHome ? ( -

{config.siteAuthor}

- ) : -

{config.siteAuthor}

} -

- {config.siteDescr} -

-
- ); - /* eslint-enable jsx-a11y/img-redundant-alt*/ - - return ( -
-
-
-
- {header} -
-
-
- -
- -

- © All rights reserved. -

-
-
-
-
- ); - } -} - -SiteSidebar.propTypes = { - location: React.PropTypes.object, -}; - -export default SiteSidebar; - diff --git a/components/SiteSidebar/style.css b/components/SiteSidebar/style.css deleted file mode 100644 index ada9676..0000000 --- a/components/SiteSidebar/style.css +++ /dev/null @@ -1,67 +0,0 @@ -.sidebar { - lost-column: 1/3; -} -.sidebar .sidebar-inner { - position: relative; - padding: 40px; -} -.sidebar .sidebar-inner:after { - background: #eee; - background: linear-gradient(to bottom, #eee 0%, #eee 48%, #fff 100%); - position: absolute; - content: ''; - width: 1px; - height: 540px; - top: 30px; - right: -10px; - bottom: 0; -} -.sidebar .sidebar-inner img { - display: inline-block; - margin-bottom: 0; - border-radius: 50%; - background-clip: padding-box; -} -.sidebar .sidebar-inner h1, .sidebar .sidebar-inner h2 { - font-size: 18px; - font-weight: 500; - line-height: 18px; - margin: 20px 0 10px; -} -.sidebar .sidebar-inner p { - color: #888; - font-size: 16px; - line-height: 26px; - margin-bottom: 26px; -} -.sidebar .sidebar-inner p.copyright { - color: #b6b6b6; - font-size: 14px; -} -@media (max-width:1100px) { - .sidebar .sidebar-inner { - padding: 35px 20px 0; - } - .sidebar { - lost-column: 1/2; - } -} -@media (max-width:900px) { - .sidebar { - lost-column: 5/12; - } - .sidebar .sidebar-inner { - padding: 30px 20px 0; - } -} -@media (max-width:500px) { - .sidebar { - lost-column: 1; - } - .sidebar .sidebar-inner { - padding: 25px 20px 0; - } - .sidebar .sidebar-inner:after { - display: none; - } -} \ No newline at end of file diff --git a/config.toml b/config.toml deleted file mode 100644 index c4aaeeb..0000000 --- a/config.toml +++ /dev/null @@ -1,14 +0,0 @@ -siteTitle = "Blog by John Doe" -siteDescr = "Lorem Ipsum is simply dummy text of the printing and typesetting industry." -siteAuthor = "John Doe" - -siteTelegramUrl = "#" -siteTwitterUrl = "#" -siteGithubUrl = "#" -siteEmailUrl = "#" -siteRssUrl = "#" -siteVkUrl = "#" - -googleAnalyticsId = "" - -linkPrefix = "/gatsby-starter-lumen" \ No newline at end of file diff --git a/gatsby-browser.js b/gatsby-browser.js deleted file mode 100644 index e5fdf07..0000000 --- a/gatsby-browser.js +++ /dev/null @@ -1,8 +0,0 @@ -import ReactGA from 'react-ga'; -import { config } from 'config'; - -ReactGA.initialize(config.googleAnalyticsId); - -exports.onRouteUpdate = (state) => { - ReactGA.pageview(state.pathname); -}; diff --git a/gatsby-config.js b/gatsby-config.js new file mode 100644 index 0000000..2923f5d --- /dev/null +++ b/gatsby-config.js @@ -0,0 +1,165 @@ +module.exports = { + siteMetadata: { + url: 'https://alxshelepenok.github.com/gatsby-starter-lumen', + title: 'Blog by John Doe', + subtitle: 'Pellentesque odio nisi, euismod in, pharetra a, ultricies in, diam. Sed arcu.', + copyright: '© All rights reserved.', + menu: [ + { + label: 'Articles', + path: '/' + }, + { + label: 'About me', + path: '/about/' + }, + { + label: 'Contact me', + path: '/contact/' + } + ], + author: { + name: 'John Doe', + email: '#', + telegram: '#', + twitter: '#', + github: '#', + rss: '#', + vk: '#' + } + }, + plugins: [ + { + resolve: 'gatsby-source-filesystem', + options: { + path: `${__dirname}/src/pages`, + name: 'pages' + } + }, + { + resolve: 'gatsby-plugin-feed', + options: { + query: ` + { + site { + siteMetadata { + url + title + subtitle + } + } + } + `, + feeds: [ + { + serialize: ({ query: { site, allMarkdownRemark } }) => ( + allMarkdownRemark.edges.map(edge => + Object.assign({}, edge.node.frontmatter, { + description: edge.node.frontmatter.description, + date: edge.node.frontmatter.date, + url: site.siteMetadata.url + edge.node.fields.slug, + guid: site.siteMetadata.url + edge.node.fields.slug, + custom_elements: [{ 'content:encoded': edge.node.html }] + }) + ) + ), + query: ` + { + allMarkdownRemark( + limit: 1000, + sort: { order: DESC, fields: [frontmatter___date] }, + filter: { frontmatter: { layout: { eq: "post" }, draft: { ne: true } } } + ) { + edges { + node { + html + fields { + slug + } + frontmatter { + title + date + layout + draft + description + } + } + } + } + } + `, + output: '/rss.xml' + } + ] + } + }, + { + resolve: 'gatsby-transformer-remark', + options: { + plugins: [ + { + resolve: 'gatsby-remark-images', + options: { + maxWidth: 960, + linkImagesToOriginal: false + } + }, + { + resolve: 'gatsby-remark-responsive-iframe', + options: { + wrapperStyle: 'margin-bottom: 1.0725rem' + } + }, + 'gatsby-remark-prismjs', + 'gatsby-remark-copy-linked-files', + 'gatsby-remark-smartypants' + ] + } + }, + 'gatsby-transformer-sharp', + 'gatsby-plugin-sharp', + { + resolve: 'gatsby-plugin-google-analytics', + options: { + trackingId: '' + } + }, + { + resolve: 'gatsby-plugin-sitemap', + options: { + query: ` + { + site { + siteMetadata { + url + } + } + allSitePage( + filter: { + path: { regex: "/^(?!/404/|/404.html|/dev-404-page/)/" } + } + ) { + edges { + node { + path + } + } + } + }`, + output: '/sitemap.xml', + serialize: ({ site, allSitePage }) => + allSitePage.edges.map((edge) => { + return { + url: site.siteMetadata.url + edge.node.path, + changefreq: 'daily', + priority: 0.7 + }; + }) + } + }, + 'gatsby-plugin-offline', + 'gatsby-plugin-catch-links', + 'gatsby-plugin-react-helmet', + 'gatsby-plugin-postcss-sass' + ] +}; diff --git a/gatsby-node.js b/gatsby-node.js index 0e71008..ff4b130 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -1,22 +1,203 @@ -const rucksack = require('rucksack-css'); +const _ = require('lodash'); +const Promise = require('bluebird'); +const path = require('path'); const lost = require('lost'); -const cssnext = require('postcss-cssnext'); +const pxtorem = require('postcss-pxtorem'); +const slash = require('slash'); -exports.modifyWebpackConfig = function (config) { +exports.createPages = ({ graphql, boundActionCreators }) => { + const { createPage } = boundActionCreators; + + return new Promise((resolve, reject) => { + const postTemplate = path.resolve('./src/templates/post-template.js'); + const pageTemplate = path.resolve('./src/templates/page-template.js'); + const tagTemplate = path.resolve('./src/templates/tag-template.js'); + const categoryTemplate = path.resolve('./src/templates/category-template.js'); + + graphql( + ` + { + allMarkdownRemark( + limit: 1000, + filter: { frontmatter: { layout: { eq: "post" }, draft: { ne: true } } }, + ) { + edges { + node { + fields { + slug + } + frontmatter { + tags + category + } + } + } + } + } + ` + ).then((result) => { + if (result.errors) { + console.log(result.errors); + reject(result.errors); + } + + _.each(result.data.allMarkdownRemark.edges, (edge) => { + createPage({ + path: edge.node.fields.slug, + component: slash(postTemplate), + context: { + slug: edge.node.fields.slug + } + }); + }); + + let tags = []; + _.each(result.data.allMarkdownRemark.edges, (edge) => { + if (_.get(edge, 'node.frontmatter.tags')) { + tags = tags.concat(edge.node.frontmatter.tags); + } + }); + tags = _.uniq(tags); + _.each(tags, (tag) => { + const tagPath = `/tags/${_.kebabCase(tag)}/`; + createPage({ + path: tagPath, + component: tagTemplate, + context: { + tag + } + }); + }); + + let categories = []; + _.each(result.data.allMarkdownRemark.edges, (edge) => { + if (_.get(edge, 'node.frontmatter.category')) { + categories = categories.concat(edge.node.frontmatter.category); + } + }); + categories = _.uniq(categories); + _.each(categories, (category) => { + const categoryPath = `/categories/${_.kebabCase(category)}/`; + createPage({ + path: categoryPath, + component: categoryTemplate, + context: { + category + } + }); + }); + + resolve(); + }); + + graphql( + ` + { + allMarkdownRemark( + limit: 1000, + filter: { frontmatter: { layout: { eq: "page" }, draft: { ne: true } } }, + ) { + edges { + node { + fields { + slug + } + frontmatter { + path + } + } + } + } + } + ` + ).then((result) => { + if (result.errors) { + console.log(result.errors); + reject(result.errors); + } + + _.each(result.data.allMarkdownRemark.edges, (edge) => { + createPage({ + path: edge.node.fields.slug, + component: slash(pageTemplate), + context: { + slug: edge.node.fields.slug + } + }); + }); + + resolve(); + }); + }); +}; + +exports.onCreateNode = ({ node, boundActionCreators, getNode }) => { + const { createNodeField } = boundActionCreators; + + if (node.internal.type === 'File') { + const parsedFilePath = path.parse(node.absolutePath); + const slug = `/${parsedFilePath.dir.split('---')[1]}/`; + createNodeField({ node, name: 'slug', value: slug }); + } else if ( + node.internal.type === 'MarkdownRemark' && + typeof node.slug === 'undefined' + ) { + const fileNode = getNode(node.parent); + let slug = fileNode.fields.slug; + if (typeof node.frontmatter.path !== 'undefined') { + slug = node.frontmatter.path; + } + createNodeField({ + node, + name: 'slug', + value: slug + }); + + if (typeof node.frontmatter.tags !== 'undefined') { + const tagSlugs = node.frontmatter.tags.map( + tag => `/tags/${_.kebabCase(tag)}/` + ); + createNodeField({ node, name: 'tagSlugs', value: tagSlugs }); + } + + if (typeof node.frontmatter.category !== 'undefined') { + const categorySlug = `/categories/${_.kebabCase(node.frontmatter.category)}/`; + createNodeField({ node, name: 'categorySlug', value: categorySlug }); + } + } +}; + +exports.modifyWebpackConfig = ({ config }) => { config.merge({ postcss: [ lost(), - rucksack(), - cssnext({ - browsers: ['>1%', 'last 2 versions'], - }), - ], + pxtorem({ + rootValue: 16, + unitPrecision: 5, + propList: [ + 'font', + 'font-size', + 'line-height', + 'letter-spacing', + 'margin', + 'margin-top', + 'margin-left', + 'margin-bottom', + 'margin-right', + 'padding', + 'padding-top', + 'padding-left', + 'padding-bottom', + 'padding-right', + 'border-radius', + 'width', + 'max-width' + ], + selectorBlackList: [], + replace: true, + mediaQuery: false, + minPixelValue: 0 + }) + ] }); - - config.loader('svg', { - test: /\.(svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, - loader: 'file-loader', - }); - - return config; }; diff --git a/html.js b/html.js deleted file mode 100644 index e9bec80..0000000 --- a/html.js +++ /dev/null @@ -1,39 +0,0 @@ -import React from 'react'; -import Helmet from 'react-helmet'; -import { prefixLink } from 'gatsby-helpers'; - -const BUILD_TIME = new Date().getTime(); - -module.exports = React.createClass({ - displayName: 'HTML', - propTypes: { - body: React.PropTypes.string, - }, - render() { - const { body } = this.props; - const { title } = Helmet.rewind(); - const font = ; - let css; - if (process.env.NODE_ENV === 'production') { - // eslint-disable-next-line import/no-webpack-loader-syntax - css = + + + + +
+

+ fontello + font demo +

+ +
+
+
+
icon-mail0xe800
+
icon-twitter0xf099
+
icon-facebook0xf09a
+
icon-rss0xf09e
+
+
+
icon-linkedin0xf0e1
+
icon-github0xf113
+
icon-stackoverflow0xf16c
+
icon-instagram0xf16d
+
+
+
icon-tumblr0xf173
+
icon-dribbble0xf17d
+
icon-skype0xf17e
+
icon-vkontakte0xf189
+
+
+
icon-slack0xf198
+
icon-paper-plane0xf1d8
+
icon-whatsapp0xf232
+
icon-odnoklassniki0xf263
+
+
+ + + \ No newline at end of file diff --git a/src/assets/fonts/fontello-771c82e0/font/fontello.eot b/src/assets/fonts/fontello-771c82e0/font/fontello.eot new file mode 100644 index 0000000000000000000000000000000000000000..ce63906892ba6ff4d9a5bc706655d867f005fbeb GIT binary patch literal 10268 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 KWh9CrLjErw*W%d# literal 0 HcmV?d00001 diff --git a/src/assets/fonts/fontello-771c82e0/font/fontello.svg b/src/assets/fonts/fontello-771c82e0/font/fontello.svg new file mode 100644 index 0000000..05e20b9 --- /dev/null +++ b/src/assets/fonts/fontello-771c82e0/font/fontello.svg @@ -0,0 +1,42 @@ + + + +Copyright (C) 2017 by original authors @ fontello.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/fonts/fontello-771c82e0/font/fontello.ttf b/src/assets/fonts/fontello-771c82e0/font/fontello.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cdebc64bf1116ec947209f5fb230ce3f616b7f05 GIT binary patch literal 10100 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/fontello-771c82e0/font/fontello.woff2 b/src/assets/fonts/fontello-771c82e0/font/fontello.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7e411fc3007e346d760dfee2461ca9c540373efc GIT binary patch literal 5696 zcmV-G7Qg9tPew8T0RR9102V+14*&oF04H<+02S!~0RR9100000000000000000000 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 code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #a67f59; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/src/assets/scss/base/_normalize.scss b/src/assets/scss/base/_normalize.scss new file mode 100644 index 0000000..21cd194 --- /dev/null +++ b/src/assets/scss/base/_normalize.scss @@ -0,0 +1,461 @@ +/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */ + +/** + * 1. Change the default font family in all browsers (opinionated). + * 2. Correct the line height in all browsers. + * 3. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + +/* Document + ========================================================================== */ + +html { + font-family: sans-serif; /* 1 */ + line-height: 1.15; /* 2 */ + -ms-text-size-adjust: 100%; /* 3 */ + -webkit-text-size-adjust: 100%; /* 3 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers (opinionated). + */ + +body { + margin: 0; +} + +/** + * Add the correct display in IE 9-. + */ + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in IE. + */ + +figcaption, +figure, +main { /* 1 */ + display: block; +} + +/** + * Add the correct margin in IE 8. + */ + +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + +a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ +} + +/** + * Remove the outline on focused links when they are also active or hovered + * in all browsers (opinionated). + */ + +a:active, +a:hover { + outline-width: 0; +} + +/** + * 1. Remove the bottom border in Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font style in Android 4.3-. + */ + +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ + +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ + +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + +button, +html [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 2 */ +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Change the border, margin, and padding in all browsers (opinionated). + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + */ + +details, /* 1 */ +menu { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Scripting + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ + +template { + display: none; +} + +/* Hidden + ========================================================================== */ + +/** + * Add the correct display in IE 10-. + */ + +[hidden] { + display: none; +} \ No newline at end of file diff --git a/src/assets/scss/init.scss b/src/assets/scss/init.scss new file mode 100644 index 0000000..23d512c --- /dev/null +++ b/src/assets/scss/init.scss @@ -0,0 +1,6 @@ +@charset "UTF-8"; + +@import "variables"; +@import "mixins"; +@import "base"; +@import "pages"; \ No newline at end of file diff --git a/src/assets/scss/mixins/_breakpoints.scss b/src/assets/scss/mixins/_breakpoints.scss new file mode 100644 index 0000000..f7909ed --- /dev/null +++ b/src/assets/scss/mixins/_breakpoints.scss @@ -0,0 +1,25 @@ +/** + * Breakpoints + */ + +@mixin breakpoint-xs { + @content; +} + +@mixin breakpoint-sm { + @media screen and (min-width: $layout-breakpoint-sm) { + @content; + } +} + +@mixin breakpoint-md { + @media screen and (min-width: $layout-breakpoint-md) { + @content; + } +} + +@mixin breakpoint-lg { + @media screen and (min-width: $layout-breakpoint-lg) { + @content + } +} diff --git a/src/assets/scss/mixins/_line-height.scss b/src/assets/scss/mixins/_line-height.scss new file mode 100644 index 0000000..24b3fe4 --- /dev/null +++ b/src/assets/scss/mixins/_line-height.scss @@ -0,0 +1,7 @@ +/** + * Line-Height + */ + +@mixin line-height($number) { + line-height: #{ $number * $typographic-leading + "px"}; +} diff --git a/src/assets/scss/mixins/_margin.scss b/src/assets/scss/mixins/_margin.scss new file mode 100644 index 0000000..fdc93f8 --- /dev/null +++ b/src/assets/scss/mixins/_margin.scss @@ -0,0 +1,23 @@ +/** + * Margin + */ + +@mixin margin-top($number) { + margin-top: #{ $number * $typographic-leading + "px"}; +} + +@mixin margin-bottom($number) { + margin-bottom: #{ $number * $typographic-leading + "px"}; +} + +@mixin margin($top, $right, $bottom:null, $left:null) { + @if $left==null and $bottom==null { + margin: #{ $top * $typographic-leading + "px"} #{ $right * $typographic-leading + "px"}; + } + @else if $left==null or $left==$right { + margin: #{ $top * $typographic-leading + "px"} #{ $right * $typographic-leading + "px"} #{ $bottom * $typographic-leading + "px"}; + } + @else { + margin: #{ $top * $typographic-leading + "px"} #{ $right * $typographic-leading + "px"} #{ $bottom * $typographic-leading + "px"} #{ $left * $typographic-leading + "px"}; + } +} diff --git a/src/assets/scss/mixins/_padding.scss b/src/assets/scss/mixins/_padding.scss new file mode 100644 index 0000000..77858e4 --- /dev/null +++ b/src/assets/scss/mixins/_padding.scss @@ -0,0 +1,19 @@ +/** + * Padding + */ + +@mixin padding($top, $right, $bottom:null, $left:null) { + @if $left==null and $bottom==null { + padding: #{ $top * $typographic-leading + "px"} #{ $right * $typographic-leading + "px"}; + } + @else if $left==null or $left==$right { + padding: #{ $top * $typographic-leading + "px"} #{ $right * $typographic-leading + "px"} #{ $bottom * $typographic-leading + "px"}; + } + @else { + padding: #{ $top * $typographic-leading + "px"} #{ $right * $typographic-leading + "px"} #{ $bottom * $typographic-leading + "px"} #{ $left * $typographic-leading + "px"}; + } +} + +@mixin padding-equal($number) { + padding: #{ $number * $typographic-leading + "px"}; +} diff --git a/src/assets/scss/pages/_categories.scss b/src/assets/scss/pages/_categories.scss new file mode 100644 index 0000000..f919ae4 --- /dev/null +++ b/src/assets/scss/pages/_categories.scss @@ -0,0 +1,18 @@ +/** + * Categories + */ + +.categories { + &__list { + &-item { + &-link { + color: $color-base; + &:hover, + &:focus { + color: $color-primary; + border-bottom: 1px solid $color-primary; + } + } + } + } +} diff --git a/src/assets/scss/pages/_tags.scss b/src/assets/scss/pages/_tags.scss new file mode 100644 index 0000000..e1ceb21 --- /dev/null +++ b/src/assets/scss/pages/_tags.scss @@ -0,0 +1,18 @@ +/** + * Tags + */ + +.tags { + &__list { + &-item { + &-link { + color: $color-base; + &:hover, + &:focus { + color: $color-primary; + border-bottom: 1px solid $color-primary; + } + } + } + } +} diff --git a/src/components/CategoryTemplateDetails/index.jsx b/src/components/CategoryTemplateDetails/index.jsx new file mode 100644 index 0000000..8fc7d98 --- /dev/null +++ b/src/components/CategoryTemplateDetails/index.jsx @@ -0,0 +1,44 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Post from '../Post'; + +class CategoryTemplateDetails extends React.Component { + render() { + const items = []; + const category = this.props.pathContext.category; + const posts = this.props.data.allMarkdownRemark.edges; + posts.forEach((post) => { + items.push( + + ); + }); + + return ( +
+
+
+

+ {category} +

+
+ {items} +
+
+
+
+ ); + } +} + +CategoryTemplateDetails.propTypes = { + data: PropTypes.shape({ + allMarkdownRemark: PropTypes.shape({ + edges: PropTypes.array.isRequired + }) + }), + pathContext: PropTypes.shape({ + category: PropTypes.string.isRequired + }) +}; + +export default CategoryTemplateDetails; diff --git a/src/components/Links/index.jsx b/src/components/Links/index.jsx new file mode 100644 index 0000000..135a203 --- /dev/null +++ b/src/components/Links/index.jsx @@ -0,0 +1,65 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import './style.scss'; +import '../../assets/fonts/fontello-771c82e0/css/fontello.css'; + +class Links extends React.Component { + render() { + const author = this.props.data; + const links = { + telegram: author.telegram, + twitter: author.twitter, + github: author.github, + vk: author.vk, + rss: author.rss, + email: author.email + }; + + return ( +
+ + + +
+ ); + } +} + +Links.propTypes = { + data: PropTypes.object.isRequired +}; + +export default Links; diff --git a/src/components/Links/style.scss b/src/components/Links/style.scss new file mode 100644 index 0000000..6f2af32 --- /dev/null +++ b/src/components/Links/style.scss @@ -0,0 +1,35 @@ +@import "../../assets/scss/variables"; +@import "../../assets/scss/mixins"; + +.links { + @include margin-bottom(1); + &__list { + display: flex; + list-style: none; + padding: 0; + margin: 10px -3px; + &-item { + padding: 0; + margin: 0 3px; + height: 24px; + width: 24px; + line-height: 24px; + border-radius: 3px; + text-align: center; + background: $color-gray-bg; + & a { + border: 0; + & i { + font-size: 14px; + color: lighten($color-base, 20%); + } + &:hover, + &:focus { + & i { + color: $color-base; + } + } + } + } + } +} diff --git a/src/components/Menu/index.jsx b/src/components/Menu/index.jsx new file mode 100644 index 0000000..b2c4821 --- /dev/null +++ b/src/components/Menu/index.jsx @@ -0,0 +1,38 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Link from 'gatsby-link'; +import './style.scss'; + +class Menu extends React.Component { + render() { + const menu = this.props.data; + + const menuBlock = ( +
    + {menu.map(item => +
  • + + {item.label} + +
  • + )} +
+ ); + + return ( + + ); + } +} + +Menu.propTypes = { + data: PropTypes.array.isRequired +}; + +export default Menu; diff --git a/src/components/Menu/style.scss b/src/components/Menu/style.scss new file mode 100644 index 0000000..8c2efc8 --- /dev/null +++ b/src/components/Menu/style.scss @@ -0,0 +1,30 @@ +@import "../../assets/scss/variables"; +@import "../../assets/scss/mixins"; + +.menu { + @include margin-bottom(1); + &__list { + list-style: none; + padding: 0; + margin: 0; + &-item { + padding: 0; + margin: 10px 0; + &-link { + font-size: $typographic-base-font-size; + color: $typographic-base-font-color; + font-weight: 400; + border: 0; + &:hover, + &:focus { + color: $color-primary; + border-bottom: 1px solid $color-primary; + } + &--active { + color: $color-base; + border-bottom: 1px solid $color-base; + } + } + } + } +} diff --git a/src/components/PageTemplateDetails/index.jsx b/src/components/PageTemplateDetails/index.jsx new file mode 100644 index 0000000..0462720 --- /dev/null +++ b/src/components/PageTemplateDetails/index.jsx @@ -0,0 +1,32 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Sidebar from '../Sidebar'; +import './style.scss'; + +class PageTemplateDetails extends React.Component { + render() { + const page = this.props.data.markdownRemark; + + return ( +
+ +
+
+
+

{page.frontmatter.title}

+
+
+
+
+
+ ); + } +} + +PageTemplateDetails.propTypes = { + data: PropTypes.shape({ + markdownRemark: PropTypes.object.isRequired + }) +}; + +export default PageTemplateDetails; diff --git a/src/components/PageTemplateDetails/style.scss b/src/components/PageTemplateDetails/style.scss new file mode 100644 index 0000000..5b060f1 --- /dev/null +++ b/src/components/PageTemplateDetails/style.scss @@ -0,0 +1,18 @@ +@import "../../assets/scss/variables"; +@import "../../assets/scss/mixins"; + +.page { + @include margin-bottom(2); + &__title { + font-size: $typographic-base-font-size * 2.5; + font-weight: 500; + @include line-height(2); + @include margin-top(0); + @include margin-bottom(1.45); + } + &__body { + font-size: $typographic-base-font-size; + @include line-height(1); + @include margin(0, 0, 1); + } +} diff --git a/src/components/Post/index.jsx b/src/components/Post/index.jsx new file mode 100644 index 0000000..38ba166 --- /dev/null +++ b/src/components/Post/index.jsx @@ -0,0 +1,46 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Link from 'gatsby-link'; +import moment from 'moment'; +import './style.scss'; + +class Post extends React.Component { + render() { + const data = this.props.data; + const post = { + title: data.node.frontmatter.title, + slug: data.node.fields.slug, + description: data.node.frontmatter.description, + date: data.node.frontmatter.date, + category: data.node.frontmatter.category, + categorySlug: data.node.fields.categorySlug + }; + + return ( +
+
+ + + + + {post.category} + + +
+

+ {post.title} +

+

{post.description}

+ Read +
+ ); + } +} + +Post.propTypes = { + data: PropTypes.object.isRequired +}; + +export default Post; diff --git a/src/components/Post/style.scss b/src/components/Post/style.scss new file mode 100644 index 0000000..1819223 --- /dev/null +++ b/src/components/Post/style.scss @@ -0,0 +1,60 @@ +@import "../../assets/scss/variables"; +@import "../../assets/scss/mixins"; + +.post { + @include margin-bottom(1.25); + &:last-child { + @include margin-bottom(.5); + } + &__title { + font-size: $typographic-base-font-size * 1.6875; + @include line-height(1.5); + @include margin-top(0); + @include margin-bottom(.5); + &-link { + color: $color-base; + &:hover, + &:focus { + color: $color-base; + border-bottom: 1px solid $color-base; + } + } + } + &__description { + font-size: $typographic-base-font-size; + @include line-height(1); + @include margin-bottom(.75); + } + &__meta { + &-time { + font-size: $typographic-small-font-size; + color: $color-base; + font-weight: 500; + text-transform: uppercase; + } + &-divider { + margin: 0 5px; + } + &-category { + &-link { + font-size: $typographic-small-font-size; + color: $color-secondary; + font-weight: 500; + text-transform: uppercase; + &:hover, + &:focus { + color: $color-primary; + } + } + } + } + &__readmore { + font-size: $typographic-base-font-size; + color: $color-primary; + &:hover, + &:focus { + color: $color-primary; + border-bottom: 1px solid $color-primary; + } + } +} \ No newline at end of file diff --git a/src/components/PostTemplateDetails/index.jsx b/src/components/PostTemplateDetails/index.jsx new file mode 100644 index 0000000..6620951 --- /dev/null +++ b/src/components/PostTemplateDetails/index.jsx @@ -0,0 +1,72 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Link from 'gatsby-link'; +import moment from 'moment'; +import './style.scss'; + +class PostTemplateDetails extends React.Component { + render() { + const { subtitle, author } = this.props.data.site.siteMetadata; + const post = this.props.data.markdownRemark; + const tags = post.fields.tagSlugs; + + const homeBlock = ( +
+ All Articles +
+ ); + + const tagsBlock = ( +
+
    + {tags.map((tag, i) => +
  • + + {post.frontmatter.tags[i]} + +
  • + )} +
+
+ ); + + return ( +
+ {homeBlock} +
+
+

{post.frontmatter.title}

+
+
+ Published {moment(post.frontmatter.date).format('D MMM YYYY')} +
+
+
+ {tagsBlock} +
+

+ {subtitle} + +
{author.name} on Twitter +
+

+
+
+
+ ); + } +} + +PostTemplateDetails.propTypes = { + data: PropTypes.shape({ + site: PropTypes.shape({ + siteMetadata: PropTypes.shape({ + subtitle: PropTypes.string.isRequired, + author: PropTypes.object.isRequired + }) + }), + markdownRemark: PropTypes.object.isRequired + }) +}; + +export default PostTemplateDetails; diff --git a/src/components/PostTemplateDetails/style.scss b/src/components/PostTemplateDetails/style.scss new file mode 100644 index 0000000..b4ff5c9 --- /dev/null +++ b/src/components/PostTemplateDetails/style.scss @@ -0,0 +1,166 @@ +@import "../../assets/scss/variables"; +@import "../../assets/scss/mixins"; + +.post-single { + &__inner { + max-width: $layout-post-single-max-width; + padding: 0 15px; + margin: 0 auto; + } + &__title { + font-size: $typographic-base-font-size * 2; + max-width: $layout-post-single-width; + margin-left: auto; + margin-right: auto; + font-weight: 600; + text-align: center; + @include line-height(1.65); + @include margin-top(1); + @include margin-bottom(0); + } + &__body { + & figure { + @include margin-bottom(1); + & blockquote { + font-style: italic; + text-align: center; + margin-top: 0; + @include padding(1, 0); + & p { + max-width: $layout-post-single-width; + font-size: $typographic-base-font-size * 1.6817; + margin-top: 0; + @include margin-bottom(1); + @include line-height(1.5); + } + } + } + & a { + text-decoration: underline; + } + & .gatsby-highlight { + max-width: $layout-post-single-width; + margin-left: 15px; + margin-right: 15px; + @include margin-bottom(1); + } + & :not(div) { + max-width: $layout-post-single-width; + margin-left: auto; + margin-right: auto; + } + } + &__footer { + max-width: $layout-post-single-width; + margin-left: 15px; + margin-right: 15px; + @include line-height(1); + @include margin-top(1); + @include margin-bottom(2); + &-text { + & a { + text-decoration: underline; + } + } + } + &__date { + max-width: $layout-post-single-width; + margin-left: auto; + margin-right: auto; + } + &__tags { + @include margin-bottom(.5); + &-list { + list-style: none; + margin: 0 -5px; + padding: 0; + &-item { + display: inline-block; + margin: 10px 5px; + &-link { + background: $color-gray-bg; + text-decoration: none; + border: 0; + border-radius: 3px; + color: lighten($color-base, 20%); + line-height: $typographic-base-line-height; + padding: 8px 16px; + &:hover, + &:focus { + color: $color-base; + background: darken($color-gray-bg, 5%); + border: 0; + } + } + } + } + } + &__home-button { + display: block; + margin-left: auto; + margin-right: auto; + max-width: 90px; + font-size: $typographic-base-font-size; + padding: 0 16px; + height: 35px; + line-height: 35px; + text-align: center; + color: lighten($color-base, 20%); + background: $color-gray-bg; + font-weight: 400; + border-radius: 3px; + @include margin-top(1); + &:hover, + &:focus { + color: $color-base; + background: darken($color-gray-bg, 5%); + border: 0; + } + } +} + +@include breakpoint-sm { + .post-single { + &__footer { + margin-left: auto; + margin-right: auto; + } + &__body { + & .gatsby-highlight { + margin-left: auto; + margin-right: auto; + } + } + } +} + +@include breakpoint-md { + .post-single { + &__inner { + padding: 0; + } + &__title { + font-size: $typographic-base-font-size * 3; + @include line-height(2.25); + @include margin-top(2.25); + @include margin-bottom(1.5); + } + &__body { + font-size: $typographic-base-font-size * 1.125; + @include line-height(1.125); + @include margin-bottom(1.125); + & p { + font-size: $typographic-base-font-size * 1.125; + @include line-height(1.125); + @include margin-bottom(1.125); + } + } + &__home-button { + position: fixed; + max-width: auto; + margin: 0; + top: 30px; + left: 30px; + } + } +} diff --git a/src/components/Sidebar/index.jsx b/src/components/Sidebar/index.jsx new file mode 100644 index 0000000..d1fbe14 --- /dev/null +++ b/src/components/Sidebar/index.jsx @@ -0,0 +1,74 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import get from 'lodash/get'; +import Link from 'gatsby-link'; +import Menu from '../Menu'; +import Links from '../Links'; +import profilePic from '../../pages/photo.jpg'; +import './style.scss'; + +class Sidebar extends React.Component { + render() { + const { location } = this.props; + const { author, subtitle, copyright, menu } = this.props.data.site.siteMetadata; + const isHomePage = get(location, 'pathname', '/') === '/'; + + /* eslint-disable jsx-a11y/img-redundant-alt*/ + const authorBlock = ( +
+ + {author.name} + + { isHomePage ? ( +

+ {author.name} +

+ ) : +

+ {author.name} +

+ } +

{subtitle}

+
+ ); + /* eslint-enable jsx-a11y/img-redundant-alt*/ + + return ( +
+
+
+ {authorBlock} +
+
+ + +

+ {copyright} +

+
+
+
+ ); + } +} + +Sidebar.propTypes = { + data: PropTypes.shape({ + site: PropTypes.shape({ + siteMetadata: PropTypes.shape({ + subtitle: PropTypes.string.isRequired, + author: PropTypes.object.isRequired, + copyright: PropTypes.string.isRequired, + menu: PropTypes.array.isRequired + }) + }) + }), + location: PropTypes.object +}; + +export default Sidebar; diff --git a/src/components/Sidebar/style.scss b/src/components/Sidebar/style.scss new file mode 100644 index 0000000..2fccd3a --- /dev/null +++ b/src/components/Sidebar/style.scss @@ -0,0 +1,69 @@ +@import "../../assets/scss/variables"; +@import "../../assets/scss/mixins"; + +.sidebar { + width: 100%; + &__inner { + position: relative; + padding: 25px 20px 0; + } + &__author { + &-photo { + display: inline-block; + margin-bottom: 0; + border-radius: 50%; + background-clip: padding-box; + } + &-title { + font-size: $typographic-base-font-size * 1.125; + font-weight: 500; + @include line-height(1.125); + @include margin(.5, 0, .5, 0); + &-link { + color: $color-base; + &:hover, + &:focus { + color: $color-base; + } + } + } + &-subtitle { + color: $color-gray; + @include line-height(1); + @include margin-bottom(1); + } + } + &__copyright { + color: lighten($color-gray, 18%); + font-size: $typographic-small-font-size; + } +} + +@include breakpoint-sm { + .sidebar { + lost-column: 5/12; + &__inner { + padding: 30px 20px 0; + &:after { + background: $color-gray-border; + background: linear-gradient(to bottom, $color-gray-border 0%, $color-gray-border 48%, $color-white 100%); + position: absolute; + content: ""; + width: 1px; + height: 540px; + top: 30px; + right: -10px; + bottom: 0; + } + } + } +} + +@include breakpoint-md { + .sidebar { + lost-column: 1/3; + &__inner { + padding: 40px; + } + } +} diff --git a/src/components/TagTemplateDetails/index.jsx b/src/components/TagTemplateDetails/index.jsx new file mode 100644 index 0000000..ddeaaff --- /dev/null +++ b/src/components/TagTemplateDetails/index.jsx @@ -0,0 +1,44 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Post from '../Post'; + +class TagTemplateDetails extends React.Component { + render() { + const items = []; + const tagTitle = this.props.pathContext.tag; + const posts = this.props.data.allMarkdownRemark.edges; + posts.forEach((post) => { + items.push( + + ); + }); + + return ( +
+
+
+

+ All Posts tagget as "{tagTitle}" +

+
+ {items} +
+
+
+
+ ); + } +} + +TagTemplateDetails.propTypes = { + data: PropTypes.shape({ + allMarkdownRemark: PropTypes.shape({ + edges: PropTypes.array.isRequired + }) + }), + pathContext: PropTypes.shape({ + tag: PropTypes.string.isRequired + }) +}; + +export default TagTemplateDetails; diff --git a/src/html.js b/src/html.js new file mode 100644 index 0000000..a046d05 --- /dev/null +++ b/src/html.js @@ -0,0 +1,57 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +class HTML extends React.Component { + render() { + const { postBodyComponents, headComponents, body } = this.props; + let styles; + if (process.env.NODE_ENV === 'production') { + try { + // eslint-disable-next-line import/no-webpack-loader-syntax + styles = require('!raw-loader!../public/styles.css'); + } catch (e) { + console.log(e); + } + } + + let css; + if (process.env.NODE_ENV === 'production') { + css = ( +