From 97d8e2c0e2568f9f9f653dcc243d06aa25482e70 Mon Sep 17 00:00:00 2001 From: Henk Verlinde Date: Wed, 4 Nov 2020 08:26:58 +0100 Subject: [PATCH] feat: add flexsearch --- .eslintignore | 1 + .github/workflows/codeql-analysis.yml | 2 +- .markdownlint.json | 10 + .markdownlintignore | 1 + .stylelintignore | 2 +- .travis.yml | 4 +- CHANGELOG.md | 21 +- CODE_OF_CONDUCT.md | 76 + LICENSE | 2 +- README.md | 62 +- archetypes/blog.md | 8 +- archetypes/default.md | 3 +- archetypes/docs.md | 5 +- assets/js/app.js | 156 + assets/js/index.js | 11 + assets/scss/app.scss | 6 +- assets/scss/common/_dark.scss | 81 +- assets/scss/common/_global.scss | 51 +- assets/scss/common/_syntax.scss | 60 - assets/scss/common/_variables.scss | 58 +- assets/scss/components/_alerts.scss | 63 + assets/scss/components/_buttons.scss | 28 + assets/scss/components/_code.scss | 24 +- assets/scss/components/_images.scss | 31 +- assets/scss/components/_search.scss | 75 + assets/scss/components/_syntax.scss | 131 + assets/scss/layouts/_footer.scss | 6 +- assets/scss/layouts/_header.scss | 67 +- assets/scss/layouts/_pages.scss | 15 + assets/scss/layouts/_posts.scss | 9 +- babel.config.js | 17 + config/_default/config.toml | 38 +- config/_default/menus.toml | 31 +- config/_default/params.toml | 39 +- config/postcss.config.js | 6 +- config/production/{params.toml => .gitkeep} | 0 config/production/config.toml | 2 - config/staging/{params.toml => .gitkeep} | 0 config/staging/config.toml | 2 - content/_index.md | 28 +- content/authors/_index.md | 9 - content/authors/henk-verlinde/_index.md | 11 - content/blog/_index.md | 7 +- content/blog/say-hello-to-doks/index.md | 9 - .../google-lighthouse-scores-hyas.png | Bin 0 -> 24319 bytes content/blog/say-hello-to-hyas/index.md | 55 + .../mozilla-observatory-scores-hyas.png | Bin 0 -> 15175 bytes .../say-hello-to-hyas/say-hello-to-hyas.png | Bin 0 -> 34206 bytes content/contact/index.md | 10 + content/contributors/_index.md | 10 + content/contributors/henk-verlinde/_index.md | 12 + content/docs/_index.md | 7 +- content/docs/basic-hyas/_index.md | 9 + content/docs/basic-hyas/archetypes.md | 53 + content/docs/basic-hyas/assets.md | 32 + content/docs/basic-hyas/deployment.md | 34 + .../docs/basic-hyas/directory-structure.md | 185 ++ content/docs/basic-hyas/layouts.md | 57 + .../docs/basic-hyas/project-configuration.md | 142 + content/docs/core-hyas/_index.md | 9 + content/docs/core-hyas/bootstrap.md | 15 + content/docs/core-hyas/development-tools.md | 15 + content/docs/core-hyas/netlify.md | 91 + content/docs/core-hyas/performance.md | 61 + content/docs/core-hyas/security.md | 37 + content/docs/core-hyas/seo.md | 15 + content/docs/guides/_index.md | 9 + content/docs/guides/add-custom-fonts.md | 15 + content/docs/guides/add-external-scripts.md | 15 + content/docs/help/_index.md | 7 +- content/docs/help/faq.md | 28 +- content/docs/prologue/_index.md | 7 +- content/docs/prologue/commands.md | 92 + content/docs/prologue/hyas-cli.md | 103 + content/docs/prologue/introduction.md | 106 +- content/privacy-policy/index.md | 36 + layouts/404.html | 4 +- layouts/_default/_markup/.gitkeep | 0 layouts/_default/_markup/render-link.html | 1 - layouts/_default/baseof.html | 13 +- layouts/_default/index.js | 10 + layouts/_default/index.json | 5 + layouts/_default/section.sitemap.xml | 46 + layouts/blog/list.html | 4 +- layouts/blog/single.html | 2 +- layouts/{authors => contributors}/list.html | 4 +- layouts/docs/single.html | 1 + layouts/index.headers | 2 +- layouts/index.html | 125 +- layouts/partials/footer/alert.html | 3 + layouts/partials/footer/footer.html | 7 +- layouts/partials/footer/script-footer.html | 15 +- layouts/partials/head/favicons.html | 8 +- layouts/partials/head/opengraph.html | 93 + layouts/partials/head/resource-hints.html | 10 +- layouts/partials/head/script-header.html | 12 +- layouts/partials/head/seo.html | 34 +- layouts/partials/head/structured-data.html | 42 +- layouts/partials/head/twitter_cards.html | 33 + layouts/partials/header/header.html | 16 +- layouts/partials/main/blog-meta.html | 2 +- layouts/partials/main/docs-navigation.html | 4 +- layouts/partials/main/edit-page.html | 1 + layouts/partials/main/headline-hash.html | 2 +- layouts/partials/sidebar/docs-menu.html | 2 +- layouts/robots.txt | 2 +- layouts/shortcodes/alert.html | 4 + layouts/shortcodes/img-simple.html | 3 + layouts/shortcodes/img.html | 4 +- netlify.toml | 20 +- package.json | 36 +- static/android-chrome-192x192.png | Bin 5765 -> 6450 bytes static/android-chrome-512x512.png | Bin 20786 -> 22135 bytes static/apple-touch-icon.png | Bin 5105 -> 5960 bytes static/favicon-16x16.png | Bin 416 -> 520 bytes static/favicon-32x32.png | Bin 773 -> 1003 bytes static/favicon.ico | Bin 15406 -> 15406 bytes static/fonts/vendor/jost/Jost-400-Book.otf | Bin 0 -> 35776 bytes .../fonts/vendor/jost/Jost-400-BookItalic.otf | Bin 0 -> 43904 bytes static/fonts/vendor/jost/Jost-500-Medium.otf | Bin 0 -> 39056 bytes .../vendor/jost/Jost-500-MediumItalic.otf | Bin 0 -> 45924 bytes static/fonts/vendor/jost/Jost-600-Semi.otf | Bin 0 -> 39860 bytes .../fonts/vendor/jost/Jost-600-SemiItalic.otf | Bin 0 -> 46852 bytes static/fonts/vendor/jost/Jost-700-Bold.otf | Bin 0 -> 39196 bytes static/hyas.png | Bin 0 -> 19846 bytes static/image-doks.png | Bin 2278 -> 0 bytes static/logo-doks.png | Bin 20786 -> 0 bytes static/logo-hyas.png | Bin 0 -> 22135 bytes static/site.webmanifest | 2 +- yarn.lock | 2818 +++++++++-------- 130 files changed, 4162 insertions(+), 1763 deletions(-) create mode 100644 .markdownlint.json create mode 100644 .markdownlintignore create mode 100644 CODE_OF_CONDUCT.md create mode 100644 assets/js/index.js delete mode 100644 assets/scss/common/_syntax.scss create mode 100644 assets/scss/components/_alerts.scss create mode 100644 assets/scss/components/_search.scss create mode 100644 assets/scss/components/_syntax.scss create mode 100644 babel.config.js rename config/production/{params.toml => .gitkeep} (100%) delete mode 100644 config/production/config.toml rename config/staging/{params.toml => .gitkeep} (100%) delete mode 100644 config/staging/config.toml delete mode 100644 content/authors/_index.md delete mode 100644 content/authors/henk-verlinde/_index.md delete mode 100644 content/blog/say-hello-to-doks/index.md create mode 100644 content/blog/say-hello-to-hyas/google-lighthouse-scores-hyas.png create mode 100644 content/blog/say-hello-to-hyas/index.md create mode 100644 content/blog/say-hello-to-hyas/mozilla-observatory-scores-hyas.png create mode 100644 content/blog/say-hello-to-hyas/say-hello-to-hyas.png create mode 100644 content/contact/index.md create mode 100644 content/contributors/_index.md create mode 100644 content/contributors/henk-verlinde/_index.md create mode 100644 content/docs/basic-hyas/_index.md create mode 100644 content/docs/basic-hyas/archetypes.md create mode 100644 content/docs/basic-hyas/assets.md create mode 100644 content/docs/basic-hyas/deployment.md create mode 100644 content/docs/basic-hyas/directory-structure.md create mode 100644 content/docs/basic-hyas/layouts.md create mode 100644 content/docs/basic-hyas/project-configuration.md create mode 100644 content/docs/core-hyas/_index.md create mode 100644 content/docs/core-hyas/bootstrap.md create mode 100644 content/docs/core-hyas/development-tools.md create mode 100644 content/docs/core-hyas/netlify.md create mode 100644 content/docs/core-hyas/performance.md create mode 100644 content/docs/core-hyas/security.md create mode 100644 content/docs/core-hyas/seo.md create mode 100644 content/docs/guides/_index.md create mode 100644 content/docs/guides/add-custom-fonts.md create mode 100644 content/docs/guides/add-external-scripts.md create mode 100644 content/docs/prologue/commands.md create mode 100644 content/docs/prologue/hyas-cli.md create mode 100644 content/privacy-policy/index.md create mode 100644 layouts/_default/_markup/.gitkeep delete mode 100644 layouts/_default/_markup/render-link.html create mode 100644 layouts/_default/index.js create mode 100644 layouts/_default/index.json create mode 100644 layouts/_default/section.sitemap.xml rename layouts/{authors => contributors}/list.html (75%) create mode 100644 layouts/partials/footer/alert.html create mode 100644 layouts/partials/head/opengraph.html create mode 100644 layouts/partials/head/twitter_cards.html create mode 100644 layouts/partials/main/edit-page.html create mode 100644 layouts/shortcodes/alert.html create mode 100644 layouts/shortcodes/img-simple.html create mode 100644 static/fonts/vendor/jost/Jost-400-Book.otf create mode 100644 static/fonts/vendor/jost/Jost-400-BookItalic.otf create mode 100644 static/fonts/vendor/jost/Jost-500-Medium.otf create mode 100644 static/fonts/vendor/jost/Jost-500-MediumItalic.otf create mode 100644 static/fonts/vendor/jost/Jost-600-Semi.otf create mode 100644 static/fonts/vendor/jost/Jost-600-SemiItalic.otf create mode 100644 static/fonts/vendor/jost/Jost-700-Bold.otf create mode 100644 static/hyas.png delete mode 100644 static/image-doks.png delete mode 100644 static/logo-doks.png create mode 100644 static/logo-hyas.png diff --git a/.eslintignore b/.eslintignore index e258d0c..e9d09b5 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,3 @@ +assets/js/index.js assets/js/vendor node_modules \ No newline at end of file diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 282ab12..0f02f7c 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -12,7 +12,7 @@ on: # The branches below must be a subset of the branches above branches: [master] schedule: - - cron: '0 22 * * 1' + - cron: '0 11 * * 5' jobs: analyze: diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000..a8b885d --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,10 @@ +{ + "comment": "Hyas rules", + + "default": true, + "line_length": false, + "no-inline-html": false, + "no-trailing-punctuation": false, + "no-duplicate-heading": false, + "no-bare-urls": false +} \ No newline at end of file diff --git a/.markdownlintignore b/.markdownlintignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.markdownlintignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/.stylelintignore b/.stylelintignore index ee4dea9..3972095 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -1,3 +1,3 @@ -assets/scss/common/_syntax.scss +assets/scss/components/_syntax.scss assets/scss/vendor node_modules \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 2f60d90..c6f94d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ sudo: required language: node_js node_js: - "lts/*" - - "13" + - "14" install: - wget "https://github.com/gohugoio/hugo/releases/download/v${HUGO_RELEASE}/hugo_extended_${HUGO_RELEASE}_Linux-64bit.deb" @@ -20,4 +20,4 @@ script: env: global: - PRODUCTION=true - - HUGO_RELEASE=0.69.0 \ No newline at end of file + - HUGO_RELEASE=0.75.1 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a6016d..8e4f093 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,16 +1,25 @@ # Changelog + All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] -### Removed -- negative margin `navbar-brand` -## [0.1.0] - 2020-04-16 +## [0.1.1] - 2020-09-29 + ### Added -- [Hyas](https://github.com/h-enk/hyas), Copyright (c) 2019 Henk Verlinde, [MIT License](https://github.com/h-enk/hyas/blob/master/LICENSE) -[Unreleased]: https://github.com/h-enk/doks/compare/v0.1.0...HEAD -[0.1.0]: https://github.com/h-enk/doks/releases/tag/v0.1.0 +- Base documentation + +## [0.1.0] - 2020-07-10 + +### Added + +- [Feather](https://github.com/feathericons/feather), Copyright (c) 2013-2017 Cole Bemis, [MIT License](https://github.com/feathericons/feather/blob/master/LICENSE) +- [Hyas](https://github.com/h-enk/hyas), Copyright (c) 2020 Henk Verlinde, [MIT License](https://github.com/h-enk/hyas/blob/master/LICENSE) + +[Unreleased]: https://github.com/h-enk/gethyas.com/compare/v0.1.1...HEAD +[0.1.1]: https://github.com/h-enk/gethyas.com/releases/tag/v0.1.1 +[0.1.0]: https://github.com/h-enk/gethyas.com/releases/tag/v0.1.0 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..3d7d695 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at henk@henkverlinde.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/LICENSE b/LICENSE index d060f61..13fef13 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Henk Verlinde +Copyright (c) 2020 Henk Verlinde Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 92392ac..e10f4d4 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,5 @@ -# Doks -[![GitHub release](https://img.shields.io/github/release/h-enk/doks.svg?style=flat-square)](https://github.com/h-enk/doks/releases) -[![Build Status](https://img.shields.io/travis/h-enk/doks.svg?style=flat-square)](https://travis-ci.com/github/h-enk/doks) -[![Netlify](https://img.shields.io/netlify/8a1009d5-88ac-413e-96ef-3f928674a083?style=flat-square)](https://doks.netlify.app/) +# Hyas website -Doks is a Hugo starter helping you build modern documentation websites. - -## Features -- Lightweight code base -- 100 scores Google Lighthouse -- A+ scores [Mozilla Observatory](https://observatory.mozilla.org/) -- [Algolia DocSearch](https://docsearch.algolia.com/) support -- Dark/Light toggle -- Blog ready -- Easily make it your own -- All in [Hyas](https://github.com/h-enk/hyas) - -See a working example at [doks.netlify.app](https://doks.netlify.app/) - -## Requirements - -Make sure all dependencies have been installed: - -- [Hugo](https://gohugo.io/) >= 0.69.0/extended -- [Node.js](https://nodejs.org/) >= 13.11.0 -- [Yarn](https://yarnpkg.com/) >= 1.22.4 (recommended) - -## Get started - -Create a new Doks project: - -```bash -$ git clone git@github.com:h-enk/doks.git my-doks-site -``` - -Install dependencies: - -```bash -# @ my-doks-site/ -$ yarn install -``` - -Build development theme with live reloading and injection: - -```bash -# @ my-doks-site/ -$ yarn start -``` - -### Other commands -- `yarn lint:styles` - Check Sass for errors -- `yarn lint:scripts` - Check JavaScript for errors -- `yarn clean` - Delete temporary directories -- `yarn build` - Build production theme - -## Documentation -- [Hugo](https://gohugo.io/documentation/) -- [Hyas](https://gethyas.com/) -- [Doks](https://getdoks.org/) +[![GitHub release](https://img.shields.io/github/release/h-enk/gethyas.com.svg?style=flat-square)](https://github.com/h-enk/gethyas.com/releases) +[![Build Status](https://img.shields.io/travis/h-enk/gethyas.com.svg?style=flat-square)](https://travis-ci.com/github/h-enk/gethyas.com) +[![Netlify](https://img.shields.io/netlify/72c25737-babf-44b6-98a5-eeb6861ac904?style=flat-square)](https://gethyas.com/) diff --git a/archetypes/blog.md b/archetypes/blog.md index 1b96724..b495210 100644 --- a/archetypes/blog.md +++ b/archetypes/blog.md @@ -3,9 +3,11 @@ title: "{{ replace .Name "-" " " | title }}" description: "" lead: "" date: {{ .Date }} +lastmod: {{ .Date }} draft: true -images: {{ .Site.Params.images }} -authors: [""] +weight: 50 +images: ["{{ .Name | urlize }}.jpg"] +contributors: ["Henk Verlinde"] --- -{{< img src="" alt="" caption="" class="wide" >}} +{{< img src="{{ .Name | urlize }}.jpg" alt="{{ replace .Name "-" " " | title }}" caption="{{ replace .Name "-" " " | title }}" class="wide" >}} diff --git a/archetypes/default.md b/archetypes/default.md index 383c33d..d8210df 100644 --- a/archetypes/default.md +++ b/archetypes/default.md @@ -2,6 +2,7 @@ title: "{{ replace .Name "-" " " | title }}" description: "" date: {{ .Date }} +lastmod: {{ .Date }} draft: true -images: {{ .Site.Params.images }} +images: [] --- diff --git a/archetypes/docs.md b/archetypes/docs.md index 906f8f9..e572def 100644 --- a/archetypes/docs.md +++ b/archetypes/docs.md @@ -3,8 +3,9 @@ title: "{{ replace .Name "-" " " | title }}" description: "" lead: "" date: {{ .Date }} +lastmod: {{ .Date }} draft: true -images: {{ .Site.Params.images }} +images: [] menu: docs: parent: "" @@ -12,4 +13,4 @@ weight: 999 toc: true --- -{{< img src="" alt="" caption="" class="wide" >}} +{{< img src="{{ .Name | urlize }}.jpg" alt="{{ replace .Name "-" " " | title }}" caption="{{ replace .Name "-" " " | title }}" class="wide" >}} diff --git a/assets/js/app.js b/assets/js/app.js index 0f89b97..4db9115 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -1,8 +1,164 @@ +/* global FlexSearch docs:true a:true t:true d:true */ + document.getElementById('mode').addEventListener('click', () => { + document.body.classList.toggle('dark'); localStorage.setItem('theme', document.body.classList.contains('dark') ? 'dark' : 'light'); + }); if (localStorage.getItem('theme') === 'dark') { + document.body.classList.add('dark'); + } + +/* eslint-disable */ +/* +window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) } + +if (document.querySelector('#deploy-to-netlify') !== null) { + + document.getElementById('deploy-to-netlify').addEventListener('click', function(){ + plausible('Deploy to Netlify'); + }); + +} +*/ +/* eslint-enable */ + +var suggestions = document.getElementById('suggestions'); +var userinput = document.getElementById('userinput'); + +document.addEventListener('keydown', inputFocus); + +function inputFocus(e) { + + if (e.keyCode === 191 ) { + e.preventDefault(); + userinput.focus(); + } + + if (e.keyCode === 27 ) { + userinput.blur(); + suggestions.classList.add('d-none'); + } + +} + +document.addEventListener('click', function(event) { + + var isClickInsideElement = suggestions.contains(event.target); + + if (!isClickInsideElement) { + suggestions.classList.add('d-none'); + } + +}); + + +/* +Source: + - https://dev.to/shubhamprakash/trap-focus-using-javascript-6a3 +*/ + +document.addEventListener('keydown',suggestionFocus); + +function suggestionFocus(e){ + + const focusableSuggestions= suggestions.querySelectorAll('a'); + const focusable= [...focusableSuggestions]; + const index = focusable.indexOf(document.activeElement); + + let nextIndex = 0; + + if (e.keyCode === 38) { + e.preventDefault(); + nextIndex= index > 0 ? index-1 : 0; + focusableSuggestions[nextIndex].focus(); + } + else if (e.keyCode === 40) { + e.preventDefault(); + nextIndex= index+1 < focusable.length ? index+1 : index; + focusableSuggestions[nextIndex].focus(); + } + +} + + +/* +Source: + - https://github.com/nextapps-de/flexsearch#index-documents-field-search + - https://raw.githack.com/nextapps-de/flexsearch/master/demo/autocomplete.html +*/ + +(function(){ + + var index = new FlexSearch({ + preset: 'score', + cache: true, + doc: { + id: 'id', + field: [ + 'title', + 'description', + 'content', + ], + store: [ + 'href', + 'title', + 'description', + ], + }, + }); + + index.add(docs); + + userinput.addEventListener('input', show_results, true); + suggestions.addEventListener('click', accept_suggestion, true); + + function show_results(){ + + var value = this.value; + var results = index.search(value, 5); + var entry, childs = suggestions.childNodes; + var i = 0, len = results.length; + + suggestions.classList.remove('d-none'); + + results.forEach(function(page) { + + entry = document.createElement('div'); + + entry.innerHTML = ''; + + a = entry.querySelector('a'), + t = entry.querySelector('span:first-child'), + d = entry.querySelector('span:nth-child(2)'); + + a.href = page.href; + t.textContent = page.title; + d.textContent = page.description; + + suggestions.appendChild(entry); + + }); + + while(childs.length > len){ + + suggestions.removeChild(childs[i]) + } + + } + + function accept_suggestion(){ + + while(suggestions.lastChild){ + + suggestions.removeChild(suggestions.lastChild); + } + + return false; + } + +}()); diff --git a/assets/js/index.js b/assets/js/index.js new file mode 100644 index 0000000..82dfda8 --- /dev/null +++ b/assets/js/index.js @@ -0,0 +1,11 @@ +var docs = [ +{{ range $index, $page := (where .Site.Pages "Section" "docs") -}} + { + id: {{ $index }}, + href: "{{ .Permalink | absURL }}", + title: {{ .Title | jsonify }}, + description: {{ .Params.description | jsonify }}, + content: {{ .Content | jsonify }} + }, +{{ end -}} +]; \ No newline at end of file diff --git a/assets/scss/app.scss b/assets/scss/app.scss index 1f6691c..91b9db8 100644 --- a/assets/scss/app.scss +++ b/assets/scss/app.scss @@ -8,15 +8,17 @@ @import "bootstrap/scss/bootstrap"; /** Import theme styles */ -// @import "common/fonts"; +@import "common/fonts"; @import "common/global"; @import "common/dark"; -// @import "common/syntax"; +@import "components/alerts"; @import "components/buttons"; @import "components/code"; +// @import "components/syntax"; @import "components/comments"; @import "components/forms"; @import "components/images"; +@import "components/search"; @import "layouts/footer"; @import "layouts/header"; @import "layouts/pages"; diff --git a/assets/scss/common/_dark.scss b/assets/scss/common/_dark.scss index 8d3b126..b5a38c1 100644 --- a/assets/scss/common/_dark.scss +++ b/assets/scss/common/_dark.scss @@ -1,10 +1,23 @@ /** Theme variables */ -$body-bg-dark: lighten($black, 10%); -$body-color-dark: darken($white, 15%); -$link-color-dark: lighten($primary, 20%); -$body-overlay-dark: lighten($black, 15%); -$border-dark: lighten($black, 20%); +// Source: https://material.io/design/color/dark-theme.html + +$body-bg-dark: $gray-900; +$body-overlay-dark: darken($body-bg-dark, 2.5%); +$border-dark: darken($body-bg-dark, 2.5%); +$body-color-dark: $gray-300; +$dots-dark: darken($body-color-dark, 50%); + +$link-color-dark: $blue-300; +$button-color-dark: $link-color-dark; +$focus-color-dark: lighten($link-color-dark, 2.5%); +$selection-color-dark: lighten($link-color-dark, 2.5%); + +$navbar-dark-brand-color: $link-color-dark; +$navbar-dark-brand-hover-color: $body-color-dark; +$navbar-dark-color: $body-color-dark; +$navbar-dark-hover-color: $link-color-dark; +$navbar-dark-active-color: $link-color-dark; /** Theme styles */ @@ -17,8 +30,14 @@ body.dark a { color: $link-color-dark; } +body.dark a.text-body { + color: $body-color-dark !important; +} + body.dark .btn-primary { - color: $body-color-dark; + @include button-variant($button-color-dark, $button-color-dark); + + color: $body-bg-dark !important; } body.dark .navbar { @@ -32,12 +51,12 @@ body.dark.home .navbar { } body.dark .navbar-light .navbar-brand { - color: $navbar-dark-brand-color; + color: $navbar-dark-brand-color !important; } body.dark .navbar-light .navbar-brand:hover, body.dark .navbar-light .navbar-brand:focus { - color: $navbar-dark-brand-hover-color; + color: $navbar-dark-brand-hover-color !important; } body.dark .navbar-light .navbar-nav .nav-link { @@ -64,6 +83,15 @@ body.dark .navbar-light .navbar-text { color: $navbar-dark-color; } +body.dark .alert-primary a { + color: $body-bg-dark; +} + +body.dark .alert-warning { + background: $body-overlay-dark; + color: $body-color-dark; +} + body.dark .page-links a { color: $body-color-dark; } @@ -106,6 +134,14 @@ body.dark .navbar .btn-link:active { body.dark .form-control.is-search { background: $body-overlay-dark; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-search'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +body.dark .form-control:focus { + box-shadow: 0 0 0 0.2rem $focus-color-dark; } body.dark .border-top { @@ -124,7 +160,7 @@ body.dark .docs-navigation { } body.dark ::selection { - background: lighten($primary, 25%); + background: $selection-color-dark; } body.dark pre { @@ -138,7 +174,7 @@ body.dark code { } body.dark blockquote { - border-left: 3px solid lighten($black, 30%); + border-left: 3px solid $border-dark; } body.dark .footer { @@ -211,3 +247,28 @@ body.dark .navbar .menu-icon .navicon::before, body.dark .navbar .menu-icon .navicon::after { background: $navbar-dark-color; } + +body.dark .logo-light { + display: none !important; +} + +body.dark .logo-dark { + display: inline-block !important; +} + +body.dark .bg-light { + background: darken($body-bg-dark, 1.5%) !important; +} + +body.dark .bg-dots { + background-image: radial-gradient($dots-dark 15%, transparent 15%); +} + +body.dark .text-muted { + color: darken($body-color-dark, 7.5%) !important; +} + +body.dark .alert-primary { + background: $link-color-dark; + color: $body-bg-dark; +} diff --git a/assets/scss/common/_global.scss b/assets/scss/common/_global.scss index c670c6d..38aac1e 100644 --- a/assets/scss/common/_global.scss +++ b/assets/scss/common/_global.scss @@ -1,7 +1,8 @@ -.authors .content, +.contributors .content, .blog .content, .page .content, -.error404 .content { +.error404 .content, +.docs.list .content { padding-top: 1rem; padding-bottom: 3rem; } @@ -48,12 +49,24 @@ h6, padding-bottom: 5rem; } +.section-md { + padding-top: 3rem; + padding-bottom: 3rem; +} + +.section-sm { + padding-top: 1rem; + padding-bottom: 1rem; +} + +/* .section svg { display: inline-block; width: 2rem; height: 2rem; vertical-align: text-top; } +*/ body { padding-top: 3.5625rem; @@ -128,7 +141,7 @@ body { .docs-navigation { border-top: 1px solid $gray-200; - margin-top: 3rem; + margin-top: 2rem; margin-bottom: 0; padding-top: 2rem; } @@ -139,7 +152,7 @@ body { @include media-breakpoint-up(lg) { .docs-navigation { - margin-bottom: 5rem; + margin-bottom: -1rem; } .docs-navigation a { @@ -153,5 +166,33 @@ body { } ::selection { - background: lighten($primary, 45%); + background: lighten($primary, 55%); +} + +.bg-dots { + background-image: radial-gradient($gray-300 15%, transparent 15%); + background-position: 0 0; + background-size: 1rem 1rem; + -webkit-mask: linear-gradient(to top, #fff, transparent); + mask: linear-gradient(to top, #fff, transparent); + width: 100%; + height: 9rem; + margin-top: -10rem; + z-index: -1; +} + +.bg-dots-lg { + margin-top: -12rem; +} + +// https://fossheim.io/writing/posts/css-text-gradient/ +.gradient-text { + background-color: $primary; + background-image: linear-gradient(90deg, $primary, $blue-300 50%, $pink-500); + background-size: 100%; + background-repeat: repeat; + -webkit-background-clip: text; + -moz-background-clip: text; + -webkit-text-fill-color: transparent; + -moz-text-fill-color: transparent; } diff --git a/assets/scss/common/_syntax.scss b/assets/scss/common/_syntax.scss deleted file mode 100644 index 51b1d84..0000000 --- a/assets/scss/common/_syntax.scss +++ /dev/null @@ -1,60 +0,0 @@ -/* Background */ .chroma { color: #f8f8f2; background-color: #282a36 } -/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } -/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; } -/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #ffffcc } -/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } -/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } -/* Keyword */ .chroma .k { color: #ff79c6 } -/* KeywordConstant */ .chroma .kc { color: #ff79c6 } -/* KeywordDeclaration */ .chroma .kd { color: #8be9fd; font-style: italic } -/* KeywordNamespace */ .chroma .kn { color: #ff79c6 } -/* KeywordPseudo */ .chroma .kp { color: #ff79c6 } -/* KeywordReserved */ .chroma .kr { color: #ff79c6 } -/* KeywordType */ .chroma .kt { color: #8be9fd } -/* NameAttribute */ .chroma .na { color: #50fa7b } -/* NameBuiltin */ .chroma .nb { color: #8be9fd; font-style: italic } -/* NameClass */ .chroma .nc { color: #50fa7b } -/* NameFunction */ .chroma .nf { color: #50fa7b } -/* NameLabel */ .chroma .nl { color: #8be9fd; font-style: italic } -/* NameTag */ .chroma .nt { color: #ff79c6 } -/* NameVariable */ .chroma .nv { color: #8be9fd; font-style: italic } -/* NameVariableClass */ .chroma .vc { color: #8be9fd; font-style: italic } -/* NameVariableGlobal */ .chroma .vg { color: #8be9fd; font-style: italic } -/* NameVariableInstance */ .chroma .vi { color: #8be9fd; font-style: italic } -/* LiteralString */ .chroma .s { color: #f1fa8c } -/* LiteralStringAffix */ .chroma .sa { color: #f1fa8c } -/* LiteralStringBacktick */ .chroma .sb { color: #f1fa8c } -/* LiteralStringChar */ .chroma .sc { color: #f1fa8c } -/* LiteralStringDelimiter */ .chroma .dl { color: #f1fa8c } -/* LiteralStringDoc */ .chroma .sd { color: #f1fa8c } -/* LiteralStringDouble */ .chroma .s2 { color: #f1fa8c } -/* LiteralStringEscape */ .chroma .se { color: #f1fa8c } -/* LiteralStringHeredoc */ .chroma .sh { color: #f1fa8c } -/* LiteralStringInterpol */ .chroma .si { color: #f1fa8c } -/* LiteralStringOther */ .chroma .sx { color: #f1fa8c } -/* LiteralStringRegex */ .chroma .sr { color: #f1fa8c } -/* LiteralStringSingle */ .chroma .s1 { color: #f1fa8c } -/* LiteralStringSymbol */ .chroma .ss { color: #f1fa8c } -/* LiteralNumber */ .chroma .m { color: #bd93f9 } -/* LiteralNumberBin */ .chroma .mb { color: #bd93f9 } -/* LiteralNumberFloat */ .chroma .mf { color: #bd93f9 } -/* LiteralNumberHex */ .chroma .mh { color: #bd93f9 } -/* LiteralNumberInteger */ .chroma .mi { color: #bd93f9 } -/* LiteralNumberIntegerLong */ .chroma .il { color: #bd93f9 } -/* LiteralNumberOct */ .chroma .mo { color: #bd93f9 } -/* Operator */ .chroma .o { color: #ff79c6 } -/* OperatorWord */ .chroma .ow { color: #ff79c6 } -/* Comment */ .chroma .c { color: #6272a4 } -/* CommentHashbang */ .chroma .ch { color: #6272a4 } -/* CommentMultiline */ .chroma .cm { color: #6272a4 } -/* CommentSingle */ .chroma .c1 { color: #6272a4 } -/* CommentSpecial */ .chroma .cs { color: #6272a4 } -/* CommentPreproc */ .chroma .cp { color: #ff79c6 } -/* CommentPreprocFile */ .chroma .cpf { color: #ff79c6 } -/* GenericDeleted */ .chroma .gd { color: #8b080b } -/* GenericEmph */ .chroma .ge { text-decoration: underline } -/* GenericHeading */ .chroma .gh { font-weight: bold } -/* GenericInserted */ .chroma .gi { font-weight: bold } -/* GenericOutput */ .chroma .go { color: #44475a } -/* GenericSubheading */ .chroma .gu { font-weight: bold } -/* GenericUnderline */ .chroma .gl { text-decoration: underline } diff --git a/assets/scss/common/_variables.scss b/assets/scss/common/_variables.scss index 163e194..125930e 100644 --- a/assets/scss/common/_variables.scss +++ b/assets/scss/common/_variables.scss @@ -1,16 +1,4 @@ -/* -$theme-colors: ( - primary: #3c48d5 -); -*/ - -$yellow: #ffe000; -$black: #1d2d35; -$white: #fff; -$beige: #fbf7f0; -$red: #e55235; -$purple: #5d2f86; -$brown: #aa9c84; +// Color system $white: #fff; $gray-100: #f8f9fa; @@ -24,8 +12,17 @@ $gray-800: #343a40; $gray-900: #212529; $black: #000; -$primary: lighten($purple, 10%); -$secondary: $gray-200; +$yellow: #ffe000; +$black: #1d2d35; +$beige: #fbf7f0; +$red: #e55235; +$purple: #5d2f86; +$brown: #aa9c84; + +$blue-300: #8ed6fb; +$pink-500: #d32e9d; + +$primary: $purple; /** Bootstrap navbar fix (https://git.io/fADqW) */ $navbar-dark-toggler-icon-bg: none; @@ -42,7 +39,7 @@ $enable-responsive-font-sizes: true; // Settings for the `` element. $body-bg: $white; -$body-color: lighten($black, 10%); +$body-color: $black; // Grid containers // @@ -65,6 +62,12 @@ $grid-columns: 16; $grid-gutter-width: 48px; $grid-row-columns: 6; +// Components +// +// Define common padding and border radius sizes and more. + +$border-color: $gray-200; + // Typography // // Font, line-height, and color for body text, headings, and more. @@ -100,3 +103,26 @@ $navbar-padding-y: $spacer / 2; $navbar-padding-x: 0; $navbar-nav-link-padding-x: 0.5rem; + +$navbar-light-color: $black; +$navbar-light-hover-color: $primary; +$navbar-light-active-color: $primary; + +// Cards + +$card-border-color: $gray-200; + +// Alerts +// +// Define alert colors, border radius, and padding. + +$alert-padding-y: 1rem; +$alert-padding-x: 1.5rem; +$alert-margin-bottom: 0; +$alert-border-radius: 0; +$alert-link-font-weight: $headings-font-weight; +$alert-border-width: 0; + +$alert-bg-level: 0; +$alert-border-level: 0; +$alert-color-level: 0; diff --git a/assets/scss/components/_alerts.scss b/assets/scss/components/_alerts.scss new file mode 100644 index 0000000..b40c571 --- /dev/null +++ b/assets/scss/components/_alerts.scss @@ -0,0 +1,63 @@ +.alert { + font-family: $font-family-monospace; + font-size: $font-size-sm; +} + +.alert-icon { + margin-right: 0.75rem; +} + +.docs .alert { + margin: 2rem -1.5rem; +} + +.alert .alert-link { + text-decoration: underline; +} + +.alert-dark { + color: $white; + background-color: $black; +} + +.alert-dark .alert-link { + color: $white; +} + +.alert-light { + color: $black; +} + +.alert-warning { + background: $beige; + color: $black; +} + +/* +.alert-light { + color: #215888; + background: linear-gradient(-45deg, rgb(212, 245, 255), rgb(234, 250, 255), rgb(234, 250, 255), #d3f6ef); +} + +.alert-light .alert-link { + color: #215888; +} +*/ + +.alert-white { + background-color: rgba(255, 255, 255, 0.95); +} + +.alert-primary { + color: $white; + background-color: $primary; +} + +.alert-primary .alert-link { + color: $white; +} + +.alert .alert-link:hover, +.alert .alert-link:focus { + text-decoration: none; +} diff --git a/assets/scss/components/_buttons.scss b/assets/scss/components/_buttons.scss index 40f8a8f..d9bb621 100644 --- a/assets/scss/components/_buttons.scss +++ b/assets/scss/components/_buttons.scss @@ -7,6 +7,11 @@ margin-right: 1.25rem; } +.btn-link:focus { + outline: 0; + box-shadow: none; +} + #navigation { margin-left: 1.25rem; } @@ -44,3 +49,26 @@ body.dark .toggle-light { body.dark .toggle-dark { display: none; } + +.btn-clipboard { + display: none; +} + +@include media-breakpoint-up(md) { + .btn-clipboard { + display: block; + margin: 2.0625rem 0.25rem -4rem auto; + } +} + +.copy-status::after, +.copy-status:hover::after { + content: "Copy"; + display: block; +} + +.copy-status:focus::after, +.copy-status:active::after { + content: "Copied"; + display: block; +} diff --git a/assets/scss/components/_code.scss b/assets/scss/components/_code.scss index cde4684..130c610 100644 --- a/assets/scss/components/_code.scss +++ b/assets/scss/components/_code.scss @@ -1,10 +1,3 @@ -/* -.highlight { - margin-left: -1.5rem; - margin-right: -1.5rem; -} -*/ - pre, code, kbd, @@ -15,8 +8,8 @@ samp { } pre { - background: lighten($black, 15%); - color: $beige; + background: $beige; + color: $black; line-height: $line-height-lg; margin: 2rem 0; overflow: auto; @@ -35,3 +28,16 @@ pre code { font-size: inherit; padding: 0; } + +@include media-breakpoint-down(xs) { + pre { + margin: 2rem -1.5rem; + } + + pre, + code, + kbd, + samp { + border-radius: 0; + } +} diff --git a/assets/scss/components/_images.scss b/assets/scss/components/_images.scss index cc6c3b6..254eefa 100644 --- a/assets/scss/components/_images.scss +++ b/assets/scss/components/_images.scss @@ -1,20 +1,3 @@ -.img svg, -.img img { - margin: 0; - width: 100%; - height: auto; -} - -.img { - position: relative; -} - -.img img { - position: absolute; - top: 0; - left: 0; -} - figure { margin: 2rem 0; } @@ -33,11 +16,11 @@ figure.wide .figure-caption { @include media-breakpoint-up(md) { figure.wide { - margin: 2rem -3rem; + margin: 2rem -2.5rem; } figure.wide .figure-caption { - margin: 0.25rem 3rem 0.75rem; + margin: 0.25rem 2.5rem 0.75rem; } } @@ -52,12 +35,14 @@ figure.wide .figure-caption { } .blur-up { - -webkit-filter: blur(5px); filter: blur(5px); - transition: filter 300ms, -webkit-filter 300ms; } .blur-up.lazyloaded { - -webkit-filter: blur(0); - filter: blur(0); + filter: unset; +} + +.img-simple { + margin-top: 0.375rem; + margin-bottom: 1.25rem; } diff --git a/assets/scss/components/_search.scss b/assets/scss/components/_search.scss new file mode 100644 index 0000000..3a70b2b --- /dev/null +++ b/assets/scss/components/_search.scss @@ -0,0 +1,75 @@ +.navbar-form { + position: relative; +} + +#suggestions { + position: absolute; + right: 0; + margin-top: 0.5rem; + width: calc(100vw - 3rem); +} + +#suggestions a { + display: block; + text-decoration: none; + padding: 0.75rem; + margin: 0 0.5rem; +} + +#suggestions a:focus { + background: $gray-100; + outline: 0; +} + +#suggestions div:not(:first-child) { + border-top: 1px dashed $gray-200; +} + +#suggestions div:first-child { + margin-top: 0.5rem; +} + +#suggestions div:last-child { + margin-bottom: 0.5rem; +} + +#suggestions a:hover { + background: $gray-100; +} + +#suggestions span { + display: flex; + font-size: $font-size-base; +} + +#suggestions span:first-child { + font-weight: $headings-font-weight; + color: $black; +} + +#suggestions span:nth-child(2) { + color: $gray-700; +} + +@include media-breakpoint-up(sm) { + #suggestions { + width: 30rem; + } + + #suggestions a { + display: flex; + } + + #suggestions span:first-child { + width: 9rem; + padding-right: 1rem; + border-right: 1px solid $gray-200; + display: inline-block; + text-align: right; + } + + #suggestions span:nth-child(2) { + width: 19rem; + padding-left: 1rem; + } +} diff --git a/assets/scss/components/_syntax.scss b/assets/scss/components/_syntax.scss new file mode 100644 index 0000000..d9a1c02 --- /dev/null +++ b/assets/scss/components/_syntax.scss @@ -0,0 +1,131 @@ +/*! + * GitHub Light v0.5.0 + * Copyright (c) 2012 - 2017 GitHub, Inc. + * Licensed under MIT (https://github.com/primer/github-syntax-theme-generator/blob/master/LICENSE) + */ + + .c1, + .c /* comment, punctuation.definition.comment, string.comment */ { + color: #6a737d; + } + + .v /* variable */, + .smw /* sublimelinter.mark.warning */ { + color: #e36209; + } + + // .c1 /* constant, entity.name.constant, variable.other.constant, variable.language, support, meta.property-name, support.constant, support.variable, meta.module-reference, markup.raw, meta.diff.header, meta.output */, + .s .v /* string variable */ { + color: #005cc5; + } + + .e /* entity */, + .en /* entity.name */ { + color: #6f42c1; + } + + .smi /* variable.parameter.function, storage.modifier.package, storage.modifier.import, storage.type.java, variable.other */, + .s .s1 /* string source */ { + color: #24292e; + } + + .ent /* entity.name.tag, markup.quote */ { + color: #22863a; + } + + .k /* keyword, storage, storage.type */ { + color: #d73a49; + } + + .s /* string */, + .pds /* punctuation.definition.string, source.regexp, string.regexp.character-class */, + .s .pse .s1 /* string punctuation.section.embedded source */, + .sr /* string.regexp */, + .sr .cce /* string.regexp constant.character.escape */, + .sr .sre /* string.regexp source.ruby.embedded */, + .sr .sra /* string.regexp string.regexp.arbitrary-repitition */ { + color: #032f62; + } + + .bu /* invalid.broken, invalid.deprecated, invalid.unimplemented, message.error, brackethighlighter.unmatched, sublimelinter.mark.error */ { + color: #b31d28; + } + + .ii /* invalid.illegal */ { + color: #fafbfc; + background-color: #b31d28; + } + + .c2 /* carriage-return */ { + color: #fafbfc; + background-color: #d73a49; + } + + .c2::before /* carriage-return */ { + content: "^M"; + } + + .sr .cce /* string.regexp constant.character.escape */ { + font-weight: bold; + color: #22863a; + } + + .ml /* markup.list */ { + color: #735c0f; + } + + .mh /* markup.heading */, + .mh .en /* markup.heading entity.name */, + .ms /* meta.separator */ { + font-weight: bold; + color: #005cc5; + } + + .mi /* markup.italic */ { + font-style: italic; + color: #24292e; + } + + .mb /* markup.bold */ { + font-weight: bold; + color: #24292e; + } + + .md /* markup.deleted, meta.diff.header.from-file, punctuation.definition.deleted */ { + color: #b31d28; + background-color: #ffeef0; + } + + .mi1 /* markup.inserted, meta.diff.header.to-file, punctuation.definition.inserted */ { + color: #22863a; + background-color: #f0fff4; + } + + .mc /* markup.changed, punctuation.definition.changed */ { + color: #e36209; + background-color: #ffebda; + } + + .mi2 /* markup.ignored, markup.untracked */ { + color: #f6f8fa; + background-color: #005cc5; + } + + .mdr /* meta.diff.range */ { + font-weight: bold; + color: #6f42c1; + } + + .ba /* brackethighlighter.tag, brackethighlighter.curly, brackethighlighter.round, brackethighlighter.square, brackethighlighter.angle, brackethighlighter.quote */ { + color: #586069; + } + + .sg /* sublimelinter.gutter-mark */ { + color: #959da5; + } + + .corl /* constant.other.reference.link, string.other.link */ { + text-decoration: underline; + color: #032f62; + } + \ No newline at end of file diff --git a/assets/scss/layouts/_footer.scss b/assets/scss/layouts/_footer.scss index ce1eb4a..7d21811 100644 --- a/assets/scss/layouts/_footer.scss +++ b/assets/scss/layouts/_footer.scss @@ -8,15 +8,13 @@ margin-bottom: 0; } -.footer p, -.footer li a { +.footer li { font-size: $font-size-sm; margin-bottom: 0; } @include media-breakpoint-up(md) { - .footer p, - .footer li a { + .footer li { font-size: $font-size-base; } } diff --git a/assets/scss/layouts/_header.scss b/assets/scss/layouts/_header.scss index d07bbbd..a4ef3d6 100644 --- a/assets/scss/layouts/_header.scss +++ b/assets/scss/layouts/_header.scss @@ -10,6 +10,16 @@ margin-left: 1rem; } +.navbar-brand { + font-weight: $headings-font-weight; +} + +.navbar-light .navbar-brand, +.navbar-light .navbar-brand:hover, +.navbar-light .navbar-brand:active { + color: $body-color; +} + @include media-breakpoint-up(md) { .navbar-brand { font-size: $font-size-xl; @@ -55,12 +65,11 @@ .navbar { background-color: rgba(255, 255, 255, 0.95); border-bottom: 1px solid $gray-200; - - /* margin-top: 3px; */ + margin-top: 4px; } .header-bar { - border-top: 3px solid; + border-top: 4px solid; border-image-source: linear-gradient(90deg, $primary, #8ed6fb 50%, #d32e9d); border-image-slice: 1; } @@ -90,11 +99,23 @@ .navbar-form { margin-top: 0; - margin-left: 1.5rem; + margin-left: 9rem; margin-right: 1.5rem; } } +@include media-breakpoint-up(lg) { + .navbar-form { + margin-left: 18rem; + } +} + +@include media-breakpoint-up(xl) { + .navbar-form { + margin-left: 36rem; + } +} + .form-control.is-search { padding-right: calc(1.5em + 0.75rem); background: $gray-100; @@ -105,6 +126,44 @@ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } +/*! purgecss start ignore */ +.algolia-autocomplete { + display: flex !important; +} + +.algolia-autocomplete .ds-dropdown-menu { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +@include media-breakpoint-down(sm) { + .algolia-autocomplete .ds-dropdown-menu { + max-width: 512px !important; + min-width: 312px !important; + width: auto !important; + } + + .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column::after { + content: "|"; + margin-right: 0.25rem; + } +} + +.algolia-autocomplete .algolia-docsearch-suggestion--title { + margin-bottom: 0; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--highlight { + padding: 0 0.05em; +} + +.algolia-autocomplete .algolia-docsearch-footer { + margin-top: 1rem; + margin-right: 0.5rem; + margin-bottom: 0.5rem; +} + +/*! purgecss end ignore */ + /* * Source: https://medium.com/creative-technology-concepts-code/responsive-mobile-dropdown-navigation-using-css-only-7218e4498a99 */ diff --git a/assets/scss/layouts/_pages.scss b/assets/scss/layouts/_pages.scss index 7b34e12..eaa75de 100644 --- a/assets/scss/layouts/_pages.scss +++ b/assets/scss/layouts/_pages.scss @@ -23,3 +23,18 @@ h4:hover a { .card-list { margin-top: 2.25rem; } + +.edit-page { + margin-top: 3rem; + font-size: $font-size-base; +} + +.edit-page svg { + margin-right: 0.5rem; + margin-bottom: 0.25rem; +} + +p.meta { + margin-top: 0.5rem; + font-size: $font-size-base; +} diff --git a/assets/scss/layouts/_posts.scss b/assets/scss/layouts/_posts.scss index d43e3df..da27660 100644 --- a/assets/scss/layouts/_posts.scss +++ b/assets/scss/layouts/_posts.scss @@ -1,16 +1,19 @@ -.authors.list .card, +.home .card, +.contributors.list .card, .blog.list .card { margin-top: 2rem; margin-bottom: 2rem; transition: transform 0.3s; } -.authors.list .card:hover, +.home .card:hover, +.contributors.list .card:hover, .blog.list .card:hover { transform: scale(1.025); } -.authors.list .card-body, +.home .card-body, +.contributors.list .card-body, .blog.list .card-body { padding: 0 2rem 1rem; } diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..ce9c9de --- /dev/null +++ b/babel.config.js @@ -0,0 +1,17 @@ +module.exports = { + presets: [ + [ + '@babel/preset-env', + { + targets: { + browsers: [ + // Best practice: https://github.com/babel/babel/issues/7789 + '>=1%', + 'not ie 11', + 'not op_mini all' + ] + } + } + ] + ] +}; \ No newline at end of file diff --git a/config/_default/config.toml b/config/_default/config.toml index 51cce44..0ceb830 100644 --- a/config/_default/config.toml +++ b/config/_default/config.toml @@ -1,19 +1,17 @@ baseurl = "/" disableAliases = true disableHugoGeneratorInject = true -# disableKinds = ["taxonomy", "taxonomyTerm"] enableEmoji = true +enableGitInfo = true enableRobotsTXT = true languageCode = "en-US" paginate = 7 rssLimit = 10 -[taxonomies] - author = "authors" - # add redirects/headers [outputs] home = ["HTML", "RSS", "REDIRECTS", "HEADERS"] +section = ["HTML", "SITEMAP"] # remove .{ext} from text/netlify [mediaTypes."text/netlify"] @@ -22,24 +20,36 @@ delimiter = "" # add output format for netlify _redirects [outputFormats.REDIRECTS] -mediatype = "text/netlify" +mediaType = "text/netlify" baseName = "_redirects" isPlainText = true notAlternative = true # add output format for netlify _headers [outputFormats.HEADERS] -mediatype = "text/netlify" +mediaType = "text/netlify" baseName = "_headers" isPlainText = true notAlternative = true +# add output format for section sitemap.xml +[outputFormats.SITEMAP] +mediaType = "application/xml" +baseName = "sitemap" +isHTML = false +isPlainText = true +noUgly = true +rel = "sitemap" + [markup] [markup.goldmark] + [markup.goldmark.extensions] + linkify = false [markup.goldmark.renderer] unsafe = true [markup.highlight] codeFences = true + guessSyntax = false hl_Lines = "" lineNoStart = 1 lineNos = false @@ -53,6 +63,12 @@ notAlternative = true filename = "sitemap.xml" priority = 0.5 +[taxonomies] + contributor = "contributors" + +[permalinks] + blog = "/blog/:title/" + [module] [[module.mounts]] source = "assets" @@ -64,5 +80,11 @@ notAlternative = true source = "node_modules/lazysizes" target = "assets/js/vendor/lazysizes" [[module.mounts]] - source = "node_modules/ga-lite/dist" - target = "static/js/vendor/ga-lite" + source = "node_modules/instant.page" + target = "assets/js/vendor/instant.page" + [[module.mounts]] + source = "node_modules/lazysizes" + target = "assets/js/vendor/lazysizes" + [[module.mounts]] + source = "node_modules/flexsearch" + target = "assets/js/vendor/flexsearch" diff --git a/config/_default/menus.toml b/config/_default/menus.toml index 5e1813d..10fa10e 100644 --- a/config/_default/menus.toml +++ b/config/_default/menus.toml @@ -5,8 +5,26 @@ url = "/docs/prologue/" [[docs]] - name = "Help" + name = "Basic Hyas" weight = 20 + identifier = "basic-hyas" + url = "/docs/basic-hyas/" + +[[docs]] + name = "Core Hyas" + weight = 30 + identifier = "core-hyas" + url = "/docs/core-hyas/" + +[[docs]] + name = "Guides" + weight = 40 + identifier = "guides" + url = "/docs/guides/" + +[[docs]] + name = "Help" + weight = 50 identifier = "help" url = "/docs/help/" @@ -20,14 +38,15 @@ url = "/blog/" weight = 20 -[[social]] - name = "Twitter" - pre = "" - url = "https://twitter.com/getdoks" - weight = 10 +# [[social]] +# name = "Twitter" +# pre = "" +# url = "https://twitter.com/gethyas" +# weight = 10 [[social]] name = "GitHub" pre = "" url = "https://github.com/h-enk/doks" + post = "v0.1.0" weight = 20 diff --git a/config/_default/params.toml b/config/_default/params.toml index 491a6ee..4a8806d 100644 --- a/config/_default/params.toml +++ b/config/_default/params.toml @@ -1,27 +1,38 @@ title = "Doks" titleSeparator = "-" -titleAddition = "Modern Hugo Documentation Starter" -description = "Hugo starter helping you build modern documentation websites." -images = ["image-doks.png"] -twitterSite = "@henkverlinde" -twitterCreator = "@henkverlinde" +titleAddition = "Modern Documentation Theme" +description = "Doks is a Hugo theme helping you build modern documentation websites that are secure, fast, and SEO-ready — by default." + +images = ["hyas.png"] + +twitterSite = "henkverlinde" +twitterCreator = "henkverlinde" +facebookAuthor = "verlinde.henk" +facebookPublisher = "verlinde.henk" ogLocale = "en_US" + schemaType = "Organization" -schemaLogo = "logo-doks.png" -schemaTwitter = "https://twitter.com/getdoks" +schemaLogo = "logo-hyas.png" +schemaTwitter = "https://twitter.com/henkverlinde" schemaLinkedIn = "https://www.linkedin.com/in/henkverlinde/" -schemaSection = "news" +schemaGitHub = "https://github.com/h-enk" +schemaSection = "blog" + siteLinksSearchBox = false themeColor = "#fff" -# googleAnalytics = "UA-99999999-1" - quality = 85 bgColor = "#fff" -landscapePhotoWidths = [900, 700, 500] -portraitPhotoWidths = [1500, 1000, 750] +landscapePhotoWidths = [1000, 800, 700, 600, 500] +portraitPhotoWidths = [800, 700, 600, 500] lqipWidth = "20x" -footer = "© 2020 Henk Verlinde - MIT License" -version = "v0.1.0" +footer = "An open source project by @HenkVerlinde" + +alert = false +alertText = "Like Doks? Star on GitHub. Thanks!" + +hyasVersion = "v0.2.0" + +docsRepo = "https://github.com/h-enk/doks" diff --git a/config/postcss.config.js b/config/postcss.config.js index eea7a78..119d5f1 100644 --- a/config/postcss.config.js +++ b/config/postcss.config.js @@ -10,12 +10,12 @@ module.exports = { './layouts/**/*.html', './content/**/*.md', ], - whitelist: [ + safelist: [ 'lazyloaded', ...whitelister([ - './assets/scss/common/_dark.scss', - './assets/scss/common/_syntax.scss', './assets/scss/components/_code.scss', + './assets/scss/components/_search.scss', + './assets/scss/common/_dark.scss', ]), ], }), diff --git a/config/production/params.toml b/config/production/.gitkeep similarity index 100% rename from config/production/params.toml rename to config/production/.gitkeep diff --git a/config/production/config.toml b/config/production/config.toml deleted file mode 100644 index 0a9e67b..0000000 --- a/config/production/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -baseurl = "https://doks.netlify.app/" -canonifyURLs = false diff --git a/config/staging/params.toml b/config/staging/.gitkeep similarity index 100% rename from config/staging/params.toml rename to config/staging/.gitkeep diff --git a/config/staging/config.toml b/config/staging/config.toml deleted file mode 100644 index 14e8022..0000000 --- a/config/staging/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -baseurl = "https://doks-staging.netlify.app/" -canonifyURLs = false diff --git a/content/_index.md b/content/_index.md index ce8c3a9..d3ac3c4 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1,23 +1,13 @@ --- -title : "Doks" -description: "Hugo starter helping you build modern documentation websites." -date: 2020-04-17T08:47:36+00:00 +title : "Modern Documentation Theme" +description: "Doks is a Hugo theme helping you build modern documentation websites that are secure, fast, and SEO-ready — by default." +lead: "Doks is a Hugo theme helping you build modern documentation websites that are secure, fast, and SEO-ready — by default." +date: 2020-10-06T08:47:36+00:00 +lastmod: 2020-10-06T08:47:36+00:00 draft: false -images: [image-doks.png] -lead: "Hugo starter helping you build modern documentation websites." +images: [] --- -
-
-

100/A+ scores

-

Get perfect Google Lighthouse and Mozilla Observatory scores by default.

-
-
-

Algolia DocSearch

-

The best search experience for docs, by Algolia, for free.

-
-
-

Dark/Light toggle

-

Enable dark mode at night or in dark environments.

-
-
\ No newline at end of file + diff --git a/content/authors/_index.md b/content/authors/_index.md deleted file mode 100644 index 976ef7b..0000000 --- a/content/authors/_index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Authors" -description: "The Doks Blog authors." -date: 2020-04-17T08:50:29+00:00 -draft: false -images: [image-doks.png] ---- - -The Doks Blog authors diff --git a/content/authors/henk-verlinde/_index.md b/content/authors/henk-verlinde/_index.md deleted file mode 100644 index 17eb2a0..0000000 --- a/content/authors/henk-verlinde/_index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "Henk Verlinde" -description: "Creator of Doks." -date: 2020-04-17T08:50:45+00:00 -draft: false -images: [image-doks.png] ---- - -Creator of Doks. - -[@HenkVerlinde](https://twitter.com/henkverlinde) diff --git a/content/blog/_index.md b/content/blog/_index.md index 89cee49..ed7767a 100644 --- a/content/blog/_index.md +++ b/content/blog/_index.md @@ -1,7 +1,8 @@ --- title: "Blog" -description: "The Doks Blog." -date: 2020-04-17T08:49:55+00:00 +description: "The Hyas Blog." +date: 2020-10-06T08:49:55+00:00 +lastmod: 2020-10-06T08:49:55+00:00 draft: false -images: [image-doks.png] +images: [] --- diff --git a/content/blog/say-hello-to-doks/index.md b/content/blog/say-hello-to-doks/index.md deleted file mode 100644 index 90057de..0000000 --- a/content/blog/say-hello-to-doks/index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Say hello to Doks 👋" -description: "Doks is a Hugo starter helping you build modern documentation websites." -lead: "Doks is a Hugo starter helping you build modern documentation websites." -date: 2020-04-17T08:50:12+00:00 -draft: false -images: [image-doks.png] -authors: ["Henk Verlinde"] ---- diff --git a/content/blog/say-hello-to-hyas/google-lighthouse-scores-hyas.png b/content/blog/say-hello-to-hyas/google-lighthouse-scores-hyas.png new file mode 100644 index 0000000000000000000000000000000000000000..5fc2c488e408e9a3b67e7c845ddc0330f19defc8 GIT binary patch literal 24319 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 literal 0 HcmV?d00001 diff --git a/content/blog/say-hello-to-hyas/index.md b/content/blog/say-hello-to-hyas/index.md new file mode 100644 index 0000000..7b0b073 --- /dev/null +++ b/content/blog/say-hello-to-hyas/index.md @@ -0,0 +1,55 @@ +--- +title: "Say hello to Hyas 👋" +description: "Introducing Hyas, a Hugo starter helping you build modern websites that are secure, fast, and SEO-ready — by default." +lead: "Introducing Hyas, a Hugo starter helping you build modern websites that are secure, fast, and SEO-ready — by default." +date: 2020-10-06T08:50:12+00:00 +lastmod: 2020-10-06T08:50:12+00:00 +draft: false +weight: 50 +images: ["say-hello-to-hyas.png", "google-lighthouse-scores-hyas.png", "mozilla-observatory-scores-hyas.png"] +contributors: ["Henk Verlinde"] +--- + +## Solid as a rock + +Some website projects require a solid starting point. With a great developer experience and a sound user experience. Sometimes you just don't want to start from scratch. That's why I created Hyas 💚 + +## This is how we do it + +Making use of the power of Hugo. Following best practices for performance, SEO and security. Optimized for the Netlify platform. And always flexible, so you can easily make it your own. + +## Say Whaaat? + +- Security aware +- Fast by default ⚡️ +- SEO-ready +- Development tools (linting, cleaning) +- Bootstrap framework +- Netlify-ready (functions, redirects, headers) + +### 100 scores on Google Lighthouse + +{{< img-simple src="google-lighthouse-scores-hyas.png" alt="Google Lighthouse Scores Hyas" >}} + +Get 100 scores on [Google Lighthouse](https://googlechrome.github.io/lighthouse/viewer/?gist=8b7aec005ae7b9e128ad5c4e2f125fea) by default. Hyas removes unused css, prefetches links, and lazy loads images. + +### A+ scores on Mozilla Observatory + +Get A+ scores on [Mozilla Observatory](https://observatory.mozilla.org/analyze/hyas.netlify.app) out of the box. Easily change the default Security Headers to suit your needs. + +### What's with the name? + +Hyas used [Atlas](https://github.com/indigotree/atlas) 🙏 as a starting point. In Greek mythology, +[Hyas](https://www.greekmythology.com/Other_Gods/Minor_Gods/Hyas/hyas.html) was the son of the Titan Atlas and the Oceanid Aethra. + +## Do what? + +[Check out the docs]({{< ref "introduction" >}}) or [Deploy to Netlify](https://app.netlify.com/start/deploy?repository=https://github.com/h-enk/hyas) in less than a minute. + +### Contribute + +Contributions are welcome. Check the [Code of Conduct](https://github.com/h-enk/hyas/blob/master/CODE_OF_CONDUCT.md). [Suggest an idea](https://github.com/h-enk/hyas/issues/new?template=feature-request---.md), [Create a bug report](https://github.com/h-enk/hyas/issues/new?template=bug-report---.md), or [Improve the documentation](https://github.com/h-enk/gethyas.com/tree/master/content/docs). + +### Star + +Like Hyas? [Star the Hyas repo on GitHub](https://github.com/h-enk/hyas/stargazers). Thanks! diff --git a/content/blog/say-hello-to-hyas/mozilla-observatory-scores-hyas.png b/content/blog/say-hello-to-hyas/mozilla-observatory-scores-hyas.png new file mode 100644 index 0000000000000000000000000000000000000000..03e88e5edafca3695fa85c59c9266d2561dfabfc GIT binary patch literal 15175 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 literal 0 HcmV?d00001 diff --git a/content/blog/say-hello-to-hyas/say-hello-to-hyas.png b/content/blog/say-hello-to-hyas/say-hello-to-hyas.png new file mode 100644 index 0000000000000000000000000000000000000000..a131a0dc475ff896d050049867d234ae7b6348e3 GIT binary patch literal 34206 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%0AnvTz@E;4>8;fWg=U7 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

diff --git a/content/contributors/_index.md b/content/contributors/_index.md new file mode 100644 index 0000000..f115059 --- /dev/null +++ b/content/contributors/_index.md @@ -0,0 +1,10 @@ +--- +title: "Contributors" +description: "The Hyas contributors." +date: 2020-10-06T08:50:29+00:00 +lastmod: 2020-10-06T08:50:29+00:00 +draft: false +images: [] +--- + +The Hyas contributors. diff --git a/content/contributors/henk-verlinde/_index.md b/content/contributors/henk-verlinde/_index.md new file mode 100644 index 0000000..f775534 --- /dev/null +++ b/content/contributors/henk-verlinde/_index.md @@ -0,0 +1,12 @@ +--- +title: "Henk Verlinde" +description: "Creator of Hyas." +date: 2020-10-06T08:50:45+00:00 +lastmod: 2020-10-06T08:50:45+00:00 +draft: false +images: [] +--- + +Creator of Hyas. + +[@HenkVerlinde](https://twitter.com/henkverlinde) diff --git a/content/docs/_index.md b/content/docs/_index.md index 9921c4b..e74bd7a 100644 --- a/content/docs/_index.md +++ b/content/docs/_index.md @@ -1,8 +1,9 @@ --- title : "Docs" -description: "Docs Doks." +description: "Docs Hyas." lead: "" -date: 2020-04-17T08:48:23+00:00 +date: 2020-10-06T08:48:23+00:00 +lastmod: 2020-10-06T08:48:23+00:00 draft: false -images: [image-doks.png] +images: [] --- diff --git a/content/docs/basic-hyas/_index.md b/content/docs/basic-hyas/_index.md new file mode 100644 index 0000000..f1fb62c --- /dev/null +++ b/content/docs/basic-hyas/_index.md @@ -0,0 +1,9 @@ +--- +title: "Basic Hyas" +description: "Basic Hyas." +lead: "" +date: 2020-04-20T11:52:49+02:00 +lastmod: 2020-04-20T11:52:49+02:00 +draft: false +images: [] +--- diff --git a/content/docs/basic-hyas/archetypes.md b/content/docs/basic-hyas/archetypes.md new file mode 100644 index 0000000..484ef3a --- /dev/null +++ b/content/docs/basic-hyas/archetypes.md @@ -0,0 +1,53 @@ +--- +title: "Archetypes" +description: "" +lead: "" +date: 2020-09-21T13:58:42+02:00 +lastmod: 2020-09-21T13:58:42+02:00 +draft: false +images: [] +menu: + docs: + parent: "basic-hyas" +weight: 130 +toc: true +--- + +```bash +.. +├── blog.md +└── default.md +``` + +See also the Hugo docs: [Archetypes](https://gohugo.io/content-management/archetypes/). + +## blog.md + +```md +--- +title: "{{ replace .Name "-" " " | title }}" +description: "" +excerpt: "" +date: {{ .Date }} +lastmod: {{ .Date }} +draft: true +weight: 50 +images: ["{{ .Name | urlize }}.jpg"] +categories: [""] +--- + +{{}} +``` + +## default.md + +```md +--- +title: "{{ replace .Name "-" " " | title }}" +description: "" +date: {{ .Date }} +lastmod: {{ .Date }} +draft: true +images: [] +--- +``` diff --git a/content/docs/basic-hyas/assets.md b/content/docs/basic-hyas/assets.md new file mode 100644 index 0000000..7ef5e99 --- /dev/null +++ b/content/docs/basic-hyas/assets.md @@ -0,0 +1,32 @@ +--- +title: "Assets" +description: "" +lead: "" +date: 2020-09-21T14:41:53+02:00 +lastmod: 2020-09-21T14:41:53+02:00 +draft: false +images: [] +menu: + docs: + parent: "basic-hyas" +weight: 140 +toc: true +--- + +```bash +.. +├── fonts/ +├── images/ +├── js/ +│ ├── vendor/ +│ └── app.js +├── lambda/ +└── scss/ + ├── common/ + ├── components/ + ├── layouts/ + ├── vendor/ + └── app.scss +``` + +See also the Hugo docs: [Hugo Pipes](https://gohugo.io/hugo-pipes/). diff --git a/content/docs/basic-hyas/deployment.md b/content/docs/basic-hyas/deployment.md new file mode 100644 index 0000000..6c8c95f --- /dev/null +++ b/content/docs/basic-hyas/deployment.md @@ -0,0 +1,34 @@ +--- +title: "Deployment" +description: "Deployment Hyas." +lead: "Hyas is optimized for deployment to Netlify, but you can use any other static web host if you prefer." +date: 2020-04-20T12:46:25+02:00 +lastmod: 2020-04-20T12:46:25+02:00 +draft: false +images: [] +menu: + docs: + parent: "basic-hyas" +weight: 160 +toc: true +--- + +```bash +yarn build +``` + +## Netlify + +See also: [Netlify]({{< ref "netlify" >}}). + +### Netlify Drop + +Netlify Drop lets you deploy a website with simply drag & drop. + +- Run `yarn build` in your project folder. +- This will generate a `public` folder where your generated site is located. +- Visit [Netlify Drop](https://app.netlify.com/drop) and drop the `public` folder there. + +## Other hosting options + +See the Hugo Docs: [Hosting & Deployment](https://gohugo.io/hosting-and-deployment/). diff --git a/content/docs/basic-hyas/directory-structure.md b/content/docs/basic-hyas/directory-structure.md new file mode 100644 index 0000000..57356ff --- /dev/null +++ b/content/docs/basic-hyas/directory-structure.md @@ -0,0 +1,185 @@ +--- +title: "Directory Structure" +description: "The Hyas project directory structure extends Hugo's." +lead: "The Hyas project directory structure extends Hugo's." +date: 2020-04-20T14:14:16+02:00 +lastmod: 2020-04-20T14:14:16+02:00 +draft: false +images: [] +menu: + docs: + parent: "basic-hyas" +weight: 110 +toc: true +--- + +```bash +. +├── archetypes/ +├── assets/ +├── config/ +├── content/ +├── data/ +├── layouts/ +├── static/ +├── .eslintignore +├── .eslintrc.json +├── .markdownlint.json +├── .markdownlintignore +├── .stylelintignore +├── .stylelintrc.json +├── babel.config.js +├── netlify.toml +└── package.json +``` + +See also the Hugo docs: [Directory Structure](https://gohugo.io/getting-started/directory-structure/). + +## Root directories + +### archetypes + +```bash +.. +├── blog.md +└── default.md +``` + +See also: [Archetypes]({{< ref "archetypes" >}}). + +### assets + +```bash +.. +├── fonts/ +├── images/ +├── js/ +│ ├── vendor/ +│ └── app.js +├── lambda/ +└── scss/ + ├── common/ + ├── components/ + ├── layouts/ + ├── vendor/ + └── app.scss +``` + +See also: [Assets]({{< ref "assets" >}}) + +### config + +```bash +.. +├── _default/ +│ ├── config.toml +│ ├── menus.toml +│ └── params.toml +├── production/ +├── staging/ +└── postcss.config.js +``` + +See also: [Project Configuration]({{< ref "project-configuration" >}}). + +### content + +```bash +.. +├── blog/ +├── quick-start/ +└── _index.md +``` + +See also the Hugo docs: [Content Organization](https://gohugo.io/content-management/organization/). + +### data + +See the Hugo docs: [Data Templates](https://gohugo.io/templates/data-templates/). + +### layouts + +```bash +.. +├── _default/ +│ ├── baseof.html +│ ├── list.html +│ └── single.html +├── blog/ +│ └── single.html +├── categories/ +│ ├── list.html +│ └── terms.html +├── partials/ +│ ├── content/ +│ ├── footer/ +│ │ ├── footer.html +│ │ └── script-footer.html +│ ├── head/ +│ │ ├── favicons.html +│ │ ├── head.html +│ │ ├── opengraph.html +│ │ ├── resource-hints.html +│ │ ├── script-header.html +│ │ ├── seo.html +│ │ ├── structured-data.html +│ │ ├── stylesheet.html +│ │ └── twitter_cards.html +│ ├── header/ +│ │ ├── alert.html +│ │ └── header.html +│ └── sidebar/ +├── shortcodes/ +│ └── img.html +├── 404.html +├── index.headers +├── index.html +├── index.redirects +├── robots.txt +├── rss.xml +└── sitemap.xml +``` + +See also: [Layouts]({{< ref "layouts" >}}). + +### static + +See the Hugo docs: [Static Files](https://gohugo.io/content-management/static-files/) + +## Root files + +### .eslintignore + +See the ESLint docs: [Ignoring Files and Directories](https://eslint.org/docs/user-guide/configuring#ignoring-files-and-directories). + +### .eslintrc.json + +See the ESLint docs: [Configuring ESLint](https://eslint.org/docs/user-guide/configuring). + +### .markdownlint.json + +See the markdownlint Readme: [Rules / Aliases](https://github.com/DavidAnson/markdownlint#rules--aliases). + +### .markdownlintignore + +See the markdownlint-cli Readme: [Ignoring Files](https://github.com/igorshubovych/markdownlint-cli#ignoring-files). + +### .stylelintignore + +See the stylelint docs: [Ignoring code](https://stylelint.io/user-guide/ignore-code). + +### .stylelintrc.json + +See the stylelint docs: [Configuration](https://stylelint.io/user-guide/configure). + +### babel.config.js + +See the Babel docs: [Configure Babel](https://babeljs.io/docs/en/configuration). + +### netlify.toml + +See the Netlify docs: [File-based configuration](https://docs.netlify.com/configure-builds/file-based-configuration/). + +### package.json + +See the Yarn Documentation: [package.json](https://classic.yarnpkg.com/en/docs/package-json/). diff --git a/content/docs/basic-hyas/layouts.md b/content/docs/basic-hyas/layouts.md new file mode 100644 index 0000000..25af8c7 --- /dev/null +++ b/content/docs/basic-hyas/layouts.md @@ -0,0 +1,57 @@ +--- +title: "Layouts" +description: "" +lead: "" +date: 2020-09-21T14:13:01+02:00 +lastmod: 2020-09-21T14:13:01+02:00 +draft: false +images: [] +menu: + docs: + parent: "basic-hyas" +weight: 150 +toc: true +--- + +```bash +.. +├── _default/ +│ ├── baseof.html +│ ├── list.html +│ └── single.html +├── blog/ +│ └── single.html +├── categories/ +│ ├── list.html +│ └── terms.html +├── partials/ +│ ├── content/ +│ ├── footer/ +│ │ ├── footer.html +│ │ └── script-footer.html +│ ├── head/ +│ │ ├── favicons.html +│ │ ├── head.html +│ │ ├── opengraph.html +│ │ ├── resource-hints.html +│ │ ├── script-header.html +│ │ ├── seo.html +│ │ ├── structured-data.html +│ │ ├── stylesheet.html +│ │ └── twitter_cards.html +│ ├── header/ +│ │ ├── alert.html +│ │ └── header.html +│ └── sidebar/ +├── shortcodes/ +│ └── img.html +├── 404.html +├── index.headers +├── index.html +├── index.redirects +├── robots.txt +├── rss.xml +└── sitemap.xml +``` + +See also the Hugo docs: [Templates](https://gohugo.io/templates/). diff --git a/content/docs/basic-hyas/project-configuration.md b/content/docs/basic-hyas/project-configuration.md new file mode 100644 index 0000000..d0ac1c8 --- /dev/null +++ b/content/docs/basic-hyas/project-configuration.md @@ -0,0 +1,142 @@ +--- +title: "Project Configuration" +description: "The Hyas project configuration extends Hugo's." +lead: "The Hyas project configuration extends Hugo's." +date: 2020-09-21T12:19:02+02:00 +lastmod: 2020-09-21T12:19:02+02:00 +draft: false +images: [] +menu: + docs: + parent: "basic-hyas" +weight: 120 +toc: true +--- + +```bash +.. +├── _default/ +│ ├── config.toml +│ ├── menus.toml +│ └── params.toml +├── production/ +├── staging/ +└── postcss.config.js +``` + +See also the Hugo docs: [Configure Hugo](https://gohugo.io/getting-started/configuration/). + +## config.toml + +### Netlify specifics + +```toml +# add redirects/headers +[outputs] +home = ["HTML", "RSS", "REDIRECTS", "HEADERS"] + +# remove .{ext} from text/netlify +[mediaTypes."text/netlify"] +suffixes = [""] +delimiter = "" + +# add output format for netlify _redirects +[outputFormats.REDIRECTS] +mediatype = "text/netlify" +baseName = "_redirects" +isPlainText = true +notAlternative = true + +# add output format for netlify _headers +[outputFormats.HEADERS] +mediatype = "text/netlify" +baseName = "_headers" +isPlainText = true +notAlternative = true +``` + +## menus.toml + +No specifics. + +## params.toml + +### SEO specifics + +```toml +title = "Hyas" +titleSeparator = "-" +titleAddition = "Modern Hugo Starter" +description = "Hugo starter helping you build modern websites." + +images = ["hyas.png"] + +twitterSite = "@henkverlinde" +twitterCreator = "@henkverlinde" +facebookAuthor = "verlinde.henk" +facebookPublisher = "verlinde.henk" +ogLocale = "en_US" + +schemaType = "Organization" +schemaLogo = "logo-hyas.png" +schemaTwitter = "https://twitter.com/henkverlinde" +schemaLinkedIn = "https://www.linkedin.com/in/henkverlinde/" +schemaGitHub = "https://github.com/h-enk" +schemaSection = "blog" + +siteLinksSearchBox = false + +themeColor = "#fff" +``` + +### Image shortcode + +```toml +quality = 85 +bgColor = "#fff" +landscapePhotoWidths = [1000, 800, 700, 600, 500] +portraitPhotoWidths = [800, 700, 600, 500] +lqipWidth = "20x" +``` + +### Footer + +```toml +footer = "© 2020 Henk Verlinde - MIT License" +``` + +### Alert + +```toml +alert = false +alertText = "Deliver web projects 10x faster. Get the free enterprise paper →" +``` + +## postcss.config.js + +```js +const autoprefixer = require('autoprefixer'); +const purgecss = require('@fullhuman/postcss-purgecss'); +const whitelister = require('purgecss-whitelister'); + +module.exports = { + plugins: [ + autoprefixer(), + purgecss({ + content: [ + './layouts/**/*.html', + './content/**/*.md', + ], + whitelist: [ + 'lazyloaded', + ...whitelister([ + './assets/scss/components/_syntax.scss', + './assets/scss/components/_code.scss', + ]), + ], + }), + ], +} +``` + +See also: [Unused CSS removal]({{< ref "performance#unused-css-removal" >}}). diff --git a/content/docs/core-hyas/_index.md b/content/docs/core-hyas/_index.md new file mode 100644 index 0000000..8e44b9b --- /dev/null +++ b/content/docs/core-hyas/_index.md @@ -0,0 +1,9 @@ +--- +title: "Assets" +description: "Assets Hyas." +lead: "" +date: 2020-04-20T11:52:58+02:00 +lastmod: 2020-04-20T11:52:58+02:00 +draft: false +images: [] +--- diff --git a/content/docs/core-hyas/bootstrap.md b/content/docs/core-hyas/bootstrap.md new file mode 100644 index 0000000..ccc21c1 --- /dev/null +++ b/content/docs/core-hyas/bootstrap.md @@ -0,0 +1,15 @@ +--- +title: "Bootstrap" +description: "Build robust, flexible, and intuitive websites with Bootstrap. Or use any other front-end framework if you prefer." +lead: "Build robust, flexible, and intuitive websites with Bootstrap. Or use any other front-end framework if you prefer." +date: 2020-09-21T16:00:43+02:00 +lastmod: 2020-09-21T16:00:43+02:00 +draft: false +images: [] +menu: + docs: + parent: "core-hyas" +weight: 250 +toc: true +--- + diff --git a/content/docs/core-hyas/development-tools.md b/content/docs/core-hyas/development-tools.md new file mode 100644 index 0000000..701db38 --- /dev/null +++ b/content/docs/core-hyas/development-tools.md @@ -0,0 +1,15 @@ +--- +title: "Development Tools" +description: "Code with confidence. Check styles, scripts, and markdown for errors and fix automatically or manually." +lead: "Code with confidence. Check styles, scripts, and markdown for errors and fix automatically or manually." +date: 2020-09-21T14:26:38+02:00 +lastmod: 2020-09-21T14:26:38+02:00 +draft: false +images: [] +menu: + docs: + parent: "core-hyas" +weight: 240 +toc: true +--- + diff --git a/content/docs/core-hyas/netlify.md b/content/docs/core-hyas/netlify.md new file mode 100644 index 0000000..1c43e02 --- /dev/null +++ b/content/docs/core-hyas/netlify.md @@ -0,0 +1,91 @@ +--- +title: "Netlify" +description: "Deploy to Netlify with sensible defaults. Easily use Netlify Functions, Netlify Redirects, and Netlify Headers." +lead: "Deploy to Netlify with sensible defaults. Easily use Netlify Functions, Netlify Redirects, and Netlify Headers." +date: 2020-09-21T15:58:12+02:00 +lastmod: 2020-09-21T15:58:12+02:00 +draft: false +images: [] +menu: + docs: + parent: "core-hyas" +weight: 260 +toc: true +--- + +```bash +. +├── assets/ +│ └── lambda/ +├── layouts/ +│ ├── index.headers +│ └── index.redirects +└── netlify.toml +``` + +See also the Hugo Docs: [Host on Netlify](https://gohugo.io/hosting-and-deployment/hosting-on-netlify/). + +## Functions + +Functions in `./assets/lambda/` are compiled on build to `./functions/`. + +See also the Netlify docs: [Functions overview](https://docs.netlify.com/functions/overview/) + +## Redirects + +`./layouts/index.redirects` is converted on build to `./public/_redirects`. + +```bash +{{ range $pages := .Site.Pages -}} + {{ range .Aliases -}} + {{ . }} {{ $pages.RelPermalink -}} + {{ end -}} +{{ end -}} +``` + +See also the Netlify docs: [Redirects and rewrites](https://docs.netlify.com/routing/redirects/) + +## Headers + +`./layouts/index.headers` is converted on build to `./public/_headers`. + +```bash +/* + Strict-Transport-Security: max-age=31536000; includeSubDomains; preload + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + Content-Security-Policy: default-src 'none'; manifest-src 'self'; connect-src 'self'; font-src 'self'; img-src 'self'; script-src 'self'; style-src 'self' + X-Frame-Options: SAMEORIGIN + Referrer-Policy: strict-origin + Feature-Policy: geolocation 'self' + Cache-Control: public, max-age=31536000 +``` + +See also the Netlify docs: [Custom headers](https://docs.netlify.com/routing/headers/) + +## Build and deploy + +`./netlify.toml`: + +```toml +[build] + publish = "public" + functions = "functions" + +[build.environment] + HUGO_VERSION = "0.74.3" + NODE_VERSION = "13.11.0" + NPM_VERSION = "6.13.7" + YARN_VERSION = "1.22.4" + +[context.production] + command = "hugo -b $URL --gc --minify && npm run build:functions" + +[context.deploy-preview] + command = "hugo -b $DEPLOY_PRIME_URL --gc --minify" + +[context.branch-deploy] + command = "hugo -b $DEPLOY_PRIME_URL --gc --minify" +``` + +See also the Netlify docs: [File-based configuration](https://docs.netlify.com/configure-builds/file-based-configuration/) diff --git a/content/docs/core-hyas/performance.md b/content/docs/core-hyas/performance.md new file mode 100644 index 0000000..3d88fdc --- /dev/null +++ b/content/docs/core-hyas/performance.md @@ -0,0 +1,61 @@ +--- +title: "Performance" +description: "Get 100 scores on Google Lighthouse by default. Hyas removes unused css, prefetches links, and lazy loads images." +lead: "Get 100 scores on Google Lighthouse by default. Hyas removes unused css, prefetches links, and lazy loads images." +date: 2020-09-17T15:37:44+02:00 +lastmod: 2020-09-17T15:37:44+02:00 +draft: false +images: [] +menu: + docs: + parent: "core-hyas" +weight: 220 +toc: true +--- + +## Unused CSS removal + +`./config/postcss.config.js`: + +```js +const autoprefixer = require('autoprefixer'); +const purgecss = require('@fullhuman/postcss-purgecss'); +const whitelister = require('purgecss-whitelister'); + +module.exports = { + plugins: [ + autoprefixer(), + purgecss({ + content: [ + './layouts/**/*.html', + './content/**/*.md', + ], + whitelist: [ + 'lazyloaded', + ...whitelister([ + './assets/scss/components/_syntax.scss', + './assets/scss/components/_code.scss', + ]), + ], + }), + ], +} +``` + +See also the PurgeCSS docs: [Configuration](https://purgecss.com/configuration.html), and the Purgecss Whitelister [Readme](https://github.com/qodesmith/purgecss-whitelister#readme). + +## Asset minification + +Hyas uses [Hugo](https://gohugo.io/hugo-pipes/minification/) to minify CSS, JS and HTML. + +## Link prefetching + +Hyas uses [instant.page](https://instant.page/) with default settings for link prefetching. By default, instant.page preloads 65 ms after hovering a link and when a mobile user starts touching their display. + +See also the instant.page website: [Intensity](https://instant.page/intensity). + +## Lazy loading images + +Hyas uses [lazysizes](https://github.com/aFarkas/lazysizes) with a Low Quality Image Placeholder (LQIP) to lazyload images added with the [image shortcode]({{< ref "layouts" >}}). The LQIP is blurred with a CSS filter. + +See also the lazysizes [Readme](https://github.com/aFarkas/lazysizes#readme) diff --git a/content/docs/core-hyas/security.md b/content/docs/core-hyas/security.md new file mode 100644 index 0000000..e115827 --- /dev/null +++ b/content/docs/core-hyas/security.md @@ -0,0 +1,37 @@ +--- +title: "Security" +description: "Get A+ scores on Mozilla Observatory out of the box. Easily change the default Security Headers to suit your needs." +lead: "Get A+ scores on Mozilla Observatory out of the box. Easily change the default Security Headers to suit your needs." +date: 2020-09-17T13:48:09+02:00 +lastmod: 2020-09-17T13:48:09+02:00 +draft: false +images: [] +menu: + docs: + parent: "core-hyas" +weight: 210 +toc: true +--- + +## Security Headers + +`./layouts/index.headers` excerpt: + +```bash +/* + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + Content-Security-Policy: default-src 'none'; manifest-src 'self'; connect-src 'self'; font-src 'self'; img-src 'self'; script-src 'self'; style-src 'self' + X-Frame-Options: SAMEORIGIN + Referrer-Policy: strict-origin +``` + +See also: [Headers]({{< ref "netlify#headers" >}}). + +### Content Security Policy + +💡 [Laboratory](https://addons.mozilla.org/nl/firefox/addon/laboratory-by-mozilla/) is an experimental Firefox extension that helps you generate a Content Security Policy (CSP) header for your website. + +## Subresource Integrity + +[Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) is implemented with [Hugo](https://gohugo.io/hugo-pipes/fingerprint/) on styles and scripts. diff --git a/content/docs/core-hyas/seo.md b/content/docs/core-hyas/seo.md new file mode 100644 index 0000000..68862d7 --- /dev/null +++ b/content/docs/core-hyas/seo.md @@ -0,0 +1,15 @@ +--- +title: "SEO" +description: "Use sensible defaults for structured data, open graph, and Twitter cards. Or easily change the SEO settings to your liking." +lead: "Use sensible defaults for structured data, open graph, and Twitter cards. Or easily change the SEO settings to your liking." +date: 2020-09-18T14:25:19+02:00 +lastmod: 2020-09-18T14:25:19+02:00 +draft: false +images: [] +menu: + docs: + parent: "core-hyas" +weight: 230 +toc: true +--- + diff --git a/content/docs/guides/_index.md b/content/docs/guides/_index.md new file mode 100644 index 0000000..e9f52c0 --- /dev/null +++ b/content/docs/guides/_index.md @@ -0,0 +1,9 @@ +--- +title: "Guides" +description: "Guides Hyas" +lead: "" +date: 2020-04-20T11:53:07+02:00 +lastmod: 2020-04-20T11:53:07+02:00 +draft: false +images: [] +--- diff --git a/content/docs/guides/add-custom-fonts.md b/content/docs/guides/add-custom-fonts.md new file mode 100644 index 0000000..76a45dd --- /dev/null +++ b/content/docs/guides/add-custom-fonts.md @@ -0,0 +1,15 @@ +--- +title: "Add Custom Fonts" +description: "" +lead: "" +date: 2020-09-21T14:28:38+02:00 +lastmod: 2020-09-21T14:28:38+02:00 +draft: false +images: [] +menu: + docs: + parent: "guides" +weight: 310 +toc: true +--- + diff --git a/content/docs/guides/add-external-scripts.md b/content/docs/guides/add-external-scripts.md new file mode 100644 index 0000000..720b189 --- /dev/null +++ b/content/docs/guides/add-external-scripts.md @@ -0,0 +1,15 @@ +--- +title: "Add External Scripts" +description: "" +lead: "" +date: 2020-09-21T14:28:51+02:00 +lastmod: 2020-09-21T14:28:51+02:00 +draft: false +images: [] +menu: + docs: + parent: "guides" +weight: 320 +toc: true +--- + diff --git a/content/docs/help/_index.md b/content/docs/help/_index.md index 786f8dc..145bd7c 100644 --- a/content/docs/help/_index.md +++ b/content/docs/help/_index.md @@ -1,8 +1,9 @@ --- title: "Help" -description: "Help Doks." +description: "Help Hyas." lead: "" -date: 2020-04-17T08:49:15+00:00 +date: 2020-10-06T08:49:15+00:00 +lastmod: 2020-10-06T08:49:15+00:00 draft: false -images: [image-doks.png] +images: [] --- diff --git a/content/docs/help/faq.md b/content/docs/help/faq.md index 4b29870..6d76ec6 100644 --- a/content/docs/help/faq.md +++ b/content/docs/help/faq.md @@ -1,22 +1,30 @@ --- title: "FAQ" -description: "FAQ Doks." +description: "FAQ Hyas." lead: "" -date: 2020-04-17T08:49:31+00:00 +date: 2020-10-06T08:49:31+00:00 +lastmod: 2020-10-06T08:49:31+00:00 draft: false -images: [image-doks.png] +images: [] menu: docs: parent: "help" -weight: 110 +weight: 410 toc: true --- -## Where to start from here? -Please make sure to check out the documentation: -- [Hugo](https://gohugo.io/documentation/) -- [Hyas](https://gethyas.com/) -- [Doks](https://getdoks.org/) +## What's with the name? + +Hyas used [Atlas](https://github.com/indigotree/atlas) 🙏 as a starting point. In Greek mythology, +[Hyas](https://www.greekmythology.com/Other_Gods/Minor_Gods/Hyas/hyas.html) was the son of the Titan Atlas and the Oceanid Aethra. ## Can I get support? -Visit [Hugo Discourse](https://discourse.gohugo.io/) and use the search. It that does not help, start a new topic and ask your questions. + +Visit [Hugo Discourse](https://discourse.gohugo.io/) and use the search. If that does not help, start a new topic and ask your question. + +## Keyboard shortcuts for search? + +- focus: `/` +- select: `↓` and `↑` +- open: `Enter` +- close: `Esc` diff --git a/content/docs/prologue/_index.md b/content/docs/prologue/_index.md index 262b83e..9abc943 100644 --- a/content/docs/prologue/_index.md +++ b/content/docs/prologue/_index.md @@ -1,8 +1,9 @@ --- title : "Prologue" -description: "Prologue Doks." +description: "Prologue Hyas." lead: "" -date: 2020-04-17T08:48:45+00:00 +date: 2020-10-06T08:48:45+00:00 +lastmod: 2020-10-06T08:48:45+00:00 draft: false -images: [image-doks.png] +images: [] --- diff --git a/content/docs/prologue/commands.md b/content/docs/prologue/commands.md new file mode 100644 index 0000000..e309e63 --- /dev/null +++ b/content/docs/prologue/commands.md @@ -0,0 +1,92 @@ +--- +title: "Commands" +description: "Repository commands." +lead: "Repository commands." +date: 2020-10-13T15:21:01+02:00 +lastmod: 2020-10-13T15:21:01+02:00 +draft: false +images: [] +menu: + docs: + parent: "prologue" +weight: 030 +toc: true +--- + +## start + +Start local development server: + +```bash +yarn start +``` + +## build + +Build production website: + +```bash +yarn build +``` + +### :functions + +```bash +yarn build:functions +``` + +### :preview + +```bash +yarn build:preview +``` + +## server + +Start local development server: + +```bash +yarn server +``` + +## clean + +Delete temporary directories: + +```bash +yarn clean +``` + +## lint + +Check scripts, styles, and markdown for errors: + +```bash +yarn lint +``` + +### :scripts + +```bash +yarn lint:scripts [--fix] +``` + +### :styles + +```bash +yarn lint:styles [--fix] +``` + +### :markdown + +```bash +yarn lint:markdown [--fix] +``` + +## test + +Check scripts, styles, and markdown for errors: + +```bash +yarn test +``` diff --git a/content/docs/prologue/hyas-cli.md b/content/docs/prologue/hyas-cli.md new file mode 100644 index 0000000..d6c5045 --- /dev/null +++ b/content/docs/prologue/hyas-cli.md @@ -0,0 +1,103 @@ +--- +title: "Hyas CLI" +description: "Hyas command line tool." +lead: "Hyas command line tool." +date: 2020-09-22T08:38:48+02:00 +lastmod: 2020-09-22T08:38:48+02:00 +draft: false +images: [] +menu: + docs: + parent: "prologue" +weight: 020 +toc: true +--- + +```bash +Usage: hyas [options] + +Commands: + build Build production website + clean Delete temporary directories + create [dir] Create a new Hyas project + start Start local development server + +Options: + -h, --help Show help [boolean] + -v, --version Show version number [boolean] + +Run hyas --help for detailed usage of given command. +``` + +## Installation + +Install the [Hyas CLI](https://www.npmjs.com/package/@hyas/cli) globally: + +```bash +yarn add global @hyas/cli +``` + +```bash +npm install -g @hyas/cli +``` + +## npx + +Or use [npx](https://nodejs.dev/learn/the-npx-nodejs-package-runner): + +```bash +npx @hyas/cli [options] +``` + +## Commands + +### Create + +Create a new Hyas project: + +```bash +hyas create [dir] +``` + +### Start + +Start local development server: + +```bash +hyas start +``` + +### Build + +Build production website: + +```bash +hyas build +``` + +### Clean + +Delete temporary directories: + +```bash +hyas clean +``` + +## Options + +### -h, --help + +Show help. + +### -v, --version + +Show version number. + +## Update + +You'll get notified when an update is available: + +```bash +Update available: 0.3.2 +Run npm install -g @hyas/cli to update +``` diff --git a/content/docs/prologue/introduction.md b/content/docs/prologue/introduction.md index b4fc188..6cc33e8 100644 --- a/content/docs/prologue/introduction.md +++ b/content/docs/prologue/introduction.md @@ -1,10 +1,11 @@ --- title: "Introduction" -description: "Introduction Doks." -lead: "Doks is a Hugo starter helping you build modern documentation websites." -date: 2020-04-17T08:48:57+00:00 +description: "Introduction Hyas." +lead: "Hyas is a Hugo starter helping you build modern websites that are secure, fast, and SEO-ready — by default." +date: 2020-10-06T08:48:57+00:00 +lastmod: 2020-10-06T08:48:57+00:00 draft: false -images: [image-doks.png] +images: [] menu: docs: parent: "prologue" @@ -12,55 +13,92 @@ weight: 010 toc: true --- -## Features -- Lightweight code base -- 100 scores Google Lighthouse -- A+ scores [Mozilla Observatory](https://observatory.mozilla.org/) -- [Algolia DocSearch](https://docsearch.algolia.com/) support -- Dark/Light toggle -- Blog ready -- Easily make it your own -- All in [Hyas](https://github.com/h-enk/hyas) +## Why Hyas? -See a working example at [doks.netlify.app](https://doks.netlify.app/) +Six reasons why you should use Hyas: -## Requirements +1. __Security aware__. Get A+ scores on [Mozilla Observatory](https://observatory.mozilla.org/analyze/hyas.netlify.app) out of the box. Easily change the default Security Headers to suit your needs. + +2. __Fast by default__. Get 100 scores on [Google Lighthouse](https://googlechrome.github.io/lighthouse/viewer/?gist=8b7aec005ae7b9e128ad5c4e2f125fea) by default. Hyas removes unused css, prefetches links, and lazy loads images. + +3. __SEO-ready__. Use sensible defaults for structured data, open graph, and Twitter cards. Or easily change the SEO settings to your liking. + +4. __Development tools__. Code with confidence. Check styles, scripts, and markdown for errors and fix automatically or manually. + +5. __Bootstrap framework__. Build robust, flexible, and intuitive websites with Bootstrap. Or use any other front-end framework if you prefer. + +6. __Netlify-ready__. Deploy to Netlify with sensible defaults. Easily use Netlify Functions, Netlify Redirects, and Netlify Headers. + +## Prerequisites Make sure all dependencies have been installed: -- [Hugo](https://gohugo.io/) >= 0.69.0/extended -- [Node.js](https://nodejs.org/) >= 13.11.0 -- [Yarn](https://yarnpkg.com/) >= 1.22.4 (recommended) +- [Hugo](https://gohugo.io/) >= 0.75.1/extended +- [Node.js](https://nodejs.org/) >= 14.12.0 +- [Yarn](https://yarnpkg.com/) >= 1.22.5 (recommended) + +{{< alert icon="💡" text="npm (comes with Node.js) and Yarn are both Node.js package managers. Yarn is faster, more reliable, and more secure than npm." >}} ## Get started -Create a new Doks project: +Three ways to get started. + +### Hyas CLI + +Install the Hyas CLI globally: ```bash -$ git clone git@github.com:h-enk/doks.git my-doks-site +yarn add global @hyas/cli +``` + +Create a new Hyas project: + +```bash +hyas create [dir] +``` + +#### npx + +Or use [npx](https://nodejs.dev/learn/the-npx-nodejs-package-runner): + +```bash +npx @hyas/cli create my-hyas-site +``` + +See also: [Hyas CLI]({{< ref "hyas-cli" >}}). + +### Repository clone + +Create a new Hyas project: + +```bash +git clone git@github.com:h-enk/hyas.git my-hyas-site ``` Install dependencies: ```bash -# @ my-doks-site/ -$ yarn install +yarn install ``` -Build development theme with live reloading and injection: +Start local development server: ```bash -# @ my-doks-site/ -$ yarn start +yarn start ``` -### Other commands -- `yarn lint:styles` - Check Sass for errors -- `yarn lint:scripts` - Check JavaScript for errors -- `yarn clean` - Delete temporary directories -- `yarn build` - Build production theme +See also: [commands]({{< ref "commands" >}}). -## Documentation -- [Hugo](https://gohugo.io/documentation/) -- [Hyas](https://gethyas.com/) -- [Doks](https://getdoks.org/) +### Netlify deploy + +Get your Hyas site in 1 min. + +Deploy to Netlify + + + +## Example site + +👉 [hyas.netlify.app](https://hyas.netlify.app/) diff --git a/content/privacy-policy/index.md b/content/privacy-policy/index.md new file mode 100644 index 0000000..9ed6794 --- /dev/null +++ b/content/privacy-policy/index.md @@ -0,0 +1,36 @@ +--- +title: "Privacy Policy" +description: "Privacy Policy gethyas.com" +date: 2020-08-27T19:23:18+02:00 +lastmod: 2020-08-27T19:23:18+02:00 +draft: true +images: [] +--- + +__TLDR__: I do not use cookies and I do not collect any personal data. + +## Website visitors + +- No personal information is collected. +- No information is stored in the browser. +- No information is shared with, sent to or sold to third-parties. +- No information is shared with advertising companies. +- No information is mined and harvested for personal and behavioral trends. +- No information is monetized. + +### Information I collect and what I use it for + +I run [Plausible](https://plausible.io/) analytics on gethyas.com. The following information is collected: + +- __Page URL__. I track the page URL of each page view on this website. I use this to understand which pages have been viewed and how many times a particular page has been viewed. For example: _https://gethyas.com/_. +- __HTTP Referrer__. I use the referrer string to understand the number of visitors referred to this website from links on other sites. For example: _https://github.com/_. +- __Browser__. I use this to understand what browsers people use when visiting this website. This is derived from the User-Agent HTTP header. The full User-Agent is discarded. For example: _Chrome_. +- __Operating system__. I use this to understand what operating systems people use when visiting this website. I only use the brand of the operating system and don’t include the version number or any other details. This is derived from the User-Agent HTTP header. The full User-Agent is discarded. For example: _GNU/Linux_. +- __Device type__. I use this to understand what devices people use when visiting this website. This is derived from window.innerWidth. The actual width of the browser in pixels is discarded. For example: _Desktop_. +- __Visitor Country__. I look up the visitor’s country using the IP address. I do not track anything more granular than the country of origin and the IP address of the visitor is discarded. I never store IP addresses in my database or logs. For example: _Canada_. + +## Contact me + +[Contact me]({{< ref "contact/index.md" >}}) if you have any questions. + +Effective Date: _20th July 2020_ diff --git a/layouts/404.html b/layouts/404.html index 12063f3..f1fe6bf 100644 --- a/layouts/404.html +++ b/layouts/404.html @@ -2,8 +2,8 @@
-

Page not found

-

The page you requested could not be found.

+

Page not found :(

+

The page you are looking for doesn't exist or has been moved.

diff --git a/layouts/_default/_markup/.gitkeep b/layouts/_default/_markup/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/layouts/_default/_markup/render-link.html b/layouts/_default/_markup/render-link.html deleted file mode 100644 index 95e0be2..0000000 --- a/layouts/_default/_markup/render-link.html +++ /dev/null @@ -1 +0,0 @@ -{{ .Text | safeHTML }} \ No newline at end of file diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html index 3dea403..e5b2257 100644 --- a/layouts/_default/baseof.html +++ b/layouts/_default/baseof.html @@ -1,6 +1,6 @@ - {{ block "head" . }}{{ partial "head/head.html" . }}{{ end }} + {{ partial "head/head.html" . }} {{ if eq .Kind "home" -}} {{ .Scratch.Set "class" "home" -}} {{ else if eq .Kind "404" -}} @@ -13,15 +13,18 @@ {{ .Scratch.Add "class" " list" -}} {{ end -}} - {{ block "header" . }}{{ partial "header/header.html" . }}{{ end }} + {{ partial "header/header.html" . }}
{{ block "main" . }}{{ end }}
- {{ if ne .Section "docs" }} - {{ block "footer" . }}{{ partial "footer/footer.html" . }}{{ end }} + {{ block "sidebar-prefooter" . }}{{ end }} + {{ block "sidebar-footer" . }}{{ end }} + {{ partial "footer/footer.html" . }} + {{ if and .IsHome .Site.Params.alert }} + {{ partial "footer/alert.html" . }} {{ end }} - {{ block "script-footer" . }}{{ partial "footer/script-footer.html" . }}{{ end }} + {{ partial "footer/script-footer.html" . }} \ No newline at end of file diff --git a/layouts/_default/index.js b/layouts/_default/index.js new file mode 100644 index 0000000..2dd84f7 --- /dev/null +++ b/layouts/_default/index.js @@ -0,0 +1,10 @@ +var docs = [ +{{ range $index, $page := (where .Site.Pages "Section" "docs") -}} + { + id: {{ $index }}, + title: "{{ .Title }}", + description: "{{ .Params.description }}", + href: "{{ .URL | absURL }}" + }, +{{ end -}} +]; \ No newline at end of file diff --git a/layouts/_default/index.json b/layouts/_default/index.json new file mode 100644 index 0000000..b1997c8 --- /dev/null +++ b/layouts/_default/index.json @@ -0,0 +1,5 @@ +{{- $.Scratch.Add "index" slice -}} +{{- range .Site.RegularPages -}} + {{- $.Scratch.Add "index" (dict "title" .Title "description" .Params.description "contents" .Plain "permalink" .Permalink) -}} +{{- end -}} +{{- $.Scratch.Get "index" | jsonify -}} \ No newline at end of file diff --git a/layouts/_default/section.sitemap.xml b/layouts/_default/section.sitemap.xml new file mode 100644 index 0000000..701951d --- /dev/null +++ b/layouts/_default/section.sitemap.xml @@ -0,0 +1,46 @@ +{{ printf "" | safeHTML -}} + + {{ range $i, $e := .Data.Pages -}} + {{ if ne .Params.sitemap_exclude true }} + + {{ .Permalink }}{{ if not .Lastmod.IsZero }} + {{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}{{ end }}{{ with .Sitemap.ChangeFreq }} + {{ . }}{{ end }}{{ if ge .Sitemap.Priority 0.0 }} + {{ .Sitemap.Priority }}{{ end }}{{ if .IsTranslated }}{{ range .Translations }} + {{ end }} + {{ end }} + + {{ end -}} + {{ end -}} + {{ range .Sections -}} + {{ range $i, $e := .Data.Pages -}} + {{ if ne .Params.sitemap_exclude true -}} + + {{ .Permalink }}{{ if not .Lastmod.IsZero }} + {{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}{{ end }}{{ with .Sitemap.ChangeFreq }} + {{ . }}{{ end }}{{ if ge .Sitemap.Priority 0.0 }} + {{ .Sitemap.Priority }}{{ end }}{{ if .IsTranslated }}{{ range .Translations }} + {{ end }} + {{ end }} + + {{ end -}} + {{ end -}} + {{ end -}} + \ No newline at end of file diff --git a/layouts/blog/list.html b/layouts/blog/list.html index fa1ff87..b5fe8ca 100644 --- a/layouts/blog/list.html +++ b/layouts/blog/list.html @@ -8,8 +8,8 @@ {{ range .Data.Pages -}}
-

{{ .Params.title }}

-

{{ .Params.lead }}

+

{{ .Params.title }}

+

{{ .Params.lead | safeHTML }}

{{ partial "main/blog-meta.html" . -}}
diff --git a/layouts/blog/single.html b/layouts/blog/single.html index bb2c902..48fdb82 100644 --- a/layouts/blog/single.html +++ b/layouts/blog/single.html @@ -6,7 +6,7 @@

{{ .Title }}

{{ partial "main/blog-meta.html" . }} -

{{ .Params.lead }}

+

{{ .Params.lead | safeHTML }}

{{ .Content }} diff --git a/layouts/authors/list.html b/layouts/contributors/list.html similarity index 75% rename from layouts/authors/list.html rename to layouts/contributors/list.html index 5752bae..45e07e6 100644 --- a/layouts/authors/list.html +++ b/layouts/contributors/list.html @@ -8,9 +8,9 @@ {{ range .Data.Pages -}}
-

{{ .Params.title }}

+

{{ .Params.title }}

{{ if eq .Section "blog" -}} -

{{ .Params.lead }}

+

{{ .Params.lead | safeHTML }}

{{ partial "main/blog-meta.html" . -}} {{ end -}}
diff --git a/layouts/docs/single.html b/layouts/docs/single.html index d212753..59d045a 100644 --- a/layouts/docs/single.html +++ b/layouts/docs/single.html @@ -12,6 +12,7 @@

{{ .Title }}

{{ .Params.lead | safeHTML }}

{{ partial "main/headline-hash.html" .Content }} + {{ partial "main/edit-page.html" . }} {{ partial "main/docs-navigation.html" . }}
diff --git a/layouts/index.headers b/layouts/index.headers index 385e241..3716436 100644 --- a/layouts/index.headers +++ b/layouts/index.headers @@ -2,7 +2,7 @@ Strict-Transport-Security: max-age=31536000; includeSubDomains; preload X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block - Content-Security-Policy: default-src 'self'; img-src 'self' data:; script-src 'self'; style-src 'self' + Content-Security-Policy: default-src 'self'; manifest-src 'self'; connect-src 'self' https://stats.gethyas.com https://*.algolia.net https://*.algolianet.com https://*.algolia.io; font-src 'self'; img-src 'self' data: https://www.netlify.com; script-src 'self' 'unsafe-eval' 'nonce-dXNlcj0iaGVsbG8iLGRvbWFpbj0iaGVua3ZlcmxpbmRlLmNvbSIsZG9jdW1lbnQud3JpdGUodXNlcisiQCIrZG9tYWluKTs=' https://stats.gethyas.com; style-src 'self' X-Frame-Options: SAMEORIGIN Referrer-Policy: strict-origin Feature-Policy: geolocation 'self' diff --git a/layouts/index.html b/layouts/index.html index b0550ee..4c1602f 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -1,15 +1,128 @@ {{ define "main" }}
-
+

{{ .Title }}

{{ .Params.Lead | safeHTML }}

- Get started -

{{ .Site.Params.version }}

+ Get started +

Open-source MIT Licensed. GitHub {{ .Site.Params.hyasVersion }}

-
- {{- .Content -}} +{{ end }} + +{{ define "sidebar-prefooter" }} + +{{ end }} + +{{ define "sidebar-footer" }} + +{{ end }} diff --git a/layouts/partials/footer/alert.html b/layouts/partials/footer/alert.html new file mode 100644 index 0000000..84d6423 --- /dev/null +++ b/layouts/partials/footer/alert.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/layouts/partials/footer/footer.html b/layouts/partials/footer/footer.html index c17c474..adfe715 100644 --- a/layouts/partials/footer/footer.html +++ b/layouts/partials/footer/footer.html @@ -2,7 +2,12 @@
-

{{ .Site.Params.footer | safeHTML }}

+
    + + +
  • This site is powered by Hugo and the Doks theme
  • + +
diff --git a/layouts/partials/footer/script-footer.html b/layouts/partials/footer/script-footer.html index b61fe0b..0d1f316 100644 --- a/layouts/partials/footer/script-footer.html +++ b/layouts/partials/footer/script-footer.html @@ -1,11 +1,18 @@ +{{ $indexTemplate := resources.Get "js/index.js" -}} +{{ $index := $indexTemplate | resources.ExecuteAsTemplate "index.js" . -}} {{ $lazysizes := resources.Get "js/vendor/lazysizes/lazysizes.min.js" -}} +{{ $flexsearch := resources.Get "js/vendor/flexsearch/dist/flexsearch.min.js" -}} {{ if eq (hugo.Environment) "development" -}} {{ $app := resources.Get "js/app.js" -}} - {{ $js := slice $lazysizes $app | resources.Concat "main.js" -}} + {{ $js := slice $lazysizes $flexsearch $app | resources.Concat "main.js" -}} + {{ else -}} + {{ $instantPage := resources.Get "js/vendor/instant.page/instantpage.js" | minify -}} {{ $app := resources.Get "js/app.js" | minify -}} - {{ $js := slice $lazysizes $app | resources.Concat "main.js" -}} - {{ $secureJS := $js | resources.Fingerprint "sha512" -}} - + {{ $js := slice $lazysizes $flexsearch $instantPage $app | resources.Concat "main.js" -}} + {{ $jsProd := $js | resources.Fingerprint "sha512" -}} + {{ $indexProd := $index | resources.Minify | resources.Fingerprint "sha512" -}} + + {{ end -}} \ No newline at end of file diff --git a/layouts/partials/head/favicons.html b/layouts/partials/head/favicons.html index 5f87e69..3988156 100644 --- a/layouts/partials/head/favicons.html +++ b/layouts/partials/head/favicons.html @@ -1,5 +1,5 @@ - - - - \ No newline at end of file + + + + \ No newline at end of file diff --git a/layouts/partials/head/opengraph.html b/layouts/partials/head/opengraph.html new file mode 100644 index 0000000..8080840 --- /dev/null +++ b/layouts/partials/head/opengraph.html @@ -0,0 +1,93 @@ + + + +{{ if $.Scratch.Get "paginator" -}} + {{ $paginator := .Paginate (where .Site.RegularPages.ByDate.Reverse "Section" "blog" ) -}} + +{{ else -}} + +{{ end -}} + +{{ with $.Params.images -}} + {{ range first 6 . -}} + + {{ end -}} +{{ else -}} + {{ $images := $.Resources.ByType "image" -}} + {{ $featured := $images.GetMatch "*feature*" -}} + {{ if not $featured -}} + {{ $featured = $images.GetMatch "{*cover*,*thumbnail*}" }} + {{ end -}} + {{ with $featured -}} + + {{ else -}} + {{ with $.Site.Params.images -}} + + {{ end -}} + {{ end -}} +{{ end -}} + +{{ $iso8601 := "2006-01-02T15:04:05-07:00" -}} +{{ if .IsPage -}} + {{ if not .PublishDate.IsZero -}} + + {{ else if not .Date.IsZero -}} + + {{ end -}} + {{ if not .Lastmod.IsZero -}} + + {{ end -}} +{{ else -}} + {{ if not .Date.IsZero -}} + + {{ end -}} +{{ end -}} + +{{ with .Params.audio -}} + +{{ end -}} +{{ with .Params.locale -}} + +{{ end -}} +{{ with .Site.Params.title -}} + +{{ end -}} +{{ with .Params.videos -}} + {{ range . -}} + + {{ end -}} +{{ end -}} + +{{ $permalink := .Permalink -}} +{{ $siteSeries := .Site.Taxonomies.series -}} +{{ with .Params.series -}} + {{ range $name := . -}} + {{ $series := index $siteSeries $name -}} + {{ range $page := first 6 $series.Pages -}} + {{ if ne $page.Permalink $permalink -}} + + {{ end -}} + {{ end -}} + {{ end -}} +{{ end -}} + +{{ if .IsPage -}} + {{ range .Site.Authors -}} + {{ with .Social.facebook -}} + + {{ end -}} + {{ with .Site.Social.facebook -}} + + {{ end -}} + + {{ with .Params.tags -}} + {{ range first 6 . -}} + + {{ end -}} + {{ end -}} + {{ end -}} +{{ end -}} + +{{ with .Site.Social.facebook_admin -}} + +{{ end -}} \ No newline at end of file diff --git a/layouts/partials/head/resource-hints.html b/layouts/partials/head/resource-hints.html index bdda1d6..806ea80 100644 --- a/layouts/partials/head/resource-hints.html +++ b/layouts/partials/head/resource-hints.html @@ -1,6 +1,4 @@ - \ No newline at end of file + + + + \ No newline at end of file diff --git a/layouts/partials/head/script-header.html b/layouts/partials/head/script-header.html index 26bfd35..8baabaa 100644 --- a/layouts/partials/head/script-header.html +++ b/layouts/partials/head/script-header.html @@ -1,11 +1 @@ -{{ if isset .Site.Params "googleanalytics" -}} - -{{ end -}} \ No newline at end of file + \ No newline at end of file diff --git a/layouts/partials/head/seo.html b/layouts/partials/head/seo.html index 76bc26d..3b412d3 100644 --- a/layouts/partials/head/seo.html +++ b/layouts/partials/head/seo.html @@ -1,10 +1,12 @@ -{{ if and (eq .Kind "section" "taxonomy" "taxonomyTerm") (ne .Section "blog" ) -}} - +{{ if eq .Kind "404" -}} + {{ else -}} {{ with .Params.robots -}} - + {{ else -}} - + + + {{ end -}} {{ end -}} @@ -20,21 +22,29 @@ {{ end -}} -{{ with .Params.canonical -}} - -{{ else -}} +{{ if $.Scratch.Get "paginator" }} + + {{ if .Paginator.HasPrev -}} + + {{ end -}} + {{ if .Paginator.HasNext -}} + + {{ end -}} +{{ else -}} {{ end -}} -{{ template "_internal/twitter_cards.html" . -}} - - +{{ partial "head/twitter_cards.html" . }} + + -{{ template "_internal/opengraph.html" . -}} +{{ partial "head/opengraph.html" . }} + + {{ range .AlternativeOutputFormats -}} {{ end -}} -{{ block "head/structured-data" . }}{{ partial "head/structured-data.html" . }}{{ end }} +{{ partial "head/structured-data.html" . }} diff --git a/layouts/partials/head/structured-data.html b/layouts/partials/head/structured-data.html index 0098a5f..d54b24f 100644 --- a/layouts/partials/head/structured-data.html +++ b/layouts/partials/head/structured-data.html @@ -4,12 +4,13 @@ { "@context": "https://schema.org", "@type": "Organization", - "url": "{{ .Site.BaseURL }}", + "url": "{{ "/" | absURL }}", "name": "{{ .Site.Params.title }}", - "logo": "{{ .Site.BaseURL }}{{ .Site.Params.schemaLogo }}", + "logo": "{{ "/" | absURL }}{{ .Site.Params.schemaLogo }}", "sameAs": [ "{{ .Site.Params.schemaTwitter | safeURL }}", - "{{ .Site.Params.schemaLinkedIn | safeURL }}" + "{{ .Site.Params.schemaLinkedIn | safeURL }}", + "{{ .Site.Params.schemaGitHub | safeURL }}" ] } @@ -19,11 +20,12 @@ { "@context": "https://schema.org", "@type": "Person", - "url": "{{ .Site.BaseURL }}", + "url": "{{ "/" | absURL }}", "name": "{{ .Site.Params.title }}", "sameAs": [ "{{ .Site.Params.schemaTwitter | safeURL }}", - "{{ .Site.Params.schemaLinkedIn | safeURL }}" + "{{ .Site.Params.schemaLinkedIn | safeURL }}", + "{{ .Site.Params.schemaGitHub | safeURL }}" ] } @@ -33,10 +35,10 @@ { "@context": "https://schema.org", "@type": "WebSite", - "url": "{{ .Site.BaseURL }}", + "url": "{{ "/" | absURL }}", "potentialAction": { "@type": "SearchAction", - "target": "{{ .Site.BaseURL }}?q={search_term_string}", + "target": "{{ "/" | absURL }}?q={search_term_string}", "query-input": "required name=search_term_string" } } @@ -54,7 +56,7 @@ "@id": "{{ .Permalink }}" }, "headline": "{{ .Title }}", - "image": {{ apply .Params.images "absURL" "." }}, + "image": [{{ range $i, $e := .Params.images }}{{ if $i }}, {{ end }}{{ printf "%s%s" $.Permalink $e }}{{ end }}], "datePublished": "{{ .PublishDate.Format "2006-01-02T15:04:05CET" }}", "dateModified": "{{ .Lastmod.Format "2006-01-02T15:04:05CET" }}", "author": { @@ -67,7 +69,7 @@ {{ if eq .Site.Params.schemaType "Organization" -}} "logo": { "@type": "ImageObject", - "url": "{{ .Site.BaseURL }}{{ .Site.Params.schemaLogo }}" + "url": "{{ "/" | absURL }}{{ .Site.Params.schemaLogo }}" } {{ end -}} }, @@ -77,16 +79,20 @@ {{ end -}} {{ end -}} +{{ $dot := . -}} +{{ $dot.Scratch.Set "path" "" -}} +{{ $dot.Scratch.Set "breadcrumb" slice -}} + {{ $url := replace .Permalink ( printf "%s" .Site.BaseURL) "" -}} {{ $.Scratch.Add "path" .Site.BaseURL -}} {{ $.Scratch.Add "breadcrumb" (slice (dict "url" .Site.BaseURL "name" "home" "position" 1 )) -}} -{{ range $index, $element := split $url "/" -}} - {{ $.Scratch.Add "path" $element -}} - {{ $.Scratch.Add "path" "/" -}} + {{ range $index, $element := split $url "/" -}} + {{ $dot.Scratch.Add "path" $element -}} + {{ $.Scratch.Add "path" "/" -}} {{ if ne $element "" -}} - {{ $.Scratch.Add "breadcrumb" (slice (dict "url" ($.Scratch.Get "path") "name" . "position" (add $index 2))) -}} - {{ end -}} + {{ $.Scratch.Add "breadcrumb" (slice (dict "url" ($.Scratch.Get "path") "name" . "position" (add $index 2))) -}} + {{ end -}} {{ end -}} + \ No newline at end of file diff --git a/layouts/partials/head/twitter_cards.html b/layouts/partials/head/twitter_cards.html new file mode 100644 index 0000000..d414116 --- /dev/null +++ b/layouts/partials/head/twitter_cards.html @@ -0,0 +1,33 @@ +{{ with $.Params.images -}} + + +{{ else -}} + {{ $images := $.Resources.ByType "image" -}} + {{ $featured := $images.GetMatch "*feature*" -}} + {{ if not $featured -}} + {{ $featured = $images.GetMatch "{*cover*,*thumbnail*}" -}} + {{ end -}} + {{ with $featured -}} + + + {{ else -}} + {{ with $.Site.Params.images -}} + + + {{ else -}} + + {{ end -}} + {{ end -}} +{{ end -}} + + + +{{ with .Site.Social.twitter -}} + +{{ end -}} + +{{ range .Site.Authors -}} + {{ with .twitter -}} + + {{ end -}} +{{ end -}} \ No newline at end of file diff --git a/layouts/partials/header/header.html b/layouts/partials/header/header.html index 970c460..aa99135 100644 --- a/layouts/partials/header/header.html +++ b/layouts/partials/header/header.html @@ -1,9 +1,9 @@ - +