diff --git a/.gitattributes b/.gitattributes
index ebe01992079a..4d536e4abe56 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,5 +1,10 @@
-_assets/css/vendor/* linguist-vendored
-_assets/js/plugins/* linguist-vendored
-_assets/js/vendor/* linguist-vendored
-assets/fonts/* linguist-vendored
-assets/js/vendor/* linguist-vendored
\ No newline at end of file
+assets/fonts/* linguist-vendored
+assets/js/main.min.js linguist-vendored
+assets/js/lunr/* linguist-vendored
+assets/js/plugins/* linguist-vendored
+assets/js/vendor/* linguist-vendored
+_sass/minimal-mistakes/vendor/* linguist-vendored
+CHANGELOG.md text merge=union
+docs/_docs/18-history.md text merge=union
+
+*.md text
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 6341d98273aa..847b69e8c5a9 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -1,15 +1,23 @@
# Contributing
-Having trouble working with the theme? Found a typo in the documentation? Interested in adding a feature or [fixing a bug](https://github.com/mmistakes/minimal-mistakes/issues)? Then by all means [submit an issue](https://github.com/mmistakes/minimal-mistakes/issues/new) or [pull request](https://help.github.com/articles/using-pull-requests/). If this is your first pull request, it may be helpful to read up on the [GitHub Flow](https://guides.github.com/introduction/flow/) first.
+Found a typo in the documentation or interested in [fixing a bug](https://github.com/mmistakes/minimal-mistakes/issues)? Then by all means [submit an issue](https://github.com/mmistakes/minimal-mistakes/issues/new) or [pull request](https://help.github.com/articles/using-pull-requests/). If this is your first pull request, it may be helpful to read up on the [GitHub Flow](https://guides.github.com/introduction/flow/) first.
-Minimal Mistakes has been designed as a base for you to customize and fit your site's unique needs. Please keep this in mind when requesting features and/or submitting pull requests. If it's not something that most people will use, I probably won't consider it. When in doubt ask.
+For help with using the theme or general Jekyll support questions, please use the [Jekyll Talk forums](https://talk.jekyllrb.com/).
-This goes for author sidebar links and "share button" additions -- I have no intention of merging in every possibly option, the essentials are there to get you started :smile:.
+Minimal Mistakes has been designed as a base for you to customize and fit your
+site's unique needs. Please keep this in mind when requesting features and/or
+submitting pull requests. If it's not something that most people will use, I
+probably won't consider it. When in doubt ask.
+
+This goes for author sidebar links and "share button" additions -- I have no
+intention of merging in every possibly option, the essentials are there to get
+you started :smile:.
## Pull Requests
When submitting a pull request:
1. Clone the repo.
-2. Create a branch off of `master` and give it a meaningful name (e.g. `my-awesome-new-feature`) and describe the feature or fix.
-3. Open a pull request on GitHub.
\ No newline at end of file
+2. Create a branch off of `master` and give it a meaningful name (e.g.
+ `my-awesome-new-feature`) and describe the feature or fix.
+3. Open a pull request on GitHub.
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
deleted file mode 100644
index 415f6f6a680b..000000000000
--- a/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-- [ ] This is a question about using the theme.
-- [ ] This is a feature request.
-- [ ] I believe this to be a bug with the theme.
- - [ ] I have updated all gems with `bundle update`.
- - [ ] I have tested locally with `bundle exec jekyll build`.
-
----
-
-## Environment informations
-
-
-
-- **Minimal Mistakes version:**
-- **Jekyll version:**
-- **GitHub Pages hosted:** yes/no
-- **Operating system:**
-
----
-
-## Expected behavior
-
-
-
-## Steps to reproduce the behavior
-
-
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 000000000000..ac8b933ce42a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,94 @@
+name: Bug Report
+description: There is something wrong with the theme. 99% of the time you should select Support below.
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Before opening a new issue please:
+
+ - Verify you have the latest versions of Jekyll and Minimal Mistakes
+ installed by running `bundle update`.
+ - Thoroughly read the theme's documentation at
+ https://mmistakes.github.io/minimal-mistakes/docs/quick-start-guide/
+ - Search all issues at https://github.com/mmistakes/minimal-mistakes/issues
+ for solutions and to avoid duplication.
+ - Ask for help at https://talk.jekyllrb.com/
+
+ If none of the above solved your problem, you can continue below.
+
+ - type: textarea
+ id: environment
+ attributes:
+ label: Theme version and system environment
+ description: |
+ Please include theme version, Jekyll version, public git repository, whether
+ you are hosting with GitHub Pages, and the operating system you tested with.
+
+ Issues without a link to a public repository or ZIP file will likely go ignored.
+ Being able to see your actual files is necessary to troubleshoot, as most
+ issues stem from invalid/missing YAML Front Matter, a mis-configured _config.yml
+ file, or problematic site content.
+ value: |-
+ - Minimal Mistakes version:
+ - Ruby gem or remote theme version:
+ - Jekyll version:
+ - Git repository URL:
+ - URL to the page with the problem:
+ - Operating system:
+ - Browser version:
+ validations:
+ required: true
+
+ - type: textarea
+ id: what-happened
+ attributes:
+ label: What happened?
+ description: |
+ Describe the problem **in detail**. For example:
+
+ - What is missing?
+ - What error do you see? Attach the error log if available.
+ validations:
+ required: true
+
+ - type: textarea
+ id: expected-behavior
+ attributes:
+ label: Expected behavior
+ description: |
+ Please describe the expected behavior and the actual result you got.
+ placeholder: >
+ What is it you expected to happen? This should be a description of how the
+ functionality you tried to use is supposed to work.
+ validations:
+ required: true
+
+ - type: textarea
+ id: steps-to-reproduce
+ attributes:
+ label: Steps to reproduce the behavior
+ description: |
+ Describe the steps you took for this problem to come up. Such as: you installed
+ the theme, customized _config.yml, added your own posts, and started up a
+ Jekyll server locally.
+
+ If an error occurred on GitHub Pages when pushing, please test a local version
+ following these setup instructions:
+ https://help.github.com/articles/setting-up-your-github-pages-site-locally-with-jekyll/
+
+ Then provide a complete log by running `bundle exec jekyll build --trace --verbose`
+ and include this output in the filed issue.
+
+ Screenshots can also be included if they help illustrate a behavior.
+ validations:
+ required: true
+
+ - type: textarea
+ id: other
+ attributes:
+ label: Other
+ description: |
+ Please provide a code repository, gist, code snippet, sample files,
+ screenshots, or anything else you think will aid in reproducing the issue.
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 000000000000..e02be34d82d0
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: false
+contact_links:
+ - name: Support
+ url: https://github.com/mmistakes/minimal-mistakes/discussions
+ about: Please post your support questions in the Discussions section.
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/documentation.yml b/.github/ISSUE_TEMPLATE/documentation.yml
new file mode 100644
index 000000000000..65a03152deae
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/documentation.yml
@@ -0,0 +1,25 @@
+name: Documentation
+description: Found a typo or something that needs clarification?
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for taking the time to open an issue and help make the docs better.
+
+ - type: textarea
+ id: motivation
+ attributes:
+ label: Motivation
+ description: |
+ Why should we update our docs?
+ validations:
+ required: true
+
+ - type: textarea
+ id: suggestion
+ attributes:
+ label: Suggestion
+ description: |
+ What should we do instead?
+ validations:
+ required: true
\ No newline at end of file
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 000000000000..3271858f6dae
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+## Summary
+
+
+
+## Context
+
+
+
+
diff --git a/.github/workflows/bad-pr.yml b/.github/workflows/bad-pr.yml
new file mode 100644
index 000000000000..71108978fdb6
--- /dev/null
+++ b/.github/workflows/bad-pr.yml
@@ -0,0 +1,34 @@
+name: Cleanup bad PR
+
+on:
+ pull_request_target:
+ types: [opened, reopened]
+
+permissions:
+ contents: read
+
+jobs:
+ close-pr:
+ permissions:
+ pull-requests: write
+ runs-on: ubuntu-slim
+ if: "contains(github.event.pull_request.body, 'by deleting this comment block') || github.event.pull_request.body == ''"
+ steps:
+ - uses: actions-ecosystem/action-add-labels@v1
+ with:
+ labels: |
+ Type: Invalid
+ Type: Spam
+ - uses: superbrothers/close-pull-request@v3
+ with:
+ # Optional. Post an issue comment just before closing a pull request.
+ comment: |
+ **You have created a Pull Request to the wrong repository.** This is the repository for [Minimal Mistakes][1], the free Jekyll theme. See [GitHub Docs: About pull requests][2] if you need help.
+
+ [1]: https://mmistakes.github.io/minimal-mistakes/
+ [2]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests
+ - uses: sudo-bot/action-pull-request-lock@v1.0.5
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ number: ${{ github.event.pull_request.number }}
+ lock-reason: spam
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 000000000000..733ad0d6668c
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,47 @@
+name: build
+
+on:
+ push:
+ branches:
+ - master
+ workflow_dispatch: {}
+ repository_dispatch: {}
+
+jobs:
+ build:
+ if: github.repository == 'mmistakes/minimal-mistakes'
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: '3.2'
+ - name: Setup cache for Bundler
+ id: cache
+ uses: actions/cache@v4
+ with:
+ path: |
+ docs/Gemfile.lock
+ docs/vendor/bundle
+ key: ${{ runner.os }}-bundler-${{ hashFiles('docs/Gemfile') }}
+ restore-keys: |
+ ${{ runner.os }}-bundler-
+
+ - name: Install - Bundler
+ env:
+ MAKE: make -j2
+ working-directory: docs/
+ run: |
+ bundle config set path vendor/bundle
+ bundle install --jobs=4 --retry=3
+ bundle clean
+
+ - name: Update Algolia index
+ working-directory: docs/
+ run: bundle exec jekyll algolia push
+ env:
+ ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }}
+ continue-on-error: true
diff --git a/.gitignore b/.gitignore
index 5c4866d719f9..406061feb7db 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,14 +1,32 @@
-*.gem
+# Vim
+*~
+*.sw[p_]
+
+# IntelliJ IDEA
+*.idea
+
+# Sublime Text
*.sublime-project
*.sublime-workspace
+
+# Ruby Gem
+*.gem
.bundle
+Gemfile.lock
+**/vendor/bundle
+
+# Node.js and NPM
+node_modules
+npm-debug.log*
+package-lock.json
+codekit-config.json
+
+# macOS
.DS_Store
+
+# Jekyll generated files
+.jekyll-cache
.jekyll-metadata
.sass-cache
_asset_bundler_cache
_site
-codekit-config.json
-example/_site
-Gemfile.lock
-node_modules
-npm-debug.log*
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d829530f5d95..2c4beee121ed 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,918 @@
+# Changelog
+
+## Unreleased
+
+### Enhancements
+
+- Updated Traditional Chinese translation (#5250)
+- Add built-in support for jekyll-gfm-admonitions (#5312)
+- Add Latte and Mocha skins from Catppuccin project (#5341)
+- Add support for Swetrix, a GDPR-compliant analytics provider (#5344)
+- Support resolving `ui-text` using `page.locale` when available (#5439)
+- Add `aria-label` to all nav elements for WCAG compliance (#5442)
+- Add IndieWeb microformat support and configurable footer `rel` attribute (#5443)
+- Add `og:image:alt` and `twitter:image:alt` support (#5444)
+- Minor changes to the PR auto labeling GitHub Actions workflow
+
+## [4.27.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.27.3)
+
+### Bug Fixes
+
+- Add explicit CSS rules for `.sr-only` following Font Awesome 7's changes. (#5296)
+
+## [4.27.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.27.2)
+
+### Enhancements
+
+- Hide `.page__footer-follow` if there are no links nor atom feed. (#5279)
+- Add HTML escaping for some titles, labels and metada that was missing. (#5276)
+- Add optional `footer.since` for copyright time range. (#5275)
+
+### Bug Fixes
+
+- Add `escape_once` to gallery title and alt text.
+
+## [4.27.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.27.1)
+
+### Enhancements
+
+- Add a "Share on Bluesky" button (#5179)
+- Add preset variables for modern font stack (#5033)
+- Update X share button to match brand color (#5245)
+
+### Bug Fixes
+
+- Fix wrong icon and color for X share button.
+
+## [4.27.0](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.27.0)
+
+### Enhancements
+
+- Add RTL Support. [#4886](https://github.com/mmistakes/minimal-mistakes/pull/4886)
+- Add missing Polish translation. [#4890](https://github.com/mmistakes/minimal-mistakes/pull/4890)
+- Rewrite most directions with [CSS logical properties](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_logical_properties_and_values).
+- Remove unnecessary "type" attribute (#4956)
+- The "if" means the default is never used (#4955)
+- For pages without a title, show the site title only once (#4959)
+- Use `documents-collection.html` partial in `home` layout.
+- Add Bulgarian translation. [#5003](https://github.com/mmistakes/minimal-mistakes/pull/5003)
+- Add provider and comments info to `single.html` layout for non-production. (#5068)
+- Tweak contrast skin $primary-color to adhere to WCAG guidelines. (#5126)
+- Update social share buttons to reflect Twitter rebranding to X (#5210)
+
+### Bug Fixes
+
+- Replace a redirected link to MadeMistakes in footer. [#4882](https://github.com/mmistakes/minimal-mistakes/pull/4882)
+- Fix wrong float direction for `feature_row` with `type="right"`. [#4061](https://github.com/mmistakes/minimal-mistakes/issues/4061)
+- Fix reset stylesheet overruling `$doc-font-size`. [#4983](https://github.com/mmistakes/minimal-mistakes/issues/4983)
+- Fix JavaScript null error on home and splash layouts. [#4938](https://github.com/mmistakes/minimal-mistakes/issues/4938), [#4939](https://github.com/mmistakes/minimal-mistakes/pull/4939)
+- Fix bad <figure> HTML if "alt" contains quotes.
+- Fix extra newline generated in `_includes/post_pagination.html`.
+- Hide hidden links & remove the overlay when one is clicked. [#5042](https://github.com/mmistakes/minimal-mistakes/pull/5042)
+- Fix typo in "Configuration" (#5106)
+- bundle exec jekyll serve will fail if more than once (#5193)
+
+### Documentation & Maintenance
+
+- Automatically update Algolia search index with GitHub Actions.
+
+## [4.26.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.26.2)
+
+### Enhancements
+
+- Add Czech localization. [#4866](https://github.com/mmistakes/minimal-mistakes/pull/4866)
+- Allow overriding HTML `lang` attribute on a per-page basis. [#4862](https://github.com/mmistakes/minimal-mistakes/pull/4862)
+
+### Bug Fixes
+
+- Figure helper breaks when using code markup in caption with `popup=true`. [#4841](https://github.com/mmistakes/minimal-mistakes/issues/4841)
+
+## [4.26.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.26.1)
+
+### Bug Fixes
+
+- Disable copy button on invalid syntax highlighting blocks to avoid positioning issues.
+- Fix typo for `fa-dribbble` in `_utilities.scss`.
+- Restrict "auto scroll sticky ToC to content" feature to Chromium browsers for now. [#4826](https://github.com/mmistakes/minimal-mistakes/issues/4826)
+
+### Documentation & Maintenance
+
+- Rewrite social icons SCSS with a loop.
+
+### Enhancements
+
+- Change the icon of a copy button into a tick for 1.5 seconds on successful copy.
+
+## [4.26.0](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.26.0)
+
+### Bug Fixes
+
+- Fix an unclosed `
` and before `` to be added/overridden with `head_scripts` and `footer_scripts` arrays in `_config.yml`. [#1241](https://github.com/mmistakes/minimal-mistakes/pull/1241)
+- Update JavaScript dependencies: jQuery `v3.2.1`, jQuery Smooth Scroll `v2.2.0`, and Magnific Popup `v1.1.0`. [#328690652](https://github.com/mmistakes/minimal-mistakes/pull/1241#issuecomment-328690652)
+
## [4.5.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.5.2)
### Enhancements
@@ -18,9 +933,9 @@
- Fix license URL in README file. [#1189](https://github.com/mmistakes/minimal-mistakes/pull/1189)
- Reduce amount of blank pages when printing in Chrome. [#1196](https://github.com/mmistakes/minimal-mistakes/issues/1196)
-- Remove `#disqus_thread` duplicate from `comments-providers/disqus.html` as it is already in `comments.html` include. [#1199](https://github.com/mmistakes/minimal-mistakes/issues/1199)
+- Remove `#disqus_thread` duplicate from `comments-providers/disqus.html` as it is already in `comments.html` include. [#1199](https://github.com/mmistakes/minimal-mistakes/issues/1199)
- Fix Liquid syntax errors in `tag-list.html` and `category-list.html` includes by removing parenthesis in `assign`s. [#1223](https://github.com/mmistakes/minimal-mistakes/issues/1223)
-- Fix Liquid syntax error: "Expected id but found open_square in `"{{page.[include.id] }}"`" in `gallery` and `feature_row` includes.
+- Fix Liquid syntax error: "Expected id but found open_square in `"{{ page.[include.id] }}"`" in `gallery` and `feature_row` includes.
- Fix Liquid syntax error: "Expected end_of_string but found pipe in `"name in __names | sort"`" in `group-by-array` include.
## [4.5.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.5.1)
@@ -109,7 +1024,7 @@
### Enhancements
-- Move SCSS partials to `/_sass/minimal-mistakes` for easier CSS customization.
+- Move SCSS partials to `/_sass/minimal-mistakes` for easier CSS customization.
- Replace `modified` with `last_modified_at` to leverage various Jekyll plugins that utilize this variable. [#930](https://github.com/mmistakes/minimal-mistakes/pull/930)
- Add Lithuanian localized UI text. [#924](https://github.com/mmistakes/minimal-mistakes/pull/924)
- Improve print stylesheet by increasing text contrast, removing elements that don't need to be printed, expanding URLs, and reducing amount of blank pages. [#909](https://github.com/mmistakes/minimal-mistakes/issues/909)
@@ -131,10 +1046,10 @@
### Enhancements
- Add workaround to allow theme gem's `/assets/js/main.min.js` file to be overridden by a local version. Simply add the following YAML Front Matter to the file:
-
+
```
---
- layout:
+ layout:
---
```
@@ -242,7 +1157,7 @@
### Enhancements
-- Add `!default` values to **_sass/_variables.scss**.
+- Add `!default` values to **\_sass/\_variables.scss**.
- Collapse sidebar navigation lists on smaller screens. [#607](https://github.com/mmistakes/minimal-mistakes/issues/607)
### Bug Fixes
@@ -266,7 +1181,7 @@
### Maintenance
-- Clarify "migrating to gem-theme" instructions in **Quick Start Guide**.
+- Clarify "migrating to gem-theme" instructions in **Quick Start Guide**.
- Add `rake preview` task for testing `/test` during theme development.
## [4.0.5](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.0.5)
@@ -289,12 +1204,12 @@
### Enhancements
- "Gemify" theme ~> `gem "minimal-mistakes-jekyll"`
-- Replace `base_path` include with `absolute_url` filter where possible.
+- Replace `base_path` include with `relative_url` filter where possible.
- Allow images to be placed in other folders. Remove `/images/` only restriction and encourage placement in `/assets/images/` instead. **Full paths are now required. If upgrading from MM 3.4 add `/images/` before filenames in Front Matter and `_config.yml` variables.**
- Add [home `layout`](https://github.com/mmistakes/minimal-mistakes/blob/master/_layouts/home.html)
- Added missing Turkish translations for UI text. [#621](https://github.com/mmistakes/minimal-mistakes/pull/621)
- Make author avatar optional in sidebar.
-- Update **/_includes/seo.html** for meta description. [#558](https://github.com/mmistakes/minimal-mistakes/pull/558)
+- Update **/\_includes/seo.html** for meta description. [#558](https://github.com/mmistakes/minimal-mistakes/pull/558)
### Bug Fixes
@@ -629,7 +1544,7 @@
### Bug Fixes
-- Fix `Liquid Exception: undefined method 'gsub' for nil:NilClass in _layouts/single.html` error when `page.title` is null. `
` element is now conditional if `title: ` is not set for a `page` or collection item. [#312](https://github.com/mmistakes/minimal-mistakes/issues/312)
+- Fix `Liquid Exception: undefined method 'gsub' for nil:NilClass in _layouts/single.html` error when `page.title` is null. `
` element is now conditional if `title:` is not set for a `page` or collection item. [#312](https://github.com/mmistakes/minimal-mistakes/issues/312)
### Maintenance
@@ -663,7 +1578,7 @@
### Enhancements
-- Add overlay_filter param to hero headers [#298](https://github.com/mmistakes/minimal-mistakes/pull/298)
+- Add `overlay_filter` param to hero headers [#298](https://github.com/mmistakes/minimal-mistakes/pull/298)
## [3.1.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.1.3)
@@ -705,6 +1620,7 @@
- Added optional GitHub and Bitbucket links to footer if set on `site.author` in `_config.yml`.
### Bug Fixes
+
- Fixed Bitbucket URL typo in author sidebar.
## [3.0.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.0.3)
@@ -877,4 +1793,4 @@
- Google Analytics, Google Authorship, webmaster verifies, and Twitter card meta are now optional.
-## [1.0.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/v1.0.1)
\ No newline at end of file
+## [1.0.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/v1.0.1)
diff --git a/Gemfile b/Gemfile
index 1291498971d7..3be9c3cd812e 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,2 +1,2 @@
source "https://rubygems.org"
-gemspec
\ No newline at end of file
+gemspec
diff --git a/LICENSE.txt b/LICENSE
similarity index 94%
rename from LICENSE.txt
rename to LICENSE
index b7cc9a0dc2c8..67814e6c3f9e 100644
--- a/LICENSE.txt
+++ b/LICENSE
@@ -1,6 +1,6 @@
The MIT License (MIT)
-Copyright (c) 2017 Michael Rose
+Copyright (c) 2013-2024 Michael Rose and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
+SOFTWARE.
diff --git a/README.md b/README.md
index f669daa48c93..a525e8caae63 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,13 @@
-# [Minimal Mistakes Jekyll Theme](https://mmistakes.github.io/minimal-mistakes/)
+# [Minimal Mistakes Jekyll theme](https://mmistakes.github.io/minimal-mistakes/)
-[](https://github.com/mmistakes/minimal-mistakes/releases) [](https://raw.githubusercontent.com/mmistakes/minimal-mistakes/master/LICENSE.txt)
+[](https://raw.githubusercontent.com/mmistakes/minimal-mistakes/master/LICENSE)
+[](https://jekyllrb.com/)
-Minimal Mistakes is a flexible two-column Jekyll theme. Perfect for hosting your personal site, blog, or portfolio on GitHub or self-hosting on your own server. As the name implies --- styling is purposely minimalistic to be enhanced and customized by you :smile:.
+Minimal Mistakes is a flexible two-column Jekyll theme, perfect for building personal sites, blogs, and portfolios. As the name implies, styling is purposely minimalistic to be enhanced and customized by you :smile:.
-See what's new in the [CHANGELOG](CHANGELOG.md).
+:sparkles: See what's new in the [CHANGELOG](CHANGELOG.md).
-:sparkles: Minimal Mistakes is now available as a [Ruby gem](https://rubygems.org/gems/minimal-mistakes-jekyll). Consult the [Quick-Start Guide](https://mmistakes.github.io/minimal-mistakes/docs/quick-start-guide/) and [this blog post](https://mmistakes.github.io/minimal-mistakes/jekyll/gemified-theme-beta/) to learn how to upgrade.
+**Note:** The theme uses the [jekyll-include-cache](https://github.com/benbalter/jekyll-include-cache) plugin which will need to be installed in your `Gemfile` and must be retained in the `plugins` array of `_config.yml`. Otherwise you'll encounter `Unknown tag 'include_cached'` errors at build.
[![Minimal Mistakes live preview][2]][1]
@@ -15,29 +16,50 @@ See what's new in the [CHANGELOG](CHANGELOG.md).

-## Notable Features
+## Notable features
-- "Gemified" for easier install/upgrading
-- Compatible with Jekyll 3.5 and GitHub Pages
-- Support for Jekyll's built-in Sass/SCSS preprocessor
-- Several responsive layout options (single, archive index, splash, and paginated home page)
-- SEO optimized with support for [Twitter Cards](https://dev.twitter.com/cards/overview) and [Open Graph](http://ogp.me/) data
+- Bundled as a "theme gem" for easier installation/upgrading.
+- Compatible with GitHub Pages.
+- Support for Jekyll's built-in Sass/SCSS preprocessor.
+- Nine different skins (color variations).
+- Several responsive layout options (single, archive index, search, splash, and paginated home page).
+- Optimized for search engines with support for [Twitter Cards](https://dev.twitter.com/cards/overview) and [Open Graph](http://ogp.me/) data.
- Optional [header images](https://mmistakes.github.io/minimal-mistakes/docs/layouts/#headers), [custom sidebars](https://mmistakes.github.io/minimal-mistakes/docs/layouts/#sidebars), [table of contents](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#table-of-contents), [galleries](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#gallery), related posts, [breadcrumb links](https://mmistakes.github.io/minimal-mistakes/docs/configuration/#breadcrumb-navigation-beta), [navigation lists](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#navigation-list), and more.
-- Commenting support (powered by [Disqus](https://disqus.com/), [Facebook](https://developers.facebook.com/docs/plugins/comments), Google+, [Discourse](https://www.discourse.org/), static-based via [Staticman](https://staticman.net/), and custom).
+- Commenting support (powered by [Disqus](https://disqus.com/), [Facebook](https://developers.facebook.com/docs/plugins/comments), Google+, [Discourse](https://www.discourse.org/), static-based via [Staticman](https://staticman.net/), [utterances](https://utteranc.es/), and [giscus](https://giscus.app/)).
- [Google Analytics](https://www.google.com/analytics/) support.
-- UI localized text in English (default), Brazilian Portuguese, Chinese, French, German, Italian, Korean, Nepali (Nepalese), Russian, Spanish, and Turkish
+- [Swetrix](https://swetrix.com/) GDPR-compliant analytics support.
+- UI localized text in English (default), Arabic (عربي), Brazilian Portuguese (Português brasileiro), Bulgarian, Catalan, Chinese, Czech, Danish, Dutch, Finnish, French (Français), German (Deutsch), Greek, Hebrew, Hindi (हिंदी), Hungarian, Indonesian, Irish (Gaeilge), Italian (Italiano), Japanese, Kiswahili, Korean, Malayalam, Myanmar (Burmese), Nepali (Nepalese), Norwegian (Norsk), Persian (فارسی), Polish, Punjabi (ਪੰਜਾਬੀ), Romanian, Russian, Slovak, Spanish (Español), Swedish, Thai, Turkish (Türkçe), Ukrainian (Українська) and Vietnamese.
-## Demo Pages
+## Skins (color variations)
-| Name | Description |
-| ------------------------------------------- | ----------------------------------------------------- |
-| [Post with Header Image][header-image-post] | A post with a large header image. |
+This theme comes in 11 different skins (in addition to the default one).
+
+| `air` | `contrast` | `dark` |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [](https://mmistakes.github.io/minimal-mistakes/assets/images/air-skin-archive-large.png) | [](https://mmistakes.github.io/minimal-mistakes/assets/images/contrast-skin-archive-large.png) | [](https://mmistakes.github.io/minimal-mistakes/assets/images/dark-skin-archive-large.png) |
+
+| `dirt` | `mint` | `sunrise` |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [](https://mmistakes.github.io/minimal-mistakes/assets/images/dirt-skin-archive-large.png) | [](https://mmistakes.github.io/minimal-mistakes/assets/images/mint-skin-archive-large.png) | [](https://mmistakes.github.io/minimal-mistakes/assets/images/sunrise-skin-archive-large.png) |
+
+| `aqua` | `neon` | `plum` |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [](https://mmistakes.github.io/minimal-mistakes/assets/images/aqua-skin-archive-large.png) | [](https://mmistakes.github.io/minimal-mistakes/assets/images/neon-skin-archive-large.png) | [](https://mmistakes.github.io/minimal-mistakes/assets/images/plum-skin-archive-large.png) |
+
+| `catppuccin_latte` | `catppuccin_mocha` |
+| --- | --- |
+|  |  |
+## Demo pages
+
+| Name | Description |
+| ----------------------------------------------- | ------------------------------------------------------------- |
+| [Post with Header Image][header-image-post] | A post with a large header image. |
| [HTML Tags and Formatting Post][html-tags-post] | A variety of common markup showing how the theme styles them. |
-| [Syntax Highlighting Post][syntax-post] | Post displaying highlighted code. |
-| [Post with a Gallery][gallery-post] | A post showing several images wrapped in `
` elements. |
-| [Sample Collection Page][sample-collection] | Single page from a collection. |
-| [Categories Archive][categories-archive] | Posts grouped by category. |
-| [Tags Archive][tags-archive] | Posts grouped by tag. |
+| [Syntax Highlighting Post][syntax-post] | Post displaying highlighted code. |
+| [Post with a Gallery][gallery-post] | A post showing several images wrapped in `
` elements. |
+| [Sample Collection Page][sample-collection] | Single page from a collection. |
+| [Categories Archive][categories-archive] | Posts grouped by category. |
+| [Tags Archive][tags-archive] | Posts grouped by tag. |
Additional sample posts are available under [posts archive][year-archive] on the demo site. Source files for these (and the entire demo site) can be found in [`/docs`](docs).
@@ -50,51 +72,104 @@ Additional sample posts are available under [posts archive][year-archive] on the
[tags-archive]: https://mmistakes.github.io/minimal-mistakes/tags/
[year-archive]: https://mmistakes.github.io/minimal-mistakes/year-archive/
-## Usage
+## Installation
-For detailed instructions on how to configure, customize, add content, and more read the [theme's documentation](https://mmistakes.github.io/minimal-mistakes/docs/quick-start-guide/).
+There are three ways to install: as a [gem-based theme](https://jekyllrb.com/docs/themes/#understanding-gem-based-themes), as a [remote theme](https://blog.github.com/2017-11-29-use-any-theme-with-github-pages/) (GitHub Pages compatible), or forking/directly copying all of the theme files into your project.
-**Note:** Gem version of the theme requires Jekyll v3.3+ and is not currently supported on [GitHub Pages](https://pages.github.com/). You can still use the theme with GitHub Pages, you'll just need to install using the old "[repo fork method](https://mmistakes.github.io/minimal-mistakes/docs/installation/)".
+### Gem-based method
-## Quick Start
+With Gem-based themes, directories such as the `assets`, `_layouts`, `_includes`, and `_sass` are stored in the theme’s gem, hidden from your immediate view. Yet all of the necessary directories will be read and processed during Jekyll’s build process.
-Add this line to your Jekyll site's `Gemfile`:
+This allows for easier installation and updating as you don't have to manage any of the theme files. To install:
-```ruby
-gem "minimal-mistakes-jekyll"
-```
+1. Add the following to your `Gemfile`:
-Add this line to your Jekyll site's `_config.yml` file:
+ ```ruby
+ gem "minimal-mistakes-jekyll"
+ ```
-```yaml
-theme: minimal-mistakes-jekyll
-```
+2. Fetch and update bundled gems by running the following [Bundler](http://bundler.io/) command:
-Then run Bundler to install the theme gem and dependencies:
+ ```bash
+ bundle
+ ```
-```bash
-bundle install
-```
+3. Set the `theme` in your project's Jekyll `_config.yml` file:
+
+ ```yaml
+ theme: minimal-mistakes-jekyll
+ ```
To update the theme run `bundle update`.
----
+### Remote theme method
-## Contributing
+Remote themes are similar to Gem-based themes, but do not require `Gemfile` changes or whitelisting making them ideal for sites hosted with GitHub Pages.
+
+To install:
+
+1. Create/replace the contents of your `Gemfile` with the following:
+
+ ```ruby
+ source "https://rubygems.org"
+
+ gem "github-pages", group: :jekyll_plugins
+ gem "jekyll-include-cache", group: :jekyll_plugins
+ ```
+
+2. Add `jekyll-include-cache` to the `plugins` array of your `_config.yml`.
+
+3. Fetch and update bundled gems by running the following [Bundler](https://bundler.io/) command:
+
+ ```bash
+ bundle
+ ```
+
+4. Add `remote_theme: "mmistakes/minimal-mistakes@4.27.3"` to your `_config.yml` file. Remove any other `theme:` or `remote_theme:` entry.
+
+
-Minimal Mistakes has been designed as a base for you to customize and fit your site's unique needs. Please keep this in mind when requesting features and/or submitting pull requests. If it's not something that most people will use, I probably won't consider it. When in doubt ask.
+**Looking for an example?** Use the [Minimal Mistakes remote theme starter](https://github.com/mmistakes/mm-github-pages-starter/generate) for the quickest method of getting a GitHub Pages hosted site up and running. Generate a new repository from the starter, replace sample content with your own, and configure as needed.
-This goes for author sidebar links and "share button" additions -- I have no intention of merging in every possibly option, the essentials are there to get you started :smile:.
+## Usage
+
+For detailed instructions on how to configure, customize, add/migrate content, and more read the [theme's documentation](https://mmistakes.github.io/minimal-mistakes/docs/quick-start-guide/).
+
+## Contributing
+
+Found a typo in the documentation or interested in [fixing a bug](https://github.com/mmistakes/minimal-mistakes/issues)? Then by all means [submit an issue](https://github.com/mmistakes/minimal-mistakes/issues/new) or [pull request](https://help.github.com/articles/using-pull-requests/). If this is your first pull request, it may be helpful to read up on the [GitHub Flow](https://guides.github.com/introduction/flow/) first.
+
+For help with using the theme or general Jekyll support questions, please use the [Jekyll Talk forums](https://talk.jekyllrb.com/).
### Pull Requests
When submitting a pull request:
1. Clone the repo.
-2. Create a branch off of `master` and give it a meaningful name (e.g. `my-awesome-new-feature`) and describe the feature or fix.
-3. Open a pull request on GitHub.
+2. Create a branch off of `master` and give it a meaningful name (e.g. `my-awesome-new-feature`).
+3. Open a pull request on GitHub and describe the feature or fix.
Theme documentation and demo pages can be found in the [`/docs`](docs) if submitting improvements, typo corrections, etc.
@@ -104,8 +179,6 @@ To set up your environment to develop this theme, run `bundle install`.
To test the theme, run `bundle exec rake preview` and open your browser at `http://localhost:4000/test/`. This starts a Jekyll server using content in the `test/` directory. As modifications are made to the theme and test site, it will regenerate and you should see the changes in the browser after a refresh.
----
-
## Credits
### Creator
@@ -118,8 +191,8 @@ To test the theme, run `bundle exec rake preview` and open your browser at `http
### Icons + Demo Images:
-- [The Noun Project](https://thenounproject.com) -- Garrett Knoll, Arthur Shlain, and [tracy tam](https://thenounproject.com/tracytam)
-- [Font Awesome](http://fortawesome.github.io/Font-Awesome/)
+- [The Noun Project](https://thenounproject.com) - Garrett Knoll, Arthur Shlain, and [tracy tam](https://thenounproject.com/tracytam)
+- [Font Awesome](http://fontawesome.io/)
- [Unsplash](https://unsplash.com/)
### Other:
@@ -130,16 +203,18 @@ To test the theme, run `bundle exec rake preview` and open your browser at `http
- [Breakpoint](http://breakpoint-sass.com/)
- [Magnific Popup](http://dimsemenov.com/plugins/magnific-popup/)
- [FitVids.JS](http://fitvidsjs.com/)
-- Greedy Navigation - [lukejacksonn](http://codepen.io/lukejacksonn/pen/PwmwWV)
-- [jQuery Smooth Scroll](https://github.com/kswedberg/jquery-smooth-scroll)
-
----
+- [GreedyNav.js](https://github.com/lukejacksonn/GreedyNav)
+- [Smooth Scroll](https://github.com/cferdinandi/smooth-scroll)
+- [Gumshoe](https://github.com/cferdinandi/gumshoe)
+- [jQuery throttle / debounce](http://benalman.com/projects/jquery-throttle-debounce-plugin/)
+- [Lunr](http://lunrjs.com)
+- [Clipboard.js](https://clipboardjs.com)
## License
The MIT License (MIT)
-Copyright (c) 2017 Michael Rose
+Copyright (c) 2013-2024 Michael Rose and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -158,3 +233,61 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+
+Minimal Mistakes incorporates icons from [The Noun Project](https://thenounproject.com/)
+creators Garrett Knoll, Arthur Shlain, and tracy tam.
+Icons are distributed under Creative Commons Attribution 3.0 United States (CC BY 3.0 US).
+
+Minimal Mistakes incorporates [Font Awesome](http://fontawesome.io/),
+Copyright (c) 2017 Dave Gandy.
+Font Awesome is distributed under the terms of the [SIL OFL 1.1](http://scripts.sil.org/OFL)
+and [MIT License](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates photographs from [Unsplash](https://unsplash.com).
+
+Minimal Mistakes incorporates [Susy](http://susy.oddbird.net/),
+Copyright (c) 2017, Miriam Eric Suzanne.
+Susy is distributed under the terms of the [BSD 3-clause "New" or "Revised" License](https://opensource.org/licenses/BSD-3-Clause).
+
+Minimal Mistakes incorporates [Breakpoint](http://breakpoint-sass.com/).
+Breakpoint is distributed under the terms of the [MIT/GPL Licenses](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates [FitVids.js](https://github.com/davatron5000/FitVids.js/),
+Copyright (c) 2013 Dave Rubert and Chris Coyier.
+FitVids is distributed under the terms of the [WTFPL License](http://www.wtfpl.net/).
+
+Minimal Mistakes incorporates [Magnific Popup](http://dimsemenov.com/plugins/magnific-popup/),
+Copyright (c) 2014-2016 Dmitry Semenov, http://dimsemenov.com.
+Magnific Popup is distributed under the terms of the MIT License.
+
+Minimal Mistakes incorporates [Smooth Scroll](http://github.com/cferdinandi/smooth-scroll),
+Copyright (c) 2019 Chris Ferdinandi.
+Smooth Scroll is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates [Gumshoejs](http://github.com/cferdinandi/gumshoe),
+Copyright (c) 2019 Chris Ferdinandi.
+Gumshoejs is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates [jQuery throttle / debounce](http://benalman.com/projects/jquery-throttle-debounce-plugin/),
+Copyright (c) 2010 "Cowboy" Ben Alman.
+jQuery throttle / debounce is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates [GreedyNav.js](https://github.com/lukejacksonn/GreedyNav),
+Copyright (c) 2015 Luke Jackson.
+GreedyNav.js is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates [Jekyll Group-By-Array](https://github.com/mushishi78/jekyll-group-by-array),
+Copyright (c) 2015 Max White .
+Jekyll Group-By-Array is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates [@allejo's Pure Liquid Jekyll Table of Contents](https://allejo.io/blog/a-jekyll-toc-in-liquid-only/),
+Copyright (c) 2017 Vladimir Jimenez.
+Pure Liquid Jekyll Table of Contents is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates [Lunr](http://lunrjs.com),
+Copyright (c) 2018 Oliver Nightingale.
+Lunr is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates [clipboard.js](https://clipboardjs.com/),
+Copyright (c) 2021 Zeno Rocha.
+Clipboard.js is distributed under the terms of the [MIT License](https://opensource.org/licenses/MIT).
\ No newline at end of file
diff --git a/Rakefile b/Rakefile
index 921330e6ab79..2c5f027bd669 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,6 +1,15 @@
require "bundler/gem_tasks"
require "jekyll"
+require "json"
require "listen"
+require "rake/clean"
+require "shellwords"
+require "time"
+require "yaml"
+
+task :default => %i[copyright changelog js version]
+
+package_json = JSON.parse(File.read("package.json"))
def listen_ignore_paths(base, options)
[
@@ -65,8 +74,7 @@ task :preview do
puts " Halting auto-regeneration."
exit 0
end
-
- loop { sleep 1000 }
+ sleep
end
rescue ThreadError
# You pressed Ctrl-C, oh my!
@@ -74,3 +82,130 @@ task :preview do
Jekyll::Commands::Serve.process(options)
end
+
+task :history => :changelog
+task :changelog => "docs/_docs/18-history.md"
+file "docs/_docs/18-history.md" => "CHANGELOG.md" do |t|
+ front_matter = {
+ title: "History",
+ classes: "wide",
+ permalink: "/docs/history/",
+ excerpt: "Change log of enhancements and bug fixes made to the theme.",
+ sidebar: {
+ nav: "docs",
+ },
+ last_modified_at: Time.now.iso8601,
+ toc: false,
+ }
+ # https://stackoverflow.com/a/49553523/5958455
+ front_matter = JSON.parse(JSON.dump(front_matter))
+ File.open(t.name, "w") do |f|
+ f.puts front_matter.to_yaml
+ f.puts "---"
+ f.puts ""
+ f.puts ""
+ f.puts ""
+ f.puts "{% raw %}"
+ # Remove H1
+ changelog = File.read(t.prerequisites.first)
+ .gsub(/^# [^\n]*$/m, "")
+ .gsub(/\(#(\d+)\)$/m, "[#\\1](https://github.com/mmistakes/minimal-mistakes/issues/\\1)")
+ .strip
+ f.write changelog
+ f.puts ""
+ f.puts "{% endraw %}"
+ end
+end
+
+COPYRIGHT_LINES = [
+ "Minimal Mistakes Jekyll Theme #{package_json["version"]} by Michael Rose",
+ "Copyright 2013-#{Time.now.year} Michael Rose - mademistakes.com | @mmistakes",
+ "Free for personal and commercial use under the MIT license",
+ "https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE",
+]
+
+COPYRIGHT_FILES = [
+ "_includes/copyright.html",
+ "_includes/copyright.js",
+ "_sass/minimal-mistakes/_copyright.scss",
+]
+
+def genenerate_copyright_file(filename, header, prefix, footer)
+ File.open(filename, "w") do |f|
+ f.puts header
+ COPYRIGHT_LINES.each do |line|
+ f.puts "#{prefix}#{line}"
+ end
+ f.puts footer
+ end
+end
+
+file "_includes/copyright.html" => "package.json" do |t|
+ genenerate_copyright_file(t.name, "")
+end
+
+file "_includes/copyright.js" => "package.json" do |t|
+ genenerate_copyright_file(t.name, "/*!", " * ", " */")
+end
+
+file "_sass/minimal-mistakes/_copyright.scss" => "package.json" do |t|
+ genenerate_copyright_file(t.name, "/*!", " * ", " */")
+end
+
+task :copyright => COPYRIGHT_FILES
+
+CLEAN.include(*COPYRIGHT_FILES)
+
+JS_FILES = ["assets/js/vendor/jquery/jquery-3.6.0.js"] + Dir.glob("assets/js/plugins/*.js") + ["assets/js/_main.js"]
+JS_TARGET = "assets/js/main.min.js"
+task :js => JS_TARGET
+file JS_TARGET => ["_includes/copyright.js"] + JS_FILES do |t|
+ sh Shellwords.join(%w[npx uglifyjs -c --comments /@mmistakes/ --source-map -m -o] +
+ [t.name] + t.prerequisites)
+end
+
+task :watch_js do
+ listener = Listen.to(
+ "assets/js",
+ ignore: /main\.min\.js$/,
+ ) do |modified, added, removed|
+ Rake::Task[:js].invoke
+ end
+
+ trap("INT") do
+ listener.stop
+ exit 0
+ end
+
+ begin
+ listener.start
+ sleep
+ rescue ThreadError
+ end
+end
+
+task :version => ["docs/_data/theme.yml", "README.md", "docs/_pages/home.md"]
+
+file "docs/_data/theme.yml" => "package.json" do |t|
+ theme = { "version" => package_json["version"] }
+ File.open(t.name, "w") do |f|
+ f.puts "# for use with in-page templates"
+ f.puts theme.to_yaml
+ end
+end
+
+file "README.md" => "package.json" do |t|
+ content = File.read(t.name)
+ content = content.gsub(/(mmistakes\/minimal-mistakes@)[\d.]+/, '\1' + package_json["version"])
+ File.write(t.name, content)
+end
+
+file "docs/_pages/home.md" => "package.json" do |t|
+ content = File.read(t.name)
+ content = content.gsub(/(\breleases\/tag\/|Latest release v)[\d.]+/, '\1' + package_json["version"])
+ File.write(t.name, content)
+end
+
+task :gem do
+ sh 'gem build minimal-mistakes-jekyll.gemspec'
+end
diff --git a/_config.yml b/_config.yml
index 4278d37dc1c4..7513c7bb0fbb 100644
--- a/_config.yml
+++ b/_config.yml
@@ -5,20 +5,36 @@
# For technical reasons, this file is *NOT* reloaded automatically when you use
# `jekyll serve`. If you change this file, please restart the server process.
+# Theme Settings
+#
+# Review documentation to determine if you should use `theme` or `remote_theme`
+# https://mmistakes.github.io/minimal-mistakes/docs/quick-start-guide/#installing-the-theme
+
+# theme : "minimal-mistakes-jekyll"
+# remote_theme : "mmistakes/minimal-mistakes"
+minimal_mistakes_skin : "default" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise", "catppuccin_latte", "catppuccin_mocha"
+
# Site Settings
-locale : "en"
+locale : "en-US"
+rtl : # true, false (default) # turns direction of the page into right to left for RTL languages
title : "Site Title"
title_separator : "-"
+subtitle : # site tagline that appears below site title in masthead
name : "Your Name"
description : "An amazing website."
url : # the base hostname & protocol for your site e.g. "https://mmistakes.github.io"
baseurl : # the subpath of your site, e.g. "/blog"
repository : # GitHub username/repo-name e.g. "mmistakes/minimal-mistakes"
teaser : # path of fallback teaser image, e.g. "/assets/images/500x300.png"
-# breadcrumbs : false # true, false (default)
+logo : # path of logo image to display in the masthead, e.g. "/assets/images/88x88.png"
+masthead_title : # overrides the website title displayed in the masthead, use " " for no title
+breadcrumbs : # true, false (default)
words_per_minute : 200
+enable_copy_code_button : # true, false (default)
+copyright : # "copyright" name, defaults to site.title
+copyright_url : # "copyright" URL, defaults to site.url
comments:
- provider : # false (default), "disqus", "discourse", "facebook", "google-plus", "staticman", "custom"
+ provider : # false (default), "disqus", "discourse", "facebook", "staticman", "staticman_v2", "utterances", "giscus", "custom"
disqus:
shortname : # https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname-
discourse:
@@ -28,30 +44,49 @@ comments:
appid :
num_posts : # 5 (default)
colorscheme : # "light" (default), "dark"
-staticman:
- allowedFields : ['name', 'email', 'url', 'message']
- branch : "master"
- commitMessage : "New comment."
- filename : comment-{@timestamp}
- format : "yml"
- moderation : true
- path : "docs/_data/comments/{options.slug}" # "/_data/comments/{options.slug}" (default)
- requiredFields : ['name', 'email', 'message']
- transforms:
- email : "md5"
- generatedFields:
- date:
- type : "date"
- options:
- format : "iso8601" # "iso8601" (default), "timestamp-seconds", "timestamp-milliseconds"
+ utterances:
+ theme : # "github-light" (default), "github-dark"
+ issue_term : # "pathname" (default)
+ giscus:
+ repo_id : # Shown during giscus setup at https://giscus.app
+ category_name : # Full text name of the category
+ category_id : # Shown during giscus setup at https://giscus.app
+ discussion_term : # "pathname" (default), "url", "title", "og:title"
+ reactions_enabled : # '1' for enabled (default), '0' for disabled
+ theme : # "light" (default), "dark", "dark_dimmed", "transparent_dark", "preferred_color_scheme"
+ strict : # 1 for enabled, 0 for disabled (default)
+ input_position : # "top", "bottom" # The comment input box will be placed above or below the comments
+ emit_metadata : # 1 for enabled, 0 for disabled (default) # https://github.com/giscus/giscus/blob/main/ADVANCED-USAGE.md#imetadatamessage
+ lang : # "en" (default)
+ lazy : # true, false # Loading of the comments will be deferred until the user scrolls near the comments container.
+ staticman:
+ branch : # "master"
+ endpoint : # "https://{your Staticman v3 API}/v3/entry/github/"
+reCaptcha:
+ siteKey :
+ secret :
atom_feed:
path : # blank (default) uses feed.xml
-
+ hide : # true, false (default)
+search : # true, false (default)
+search_full_content : # true, false (default)
+search_provider : # lunr (default), algolia, google
+lunr:
+ search_within_pages : # true, false (default)
+algolia:
+ application_id : # YOUR_APPLICATION_ID
+ index_name : # YOUR_INDEX_NAME
+ search_only_api_key : # YOUR_SEARCH_ONLY_API_KEY
+ powered_by : # true (default), false
+google:
+ search_engine_id : # YOUR_SEARCH_ENGINE_ID
+ instant_search : # false (default), true
# SEO Related
google_site_verification :
bing_site_verification :
-alexa_site_verification :
+naver_site_verification :
yandex_site_verification :
+baidu_site_verification :
# Social Sharing
twitter:
@@ -61,6 +96,7 @@ facebook:
app_id :
publisher :
og_image : # Open Graph/Twitter default site image
+og_image_alt : # Alt text for Open Graph/Twitter default site image
# For specifying social profiles
# - https://developers.google.com/structured-data/customize/social-profiles
social:
@@ -70,42 +106,62 @@ social:
# Analytics
analytics:
- provider : false # false (default), "google", "google-universal", "custom"
+ provider : # false (default), "google", "google-universal", "google-gtag", "custom"
google:
tracking_id :
+ anonymize_ip : # true, false (default)
# Site Author
author:
name : "Your Name"
avatar : # path of avatar image, e.g. "/assets/images/bio-photo.jpg"
- bio : "I am an amazing person."
+ bio : "I am an **amazing** person."
location : "Somewhere"
email :
- uri :
- bitbucket :
- codepen :
- dribbble :
- flickr :
- facebook :
- foursquare :
- github :
- gitlab :
- google_plus :
- keybase :
- instagram :
- lastfm :
- linkedin : # "john-doe-12345678" (the last part of your profile url, e.g. https://www.linkedin.com/in/john-doe-12345678)
- pinterest :
- soundcloud :
- stackoverflow : # "123456/username" (the last part of your profile url, e.g. http://stackoverflow.com/users/123456/username)
- steam : # "steamId" (the last part of your profile url, e.g. https://steamcommunity.com/id/steamId/)
- tumblr :
- twitter :
- vine :
- weibo :
- xing :
- youtube : # "https://youtube.com/c/MichaelRoseDesign"
+ links:
+ - label: "Email"
+ icon: "fas fa-fw fa-square-envelope"
+ # url: "mailto:your.name@email.com"
+ - label: "Website"
+ icon: "fas fa-fw fa-link"
+ # url: "https://your-website.com"
+ - label: "Twitter"
+ icon: "fab fa-fw fa-square-x-twitter"
+ # url: "https://twitter.com/"
+ - label: "Facebook"
+ icon: "fab fa-fw fa-square-facebook"
+ # url: "https://facebook.com/"
+ - label: "GitHub"
+ icon: "fab fa-fw fa-github"
+ # url: "https://github.com/"
+ - label: "Instagram"
+ icon: "fab fa-fw fa-instagram"
+ # url: "https://instagram.com/"
+
+# Site Footer
+footer:
+ links:
+ - label: "Twitter"
+ icon: "fab fa-fw fa-square-x-twitter"
+ # url:
+ # rel: "me" # optional: adds rel attribute (e.g. for IndieWeb web sign-in)
+ - label: "Facebook"
+ icon: "fab fa-fw fa-square-facebook"
+ # url:
+ - label: "GitHub"
+ icon: "fab fa-fw fa-github"
+ # url:
+ - label: "GitLab"
+ icon: "fab fa-fw fa-gitlab"
+ # url:
+ - label: "Bitbucket"
+ icon: "fab fa-fw fa-bitbucket"
+ # url:
+ - label: "Instagram"
+ icon: "fab fa-fw fa-instagram"
+ # url:
+ since: "2013"
# Reading Files
@@ -131,8 +187,10 @@ exclude:
- gulpfile.js
- LICENSE
- log
+ - minimal-mistakes-jekyll.gemspec
- node_modules
- package.json
+ - package-lock.json
- Rakefile
- README
- tmp
@@ -168,23 +226,47 @@ kramdown:
# Sass/SCSS
sass:
sass_dir: _sass
- style: compressed # http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style
+ style: compressed # https://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style
# Outputting
permalink: /:categories/:title/
+timezone: # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
+
+
+# Pagination with jekyll-paginate
paginate: 5 # amount of posts to show
paginate_path: /page:num/
-timezone: # http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
+# Pagination with jekyll-paginate-v2
+# See https://github.com/sverrirs/jekyll-paginate-v2/blob/master/README-GENERATOR.md#site-configuration
+# for configuration details
+pagination:
+ # Set enabled to true to use paginate v2
+ # enabled: true
+ debug: false
+ collection: 'posts'
+ per_page: 10
+ permalink: '/page/:num/'
+ title: ':title - page :num'
+ limit: 0
+ sort_field: 'date'
+ sort_reverse: true
+ category: 'posts'
+ tag: ''
+ locale: ''
+ trail:
+ before: 2
+ after: 2
-# Plugins
-gems:
+
+# Plugins (previously gems:)
+plugins:
- jekyll-paginate
- jekyll-sitemap
- jekyll-gist
- jekyll-feed
- - jemoji
+ - jekyll-include-cache
# mimic GitHub Pages with --safe
whitelist:
@@ -192,7 +274,7 @@ whitelist:
- jekyll-sitemap
- jekyll-gist
- jekyll-feed
- - jemoji
+ - jekyll-include-cache
# Archives
@@ -203,14 +285,15 @@ whitelist:
# - Archive page should exist at path when using Liquid method or you can
# expect broken links (especially with breadcrumbs enabled)
# - /tags/my-awesome-tag/index.html ~> path: /tags/
-# - path: /categories/
-# - path: /
+# - /categories/my-awesome-category/index.html ~> path: /categories/
+# - /my-awesome-category/index.html ~> path: /
category_archive:
type: liquid
path: /categories/
tag_archive:
type: liquid
path: /tags/
+# show_taxonomy: false # set to false to hide tag/category lists on posts
# https://github.com/jekyll/jekyll-archives
# jekyll-archives:
# enabled:
@@ -225,7 +308,7 @@ tag_archive:
# HTML Compression
-# - http://jch.penibelst.de/
+# - https://jch.penibelst.de/
compress_html:
clippings: all
ignore:
@@ -245,3 +328,4 @@ defaults:
comments: # true
share: true
related: true
+
diff --git a/_data/ui-text.yml b/_data/ui-text.yml
index b25cb7e66294..59b779489b35 100644
--- a/_data/ui-text.yml
+++ b/_data/ui-text.yml
@@ -3,14 +3,19 @@
# English (default)
# -----------------
en: &DEFAULT_EN
+ skip_links : "Skip links"
+ skip_primary_nav : "Skip to primary navigation"
+ skip_content : "Skip to content"
+ skip_footer : "Skip to footer"
page : "Page"
pagination_previous : "Previous"
pagination_next : "Next"
breadcrumb_home_label : "Home"
breadcrumb_separator : "/"
- menu_label : "Toggle Menu"
- toc_label : "On This Page"
- ext_link_label : "Direct Link"
+ menu_label : "Toggle menu"
+ search_label : "Toggle search"
+ toc_label : "On this page"
+ ext_link_label : "Direct link"
less_than : "less than"
minute_read : "minute read"
share_on_label : "Share on"
@@ -18,16 +23,16 @@ en: &DEFAULT_EN
tags_label : "Tags:"
categories_label : "Categories:"
date_label : "Updated:"
- comments_label : "Leave a Comment"
+ comments_label : "Leave a comment"
comments_title : "Comments"
- more_label : "Learn More"
- related_label : "You May Also Enjoy"
+ more_label : "Learn more"
+ related_label : "You may also enjoy"
follow_label : "Follow:"
feed_label : "Feed"
powered_by : "Powered by"
website_label : "Website"
email_label : "Email"
- recent_posts : "Recent Posts"
+ recent_posts : "Recent posts"
undefined_wpm : "Undefined parameter words_per_minute at _config.yml"
comment_form_info : "Your email address will not be published. Required fields are marked"
comment_form_comment_label : "Comment"
@@ -35,11 +40,16 @@ en: &DEFAULT_EN
comment_form_name_label : "Name"
comment_form_email_label : "Email address"
comment_form_website_label : "Website (optional)"
- comment_btn_submit : "Submit Comment"
+ comment_btn_submit : "Submit comment"
comment_btn_submitted : "Submitted"
comment_success_msg : "Thanks for your comment! It will show on the site once it has been approved."
comment_error_msg : "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again."
loading_label : "Loading..."
+ search_label_text : "Enter your search term..."
+ search_placeholder_text : "Enter your search term..."
+ search_algolia_no_results : "No results"
+ results_found : "Result(s) found"
+ back_to_top : "Back to top"
en-US:
<<: *DEFAULT_EN
en-CA:
@@ -50,70 +60,85 @@ en-AU:
<<: *DEFAULT_EN
# Spanish
-# --------------
+# -------
es: &DEFAULT_ES
+ skip_links : "Saltar enlaces"
+ skip_primary_nav : "Saltar a navegación principal"
+ skip_content : "Saltar a contenido"
+ skip_footer : "Saltar a pie"
page : "Página"
pagination_previous : "Anterior"
pagination_next : "Siguiente"
breadcrumb_home_label : "Inicio"
breadcrumb_separator : "/"
- menu_label :
- toc_label : "Contenidos"
- ext_link_label : "Enlace"
+ menu_label : "Alternar menú"
+ search_label : "Alternar búsqueda"
+ toc_label : "En esta página"
+ ext_link_label : "Enlace directo"
less_than : "menos de"
- minute_read : "minuto de lectura"
- share_on_label : "Compartir"
+ minute_read : "minuto(s) de lectura"
+ share_on_label : "Compartir en"
meta_label :
tags_label : "Etiquetas:"
categories_label : "Categorías:"
date_label : "Actualizado:"
- comments_label : "Comentar"
- comments_title :
+ comments_label : "Deja un comentario"
+ comments_title : "Comentarios"
more_label : "Ver más"
- related_label : "Podrías ver también"
+ related_label : "Puede que también te interese"
follow_label : "Seguir:"
feed_label : "Feed"
- powered_by : "Powered by"
+ powered_by : "Funciona con"
website_label : "Sitio web"
- email_label : "Email"
+ email_label : "Correo electrónico"
recent_posts : "Entradas recientes"
- undefined_wpm : "Parametro words_per_minute (Palabras por minuto) no definido en _config.yml"
- comment_form_info : "Su dirección de correo no será publicada. Se han resaltado los campos requeridos"
+ undefined_wpm : "El parámetro words_per_minute (palabras por minuto) no está definido en _config.yml"
+ comment_form_info : "Tu dirección de correo electrónico no se publicará. Los campos obligatorios están marcados"
comment_form_comment_label : "Comentario"
- comment_form_md_info : "Markdown está soportado."
+ comment_form_md_info : "Puedes utilizar Markdown"
comment_form_name_label : "Nombre"
- comment_form_email_label : "Dirección de E-mail"
+ comment_form_email_label : "Dirección de correo electrónico"
comment_form_website_label : "Sitio web (opcional)"
- comment_btn_submit : "Enviar Commentario"
+ comment_btn_submit : "Enviar comentario"
comment_btn_submitted : "Enviado"
- comment_success_msg : "Gracias por su comentario!, Este se visualizará en el sitio una vez haya sido aprobado"
- comment_error_msg : "Lo sentimos, ha ocurrido un error al enviar su comentario. Por favor asegurese que todos los campos han sido diligenciados e intente de nuevo"
+ comment_success_msg : "¡Gracias por tu comentario! Se publicará una vez sea aprobado."
+ comment_error_msg : "Ha ocurrido un error al enviar el comentario. Asegúrate de completar todos los campos obligatorios e inténtalo de nuevo."
loading_label : "Cargando..."
+ search_label_text : "Términos de búsqueda..."
+ search_placeholder_text : "Términos de búsqueda..."
+ search_algolia_no_results :
+ results_found : "resultado(s) encontrado(s)"
+ back_to_top : "Volver arriba"
es-ES:
<<: *DEFAULT_ES
es-CO:
<<: *DEFAULT_ES
# French
-# -----------------
+# ------
fr: &DEFAULT_FR
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
page : "Page"
pagination_previous : "Précédent"
pagination_next : "Suivant"
breadcrumb_home_label : "Accueil"
breadcrumb_separator : "/"
- menu_label :
+ menu_label : "Menu"
+ search_label :
toc_label : "Sur cette page"
ext_link_label : "Lien direct"
less_than : "moins de"
- minute_read : "minute de lecture"
+ minute_read : "minute(s) de lecture"
share_on_label : "Partager sur"
meta_label :
tags_label : "Tags :"
categories_label : "Catégories :"
date_label : "Mis à jour :"
comments_label : "Laisser un commentaire"
- comments_title :
+ comments_title : "Commentaires"
more_label : "Lire plus"
related_label : "Vous pourriez aimer aussi"
follow_label : "Contact"
@@ -123,7 +148,6 @@ fr: &DEFAULT_FR
email_label : "Email"
recent_posts : "Posts récents"
undefined_wpm : "Le paramètre words_per_minute n'est pas défini dans _config.yml"
- comments_title : "Commentaires"
comment_form_info : "Votre adresse email ne sera pas visible. Les champs obligatoires sont marqués"
comment_form_comment_label : "Commentaire"
comment_form_md_info : "Markdown est supporté."
@@ -135,6 +159,11 @@ fr: &DEFAULT_FR
comment_success_msg : "Merci pour votre commentaire, il sera visible sur le site une fois approuvé."
comment_error_msg : "Désolé, une erreur est survenue lors de la soumission. Vérifiez que les champs obligatoires ont été remplis et réessayez."
loading_label : "Chargement..."
+ search_label_text :
+ search_placeholder_text : "Entrez votre recherche..."
+ search_algolia_no_results :
+ results_found : "Résultat(s) trouvé(s)"
+ back_to_top : "Retour en haut"
fr-FR:
<<: *DEFAULT_FR
fr-BE:
@@ -143,14 +172,19 @@ fr-CH:
<<: *DEFAULT_FR
# Turkish
-# -----------------
+# -------
tr: &DEFAULT_TR
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
page : "Sayfa"
pagination_previous : "Önceki"
pagination_next : "Sonraki"
breadcrumb_home_label : "Ana Sayfa"
breadcrumb_separator : "/"
menu_label :
+ search_label :
toc_label : "İçindekiler"
ext_link_label : "Doğrudan Bağlantı"
less_than : "Şu süreden az: "
@@ -182,18 +216,25 @@ tr: &DEFAULT_TR
comment_success_msg : "Yorumunuz için teşekkürler! Yorumunuz onaylandıktan sonra sitede gösterilecektir."
comment_error_msg : "Maalesef bir hata oluştu. Lütfen zorunlu olan tüm alanları doldurduğunuzdan emin olun ve sonrasında tekrar deneyin."
loading_label : "Yükleniyor..."
+ search_label_text :
+ search_algolia_no_results :
tr-TR:
<<: *DEFAULT_TR
# Portuguese
-# -----------------
+# ----------
pt: &DEFAULT_PT
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
page : "Página"
pagination_previous : "Anterior"
pagination_next : "Seguinte"
breadcrumb_home_label : "Início"
breadcrumb_separator : "/"
menu_label :
+ search_label :
toc_label : "Nesta Página"
ext_link_label : "Link Direto"
less_than : "menos de"
@@ -225,57 +266,74 @@ pt: &DEFAULT_PT
comment_success_msg : "Obrigado pelo seu comentário! Será visível no site logo que aprovado."
comment_error_msg : "Lamento, ocorreu um erro na sua submissão. Por favor verifique se todos os campos obrigatórios estão corretamente preenchidos e tente novamente."
loading_label : "A carregar..."
+ search_label_text :
+ search_algolia_no_results :
+pt-PT:
+ <<: *DEFAULT_PT
# Brazilian Portuguese
pt-BR:
+ skip_links : "Pular links"
+ skip_primary_nav : "Pular para navegação primária"
+ skip_content : "Pular para conteúdo"
+ skip_footer : "Pular para rodapé"
page : "Página"
pagination_previous : "Anterior"
pagination_next : "Próxima"
- breadcrumb_home_label : "Home"
+ breadcrumb_home_label : "Início"
breadcrumb_separator : "/"
- menu_label :
+ menu_label : "Chavear menu"
+ search_label : "Chavear busca"
toc_label : "Nesta página"
ext_link_label : "Link direto"
- less_than : "meno que"
- minute_read : "minutos de leitura"
- share_on_label : "Compartilhe em"
+ less_than : "menos de"
+ minute_read : "minuto(s) de leitura"
+ share_on_label : "Compartilhe"
meta_label :
tags_label : "Tags:"
categories_label : "Categorias:"
date_label : "Atualizado em:"
comments_label : "Deixe um comentário"
- comments_title :
- more_label : "Aprenda Mais"
- related_label : "Você Talvez Goste Também"
- follow_label : "Acompanhe em"
+ comments_title : "Comentários"
+ more_label : "Saiba mais"
+ related_label : "Talvez você também goste"
+ follow_label : "Siga:"
feed_label : "Feed"
- powered_by : "Feito com"
+ powered_by : "Desenvolvido com"
website_label : "Site"
- email_label : "Email"
- recent_posts : "Postagens recentes"
- undefined_wpm : "Parâmetro indefinido em word_per_minute no _config.yml"
- comment_form_info :
- comment_form_comment_label :
- comment_form_md_info :
- comment_form_name_label :
- comment_form_email_label :
- comment_form_website_label :
- comment_btn_submit :
- comment_btn_submitted :
- comment_success_msg :
- comment_error_msg :
- loading_label :
-pt-PT:
- <<: *DEFAULT_PT
+ email_label : "E-mail"
+ recent_posts : "Publicações recentes"
+ undefined_wpm : "Parâmetro words_per_minute não definido em _config.yml"
+ comment_form_info : "Seu e-mail não será publicado. Os campos obrigatórios estão marcados"
+ comment_form_comment_label : "Comentário"
+ comment_form_md_info : "Você pode usar Markdown."
+ comment_form_name_label : "Nome"
+ comment_form_email_label : "E-mail"
+ comment_form_website_label : "Site (opcional)"
+ comment_btn_submit : "Enviar comentário"
+ comment_btn_submitted : "Enviado"
+ comment_success_msg : "Obrigado pelo seu comentário! Ele aparecerá no site assim que for aprovado."
+ comment_error_msg : "Desculpe, ocorreu um erro no envio. Verifique se todos os campos obrigatórios foram preenchidos e tente novamente."
+ loading_label : "Carregando..."
+ search_label_text : "Digite seu termo de busca..."
+ search_placeholder_text : "Digite seu termo de busca..."
+ search_algolia_no_results : "Nenhum resultado"
+ results_found : "Resultado(s) encontrado(s)"
+ back_to_top : "Voltar para o topo"
# Italian
-# -----------------
+# -------
it: &DEFAULT_IT
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
page : "Pagina"
pagination_previous : "Precedente"
pagination_next : "Prossima"
breadcrumb_home_label : "Home"
breadcrumb_separator : "/"
menu_label :
+ search_label :
toc_label : "Indice della pagina"
ext_link_label : "Link"
less_than : "meno di"
@@ -307,22 +365,32 @@ it: &DEFAULT_IT
comment_success_msg : "Grazie per il tuo commento! Verrà visualizzato nel sito una volta che sarà approvato."
comment_error_msg : "C'è stato un errore con il tuo invio. Assicurati che tutti i campi richiesti siano stati completati e riprova."
loading_label : "Caricamento..."
+ search_label_text :
+ search_placeholder_text : "Inserisci termini di ricerca..."
+ search_algolia_no_results :
+ results_found : "Risultati"
+ back_to_top : "Vai su"
it-IT:
<<: *DEFAULT_IT
# Chinese (zh-CN Chinese - China)
-# -----------------
-zh: &DEFAULT_ZH
+# --------------------------------
+zh: &DEFAULT_ZH_HANS
+ skip_links : "跳转链接"
+ skip_primary_nav : "转到主导航栏"
+ skip_content : "转到内容"
+ skip_footer : "转到底部"
page : "页面"
- pagination_previous : "向前"
- pagination_next : "向后"
+ pagination_previous : "上一页"
+ pagination_next : "下一页"
breadcrumb_home_label : "首页"
breadcrumb_separator : "/"
menu_label : "切换菜单"
- toc_label : "在本页上"
+ search_label : "切换搜索"
+ toc_label : "目录"
ext_link_label : "直接链接"
less_than : "少于"
- minute_read : "分钟读完"
+ minute_read : "分钟阅读"
share_on_label : "分享"
meta_label :
tags_label : "标签:"
@@ -338,10 +406,10 @@ zh: &DEFAULT_ZH
website_label : "网站"
email_label : "电子邮箱"
recent_posts : "最新文章"
- undefined_wpm : "_config.yml配置中words_per_minute字段未定义"
+ undefined_wpm : "_config.yml 配置中 words_per_minute 字段未定义"
comment_form_info : "您的电子邮箱地址并不会被展示。请填写标记为必须的字段。"
comment_form_comment_label : "评论"
- comment_form_md_info : "Markdown语法已支持。"
+ comment_form_md_info : "支持 Markdown 语法。"
comment_form_name_label : "姓名"
comment_form_email_label : "电子邮箱"
comment_form_website_label : "网站(可选)"
@@ -350,77 +418,97 @@ zh: &DEFAULT_ZH
comment_success_msg : "感谢您的评论!被批准后它会立即在此站点展示。"
comment_error_msg : "很抱歉,您的提交存在错误。请确保所有必填字段都已填写正确,然后再试一次。"
loading_label : "正在加载..."
+ search_label_text : "输入您要搜索的关键词..."
+ search_placeholder_text : "输入您要搜索的关键词..."
+ search_algolia_no_results : "无结果"
+ results_found : "条记录匹配"
+ back_to_top : "返回顶部"
zh-CN:
- <<: *DEFAULT_ZH
-zh-HK:
- <<: *DEFAULT_ZH
+ <<: *DEFAULT_ZH_HANS
zh-SG:
- <<: *DEFAULT_ZH
+ <<: *DEFAULT_ZH_HANS
# Taiwan (Traditional Chinese)
-zh-TW:
+zh-TW: &DEFAULT_ZH_HANT
+ skip_links : "跳過連結"
+ skip_primary_nav : "跳至主導覽"
+ skip_content : "跳至內容"
+ skip_footer : "跳至頁尾"
page : "頁面"
- pagination_previous : "較舊"
- pagination_next : "較新"
+ pagination_previous : "上一頁"
+ pagination_next : "下一頁"
breadcrumb_home_label : "首頁"
breadcrumb_separator : "/"
- menu_label : "切換選單"
- toc_label : "本頁"
+ menu_label : "選單"
+ search_label : "搜尋"
+ toc_label : "本頁目錄"
ext_link_label : "外部連結"
less_than : "少於"
minute_read : "分鐘閱讀"
- share_on_label : "分享到"
+ share_on_label : "分享至"
meta_label :
tags_label : "標籤:"
categories_label : "分類:"
date_label : "更新時間:"
comments_label : "留言"
- comments_title : "留言內容"
- more_label : "了解更多"
- related_label : "猜您有與趣"
- follow_label : "追蹤:"
- feed_label : "RSS Feed"
- powered_by : "Powered by"
+ comments_title : "留言"
+ more_label : "閱讀更多"
+ related_label : "您可能也會有興趣"
+ follow_label : "追蹤:"
+ feed_label : "訂閱 Feed"
+ powered_by : "採用技術:"
website_label : "網站"
- email_label : "電子信箱"
+ email_label : "電子郵件"
recent_posts : "最新文章"
- undefined_wpm : "_config.yml 中未定義 words_per_minute"
- comment_form_info : "您的電子信箱不會被公開. 必填部份已標記"
- comment_form_comment_label : "留言內容"
- comment_form_md_info : "支援Markdown語法。"
- comment_form_name_label : "名字"
- comment_form_email_label : "電子信箱帳號"
- comment_form_website_label : "網頁 (可選填)"
+ undefined_wpm : "設定檔 (_config.yml) 中缺少 `words_per_minute` 參數"
+ comment_form_info : "您的電子郵件不會被公開。必填欄位已標註星號 (*)"
+ comment_form_comment_label : "留言"
+ comment_form_md_info : "支援 Markdown 語法。"
+ comment_form_name_label : "名稱"
+ comment_form_email_label : "電子郵件地址"
+ comment_form_website_label : "網站 (選填)"
comment_btn_submit : "送出留言"
comment_btn_submitted : "已送出"
comment_success_msg : "感謝您的留言! 審核後將會顯示在站上。"
- comment_error_msg : "抱歉,部份資料輸入有問題。請確認資料填寫正確後再試一次。"
+ comment_error_msg : "抱歉,您提交的資料有誤。請確認所有必填欄位皆已正確填寫後再試一次。"
loading_label : "載入中..."
+ search_label_text : "輸入您要搜尋的關鍵字..."
+ search_placeholder_text : "輸入您要搜尋的關鍵字..."
+ search_algolia_no_results : "找不到結果"
+ results_found : "找到結果"
+ back_to_top : "回到頁首"
+zh-HK:
+ <<: *DEFAULT_ZH_HANT
# German / Deutsch
-# -----------------
+# ----------------
de: &DEFAULT_DE
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
page : "Seite"
pagination_previous : "Vorherige"
pagination_next : "Nächste"
- breadcrumb_home_label : "Home"
+ breadcrumb_home_label : "Start"
breadcrumb_separator : "/"
- menu_label :
+ menu_label : "Menü ein-/ausschalten"
+ search_label :
toc_label : "Auf dieser Seite"
ext_link_label : "Direkter Link"
less_than : "weniger als"
- minute_read : "Minuten zum lesen"
+ minute_read : "Minuten zum Lesen"
share_on_label : "Teilen auf"
meta_label :
tags_label : "Tags:"
categories_label : "Kategorien:"
date_label : "Aktualisiert:"
- comments_label : "Hinterlassen sie einen Kommentar"
+ comments_label : "Hinterlassen Sie einen Kommentar"
comments_title : "Kommentare"
more_label : "Mehr anzeigen"
related_label : "Ihnen gefällt vielleicht auch"
follow_label : "Folgen:"
feed_label : "Feed"
- powered_by : "Powered by"
+ powered_by : "Möglich durch"
website_label : "Webseite"
email_label : "E-Mail"
recent_posts : "Aktuelle Beiträge"
@@ -429,13 +517,17 @@ de: &DEFAULT_DE
comment_form_comment_label : "Kommentar"
comment_form_md_info : "Markdown wird unterstützt."
comment_form_name_label : "Name"
- comment_form_email_label : "E-Mail Addresse"
+ comment_form_email_label : "E-Mail-Addresse"
comment_form_website_label : "Webseite (optional)"
comment_btn_submit : "Kommentar absenden"
comment_btn_submitted : "Versendet"
- comment_success_msg : "Danke für ihren Kommentar! Er wird auf der Seite angezeigt, nachdem er geprüft wurde."
- comment_error_msg : "Entschuldigung, es gab einen Fehler. Bitte füllen sie alle benötigten Felder aus und versuchen sie es erneut."
+ comment_success_msg : "Danke für Ihren Kommentar! Er wird auf der Seite angezeigt, nachdem er geprüft wurde."
+ comment_error_msg : "Entschuldigung, es gab einen Fehler. Bitte füllen Sie alle benötigten Felder aus und versuchen Sie es erneut."
loading_label : "Lade..."
+ search_label_text :
+ search_placeholder_text : "Suchbegriff eingeben..."
+ search_algolia_no_results :
+ results_found : "Ergebnis(se) gefunden"
de-DE:
<<: *DEFAULT_DE
de-AT:
@@ -450,14 +542,19 @@ de-LU:
<<: *DEFAULT_DE
# Nepali (Nepal)
-# -----------------
+# --------------
ne: &DEFAULT_NE
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
page : "पृष्ठ"
pagination_previous : "अघिल्लो"
pagination_next : "अर्को"
breadcrumb_home_label : "गृह"
breadcrumb_separator : "/"
menu_label : "टगल मेनु"
+ search_label :
toc_label : "यो पृष्ठमा"
ext_link_label : "सिधा सम्पर्क"
less_than : "कम्तिमा"
@@ -489,18 +586,25 @@ ne: &DEFAULT_NE
comment_success_msg : "तपाईंको टिप्पणीको लागि धन्यवाद! एक पटक यो अनुमोदन गरेपछी यो साइटमा देखाउनेछ।"
comment_error_msg : "माफ गर्नुहोस्, तपाईंको टिप्पणी त्रुटि थियो।सबै आवश्यक जानकारीहरु पूरा गरिएको छ भने निश्चित गर्नुहोस् र फेरि प्रयास गर्नुहोस्।"
loading_label : "लोड हुँदैछ ..."
+ search_label_text :
+ search_algolia_no_results :
ne-NP:
<<: *DEFAULT_NE
# Korean
-# --------------
+# ------
ko: &DEFAULT_KO
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
page : "페이지"
pagination_previous : "이전"
pagination_next : "다음"
breadcrumb_home_label : "Home"
breadcrumb_separator : "/"
menu_label : "토글 메뉴"
+ search_label :
toc_label : "On This Page"
ext_link_label : "직접 링크"
less_than : "최대"
@@ -532,18 +636,28 @@ ko: &DEFAULT_KO
comment_success_msg : "감사합니다! 댓글이 머지된 후 확인하실 수 있습니다."
comment_error_msg : "댓글 등록에 문제가 있습니다. 필요 필드를 작성했는지 확인하고 다시 시도하세요."
loading_label : "로딩중..."
+ search_label_text :
+ search_placeholder_text : "검색어를 입력하세요..."
+ search_algolia_no_results :
+ results_found : "개 결과 발견"
+ back_to_top : "맨 위로 이동"
ko-KR:
<<: *DEFAULT_KO
# Russian / Русский
# -----------------
ru: &DEFAULT_RU
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
page : "Страница"
pagination_previous : "Предыдущая"
pagination_next : "Следующая"
breadcrumb_home_label : "Главная"
breadcrumb_separator : "/"
menu_label : "Выпадающее меню"
+ search_label :
toc_label : "Содержание"
ext_link_label : "Прямая ссылка"
less_than : "менее"
@@ -575,18 +689,27 @@ ru: &DEFAULT_RU
comment_success_msg : "Спасибо за Ваш комментарий! Он будет опубликован на сайте после проверки."
comment_error_msg : "К сожалению, произошла ошибка с отправкой комментария. Пожалуйста, убедитесь, что все обязательные поля заполнены и попытайтесь снова."
loading_label : "Отправка..."
+ search_label_text :
+ search_placeholder_text : "Введите поисковый запрос..."
+ search_algolia_no_results :
+ results_found : "Найдено"
ru-RU:
<<: *DEFAULT_RU
# Lithuanian / Lietuviškai
-# -----------------
+# ------------------------
lt: &DEFAULT_LT
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
page : "Puslapis"
pagination_previous : "Ankstesnis"
pagination_next : "Sekantis"
breadcrumb_home_label : "Pagrindinis"
breadcrumb_separator : "/"
menu_label : "Meniu rodymas"
+ search_label :
toc_label : "Turinys"
ext_link_label : "Tiesioginė nuoroda"
less_than : "mažiau nei"
@@ -607,7 +730,7 @@ lt: &DEFAULT_LT
email_label : "El. paštas"
recent_posts : "Naujausi įrašai"
undefined_wpm : "Nedeklaruotas parametras words_per_minute faile _config.yml"
- comment_form_info : "El. pašto adresas nebus viešinamas. Būtini laukai pažymėti."
+ comment_form_info : "El. pašto adresas nebus viešinamas. Būtini laukai pažymėti"
comment_form_comment_label : "Komentaras"
comment_form_md_info : "Markdown palaikomas."
comment_form_name_label : "Vardas"
@@ -618,18 +741,25 @@ lt: &DEFAULT_LT
comment_success_msg : "Ačiū už komentarą! Jis bus parodytas kai bus patvirtintas."
comment_error_msg : "Atleiskite, įvyko netikėta klaida įrašant komentarą. Pasitikrinkite ar užpildėte visus būtinus laukus ir pamėginkite dar kartą."
loading_label : "Kraunama..."
+ search_label_text :
+ search_algolia_no_results :
lt-LT:
<<: *DEFAULT_LT
# Greek
-# --------------
+# -----
gr: &DEFAULT_GR
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
page : "Σελίδα"
pagination_previous : "Προηγούμενo"
pagination_next : "Επόμενo"
breadcrumb_home_label : "Αρχική"
breadcrumb_separator : "/"
menu_label : "Μενού"
+ search_label :
toc_label : "Περιεχόμενα"
ext_link_label : "Εξωτερικός Σύνδεσμος"
less_than : "Λιγότερο από"
@@ -661,18 +791,27 @@ gr: &DEFAULT_GR
comment_success_msg : "Ευχαριστούμε για το σχόλιό σας! Θα εμφανιστεί στην ιστοσελίδα αφού εγκριθεί."
comment_error_msg : "Λυπούμαστε, παρουσιάστηκε σφάλμα με την υποβολή σας. Παρακαλούμε βεβαιωθείτε ότι έχετε όλα τα απαιτούμενα πεδία συμπληρωμένα και δοκιμάστε ξανά."
loading_label : "Φόρτωση..."
+ search_label_text :
+ search_placeholder_text : "Εισάγετε όρο αναζήτησης..."
+ search_algolia_no_results :
+ results_found : "Αποτελέσματα"
gr-GR:
<<: *DEFAULT_GR
# Swedish
-# -----------------
+# -------
sv: &DEFAULT_SV
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
page : "Sidan"
pagination_previous : "Föregående"
pagination_next : "Nästa"
breadcrumb_home_label : "Hem"
breadcrumb_separator : "/"
- menu_label : "Meny ridå"
+ menu_label : "Växla menyläge"
+ search_label : "Växla sökläge"
toc_label : "På denna sida"
ext_link_label : "Direkt länk"
less_than : "mindre än"
@@ -693,31 +832,41 @@ sv: &DEFAULT_SV
email_label : "E-post"
recent_posts : "Senaste inlägg"
undefined_wpm : "Odefinerade parametrar words_per_minute i _config.yml"
- comment_form_info : "Din e-post adress kommer inte att publiceras. Obligatoriska fält är markerade."
+ comment_form_info : "Din e-post adress kommer inte att publiceras. Obligatoriska fält är markerade"
comment_form_comment_label : "Kommentar"
- comment_form_md_info : "Använd Markdown för text-formateringen."
+ comment_form_md_info : "Stöd för Markdown finns."
comment_form_name_label : "Namn"
comment_form_email_label : "E-post adress"
comment_form_website_label : "Webdsida (valfritt)"
comment_btn_submit : "Skicka en kommentar"
comment_btn_submitted : "Kommentaren har tagits emot"
comment_success_msg : "Tack för din kommentar! Den kommer att visas på sidan så fort den har godkännts."
- comment_error_msg : "Tyvärr det har blivit något fel i en av fälten, se till att du fyller i alla rutor och försök igen."
+ comment_error_msg : "Tyvärr det har blivit något fel i ett av fälten, se till att du fyllt i alla obligatoriska fält och försök igen."
loading_label : "Laddar..."
+ search_label_text :
+ search_placeholder_text : "Fyll i sökterm..."
+ search_algolia_no_results :
+ results_found : "Resultat funna"
+ back_to_top : "Tillbaka till toppen"
sv-SE:
<<: *DEFAULT_SV
sv-FI:
<<: *DEFAULT_SV
# Dutch
-# -----------------
+# -----
nl: &DEFAULT_NL
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
page : "Pagina"
pagination_previous : "Vorige"
pagination_next : "Volgende"
breadcrumb_home_label : "Home"
breadcrumb_separator : "/"
menu_label : "Wissel Menu"
+ search_label :
toc_label : "Op deze pagina"
ext_link_label : "Directe Link"
less_than : "minder dan"
@@ -749,84 +898,104 @@ nl: &DEFAULT_NL
comment_success_msg : "Bedankt voor uw reactie! Het zal op de site worden weergegeven zodra het is goedgekeurd."
comment_error_msg : "Sorry, er is een fout opgetreden bij uw inzending. Zorg ervoor dat alle vereiste velden zijn voltooid en probeer het opnieuw."
loading_label : "Laden..."
+ search_label_text : "Geef uw zoekterm in..."
+ search_placeholder_text : "Geef uw zoekterm in..."
+ search_algolia_no_results :
+ results_found : "Resultaat gevonden"
+ back_to_top : "Terug naar boven"
nl-BE:
<<: *DEFAULT_NL
nl-NL:
<<: *DEFAULT_NL
# Indonesian
-# -----------------
+# ----------
id: &DEFAULT_ID
+ skip_links :
+ skip_primary_nav : "Loncat ke navigasi"
+ skip_content : "Loncat ke konten"
+ skip_footer : "Loncat ke footer"
page : "Halaman"
- pagination_previous : "Kembali"
- pagination_next : "Maju"
- breadcrumb_home_label : "Home"
+ pagination_previous : "Sebelumnya"
+ pagination_next : "Selanjutnya"
+ breadcrumb_home_label : "Beranda"
breadcrumb_separator : "/"
- menu_label : "Menu Toggle"
+ menu_label : "Menu"
+ search_label : "Pencarian"
toc_label : "Pada Halaman Ini"
ext_link_label : "Link langsung"
less_than : "Kurang dari"
- minute_read : "Waktu baca"
- share_on_label : "Berbagi di"
+ minute_read : "menit baca"
+ share_on_label : "Bagikan di"
meta_label :
- tags_label : "Golongan:"
+ tags_label : "Label:"
categories_label : "Kategori:"
date_label : "Diupdate:"
comments_label : "Tinggalkan komentar"
comments_title : "Komentar"
more_label : "Pelajari lagi"
- related_label : "Anda juga akan suka"
+ related_label : "Anda mungkin suka"
follow_label : "Ikuti:"
feed_label : "Feed"
powered_by : "Didukung oleh"
website_label : "Website"
email_label : "Email"
- recent_posts : "Posting terbaru"
+ recent_posts : "Post terbaru"
undefined_wpm : "Parameter terdeskripsi words_per_minute di _config.yml"
- comment_form_info : "Email Anda tidak akan dipublish. Kolom yang diperlukan ditandai"
+ comment_form_info : "Email Anda tidak akan dipublish. Kolom yang diperlukan ditandai dengan tanda "
comment_form_comment_label : "Komentar"
- comment_form_md_info : "Markdown disupport."
+ comment_form_md_info : "Markdown didukung."
comment_form_name_label : "Nama"
comment_form_email_label : "Alamat email"
comment_form_website_label : "Website (opsional)"
- comment_btn_submit : "Submit Komentar"
- comment_btn_submitted : "Telah disubmit"
- comment_success_msg : "Terimakasih atas komentar Anda! Komentar ini akan tampil setelah disetujui."
- comment_error_msg : "Maaf, ada kesalahan pada submisi Anda. Pastikan seluruh kolom sudah dilengkapi dan coba kembali."
- loading_label : "Sedang meload..."
+ comment_btn_submit : "Kirim Komentar"
+ comment_btn_submitted : "Telah dikirim"
+ comment_success_msg : "Terimakasih atas komentar Anda! Komentar akan tampil setelah disetujui."
+ comment_error_msg : "Maaf, ada kesalahan pada komentar Anda. Pastikan seluruh kolom sudah dilengkapi dan coba kembali."
+ loading_label : "Sedang memuat..."
+ search_label_text : "Masukkan kata kunci pencarian..."
+ search_placeholder_text : "Masukkan kata kunci pencarian..."
+ search_algolia_no_results : "Tidak ada hasil"
+ results_found : "Hasil pencarian ditemukan"
+ back_to_top : "Kembali ke awal"
id-ID:
<<: *DEFAULT_ID
# Vietnamese
-# -----------------
+# ----------
vi: &DEFAULT_VI
+ skip_links : "Đường dẫn tắt"
+ skip_primary_nav : "Nhảy tới thanh điều hướng"
+ skip_content : "Nhảy tới nội dung"
+ skip_footer : "Nhảy tới chân trang"
page : "Trang"
pagination_previous : "Trước"
- pagination_next : "Sau"
+ pagination_next : "Kế tiếp"
breadcrumb_home_label : "Trang chủ"
breadcrumb_separator : "/"
menu_label : "Menu"
- toc_label : "Tại trang này"
+ search_label : "Tìm kiếm"
+ toc_label : "Mục lục"
ext_link_label : "Đường dẫn trực tiếp"
- less_than : "nhỏ hơn"
- minute_read : "phút đọc"
+ less_than : "chỉ cần"
+ minute_read : "phút để đọc"
share_on_label : "Chia sẻ tại"
meta_label :
- tags_label : "Nhãn:"
- categories_label : "Chủ đề:"
- date_label : "Cập nhật:"
+ tags_label : "Thẻ:"
+ categories_label : "Danh mục:"
+ date_label : "Ngày cập nhật:"
comments_label : "Để lại bình luận"
comments_title : "Bình luận"
more_label : "Mở rộng"
related_label : "Có thể bạn cũng thích"
follow_label : "Theo dõi:"
feed_label : "Feed"
- powered_by : "Được hỗ trợ bởi"
+ powered_by : "Xây dựng trên nền tảng"
website_label : "Website"
email_label : "Email"
recent_posts : "Bài viết mới"
undefined_wpm : "Chưa định nghĩa thông số words_per_minute tại _config.yml"
- comment_form_info : "Email của bạn sẽ được giữ bí mật. Các phần bắt buộc được đánh dấu."
+ comment_form_info : "Email của bạn sẽ được giữ bí mật. Các phần bắt buộc được đánh dấu"
comment_form_comment_label : "Bình luận"
comment_form_md_info : "Hỗ trợ Markdown."
comment_form_name_label : "Tên"
@@ -837,18 +1006,28 @@ vi: &DEFAULT_VI
comment_success_msg : "Cảm ơn bạn đã bình luận! Bình luận sẽ xuất hiện sau khi được duyệt."
comment_error_msg : "Rất tiếc, có lỗi trong việc gửi bình luận. Hãy đảm bảo toàn bộ các phần bắt buộc đã được điền đầy đủ và thử lại."
loading_label : "Đang tải..."
+ search_label_text : "Nhập từ khóa cần tìm..."
+ search_placeholder_text : "Nhập từ khóa cần tìm..."
+ search_algolia_no_results : "Không tìm thấy kết quả nào"
+ results_found : "Kết quả tìm được"
+ back_to_top : "Lên đầu trang"
vi-VN:
<<: *DEFAULT_VI
# Danish
# ------
da: &DEFAULT_DA
+ skip_links :
+ skip_primary_nav : "Gå til hovedmenuen"
+ skip_content : "Gå til indholdet"
+ skip_footer : "Gå til sidefoden"
page : "Side"
pagination_previous : "Forrige"
pagination_next : "Næste"
- breadcrumb_home_label : "Home"
+ breadcrumb_home_label : "Forside"
breadcrumb_separator : "/"
menu_label : "Vis/skjul menu"
+ search_label : "Søgning til/fra"
toc_label : "På denne side"
ext_link_label : "Direkte link"
less_than : "mindre end"
@@ -880,9 +1059,1127 @@ da: &DEFAULT_DA
comment_success_msg : "Tak for din kommentar! Den bliver vist på siden, så snart den er godkendt."
comment_error_msg : "Desværre skete der en fejl. Prøv igen, mens du sørger for at alle obligatoriske felter er udfyldt."
loading_label : "Indlæser..."
+ search_label_text : "Hvad leder du efter..."
+ search_placeholder_text : "Hvad leder du efter..."
+ search_algolia_no_results : "Ingen resultater"
+ results_found : "Resultat(er) fundet"
+ back_to_top : "Tilbage til toppen"
da-DK:
<<: *DEFAULT_DA
+# Polish
+# ------
+pl: &DEFAULT_PL
+ skip_links : "Pomiń linki"
+ skip_primary_nav : "Przejdź do nawigacji"
+ skip_content : "Przejdź do treści"
+ skip_footer : "Przejdź do stopki"
+ page : "Strona"
+ pagination_previous : "Poprzednia"
+ pagination_next : "Następna"
+ breadcrumb_home_label : "Strona główna"
+ breadcrumb_separator : "/"
+ menu_label : "Przełącz menu"
+ search_label : "Przełącz wyszukiwanie"
+ toc_label : "Spis treści"
+ ext_link_label : "Link bezpośredni"
+ less_than : "mniej niż"
+ minute_read : "minut(y)"
+ share_on_label : "Udostępnij"
+ meta_label :
+ tags_label : "Tagi:"
+ categories_label : "Kategorie:"
+ date_label : "Ostatnia aktualizacja:"
+ comments_label : "Zostaw komentarz"
+ comments_title : "Komentarze"
+ more_label : "Dowiedz się więcej"
+ related_label : "Także może Ci się spodobać"
+ follow_label : "Śledź:"
+ feed_label : "Feed"
+ powered_by : "Powstało dzięki"
+ website_label : "Strona"
+ email_label : "Email"
+ recent_posts : "Najnowsze wpisy"
+ undefined_wpm : "Parametr words_per_minute nie został zdefiniowany w _config.yml."
+ comment_form_info : "Twój adres email nie będzie udostępiony. Wymagane pola są oznaczone."
+ comment_form_comment_label : "Skomentuj"
+ comment_form_md_info : "Markdown jest wspierany"
+ comment_form_name_label : "Imię"
+ comment_form_email_label : "Adres email"
+ comment_form_website_label : "Strona www (opcjonalna)"
+ comment_btn_submit : "Skomentuj"
+ comment_btn_submitted : "Komentarz dodany"
+ comment_success_msg : "Dziękuję za Twój komentarz! Zostanie dodany po akceptacji."
+ comment_error_msg : "Niestety wystąpił błąd. Proszę upewnij się, że wszystkie wymagane pola zostały wypełnione i spróbuj ponownie."
+ loading_label : "Trwa ładowanie strony..."
+ search_label_text : "Wprowadź kryteria wyszukiwania..."
+ search_placeholder_text : "Wprowadź kryteria wyszukiwania..."
+ search_algolia_no_results : "Brak wyników"
+ results_found : "Znalezione wyniki"
+ back_to_top : "Wróć na górę"
+pl-PL:
+ <<: *DEFAULT_PL
+
+# Japanese
+# --------
+ja: &DEFAULT_JA
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
+ page : "ページ"
+ pagination_previous : "前へ"
+ pagination_next : "次へ"
+ breadcrumb_home_label : "ホーム"
+ breadcrumb_separator : "/"
+ menu_label : "メニュー"
+ search_label :
+ toc_label : "目次"
+ ext_link_label : "リンク"
+ less_than :
+ minute_read :
+ share_on_label : "共有"
+ meta_label :
+ tags_label : "タグ:"
+ categories_label : "カテゴリー:"
+ date_label : "更新日時:"
+ comments_label : "コメントする"
+ comments_title : "コメント"
+ more_label : "さらに詳しく"
+ related_label : "関連記事"
+ follow_label : "フォロー"
+ feed_label :
+ powered_by :
+ website_label :
+ email_label :
+ recent_posts : "最近の投稿"
+ undefined_wpm : "パラメータ words_per_minute が _config.yml で定義されていません"
+ comment_form_info : "メールアドレスが公開されることはありません。次の印のある項目は必ず入力してください:"
+ comment_form_comment_label : "コメント"
+ comment_form_md_info : "Markdown を使用できます"
+ comment_form_name_label : "名前"
+ comment_form_email_label : "メールアドレス"
+ comment_form_website_label : "URL (任意)"
+ comment_btn_submit : "コメントを送信する"
+ comment_btn_submitted : "送信しました"
+ comment_success_msg : "コメントありがとうございます! コメントは承認されるとページに表示されます。"
+ comment_error_msg : "送信エラーです。必須項目がすべて入力されていることを確認して再送信してください。"
+ loading_label : "読み込み中..."
+ search_label_text :
+ search_placeholder_text : "検索キーワードを入力してください..."
+ search_algolia_no_results :
+ results_found : "件"
+ja-JP:
+ <<: *DEFAULT_JA
+
+# Slovak
+# -----------------
+sk: &DEFAULT_SK
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
+ page : "Stránka"
+ pagination_previous : "Predošlá"
+ pagination_next : "Ďalšia"
+ breadcrumb_home_label : "Domov"
+ breadcrumb_separator : "/"
+ menu_label : "Menu"
+ search_label :
+ toc_label : "Obsah"
+ ext_link_label : "Priamy odkaz"
+ less_than : "menej ako"
+ minute_read : "minút"
+ share_on_label : "Zdieľaj na"
+ meta_label :
+ tags_label : "Tagy:"
+ categories_label : "Kategórie:"
+ date_label : "Aktualizované:"
+ comments_label : "Zanechaj odkaz"
+ comments_title : "Komentáre"
+ more_label : "Dozvedieť sa viac"
+ related_label : "Podobné články"
+ follow_label : "Sleduj:"
+ feed_label : "Zoznam"
+ powered_by : "Stránka vytvorená pomocou"
+ website_label : "Web stránka"
+ email_label : "Email"
+ recent_posts : "Najnovšie príspevky"
+ undefined_wpm : "Nedefinovaný parameter words_per_minute v _config.yml"
+ comment_form_info : "Tvoja emailová adresa nebude publikovaná. Požadované polia sú označené"
+ comment_form_comment_label : "Komentár"
+ comment_form_md_info : "Markdown je podporovaný."
+ comment_form_name_label : "Meno"
+ comment_form_email_label : "Emailová adresa"
+ comment_form_website_label : "Webstránka (voliteľné)"
+ comment_btn_submit : "Vlož komentár"
+ comment_btn_submitted : "Vložený"
+ comment_success_msg : "Ďakujem za tvoj komentár! Po schválení bude zobrazený na stránke."
+ comment_error_msg : "Prepáč, pri ukladaní nastala chyba. Ubezpeč sa prosím, že si vyplnil všetky požadované polia a skús znova."
+ loading_label : "Načítava sa..."
+ search_label_text :
+ search_placeholder_text : "Zadaj hľadaný výraz..."
+ search_algolia_no_results :
+ results_found : "Nájdených výsledkov"
+ back_to_top : "Na začiatok stránky"
+sk-SK:
+ <<: *DEFAULT_SK
+
+# Hungarian
+# -----------------
+hu: &DEFAULT_HU
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
+ page : "Oldal"
+ pagination_previous : "Előző"
+ pagination_next : "Következő"
+ breadcrumb_home_label : "Kezdőlap"
+ breadcrumb_separator : "/"
+ menu_label : "Menü nyit/zár"
+ search_label :
+ toc_label : "Ezen az oldalon"
+ ext_link_label : "Közvetlen Link"
+ less_than : "kevesebb mint"
+ minute_read : "eltöltött percek"
+ share_on_label : "Megosztás"
+ meta_label :
+ tags_label : "Tagek:"
+ categories_label : "Kategóriák:"
+ date_label : "Frissítve:"
+ comments_label : "Szólj hozzá!"
+ comments_title : "Hozzászólások"
+ more_label : "Tovább"
+ related_label : "Ajánlások"
+ follow_label : "Követés:"
+ feed_label : "Folyam"
+ powered_by : "Powered by"
+ website_label : "Honlap"
+ email_label : "Email"
+ recent_posts : "Friss cikkek"
+ undefined_wpm : "Ismeretlen paraméter words_per_minute : _config.yml"
+ comment_form_info : "Az e-mail címed nem lesz publikus. A csillagozott mezők kitöltése kötelező"
+ comment_form_comment_label : "Hozzászólás"
+ comment_form_md_info : "Támogatott formázási mód: Markdown"
+ comment_form_name_label : "Név"
+ comment_form_email_label : "Email cím"
+ comment_form_website_label : "Honlap (nem kötelező):"
+ comment_btn_submit : "Hozzászólás elküldése"
+ comment_btn_submitted : "Hozzászólás elküldve"
+ comment_success_msg : "Köszönjük a Hozzászólást! A Hozzászólások csak előzetes moderáció után lesznek publikusak."
+ comment_error_msg : "Hoppá, hiba történt a beküldés közben. Kérlek ellenőrizd hogy minden kötelező mező ki van-e töltve."
+ loading_label : "Betöltés..."
+ search_label_text :
+ search_placeholder_text : "Keresendő szöveg..."
+ search_algolia_no_results :
+ results_found : "Találatok:"
+ back_to_top : "Oldal tetejére"
+hu-HU:
+ <<: *DEFAULT_HU
+
+# Romanian
+# -----------------
+ro: &DEFAULT_RO
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
+ page : "Pagina"
+ pagination_previous : "Anterior"
+ pagination_next : "Următor"
+ breadcrumb_home_label : "Acasă"
+ breadcrumb_separator : "/"
+ menu_label : "Comută meniul"
+ search_label :
+ toc_label : "Pe această pagină"
+ ext_link_label : "Link direct"
+ less_than : "mai puțin de"
+ minute_read : "minute de citit"
+ share_on_label : "Distribuie pe"
+ meta_label :
+ tags_label : "Etichete:"
+ categories_label : "Categorii:"
+ date_label : "Actualizat:"
+ comments_label : "Lasă un comentariu"
+ comments_title : "Comentarii"
+ more_label : "Citește mai departe"
+ related_label : "S-ar putea să-ți placă"
+ follow_label : "Urmărește:"
+ feed_label : "Feed RSS"
+ powered_by : "Cu sprijinul"
+ website_label : "Site"
+ email_label : "Email"
+ recent_posts : "Articole recente"
+ undefined_wpm : "Parametru words_per_minute nedefinit în _config.yml"
+ comment_form_info : "Adresa ta de email nu va fi făcută publică. Câmpurile marcate sunt obligatorii"
+ comment_form_comment_label : "Comentariu"
+ comment_form_md_info : "Markdown este suportat."
+ comment_form_name_label : "Nume"
+ comment_form_email_label : "Adresă de email"
+ comment_form_website_label : "Site (opțional)"
+ comment_btn_submit : "Trimite comentariul"
+ comment_btn_submitted : "Trimis"
+ comment_success_msg : "Mulțumesc pentru comentariu! Va apărea pe site în momentul în care va fi aprobat."
+ comment_error_msg : "Scuze, este o problemă cu comentariul tău. Asigură-te că toate câmpurile obligatorii au fost completate și încearcă din nou."
+ loading_label : "Se încarcă..."
+ search_label_text :
+ search_placeholder_text : "Caută ceva..."
+ search_algolia_no_results :
+ results_found : "Rezultate găsite"
+ back_to_top : "Înapoi în susul paginii"
+ro-RO:
+ <<: *DEFAULT_RO
+
+# Punjabi
+# -----------------
+pa: &DEFAULT_PA
+ skip_links : "ਲਿੰਕ ਛੱਡੋ"
+ skip_primary_nav : "ਮੂਲ ਮਾਰਗ ਛੱਡੋ"
+ skip_content : "ਸਮੱਗਰੀ ਛੱਡੋ"
+ skip_footer : "ਅੰਤ ਵਿਚ ਲਿਖਿਆ ਛੱਡੋ"
+ page : "ਸਫ਼ਾ"
+ pagination_previous : "ਪਿਛਲਾ"
+ pagination_next : "ਅਗਲਾ "
+ breadcrumb_home_label : "ਘਰ"
+ breadcrumb_separator : "/"
+ menu_label : "ਟੌਗਲ ਮੀਨੂ"
+ search_label : "ਖੋਜ"
+ toc_label : "ਇਸ ਸਫ਼ੇ 'ਤੇ"
+ ext_link_label : "ਸਿੱਧਾ ਸੰਪਰਕ"
+ less_than : "ਤੋਂ ਘੱਟ"
+ minute_read : "ਮਿੰਟ ਵਿੱਚ ਪੜਿਆ ਜਾ ਸਕਦਾ ਹੈ"
+ share_on_label : "ਸਾਂਝਾ ਕਰੋ"
+ meta_label : "ਸਵੈ-ਸੰਦਰਭ ਜਾਣਕਾਰੀ"
+ tags_label : "ਟੈਗ"
+ categories_label : "ਵਰਗ"
+ date_label : "ਅਪਡੇਟ ਕੀਤਾ:"
+ comments_label : "ਇੱਕ ਟਿੱਪਣੀ ਛੱਡੋ"
+ comments_title : "ਟਿੱਪਣੀਆਂ"
+ more_label : "ਹੋਰ ਜਾਣੋ"
+ related_label : "ਤੁਸੀਂ ਇਸਦਾ ਆਨੰਦ ਵੀ ਲੈ ਸਕਦੇ ਹੋ"
+ follow_label : "ਫਾਲੋ ਅੱਪ ਕਰੋ:"
+ feed_label : "ਫੀਡ"
+ powered_by : "ਦੁਆਰਾ ਸੰਚਾਲਿਤ"
+ website_label : "ਵੈੱਬਸਾਇਟ"
+ email_label : "ਈਮੇਲ"
+ recent_posts : "ਹਾਲ ਹੀ ਦੇ ਪੋਸਟ"
+ undefined_wpm : "_config.yml ਤੇ ਅਣ-ਪ੍ਰਭਾਸ਼ਿਤ ਪੈਰਾਮੀਟਰ words_per_minute"
+ comment_form_info : "ਤੁਹਾਡਾ ਈਮੇਲ ਪਤਾ ਪ੍ਰਕਾਸ਼ਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ। ਅਨੁਮਾਨਿਤ ਸਥਾਨਾਂ ਨੂੰ ਅੰਡਰਲਾਈਨ ਕੀਤਾ ਗਿਆ ਹੈ"
+ comment_form_comment_label : "ਟਿੱਪਣੀ"
+ comment_form_md_info : "ਮਾਰਕਡਾਊਨ ਵਰਤ ਸਕਦੇ ਹੋ।"
+ comment_form_name_label : "ਨਾਮ"
+ comment_form_email_label : "ਈਮੇਲ ਪਤਾ"
+ comment_form_website_label : "ਵੈਬਸਾਈਟ (ਵਿਕਲਪਿਕ)"
+ comment_btn_submit : "ਕੋਈ ਟਿੱਪਣੀ ਭੇਜੋ"
+ comment_btn_submitted : "ਪੇਸ਼ ਕੀਤਾ"
+ comment_success_msg : "ਤੁਹਾਡੀਆਂ ਟਿੱਪਣੀਆਂ ਲਈ ਧੰਨਵਾਦ! ਇਹ ਮਨਜ਼ੂਰੀ ਮਿਲਣ ਦੇ ਬਾਅਦ ਸਾਈਟ 'ਤੇ ਦਿਖਾਇਆ ਜਾਵੇਗਾ।"
+ comment_error_msg : "ਮੁਆਫ ਕਰਨਾ, ਤੁਹਾਡੀ ਅਧੀਨਗੀ ਵਿੱਚ ਕੋਈ ਗਲਤੀ ਹੋਈ ਸੀ ਕਿਰਪਾ ਕਰਕੇ ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਸਾਰੇ ਲੋੜੀਂਦੇ ਖੇਤਰ ਪੂਰੇ ਹੋ ਗਏ ਹਨ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
+ loading_label : "ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ..."
+ search_label_text : "ਖੋਜ"
+ search_placeholder_text : "ਆਪਣੀ ਖੋਜ ਦੇ ਸ਼ਬਦ ਨੂੰ ਦਰਜ ਕਰੋ..."
+ search_algolia_no_results :
+ results_found : "ਨਤੀਜਾ ਮਿਲਿਆ/ਮਿਲੇ"
+ back_to_top : "ਵਾਪਸ ਚੋਟੀ 'ਤੇ ਜਾਓ"
+pa-IN:
+ <<: *DEFAULT_PA
+
+# Persian (Farsi)
+# --------------
+fa: &DEFAULT_FA
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
+ page : "صفحه"
+ pagination_previous : "قبلی"
+ pagination_next : "بعدی"
+ breadcrumb_home_label : "صفحه اصلی"
+ breadcrumb_separator : "/"
+ menu_label : "فهرست"
+ toc_label : "در این صفحه"
+ ext_link_label : "لینک مستقیم"
+ less_than : " "
+ minute_read : "دقیقه، طول مطالعه"
+ share_on_label : "اشتراک گذاری در"
+ meta_label :
+ tags_label : "تگ ها: "
+ categories_label : "دسته بندی ها: "
+ date_label : "به روز شده در: "
+ comments_label : "ارسال نظر"
+ comments_title : "نظرات"
+ more_label : "ادامه مطلب"
+ related_label : "ممکن است از این مطالب نیز لذت ببرید"
+ follow_label : "دنبال کنید: "
+ feed_label : "خوراک"
+ powered_by : "طراحی شده توسط"
+ website_label : "سایت اینترنتی"
+ email_label : "پست الکترونیک"
+ recent_posts : "آخرین مطالب"
+ undefined_wpm : ".(words_per_minute) _config.yml متغیر اشتباه در"
+ comment_form_info : ".آدرس ایمیل شما منتشر نخواهد شد. فیلدهای اجباری مشخص شده اند"
+ comment_form_comment_label : "دیدگاه"
+ comment_form_md_info : ".پشتیبانی می شود Markdown"
+ comment_form_name_label : "نام"
+ comment_form_email_label : "پست الکترونیک"
+ comment_form_website_label : "سایت اینترنتی (اختیاری)"
+ comment_btn_submit : "ارسال نظر"
+ comment_btn_submitted : "ارسال شد"
+ comment_success_msg : ".باتشکر از ارسال دیدگاه! پس از تأیید، این دیدگاه در سایت نشان داده خواهد شد"
+ comment_error_msg : ".متاسفانه در ارسال شما خطایی بود. لطفا مطمئن شوید تمام فیلدهای مورد نیاز تکمیل شده و دوباره امتحان کنید"
+ loading_label : "بارگذاری..."
+ search_label_text :
+ search_placeholder_text : "عبارت جستجوی خود را وارد کنید..."
+ search_algolia_no_results :
+ results_found : "نتایج"
+ back_to_top : "بازگشت به بالا"
+fa-IR:
+ <<: *DEFAULT_FA
+
+
+# Malayalam
+# -----------------
+ml: &DEFAULT_ML
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
+ page : "പേജ്"
+ pagination_previous : "തിരികെ"
+ pagination_next : "മുന്നോട്ട്"
+ breadcrumb_home_label : "ഹോം"
+ breadcrumb_separator : "/"
+ menu_label : "ടോഗിൾ മെനു"
+ search_label : "ടോഗിൾ സെർച്ച്"
+ toc_label : "ഈ പേജിൽ"
+ ext_link_label : "ലിങ്കിലേക് പോകാൻ"
+ less_than : "ഏതാണ്ട്"
+ minute_read : "മിനിറ്റ് ദൈർഖ്യം"
+ share_on_label : "ഷെയർ ചെയ്യുവാൻ "
+ meta_label :
+ tags_label : "ടാഗുകൾ:"
+ categories_label : "വിഭാഗങ്ങൾ:"
+ date_label : "അവസാന മാറ്റം:"
+ comments_label : "അഭിപ്രായം രേഖപ്പെടുത്തുക"
+ comments_title : "അഭിപ്രായങ്ങൾ"
+ more_label : "കൂടുതൽ അറിയുവാൻ"
+ related_label : "നിങ്ങൾക് ഇതും ഇഷ്ടപ്പെട്ടേക്കാം"
+ follow_label : "പിന്തുടരുക:"
+ feed_label : "ഫീഡ്"
+ powered_by : "പവേർഡ് ബൈ"
+ website_label : "വെബ്സൈറ്റ്"
+ email_label : "ഇ-മെയിൽ"
+ recent_posts : "സമീപകാല പോസ്റ്റുകൾ"
+ undefined_wpm : "Config.yml ലെ words_per_minute പരാമീറ്റർ നിർവചിച്ചിട്ടില്ല."
+ comment_form_info : "നിങ്ങളുടെ ഇമെയിൽ വിലാസം പ്രസിദ്ധീകരിക്കില്ല. ആവശ്യമായ ഫീൽഡുകൾ അടയാളപ്പെടുത്തി."
+ comment_form_comment_label : "കമന്റ്"
+ comment_form_md_info : "Markdown സപ്പോർട്ട് ചെയ്യുന്നതാണ്."
+ comment_form_name_label : "പേര്"
+ comment_form_email_label : "ഇ-മെയിൽ"
+ comment_form_website_label : "വെബ്സൈറ് (ഓപ്ഷണൽ)"
+ comment_btn_submit : "അഭിപ്രായം രേഖപ്പെടുത്തുക"
+ comment_btn_submitted : "രേഖപ്പെടുത്തി"
+ comment_success_msg : "നിങ്ങളുടെ അഭിപ്രായത്തിന് നന്ദി! ഇത് അംഗീകരിച്ചുകഴിഞ്ഞാൽ ഇത് സൈറ്റിൽ പ്രദർശിപ്പിക്കും."
+ comment_error_msg : "ക്ഷമിക്കണം, നിങ്ങളുടെ സമർപ്പണവുമായി ബന്ധപ്പെട്ട് ഒരു പിശകുണ്ടായിരുന്നു. ആവശ്യമായ എല്ലാ ഫീൽഡുകളും പൂർത്തിയായിട്ടുണ്ടെന്ന് ഉറപ്പുവരുത്തുക, വീണ്ടും ശ്രമിക്കുക."
+ loading_label : "ലോഡിംഗ്..."
+ search_label_text :
+ search_placeholder_text : "നിങ്ങളുടെ തിരയൽ പദം നൽകുക..."
+ search_algolia_no_results :
+ results_found : "ഫലം (കൾ) കണ്ടെത്തി"
+ back_to_top : "മുകളിലേയ്ക്ക്"
+ml-IN:
+ <<: *DEFAULT_ML
+
+# Thailand
+# --------------
+th: &DEFAULT_TH
+ skip_links :
+ skip_primary_nav :
+ skip_content :
+ skip_footer :
+ page : "หน้า"
+ pagination_previous : "ก่อนหน้า"
+ pagination_next : "ถัดไป"
+ breadcrumb_home_label : "หน้าแรก"
+ breadcrumb_separator : "/"
+ menu_label : "พับเมนู"
+ search_label : "พับการค้นหา"
+ toc_label : "บนหน้านี้"
+ ext_link_label : "ลิงก์โดยตรง"
+ less_than : "น้อยกว่า"
+ minute_read : "นาที ในการอ่าน"
+ share_on_label : "แชร์ไปที่"
+ meta_label :
+ tags_label : "แท็ก:"
+ categories_label : "หมวดหมู่:"
+ date_label : "อัพเดตล่าสุด:"
+ comments_label : "แสดงความคิดเห็น"
+ comments_title : "ความคิดเห็น"
+ more_label : "อ่านต่อ"
+ related_label : "คุณอาจจะชอบสิ่งนี้"
+ follow_label : "ติดตาม:"
+ feed_label : "ฟืดข่าว"
+ powered_by : "ขับเคลื่อนโดย"
+ website_label : "เว็บไซต์"
+ email_label : "อีเมล"
+ recent_posts : "โพสล่าสุด"
+ undefined_wpm : "ไม่สามารถระบุพารามิเตอร์ words_per_minute ได้ใน _config.yml"
+ comment_form_info : "อีเมลของคุณไม่สามารถโพสสาธารณะได้ กรุณากรอกช่องที่ระบุด้วยเครื่องหมายดอกจันไว้"
+ comment_form_comment_label : "แสดงความคิดเห็น"
+ comment_form_md_info : "มาร์กดาวน์ได้รับการสนับสนุน"
+ comment_form_name_label : "ชื่อ"
+ comment_form_email_label : "ที่อยู่อีเมล"
+ comment_form_website_label : "เว็บไซต์ (ตัวเลือก)"
+ comment_btn_submit : "ส่งความคิดเห็น"
+ comment_btn_submitted : "ส่งเรียบร้อยแล้ว"
+ comment_success_msg : "ขอบคุณสำหรับการแสดงความคิดเห็น! ความคิดเห็นจะได้รับการแสดงหลังจากได้รับการยืนยัน"
+ comment_error_msg : "ขออภัย, มีบางอย่างผิดพลาดจากการส่งแบบฟอร์ม กรุณาตรวจทานทุกช่อง และลองส่งใหม่อีกครั้ง"
+ loading_label : "กำลังโหลด..."
+ search_label_text :
+ search_placeholder_text : "ใส่คำค้นหาของคุณ..."
+ search_algolia_no_results :
+ results_found : "ผลการค้นหา พบ"
+ back_to_top : "กลับด้านบน"
+th-TH:
+ <<: *DEFAULT_TH
+
+# Hindi
+# -----------------
+hi: &DEFAULT_HI
+ skip_links : "लिंक छोड़ें"
+ skip_primary_nav : "प्राथमिक पथ-प्रदर्शन छोड़ें"
+ skip_content : "सामग्री छोड़ें"
+ skip_footer : "अंत-में लिखा छोड़ें"
+ page : "पृष्ठ"
+ pagination_previous : "पिछला"
+ pagination_next : "अगला"
+ breadcrumb_home_label : "घर"
+ breadcrumb_separator : "/"
+ menu_label : "टॉगल मेनू"
+ toc_label : "इस पृष्ठ पर"
+ ext_link_label : "सीधा संपर्क"
+ less_than : "से कम"
+ minute_read : "मिनट में पढ़ सकते हैं"
+ share_on_label : "साझा करें"
+ meta_label : "स्व-संदर्भात्मक जानकारी"
+ tags_label : "अंकितक:"
+ categories_label : "श्रेणियाँ:"
+ date_label : "अपडेट किया गया:"
+ comments_label : "एक टिप्पणी छोड़ें"
+ comments_title : "टिप्पणियाँ"
+ more_label : "और अधिक जानें"
+ related_label : "आप इसका भी आनंद ले सकते हैं"
+ follow_label : "अनुसरण करे:"
+ feed_label : "फ़ीड"
+ powered_by : "द्वारा संचालित"
+ website_label : "वेबसाइट"
+ email_label : "ईमेल"
+ recent_posts : "हाल के पोस्ट"
+ undefined_wpm : "_config.yml पर अपरिभाषित पैरामीटर words_per_minute"
+ comment_form_info : "आपका ईमेल पता प्रकाशित नहीं किया जाएगा। अपेक्षित स्थानों को रेखांकित कर दिया गया है"
+ comment_form_comment_label : "टिप्पणी"
+ comment_form_md_info : "मार्कडाउन की अनुमति है।"
+ comment_form_name_label : "नाम"
+ comment_form_email_label : "ईमेल पता"
+ comment_form_website_label : "वेबसाइट (ऐच्छिक)"
+ comment_btn_submit : "टिप्पणी भेजें"
+ comment_btn_submitted : "प्रस्तुत"
+ comment_success_msg : "आपके कमेंट के लिए धन्यवाद! इसे स्वीकृति मिलने के बाद साइट पर दिखाया जाएगा।"
+ comment_error_msg : "क्षमा करें, आपके सबमिशन के साथ एक त्रुटि हुई थी। कृपया सुनिश्चित करें कि सभी आवश्यक फ़ील्ड पूरा हो गए हैं और पुनः प्रयास करें।"
+ loading_label : "लोड हो रहा है..."
+ search_label_text : "खोज"
+ search_placeholder_text : "अपना खोज शब्द दर्ज करें..."
+ search_algolia_no_results :
+ results_found : "परिणाम मिला/मिले"
+ back_to_top : "शीर्ष पर वापस"
+hi-IN:
+ <<: *DEFAULT_HI
+
+# Catalan
+# --------------
+ca: &DEFAULT_CA
+ skip_links : "Salta els enllaços"
+ skip_primary_nav : "Salta a la navegació primària"
+ skip_content : "Salta al contingut"
+ skip_footer : "Salta al peu"
+ page : "Pàgina"
+ pagination_previous : "Anterior"
+ pagination_next : "Següent"
+ breadcrumb_home_label : "Inici"
+ breadcrumb_separator : "/"
+ menu_label : "Mostra/amaga el menú"
+ search_label : "Mostra/amaga la cerca"
+ toc_label : "En aquesta pàgina"
+ ext_link_label : "Enllaç directe"
+ less_than : "es llegeix en menys de"
+ minute_read : "minut(s)"
+ share_on_label : "Comparteix a"
+ meta_label :
+ tags_label : "Etiquetes:"
+ categories_label : "Categories:"
+ date_label : "Actualitzat:"
+ comments_label : "Deixa un comentari"
+ comments_title : "Comentaris"
+ more_label : "Llegeix més"
+ related_label : "També et pot agradar"
+ follow_label : "Segueix-me:"
+ feed_label : "Feed"
+ powered_by : "Funciona amb"
+ website_label : "Pàgina web"
+ email_label : "Correu electrònic"
+ recent_posts : "Entrades recents"
+ undefined_wpm : "El paràmetre words_per_minute no està definit a _config.yml"
+ comment_form_info : "No es mostrarà el teu correu electrònic. Els camps obligatoris estan marcats"
+ comment_form_comment_label : "Comentari"
+ comment_form_md_info : "Admet Markdown."
+ comment_form_name_label : "Nom"
+ comment_form_email_label : "Correu electrònic"
+ comment_form_website_label : "Pàgina web (opcional)"
+ comment_btn_submit : "Envia"
+ comment_btn_submitted : "Enviat"
+ comment_success_msg : "Gràcies pel teu comentari! Apareixerà un cop sigui aprovat."
+ comment_error_msg : "Hi ha hagut un error enviat el comentari. Comprova que els camps obligatirs estiguin omplerts i torna-ho a provar."
+ loading_label : "Carregant..."
+ search_label_text : "Introdueix termes per cercar..."
+ search_placeholder_text : "Introdueix termes per cercar..."
+ search_algolia_no_results :
+ results_found : "resultat(s)"
+ back_to_top : "Torna a dalt"
+ca-ES:
+ <<: *DEFAULT_CA
+
+# Irish (Gaeilge)
+# --------------
+ga: &DEFAULT_GA
+ skip_links : "Léim naisc"
+ skip_primary_nav : "Léim chuig príomh naiscleanúint"
+ skip_content : "Léim chuig inneachar"
+ skip_footer : "Léim chuig buntásc"
+ page : "Leathanach"
+ pagination_previous : "Leathanach roimhe sin"
+ pagination_next : "Céad leathanach eile"
+ breadcrumb_home_label : "Baile"
+ breadcrumb_separator : "/"
+ menu_label : "Scorán roghchlár"
+ search_label : "Scorán cuardach"
+ toc_label : "Ar an leathanach seo"
+ ext_link_label : "Nasc díreach"
+ less_than : "níos lú na"
+ minute_read : "a léamh"
+ share_on_label : "Roinn ar"
+ meta_label :
+ tags_label : "Clibeanna:"
+ categories_label : "Catagoírí:"
+ date_label : "Nuashonraíodh:"
+ comments_label : "Fág trácht"
+ comments_title : "Tráchtanna"
+ more_label : "Foghlaim níos mó"
+ follow_label : "Lean:"
+ feed_label : "Feed"
+ powered_by : "Ag fáil cumhacht as"
+ website_label : "Suíomh gréasáin"
+ email_label : "R-phost"
+ recent_posts : "Postálacha le deanaí"
+ comment_form_comment_label : "Trácht"
+ comment_form_name_label : "Ainm"
+ comment_form_email_label : "Ríomhsheoladh"
+ comment_form_website_label : "Suíomh gréasáin (roghnach)"
+ comment_btn_submit : "Cuir isteach trácht"
+ comment_btn_submitted : "Curtha isteach"
+ loading_label : "Lódáil..."
+ search_label_text : "Cuir do chuardach isteach..."
+ search_placeholder_text : "Cuir do chuardach isteach..."
+ search_algolia_no_results :
+ results_found : "Torthaí aimsithe"
+ back_to_top : "Ar ais go barr"
+ga-IE:
+ <<: *DEFAULT_GA
+
+
+# Finnish / Suomi
+# -----------------
+fi: &DEFAULT_FI
+ skip_links : "Ohita linkit"
+ skip_primary_nav : "Siirry päävalikkoon"
+ skip_content : "Siirry sisältöön"
+ skip_footer : "Siirry alareunaan"
+ page : "Sivu"
+ pagination_previous : "Edellinen"
+ pagination_next : "Seuraava"
+ breadcrumb_home_label : "Etusivu"
+ breadcrumb_separator : "/"
+ menu_label : "Avaa valikko"
+ search_label : "Avaa haku"
+ toc_label : "Tällä sivulla"
+ ext_link_label : "Suora linkki"
+ less_than : "vähemmän kuin"
+ minute_read : "minuuttia luettavaa"
+ share_on_label : "Jaa"
+ meta_label :
+ tags_label : "Tunnisteet:"
+ categories_label : "Kategoriat:"
+ date_label : "Päivitetty:"
+ comments_label : "Jätä kommentti"
+ comments_title : "Kommentit"
+ more_label : "Lisää"
+ related_label : "Saatat olla kiinnostunut myös"
+ follow_label : "Seuraa:"
+ feed_label : "Syöte"
+ powered_by : "Käyttäen"
+ website_label : "Kotisivu"
+ email_label : "Sähköposti"
+ recent_posts : "Viimeisimmät kirjoitukset"
+ undefined_wpm : "words_per_minute asetusta ei ole määritelty _config.yml tiedostossa"
+ comment_form_info : "Sinun sähköpostiosoitetta ei julkaista. Vaaditut kentät ovat merkittyjä"
+ comment_form_comment_label : "Kommentti"
+ comment_form_md_info : "Tukee markdown muotoilua."
+ comment_form_name_label : "Nimi"
+ comment_form_email_label : "Sähköpostiosoite"
+ comment_form_website_label : "Nettisivu (vapaaehtoinen)"
+ comment_btn_submit : "Lähetä"
+ comment_btn_submitted : "Lähetetty"
+ comment_success_msg : "Kiitos kommentista, se julkaistaan tällä sivulla tarkastelun jälkeen."
+ comment_error_msg : "Tapahtui virhe. Tarkista, että olet täyttänyt kaikki kentät ja yritä uudelleen."
+ loading_label : "Ladataan..."
+ search_label_text : "Hakusana..."
+ search_placeholder_text : "Hakusana..."
+ search_algolia_no_results : "Ei hakutuloksia"
+ results_found : "Tulosta"
+ back_to_top : "Siirry ylös"
+
+# Myanmar (Burmese)
+# -----------------
+my: &DEFAULT_MY
+ skip_links : "လင့်များကိုကျော်ပါ။"
+ skip_primary_nav : "မူလအညွှန်းသို့ကျော်ပါ။"
+ skip_content : "အကြောင်းအရာသို့ကျော်ပါ။"
+ skip_footer : "အောက်ခြေသို့ကျော်ပါ။"
+ page : "စာမျက်နှာ"
+ pagination_previous : "ရှေ့တစ်ခု"
+ pagination_next : "နောက်တစ်ခု"
+ breadcrumb_home_label : "ပင်မစာမျက်နှာ"
+ breadcrumb_separator : "/"
+ menu_label : "မီနူး ဖွင့်၊ပိတ်"
+ search_label : "ရှာဖွေရန် ဖွင့်၊ပိတ်"
+ toc_label : "ဒီစာမျက်နှာတွင်"
+ ext_link_label : "တိုက်ရိုက်လင့်"
+ less_than : "ဖတ်ရန်ကြာချိန်"
+ minute_read : "မိနစ်"
+ share_on_label : "မျှဝေပါ။"
+ meta_label :
+ tags_label : "အမှတ်အသားများ -"
+ categories_label : "အမျိုးအစားများ -"
+ date_label : "ပြင်ဆင်ပြီး -"
+ comments_label : "မှတ်ချက်တစ်ခုချန်ထားပါ။"
+ comments_title : "မှတ်ချက်များ"
+ more_label : "ပိုမိုသိရှိရန်"
+ related_label : "သင်နှစ်သက်နိုင်သော"
+ follow_label : "သတင်းလိုက်ယူရန် -"
+ feed_label : "Feed ယူရန် -"
+ powered_by : "ပံ့ပိုးသည်"
+ website_label : "ဝဘ်ဆိုက်"
+ email_label : "အီးမေးလ်"
+ recent_posts : "လတ်တလောရေးသားချက်များ"
+ undefined_wpm : "_config.yml မှာ words_per_minute ကိုမသတ်မှတ်ထားပါ။"
+ comment_form_info : "သင့်အီးမေးလ်လိပ်စာကိုဖော်ပြသွားမည်မဟုတ်ပါ။ လိုအပ်သောဖြည့်စွက်ရန်နေရာများကို အမှတ်အသားပြထားပါသည်။"
+ comment_form_comment_label : "မှတ်ချက်"
+ comment_form_md_info : "Markdown ကိုထောက်ပံ့သည်။"
+ comment_form_name_label : "နာမည်"
+ comment_form_email_label : "အီးမေးလိပ်စာ"
+ comment_form_website_label : "ဝဘ်ဆိုက် (မဖြည့်စွက်လည်းရသည်)"
+ comment_btn_submit : "မှတ်ချက်တင်ပါ"
+ comment_btn_submitted : "တင်သွင်းလိုက်သည်"
+ comment_success_msg : "မှတ်ချက်ပေးတဲ့အတွက်ကျေးဇူးတင်ပါတယ်။ ၎င်းကိုအတည်ပြုပြီးသည့်အခါ ဝဘ်ဆိုက်ပေါ်တွင်ပြလိမ့်မည်။"
+ comment_error_msg : "တောင်းပန်ပါတယ်။ သင့်တင်သွင်းမှုတွင်အမှားတစ်ခုရှိခဲ့သည်။ ကျေးဇူးပြုပြီးလိုအပ်သောဖြည့်စွက်ရန်နေရာအားလုံးဖြည့်ပြီးပါကထပ်မံကြိုးစားပါ။"
+ loading_label : "တင်နေသည်..."
+ search_label_text : "သင့်ရှာဖွေရေးဝေါဟာရကိုရိုက်ထည့်ပါ..."
+ search_placeholder_text : "သင့်ရှာဖွေရေးဝေါဟာရကိုရိုက်ထည့်ပါ..."
+ search_algolia_no_results :
+ results_found : "ရလဒ်(များ)ကိုတွေ့ရှိခဲ့သည်"
+ back_to_top : "အပေါ်သို့ပြန်သွား"
+my-MM:
+ <<: *DEFAULT_MY
+
+# Norwegian
+# -------
+no: &DEFAULT_NO
+ skip_links : "Hopp over lenker"
+ skip_primary_nav : "Gå til primærnavigasjon"
+ skip_content : "Gå til innhold"
+ skip_footer : "Gå til fotnote"
+ page : "Side"
+ pagination_previous : "Forrige"
+ pagination_next : "Neste"
+ breadcrumb_home_label : "Hjem"
+ breadcrumb_separator : "/"
+ menu_label : "Vis/skjul meny"
+ search_label : "Vis/skjul søk"
+ toc_label : "På denne siden"
+ ext_link_label : "Direkte lenke"
+ less_than : "mindre enn"
+ minute_read : "minutters lesing"
+ share_on_label : "Del på"
+ meta_label :
+ tags_label : "Nøkkelord:"
+ categories_label : "Kategorier:"
+ date_label : "Oppdatert:"
+ comments_label : "Skriv en kommentar"
+ comments_title : "Kommentarer"
+ more_label : "Lær mer"
+ related_label : "Du vil kanskje også lese:"
+ follow_label : "Følg:"
+ feed_label : "Feed"
+ powered_by : "Lagd med"
+ website_label : "Nettside"
+ email_label : "E-post"
+ recent_posts : "Nyeste innlegg"
+ undefined_wpm : "Parameteret words_per_minute er ikke definert i _config.yml"
+ comment_form_info : "Din e-postadresse vil ikke bli publisert. Obligatoriske felt er markert"
+ comment_form_comment_label : "Kommentar"
+ comment_form_md_info : "Markdown er støttet"
+ comment_form_name_label : "Navn"
+ comment_form_email_label : "E-postadresse"
+ comment_form_website_label : "Nettside (frivillig)"
+ comment_btn_submit : "Send kommentar"
+ comment_btn_submitted : "Sendt"
+ comment_success_msg : "Takk for din kommentar! Den blir vist på siden så fort den er godkjent"
+ comment_error_msg : "Beklager, noe gikk galt. Sjekk at alle obligatoriska felt er utfylt og prøv igjen"
+ loading_label : "Laster..."
+ search_label_text : "Skriv inn søkeord"
+ search_placeholder_text : "Skriv inn søkeord"
+ search_algolia_no_results : "Ingen treff"
+ results_found : "Treff funnet"
+ back_to_top : "Tillbake til toppen"
+no-NB:
+ <<: *DEFAULT_NO
+no-NN:
+ <<: *DEFAULT_NO
+
+# Hebrew
+# -------
+he: &DEFAULT_HE
+ skip_links : "דלגו על קישור"
+ skip_primary_nav : "דלגו לראשי"
+ skip_content : "דלגו לתוכן"
+ skip_footer : "דלגו לתחתית"
+ page : "דף"
+ pagination_previous : "קודם"
+ pagination_next : "הבא"
+ breadcrumb_home_label : "בית"
+ breadcrumb_separator : "/"
+ menu_label : "סגירה/פתיחה של תפריט"
+ search_label : "סגירה/פתיחה של חיפוש"
+ toc_label : "בדף זה"
+ ext_link_label : "קישור ישיר"
+ less_than : "פחות מ"
+ minute_read : "דקת קריאה"
+ share_on_label : "שתפו ב"
+ meta_label :
+ tags_label : "תגיות:"
+ categories_label : "קטגוריות:"
+ date_label : "מעודכן:"
+ comments_label : "השאירו הערה"
+ comments_title : "הערות"
+ more_label : "קראו עוד"
+ related_label : "אולי יעניין אותך גם"
+ follow_label : "עקבו אחרי"
+ feed_label : "פיד"
+ powered_by : "Powered by"
+ website_label : "אתר"
+ email_label : "אימייל"
+ recent_posts : "פוסטים אחרונים"
+ undefined_wpm : "Undefined parameter words_per_minute at _config.yml"
+ comment_form_info : "האימייל שלך נשמר חסוי. שדות חובה מסומנים"
+ comment_form_comment_label : "הערה"
+ comment_form_md_info : "Markdown is supported."
+ comment_form_name_label : "שם"
+ comment_form_email_label : "כתובת אימייל"
+ comment_form_website_label : "אתר (אפשרות)"
+ comment_btn_submit : "שלחו הערה"
+ comment_btn_submitted : "נשלח"
+ comment_success_msg : "תודה על ההערה שלך! היא תופיע באתר ברגע שתאושר."
+ comment_error_msg : "סליחה, קרתה תקלה בשליחה. אנא וודאו שכל השדות מלאים ונסו שנית."
+ loading_label : "טוען..."
+ search_label_text : "מילות חיפוש..."
+ search_placeholder_text : "מילות חיפוש..."
+ search_algolia_no_results : "אין תוצאות"
+ results_found : "תוצאות נמצאו"
+ back_to_top : "חזרה להתחלה"
+he-IL:
+ <<: *DEFAULT_HE
+
+# Arabic (عربي)
+# --------------
+ar: &DEFAULT_AR
+ skip_links : "تخطي الروابط"
+ skip_primary_nav : "تخطى الى شريط التنقل"
+ skip_content : "الانتقال الى المحتوى"
+ skip_footer : "الانتقال الى ذيل الصفحة"
+ page : "صفحه"
+ pagination_previous : "قبل"
+ pagination_next : "بعد"
+ breadcrumb_home_label : "الرئيس"
+ breadcrumb_separator : "/"
+ menu_label : "الخيارات"
+ search_label : "البحث"
+ toc_label : "على هذه الصفحة"
+ ext_link_label : "رابط مباشر"
+ less_than : "اقل من"
+ minute_read : "دقيقة قرائية"
+ share_on_label : "مشاركة"
+ meta_label :
+ tags_label : "العلامات الوصفية:"
+ categories_label : "الفئات:"
+ date_label : "تم التحديث:"
+ comments_label : "اترك تعليق"
+ comments_title : "التعليقات"
+ more_label : "اقرأ المزيد"
+ related_label : "قد يعجبك أيضا"
+ follow_label : "تابع:"
+ feed_label : "الاخبار - RSS"
+ powered_by : "تم تطوير بواسطة"
+ website_label : "موقع"
+ email_label : "ايميل"
+ recent_posts : "المشاركات الأخيرة"
+ undefined_wpm : "معامل غير معرف في words_per_minute (كلمة في الدقيقة) في ملف _config.yml"
+ comment_form_info : "لن يتم نشر عنوان بريدك الإلكتروني. الحقول المطلوبة إلزامية"
+ comment_form_comment_label : "تعليق"
+ comment_form_md_info : "لغة ال Markdown مدعومة."
+ comment_form_name_label : "الاسم"
+ comment_form_email_label : "البريد الالكتروني"
+ comment_form_website_label : "الموقع (اختياري)"
+ comment_btn_submit : "أضف تعليق"
+ comment_btn_submitted : "تم الإرسال"
+ comment_success_msg : "شكراً على التعليق! سيتم اظهاره عندما يتم موافقة عليه."
+ comment_error_msg : "للأسف, هناك خطأ في المحاولة. الرجاء الحرص على تعبئة جميع الخانات و محاولة مجدداً."
+ loading_label : "جاري التحميل..."
+ search_label_text : "اكتب مصطلح للبحث..."
+ search_placeholder_text : "اكتب مصطلح للبحث..."
+ search_algolia_no_results : "لا توجد نتائج"
+ results_found : "تم إيجاد نتيجة"
+ back_to_top : "الانتقال الى الأعلى"
+ar-SD:
+ <<: *DEFAULT_AR
+ar-SA:
+ <<: *DEFAULT_AR
+ar-AE:
+ <<: *DEFAULT_AR
+ar-EG:
+ <<: *DEFAULT_AR
+
+# Kiswahili
+# -----------------
+sw: &DEFAULT_SW
+ skip_links : "Ruka viungo"
+ skip_primary_nav : "Ruka orodha kuu"
+ skip_content : "Ruka maandiko maakuu"
+ skip_footer : "Ruka chini"
+ page : "Ukurasa"
+ pagination_previous : "Rudi"
+ pagination_next : "Endelea"
+ breadcrumb_home_label : "Ukurasa wa kwanza"
+ breadcrumb_separator : "/"
+ menu_label : "Wezesha/Zima orodha"
+ search_label : "Wezesha/Zima kutafuta"
+ toc_label : "Kwa ukurasa huu"
+ ext_link_label : "Kiungo mbio"
+ less_than : "Soma kwa dakikia ndogo kuliko"
+ minute_read : "Soma kwa dakika"
+ share_on_label : "Tangaza"
+ meta_label :
+ tags_label : "Alama:"
+ categories_label : "Aina:"
+ date_label : "Geuzi ya mwisho:"
+ comments_label : "Wacha maoni"
+ comments_title : "Maoni"
+ more_label : "Jifunze zaidi"
+ related_label : "Pia, utapenda"
+ follow_label : "Fuata:"
+ feed_label : "Feed"
+ powered_by : "Inatumia"
+ website_label : "Tovuti"
+ email_label : "Barua pepe"
+ recent_posts : "Makala juzi"
+ undefined_wpm : "Ingizo words_per_minute kwa _config.yml haijawekwa"
+ comment_form_info : "Barua pepe yako haitaonekana. Kuna alama kwa ingizo tunahitaji."
+ comment_form_comment_label : "Maoni"
+ comment_form_md_info : "Unaweza kutumia `Markdown`."
+ comment_form_name_label : "Jina"
+ comment_form_email_label : "Barua pepe"
+ comment_form_website_label : "Tovuti (hiari)"
+ comment_btn_submit : "Tuma maoni"
+ comment_btn_submitted : "Umetuma"
+ comment_success_msg : "Asante kwa maoni yako! Itaonekana ikiridhiwa."
+ comment_error_msg : "Pole, kuna makosa kwa ingizo yako. Tafadhali angalia umeandika kwa ingizo zote zinahitaji, na jaribu tena."
+ loading_label : "Inapakiwa..."
+ search_label_text : "Ingiza neno unatafuta..."
+ search_placeholder_text : "Ingiza neno unatafuta..."
+ search_algolia_no_results : "Hakuna matokeo"
+ results_found : "Tumepata"
+ back_to_top : "Rudi juu"
+sw-KE:
+ <<: *DEFAULT_SW
+sw-TZ:
+ <<: *DEFAULT_SW
+
+# Ukrainian / Українська
+# -----------------
+uk: &DEFAULT_UK
+ skip_links : "Посилання для переходу"
+ skip_primary_nav : "Перейти до основної навігації"
+ skip_content : "Перейти до змісту"
+ skip_footer : "Перейти до нижнього колонтитула"
+ page : "Сторінка"
+ pagination_previous : "Попередня"
+ pagination_next : "Наступна"
+ breadcrumb_home_label : "Головна"
+ breadcrumb_separator : "/"
+ menu_label : "Випадаюче меню"
+ search_label : "Пошук"
+ toc_label : "Зміст"
+ ext_link_label : "Пряме посилання"
+ less_than : "менше ніж"
+ minute_read : "хв. на чітання"
+ share_on_label : "Поділитися"
+ meta_label :
+ tags_label : "Мітки:"
+ categories_label : "Розділи:"
+ date_label : "Дата зміни:"
+ comments_label : "Залишити коментар"
+ comments_title : "Коментарі"
+ more_label : "Читати далі"
+ related_label : "Вам також може сподобатись"
+ follow_label : "Зв'язатися зі мною:"
+ feed_label : "RSS-стрічка"
+ powered_by : "Сайт працює на"
+ website_label : "Сайт"
+ email_label : "Электронна пошта"
+ recent_posts : "Останні записи"
+ undefined_wpm : "Не визначено параметр words_per_minute в _config.yml"
+ comment_form_info : "Вашу адресу електронної пошти не буде опубліковано. Обов'язкові поля позначені"
+ comment_form_comment_label : "Коментар"
+ comment_form_md_info : "Підтримується синтаксис Markdown."
+ comment_form_name_label : "Ім'я"
+ comment_form_email_label : "Електронна пошта"
+ comment_form_website_label : "Посилання на сайт (необов'язково)"
+ comment_btn_submit : "Залишити коментар"
+ comment_btn_submitted : "Відправлено"
+ comment_success_msg : "Дякую за Ваш коментар! Його буде опубліковано на сайті після перевірки."
+ comment_error_msg : "На жаль, сталася помилка з надсиланням коментаря. Будь ласка, переконайтеся, що всі обов'язкові поля заповнені та спробуйте знову."
+ loading_label : "Відправка..."
+ search_label_text : "Введіть пошуковий запит..."
+ search_placeholder_text : "Введіть пошуковий запит..."
+ search_algolia_no_results :
+ results_found : "Знайдено"
+uk-UA:
+ <<: *DEFAULT_UK
+
+# Czech / čeština
+# -----------------
+cs: &DEFAULT_CS
+ skip_links : "Rychlé odkazy"
+ skip_primary_nav : "Přejít na hlavní navigace"
+ skip_content : "Přejít na obsah"
+ skip_footer : "Přejít na zápatí"
+ page : "Stránka"
+ pagination_previous : "Předchozí"
+ pagination_next : "Další"
+ breadcrumb_home_label : "Domů"
+ breadcrumb_separator : "/"
+ menu_label : "Přepnout zobrazení menu"
+ search_label : "Přepnout zobrazení vyhledávání"
+ toc_label : "Na této stránce"
+ ext_link_label : "Přímý odkaz"
+ less_than : "méně než"
+ minute_read : "minut"
+ share_on_label : "Sdílet"
+ meta_label :
+ tags_label : "Štítky:"
+ categories_label : "Rubriky:"
+ date_label : "Aktualizováno:"
+ comments_label : "Okomentovat"
+ comments_title : "Komentáře"
+ more_label : "Zjistit více"
+ related_label : "Může se vám také líbit"
+ follow_label : "Sledovat:"
+ feed_label : "Zdroj"
+ powered_by : "Používáme"
+ website_label : "Web"
+ email_label : "E-mail"
+ recent_posts : "Nejnovější příspěvky"
+ undefined_wpm : "V souboru _config.yml chybí parametr words_per_minute"
+ comment_form_info : "Vaše e-mailová adresa nebude zveřejněna. Povinná pole jsou označena"
+ comment_form_comment_label : "Komentář"
+ comment_form_md_info : "Podporuje markdown."
+ comment_form_name_label : "Jméno"
+ comment_form_email_label : "E-mailová adresa"
+ comment_form_website_label : "Web (volitelné)"
+ comment_btn_submit : "Odeslat komentář"
+ comment_btn_submitted : "Odesláno"
+ comment_success_msg : "Děkujeme za komentář. Na stránce se objeví jakmile projde schválením."
+ comment_error_msg : "Odeslání se nezdařilo. Zkontrolujte, že jste vyplnili všechna povinná pole a zkuste to znovu."
+ loading_label : "Načítání..."
+ search_label_text : "Zadejte vyhledávání..."
+ search_placeholder_text : "Zadejte vyhledávání..."
+ search_algolia_no_results : "Žádné výsledky"
+ results_found : "Nalezené výsledky"
+ back_to_top : "Na začátek stránky"
+cs-CZ:
+ <<: *DEFAULT_CS
+
+# Bulgarian
+# -----------------
+bg: &DEFAULT_BG
+ skip_links : "Пропуснете връзките"
+ skip_primary_nav : "Преминете към основната навигация"
+ skip_content : "Преминете към съдържанието"
+ skip_footer : "Преминете към долния колонтитул"
+ page : "Страница"
+ pagination_previous : "Предишна"
+ pagination_next : "Следваща"
+ breadcrumb_home_label : "Начало"
+ breadcrumb_separator : "/"
+ menu_label : "Превключване на меню"
+ search_label : "Превключване на търсене"
+ toc_label : "На тази страница"
+ ext_link_label : "Пряка връзка"
+ less_than : "по-малко от"
+ minute_read : "минута четене"
+ share_on_label : "Споделете"
+ meta_label :
+ tags_label : "Етикети:"
+ categories_label : "Категории:"
+ date_label : "Обновено:"
+ comments_label : "Оставете коментар"
+ comments_title : "Коментари"
+ more_label : "Научете повече"
+ related_label : "Може да са ви интересни"
+ follow_label : "Последвайте:"
+ feed_label : "Емисия"
+ powered_by : "Осъществено чрез"
+ website_label : "Уебсайт"
+ email_label : "Е-поща"
+ recent_posts : "Последни публикации"
+ undefined_wpm : "Недефиниран параметър words_per_minute в _config.yml"
+ comment_form_info : "Вашият адрес за е-поща няма да бъде публикуван. Задължителните полета са обозначени"
+ comment_form_comment_label : "Коментар"
+ comment_form_md_info : "Поддържа се Маркдаун."
+ comment_form_name_label : "Име"
+ comment_form_email_label : "Адрес за е-поща"
+ comment_form_website_label : "Уебсайт (по желание)"
+ comment_btn_submit : "Изпращане на коментар"
+ comment_btn_submitted : "Изпратено"
+ comment_success_msg : "Благодарности за коментара! Ще се покаже на сайта, след като бъде одобрен."
+ comment_error_msg : "Съжаляваме, възникна грешка с изпращането. Моля, уверете се, че всички задължителни полета са попълнени и опитайте отново."
+ loading_label : "Зареждане..."
+ search_label_text : "Въведете термин за търсене..."
+ search_placeholder_text : "Въведете термин за търсене..."
+ search_algolia_no_results : "Няма резултати"
+ results_found : "Намерени резултати"
+ back_to_top : "Обратно към началото"
+bg-BG:
+ <<: *DEFAULT_BG
+
# Another locale
# --------------
#
diff --git a/_includes/after-content.html b/_includes/after-content.html
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/_includes/analytics-providers/google-gtag.html b/_includes/analytics-providers/google-gtag.html
new file mode 100644
index 000000000000..16d0cf176bac
--- /dev/null
+++ b/_includes/analytics-providers/google-gtag.html
@@ -0,0 +1,9 @@
+
+
+
diff --git a/_includes/analytics-providers/google-universal.html b/_includes/analytics-providers/google-universal.html
index 10d65b2ee488..68c2674ba930 100644
--- a/_includes/analytics-providers/google-universal.html
+++ b/_includes/analytics-providers/google-universal.html
@@ -1,9 +1,7 @@
+
diff --git a/_includes/analytics-providers/google.html b/_includes/analytics-providers/google.html
index b591b995435a..c5742b9817d6 100644
--- a/_includes/analytics-providers/google.html
+++ b/_includes/analytics-providers/google.html
@@ -1,6 +1,9 @@
-
\ No newline at end of file
+
diff --git a/_includes/analytics-providers/swetrix.html b/_includes/analytics-providers/swetrix.html
new file mode 100644
index 000000000000..092954558868
--- /dev/null
+++ b/_includes/analytics-providers/swetrix.html
@@ -0,0 +1,15 @@
+
+
+
+
diff --git a/_includes/analytics.html b/_includes/analytics.html
index 64a3359aad4e..2ac5df70dc29 100644
--- a/_includes/analytics.html
+++ b/_includes/analytics.html
@@ -1,10 +1,14 @@
-{% if site.analytics.provider and page.analytics != false %}
+{% if jekyll.environment == 'production' and site.analytics.provider and page.analytics != false %}
{% case site.analytics.provider %}
{% when "google" %}
{% include /analytics-providers/google.html %}
{% when "google-universal" %}
{% include /analytics-providers/google-universal.html %}
+{% when "google-gtag" %}
+ {% include /analytics-providers/google-gtag.html %}
+{% when "swetrix" %}
+ {% include /analytics-providers/swetrix.html %}
{% when "custom" %}
{% include /analytics-providers/custom.html %}
{% endcase %}
diff --git a/_includes/archive-single.html b/_includes/archive-single.html
index 93755e38ec6b..f55299a2c1b0 100644
--- a/_includes/archive-single.html
+++ b/_includes/archive-single.html
@@ -1,3 +1,4 @@
+{% assign locale = include.locale | default: site.locale %}
{% if post.header.teaser %}
{% capture teaser %}{{ post.header.teaser }}{% endcapture %}
{% else %}
@@ -10,29 +11,21 @@
{% assign title = post.title %}
{% endif %}
-
+
+{% assign entries_layout = page.entries_layout | default: 'list' %}
+{% for i in (1..items_max) reversed %}
+ {% for taxonomy in include.taxonomies %}
+ {% if taxonomy[1].size == i %}
+
+
{{ taxonomy[0] }}
+
+ {% for post in taxonomy.last %}
+ {% include archive-single.html locale=locale type=entries_layout %}
+ {% endfor %}
+
+ {{ site.data.ui-text[locale].back_to_top | default: 'Back to Top' }} ↑
+
+ {% endif %}
+ {% endfor %}
+{% endfor %}
diff --git a/_includes/read-time.html b/_includes/read-time.html
deleted file mode 100644
index df88d52926a3..000000000000
--- a/_includes/read-time.html
+++ /dev/null
@@ -1,15 +0,0 @@
-{% assign words_per_minute = site.words_per_minute | default: 200 %}
-
-{% if post.read_time %}
- {% assign words = post.content | strip_html | number_of_words %}
-{% elsif page.read_time %}
- {% assign words = page.content | strip_html | number_of_words %}
-{% endif %}
-
-{% if words < words_per_minute %}
- {{ site.data.ui-text[site.locale].less_than | default: "less than" }} 1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
-{% elsif words == words_per_minute %}
- 1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
-{% else %}
- {{ words | divided_by:words_per_minute }} {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
-{% endif %}
\ No newline at end of file
diff --git a/_includes/schema.html b/_includes/schema.html
new file mode 100644
index 000000000000..1dae6e2d7243
--- /dev/null
+++ b/_includes/schema.html
@@ -0,0 +1,16 @@
+
diff --git a/_includes/scripts.html b/_includes/scripts.html
index 844de82dd7ac..b19eb4540d1f 100644
--- a/_includes/scripts.html
+++ b/_includes/scripts.html
@@ -1,4 +1,29 @@
-
+{% assign locale = include.locale | default: site.locale %}
+{% if site.footer_scripts %}
+ {% for script in site.footer_scripts %}
+
+ {% endfor %}
+{% else %}
+
+{% endif %}
+
+{% if site.search == true or page.layout == "search" %}
+ {%- assign search_provider = site.search_provider | default: "lunr" -%}
+ {%- case search_provider -%}
+ {%- when "lunr" -%}
+ {% include_cached search/lunr-search-scripts.html locale=locale %}
+ {%- when "google" -%}
+ {% include_cached search/google-search-scripts.html %}
+ {%- when "algolia" -%}
+ {% include_cached search/algolia-search-scripts.html locale=locale %}
+ {%- endcase -%}
+{% endif %}
{% include analytics.html %}
-{% include /comments-providers/scripts.html %}
+{% include /comments-providers/scripts.html locale=locale %}
+
+{% if site.after_footer_scripts %}
+ {% for script in site.after_footer_scripts %}
+
+ {% endfor %}
+{% endif %}
diff --git a/_includes/search/algolia-search-scripts.html b/_includes/search/algolia-search-scripts.html
new file mode 100644
index 000000000000..3b53c4e6feaa
--- /dev/null
+++ b/_includes/search/algolia-search-scripts.html
@@ -0,0 +1,83 @@
+{% assign locale = include.locale | default: site.locale %}
+
diff --git a/_includes/search/google-search-scripts.html b/_includes/search/google-search-scripts.html
new file mode 100644
index 000000000000..4af7423bb3ca
--- /dev/null
+++ b/_includes/search/google-search-scripts.html
@@ -0,0 +1,30 @@
+
\ No newline at end of file
diff --git a/_includes/search/lunr-search-scripts.html b/_includes/search/lunr-search-scripts.html
new file mode 100644
index 000000000000..dfbabc58fd5a
--- /dev/null
+++ b/_includes/search/lunr-search-scripts.html
@@ -0,0 +1,11 @@
+{% assign locale = include.locale | default: site.locale %}
+{% assign lang = locale | slice: 0,2 | default: "en" %}
+{% case lang %}
+{% when "gr" %}
+ {% assign lang = "gr" %}
+{% else %}
+ {% assign lang = "en" %}
+{% endcase %}
+
+
+
diff --git a/_includes/search/search_form.html b/_includes/search/search_form.html
new file mode 100644
index 000000000000..812ff93808f9
--- /dev/null
+++ b/_includes/search/search_form.html
@@ -0,0 +1,27 @@
+{% assign locale = include.locale | default: site.locale %}
+
- {% if page.author_profile or layout.author_profile %}{% include author-profile.html %}{% endif %}
+ {% if page.author_profile or layout.author_profile %}{% include author-profile.html locale=locale %}{% endif %}
{% if page.sidebar %}
{% for s in page.sidebar %}
{% if s.image %}
-
+
{% endif %}
{% if s.title %}
{{ s.title }}
{% endif %}
{% if s.text %}{{ s.text | markdownify }}{% endif %}
+ {% if s.nav %}{% include nav_list locale=locale nav=s.nav %}{% endif %}
{% endfor %}
{% if page.sidebar.nav %}
- {% include nav_list nav=page.sidebar.nav %}
+ {% include nav_list locale=locale nav=page.sidebar.nav %}
{% endif %}
{% endif %}
+ {% include sidebar-custom.html %}
-{% endif %}
\ No newline at end of file
+{% endif %}
diff --git a/_includes/skip-links.html b/_includes/skip-links.html
new file mode 100644
index 000000000000..a26894879382
--- /dev/null
+++ b/_includes/skip-links.html
@@ -0,0 +1,8 @@
+{% assign locale = include.locale | default: site.locale %}
+
+
-{% endif %}
\ No newline at end of file
+{% endif %}
diff --git a/_includes/toc b/_includes/toc
index 6ba831c90739..5ebb35c974c5 100644
--- a/_includes/toc
+++ b/_includes/toc
@@ -1,7 +1,8 @@
+{% assign locale = include.locale | default: site.locale %}
\ No newline at end of file
+
diff --git a/_includes/toc.html b/_includes/toc.html
new file mode 100644
index 000000000000..bc90d08a994b
--- /dev/null
+++ b/_includes/toc.html
@@ -0,0 +1,189 @@
+{% capture tocWorkspace %}
+ {% comment %}
+ Copyright (c) 2017 Vladimir "allejo" Jimenez
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the "Software"), to deal in the Software without
+ restriction, including without limitation the rights to use,
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following
+ conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+ {% endcomment %}
+ {% comment %}
+ Version 1.2.1
+ https://github.com/allejo/jekyll-toc
+
+ "...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe
+
+ Usage:
+ {% include toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %}
+
+ Parameters:
+ * html (string) - the HTML of compiled markdown generated by kramdown in Jekyll
+
+ Optional Parameters:
+ * sanitize (bool) : false - when set to true, the headers will be stripped of any HTML in the TOC
+ * class (string) : '' - a CSS class assigned to the TOC
+ * id (string) : '' - an ID to assigned to the TOC
+ * h_min (int) : 1 - the minimum TOC header level to use; any header lower than this value will be ignored
+ * h_max (int) : 6 - the maximum TOC header level to use; any header greater than this value will be ignored
+ * ordered (bool) : false - when set to true, an ordered list will be outputted instead of an unordered list
+ * item_class (string) : '' - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level
+ * submenu_class (string) : '' - add custom class(es) for each child group of headings; has support for '%level%' placeholder which is the current "submenu" heading level
+ * base_url (string) : '' - add a base url to the TOC links for when your TOC is on another page than the actual content
+ * anchor_class (string) : '' - add custom class(es) for each anchor element
+ * skip_no_ids (bool) : false - skip headers that do not have an `id` attribute
+ * flat_toc (bool) : false - when set to true, the TOC will be a single level list
+
+ Output:
+ An ordered or unordered list representing the table of contents of a markdown block. This snippet will only
+ generate the table of contents and will NOT output the markdown given to it
+ {% endcomment %}
+
+ {% capture newline %}
+ {% endcapture %}
+ {% assign newline = newline | rstrip %}
+
+ {% capture deprecation_warnings %}{% endcapture %}
+
+ {% if include.baseurl %}
+ {% capture deprecation_warnings %}{{ deprecation_warnings }}{{ newline }}{% endcapture %}
+ {% endif %}
+
+ {% if include.skipNoIDs %}
+ {% capture deprecation_warnings %}{{ deprecation_warnings }}{{ newline }}{% endcapture %}
+ {% endif %}
+
+ {% capture jekyll_toc %}{% endcapture %}
+ {% assign orderedList = include.ordered | default: false %}
+ {% assign flatToc = include.flat_toc | default: false %}
+ {% assign baseURL = include.base_url | default: include.baseurl | default: '' %}
+ {% assign skipNoIDs = include.skip_no_ids | default: include.skipNoIDs | default: false %}
+ {% assign minHeader = include.h_min | default: 1 %}
+ {% assign maxHeader = include.h_max | default: 6 %}
+ {% assign nodes = include.html | strip | split: ' maxHeader %}
+ {% continue %}
+ {% endif %}
+
+ {% assign _workspace = node | split: '' | first }}>{% endcapture %}
+ {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %}
+
+ {% if include.item_class and include.item_class != blank %}
+ {% capture listItemClass %} class="{{ include.item_class | replace: '%level%', currLevel | split: '.' | join: ' ' }}"{% endcapture %}
+ {% endif %}
+
+ {% if include.submenu_class and include.submenu_class != blank %}
+ {% assign subMenuLevel = currLevel | minus: 1 %}
+ {% capture subMenuClass %} class="{{ include.submenu_class | replace: '%level%', subMenuLevel | split: '.' | join: ' ' }}"{% endcapture %}
+ {% endif %}
+
+ {% capture anchorBody %}{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}{% endcapture %}
+
+ {% if htmlID %}
+ {% capture anchorAttributes %} href="{% if baseURL %}{{ baseURL }}{% endif %}#{{ htmlID }}"{% endcapture %}
+
+ {% if include.anchor_class %}
+ {% capture anchorAttributes %}{{ anchorAttributes }} class="{{ include.anchor_class | split: '.' | join: ' ' }}"{% endcapture %}
+ {% endif %}
+
+ {% capture listItem %}{{ anchorBody }}{% endcapture %}
+ {% elsif skipNoIDs == true %}
+ {% continue %}
+ {% else %}
+ {% capture listItem %}{{ anchorBody }}{% endcapture %}
+ {% endif %}
+
+ {% if currLevel > lastLevel and flatToc == false %}
+ {% capture jekyll_toc %}{{ jekyll_toc }}<{{ listModifier }}{{ subMenuClass }}>{% endcapture %}
+ {% elsif currLevel < lastLevel and flatToc == false %}
+ {% assign repeatCount = lastLevel | minus: currLevel %}
+
+ {% for i in (1..repeatCount) %}
+ {% capture jekyll_toc %}{{ jekyll_toc }}{{ listModifier }}>{% endcapture %}
+ {% endfor %}
+
+ {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %}
+ {% else %}
+ {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %}
+ {% endif %}
+
+ {% capture jekyll_toc %}{{ jekyll_toc }}
", " " |
+ replace:"", " " |
+ replace:"", " " |
+ replace:"", " " |
+ replace:"", " " |
+ replace:"", " "|
+ strip_html | strip_newlines | truncatewords: 50 | jsonify }},
+ {%- endif -%}
+ "categories": {{ doc.categories | jsonify }},
+ "tags": {{ doc.tags | jsonify }},
+ "url": {{ doc.url | relative_url | jsonify }},
+ "teaser": {{ teaser | relative_url | jsonify }}
+ }{%- unless forloop.last and l -%},{%- endunless -%}
+ {%- endfor -%}
+ {%- endfor -%}{%- if site.lunr.search_within_pages -%},
+ {%- assign pages = site.pages | where_exp: 'doc', 'doc.search != false' | where_exp: 'doc', 'doc.title != null' -%}
+ {%- for doc in pages -%}
+ {%- if forloop.last -%}
+ {%- assign l = true -%}
+ {%- endif -%}
+ {
+ "title": {{ doc.title | jsonify }},
+ "excerpt":
+ {%- if site.search_full_content == true -%}
+ {{ doc.content | newline_to_br |
+ replace:" ", " " |
+ replace:"", " " |
+ replace:"", " " |
+ replace:"", " " |
+ replace:"", " " |
+ replace:"", " " |
+ replace:"", " " |
+ replace:"", " "|
+ strip_html | strip_newlines | jsonify }},
+ {%- else -%}
+ {{ doc.content | newline_to_br |
+ replace:" ", " " |
+ replace:"", " " |
+ replace:"", " " |
+ replace:"", " " |
+ replace:"", " " |
+ replace:"", " " |
+ replace:"", " " |
+ replace:"", " "|
+ strip_html | strip_newlines | truncatewords: 50 | jsonify }},
+ {%- endif -%}
+ "url": {{ doc.url | absolute_url | jsonify }}
+ }{%- unless forloop.last and l -%},{%- endunless -%}
+ {%- endfor -%}
+{%- endif -%}]
diff --git a/assets/js/lunr/lunr.js b/assets/js/lunr/lunr.js
new file mode 100644
index 000000000000..6aa370fbcb7b
--- /dev/null
+++ b/assets/js/lunr/lunr.js
@@ -0,0 +1,3475 @@
+/**
+ * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9
+ * Copyright (C) 2020 Oliver Nightingale
+ * @license MIT
+ */
+
+;(function(){
+
+/**
+ * A convenience function for configuring and constructing
+ * a new lunr Index.
+ *
+ * A lunr.Builder instance is created and the pipeline setup
+ * with a trimmer, stop word filter and stemmer.
+ *
+ * This builder object is yielded to the configuration function
+ * that is passed as a parameter, allowing the list of fields
+ * and other builder parameters to be customised.
+ *
+ * All documents _must_ be added within the passed config function.
+ *
+ * @example
+ * var idx = lunr(function () {
+ * this.field('title')
+ * this.field('body')
+ * this.ref('id')
+ *
+ * documents.forEach(function (doc) {
+ * this.add(doc)
+ * }, this)
+ * })
+ *
+ * @see {@link lunr.Builder}
+ * @see {@link lunr.Pipeline}
+ * @see {@link lunr.trimmer}
+ * @see {@link lunr.stopWordFilter}
+ * @see {@link lunr.stemmer}
+ * @namespace {function} lunr
+ */
+var lunr = function (config) {
+ var builder = new lunr.Builder
+
+ builder.pipeline.add(
+ lunr.trimmer,
+ lunr.stopWordFilter,
+ lunr.stemmer
+ )
+
+ builder.searchPipeline.add(
+ lunr.stemmer
+ )
+
+ config.call(builder, builder)
+ return builder.build()
+}
+
+lunr.version = "2.3.9"
+/*!
+ * lunr.utils
+ * Copyright (C) 2020 Oliver Nightingale
+ */
+
+/**
+ * A namespace containing utils for the rest of the lunr library
+ * @namespace lunr.utils
+ */
+lunr.utils = {}
+
+/**
+ * Print a warning message to the console.
+ *
+ * @param {String} message The message to be printed.
+ * @memberOf lunr.utils
+ * @function
+ */
+lunr.utils.warn = (function (global) {
+ /* eslint-disable no-console */
+ return function (message) {
+ if (global.console && console.warn) {
+ console.warn(message)
+ }
+ }
+ /* eslint-enable no-console */
+})(this)
+
+/**
+ * Convert an object to a string.
+ *
+ * In the case of `null` and `undefined` the function returns
+ * the empty string, in all other cases the result of calling
+ * `toString` on the passed object is returned.
+ *
+ * @param {Any} obj The object to convert to a string.
+ * @return {String} string representation of the passed object.
+ * @memberOf lunr.utils
+ */
+lunr.utils.asString = function (obj) {
+ if (obj === void 0 || obj === null) {
+ return ""
+ } else {
+ return obj.toString()
+ }
+}
+
+/**
+ * Clones an object.
+ *
+ * Will create a copy of an existing object such that any mutations
+ * on the copy cannot affect the original.
+ *
+ * Only shallow objects are supported, passing a nested object to this
+ * function will cause a TypeError.
+ *
+ * Objects with primitives, and arrays of primitives are supported.
+ *
+ * @param {Object} obj The object to clone.
+ * @return {Object} a clone of the passed object.
+ * @throws {TypeError} when a nested object is passed.
+ * @memberOf Utils
+ */
+lunr.utils.clone = function (obj) {
+ if (obj === null || obj === undefined) {
+ return obj
+ }
+
+ var clone = Object.create(null),
+ keys = Object.keys(obj)
+
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i],
+ val = obj[key]
+
+ if (Array.isArray(val)) {
+ clone[key] = val.slice()
+ continue
+ }
+
+ if (typeof val === 'string' ||
+ typeof val === 'number' ||
+ typeof val === 'boolean') {
+ clone[key] = val
+ continue
+ }
+
+ throw new TypeError("clone is not deep and does not support nested objects")
+ }
+
+ return clone
+}
+lunr.FieldRef = function (docRef, fieldName, stringValue) {
+ this.docRef = docRef
+ this.fieldName = fieldName
+ this._stringValue = stringValue
+}
+
+lunr.FieldRef.joiner = "/"
+
+lunr.FieldRef.fromString = function (s) {
+ var n = s.indexOf(lunr.FieldRef.joiner)
+
+ if (n === -1) {
+ throw "malformed field ref string"
+ }
+
+ var fieldRef = s.slice(0, n),
+ docRef = s.slice(n + 1)
+
+ return new lunr.FieldRef (docRef, fieldRef, s)
+}
+
+lunr.FieldRef.prototype.toString = function () {
+ if (this._stringValue == undefined) {
+ this._stringValue = this.fieldName + lunr.FieldRef.joiner + this.docRef
+ }
+
+ return this._stringValue
+}
+/*!
+ * lunr.Set
+ * Copyright (C) 2020 Oliver Nightingale
+ */
+
+/**
+ * A lunr set.
+ *
+ * @constructor
+ */
+lunr.Set = function (elements) {
+ this.elements = Object.create(null)
+
+ if (elements) {
+ this.length = elements.length
+
+ for (var i = 0; i < this.length; i++) {
+ this.elements[elements[i]] = true
+ }
+ } else {
+ this.length = 0
+ }
+}
+
+/**
+ * A complete set that contains all elements.
+ *
+ * @static
+ * @readonly
+ * @type {lunr.Set}
+ */
+lunr.Set.complete = {
+ intersect: function (other) {
+ return other
+ },
+
+ union: function () {
+ return this
+ },
+
+ contains: function () {
+ return true
+ }
+}
+
+/**
+ * An empty set that contains no elements.
+ *
+ * @static
+ * @readonly
+ * @type {lunr.Set}
+ */
+lunr.Set.empty = {
+ intersect: function () {
+ return this
+ },
+
+ union: function (other) {
+ return other
+ },
+
+ contains: function () {
+ return false
+ }
+}
+
+/**
+ * Returns true if this set contains the specified object.
+ *
+ * @param {object} object - Object whose presence in this set is to be tested.
+ * @returns {boolean} - True if this set contains the specified object.
+ */
+lunr.Set.prototype.contains = function (object) {
+ return !!this.elements[object]
+}
+
+/**
+ * Returns a new set containing only the elements that are present in both
+ * this set and the specified set.
+ *
+ * @param {lunr.Set} other - set to intersect with this set.
+ * @returns {lunr.Set} a new set that is the intersection of this and the specified set.
+ */
+
+lunr.Set.prototype.intersect = function (other) {
+ var a, b, elements, intersection = []
+
+ if (other === lunr.Set.complete) {
+ return this
+ }
+
+ if (other === lunr.Set.empty) {
+ return other
+ }
+
+ if (this.length < other.length) {
+ a = this
+ b = other
+ } else {
+ a = other
+ b = this
+ }
+
+ elements = Object.keys(a.elements)
+
+ for (var i = 0; i < elements.length; i++) {
+ var element = elements[i]
+ if (element in b.elements) {
+ intersection.push(element)
+ }
+ }
+
+ return new lunr.Set (intersection)
+}
+
+/**
+ * Returns a new set combining the elements of this and the specified set.
+ *
+ * @param {lunr.Set} other - set to union with this set.
+ * @return {lunr.Set} a new set that is the union of this and the specified set.
+ */
+
+lunr.Set.prototype.union = function (other) {
+ if (other === lunr.Set.complete) {
+ return lunr.Set.complete
+ }
+
+ if (other === lunr.Set.empty) {
+ return this
+ }
+
+ return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements)))
+}
+/**
+ * A function to calculate the inverse document frequency for
+ * a posting. This is shared between the builder and the index
+ *
+ * @private
+ * @param {object} posting - The posting for a given term
+ * @param {number} documentCount - The total number of documents.
+ */
+lunr.idf = function (posting, documentCount) {
+ var documentsWithTerm = 0
+
+ for (var fieldName in posting) {
+ if (fieldName == '_index') continue // Ignore the term index, its not a field
+ documentsWithTerm += Object.keys(posting[fieldName]).length
+ }
+
+ var x = (documentCount - documentsWithTerm + 0.5) / (documentsWithTerm + 0.5)
+
+ return Math.log(1 + Math.abs(x))
+}
+
+/**
+ * A token wraps a string representation of a token
+ * as it is passed through the text processing pipeline.
+ *
+ * @constructor
+ * @param {string} [str=''] - The string token being wrapped.
+ * @param {object} [metadata={}] - Metadata associated with this token.
+ */
+lunr.Token = function (str, metadata) {
+ this.str = str || ""
+ this.metadata = metadata || {}
+}
+
+/**
+ * Returns the token string that is being wrapped by this object.
+ *
+ * @returns {string}
+ */
+lunr.Token.prototype.toString = function () {
+ return this.str
+}
+
+/**
+ * A token update function is used when updating or optionally
+ * when cloning a token.
+ *
+ * @callback lunr.Token~updateFunction
+ * @param {string} str - The string representation of the token.
+ * @param {Object} metadata - All metadata associated with this token.
+ */
+
+/**
+ * Applies the given function to the wrapped string token.
+ *
+ * @example
+ * token.update(function (str, metadata) {
+ * return str.toUpperCase()
+ * })
+ *
+ * @param {lunr.Token~updateFunction} fn - A function to apply to the token string.
+ * @returns {lunr.Token}
+ */
+lunr.Token.prototype.update = function (fn) {
+ this.str = fn(this.str, this.metadata)
+ return this
+}
+
+/**
+ * Creates a clone of this token. Optionally a function can be
+ * applied to the cloned token.
+ *
+ * @param {lunr.Token~updateFunction} [fn] - An optional function to apply to the cloned token.
+ * @returns {lunr.Token}
+ */
+lunr.Token.prototype.clone = function (fn) {
+ fn = fn || function (s) { return s }
+ return new lunr.Token (fn(this.str, this.metadata), this.metadata)
+}
+/*!
+ * lunr.tokenizer
+ * Copyright (C) 2020 Oliver Nightingale
+ */
+
+/**
+ * A function for splitting a string into tokens ready to be inserted into
+ * the search index. Uses `lunr.tokenizer.separator` to split strings, change
+ * the value of this property to change how strings are split into tokens.
+ *
+ * This tokenizer will convert its parameter to a string by calling `toString` and
+ * then will split this string on the character in `lunr.tokenizer.separator`.
+ * Arrays will have their elements converted to strings and wrapped in a lunr.Token.
+ *
+ * Optional metadata can be passed to the tokenizer, this metadata will be cloned and
+ * added as metadata to every token that is created from the object to be tokenized.
+ *
+ * @static
+ * @param {?(string|object|object[])} obj - The object to convert into tokens
+ * @param {?object} metadata - Optional metadata to associate with every token
+ * @returns {lunr.Token[]}
+ * @see {@link lunr.Pipeline}
+ */
+lunr.tokenizer = function (obj, metadata) {
+ if (obj == null || obj == undefined) {
+ return []
+ }
+
+ if (Array.isArray(obj)) {
+ return obj.map(function (t) {
+ return new lunr.Token(
+ lunr.utils.asString(t).toLowerCase(),
+ lunr.utils.clone(metadata)
+ )
+ })
+ }
+
+ var str = obj.toString().toLowerCase(),
+ len = str.length,
+ tokens = []
+
+ for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) {
+ var char = str.charAt(sliceEnd),
+ sliceLength = sliceEnd - sliceStart
+
+ if ((char.match(lunr.tokenizer.separator) || sliceEnd == len)) {
+
+ if (sliceLength > 0) {
+ var tokenMetadata = lunr.utils.clone(metadata) || {}
+ tokenMetadata["position"] = [sliceStart, sliceLength]
+ tokenMetadata["index"] = tokens.length
+
+ tokens.push(
+ new lunr.Token (
+ str.slice(sliceStart, sliceEnd),
+ tokenMetadata
+ )
+ )
+ }
+
+ sliceStart = sliceEnd + 1
+ }
+
+ }
+
+ return tokens
+}
+
+/**
+ * The separator used to split a string into tokens. Override this property to change the behaviour of
+ * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens.
+ *
+ * @static
+ * @see lunr.tokenizer
+ */
+lunr.tokenizer.separator = /[\s\-]+/
+/*!
+ * lunr.Pipeline
+ * Copyright (C) 2020 Oliver Nightingale
+ */
+
+/**
+ * lunr.Pipelines maintain an ordered list of functions to be applied to all
+ * tokens in documents entering the search index and queries being ran against
+ * the index.
+ *
+ * An instance of lunr.Index created with the lunr shortcut will contain a
+ * pipeline with a stop word filter and an English language stemmer. Extra
+ * functions can be added before or after either of these functions or these
+ * default functions can be removed.
+ *
+ * When run the pipeline will call each function in turn, passing a token, the
+ * index of that token in the original list of all tokens and finally a list of
+ * all the original tokens.
+ *
+ * The output of functions in the pipeline will be passed to the next function
+ * in the pipeline. To exclude a token from entering the index the function
+ * should return undefined, the rest of the pipeline will not be called with
+ * this token.
+ *
+ * For serialisation of pipelines to work, all functions used in an instance of
+ * a pipeline should be registered with lunr.Pipeline. Registered functions can
+ * then be loaded. If trying to load a serialised pipeline that uses functions
+ * that are not registered an error will be thrown.
+ *
+ * If not planning on serialising the pipeline then registering pipeline functions
+ * is not necessary.
+ *
+ * @constructor
+ */
+lunr.Pipeline = function () {
+ this._stack = []
+}
+
+lunr.Pipeline.registeredFunctions = Object.create(null)
+
+/**
+ * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token
+ * string as well as all known metadata. A pipeline function can mutate the token string
+ * or mutate (or add) metadata for a given token.
+ *
+ * A pipeline function can indicate that the passed token should be discarded by returning
+ * null, undefined or an empty string. This token will not be passed to any downstream pipeline
+ * functions and will not be added to the index.
+ *
+ * Multiple tokens can be returned by returning an array of tokens. Each token will be passed
+ * to any downstream pipeline functions and all will returned tokens will be added to the index.
+ *
+ * Any number of pipeline functions may be chained together using a lunr.Pipeline.
+ *
+ * @interface lunr.PipelineFunction
+ * @param {lunr.Token} token - A token from the document being processed.
+ * @param {number} i - The index of this token in the complete list of tokens for this document/field.
+ * @param {lunr.Token[]} tokens - All tokens for this document/field.
+ * @returns {(?lunr.Token|lunr.Token[])}
+ */
+
+/**
+ * Register a function with the pipeline.
+ *
+ * Functions that are used in the pipeline should be registered if the pipeline
+ * needs to be serialised, or a serialised pipeline needs to be loaded.
+ *
+ * Registering a function does not add it to a pipeline, functions must still be
+ * added to instances of the pipeline for them to be used when running a pipeline.
+ *
+ * @param {lunr.PipelineFunction} fn - The function to check for.
+ * @param {String} label - The label to register this function with
+ */
+lunr.Pipeline.registerFunction = function (fn, label) {
+ if (label in this.registeredFunctions) {
+ lunr.utils.warn('Overwriting existing registered function: ' + label)
+ }
+
+ fn.label = label
+ lunr.Pipeline.registeredFunctions[fn.label] = fn
+}
+
+/**
+ * Warns if the function is not registered as a Pipeline function.
+ *
+ * @param {lunr.PipelineFunction} fn - The function to check for.
+ * @private
+ */
+lunr.Pipeline.warnIfFunctionNotRegistered = function (fn) {
+ var isRegistered = fn.label && (fn.label in this.registeredFunctions)
+
+ if (!isRegistered) {
+ lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\n', fn)
+ }
+}
+
+/**
+ * Loads a previously serialised pipeline.
+ *
+ * All functions to be loaded must already be registered with lunr.Pipeline.
+ * If any function from the serialised data has not been registered then an
+ * error will be thrown.
+ *
+ * @param {Object} serialised - The serialised pipeline to load.
+ * @returns {lunr.Pipeline}
+ */
+lunr.Pipeline.load = function (serialised) {
+ var pipeline = new lunr.Pipeline
+
+ serialised.forEach(function (fnName) {
+ var fn = lunr.Pipeline.registeredFunctions[fnName]
+
+ if (fn) {
+ pipeline.add(fn)
+ } else {
+ throw new Error('Cannot load unregistered function: ' + fnName)
+ }
+ })
+
+ return pipeline
+}
+
+/**
+ * Adds new functions to the end of the pipeline.
+ *
+ * Logs a warning if the function has not been registered.
+ *
+ * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline.
+ */
+lunr.Pipeline.prototype.add = function () {
+ var fns = Array.prototype.slice.call(arguments)
+
+ fns.forEach(function (fn) {
+ lunr.Pipeline.warnIfFunctionNotRegistered(fn)
+ this._stack.push(fn)
+ }, this)
+}
+
+/**
+ * Adds a single function after a function that already exists in the
+ * pipeline.
+ *
+ * Logs a warning if the function has not been registered.
+ *
+ * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.
+ * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.
+ */
+lunr.Pipeline.prototype.after = function (existingFn, newFn) {
+ lunr.Pipeline.warnIfFunctionNotRegistered(newFn)
+
+ var pos = this._stack.indexOf(existingFn)
+ if (pos == -1) {
+ throw new Error('Cannot find existingFn')
+ }
+
+ pos = pos + 1
+ this._stack.splice(pos, 0, newFn)
+}
+
+/**
+ * Adds a single function before a function that already exists in the
+ * pipeline.
+ *
+ * Logs a warning if the function has not been registered.
+ *
+ * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.
+ * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.
+ */
+lunr.Pipeline.prototype.before = function (existingFn, newFn) {
+ lunr.Pipeline.warnIfFunctionNotRegistered(newFn)
+
+ var pos = this._stack.indexOf(existingFn)
+ if (pos == -1) {
+ throw new Error('Cannot find existingFn')
+ }
+
+ this._stack.splice(pos, 0, newFn)
+}
+
+/**
+ * Removes a function from the pipeline.
+ *
+ * @param {lunr.PipelineFunction} fn The function to remove from the pipeline.
+ */
+lunr.Pipeline.prototype.remove = function (fn) {
+ var pos = this._stack.indexOf(fn)
+ if (pos == -1) {
+ return
+ }
+
+ this._stack.splice(pos, 1)
+}
+
+/**
+ * Runs the current list of functions that make up the pipeline against the
+ * passed tokens.
+ *
+ * @param {Array} tokens The tokens to run through the pipeline.
+ * @returns {Array}
+ */
+lunr.Pipeline.prototype.run = function (tokens) {
+ var stackLength = this._stack.length
+
+ for (var i = 0; i < stackLength; i++) {
+ var fn = this._stack[i]
+ var memo = []
+
+ for (var j = 0; j < tokens.length; j++) {
+ var result = fn(tokens[j], j, tokens)
+
+ if (result === null || result === void 0 || result === '') continue
+
+ if (Array.isArray(result)) {
+ for (var k = 0; k < result.length; k++) {
+ memo.push(result[k])
+ }
+ } else {
+ memo.push(result)
+ }
+ }
+
+ tokens = memo
+ }
+
+ return tokens
+}
+
+/**
+ * Convenience method for passing a string through a pipeline and getting
+ * strings out. This method takes care of wrapping the passed string in a
+ * token and mapping the resulting tokens back to strings.
+ *
+ * @param {string} str - The string to pass through the pipeline.
+ * @param {?object} metadata - Optional metadata to associate with the token
+ * passed to the pipeline.
+ * @returns {string[]}
+ */
+lunr.Pipeline.prototype.runString = function (str, metadata) {
+ var token = new lunr.Token (str, metadata)
+
+ return this.run([token]).map(function (t) {
+ return t.toString()
+ })
+}
+
+/**
+ * Resets the pipeline by removing any existing processors.
+ *
+ */
+lunr.Pipeline.prototype.reset = function () {
+ this._stack = []
+}
+
+/**
+ * Returns a representation of the pipeline ready for serialisation.
+ *
+ * Logs a warning if the function has not been registered.
+ *
+ * @returns {Array}
+ */
+lunr.Pipeline.prototype.toJSON = function () {
+ return this._stack.map(function (fn) {
+ lunr.Pipeline.warnIfFunctionNotRegistered(fn)
+
+ return fn.label
+ })
+}
+/*!
+ * lunr.Vector
+ * Copyright (C) 2020 Oliver Nightingale
+ */
+
+/**
+ * A vector is used to construct the vector space of documents and queries. These
+ * vectors support operations to determine the similarity between two documents or
+ * a document and a query.
+ *
+ * Normally no parameters are required for initializing a vector, but in the case of
+ * loading a previously dumped vector the raw elements can be provided to the constructor.
+ *
+ * For performance reasons vectors are implemented with a flat array, where an elements
+ * index is immediately followed by its value. E.g. [index, value, index, value]. This
+ * allows the underlying array to be as sparse as possible and still offer decent
+ * performance when being used for vector calculations.
+ *
+ * @constructor
+ * @param {Number[]} [elements] - The flat list of element index and element value pairs.
+ */
+lunr.Vector = function (elements) {
+ this._magnitude = 0
+ this.elements = elements || []
+}
+
+
+/**
+ * Calculates the position within the vector to insert a given index.
+ *
+ * This is used internally by insert and upsert. If there are duplicate indexes then
+ * the position is returned as if the value for that index were to be updated, but it
+ * is the callers responsibility to check whether there is a duplicate at that index
+ *
+ * @param {Number} insertIdx - The index at which the element should be inserted.
+ * @returns {Number}
+ */
+lunr.Vector.prototype.positionForIndex = function (index) {
+ // For an empty vector the tuple can be inserted at the beginning
+ if (this.elements.length == 0) {
+ return 0
+ }
+
+ var start = 0,
+ end = this.elements.length / 2,
+ sliceLength = end - start,
+ pivotPoint = Math.floor(sliceLength / 2),
+ pivotIndex = this.elements[pivotPoint * 2]
+
+ while (sliceLength > 1) {
+ if (pivotIndex < index) {
+ start = pivotPoint
+ }
+
+ if (pivotIndex > index) {
+ end = pivotPoint
+ }
+
+ if (pivotIndex == index) {
+ break
+ }
+
+ sliceLength = end - start
+ pivotPoint = start + Math.floor(sliceLength / 2)
+ pivotIndex = this.elements[pivotPoint * 2]
+ }
+
+ if (pivotIndex == index) {
+ return pivotPoint * 2
+ }
+
+ if (pivotIndex > index) {
+ return pivotPoint * 2
+ }
+
+ if (pivotIndex < index) {
+ return (pivotPoint + 1) * 2
+ }
+}
+
+/**
+ * Inserts an element at an index within the vector.
+ *
+ * Does not allow duplicates, will throw an error if there is already an entry
+ * for this index.
+ *
+ * @param {Number} insertIdx - The index at which the element should be inserted.
+ * @param {Number} val - The value to be inserted into the vector.
+ */
+lunr.Vector.prototype.insert = function (insertIdx, val) {
+ this.upsert(insertIdx, val, function () {
+ throw "duplicate index"
+ })
+}
+
+/**
+ * Inserts or updates an existing index within the vector.
+ *
+ * @param {Number} insertIdx - The index at which the element should be inserted.
+ * @param {Number} val - The value to be inserted into the vector.
+ * @param {function} fn - A function that is called for updates, the existing value and the
+ * requested value are passed as arguments
+ */
+lunr.Vector.prototype.upsert = function (insertIdx, val, fn) {
+ this._magnitude = 0
+ var position = this.positionForIndex(insertIdx)
+
+ if (this.elements[position] == insertIdx) {
+ this.elements[position + 1] = fn(this.elements[position + 1], val)
+ } else {
+ this.elements.splice(position, 0, insertIdx, val)
+ }
+}
+
+/**
+ * Calculates the magnitude of this vector.
+ *
+ * @returns {Number}
+ */
+lunr.Vector.prototype.magnitude = function () {
+ if (this._magnitude) return this._magnitude
+
+ var sumOfSquares = 0,
+ elementsLength = this.elements.length
+
+ for (var i = 1; i < elementsLength; i += 2) {
+ var val = this.elements[i]
+ sumOfSquares += val * val
+ }
+
+ return this._magnitude = Math.sqrt(sumOfSquares)
+}
+
+/**
+ * Calculates the dot product of this vector and another vector.
+ *
+ * @param {lunr.Vector} otherVector - The vector to compute the dot product with.
+ * @returns {Number}
+ */
+lunr.Vector.prototype.dot = function (otherVector) {
+ var dotProduct = 0,
+ a = this.elements, b = otherVector.elements,
+ aLen = a.length, bLen = b.length,
+ aVal = 0, bVal = 0,
+ i = 0, j = 0
+
+ while (i < aLen && j < bLen) {
+ aVal = a[i], bVal = b[j]
+ if (aVal < bVal) {
+ i += 2
+ } else if (aVal > bVal) {
+ j += 2
+ } else if (aVal == bVal) {
+ dotProduct += a[i + 1] * b[j + 1]
+ i += 2
+ j += 2
+ }
+ }
+
+ return dotProduct
+}
+
+/**
+ * Calculates the similarity between this vector and another vector.
+ *
+ * @param {lunr.Vector} otherVector - The other vector to calculate the
+ * similarity with.
+ * @returns {Number}
+ */
+lunr.Vector.prototype.similarity = function (otherVector) {
+ return this.dot(otherVector) / this.magnitude() || 0
+}
+
+/**
+ * Converts the vector to an array of the elements within the vector.
+ *
+ * @returns {Number[]}
+ */
+lunr.Vector.prototype.toArray = function () {
+ var output = new Array (this.elements.length / 2)
+
+ for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) {
+ output[j] = this.elements[i]
+ }
+
+ return output
+}
+
+/**
+ * A JSON serializable representation of the vector.
+ *
+ * @returns {Number[]}
+ */
+lunr.Vector.prototype.toJSON = function () {
+ return this.elements
+}
+/* eslint-disable */
+/*!
+ * lunr.stemmer
+ * Copyright (C) 2020 Oliver Nightingale
+ * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt
+ */
+
+/**
+ * lunr.stemmer is an english language stemmer, this is a JavaScript
+ * implementation of the PorterStemmer taken from http://tartarus.org/~martin
+ *
+ * @static
+ * @implements {lunr.PipelineFunction}
+ * @param {lunr.Token} token - The string to stem
+ * @returns {lunr.Token}
+ * @see {@link lunr.Pipeline}
+ * @function
+ */
+lunr.stemmer = (function(){
+ var step2list = {
+ "ational" : "ate",
+ "tional" : "tion",
+ "enci" : "ence",
+ "anci" : "ance",
+ "izer" : "ize",
+ "bli" : "ble",
+ "alli" : "al",
+ "entli" : "ent",
+ "eli" : "e",
+ "ousli" : "ous",
+ "ization" : "ize",
+ "ation" : "ate",
+ "ator" : "ate",
+ "alism" : "al",
+ "iveness" : "ive",
+ "fulness" : "ful",
+ "ousness" : "ous",
+ "aliti" : "al",
+ "iviti" : "ive",
+ "biliti" : "ble",
+ "logi" : "log"
+ },
+
+ step3list = {
+ "icate" : "ic",
+ "ative" : "",
+ "alize" : "al",
+ "iciti" : "ic",
+ "ical" : "ic",
+ "ful" : "",
+ "ness" : ""
+ },
+
+ c = "[^aeiou]", // consonant
+ v = "[aeiouy]", // vowel
+ C = c + "[^aeiouy]*", // consonant sequence
+ V = v + "[aeiou]*", // vowel sequence
+
+ mgr0 = "^(" + C + ")?" + V + C, // [C]VC... is m>0
+ meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$", // [C]VC[V] is m=1
+ mgr1 = "^(" + C + ")?" + V + C + V + C, // [C]VCVC... is m>1
+ s_v = "^(" + C + ")?" + v; // vowel in stem
+
+ var re_mgr0 = new RegExp(mgr0);
+ var re_mgr1 = new RegExp(mgr1);
+ var re_meq1 = new RegExp(meq1);
+ var re_s_v = new RegExp(s_v);
+
+ var re_1a = /^(.+?)(ss|i)es$/;
+ var re2_1a = /^(.+?)([^s])s$/;
+ var re_1b = /^(.+?)eed$/;
+ var re2_1b = /^(.+?)(ed|ing)$/;
+ var re_1b_2 = /.$/;
+ var re2_1b_2 = /(at|bl|iz)$/;
+ var re3_1b_2 = new RegExp("([^aeiouylsz])\\1$");
+ var re4_1b_2 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+
+ var re_1c = /^(.+?[^aeiou])y$/;
+ var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+
+ var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+
+ var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+ var re2_4 = /^(.+?)(s|t)(ion)$/;
+
+ var re_5 = /^(.+?)e$/;
+ var re_5_1 = /ll$/;
+ var re3_5 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+
+ var porterStemmer = function porterStemmer(w) {
+ var stem,
+ suffix,
+ firstch,
+ re,
+ re2,
+ re3,
+ re4;
+
+ if (w.length < 3) { return w; }
+
+ firstch = w.substr(0,1);
+ if (firstch == "y") {
+ w = firstch.toUpperCase() + w.substr(1);
+ }
+
+ // Step 1a
+ re = re_1a
+ re2 = re2_1a;
+
+ if (re.test(w)) { w = w.replace(re,"$1$2"); }
+ else if (re2.test(w)) { w = w.replace(re2,"$1$2"); }
+
+ // Step 1b
+ re = re_1b;
+ re2 = re2_1b;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ re = re_mgr0;
+ if (re.test(fp[1])) {
+ re = re_1b_2;
+ w = w.replace(re,"");
+ }
+ } else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1];
+ re2 = re_s_v;
+ if (re2.test(stem)) {
+ w = stem;
+ re2 = re2_1b_2;
+ re3 = re3_1b_2;
+ re4 = re4_1b_2;
+ if (re2.test(w)) { w = w + "e"; }
+ else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,""); }
+ else if (re4.test(w)) { w = w + "e"; }
+ }
+ }
+
+ // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say)
+ re = re_1c;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ w = stem + "i";
+ }
+
+ // Step 2
+ re = re_2;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = re_mgr0;
+ if (re.test(stem)) {
+ w = stem + step2list[suffix];
+ }
+ }
+
+ // Step 3
+ re = re_3;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = re_mgr0;
+ if (re.test(stem)) {
+ w = stem + step3list[suffix];
+ }
+ }
+
+ // Step 4
+ re = re_4;
+ re2 = re2_4;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = re_mgr1;
+ if (re.test(stem)) {
+ w = stem;
+ }
+ } else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1] + fp[2];
+ re2 = re_mgr1;
+ if (re2.test(stem)) {
+ w = stem;
+ }
+ }
+
+ // Step 5
+ re = re_5;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = re_mgr1;
+ re2 = re_meq1;
+ re3 = re3_5;
+ if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) {
+ w = stem;
+ }
+ }
+
+ re = re_5_1;
+ re2 = re_mgr1;
+ if (re.test(w) && re2.test(w)) {
+ re = re_1b_2;
+ w = w.replace(re,"");
+ }
+
+ // and turn initial Y back to y
+
+ if (firstch == "y") {
+ w = firstch.toLowerCase() + w.substr(1);
+ }
+
+ return w;
+ };
+
+ return function (token) {
+ return token.update(porterStemmer);
+ }
+})();
+
+lunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer')
+/*!
+ * lunr.stopWordFilter
+ * Copyright (C) 2020 Oliver Nightingale
+ */
+
+/**
+ * lunr.generateStopWordFilter builds a stopWordFilter function from the provided
+ * list of stop words.
+ *
+ * The built in lunr.stopWordFilter is built using this generator and can be used
+ * to generate custom stopWordFilters for applications or non English languages.
+ *
+ * @function
+ * @param {Array} token The token to pass through the filter
+ * @returns {lunr.PipelineFunction}
+ * @see lunr.Pipeline
+ * @see lunr.stopWordFilter
+ */
+lunr.generateStopWordFilter = function (stopWords) {
+ var words = stopWords.reduce(function (memo, stopWord) {
+ memo[stopWord] = stopWord
+ return memo
+ }, {})
+
+ return function (token) {
+ if (token && words[token.toString()] !== token.toString()) return token
+ }
+}
+
+/**
+ * lunr.stopWordFilter is an English language stop word list filter, any words
+ * contained in the list will not be passed through the filter.
+ *
+ * This is intended to be used in the Pipeline. If the token does not pass the
+ * filter then undefined will be returned.
+ *
+ * @function
+ * @implements {lunr.PipelineFunction}
+ * @params {lunr.Token} token - A token to check for being a stop word.
+ * @returns {lunr.Token}
+ * @see {@link lunr.Pipeline}
+ */
+lunr.stopWordFilter = lunr.generateStopWordFilter([
+ 'a',
+ 'able',
+ 'about',
+ 'across',
+ 'after',
+ 'all',
+ 'almost',
+ 'also',
+ 'am',
+ 'among',
+ 'an',
+ 'and',
+ 'any',
+ 'are',
+ 'as',
+ 'at',
+ 'be',
+ 'because',
+ 'been',
+ 'but',
+ 'by',
+ 'can',
+ 'cannot',
+ 'could',
+ 'dear',
+ 'did',
+ 'do',
+ 'does',
+ 'either',
+ 'else',
+ 'ever',
+ 'every',
+ 'for',
+ 'from',
+ 'get',
+ 'got',
+ 'had',
+ 'has',
+ 'have',
+ 'he',
+ 'her',
+ 'hers',
+ 'him',
+ 'his',
+ 'how',
+ 'however',
+ 'i',
+ 'if',
+ 'in',
+ 'into',
+ 'is',
+ 'it',
+ 'its',
+ 'just',
+ 'least',
+ 'let',
+ 'like',
+ 'likely',
+ 'may',
+ 'me',
+ 'might',
+ 'most',
+ 'must',
+ 'my',
+ 'neither',
+ 'no',
+ 'nor',
+ 'not',
+ 'of',
+ 'off',
+ 'often',
+ 'on',
+ 'only',
+ 'or',
+ 'other',
+ 'our',
+ 'own',
+ 'rather',
+ 'said',
+ 'say',
+ 'says',
+ 'she',
+ 'should',
+ 'since',
+ 'so',
+ 'some',
+ 'than',
+ 'that',
+ 'the',
+ 'their',
+ 'them',
+ 'then',
+ 'there',
+ 'these',
+ 'they',
+ 'this',
+ 'tis',
+ 'to',
+ 'too',
+ 'twas',
+ 'us',
+ 'wants',
+ 'was',
+ 'we',
+ 'were',
+ 'what',
+ 'when',
+ 'where',
+ 'which',
+ 'while',
+ 'who',
+ 'whom',
+ 'why',
+ 'will',
+ 'with',
+ 'would',
+ 'yet',
+ 'you',
+ 'your'
+])
+
+lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter')
+/*!
+ * lunr.trimmer
+ * Copyright (C) 2020 Oliver Nightingale
+ */
+
+/**
+ * lunr.trimmer is a pipeline function for trimming non word
+ * characters from the beginning and end of tokens before they
+ * enter the index.
+ *
+ * This implementation may not work correctly for non latin
+ * characters and should either be removed or adapted for use
+ * with languages with non-latin characters.
+ *
+ * @static
+ * @implements {lunr.PipelineFunction}
+ * @param {lunr.Token} token The token to pass through the filter
+ * @returns {lunr.Token}
+ * @see lunr.Pipeline
+ */
+lunr.trimmer = function (token) {
+ return token.update(function (s) {
+ return s.replace(/^\W+/, '').replace(/\W+$/, '')
+ })
+}
+
+lunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer')
+/*!
+ * lunr.TokenSet
+ * Copyright (C) 2020 Oliver Nightingale
+ */
+
+/**
+ * A token set is used to store the unique list of all tokens
+ * within an index. Token sets are also used to represent an
+ * incoming query to the index, this query token set and index
+ * token set are then intersected to find which tokens to look
+ * up in the inverted index.
+ *
+ * A token set can hold multiple tokens, as in the case of the
+ * index token set, or it can hold a single token as in the
+ * case of a simple query token set.
+ *
+ * Additionally token sets are used to perform wildcard matching.
+ * Leading, contained and trailing wildcards are supported, and
+ * from this edit distance matching can also be provided.
+ *
+ * Token sets are implemented as a minimal finite state automata,
+ * where both common prefixes and suffixes are shared between tokens.
+ * This helps to reduce the space used for storing the token set.
+ *
+ * @constructor
+ */
+lunr.TokenSet = function () {
+ this.final = false
+ this.edges = {}
+ this.id = lunr.TokenSet._nextId
+ lunr.TokenSet._nextId += 1
+}
+
+/**
+ * Keeps track of the next, auto increment, identifier to assign
+ * to a new tokenSet.
+ *
+ * TokenSets require a unique identifier to be correctly minimised.
+ *
+ * @private
+ */
+lunr.TokenSet._nextId = 1
+
+/**
+ * Creates a TokenSet instance from the given sorted array of words.
+ *
+ * @param {String[]} arr - A sorted array of strings to create the set from.
+ * @returns {lunr.TokenSet}
+ * @throws Will throw an error if the input array is not sorted.
+ */
+lunr.TokenSet.fromArray = function (arr) {
+ var builder = new lunr.TokenSet.Builder
+
+ for (var i = 0, len = arr.length; i < len; i++) {
+ builder.insert(arr[i])
+ }
+
+ builder.finish()
+ return builder.root
+}
+
+/**
+ * Creates a token set from a query clause.
+ *
+ * @private
+ * @param {Object} clause - A single clause from lunr.Query.
+ * @param {string} clause.term - The query clause term.
+ * @param {number} [clause.editDistance] - The optional edit distance for the term.
+ * @returns {lunr.TokenSet}
+ */
+lunr.TokenSet.fromClause = function (clause) {
+ if ('editDistance' in clause) {
+ return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance)
+ } else {
+ return lunr.TokenSet.fromString(clause.term)
+ }
+}
+
+/**
+ * Creates a token set representing a single string with a specified
+ * edit distance.
+ *
+ * Insertions, deletions, substitutions and transpositions are each
+ * treated as an edit distance of 1.
+ *
+ * Increasing the allowed edit distance will have a dramatic impact
+ * on the performance of both creating and intersecting these TokenSets.
+ * It is advised to keep the edit distance less than 3.
+ *
+ * @param {string} str - The string to create the token set from.
+ * @param {number} editDistance - The allowed edit distance to match.
+ * @returns {lunr.Vector}
+ */
+lunr.TokenSet.fromFuzzyString = function (str, editDistance) {
+ var root = new lunr.TokenSet
+
+ var stack = [{
+ node: root,
+ editsRemaining: editDistance,
+ str: str
+ }]
+
+ while (stack.length) {
+ var frame = stack.pop()
+
+ // no edit
+ if (frame.str.length > 0) {
+ var char = frame.str.charAt(0),
+ noEditNode
+
+ if (char in frame.node.edges) {
+ noEditNode = frame.node.edges[char]
+ } else {
+ noEditNode = new lunr.TokenSet
+ frame.node.edges[char] = noEditNode
+ }
+
+ if (frame.str.length == 1) {
+ noEditNode.final = true
+ }
+
+ stack.push({
+ node: noEditNode,
+ editsRemaining: frame.editsRemaining,
+ str: frame.str.slice(1)
+ })
+ }
+
+ if (frame.editsRemaining == 0) {
+ continue
+ }
+
+ // insertion
+ if ("*" in frame.node.edges) {
+ var insertionNode = frame.node.edges["*"]
+ } else {
+ var insertionNode = new lunr.TokenSet
+ frame.node.edges["*"] = insertionNode
+ }
+
+ if (frame.str.length == 0) {
+ insertionNode.final = true
+ }
+
+ stack.push({
+ node: insertionNode,
+ editsRemaining: frame.editsRemaining - 1,
+ str: frame.str
+ })
+
+ // deletion
+ // can only do a deletion if we have enough edits remaining
+ // and if there are characters left to delete in the string
+ if (frame.str.length > 1) {
+ stack.push({
+ node: frame.node,
+ editsRemaining: frame.editsRemaining - 1,
+ str: frame.str.slice(1)
+ })
+ }
+
+ // deletion
+ // just removing the last character from the str
+ if (frame.str.length == 1) {
+ frame.node.final = true
+ }
+
+ // substitution
+ // can only do a substitution if we have enough edits remaining
+ // and if there are characters left to substitute
+ if (frame.str.length >= 1) {
+ if ("*" in frame.node.edges) {
+ var substitutionNode = frame.node.edges["*"]
+ } else {
+ var substitutionNode = new lunr.TokenSet
+ frame.node.edges["*"] = substitutionNode
+ }
+
+ if (frame.str.length == 1) {
+ substitutionNode.final = true
+ }
+
+ stack.push({
+ node: substitutionNode,
+ editsRemaining: frame.editsRemaining - 1,
+ str: frame.str.slice(1)
+ })
+ }
+
+ // transposition
+ // can only do a transposition if there are edits remaining
+ // and there are enough characters to transpose
+ if (frame.str.length > 1) {
+ var charA = frame.str.charAt(0),
+ charB = frame.str.charAt(1),
+ transposeNode
+
+ if (charB in frame.node.edges) {
+ transposeNode = frame.node.edges[charB]
+ } else {
+ transposeNode = new lunr.TokenSet
+ frame.node.edges[charB] = transposeNode
+ }
+
+ if (frame.str.length == 1) {
+ transposeNode.final = true
+ }
+
+ stack.push({
+ node: transposeNode,
+ editsRemaining: frame.editsRemaining - 1,
+ str: charA + frame.str.slice(2)
+ })
+ }
+ }
+
+ return root
+}
+
+/**
+ * Creates a TokenSet from a string.
+ *
+ * The string may contain one or more wildcard characters (*)
+ * that will allow wildcard matching when intersecting with
+ * another TokenSet.
+ *
+ * @param {string} str - The string to create a TokenSet from.
+ * @returns {lunr.TokenSet}
+ */
+lunr.TokenSet.fromString = function (str) {
+ var node = new lunr.TokenSet,
+ root = node
+
+ /*
+ * Iterates through all characters within the passed string
+ * appending a node for each character.
+ *
+ * When a wildcard character is found then a self
+ * referencing edge is introduced to continually match
+ * any number of any characters.
+ */
+ for (var i = 0, len = str.length; i < len; i++) {
+ var char = str[i],
+ final = (i == len - 1)
+
+ if (char == "*") {
+ node.edges[char] = node
+ node.final = final
+
+ } else {
+ var next = new lunr.TokenSet
+ next.final = final
+
+ node.edges[char] = next
+ node = next
+ }
+ }
+
+ return root
+}
+
+/**
+ * Converts this TokenSet into an array of strings
+ * contained within the TokenSet.
+ *
+ * This is not intended to be used on a TokenSet that
+ * contains wildcards, in these cases the results are
+ * undefined and are likely to cause an infinite loop.
+ *
+ * @returns {string[]}
+ */
+lunr.TokenSet.prototype.toArray = function () {
+ var words = []
+
+ var stack = [{
+ prefix: "",
+ node: this
+ }]
+
+ while (stack.length) {
+ var frame = stack.pop(),
+ edges = Object.keys(frame.node.edges),
+ len = edges.length
+
+ if (frame.node.final) {
+ /* In Safari, at this point the prefix is sometimes corrupted, see:
+ * https://github.com/olivernn/lunr.js/issues/279 Calling any
+ * String.prototype method forces Safari to "cast" this string to what
+ * it's supposed to be, fixing the bug. */
+ frame.prefix.charAt(0)
+ words.push(frame.prefix)
+ }
+
+ for (var i = 0; i < len; i++) {
+ var edge = edges[i]
+
+ stack.push({
+ prefix: frame.prefix.concat(edge),
+ node: frame.node.edges[edge]
+ })
+ }
+ }
+
+ return words
+}
+
+/**
+ * Generates a string representation of a TokenSet.
+ *
+ * This is intended to allow TokenSets to be used as keys
+ * in objects, largely to aid the construction and minimisation
+ * of a TokenSet. As such it is not designed to be a human
+ * friendly representation of the TokenSet.
+ *
+ * @returns {string}
+ */
+lunr.TokenSet.prototype.toString = function () {
+ // NOTE: Using Object.keys here as this.edges is very likely
+ // to enter 'hash-mode' with many keys being added
+ //
+ // avoiding a for-in loop here as it leads to the function
+ // being de-optimised (at least in V8). From some simple
+ // benchmarks the performance is comparable, but allowing
+ // V8 to optimize may mean easy performance wins in the future.
+
+ if (this._str) {
+ return this._str
+ }
+
+ var str = this.final ? '1' : '0',
+ labels = Object.keys(this.edges).sort(),
+ len = labels.length
+
+ for (var i = 0; i < len; i++) {
+ var label = labels[i],
+ node = this.edges[label]
+
+ str = str + label + node.id
+ }
+
+ return str
+}
+
+/**
+ * Returns a new TokenSet that is the intersection of
+ * this TokenSet and the passed TokenSet.
+ *
+ * This intersection will take into account any wildcards
+ * contained within the TokenSet.
+ *
+ * @param {lunr.TokenSet} b - An other TokenSet to intersect with.
+ * @returns {lunr.TokenSet}
+ */
+lunr.TokenSet.prototype.intersect = function (b) {
+ var output = new lunr.TokenSet,
+ frame = undefined
+
+ var stack = [{
+ qNode: b,
+ output: output,
+ node: this
+ }]
+
+ while (stack.length) {
+ frame = stack.pop()
+
+ // NOTE: As with the #toString method, we are using
+ // Object.keys and a for loop instead of a for-in loop
+ // as both of these objects enter 'hash' mode, causing
+ // the function to be de-optimised in V8
+ var qEdges = Object.keys(frame.qNode.edges),
+ qLen = qEdges.length,
+ nEdges = Object.keys(frame.node.edges),
+ nLen = nEdges.length
+
+ for (var q = 0; q < qLen; q++) {
+ var qEdge = qEdges[q]
+
+ for (var n = 0; n < nLen; n++) {
+ var nEdge = nEdges[n]
+
+ if (nEdge == qEdge || qEdge == '*') {
+ var node = frame.node.edges[nEdge],
+ qNode = frame.qNode.edges[qEdge],
+ final = node.final && qNode.final,
+ next = undefined
+
+ if (nEdge in frame.output.edges) {
+ // an edge already exists for this character
+ // no need to create a new node, just set the finality
+ // bit unless this node is already final
+ next = frame.output.edges[nEdge]
+ next.final = next.final || final
+
+ } else {
+ // no edge exists yet, must create one
+ // set the finality bit and insert it
+ // into the output
+ next = new lunr.TokenSet
+ next.final = final
+ frame.output.edges[nEdge] = next
+ }
+
+ stack.push({
+ qNode: qNode,
+ output: next,
+ node: node
+ })
+ }
+ }
+ }
+ }
+
+ return output
+}
+lunr.TokenSet.Builder = function () {
+ this.previousWord = ""
+ this.root = new lunr.TokenSet
+ this.uncheckedNodes = []
+ this.minimizedNodes = {}
+}
+
+lunr.TokenSet.Builder.prototype.insert = function (word) {
+ var node,
+ commonPrefix = 0
+
+ if (word < this.previousWord) {
+ throw new Error ("Out of order word insertion")
+ }
+
+ for (var i = 0; i < word.length && i < this.previousWord.length; i++) {
+ if (word[i] != this.previousWord[i]) break
+ commonPrefix++
+ }
+
+ this.minimize(commonPrefix)
+
+ if (this.uncheckedNodes.length == 0) {
+ node = this.root
+ } else {
+ node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child
+ }
+
+ for (var i = commonPrefix; i < word.length; i++) {
+ var nextNode = new lunr.TokenSet,
+ char = word[i]
+
+ node.edges[char] = nextNode
+
+ this.uncheckedNodes.push({
+ parent: node,
+ char: char,
+ child: nextNode
+ })
+
+ node = nextNode
+ }
+
+ node.final = true
+ this.previousWord = word
+}
+
+lunr.TokenSet.Builder.prototype.finish = function () {
+ this.minimize(0)
+}
+
+lunr.TokenSet.Builder.prototype.minimize = function (downTo) {
+ for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) {
+ var node = this.uncheckedNodes[i],
+ childKey = node.child.toString()
+
+ if (childKey in this.minimizedNodes) {
+ node.parent.edges[node.char] = this.minimizedNodes[childKey]
+ } else {
+ // Cache the key for this node since
+ // we know it can't change anymore
+ node.child._str = childKey
+
+ this.minimizedNodes[childKey] = node.child
+ }
+
+ this.uncheckedNodes.pop()
+ }
+}
+/*!
+ * lunr.Index
+ * Copyright (C) 2020 Oliver Nightingale
+ */
+
+/**
+ * An index contains the built index of all documents and provides a query interface
+ * to the index.
+ *
+ * Usually instances of lunr.Index will not be created using this constructor, instead
+ * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be
+ * used to load previously built and serialized indexes.
+ *
+ * @constructor
+ * @param {Object} attrs - The attributes of the built search index.
+ * @param {Object} attrs.invertedIndex - An index of term/field to document reference.
+ * @param {Object} attrs.fieldVectors - Field vectors
+ * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens.
+ * @param {string[]} attrs.fields - The names of indexed document fields.
+ * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms.
+ */
+lunr.Index = function (attrs) {
+ this.invertedIndex = attrs.invertedIndex
+ this.fieldVectors = attrs.fieldVectors
+ this.tokenSet = attrs.tokenSet
+ this.fields = attrs.fields
+ this.pipeline = attrs.pipeline
+}
+
+/**
+ * A result contains details of a document matching a search query.
+ * @typedef {Object} lunr.Index~Result
+ * @property {string} ref - The reference of the document this result represents.
+ * @property {number} score - A number between 0 and 1 representing how similar this document is to the query.
+ * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match.
+ */
+
+/**
+ * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple
+ * query language which itself is parsed into an instance of lunr.Query.
+ *
+ * For programmatically building queries it is advised to directly use lunr.Query, the query language
+ * is best used for human entered text rather than program generated text.
+ *
+ * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported
+ * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello'
+ * or 'world', though those that contain both will rank higher in the results.
+ *
+ * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can
+ * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding
+ * wildcards will increase the number of documents that will be found but can also have a negative
+ * impact on query performance, especially with wildcards at the beginning of a term.
+ *
+ * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term
+ * hello in the title field will match this query. Using a field not present in the index will lead
+ * to an error being thrown.
+ *
+ * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term
+ * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported
+ * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2.
+ * Avoid large values for edit distance to improve query performance.
+ *
+ * Each term also supports a presence modifier. By default a term's presence in document is optional, however
+ * this can be changed to either required or prohibited. For a term's presence to be required in a document the
+ * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and
+ * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not
+ * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'.
+ *
+ * To escape special characters the backslash character '\' can be used, this allows searches to include
+ * characters that would normally be considered modifiers, e.g. `foo\~2` will search for a term "foo~2" instead
+ * of attempting to apply a boost of 2 to the search term "foo".
+ *
+ * @typedef {string} lunr.Index~QueryString
+ * @example
Simple single term query
+ * hello
+ * @example
Multiple term query
+ * hello world
+ * @example
term scoped to a field
+ * title:hello
+ * @example
term with a boost of 10
+ * hello^10
+ * @example
term with an edit distance of 2
+ * hello~2
+ * @example
terms with presence modifiers
+ * -foo +bar baz
+ */
+
+/**
+ * Performs a search against the index using lunr query syntax.
+ *
+ * Results will be returned sorted by their score, the most relevant results
+ * will be returned first. For details on how the score is calculated, please see
+ * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}.
+ *
+ * For more programmatic querying use lunr.Index#query.
+ *
+ * @param {lunr.Index~QueryString} queryString - A string containing a lunr query.
+ * @throws {lunr.QueryParseError} If the passed query string cannot be parsed.
+ * @returns {lunr.Index~Result[]}
+ */
+lunr.Index.prototype.search = function (queryString) {
+ return this.query(function (query) {
+ var parser = new lunr.QueryParser(queryString, query)
+ parser.parse()
+ })
+}
+
+/**
+ * A query builder callback provides a query object to be used to express
+ * the query to perform on the index.
+ *
+ * @callback lunr.Index~queryBuilder
+ * @param {lunr.Query} query - The query object to build up.
+ * @this lunr.Query
+ */
+
+/**
+ * Performs a query against the index using the yielded lunr.Query object.
+ *
+ * If performing programmatic queries against the index, this method is preferred
+ * over lunr.Index#search so as to avoid the additional query parsing overhead.
+ *
+ * A query object is yielded to the supplied function which should be used to
+ * express the query to be run against the index.
+ *
+ * Note that although this function takes a callback parameter it is _not_ an
+ * asynchronous operation, the callback is just yielded a query object to be
+ * customized.
+ *
+ * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query.
+ * @returns {lunr.Index~Result[]}
+ */
+lunr.Index.prototype.query = function (fn) {
+ // for each query clause
+ // * process terms
+ // * expand terms from token set
+ // * find matching documents and metadata
+ // * get document vectors
+ // * score documents
+
+ var query = new lunr.Query(this.fields),
+ matchingFields = Object.create(null),
+ queryVectors = Object.create(null),
+ termFieldCache = Object.create(null),
+ requiredMatches = Object.create(null),
+ prohibitedMatches = Object.create(null)
+
+ /*
+ * To support field level boosts a query vector is created per
+ * field. An empty vector is eagerly created to support negated
+ * queries.
+ */
+ for (var i = 0; i < this.fields.length; i++) {
+ queryVectors[this.fields[i]] = new lunr.Vector
+ }
+
+ fn.call(query, query)
+
+ for (var i = 0; i < query.clauses.length; i++) {
+ /*
+ * Unless the pipeline has been disabled for this term, which is
+ * the case for terms with wildcards, we need to pass the clause
+ * term through the search pipeline. A pipeline returns an array
+ * of processed terms. Pipeline functions may expand the passed
+ * term, which means we may end up performing multiple index lookups
+ * for a single query term.
+ */
+ var clause = query.clauses[i],
+ terms = null,
+ clauseMatches = lunr.Set.empty
+
+ if (clause.usePipeline) {
+ terms = this.pipeline.runString(clause.term, {
+ fields: clause.fields
+ })
+ } else {
+ terms = [clause.term]
+ }
+
+ for (var m = 0; m < terms.length; m++) {
+ var term = terms[m]
+
+ /*
+ * Each term returned from the pipeline needs to use the same query
+ * clause object, e.g. the same boost and or edit distance. The
+ * simplest way to do this is to re-use the clause object but mutate
+ * its term property.
+ */
+ clause.term = term
+
+ /*
+ * From the term in the clause we create a token set which will then
+ * be used to intersect the indexes token set to get a list of terms
+ * to lookup in the inverted index
+ */
+ var termTokenSet = lunr.TokenSet.fromClause(clause),
+ expandedTerms = this.tokenSet.intersect(termTokenSet).toArray()
+
+ /*
+ * If a term marked as required does not exist in the tokenSet it is
+ * impossible for the search to return any matches. We set all the field
+ * scoped required matches set to empty and stop examining any further
+ * clauses.
+ */
+ if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) {
+ for (var k = 0; k < clause.fields.length; k++) {
+ var field = clause.fields[k]
+ requiredMatches[field] = lunr.Set.empty
+ }
+
+ break
+ }
+
+ for (var j = 0; j < expandedTerms.length; j++) {
+ /*
+ * For each term get the posting and termIndex, this is required for
+ * building the query vector.
+ */
+ var expandedTerm = expandedTerms[j],
+ posting = this.invertedIndex[expandedTerm],
+ termIndex = posting._index
+
+ for (var k = 0; k < clause.fields.length; k++) {
+ /*
+ * For each field that this query term is scoped by (by default
+ * all fields are in scope) we need to get all the document refs
+ * that have this term in that field.
+ *
+ * The posting is the entry in the invertedIndex for the matching
+ * term from above.
+ */
+ var field = clause.fields[k],
+ fieldPosting = posting[field],
+ matchingDocumentRefs = Object.keys(fieldPosting),
+ termField = expandedTerm + "/" + field,
+ matchingDocumentsSet = new lunr.Set(matchingDocumentRefs)
+
+ /*
+ * if the presence of this term is required ensure that the matching
+ * documents are added to the set of required matches for this clause.
+ *
+ */
+ if (clause.presence == lunr.Query.presence.REQUIRED) {
+ clauseMatches = clauseMatches.union(matchingDocumentsSet)
+
+ if (requiredMatches[field] === undefined) {
+ requiredMatches[field] = lunr.Set.complete
+ }
+ }
+
+ /*
+ * if the presence of this term is prohibited ensure that the matching
+ * documents are added to the set of prohibited matches for this field,
+ * creating that set if it does not yet exist.
+ */
+ if (clause.presence == lunr.Query.presence.PROHIBITED) {
+ if (prohibitedMatches[field] === undefined) {
+ prohibitedMatches[field] = lunr.Set.empty
+ }
+
+ prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet)
+
+ /*
+ * Prohibited matches should not be part of the query vector used for
+ * similarity scoring and no metadata should be extracted so we continue
+ * to the next field
+ */
+ continue
+ }
+
+ /*
+ * The query field vector is populated using the termIndex found for
+ * the term and a unit value with the appropriate boost applied.
+ * Using upsert because there could already be an entry in the vector
+ * for the term we are working with. In that case we just add the scores
+ * together.
+ */
+ queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b })
+
+ /**
+ * If we've already seen this term, field combo then we've already collected
+ * the matching documents and metadata, no need to go through all that again
+ */
+ if (termFieldCache[termField]) {
+ continue
+ }
+
+ for (var l = 0; l < matchingDocumentRefs.length; l++) {
+ /*
+ * All metadata for this term/field/document triple
+ * are then extracted and collected into an instance
+ * of lunr.MatchData ready to be returned in the query
+ * results
+ */
+ var matchingDocumentRef = matchingDocumentRefs[l],
+ matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field),
+ metadata = fieldPosting[matchingDocumentRef],
+ fieldMatch
+
+ if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) {
+ matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata)
+ } else {
+ fieldMatch.add(expandedTerm, field, metadata)
+ }
+
+ }
+
+ termFieldCache[termField] = true
+ }
+ }
+ }
+
+ /**
+ * If the presence was required we need to update the requiredMatches field sets.
+ * We do this after all fields for the term have collected their matches because
+ * the clause terms presence is required in _any_ of the fields not _all_ of the
+ * fields.
+ */
+ if (clause.presence === lunr.Query.presence.REQUIRED) {
+ for (var k = 0; k < clause.fields.length; k++) {
+ var field = clause.fields[k]
+ requiredMatches[field] = requiredMatches[field].intersect(clauseMatches)
+ }
+ }
+ }
+
+ /**
+ * Need to combine the field scoped required and prohibited
+ * matching documents into a global set of required and prohibited
+ * matches
+ */
+ var allRequiredMatches = lunr.Set.complete,
+ allProhibitedMatches = lunr.Set.empty
+
+ for (var i = 0; i < this.fields.length; i++) {
+ var field = this.fields[i]
+
+ if (requiredMatches[field]) {
+ allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field])
+ }
+
+ if (prohibitedMatches[field]) {
+ allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field])
+ }
+ }
+
+ var matchingFieldRefs = Object.keys(matchingFields),
+ results = [],
+ matches = Object.create(null)
+
+ /*
+ * If the query is negated (contains only prohibited terms)
+ * we need to get _all_ fieldRefs currently existing in the
+ * index. This is only done when we know that the query is
+ * entirely prohibited terms to avoid any cost of getting all
+ * fieldRefs unnecessarily.
+ *
+ * Additionally, blank MatchData must be created to correctly
+ * populate the results.
+ */
+ if (query.isNegated()) {
+ matchingFieldRefs = Object.keys(this.fieldVectors)
+
+ for (var i = 0; i < matchingFieldRefs.length; i++) {
+ var matchingFieldRef = matchingFieldRefs[i]
+ var fieldRef = lunr.FieldRef.fromString(matchingFieldRef)
+ matchingFields[matchingFieldRef] = new lunr.MatchData
+ }
+ }
+
+ for (var i = 0; i < matchingFieldRefs.length; i++) {
+ /*
+ * Currently we have document fields that match the query, but we
+ * need to return documents. The matchData and scores are combined
+ * from multiple fields belonging to the same document.
+ *
+ * Scores are calculated by field, using the query vectors created
+ * above, and combined into a final document score using addition.
+ */
+ var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]),
+ docRef = fieldRef.docRef
+
+ if (!allRequiredMatches.contains(docRef)) {
+ continue
+ }
+
+ if (allProhibitedMatches.contains(docRef)) {
+ continue
+ }
+
+ var fieldVector = this.fieldVectors[fieldRef],
+ score = queryVectors[fieldRef.fieldName].similarity(fieldVector),
+ docMatch
+
+ if ((docMatch = matches[docRef]) !== undefined) {
+ docMatch.score += score
+ docMatch.matchData.combine(matchingFields[fieldRef])
+ } else {
+ var match = {
+ ref: docRef,
+ score: score,
+ matchData: matchingFields[fieldRef]
+ }
+ matches[docRef] = match
+ results.push(match)
+ }
+ }
+
+ /*
+ * Sort the results objects by score, highest first.
+ */
+ return results.sort(function (a, b) {
+ return b.score - a.score
+ })
+}
+
+/**
+ * Prepares the index for JSON serialization.
+ *
+ * The schema for this JSON blob will be described in a
+ * separate JSON schema file.
+ *
+ * @returns {Object}
+ */
+lunr.Index.prototype.toJSON = function () {
+ var invertedIndex = Object.keys(this.invertedIndex)
+ .sort()
+ .map(function (term) {
+ return [term, this.invertedIndex[term]]
+ }, this)
+
+ var fieldVectors = Object.keys(this.fieldVectors)
+ .map(function (ref) {
+ return [ref, this.fieldVectors[ref].toJSON()]
+ }, this)
+
+ return {
+ version: lunr.version,
+ fields: this.fields,
+ fieldVectors: fieldVectors,
+ invertedIndex: invertedIndex,
+ pipeline: this.pipeline.toJSON()
+ }
+}
+
+/**
+ * Loads a previously serialized lunr.Index
+ *
+ * @param {Object} serializedIndex - A previously serialized lunr.Index
+ * @returns {lunr.Index}
+ */
+lunr.Index.load = function (serializedIndex) {
+ var attrs = {},
+ fieldVectors = {},
+ serializedVectors = serializedIndex.fieldVectors,
+ invertedIndex = Object.create(null),
+ serializedInvertedIndex = serializedIndex.invertedIndex,
+ tokenSetBuilder = new lunr.TokenSet.Builder,
+ pipeline = lunr.Pipeline.load(serializedIndex.pipeline)
+
+ if (serializedIndex.version != lunr.version) {
+ lunr.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + lunr.version + "' does not match serialized index '" + serializedIndex.version + "'")
+ }
+
+ for (var i = 0; i < serializedVectors.length; i++) {
+ var tuple = serializedVectors[i],
+ ref = tuple[0],
+ elements = tuple[1]
+
+ fieldVectors[ref] = new lunr.Vector(elements)
+ }
+
+ for (var i = 0; i < serializedInvertedIndex.length; i++) {
+ var tuple = serializedInvertedIndex[i],
+ term = tuple[0],
+ posting = tuple[1]
+
+ tokenSetBuilder.insert(term)
+ invertedIndex[term] = posting
+ }
+
+ tokenSetBuilder.finish()
+
+ attrs.fields = serializedIndex.fields
+
+ attrs.fieldVectors = fieldVectors
+ attrs.invertedIndex = invertedIndex
+ attrs.tokenSet = tokenSetBuilder.root
+ attrs.pipeline = pipeline
+
+ return new lunr.Index(attrs)
+}
+/*!
+ * lunr.Builder
+ * Copyright (C) 2020 Oliver Nightingale
+ */
+
+/**
+ * lunr.Builder performs indexing on a set of documents and
+ * returns instances of lunr.Index ready for querying.
+ *
+ * All configuration of the index is done via the builder, the
+ * fields to index, the document reference, the text processing
+ * pipeline and document scoring parameters are all set on the
+ * builder before indexing.
+ *
+ * @constructor
+ * @property {string} _ref - Internal reference to the document reference field.
+ * @property {string[]} _fields - Internal reference to the document fields to index.
+ * @property {object} invertedIndex - The inverted index maps terms to document fields.
+ * @property {object} documentTermFrequencies - Keeps track of document term frequencies.
+ * @property {object} documentLengths - Keeps track of the length of documents added to the index.
+ * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing.
+ * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing.
+ * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index.
+ * @property {number} documentCount - Keeps track of the total number of documents indexed.
+ * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75.
+ * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2.
+ * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space.
+ * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index.
+ */
+lunr.Builder = function () {
+ this._ref = "id"
+ this._fields = Object.create(null)
+ this._documents = Object.create(null)
+ this.invertedIndex = Object.create(null)
+ this.fieldTermFrequencies = {}
+ this.fieldLengths = {}
+ this.tokenizer = lunr.tokenizer
+ this.pipeline = new lunr.Pipeline
+ this.searchPipeline = new lunr.Pipeline
+ this.documentCount = 0
+ this._b = 0.75
+ this._k1 = 1.2
+ this.termIndex = 0
+ this.metadataWhitelist = []
+}
+
+/**
+ * Sets the document field used as the document reference. Every document must have this field.
+ * The type of this field in the document should be a string, if it is not a string it will be
+ * coerced into a string by calling toString.
+ *
+ * The default ref is 'id'.
+ *
+ * The ref should _not_ be changed during indexing, it should be set before any documents are
+ * added to the index. Changing it during indexing can lead to inconsistent results.
+ *
+ * @param {string} ref - The name of the reference field in the document.
+ */
+lunr.Builder.prototype.ref = function (ref) {
+ this._ref = ref
+}
+
+/**
+ * A function that is used to extract a field from a document.
+ *
+ * Lunr expects a field to be at the top level of a document, if however the field
+ * is deeply nested within a document an extractor function can be used to extract
+ * the right field for indexing.
+ *
+ * @callback fieldExtractor
+ * @param {object} doc - The document being added to the index.
+ * @returns {?(string|object|object[])} obj - The object that will be indexed for this field.
+ * @example
Extracting a nested field
+ * function (doc) { return doc.nested.field }
+ */
+
+/**
+ * Adds a field to the list of document fields that will be indexed. Every document being
+ * indexed should have this field. Null values for this field in indexed documents will
+ * not cause errors but will limit the chance of that document being retrieved by searches.
+ *
+ * All fields should be added before adding documents to the index. Adding fields after
+ * a document has been indexed will have no effect on already indexed documents.
+ *
+ * Fields can be boosted at build time. This allows terms within that field to have more
+ * importance when ranking search results. Use a field boost to specify that matches within
+ * one field are more important than other fields.
+ *
+ * @param {string} fieldName - The name of a field to index in all documents.
+ * @param {object} attributes - Optional attributes associated with this field.
+ * @param {number} [attributes.boost=1] - Boost applied to all terms within this field.
+ * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document.
+ * @throws {RangeError} fieldName cannot contain unsupported characters '/'
+ */
+lunr.Builder.prototype.field = function (fieldName, attributes) {
+ if (/\//.test(fieldName)) {
+ throw new RangeError ("Field '" + fieldName + "' contains illegal character '/'")
+ }
+
+ this._fields[fieldName] = attributes || {}
+}
+
+/**
+ * A parameter to tune the amount of field length normalisation that is applied when
+ * calculating relevance scores. A value of 0 will completely disable any normalisation
+ * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b
+ * will be clamped to the range 0 - 1.
+ *
+ * @param {number} number - The value to set for this tuning parameter.
+ */
+lunr.Builder.prototype.b = function (number) {
+ if (number < 0) {
+ this._b = 0
+ } else if (number > 1) {
+ this._b = 1
+ } else {
+ this._b = number
+ }
+}
+
+/**
+ * A parameter that controls the speed at which a rise in term frequency results in term
+ * frequency saturation. The default value is 1.2. Setting this to a higher value will give
+ * slower saturation levels, a lower value will result in quicker saturation.
+ *
+ * @param {number} number - The value to set for this tuning parameter.
+ */
+lunr.Builder.prototype.k1 = function (number) {
+ this._k1 = number
+}
+
+/**
+ * Adds a document to the index.
+ *
+ * Before adding fields to the index the index should have been fully setup, with the document
+ * ref and all fields to index already having been specified.
+ *
+ * The document must have a field name as specified by the ref (by default this is 'id') and
+ * it should have all fields defined for indexing, though null or undefined values will not
+ * cause errors.
+ *
+ * Entire documents can be boosted at build time. Applying a boost to a document indicates that
+ * this document should rank higher in search results than other documents.
+ *
+ * @param {object} doc - The document to add to the index.
+ * @param {object} attributes - Optional attributes associated with this document.
+ * @param {number} [attributes.boost=1] - Boost applied to all terms within this document.
+ */
+lunr.Builder.prototype.add = function (doc, attributes) {
+ var docRef = doc[this._ref],
+ fields = Object.keys(this._fields)
+
+ this._documents[docRef] = attributes || {}
+ this.documentCount += 1
+
+ for (var i = 0; i < fields.length; i++) {
+ var fieldName = fields[i],
+ extractor = this._fields[fieldName].extractor,
+ field = extractor ? extractor(doc) : doc[fieldName],
+ tokens = this.tokenizer(field, {
+ fields: [fieldName]
+ }),
+ terms = this.pipeline.run(tokens),
+ fieldRef = new lunr.FieldRef (docRef, fieldName),
+ fieldTerms = Object.create(null)
+
+ this.fieldTermFrequencies[fieldRef] = fieldTerms
+ this.fieldLengths[fieldRef] = 0
+
+ // store the length of this field for this document
+ this.fieldLengths[fieldRef] += terms.length
+
+ // calculate term frequencies for this field
+ for (var j = 0; j < terms.length; j++) {
+ var term = terms[j]
+
+ if (fieldTerms[term] == undefined) {
+ fieldTerms[term] = 0
+ }
+
+ fieldTerms[term] += 1
+
+ // add to inverted index
+ // create an initial posting if one doesn't exist
+ if (this.invertedIndex[term] == undefined) {
+ var posting = Object.create(null)
+ posting["_index"] = this.termIndex
+ this.termIndex += 1
+
+ for (var k = 0; k < fields.length; k++) {
+ posting[fields[k]] = Object.create(null)
+ }
+
+ this.invertedIndex[term] = posting
+ }
+
+ // add an entry for this term/fieldName/docRef to the invertedIndex
+ if (this.invertedIndex[term][fieldName][docRef] == undefined) {
+ this.invertedIndex[term][fieldName][docRef] = Object.create(null)
+ }
+
+ // store all whitelisted metadata about this token in the
+ // inverted index
+ for (var l = 0; l < this.metadataWhitelist.length; l++) {
+ var metadataKey = this.metadataWhitelist[l],
+ metadata = term.metadata[metadataKey]
+
+ if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) {
+ this.invertedIndex[term][fieldName][docRef][metadataKey] = []
+ }
+
+ this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata)
+ }
+ }
+
+ }
+}
+
+/**
+ * Calculates the average document length for this index
+ *
+ * @private
+ */
+lunr.Builder.prototype.calculateAverageFieldLengths = function () {
+
+ var fieldRefs = Object.keys(this.fieldLengths),
+ numberOfFields = fieldRefs.length,
+ accumulator = {},
+ documentsWithField = {}
+
+ for (var i = 0; i < numberOfFields; i++) {
+ var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),
+ field = fieldRef.fieldName
+
+ documentsWithField[field] || (documentsWithField[field] = 0)
+ documentsWithField[field] += 1
+
+ accumulator[field] || (accumulator[field] = 0)
+ accumulator[field] += this.fieldLengths[fieldRef]
+ }
+
+ var fields = Object.keys(this._fields)
+
+ for (var i = 0; i < fields.length; i++) {
+ var fieldName = fields[i]
+ accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName]
+ }
+
+ this.averageFieldLength = accumulator
+}
+
+/**
+ * Builds a vector space model of every document using lunr.Vector
+ *
+ * @private
+ */
+lunr.Builder.prototype.createFieldVectors = function () {
+ var fieldVectors = {},
+ fieldRefs = Object.keys(this.fieldTermFrequencies),
+ fieldRefsLength = fieldRefs.length,
+ termIdfCache = Object.create(null)
+
+ for (var i = 0; i < fieldRefsLength; i++) {
+ var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),
+ fieldName = fieldRef.fieldName,
+ fieldLength = this.fieldLengths[fieldRef],
+ fieldVector = new lunr.Vector,
+ termFrequencies = this.fieldTermFrequencies[fieldRef],
+ terms = Object.keys(termFrequencies),
+ termsLength = terms.length
+
+
+ var fieldBoost = this._fields[fieldName].boost || 1,
+ docBoost = this._documents[fieldRef.docRef].boost || 1
+
+ for (var j = 0; j < termsLength; j++) {
+ var term = terms[j],
+ tf = termFrequencies[term],
+ termIndex = this.invertedIndex[term]._index,
+ idf, score, scoreWithPrecision
+
+ if (termIdfCache[term] === undefined) {
+ idf = lunr.idf(this.invertedIndex[term], this.documentCount)
+ termIdfCache[term] = idf
+ } else {
+ idf = termIdfCache[term]
+ }
+
+ score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf)
+ score *= fieldBoost
+ score *= docBoost
+ scoreWithPrecision = Math.round(score * 1000) / 1000
+ // Converts 1.23456789 to 1.234.
+ // Reducing the precision so that the vectors take up less
+ // space when serialised. Doing it now so that they behave
+ // the same before and after serialisation. Also, this is
+ // the fastest approach to reducing a number's precision in
+ // JavaScript.
+
+ fieldVector.insert(termIndex, scoreWithPrecision)
+ }
+
+ fieldVectors[fieldRef] = fieldVector
+ }
+
+ this.fieldVectors = fieldVectors
+}
+
+/**
+ * Creates a token set of all tokens in the index using lunr.TokenSet
+ *
+ * @private
+ */
+lunr.Builder.prototype.createTokenSet = function () {
+ this.tokenSet = lunr.TokenSet.fromArray(
+ Object.keys(this.invertedIndex).sort()
+ )
+}
+
+/**
+ * Builds the index, creating an instance of lunr.Index.
+ *
+ * This completes the indexing process and should only be called
+ * once all documents have been added to the index.
+ *
+ * @returns {lunr.Index}
+ */
+lunr.Builder.prototype.build = function () {
+ this.calculateAverageFieldLengths()
+ this.createFieldVectors()
+ this.createTokenSet()
+
+ return new lunr.Index({
+ invertedIndex: this.invertedIndex,
+ fieldVectors: this.fieldVectors,
+ tokenSet: this.tokenSet,
+ fields: Object.keys(this._fields),
+ pipeline: this.searchPipeline
+ })
+}
+
+/**
+ * Applies a plugin to the index builder.
+ *
+ * A plugin is a function that is called with the index builder as its context.
+ * Plugins can be used to customise or extend the behaviour of the index
+ * in some way. A plugin is just a function, that encapsulated the custom
+ * behaviour that should be applied when building the index.
+ *
+ * The plugin function will be called with the index builder as its argument, additional
+ * arguments can also be passed when calling use. The function will be called
+ * with the index builder as its context.
+ *
+ * @param {Function} plugin The plugin to apply.
+ */
+lunr.Builder.prototype.use = function (fn) {
+ var args = Array.prototype.slice.call(arguments, 1)
+ args.unshift(this)
+ fn.apply(this, args)
+}
+/**
+ * Contains and collects metadata about a matching document.
+ * A single instance of lunr.MatchData is returned as part of every
+ * lunr.Index~Result.
+ *
+ * @constructor
+ * @param {string} term - The term this match data is associated with
+ * @param {string} field - The field in which the term was found
+ * @param {object} metadata - The metadata recorded about this term in this field
+ * @property {object} metadata - A cloned collection of metadata associated with this document.
+ * @see {@link lunr.Index~Result}
+ */
+lunr.MatchData = function (term, field, metadata) {
+ var clonedMetadata = Object.create(null),
+ metadataKeys = Object.keys(metadata || {})
+
+ // Cloning the metadata to prevent the original
+ // being mutated during match data combination.
+ // Metadata is kept in an array within the inverted
+ // index so cloning the data can be done with
+ // Array#slice
+ for (var i = 0; i < metadataKeys.length; i++) {
+ var key = metadataKeys[i]
+ clonedMetadata[key] = metadata[key].slice()
+ }
+
+ this.metadata = Object.create(null)
+
+ if (term !== undefined) {
+ this.metadata[term] = Object.create(null)
+ this.metadata[term][field] = clonedMetadata
+ }
+}
+
+/**
+ * An instance of lunr.MatchData will be created for every term that matches a
+ * document. However only one instance is required in a lunr.Index~Result. This
+ * method combines metadata from another instance of lunr.MatchData with this
+ * objects metadata.
+ *
+ * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one.
+ * @see {@link lunr.Index~Result}
+ */
+lunr.MatchData.prototype.combine = function (otherMatchData) {
+ var terms = Object.keys(otherMatchData.metadata)
+
+ for (var i = 0; i < terms.length; i++) {
+ var term = terms[i],
+ fields = Object.keys(otherMatchData.metadata[term])
+
+ if (this.metadata[term] == undefined) {
+ this.metadata[term] = Object.create(null)
+ }
+
+ for (var j = 0; j < fields.length; j++) {
+ var field = fields[j],
+ keys = Object.keys(otherMatchData.metadata[term][field])
+
+ if (this.metadata[term][field] == undefined) {
+ this.metadata[term][field] = Object.create(null)
+ }
+
+ for (var k = 0; k < keys.length; k++) {
+ var key = keys[k]
+
+ if (this.metadata[term][field][key] == undefined) {
+ this.metadata[term][field][key] = otherMatchData.metadata[term][field][key]
+ } else {
+ this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key])
+ }
+
+ }
+ }
+ }
+}
+
+/**
+ * Add metadata for a term/field pair to this instance of match data.
+ *
+ * @param {string} term - The term this match data is associated with
+ * @param {string} field - The field in which the term was found
+ * @param {object} metadata - The metadata recorded about this term in this field
+ */
+lunr.MatchData.prototype.add = function (term, field, metadata) {
+ if (!(term in this.metadata)) {
+ this.metadata[term] = Object.create(null)
+ this.metadata[term][field] = metadata
+ return
+ }
+
+ if (!(field in this.metadata[term])) {
+ this.metadata[term][field] = metadata
+ return
+ }
+
+ var metadataKeys = Object.keys(metadata)
+
+ for (var i = 0; i < metadataKeys.length; i++) {
+ var key = metadataKeys[i]
+
+ if (key in this.metadata[term][field]) {
+ this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key])
+ } else {
+ this.metadata[term][field][key] = metadata[key]
+ }
+ }
+}
+/**
+ * A lunr.Query provides a programmatic way of defining queries to be performed
+ * against a {@link lunr.Index}.
+ *
+ * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method
+ * so the query object is pre-initialized with the right index fields.
+ *
+ * @constructor
+ * @property {lunr.Query~Clause[]} clauses - An array of query clauses.
+ * @property {string[]} allFields - An array of all available fields in a lunr.Index.
+ */
+lunr.Query = function (allFields) {
+ this.clauses = []
+ this.allFields = allFields
+}
+
+/**
+ * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause.
+ *
+ * This allows wildcards to be added to the beginning and end of a term without having to manually do any string
+ * concatenation.
+ *
+ * The wildcard constants can be bitwise combined to select both leading and trailing wildcards.
+ *
+ * @constant
+ * @default
+ * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour
+ * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists
+ * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists
+ * @see lunr.Query~Clause
+ * @see lunr.Query#clause
+ * @see lunr.Query#term
+ * @example
+ * query.term('foo', {
+ * wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING
+ * })
+ */
+
+lunr.Query.wildcard = new String ("*")
+lunr.Query.wildcard.NONE = 0
+lunr.Query.wildcard.LEADING = 1
+lunr.Query.wildcard.TRAILING = 2
+
+/**
+ * Constants for indicating what kind of presence a term must have in matching documents.
+ *
+ * @constant
+ * @enum {number}
+ * @see lunr.Query~Clause
+ * @see lunr.Query#clause
+ * @see lunr.Query#term
+ * @example
query term with required presence
+ * query.term('foo', { presence: lunr.Query.presence.REQUIRED })
+ */
+lunr.Query.presence = {
+ /**
+ * Term's presence in a document is optional, this is the default value.
+ */
+ OPTIONAL: 1,
+
+ /**
+ * Term's presence in a document is required, documents that do not contain
+ * this term will not be returned.
+ */
+ REQUIRED: 2,
+
+ /**
+ * Term's presence in a document is prohibited, documents that do contain
+ * this term will not be returned.
+ */
+ PROHIBITED: 3
+}
+
+/**
+ * A single clause in a {@link lunr.Query} contains a term and details on how to
+ * match that term against a {@link lunr.Index}.
+ *
+ * @typedef {Object} lunr.Query~Clause
+ * @property {string[]} fields - The fields in an index this clause should be matched against.
+ * @property {number} [boost=1] - Any boost that should be applied when matching this clause.
+ * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be.
+ * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline.
+ * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended.
+ * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents.
+ */
+
+/**
+ * Adds a {@link lunr.Query~Clause} to this query.
+ *
+ * Unless the clause contains the fields to be matched all fields will be matched. In addition
+ * a default boost of 1 is applied to the clause.
+ *
+ * @param {lunr.Query~Clause} clause - The clause to add to this query.
+ * @see lunr.Query~Clause
+ * @returns {lunr.Query}
+ */
+lunr.Query.prototype.clause = function (clause) {
+ if (!('fields' in clause)) {
+ clause.fields = this.allFields
+ }
+
+ if (!('boost' in clause)) {
+ clause.boost = 1
+ }
+
+ if (!('usePipeline' in clause)) {
+ clause.usePipeline = true
+ }
+
+ if (!('wildcard' in clause)) {
+ clause.wildcard = lunr.Query.wildcard.NONE
+ }
+
+ if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) {
+ clause.term = "*" + clause.term
+ }
+
+ if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) {
+ clause.term = "" + clause.term + "*"
+ }
+
+ if (!('presence' in clause)) {
+ clause.presence = lunr.Query.presence.OPTIONAL
+ }
+
+ this.clauses.push(clause)
+
+ return this
+}
+
+/**
+ * A negated query is one in which every clause has a presence of
+ * prohibited. These queries require some special processing to return
+ * the expected results.
+ *
+ * @returns boolean
+ */
+lunr.Query.prototype.isNegated = function () {
+ for (var i = 0; i < this.clauses.length; i++) {
+ if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) {
+ return false
+ }
+ }
+
+ return true
+}
+
+/**
+ * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause}
+ * to the list of clauses that make up this query.
+ *
+ * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion
+ * to a token or token-like string should be done before calling this method.
+ *
+ * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an
+ * array, each term in the array will share the same options.
+ *
+ * @param {object|object[]} term - The term(s) to add to the query.
+ * @param {object} [options] - Any additional properties to add to the query clause.
+ * @returns {lunr.Query}
+ * @see lunr.Query#clause
+ * @see lunr.Query~Clause
+ * @example
adding a single term to a query
+ * query.term("foo")
+ * @example
adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard
"]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|?\w+;/,Ye=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),u=pe.event.special[p]||{},i||!u.trigger||u.trigger.apply(r,n)!==!1)){if(!i&&!u.noBubble&&!pe.isWindow(r)){for(l=u.delegateType||p,Je.test(l+p)||(s=s.parentNode);s;s=s.parentNode)f.push(s),c=s;c===(r.ownerDocument||re)&&f.push(c.defaultView||c.parentWindow||e)}for(d=0;(s=f[d++])&&!t.isPropagationStopped();)t.type=d>1?l:u.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&Ie(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!u._default||u._default.apply(f.pop(),n)===!1)&&Ie(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(m){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),l=(pe._data(this,"events")||{})[e.type]||[],u=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!u.preDispatch||u.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,l),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return u.postDispatch&&u.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,l=e.target;if(s&&l.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(r=[],n=0;s>n;n++)o=t[n],i=o.selector+" ",void 0===r[i]&&(r[i]=o.needsContext?pe(i,this).index(l)>-1:pe.find(i,this,null,[l]).length),r[i]&&r.push(o);r.length&&a.push({elem:l,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/
+ {% endfor %}
+{% endif %}
+```{% endraw %}
+
+Next, add `page_js` to any page's YAML Front Matter to have your JavaScript loaded for that page.
+```yaml
+page_js:
+ - /path/to/your/custom.js
+```
+
+---
diff --git a/docs/_docs/11-posts.md b/docs/_docs/11-posts.md
index f8126291c0f9..41b72aa191d9 100644
--- a/docs/_docs/11-posts.md
+++ b/docs/_docs/11-posts.md
@@ -2,7 +2,7 @@
title: "Working with Posts"
permalink: /docs/posts/
excerpt: "Suggestions and Front Matter defaults for working with posts."
-last_modified_at: 2016-11-03T11:12:40-04:00
+last_modified_at: 2018-03-20T15:59:57-04:00
---
Posts are stored in the `_posts` directory and named according to the `YEAR-MONTH-DAY-title.MARKUP` format as per [the usual](https://jekyllrb.com/docs/posts/).
@@ -31,7 +31,7 @@ defaults:
related: true
```
-Adding the above to `_config.yml` will assign the `single` layout and enable: *author profile*, *reading time*, *comments*, [*social sharing links*]({{ "/docs/layouts/#social-sharing-links" | absolute_url }}), and *related posts*, for all posts.
+Adding the above to `_config.yml` will assign the `single` layout and enable: *author profile*, *reading time*, *comments*, [*social sharing links*]({{ "/docs/layouts/#social-sharing-links" | relative_url }}), and *related posts*, for all posts.
**ProTip:** Remember to write unique `excerpt` descriptions for each post for improved SEO and archive listings.
{: .notice--info}
\ No newline at end of file
diff --git a/docs/_docs/13-collections.md b/docs/_docs/13-collections.md
index cfa568b49632..8a88b51a5e0a 100644
--- a/docs/_docs/13-collections.md
+++ b/docs/_docs/13-collections.md
@@ -2,12 +2,12 @@
title: "Working with Collections"
permalink: /docs/collections/
excerpt: "Suggestions and Front Matter defaults for working with collections."
-last_modified_at: 2016-11-03T11:13:38-04:00
+last_modified_at: 2018-03-20T16:00:02-04:00
---
Collections like posts and pages work as you'd expect. If you're new to them be sure to read [Jekyll's documentation](https://jekyllrb.com/docs/collections/).
-The theme has been built with collections in mind and you will find [several examples]({{ "/collection-archive/" | absolute_url }}) on the demo site ([portfolio]({{ "/portfolio/" | absolute_url }}), [recipes]({{ "/recipes/" | absolute_url }}), pets).
+The theme has been built with collections in mind and you will find [several examples]({{ "/collection-archive/" | relative_url }}) on the demo site ([portfolio]({{ "/portfolio/" | relative_url }}), [recipes]({{ "/recipes/" | relative_url }}), [pets]({{ "/pets/" | relative_url }})).
**Collections in the Wild:** This set of documentation is also [built as a collection](https://github.com/{{ site.repository }}/blob/master/docs/_docs/) if you're looking for a fully fleshed out example to inspect.
{: .notice--info}
@@ -41,6 +41,19 @@ defaults:
share: true
```
+Now make a portfolio.md file in the '_pages' folder.
+
+```yaml
+---
+title: Portfolio
+layout: collection
+permalink: /portfolio/
+collection: portfolio
+entries_layout: grid
+classes: wide
+---
+```
+
And then create portfolio content like [`_portfolio/foo-bar-website.md`](https://github.com/{{ site.repository }}/blob/master/docs/_portfolio/foo-bar-website.md), to end up with something like this.
-
\ No newline at end of file
+
diff --git a/docs/_docs/14-helpers.md b/docs/_docs/14-helpers.md
index 849417ef220f..9f281b4f8c69 100644
--- a/docs/_docs/14-helpers.md
+++ b/docs/_docs/14-helpers.md
@@ -30,63 +30,46 @@ feature_row:
- image_path: /assets/images/unsplash-gallery-image-3-th.jpg
title: "Placeholder 3"
excerpt: "This is some sample content that goes here with **Markdown** formatting."
-last_modified_at: 2017-05-16T11:45:00-04:00
+last_modified_at: 2020-05-01T10:22:56-04:00
+toc: true
+toc_label: "Helpers"
+toc_icon: "cogs"
---
-{% include toc icon="gears" title="Helpers" %}
-
You can think of these Jekyll helpers as little shortcuts. Since GitHub Pages doesn't allow most plugins --- [custom tags](https://jekyllrb.com/docs/plugins/#tags) are out. Instead the theme leverages [**includes**](https://jekyllrb.com/docs/templates/#includes) to do something similar.
-## Base Path
-
-**Deprecated**. Use `absolute_url` filter instead.
-
-Instead of repeating `{% raw %}{{ site.url }}{{ site.baseurl }}{% endraw %}` over and over again to create absolute URLs, you can use `{% raw %}{{ base_path }}{% endraw %}` instead. Simply add `{% raw %}{% include base_path %}{% endraw %}` to layouts, posts, pages, collections, or other includes and you're good to go.
-
-**ProTip:** It's a good practice to use absolute URL paths for assets (especially post images) so they correctly resolve in the site's XML feeds. Example: `{% raw %}{{ "/assets/images/filename.jpg" | absolute_url }}{% endraw %}` ~> `https://yourdoamin.com/assets/images/filename.jpg`
-{: .notice--info}
-
-## Group by Array
+## Group by array
[Jekyll Group-By-Array](https://github.com/mushishi78/jekyll-group-by-array) by Max White.
- A liquid include file for Jekyll that allows an object to be grouped by an array.
-
-The Liquid based taxonomy archives found amongst the demo pages rely on this helper.
-
-| Description | | |
-| ----------- | ------------------------ | --------------------------- |
-| All posts grouped by category | [Source][category-array] | [Demo][category-array-demo] |
-| All posts grouped by tag | [Source][tag-array] | [Demo][tag-array-demo] |
-
-[category-array]: https://github.com/{{ site.repository }}/blob/master/docs/_pages/category-archive.html
-[category-array-demo]: {{ "/categories/" | absolute_url }}
-[tag-array]: https://github.com/{{ site.repository }}/blob/master/docs/_pages/tag-archive.html
-[tag-array-demo]: {{ "/tags/" | absolute_url }}
+A liquid include file for Jekyll that allows an object to be grouped by an array.
## Figure
Generate a `
` element with a single image and caption.
-| Include Parameter | Required | Description |
-| ---- | -------- | ----------- |
+| Include Parameter | Required | Description |
+| ----------------- | ------------ | ---------------------------------------------------------------------------------------------------- |
| **image_path** | **Required** | Full path to image eg: `/assets/images/filename.jpg`. Use absolute URLS for those hosted externally. |
-| **alt** | Optional | Alternate text for image. |
-| **caption** | Optional | Figure caption text. Markdown is allowed. |
+| **alt** | Optional | Alternate text for image. |
+| **caption** | Optional | Figure caption text. Markdown is allowed. |
+| **popup** | Optional | Enable Magnific Popup on the image. |
Using the `figure` include like so:
```liquid
-{% raw %}{% include figure image_path="/assets/images/unsplash-image-10.jpg" alt="this is a placeholder image" caption="This is a figure caption." %}{% endraw %}
+{% raw %}{% include figure popup=true image_path="/assets/images/unsplash-image-10.jpg" alt="this is a placeholder image" caption="This is a figure caption." %}{% endraw %}
```
Will output the following:
-{% include figure image_path="/assets/images/unsplash-image-10.jpg" alt="this is a placeholder image" caption="This is a figure caption." %}
+{% include figure popup=true image_path="/assets/images/unsplash-image-10.jpg" alt="this is a placeholder image" caption="This is a figure caption." %}
```html
-
+
+
+ This is a figure caption.
```
@@ -97,11 +80,11 @@ Generate a `
` element with optional caption of arrays with two or more i
To place a gallery add the necessary YAML Front Matter.
-| Name | Required | Description |
-| ---- | -------- | ----------- |
-| **url** | Optional | URL to link gallery image to (eg. a larger detail image). |
-| **image_path** | **Required** | Full path to image eg: `/assets/images/filename.jpg`. Use absolute URLS for those hosted externally. |
-| **alt** | Optional | Alternate text for image. |
+| Name | Required | Description |
+| -------------- | ------------ | --------------------------------------------------------------------------------------------------------------------- |
+| **url** | Optional | URL to link gallery image to (eg. a larger detail image). |
+| **image_path** | **Required** | Full path to image eg: `/assets/images/filename.jpg`. Use absolute URLS for those hosted externally. |
+| **alt** | Optional | Alternate text for image. |
| **title** | Optional | Title text for image. Will display as a caption in a Magnific Popup overlay when linked to a larger image with `url`. |
```yaml
@@ -120,13 +103,14 @@ gallery:
title: "Image 3 title caption"
```
-And then drop-in the gallery include in the body where you'd like it to appear.
+And then drop-in the gallery include in the body where you'd like it to appear.
-| Include Parameter | Required | Description | Default |
-| ----------------- | -------- | ----------- | ------- |
-| **id** | Optional | To add multiple galleries to a document uniquely name them in the YAML Front Matter and reference in `{% raw %}{% include gallery id="gallery_id" %}{% endraw %}` | `gallery` |
-| **class** | Optional | Use to add a `class` attribute to the surrounding `
` element for additional styling needs. | |
-| **caption** | Optional | Gallery caption description. Markdown is allowed. | |
+| Include Parameter | Required | Description | Default |
+| ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
+| **id** | Optional | To add multiple galleries to a document uniquely name them in the YAML Front Matter and reference in `{% raw %}{% include gallery id="gallery_id" %}{% endraw %}` | `gallery` |
+| **layout** | Optional | Layout type. 2 column: `half`, 3 column: `third`, single column: `''` (blank) | Determined by gallery size. Two items: `half`, three or more items: `third`. |
+| **class** | Optional | Use to add a `class` attribute to the surrounding `
` element for additional styling needs. | |
+| **caption** | Optional | Gallery caption description. Markdown is allowed. | |
```liquid
{% raw %}{% include gallery caption="This is a sample gallery with **Markdown support**." %}{% endraw %}
@@ -136,24 +120,25 @@ And then drop-in the gallery include in the body where you'd like it to appear.
{% include gallery caption="This is a sample gallery with **Markdown support**." %}
-**More Gallery Goodness:** A few more examples and [source code](https://github.com/{{ site.repository }}/blob/master/docs/_posts/2010-09-09-post-gallery.md) can be seen in [this sample gallery post]({{ "" | absolute_url }}{% post_url 2010-09-09-post-gallery %}).
+**More Gallery Goodness:** A few more examples and [source code](https://github.com/{{ site.repository }}/blob/master/docs/\_posts/2010-09-09-post-gallery.md) can be seen in [this sample gallery post]({{ "" | relative_url }}{% post_url 2010-09-09-post-gallery %}).
{: .notice--info}
-## Feature Row
+## Feature row
-Designed to compliment the [`splash`]({{ "/docs/layouts/#splash-page-layout" | absolute_url }}) page layout as a way of arranging and aligning "feature blocks" containing text or image.
+Designed to compliment the [`splash`]({{ "/docs/layouts/#splash-page-layout" | relative_url }}) page layout as a way of arranging and aligning "feature blocks" containing text or image.
To add a feature row containing three content blocks with text and image, add the following YAML Front Matter
-| Name | Required | Description | Default |
-| ---- | ----------- | ----------- | ------- |
-| **image_path** | **Required** | Full path to image eg: `/assets/images/filename.jpg`. Use absolute URLS for those hosted externally. | |
-| **alt** | Optional | Alternate text for image. | |
-| **title** | Optional | Content block title. | |
-| **excerpt** | Optional | Content block excerpt text. Markdown is allowed. | |
-| **url** | Optional | URL that the button should link to. | |
-| **btn_label** | Optional | Button text label. | `more_label` in UI Text data file. |
-| **btn_class** | Optional | Button style. See [utility classes]({{ "/docs/utility-classes/#buttons" | absolute_url }}) for options. | `btn` |
+| Name | Required | Description | Default |
+| ----------------- | ------------ | ---------------------------------------------------------------------------------------------------- | ---------------------------------- |
+| **image_path** | **Required** | Full path to image eg: `/assets/images/filename.jpg`. Use absolute URLS for those hosted externally. | |
+| **image_caption** | Optional | Caption for image, Markdown is supported eg: `"Image from [Unsplash](https://unsplash.com)"` |
+| **alt** | Optional | Alternate text for image. | |
+| **title** | Optional | Content block title. | |
+| **excerpt** | Optional | Content block excerpt text. Markdown is allowed. | |
+| **url** | Optional | URL that the button should link to. | |
+| **btn_label** | Optional | Button text label. | `more_label` in UI Text data file. |
+| **btn_class** | Optional | Button style. See [utility classes]({{ "/docs/utility-classes/#buttons" | relative_url }}) for options. | `btn` |
```yaml
feature_row:
@@ -175,10 +160,10 @@ feature_row:
And then drop-in the feature row include in the body where you'd like it to appear.
-| Include Parameter | Required | Description | Default |
-| ----------------- | -------- | ----------- | ------- |
-| **id** | Optional | To add multiple rows to a document uniquely name them in the YAML Front Matter and reference in `{% raw %}{% include feature_row id="row2" %}{% endraw %}` | `feature_row` |
-| **type** | Optional | Alignment of the featured blocks in the row. Options include: `left`, `center`, or `right` aligned. | |
+| Include Parameter | Required | Description | Default |
+| ----------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- |
+| **id** | Optional | To add multiple rows to a document uniquely name them in the YAML Front Matter and reference in `{% raw %}{% include feature_row id="row2" %}{% endraw %}` | `feature_row` |
+| **type** | Optional | Alignment of the featured blocks in the row. Options include: `left`, `center`, or `right` aligned. | |
```liquid
{% raw %}{% include feature_row %}{% endraw %}
@@ -186,82 +171,188 @@ And then drop-in the feature row include in the body where you'd like it to appe
{% include feature_row %}
-**More Feature Row Goodness:** A [few more examples]({{ "/splash-page/" | absolute_url }}) and [source code](https://github.com/{{ site.repository }}/blob/master/docs/_pages/splash-page.md) can be seen in the demo site.
+**More Feature Row Goodness:** A [few more examples]({{ "/splash-page/" | relative_url }}) and [source code](https://github.com/{{ site.repository }}/blob/master/docs/\_pages/splash-page.md) can be seen in the demo site.
{: .notice--info}
-## Responsive Video Embed
+## Responsive video embed
-Embed a video from YouTube or Vimeo that responsively sizes to fit the width of its parent.
+Embed a video from YouTube, Vimeo, Google Drive, or bilibili that responsively sizes to fit the width of its parent. To help with GDPR compliance, the theme is using the privacy enhanced version of YouTube and Vimeo providers out of the box.
-| Parameter | Required | Description |
-|---------- |--------- | ----------- |
-| `id` | **Required** | ID of the video |
-| `provider` | **Required** | Hosting provider of the video, either `youtube` or `vimeo` |
+| Parameter | Required | Description |
+| ---------- | ------------ | ---------------------------------------------------------- |
+| `id` | **Required** | ID of the video |
+| `provider` | **Required** | Hosting provider of the video: `youtube`, `vimeo`, `google-drive`, or `bilibili` |
+| `danmaku` | Optional | Bilibili only, [details below](#Bilibili) |
### YouTube
-To embed the following YouTube video at url `https://www.youtube.com/watch?v=XsxDH4HcOWA` (long version) or `https://youtu.be/XsxDH4HcOWA` (short version) into a post or page's main content you'd use:
+To embed the following YouTube video at url `https://www.youtube.com/watch?v=-PVofD2A9t8` (long version) or `https://youtu.be/-PVofD2A9t8` (short version) into a post or page's main content you'd use:
```liquid
-{% raw %}{% include video id="XsxDH4HcOWA" provider="youtube" %}{% endraw %}
+{% raw %}{% include video id="-PVofD2A9t8" provider="youtube" %}{% endraw %}
```
-{% include video id="XsxDH4HcOWA" provider="youtube" %}
+{% include video id="-PVofD2A9t8" provider="youtube" %}
To embed it as a video header you'd use the following YAML Front Matter
```yaml
header:
video:
- id: XsxDH4HcOWA
+ id: -PVofD2A9t8
provider: youtube
```
+**Tip:** if you'd like to start the video at a particular timestamp, you can append `?start=110` (for instance) to the video `id` in order to have the video start at 1:50.
+{: .notice--info }
+
### Vimeo
-To embed the following Vimeo video at url `https://vimeo.com/97649261` into a post or page's main content you'd use:
+To embed the following Vimeo video at url `https://vimeo.com/212731897` into a post or page's main content you'd use:
```liquid
-{% raw %}{% include video id="97649261" provider="vimeo" %}{% endraw %}
+{% raw %}{% include video id="212731897" provider="vimeo" %}{% endraw %}
```
-{% include video id="97649261" provider="vimeo" %}
+{% include video id="212731897" provider="vimeo" %}
To embed it as a video header you'd use the following YAML Front Matter
```yaml
header:
video:
- id: 97649261
+ id: 212731897
provider: vimeo
```
-## Table of Contents
+### Google Drive
+
+To embed the following Google Drive video at url `https://drive.google.com/file/d/1u41lIbMLbV53PvMbyYc9HzvBug5lNWaO/preview` into a post or page's main content you'd use:
+
+```liquid
+{% raw %}{% include video id="1u41lIbMLbV53PvMbyYc9HzvBug5lNWaO" provider="google-drive" %}{% endraw %}
+```
+
+{% include video id="1u41lIbMLbV53PvMbyYc9HzvBug5lNWaO" provider="google-drive" %}
+
+To embed it as a video header you'd use the following YAML Front Matter
+
+```yaml
+header:
+ video:
+ id: 212731897
+ provider: google-drive
+```
+
+### Bilibili
+
+To embed the following Bilibili video at url `https://www.bilibili.com/video/BV1E7411e7hC` into a post or page's main content you'd use:
+
+```liquid
+{% raw %}{% include video id="BV1E7411e7hC" provider="bilibili" %}{% endraw %}
+```
+
+If you want to enable danmaku (弹幕) for the embedded video, which is disabled by default, you can supply an additional parameter `danmaku="1"` as shown below:
+
+```liquid
+{% raw %}{% include video id="BV1E7411e7hC" provider="bilibili" danmaku="1" %}{% endraw %}
+```
+
+To embed it as a video header you'd use the following YAML Front Matter:
+
+```yaml
+header:
+ video:
+ id: BV1E7411e7hC
+ provider: bilibili
+ danmaku: 1
+```
+
+## Table of contents
+
+Auto-generated table of contents list for your posts and pages can be enabled using two methods.
+
+
+
+### Enabled via YAML Front Matter
+
+Add `toc: true` to the YAML Front Matter of any post or page.
+
+| Parameter | Required | Description | Default |
+| -------------- | -------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **toc** | Optional | Show table of contents. (boolean) | `false` |
+| **toc_label** | Optional | Table of contents title. (string) | `toc_label` in UI Text data file. |
+| **toc_icon** | Optional | Table of contents icon, displays before the title. (string) | [Font Awesome](https://fontawesome.com/v6/search?s=solid&m=free) **file-alt** icon. Other FA icons can be used instead. |
+| **toc_sticky** | Optional | Stick table of contents to top of screen. | `false` |
+
+**TOC example with custom title and icon**
+
+```yaml
+toc: true
+toc_label: "My Table of Contents"
+toc_icon: "cog"
+---
+
+```
+
+**Note:** using both methods will have unintended results. Be sure to remove `{% raw %}{% include toc %}{% endraw %}` placed table of contents from your content when using `toc: true`.
+{: .notice--warning }
+
+{% capture notice-text %}
+**Note:** You need to use contiguous levels of headings for the TOC to generate properly. For example:
+
+```markdown
+Good headings:
-To include an [auto-generated table of contents](https://kramdown.gettalong.org/converter/html.html#toc) for posts and pages, add the following helper before any actual content in your post or page.
+# Heading
+## Heading
+### Heading
+### Heading
+# Heading
+## Heading
+
+Bad headings:
+
+# Heading
+### Heading (skipped H2)
+##### Heading (skipped H4)
+```
+{% endcapture %}
+
+
+ {{ notice-text | markdownify }}
+
+
+### Enabled via `toc` include (deprecated)
+
+To include a Kramdown [auto-generated table of contents](https://kramdown.gettalong.org/converter/html.html#toc) for posts and pages, add the following helper to your content.
```liquid
{% raw %}{% include toc %}{% endraw %}
```
-
+**Note:** this method only works with Markdown files.
+{: .notice--warning}
+
+**Deprecated:** `toc` helper will be removed in the next major version of the theme. It is encouraged that you migrate to the YAML Front Matter method above.
+{: .notice--danger}
-| Parameter | Required | Description | Default |
-| --------- | -------- | ----------- | ------- |
-| **title** | Optional | Table of contents title. | `toc_label` in UI Text data file. |
-| **icon** | Optional | Table of contents icon (shows before the title). | [Font Awesome](https://fortawesome.github.io/Font-Awesome/icons/) **file-text** icon. Any other FA icon can be used instead. |
+| Parameter | Required | Description | Default |
+| --------- | -------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **title** | Optional | Table of contents title. (string) | `toc_label` in UI Text data file. |
+| **icon** | Optional | Table of contents icon, displays before the title. (string) | [Font Awesome](https://fontawesome.com/v6/search?s=solid&m=free) **file-alt** icon. Other FA icons can be used instead. |
**TOC example with custom title and icon**
```liquid
-{% raw %}{% include toc icon="gears" title="My Table of Contents" %}{% endraw %}
+{% raw %}{% include toc icon="cog" title="My Table of Contents" %}{% endraw %}
```
-## Navigation List
+## Navigation list
Include an unordered list of links to be used as sidebar navigation with the `nav_list` helper.
-**1.** Start by adding a set of titles and URLs to `_data/navigation.yml` in the same way the [`main` navigation]({{ "/docs/navigation/" | absolute_url }}) is built.
+**1.** Start by adding a set of titles and URLs to `_data/navigation.yml` in the same way the [`main` navigation]({{ "/docs/navigation/" | relative_url }}) is built.
`foo` navigation example:
@@ -325,6 +416,6 @@ To add a navigation list to a post or page's main content instead of the sidebar
{% include nav_list nav="foo" %}
-| Parameter | Required | Description |
-| --------- | -------- | ----------- |
+| Parameter | Required | Description |
+| --------- | ------------ | -------------------------------------------------------- |
| items | **Required** | Name of the links array found in `_data/navigation.yml`. |
diff --git a/docs/_docs/15-utility-classes.md b/docs/_docs/15-utility-classes.md
index 76c262e89d8e..3e20023f0e70 100644
--- a/docs/_docs/15-utility-classes.md
+++ b/docs/_docs/15-utility-classes.md
@@ -2,17 +2,18 @@
title: "Utility Classes"
permalink: /docs/utility-classes/
excerpt: "CSS classes for aligning text/image, styling buttons and notices, and more."
-last_modified_at: 2016-11-03T11:32:25-04:00
+last_modified_at: 2018-11-25T19:46:43-05:00
+toc: true
+toc_label: "Utility Classes"
+toc_icon: "cogs"
---
-{% include toc icon="gears" title="Utility Classes" %}
-
Using the Kramdown Markdown renderer with Jekyll allows you to add [block](http://kramdown.gettalong.org/quickref.html#block-attributes) and [inline attributes](http://kramdown.gettalong.org/quickref.html#inline-attributes). This is nice if you want to add custom styling to text and image, and still write in Markdown.
**Jekyll 3:** Kramdown is the default for `jekyll new` sites and those hosted on GitHub Pages. Not using Kramdown? That's OK. The following classes are still available when used with standard HTML.
{: .notice--warning}
-## Text Alignment
+## Text alignment
Align text blocks with the following classes.
@@ -64,11 +65,11 @@ No wrap text.
{: .text-nowrap}
```
-## Image Alignment
+## Image alignment
Position images with the following classes.
-{: .align-center}
+{: .align-center}
The image above happens to be **centered**.
@@ -78,7 +79,7 @@ The image above happens to be **centered**.
---
-{: .align-left} The rest of this paragraph is filler for the sake of seeing the text wrap around the 150×150 image, which is **left aligned**. There should be plenty of room above, below, and to the right of the image. Just look at him there --- Hey guy! Way to rock that left side. I don't care what the right aligned image says, you look great. Don't let anyone else tell you differently.
+{: .align-left} The rest of this paragraph is filler for the sake of seeing the text wrap around the 150×150 image, which is **left aligned**. There should be plenty of room above, below, and to the right of the image. Just look at him there --- Hey guy! Way to rock that left side. I don't care what the right aligned image says, you look great. Don't let anyone else tell you differently.
```markdown
{: .align-left}
@@ -86,7 +87,7 @@ The image above happens to be **centered**.
---
-{: .align-right}
+{: .align-right}
And now we're going to shift things to the **right align**. Again, there should be plenty of room above, below, and to the left of the image. Just look at him there --- Hey guy! Way to rock that right side. I don't care what the left aligned image says, you look great. Don't let anyone else tell you differently.
@@ -96,7 +97,7 @@ And now we're going to shift things to the **right align**. Again, there should
---
-
+
{: .full}
The image above should extend outside of the parent container on right.
@@ -108,15 +109,16 @@ The image above should extend outside of the parent container on right.
## Buttons
-Make any link standout more when applying the `.btn` class.
+Make any link standout more when applying the `.btn .btn--primary` classes.
```html
-Link Text
+Link Text
```
| Button Type | Example | Class | Kramdown |
| ------ | ------- | ----- | ------- |
| Default | [Text](#link){: .btn} | `.btn` | `[Text](#link){: .btn}` |
+| Primary | [Text](#link){: .btn .btn--primary} | `.btn .btn--primary` | `[Text](#link){: .btn .btn--primary}` |
| Success | [Text](#link){: .btn .btn--success} | `.btn .btn--success` | `[Text](#link){: .btn .btn--success}` |
| Warning | [Text](#link){: .btn .btn--warning} | `.btn .btn--warning` | `[Text](#link){: .btn .btn--warning}` |
| Danger | [Text](#link){: .btn .btn--danger} | `.btn .btn--danger` | `[Text](#link){: .btn .btn--danger}` |
@@ -126,10 +128,10 @@ Make any link standout more when applying the `.btn` class.
| Button Size | Example | Class | Kramdown |
| ----------- | ------- | ----- | -------- |
-| X-Large | [X-Large Button](#){: .btn .btn--x-large} | `.btn .btn--x-large` | `[Text](#link){: .btn .btn--x-large}` |
-| Large | [Large Button](#){: .btn .btn--large} | `.btn .btn--large` | `[Text](#link){: .btn .btn--large}` |
-| Default | [Default Button](#){: .btn} | `.btn` | `[Text](#link){: .btn}` |
-| Small | [Small Button](#){: .btn .btn--small} | `.btn .btn--small` | `[Text](#link){: .btn .btn--small}` |
+| X-Large | [X-Large Button](#){: .btn .btn--primary .btn--x-large} | `.btn .btn--primary .btn--x-large` | `[Text](#link){: .btn .btn--primary .btn--x-large}` |
+| Large | [Large Button](#){: .btn .btn--primary .btn--large} | `.btn .btn--primary .btn--large` | `[Text](#link){: .btn .btn--primary .btn--large}` |
+| Default | [Default Button](#){: .btn .btn--primary} | `.btn .btn--primary` | `[Text](#link){: .btn .btn--primary }` |
+| Small | [Small Button](#){: .btn .btn--primary .btn--small} | `.btn .btn--primary .btn--small` | `[Text](#link){: .btn .btn--primary .btn--small}` |
## Notices
@@ -144,22 +146,22 @@ Call attention to a block of text.
| Success | `.notice--success` |
| Danger | `.notice--danger` |
-**Watch out!** This paragraph of text has been emphasized with the `{: .notice}` class.
+**Watch out!** This paragraph of text has been [emphasized](#) with the `{: .notice}` class.
{: .notice}
-**Watch out!** This paragraph of text has been emphasized with the `{: .notice--primary}` class.
+**Watch out!** This paragraph of text has been [emphasized](#) with the `{: .notice--primary}` class.
{: .notice--primary}
-**Watch out!** This paragraph of text has been emphasized with the `{: .notice--info}` class.
+**Watch out!** This paragraph of text has been [emphasized](#) with the `{: .notice--info}` class.
{: .notice--info}
-**Watch out!** This paragraph of text has been emphasized with the `{: .notice--warning}` class.
+**Watch out!** This paragraph of text has been [emphasized](#) with the `{: .notice--warning}` class.
{: .notice--warning}
-**Watch out!** This paragraph of text has been emphasized with the `{: .notice--success}` class.
+**Watch out!** This paragraph of text has been [emphasized](#) with the `{: .notice--success}` class.
{: .notice--success}
-**Watch out!** This paragraph of text has been emphasized with the `{: .notice--danger}` class.
+**Watch out!** This paragraph of text has been [emphasized](#) with the `{: .notice--danger}` class.
{: .notice--danger}
{% capture notice-text %}
@@ -170,6 +172,6 @@ You can also add the `.notice` class to a `
` element.
{% endcapture %}
-
Notice Headline:
+
Notice Headline:
{{ notice-text | markdownify }}
diff --git a/docs/_docs/16-stylesheets.md b/docs/_docs/16-stylesheets.md
index c1181f770eff..c8acf05146d5 100644
--- a/docs/_docs/16-stylesheets.md
+++ b/docs/_docs/16-stylesheets.md
@@ -2,7 +2,8 @@
title: "Stylesheets"
permalink: /docs/stylesheets/
excerpt: "Instructions for customizing and building the theme's stylesheets."
-last_modified_at: 2017-04-18T12:34:31-04:00
+last_modified_at: 2018-11-25T19:47:43-05:00
+toc: true
---
The theme's `assets/css/main.css` file is built from several SCSS partials located in [`_sass/`](https://github.com/mmistakes/minimal-mistakes/tree/master/_sass) and is structured as follows:
@@ -13,7 +14,6 @@ minimal-mistakes
| └── minimal-mistakes
| ├── vendor # vendor SCSS partials
| | ├── breakpoint # media query mixins
-| | ├── font-awesome # Font Awesome icons
| | ├── magnific-popup # Magnific Popup lightbox
| | └── susy # Susy grid system
| ├── _animations.scss # animations
@@ -40,29 +40,29 @@ minimal-mistakes
## Customizing
-To override the default [Sass](http://sass-lang.com/guide) (located in theme's
+To override the default [Sass](http://sass-lang.com/guide) (located in theme's
`_sass` directory), do one of the following:
1. Copy directly from the Minimal Mistakes theme gem
- - Go to your local Minimal Mistakes gem installation directory (run
+ - Go to your local Minimal Mistakes gem installation directory (run
`bundle show minimal-mistakes-jekyll` to get the path to it).
- - Copy the contents of `/assets/css/main.scss` from there to
+ - Copy the contents of `/assets/css/main.scss` from there to
``.
- Customize what you want inside `/assets/css/main.scss`.
2. Copy from this repo.
- - Copy the contents of [assets/css/main.scss](https://github.com/mmistakes/minimal-mistakes/blob/master/assets/css/main.scss)
+ - Copy the contents of [assets/css/main.scss](https://github.com/mmistakes/minimal-mistakes/blob/master/assets/css/main.scss)
to ``.
- Customize what you want inside `` due to the way Jekyll currently reads those files.
-To make basic tweaks to theme's style Sass variables can be overridden by adding
-to `/assets/css/main.scss`. For instance, to change the
+To make basic tweaks to theme's style Sass variables can be overridden by adding
+to `/assets/css/main.scss`. For instance, to change the
link color used throughout the theme add:
```scss
@@ -71,36 +71,34 @@ $link-color: red;
Before any `@import` lines.
-### Paragraph Indention
+### Paragraph indention
To mimic the look of type set in a printed book or manuscript you may want to enable paragraph indention. When `$paragraph-indent` is set to `true` indents are added to each sibling and the margin below each paragraph is removed.
-
+ Example of indented paragraphs.
The size of the indent can also be customized by changing the value of `$indent-var`.
-### Font Stacks
+### Font stacks
-By default the theme uses [system fonts](https://medium.com/designing-medium/system-shock-6b1dc6d6596f#.rb81vgn7i) for all of the font stacks (serif, sans-serif, and monospace). This is done in part to provide a clean base for you to build off of and to improve performance since we aren't loading any custom webfonts[^font-awesome] by default.
+By default the theme uses [system fonts](https://medium.com/designing-medium/system-shock-6b1dc6d6596f#.rb81vgn7i) for all of the font stacks (serif, sans-serif, and monospace). This is done in part to provide a clean base for you to build off of and to improve performance since we aren't loading any custom webfonts by default.
```scss
/* system typefaces */
$serif : Georgia, Times, serif;
-$sans-serif : -apple-system, ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", Arial, sans-serif;
+$sans-serif : -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", Arial, sans-serif;
$monospace : Monaco, Consolas, "Lucida Console", monospace;
```
-[^font-awesome]: Apart from [Font Awesome](https://fortawesome.github.io/Font-Awesome/) icon webfonts.
-
Sans-serif fonts have been used for most of the type, with serifs reserved for captions. If you wish to change this you'll need to poke around the various `SCSS` partials and modify `font-family` declarations.
**ProTip:** To use webfonts from services like [Adobe TypeKit](https://typekit.com/) or [Google Fonts](https://www.google.com/fonts) simply update the font stacks and then add their scripts to `_includes/head/custom.html`.
{: .notice--info}
-#### Typography from Older Versions
+#### Typography from older versions
Not a fan of the refreshed typography of the theme and want to revert back an older version? Easy enough.
@@ -114,15 +112,15 @@ Not a fan of the refreshed typography of the theme and want to revert back an ol
```scss
$serif : "PT Serif", Georgia, Times, serif;
-$sans-serif-narrow : "PT Sans Narrow", -apple-system, ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", Arial, sans-serif;
+$sans-serif-narrow : "PT Sans Narrow", -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", Arial, sans-serif;
$global-font-family : $serif;
$header-font-family : $sans-serif-narrow;
```
-### Type Scale
+### Type scale
-Wherever possible type scale variables have been used instead of writing out fixed sizes. This makes updating much easier by changing values in one file.
+Wherever possible type scale variables have been used instead of writing out fixed sizes. This makes updating much easier by changing values in one file.
Example:
@@ -149,20 +147,243 @@ $type-size-8 : 0.625em; // ~10px
### Colors
-Change the mood of your site by altering a few color variables. `$body-color`, `$background-color`, `$text-color`, `$link-color`, and `$masthead-link-color` will have the most affect when changed.
+Change the mood of your site by altering a few color variables. `$body-color`, `$background-color`, `$text-color`, `$link-color`, and `$masthead-link-color` will have the most effect when changed.
+
+#### Syntax highlighting
+
+To make customizing the colors used in code highlighted blocks, a base of sixteen colors ([Base16](http://chriskempson.com/projects/base16/)) have been used.
+
+Code block colors can easily be changed by overriding any of the following color variables:
+
+##### Default
+
+
+
+```scss
+/* default syntax highlighting (base16) */
+$base00: #263238;
+$base01: #2e3c43;
+$base02: #314549;
+$base03: #546e7a;
+$base04: #b2ccd6;
+$base05: #eeffff;
+$base06: #eeffff;
+$base07: #ffffff;
+$base08: #f07178;
+$base09: #f78c6c;
+$base0a: #ffcb6b;
+$base0b: #c3e88d;
+$base0c: #89ddff;
+$base0d: #82aaff;
+$base0e: #c792ea;
+$base0f: #ff5370;
+```
+
+##### Solarized light
+
+
+
+```scss
+/* solarized light syntax highlighting (base16) */
+$base00: #fafafa !default;
+$base01: #073642 !default;
+$base02: #586e75 !default;
+$base03: #657b83 !default;
+$base04: #839496 !default;
+$base05: #586e75 !default;
+$base06: #eee8d5 !default;
+$base07: #fdf6e3 !default;
+$base08: #dc322f !default;
+$base09: #cb4b16 !default;
+$base0a: #b58900 !default;
+$base0b: #859900 !default;
+$base0c: #2aa198 !default;
+$base0d: #268bd2 !default;
+$base0e: #6c71c4 !default;
+$base0f: #d33682 !default;
+```
+
+##### Contrast
+
+
+
+```scss
+/* contrast syntax highlighting (base16) */
+$base00: #000000;
+$base01: #242422;
+$base02: #484844;
+$base03: #6c6c66;
+$base04: #918f88;
+$base05: #b5b3aa;
+$base06: #d9d7cc;
+$base07: #fdfbee;
+$base08: #ff6c60;
+$base09: #e9c062;
+$base0a: #ffffb6;
+$base0b: #a8ff60;
+$base0c: #c6c5fe;
+$base0d: #96cbfe;
+$base0e: #ff73fd;
+$base0f: #b18a3d;
+```
+
+##### Dark
+
+
+
+```scss
+/* dark syntax highlighting (base16) */
+$base00: #ffffff;
+$base01: #e0e0e0;
+$base02: #d0d0d0;
+$base03: #b0b0b0;
+$base04: #000000;
+$base05: #101010;
+$base06: #151515;
+$base07: #202020;
+$base08: #ff0086;
+$base09: #fd8900;
+$base0a: #aba800;
+$base0b: #00c918;
+$base0c: #1faaaa;
+$base0d: #3777e6;
+$base0e: #ad00a1;
+$base0f: #cc6633;
+```
+
+##### Dirt
+
+
+
+```scss
+/* dirt syntax highlighting (base16) */
+$base00: #231e18;
+$base01: #302b25;
+$base02: #48413a;
+$base03: #9d8b70;
+$base04: #b4a490;
+$base05: #cabcb1;
+$base06: #d7c8bc;
+$base07: #e4d4c8;
+$base08: #d35c5c;
+$base09: #ca7f32;
+$base0a: #e0ac16;
+$base0b: #b7ba53;
+$base0c: #6eb958;
+$base0d: #88a4d3;
+$base0e: #bb90e2;
+$base0f: #b49368;
+```
+
+##### Dracula
+
+
+
+```scss
+/* dracula syntax highlighting (base16) */
+/* https://github.com/dracula/base16-dracula-scheme */
+$base00: #282936;
+$base01: #3a3c4e;
+$base02: #4d4f68;
+$base03: #626483;
+$base04: #62d6e8;
+$base05: #e9e9f4;
+$base06: #f1f2f8;
+$base07: #f7f7fb;
+$base08: #ea51b2;
+$base09: #b45bcf;
+$base0a: #00f769;
+$base0b: #ebff87;
+$base0c: #a1efe4;
+$base0d: #62d6e8;
+$base0e: #b45bcf;
+$base0f: #00f769;
+```
+
+##### Neon
+
+
+
+```scss
+/* neon syntax highlighting (base16) */
+$base00: #ffffff;
+$base01: #e0e0e0;
+$base02: #d0d0d0;
+$base03: #b0b0b0;
+$base04: #000000;
+$base05: #101010;
+$base06: #151515;
+$base07: #202020;
+$base08: #ff0086;
+$base09: #fd8900;
+$base0a: #aba800;
+$base0b: #00c918;
+$base0c: #1faaaa;
+$base0d: #3777e6;
+$base0e: #ad00a1;
+$base0f: #cc6633;
+```
+
+##### Plum
+
+
+
+```scss
+/* plum syntax highlighting (base16) */
+$base00: #ffffff;
+$base01: #e0e0e0;
+$base02: #d0d0d0;
+$base03: #b0b0b0;
+$base04: #000000;
+$base05: #101010;
+$base06: #151515;
+$base07: #202020;
+$base08: #ff0086;
+$base09: #fd8900;
+$base0a: #aba800;
+$base0b: #00c918;
+$base0c: #1faaaa;
+$base0d: #3777e6;
+$base0e: #ad00a1;
+$base0f: #cc6633;
+```
+
+##### Sunrise
+
+
+
+```scss
+/* sunrise syntax highlighting (base16) */
+$base00: #1d1f21;
+$base01: #282a2e;
+$base02: #373b41;
+$base03: #969896;
+$base04: #b4b7b4;
+$base05: #c5c8c6;
+$base06: #e0e0e0;
+$base07: #ffffff;
+$base08: #cc6666;
+$base09: #de935f;
+$base0a: #f0c674;
+$base0b: #b5bd68;
+$base0c: #8abeb7;
+$base0d: #81a2be;
+$base0e: #b294bb;
+$base0f: #a3685a;
+```
-### Breakpoints and Grid Stuff
+### Breakpoints and grid stuff
Probably won't need to touch these, but they're there if you need to. Width variables are used with the [`@include breakpoint()`](http://breakpoint-sass.com/) mixin to adapt the design of certain elements.
And `$susy` is used for setting [the grid](http://susy.oddbird.net/) the theme uses. Uncommenting the lines under `debug` can be useful if you want to show the columns when adjusting the layout.
-
+ Susy grid debug overlay enabled.
-### Disabling Animations
+### Disabling animations
You can disable either the fade-in intro animation, element transition animations, or both by overriding the corresponding variables. For example if you wanted to disable all animations you could include the following lines:
diff --git a/docs/_docs/17-javascript.md b/docs/_docs/17-javascript.md
index 99ec537c5d0a..919315cb5d8c 100644
--- a/docs/_docs/17-javascript.md
+++ b/docs/_docs/17-javascript.md
@@ -2,25 +2,27 @@
title: "JavaScript"
permalink: /docs/javascript/
excerpt: "Instructions for customizing and building the theme's scripts."
-last_modified_at: 2016-11-03T11:35:42-04:00
+last_modified_at: 2021-07-23T09:33:35-04:00
---
-The theme's [`assets/js/main.min.js`] script is built from several vendor, jQuery plugins, and other scripts found in [`assets/js/`](https://github.com/mmistakes/minimal-mistakes/tree/master/assets/js).
+The theme's `assets/js/main.min.js` script is built from several vendor, jQuery plugins, and other scripts found in [`assets/js/`](https://github.com/mmistakes/minimal-mistakes/tree/master/assets/js).
```bash
minimal mistakes
├── assets
| ├── js
| | ├── plugins
-| | | ├── jquery.fitvids.js # fluid width video embeds
-| | | ├── jquery.greedy-navigation.js # priority plus navigation
-| | | ├── jquery.magnific-popup.js # responsive lightbox
-| | | └── jquery.smooth-scroll.min.js # make same-page links scroll smoothly
+| | | ├── gumshoe.js # simple scrollspy
+| | | ├── jquery.ba-throttle-debounce.js # rate-limit functions
+| | | ├── jquery.fitvids.js # fluid width video embeds
+| | | ├── jquery.greedy-navigation.js # priority plus navigation
+| | | ├── jquery.magnific-popup.js # responsive lightbox
+| | | └── smooth-scroll.js # make same-page links scroll smoothly
| | ├── vendor
| | | └── jquery
-| | | └── jquery-1.12.1.min.js
-| | ├── _main.js # jQuery plugin settings and other scripts
-| | └── main.min.js # concatenated and minified scripts
+| | | └── jquery-3.5.1.js
+| | ├── _main.js # jQuery plugin settings and other scripts
+| | └── main.min.js # concatenated and minified theme script
```
## Customizing
@@ -29,9 +31,26 @@ To modify or add your own scripts include them in [`assets/js/_main.js`](https:/
If you add additional scripts to `assets/js/plugins/` and would like them concatenated with the others, be sure to update the `uglify` script in [`package.json`](https://github.com/mmistakes/minimal-mistakes/blob/master/package.json). Same goes for scripts that you remove.
+You can also add scripts to the `` or closing `` elements by adding paths to following arrays in `_config.yml`.
+
+**Example:**
+
+```yaml
+head_scripts:
+ - https://code.jquery.com/jquery-3.3.1.min.js
+ - /assets/js/your-custom-head-script.js
+footer_scripts:
+ - /assets/js/your-custom-footer-script.js
+after_footer_scripts:
+ - /assets/js/custom-script-loads-after-footer.js
+```
+
+**Note:** If you assign `footer_scripts` the theme's `/assets/js/main.min.js` file will be deactivated. This script includes jQuery and various other plugins that you'll need to find replacements for and include separately.
+{: .notice--warning}
+
---
-## Build Process
+## Build process
In an effort to reduce dependencies a set of [**npm scripts**](https://css-tricks.com/why-npm-scripts/) are used to build `main.min.js` instead of task runners like [Gulp](http://gulpjs.com/) or [Grunt](http://gruntjs.com/). If those tools are more your style then by all means use them instead :wink:.
@@ -44,4 +63,20 @@ To get started:
**Note:** If you upgraded from a previous version of the theme be sure you copied over [`package.json`](https://github.com/{{ site.repository }}/blob/master/package.json) prior to running `npm install`.
{: .notice--warning}
-If all goes well, running `npm run build:js` will compress/concatenate `_main.js` and all plugin scripts into `main.min.js`.
\ No newline at end of file
+If all goes well, running `npm run build:js` will compress/concatenate `_main.js` and all plugin scripts into `main.min.js`.
+
+## Debugging
+
+The minified JavaScript is harder to debug in the browser than the raw source. To stop the minification and bundle all the JavaScript as-is --- open up `package.json` and edit the value `scripts.uglify` from:
+
+```json
+ "scripts": {
+ "uglify": "uglifyjs [...] -c -m -o assets/js/main.min.js",
+```
+
+To the following:
+
+```json
+ "scripts": {
+ "uglify": "cat [...] > assets/js/main.min.js",
+```
diff --git a/docs/_docs/18-history.md b/docs/_docs/18-history.md
index f695a33dc77b..c471f4fee6ec 100644
--- a/docs/_docs/18-history.md
+++ b/docs/_docs/18-history.md
@@ -1,12 +1,933 @@
---
-title: "History"
-permalink: /docs/history/
-excerpt: "Change log of enhancements and bug fixes made to the theme."
+title: History
+classes: wide
+permalink: "/docs/history/"
+excerpt: Change log of enhancements and bug fixes made to the theme.
sidebar:
nav: docs
-last_modified_at: 2017-09-06T15:12:52-04:00
+last_modified_at: '2026-03-09T13:23:46+08:00'
+toc: false
---
+
+
+{% raw %}
+## Unreleased
+
+### Enhancements
+
+- Updated Traditional Chinese translation [#5250](https://github.com/mmistakes/minimal-mistakes/issues/5250)
+- Add built-in support for jekyll-gfm-admonitions [#5312](https://github.com/mmistakes/minimal-mistakes/issues/5312)
+- Add Latte and Mocha skins from Catppuccin project [#5341](https://github.com/mmistakes/minimal-mistakes/issues/5341)
+- Add support for Swetrix, a GDPR-compliant analytics provider [#5344](https://github.com/mmistakes/minimal-mistakes/issues/5344)
+- Support resolving `ui-text` using `page.locale` when available [#5439](https://github.com/mmistakes/minimal-mistakes/issues/5439)
+- Add `aria-label` to all nav elements for WCAG compliance [#5442](https://github.com/mmistakes/minimal-mistakes/issues/5442)
+- Add IndieWeb microformat support and configurable footer `rel` attribute [#5443](https://github.com/mmistakes/minimal-mistakes/issues/5443)
+- Add `og:image:alt` and `twitter:image:alt` support [#5444](https://github.com/mmistakes/minimal-mistakes/issues/5444)
+- Minor changes to the PR auto labeling GitHub Actions workflow
+
+## [4.27.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.27.3)
+
+### Bug Fixes
+
+- Add explicit CSS rules for `.sr-only` following Font Awesome 7's changes. [#5296](https://github.com/mmistakes/minimal-mistakes/issues/5296)
+
+## [4.27.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.27.2)
+
+### Enhancements
+
+- Hide `.page__footer-follow` if there are no links nor atom feed. [#5279](https://github.com/mmistakes/minimal-mistakes/issues/5279)
+- Add HTML escaping for some titles, labels and metada that was missing. [#5276](https://github.com/mmistakes/minimal-mistakes/issues/5276)
+- Add optional `footer.since` for copyright time range. [#5275](https://github.com/mmistakes/minimal-mistakes/issues/5275)
+
+### Bug Fixes
+
+- Add `escape_once` to gallery title and alt text.
+
+## [4.27.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.27.1)
+
+### Enhancements
+
+- Add a "Share on Bluesky" button [#5179](https://github.com/mmistakes/minimal-mistakes/issues/5179)
+- Add preset variables for modern font stack [#5033](https://github.com/mmistakes/minimal-mistakes/issues/5033)
+- Update X share button to match brand color [#5245](https://github.com/mmistakes/minimal-mistakes/issues/5245)
+
+### Bug Fixes
+
+- Fix wrong icon and color for X share button.
+
+## [4.27.0](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.27.0)
+
+### Enhancements
+
+- Add RTL Support. [#4886](https://github.com/mmistakes/minimal-mistakes/pull/4886)
+- Add missing Polish translation. [#4890](https://github.com/mmistakes/minimal-mistakes/pull/4890)
+- Rewrite most directions with [CSS logical properties](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_logical_properties_and_values).
+- Remove unnecessary "type" attribute [#4956](https://github.com/mmistakes/minimal-mistakes/issues/4956)
+- The "if" means the default is never used [#4955](https://github.com/mmistakes/minimal-mistakes/issues/4955)
+- For pages without a title, show the site title only once [#4959](https://github.com/mmistakes/minimal-mistakes/issues/4959)
+- Use `documents-collection.html` partial in `home` layout.
+- Add Bulgarian translation. [#5003](https://github.com/mmistakes/minimal-mistakes/pull/5003)
+- Add provider and comments info to `single.html` layout for non-production. [#5068](https://github.com/mmistakes/minimal-mistakes/issues/5068)
+- Tweak contrast skin $primary-color to adhere to WCAG guidelines. [#5126](https://github.com/mmistakes/minimal-mistakes/issues/5126)
+- Update social share buttons to reflect Twitter rebranding to X [#5210](https://github.com/mmistakes/minimal-mistakes/issues/5210)
+
+### Bug Fixes
+
+- Replace a redirected link to MadeMistakes in footer. [#4882](https://github.com/mmistakes/minimal-mistakes/pull/4882)
+- Fix wrong float direction for `feature_row` with `type="right"`. [#4061](https://github.com/mmistakes/minimal-mistakes/issues/4061)
+- Fix reset stylesheet overruling `$doc-font-size`. [#4983](https://github.com/mmistakes/minimal-mistakes/issues/4983)
+- Fix JavaScript null error on home and splash layouts. [#4938](https://github.com/mmistakes/minimal-mistakes/issues/4938), [#4939](https://github.com/mmistakes/minimal-mistakes/pull/4939)
+- Fix bad <figure> HTML if "alt" contains quotes.
+- Fix extra newline generated in `_includes/post_pagination.html`.
+- Hide hidden links & remove the overlay when one is clicked. [#5042](https://github.com/mmistakes/minimal-mistakes/pull/5042)
+- Fix typo in "Configuration" [#5106](https://github.com/mmistakes/minimal-mistakes/issues/5106)
+- bundle exec jekyll serve will fail if more than once [#5193](https://github.com/mmistakes/minimal-mistakes/issues/5193)
+
+### Documentation & Maintenance
+
+- Automatically update Algolia search index with GitHub Actions.
+
+## [4.26.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.26.2)
+
+### Enhancements
+
+- Add Czech localization. [#4866](https://github.com/mmistakes/minimal-mistakes/pull/4866)
+- Allow overriding HTML `lang` attribute on a per-page basis. [#4862](https://github.com/mmistakes/minimal-mistakes/pull/4862)
+
+### Bug Fixes
+
+- Figure helper breaks when using code markup in caption with `popup=true`. [#4841](https://github.com/mmistakes/minimal-mistakes/issues/4841)
+
+## [4.26.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.26.1)
+
+### Bug Fixes
+
+- Disable copy button on invalid syntax highlighting blocks to avoid positioning issues.
+- Fix typo for `fa-dribbble` in `_utilities.scss`.
+- Restrict "auto scroll sticky ToC to content" feature to Chromium browsers for now. [#4826](https://github.com/mmistakes/minimal-mistakes/issues/4826)
+
+### Documentation & Maintenance
+
+- Rewrite social icons SCSS with a loop.
+
+### Enhancements
+
+- Change the icon of a copy button into a tick for 1.5 seconds on successful copy.
+
+## [4.26.0](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.26.0)
+
+### Bug Fixes
+
+- Fix an unclosed `
` and before `` to be added/overridden with `head_scripts` and `footer_scripts` arrays in `_config.yml`. [#1241](https://github.com/mmistakes/minimal-mistakes/pull/1241)
+- Update JavaScript dependencies: jQuery `v3.2.1`, jQuery Smooth Scroll `v2.2.0`, and Magnific Popup `v1.1.0`. [#328690652](https://github.com/mmistakes/minimal-mistakes/pull/1241#issuecomment-328690652)
+
## [4.5.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.5.2)
### Enhancements
@@ -27,9 +948,9 @@ last_modified_at: 2017-09-06T15:12:52-04:00
- Fix license URL in README file. [#1189](https://github.com/mmistakes/minimal-mistakes/pull/1189)
- Reduce amount of blank pages when printing in Chrome. [#1196](https://github.com/mmistakes/minimal-mistakes/issues/1196)
-- Remove `#disqus_thread` duplicate from `comments-providers/disqus.html` as it is already in `comments.html` include. [#1199](https://github.com/mmistakes/minimal-mistakes/issues/1199)
+- Remove `#disqus_thread` duplicate from `comments-providers/disqus.html` as it is already in `comments.html` include. [#1199](https://github.com/mmistakes/minimal-mistakes/issues/1199)
- Fix Liquid syntax errors in `tag-list.html` and `category-list.html` includes by removing parenthesis in `assign`s. [#1223](https://github.com/mmistakes/minimal-mistakes/issues/1223)
-- Fix Liquid syntax error: "Expected id but found open_square in {% raw %}`"{{page.[include.id] }}"`"{% endraw %} in `gallery` and `feature_row` includes.
+- Fix Liquid syntax error: "Expected id but found open_square in `"{{ page.[include.id] }}"`" in `gallery` and `feature_row` includes.
- Fix Liquid syntax error: "Expected end_of_string but found pipe in `"name in __names | sort"`" in `group-by-array` include.
## [4.5.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.5.1)
@@ -118,7 +1039,7 @@ last_modified_at: 2017-09-06T15:12:52-04:00
### Enhancements
-- Move SCSS partials to `/_sass/minimal-mistakes` for easier CSS customization.
+- Move SCSS partials to `/_sass/minimal-mistakes` for easier CSS customization.
- Replace `modified` with `last_modified_at` to leverage various Jekyll plugins that utilize this variable. [#930](https://github.com/mmistakes/minimal-mistakes/pull/930)
- Add Lithuanian localized UI text. [#924](https://github.com/mmistakes/minimal-mistakes/pull/924)
- Improve print stylesheet by increasing text contrast, removing elements that don't need to be printed, expanding URLs, and reducing amount of blank pages. [#909](https://github.com/mmistakes/minimal-mistakes/issues/909)
@@ -140,10 +1061,10 @@ last_modified_at: 2017-09-06T15:12:52-04:00
### Enhancements
- Add workaround to allow theme gem's `/assets/js/main.min.js` file to be overridden by a local version. Simply add the following YAML Front Matter to the file:
-
+
```
---
- layout:
+ layout:
---
```
@@ -251,7 +1172,7 @@ last_modified_at: 2017-09-06T15:12:52-04:00
### Enhancements
-- Add `!default` values to **_sass/_variables.scss**.
+- Add `!default` values to **\_sass/\_variables.scss**.
- Collapse sidebar navigation lists on smaller screens. [#607](https://github.com/mmistakes/minimal-mistakes/issues/607)
### Bug Fixes
@@ -275,7 +1196,7 @@ last_modified_at: 2017-09-06T15:12:52-04:00
### Maintenance
-- Clarify "migrating to gem-theme" instructions in **Quick Start Guide**.
+- Clarify "migrating to gem-theme" instructions in **Quick Start Guide**.
- Add `rake preview` task for testing `/test` during theme development.
## [4.0.5](https://github.com/mmistakes/minimal-mistakes/releases/tag/4.0.5)
@@ -298,12 +1219,12 @@ last_modified_at: 2017-09-06T15:12:52-04:00
### Enhancements
- "Gemify" theme ~> `gem "minimal-mistakes-jekyll"`
-- Replace `base_path` include with `absolute_url` filter where possible.
+- Replace `base_path` include with `relative_url` filter where possible.
- Allow images to be placed in other folders. Remove `/images/` only restriction and encourage placement in `/assets/images/` instead. **Full paths are now required. If upgrading from MM 3.4 add `/images/` before filenames in Front Matter and `_config.yml` variables.**
- Add [home `layout`](https://github.com/mmistakes/minimal-mistakes/blob/master/_layouts/home.html)
- Added missing Turkish translations for UI text. [#621](https://github.com/mmistakes/minimal-mistakes/pull/621)
- Make author avatar optional in sidebar.
-- Update **/_includes/seo.html** for meta description. [#558](https://github.com/mmistakes/minimal-mistakes/pull/558)
+- Update **/\_includes/seo.html** for meta description. [#558](https://github.com/mmistakes/minimal-mistakes/pull/558)
### Bug Fixes
@@ -357,18 +1278,18 @@ last_modified_at: 2017-09-06T15:12:52-04:00
### Enhancements
-- Improve line numbered code block styling when using `{% raw %}{% highlight linenos %}{% endraw %}` tag. [#513](https://github.com/mmistakes/minimal-mistakes/issues/513)
+- Improve line numbered code block styling when using `{% highlight linenos %}` tag. [#513](https://github.com/mmistakes/minimal-mistakes/issues/513)
- Add English fallback to "Follow" button label. [#496](https://github.com/mmistakes/minimal-mistakes/pull/496)
### Bug Fixes
-- Fix Firefox alignment issues with code blocks generated with the `{% raw %}{% highlight %}{% endraw %}` tag. [#512](https://github.com/mmistakes/minimal-mistakes/issues/512)
+- Fix Firefox alignment issues with code blocks generated with the `{% highlight %}` tag. [#512](https://github.com/mmistakes/minimal-mistakes/issues/512)
### Maintenance
- Clarified comment for `author.stackoverflow` value used in author sidebar links. [#487](https://github.com/mmistakes/minimal-mistakes/pull/487)
- Add list of localized text strings. [#488](https://github.com/mmistakes/minimal-mistakes/pull/488)
-- Add `{% raw %}{% highlight %}{% endraw %}` code block examples to demo site.
+- Add `{% highlight %}` code block examples to demo site.
- Add documentation for using custom sidebar navigation menus. [#476](https://github.com/mmistakes/minimal-mistakes/issues/476)
## [3.4.4](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.4.4)
@@ -445,19 +1366,19 @@ last_modified_at: 2017-09-06T15:12:52-04:00
### Bug Fixes
-- Fix blank `site.teaser` bug [#412](https://github.com/mmistakes/minimal-mistakes/issues/412)
+- Fix blank `site.teaser` bug. [#412](https://github.com/mmistakes/minimal-mistakes/issues/412)
## [3.3.5](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.3.5)
### Enhancements
-- Add English default text `site.locale` strings [#407](https://github.com/mmistakes/minimal-mistakes/issues/407)
+- Add English default text `site.locale` strings. [#407](https://github.com/mmistakes/minimal-mistakes/issues/407)
- Add Portuguese localized UI text. [#411](https://github.com/mmistakes/minimal-mistakes/pull/411)
- Add Italian localized UI text. [#409](https://github.com/mmistakes/minimal-mistakes/pull/409)
### Maintenance
-- Remove unused Google AdSense variables in `_config.yml` [#404](https://github.com/mmistakes/minimal-mistakes/issues/404)
+- Remove unused Google AdSense variables in `_config.yml`. [#404](https://github.com/mmistakes/minimal-mistakes/issues/404)
- Update `Gemfile` instructions for using `github-pages` vs. native `jekyll` gems.
- Disable `gems:` in `_config.yml` and enable plugins with Bundler instead.
- Add `repository` to `_config.yml` to suppress GitHub Pages error `Liquid Exception: No repo name found.`
@@ -487,18 +1408,6 @@ last_modified_at: 2017-09-06T15:12:52-04:00
- Set default `lang` to `en`.
-### Enhancements
-
-- Make footer stick to the bottom of the page.
-
-### Bug Fixes
-
-- Fix `gallery` size bug [#402](https://github.com/mmistakes/minimal-mistakes/issues/402)
-
-### Maintenance
-
-- Set default `lang` to `en`.
-
## [3.3.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.3.2)
### Bug Fixes
@@ -520,7 +1429,7 @@ last_modified_at: 2017-09-06T15:12:52-04:00
## [3.2.13](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.13)
-### Enhancement
+### Enhancements
- Add English default UI text for Canada, Great Britain, and Australia. [#377](https://github.com/mmistakes/minimal-mistakes/issues/377)
- Switch default locale from `en-US` to `en`.
@@ -620,15 +1529,15 @@ last_modified_at: 2017-09-06T15:12:52-04:00
## [3.2.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.3)
-### Enhancement
+### Enhancements
-- Add [Discourse](https://www.discourse.org/) as a commenting provider [#335](https://github.com/mmistakes/minimal-mistakes/pull/335)
+- Add [Discourse](https://www.discourse.org/) as a commenting provider. [#335](https://github.com/mmistakes/minimal-mistakes/pull/335)
## [3.2.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.2)
-### Enhancement
+### Enhancements
-- Add support for image captions in Magnific Popup overlays via the [`gallery`](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#gallery) helper [#334](https://github.com/mmistakes/minimal-mistakes/issues/334)
+- Add support for image captions in Magnific Popup overlays via the [`gallery`](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#gallery) helper. [#334](https://github.com/mmistakes/minimal-mistakes/issues/334)
## [3.2.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.1)
@@ -650,7 +1559,7 @@ last_modified_at: 2017-09-06T15:12:52-04:00
### Bug Fixes
-- Fix `Liquid Exception: undefined method 'gsub' for nil:NilClass in _layouts/single.html` error when `page.title` is null. `
` element is now conditional if `title: ` is not set for a `page` or collection item. [#312](https://github.com/mmistakes/minimal-mistakes/issues/312)
+- Fix `Liquid Exception: undefined method 'gsub' for nil:NilClass in _layouts/single.html` error when `page.title` is null. `
` element is now conditional if `title:` is not set for a `page` or collection item. [#312](https://github.com/mmistakes/minimal-mistakes/issues/312)
### Maintenance
@@ -660,7 +1569,7 @@ last_modified_at: 2017-09-06T15:12:52-04:00
## [3.1.7](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.1.7)
-### Enhancement
+### Enhancements
- Add translation key for "Recent Posts" used in home page `index.html`. [#316](https://github.com/mmistakes/minimal-mistakes/pull/316)
@@ -703,11 +1612,15 @@ last_modified_at: 2017-09-06T15:12:52-04:00
## [3.1.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.1.2)
-### Enhancement
+### Enhancements
- Explain how to use `nav_list` helper in [documentation](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#navigation-list).
- Reduce left/right padding on smaller screens to increase width of main content column.
+### Bug Fixes
+
+- Fix alignment issues with related posts [#273](https://github.com/mmistakes/minimal-mistakes/issues/273) and "Follow" button in author profile [#274](https://github.com/mmistakes/minimal-mistakes/issues/274).
+
## [3.1.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.1.1)
### Bug Fix
@@ -722,6 +1635,7 @@ last_modified_at: 2017-09-06T15:12:52-04:00
- Added optional GitHub and Bitbucket links to footer if set on `site.author` in `_config.yml`.
### Bug Fixes
+
- Fixed Bitbucket URL typo in author sidebar.
## [3.0.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.0.3)
@@ -894,4 +1808,5 @@ last_modified_at: 2017-09-06T15:12:52-04:00
- Google Analytics, Google Authorship, webmaster verifies, and Twitter card meta are now optional.
-## [1.0.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/v1.0.1)
\ No newline at end of file
+## [1.0.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/v1.0.1)
+{% endraw %}
diff --git a/docs/_docs/19-contributing.md b/docs/_docs/19-contributing.md
index 7fb495926a77..bd555ee2c46f 100644
--- a/docs/_docs/19-contributing.md
+++ b/docs/_docs/19-contributing.md
@@ -11,7 +11,7 @@ Minimal Mistakes has been designed as a base for you to customize and fit your s
This goes for author sidebar links and "share button" additions -- I have no intention of merging in every possibly option, the essentials are there to get you started :smile:.
-## Pull Requests
+## Pull requests
When submitting a pull request:
diff --git a/docs/_docs/20-docs-2-2.md b/docs/_docs/20-docs-2-2.md
index e5d5a2688328..bcaa01cfa1b9 100644
--- a/docs/_docs/20-docs-2-2.md
+++ b/docs/_docs/20-docs-2-2.md
@@ -2,11 +2,10 @@
title: "2.2 Documentation"
permalink: /docs/docs-2-2/
excerpt: "Setup and installation instructions for Minimal Mistakes 2.2 (deprecated)."
-last_modified_at: 2016-04-13T15:54:02-04:00
+last_modified_at: 2018-03-20T16:00:34-04:00
+toc: true
---
-{% include toc %}
-
## Installation
Minimal Mistakes now requires [Jekyll](http://jekyllrb.com/) 3.0. Make sure to run `bundle update` if you aren't on the latest version to update all gem dependencies.
@@ -50,7 +49,6 @@ How Minimal Mistakes is organized and what the various files are. All posts, lay
minimal-mistakes/
├── _includes/
| ├── author-bio.html # bio stuff layout. pulls optional owner data from _config.yml
-| ├── browser-upgrade # prompt to install a modern browser for < IE9
| ├── disqus-comments # Disqus comments script
| ├── footer # site footer
| ├── head # site head
@@ -257,7 +255,7 @@ To include an auto-generated **table of contents** for posts and pages, add the
By default the margin below paragraphs has been removed and indent added to each. This is an intentional design decision to mimic the look of type set in a printed book or manuscript.
-
+ Example of the default paragraph style (indented first line and bottom margin removed).
@@ -268,7 +266,7 @@ $paragraph-indent: false;
```
-
+ Example of paragraphs with $paragraph-indent disabled.
@@ -298,4 +296,4 @@ To modify the site's JavaScript files I setup a Grunt build script to lint/conca
npm install
```
-From the theme's root, use `grunt` concatenate JavaScript files, and optimize .jpg, .png, and .svg files in the `images/` folder. You can also use `grunt dev` in combination with `jekyll build --watch` to watch for updates JS files that Grunt will then automatically re-build as you write your code which will in turn auto-generate your Jekyll site when developing locally.
\ No newline at end of file
+From the theme's root, use `grunt` concatenate JavaScript files, and optimize .jpg, .png, and .svg files in the `images/` folder. You can also use `grunt dev` in combination with `jekyll build --watch` to watch for updates JS files that Grunt will then automatically re-build as you write your code which will in turn auto-generate your Jekyll site when developing locally.
diff --git a/docs/_docs/21-license.md b/docs/_docs/21-license.md
index 316b54e9ffcb..27701a900eb1 100644
--- a/docs/_docs/21-license.md
+++ b/docs/_docs/21-license.md
@@ -2,12 +2,12 @@
title: "License"
permalink: /docs/license/
excerpt: "License for Minimal Mistakes Jekyll Theme."
-last_modified_at: 2016-04-13T15:05:12-04:00
+last_modified_at: 2018-01-10T11:22:01-05:00
---
The MIT License (MIT)
-Copyright (c) {{ site.time | date: '%Y' }} Michael Rose
+Copyright (c) 2013-{{ site.time | date: '%Y' }} Michael Rose and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -25,4 +25,50 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
+SOFTWARE.
+
+Minimal Mistakes incorporates icons from [The Noun Project](https://thenounproject.com/)
+creators Garrett Knoll, Arthur Shlain, and tracy tam.
+Icons are distributed under Creative Commons Attribution 3.0 United States (CC BY 3.0 US).
+
+Minimal Mistakes incorporates [Font Awesome](http://fontawesome.io/),
+Copyright (c) 2017 Dave Gandy.
+Font Awesome is distributed under the terms of the [SIL OFL 1.1](http://scripts.sil.org/OFL)
+and [MIT License](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates photographs from [Unsplash](https://unsplash.com).
+
+Minimal Mistakes incorporates [Susy](http://susy.oddbird.net/),
+Copyright (c) 2017, Miriam Eric Suzanne.
+Susy is distributed under the terms of the [BSD 3-clause "New" or "Revised" License](https://opensource.org/licenses/BSD-3-Clause).
+
+Minimal Mistakes incorporates [Breakpoint](http://breakpoint-sass.com/).
+Breakpoint is distributed under the terms of the [MIT/GPL Licenses](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates [FitVids.js](https://github.com/davatron5000/FitVids.js/),
+Copyright (c) 2013 Dave Rubert and Chris Coyier.
+FitVids is distributed under the terms of the [WTFPL License](http://sam.zoy.org/wtfpl/).
+
+Minimal Mistakes incorporates [Magnific Popup](http://dimsemenov.com/plugins/magnific-popup/),
+Copyright (c) 2014-2016 Dmitry Semenov, http://dimsemenov.com.
+Magnific Popup is distributed under the terms of the MIT License.
+
+Minimal Mistakes incorporates [jQuery Smooth Scroll](https://github.com/kswedberg/jquery-smooth-scroll),
+Copyright (c) 2017 Karl Swedberg.
+jQuery Smooth Scroll is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates [GreedyNav.js](https://github.com/lukejacksonn/GreedyNav),
+Copyright (c) 2015 Luke Jackson.
+GreedyNav.js is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates [Jekyll Group-By-Array](https://github.com/mushishi78/jekyll-group-by-array),
+Copyright (c) 2015 Max White .
+Jekyll Group-By-Array is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates [@allejo's Pure Liquid Jekyll Table of Contents](https://allejo.io/blog/a-jekyll-toc-in-liquid-only/),
+Copyright (c) 2017 Vladimir Jimenez.
+Pure Liquid Jekyll Table of Contents is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT).
+
+Minimal Mistakes incorporates [Lunr](http://lunrjs.com),
+Copyright (c) 2017 Oliver Nightingale.
+Lunr is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT).
\ No newline at end of file
diff --git a/docs/_docs/22-faq.md b/docs/_docs/22-faq.md
new file mode 100644
index 000000000000..f41f7fc14d02
--- /dev/null
+++ b/docs/_docs/22-faq.md
@@ -0,0 +1,18 @@
+---
+title: Frequently Asked Questions
+classes: wide
+permalink: "/docs/faq/"
+sidebar:
+ nav: docs
+last_modified_at: '2024-04-24T00:51:32+08:00'
+toc: false
+---
+
+This page is still under construction. Meanwhile, check out existing [issues](https://github.com/mmistakes/minimal-mistakes/issues) and [discussions](https://github.com/mmistakes/minimal-mistakes/discussions) to see if your question has already been asked before.
+{: .notice--primary }
+
+- `'require': cannot load such file -- webrick (LoadError)`
+
+ This error occurs when you run `jekyll serve` on Ruby 3.0+.
+
+ Ruby 3.0 no longer comes with Webrick by default. To fix this, add `gem "webrick"` to your `Gemfile` and run `bundle install`. See [jekyll/jekyll#8523](https://github.com/jekyll/jekyll/issues/8523)
diff --git a/docs/_includes/after-content.html b/docs/_includes/after-content.html
new file mode 100644
index 000000000000..482c530b7931
--- /dev/null
+++ b/docs/_includes/after-content.html
@@ -0,0 +1,8 @@
+
+
+
diff --git a/docs/_includes/analytics-providers/custom.html b/docs/_includes/analytics-providers/custom.html
deleted file mode 100644
index c34b97ad90d9..000000000000
--- a/docs/_includes/analytics-providers/custom.html
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/docs/_includes/analytics-providers/google-universal.html b/docs/_includes/analytics-providers/google-universal.html
deleted file mode 100644
index 10d65b2ee488..000000000000
--- a/docs/_includes/analytics-providers/google-universal.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/docs/_includes/analytics-providers/google.html b/docs/_includes/analytics-providers/google.html
deleted file mode 100644
index b591b995435a..000000000000
--- a/docs/_includes/analytics-providers/google.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
\ No newline at end of file
diff --git a/docs/_includes/analytics.html b/docs/_includes/analytics.html
deleted file mode 100644
index 64a3359aad4e..000000000000
--- a/docs/_includes/analytics.html
+++ /dev/null
@@ -1,12 +0,0 @@
-{% if site.analytics.provider and page.analytics != false %}
-
-{% case site.analytics.provider %}
-{% when "google" %}
- {% include /analytics-providers/google.html %}
-{% when "google-universal" %}
- {% include /analytics-providers/google-universal.html %}
-{% when "custom" %}
- {% include /analytics-providers/custom.html %}
-{% endcase %}
-
-{% endif %}
\ No newline at end of file
diff --git a/docs/_includes/archive-single.html b/docs/_includes/archive-single.html
deleted file mode 100644
index 93755e38ec6b..000000000000
--- a/docs/_includes/archive-single.html
+++ /dev/null
@@ -1,38 +0,0 @@
-{% if post.header.teaser %}
- {% capture teaser %}{{ post.header.teaser }}{% endcapture %}
-{% else %}
- {% assign teaser = site.teaser %}
-{% endif %}
-
-{% if post.id %}
- {% assign title = post.title | markdownify | remove: "
- {% if page.author_profile or layout.author_profile %}{% include author-profile.html %}{% endif %}
- {% if page.sidebar %}
- {% for s in page.sidebar %}
- {% if s.image %}
-
- {% endif %}
- {% if s.title %}
{{ site.data.ui-text[site.locale].related_label | default: "You May Also Enjoy" }}
-
- {% for post in site.posts limit:4 %}
- {% include archive-single.html type="grid" %}
- {% endfor %}
-
-
- {% endif %}
-
diff --git a/docs/_layouts/splash.html b/docs/_layouts/splash.html
deleted file mode 100644
index c9cc6998002f..000000000000
--- a/docs/_layouts/splash.html
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: default
----
-
-{% if page.header.overlay_color or page.header.overlay_image or page.header.image %}
- {% include page__hero.html %}
-{% elsif page.header.video.id and page.header.video.provider %}
- {% include page__hero_video.html %}
-{% endif %}
-
-
-
- {% if page.title %}{% endif %}
- {% if page.excerpt %}{% endif %}
- {% if page.date %}{% endif %}
- {% if page.last_modified_at %}{% endif %}
-
-
- {{ content }}
-
-
-
\ No newline at end of file
diff --git a/docs/_pages/404.md b/docs/_pages/404.md
index 9d0f86066123..b3025a6053b5 100644
--- a/docs/_pages/404.md
+++ b/docs/_pages/404.md
@@ -5,12 +5,4 @@ sitemap: false
permalink: /404.html
---
-Sorry, but the page you were trying to view does not exist --- perhaps you can try searching for it below.
-
-
-
+Sorry, but the page you were trying to view does not exist.
diff --git a/docs/_pages/about.md b/docs/_pages/about.md
index 24b1c988cab2..4a805ceda268 100644
--- a/docs/_pages/about.md
+++ b/docs/_pages/about.md
@@ -12,25 +12,28 @@ layouts_gallery:
- url: /assets/images/mm-layout-archive.png
image_path: /assets/images/mm-layout-archive.png
alt: "archive layout example"
-last_modified_at: 2017-02-14T14:28:13-05:00
+last_modified_at: 2022-05-27T11:59:26-04:00
+toc: true
---
Minimal Mistakes is a flexible two-column Jekyll theme. Perfect for hosting your personal site, blog, or portfolio on GitHub or self-hosting on your own server. As the name implies --- styling is purposely minimalistic to be enhanced and customized by you :smile:.
{% include gallery id="layouts_gallery" caption="Examples of included layouts `splash`, `single`, and `archive`." %}
-[Install the Theme]({{ "/docs/quick-start-guide/" | absolute_url }}){: .btn .btn--success .btn--large}
+[Install the Theme]({{ "/docs/quick-start-guide/" | relative_url }}){: .btn .btn--success .btn--large}
## Notable Features
-- Compatible with Jekyll 3.x and GitHub Pages
-- Support for Jekyll's built-in Sass/SCSS preprocessor
-- Several responsive layout options (single, archive index, splash, and paginated home page)
-- SEO optimized with support for [Twitter Cards](https://dev.twitter.com/cards/overview) and [Open Graph](http://ogp.me/) data
+- Bundled as a "theme gem" for easier install/upgrading.
+- Compatible with GitHub Pages.
+- Support for Jekyll's built-in Sass/SCSS preprocessor.
+- Nine different skins (color variations).
+- Several responsive layout options (single, archive index, search, splash, and paginated home page).
+- Optimized for search engines with support for [Twitter Cards](https://dev.twitter.com/cards/overview) and [Open Graph](http://ogp.me/) data
- Optional [header images](https://mmistakes.github.io/minimal-mistakes/docs/layouts/#headers), [custom sidebars](https://mmistakes.github.io/minimal-mistakes/docs/layouts/#sidebars), [table of contents](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#table-of-contents), [galleries](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#gallery), related posts, [breadcrumb links](https://mmistakes.github.io/minimal-mistakes/docs/configuration/#breadcrumb-navigation-beta), [navigation lists](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#navigation-list), and more.
-- Commenting support (powered by [Disqus](https://disqus.com/), [Facebook](https://developers.facebook.com/docs/plugins/comments), Google+, [Discourse](https://www.discourse.org/), static-based via [Staticman](https://staticman.net/), and custom).
+- Commenting support (powered by [Disqus](https://disqus.com/), [Facebook](https://developers.facebook.com/docs/plugins/comments), [Discourse](https://www.discourse.org/), [utterances](https://utteranc.es/), [giscus](https://giscus.app/), static-based via [Staticman v1 and v2](https://staticman.net/), and custom).
- [Google Analytics](https://www.google.com/analytics/) support.
-- UI localized text in English (default), Brazilian Portuguese, Chinese, French, German, Italian, Korean, Nepali (Nepalese), Russian, Spanish, and Turkish
+- UI localized text in English (default), Arabic (عربي), Brazilian Portuguese (Português brasileiro), Bulgarian, Catalan, Chinese, Czech, Danish, Dutch, Finnish, French (Français), German (Deutsch), Greek, Hebrew, Hindi (हिंदी), Hungarian, Indonesian, Irish (Gaeilge), Italian (Italiano), Japanese, Kiswahili, Korean, Malayalam, Myanmar (Burmese), Nepali (Nepalese), Norwegian (Norsk), Persian (فارسی), Polish, Punjabi (ਪੰਜਾਬੀ), Romanian, Russian, Slovak, Spanish (Español), Swedish, Thai, Turkish (Türkçe), and Vietnamese.
## Demo Pages
@@ -46,14 +49,14 @@ Minimal Mistakes is a flexible two-column Jekyll theme. Perfect for hosting your
For even more demo pages check the [posts archive][year-archive].
-[header-image-post]: {{ "" | absolute_url }}{% post_url 2012-03-15-layout-header-image-text-readability %}
-[gallery-post]: {{ "" | absolute_url }}{% post_url 2010-09-09-post-gallery %}
-[html-tags-post]: {{ "" | absolute_url }}{% post_url 2013-01-11-markup-html-tags-and-formatting %}
-[syntax-post]: {{ "" | absolute_url }}{% post_url 2013-08-16-markup-syntax-highlighting %}
-[sample-collection]: {{ "/recipes/chocolate-chip-cookies/" | absolute_url }}
-[categories-archive]: {{ "/categories/" | absolute_url }}
-[tags-archive]: {{ "/tags/" | absolute_url }}
-[year-archive]: {{ "/year-archive/" | absolute_url }}
+[header-image-post]: {{ "" | relative_url }}{% post_url 2012-03-15-layout-header-image-text-readability %}
+[gallery-post]: {{ "" | relative_url }}{% post_url 2010-09-09-post-gallery %}
+[html-tags-post]: {{ "" | relative_url }}{% post_url 2013-01-11-markup-html-tags-and-formatting %}
+[syntax-post]: {{ "" | relative_url }}{% post_url 2013-08-16-markup-syntax-highlighting %}
+[sample-collection]: {{ "/recipes/chocolate-chip-cookies/" | relative_url }}
+[categories-archive]: {{ "/categories/" | relative_url }}
+[tags-archive]: {{ "/tags/" | relative_url }}
+[year-archive]: {{ "/year-archive/" | relative_url }}
---
@@ -75,6 +78,7 @@ For even more demo pages check the [posts archive][year-archive].
- [FitVids.JS](http://fitvidsjs.com/)
- Greedy Navigation - [lukejacksonn](https://codepen.io/lukejacksonn/pen/PwmwWV)
- [jQuery Smooth Scroll](https://github.com/kswedberg/jquery-smooth-scroll)
+- [Lunr](http://lunrjs.com)
---
diff --git a/docs/_pages/archive-layout-with-content.md b/docs/_pages/archive-layout-with-content.md
index 6c9b7376ebd4..6820122e2351 100644
--- a/docs/_pages/archive-layout-with-content.md
+++ b/docs/_pages/archive-layout-with-content.md
@@ -207,7 +207,7 @@ Getting our science styling on with H2O, which should push the "2" do
### Superscript Tag
-Still sticking with science and Isaac Newton's E = MC2, which should lift the 2 up.
+Still sticking with science and Albert Einstein's E = MC2, which should lift the 2 up.
### Variable Tag
diff --git a/docs/_pages/category-archive.html b/docs/_pages/category-archive.html
deleted file mode 100644
index c9e03e1563a4..000000000000
--- a/docs/_pages/category-archive.html
+++ /dev/null
@@ -1,16 +0,0 @@
----
-layout: archive
-permalink: /categories/
-title: "Posts by Category"
-author_profile: true
----
-
-{% include group-by-array collection=site.posts field="categories" %}
-
-{% for category in group_names %}
- {% assign posts = group_items[forloop.index0] %}
-
{{ category }}
- {% for post in posts %}
- {% include archive-single.html %}
- {% endfor %}
-{% endfor %}
\ No newline at end of file
diff --git a/docs/_pages/category-archive.md b/docs/_pages/category-archive.md
new file mode 100644
index 000000000000..4cb3860e91be
--- /dev/null
+++ b/docs/_pages/category-archive.md
@@ -0,0 +1,6 @@
+---
+title: "Posts by Category"
+layout: categories
+permalink: /categories/
+author_profile: true
+---
diff --git a/docs/_pages/edge-case.md b/docs/_pages/edge-case.md
new file mode 100644
index 000000000000..016138a4675a
--- /dev/null
+++ b/docs/_pages/edge-case.md
@@ -0,0 +1,8 @@
+---
+title: Edge Case
+layout: category
+permalink: /categories/edge-case/
+taxonomy: Edge Case
+---
+
+Sample post listing for the category `Edge Case`.
diff --git a/docs/_pages/home.md b/docs/_pages/home.md
index bb4495023137..15090361e93d 100644
--- a/docs/_pages/home.md
+++ b/docs/_pages/home.md
@@ -1,38 +1,38 @@
---
layout: splash
permalink: /
+hidden: true
header:
overlay_color: "#5e616c"
overlay_image: /assets/images/mm-home-page-feature.jpg
- cta_label: " Install Now"
- cta_url: "/docs/quick-start-guide/"
- caption:
-excerpt: 'A flexible two-column Jekyll theme. Perfect for personal sites, blogs, and portfolios hosted on GitHub or your own server. Latest release v4.5.2
{::nomarkdown} {:/nomarkdown}'
+ actions:
+ - label: " Install now"
+ url: "/docs/quick-start-guide/"
+excerpt: >
+ A flexible two-column Jekyll theme. Perfect for building personal sites, blogs, and portfolios.
+ Latest release v4.27.3
feature_row:
- image_path: /assets/images/mm-customizable-feature.png
alt: "customizable"
- title: "Super Customizable"
+ title: "Super customizable"
excerpt: "Everything from the menus, sidebars, comments, and more can be configured or set with YAML Front Matter."
url: "/docs/configuration/"
- btn_label: "Learn More"
+ btn_class: "btn--primary"
+ btn_label: "Learn more"
- image_path: /assets/images/mm-responsive-feature.png
alt: "fully responsive"
- title: "Responsive Layouts"
- excerpt: "Built on HTML5 + CSS3. All layouts are fully responsive with helpers to augment your content."
+ title: "Responsive layouts"
+ excerpt: "Built with HTML5 + CSS3. All layouts are fully responsive with helpers to augment your content."
url: "/docs/layouts/"
- btn_label: "Learn More"
+ btn_class: "btn--primary"
+ btn_label: "Learn more"
- image_path: /assets/images/mm-free-feature.png
alt: "100% free"
- title: "100% Free"
- excerpt: "Free to use however you want under the MIT License. Clone it, fork it, customize it, whatever!"
+ title: "100% free"
+ excerpt: "Free to use however you want under the MIT License. Clone it, fork it, customize it... whatever!"
url: "/docs/license/"
- btn_label: "Learn More"
-github:
- - excerpt: '{::nomarkdown} {:/nomarkdown}'
-intro:
- - excerpt: 'Get notified when I add new stuff [ @mmistakes](https://twitter.com/mmistakes){: .btn .btn--twitter} [ Tip Me](https://www.paypal.me/mmistakes){: .btn}'
+ btn_class: "btn--primary"
+ btn_label: "Learn more"
---
-{% include feature_row id="intro" type="center" %}
-
-{% include feature_row %}
\ No newline at end of file
+{% include feature_row %}
diff --git a/docs/_pages/markup.md b/docs/_pages/markup.md
new file mode 100644
index 000000000000..147a719ae258
--- /dev/null
+++ b/docs/_pages/markup.md
@@ -0,0 +1,8 @@
+---
+title: Markup
+layout: tag
+permalink: /tags/markup/
+taxonomy: markup
+---
+
+Sample post listing for the tag `markup`.
diff --git a/docs/_pages/page-archive.html b/docs/_pages/page-archive.html
index a4e515abc721..ada3f64fb9ce 100644
--- a/docs/_pages/page-archive.html
+++ b/docs/_pages/page-archive.html
@@ -5,6 +5,7 @@
author_profile: false
---
-{% for post in site.pages %}
+{% assign posts = site.pages | where_exp: "post", "post.hidden != true" %}
+{% for post in posts %}
{% include archive-single.html %}
-{% endfor %}
\ No newline at end of file
+{% endfor %}
diff --git a/docs/_pages/pets.md b/docs/_pages/pets.md
new file mode 100644
index 000000000000..1ecc1f3b565f
--- /dev/null
+++ b/docs/_pages/pets.md
@@ -0,0 +1,10 @@
+---
+title: Pets
+layout: collection
+permalink: /pets/
+collection: pets
+entries_layout: grid
+classes: wide
+---
+
+Sample document listing for the collection `_pets`.
diff --git a/docs/_pages/portfolio-archive.html b/docs/_pages/portfolio-archive.html
deleted file mode 100644
index f206c570ebc4..000000000000
--- a/docs/_pages/portfolio-archive.html
+++ /dev/null
@@ -1,12 +0,0 @@
----
-layout: archive
-title: "Portfolio"
-permalink: /portfolio/
-author_profile: false
----
-
-
- {% for post in site.portfolio %}
- {% include archive-single.html type="grid" %}
- {% endfor %}
-
\ No newline at end of file
diff --git a/docs/_pages/portfolio-archive.md b/docs/_pages/portfolio-archive.md
new file mode 100644
index 000000000000..019082f49185
--- /dev/null
+++ b/docs/_pages/portfolio-archive.md
@@ -0,0 +1,10 @@
+---
+title: Portfolio
+layout: collection
+permalink: /portfolio/
+collection: portfolio
+entries_layout: grid
+classes: wide
+---
+
+Sample document listing for the collection `_portfolio`.
diff --git a/docs/_pages/post-archive-feature-rows.html b/docs/_pages/post-archive-feature-rows.html
new file mode 100644
index 000000000000..47cab558d9fd
--- /dev/null
+++ b/docs/_pages/post-archive-feature-rows.html
@@ -0,0 +1,59 @@
+---
+layout: archive
+title: "Post Archive with Feature Rows"
+permalink: /post-archive-feature-rows/
+author_profile: true
+feature_row:
+ - image_path: assets/images/unsplash-gallery-image-1-th.jpg
+ alt: "placeholder image 1"
+ title: "Placeholder 1"
+ excerpt: "This is some sample content that goes here with **Markdown** formatting."
+ - image_path: /assets/images/unsplash-gallery-image-2-th.jpg
+ alt: "placeholder image 2"
+ title: "Placeholder 2"
+ excerpt: "This is some sample content that goes here with **Markdown** formatting."
+ url: "#test-link"
+ btn_label: "Read More"
+ btn_class: "btn--primary"
+ - image_path: /assets/images/unsplash-gallery-image-3-th.jpg
+ title: "Placeholder 3"
+ excerpt: "This is some sample content that goes here with **Markdown** formatting."
+feature_row2:
+ - image_path: /assets/images/unsplash-gallery-image-2-th.jpg
+ alt: "placeholder image 2"
+ title: "Placeholder Image Left Aligned"
+ excerpt: 'This is some sample content that goes here with **Markdown** formatting. Left aligned with `type="left"`'
+ url: "#test-link"
+ btn_label: "Read More"
+ btn_class: "btn--primary"
+feature_row3:
+ - image_path: /assets/images/unsplash-gallery-image-2-th.jpg
+ alt: "placeholder image 2"
+ title: "Placeholder Image Right Aligned"
+ excerpt: 'This is some sample content that goes here with **Markdown** formatting. Right aligned with `type="right"`'
+ url: "#test-link"
+ btn_label: "Read More"
+ btn_class: "btn--primary"
+feature_row4:
+ - image_path: /assets/images/unsplash-gallery-image-2-th.jpg
+ alt: "placeholder image 2"
+ title: "Placeholder Image Center Aligned"
+ excerpt: 'This is some sample content that goes here with **Markdown** formatting. Centered with `type="center"`'
+ url: "#test-link"
+ btn_label: "Read More"
+ btn_class: "btn--primary"
+---
+
+{% for post in site.posts limit: 5 %}
+ {% include archive-single.html %}
+{% endfor %}
+
+{% include feature_row id="intro" type="center" %}
+
+{% include feature_row %}
+
+{% include feature_row id="feature_row2" type="left" %}
+
+{% include feature_row id="feature_row3" type="right" %}
+
+{% include feature_row id="feature_row4" type="center" %}
\ No newline at end of file
diff --git a/docs/_pages/recipes-archive.html b/docs/_pages/recipes-archive.html
deleted file mode 100644
index b5e2dfc246a9..000000000000
--- a/docs/_pages/recipes-archive.html
+++ /dev/null
@@ -1,10 +0,0 @@
----
-layout: archive
-title: "Recipes"
-permalink: /recipes/
-author_profile: false
----
-
-{% for post in site.recipes %}
- {% include archive-single.html %}
-{% endfor %}
\ No newline at end of file
diff --git a/docs/_pages/recipes-archive.md b/docs/_pages/recipes-archive.md
new file mode 100644
index 000000000000..96a36cf7fc72
--- /dev/null
+++ b/docs/_pages/recipes-archive.md
@@ -0,0 +1,9 @@
+---
+layout: collection
+title: "Recipes"
+collection: recipes
+permalink: /recipes/
+author_profile: false
+---
+
+Sample document listing for the collection `_recipes`.
\ No newline at end of file
diff --git a/docs/_pages/sitemap.md b/docs/_pages/sitemap.md
index 2f1417d09069..bb6e1831a4c1 100644
--- a/docs/_pages/sitemap.md
+++ b/docs/_pages/sitemap.md
@@ -5,7 +5,7 @@ permalink: /sitemap/
author_profile: false
---
-A list of all the posts and pages found on the site. For you robots out there is an [XML version]({{ "sitemap.xml" | absolute_url }}) available for digesting as well.
+A list of all the posts and pages found on the site. For you robots out there is an [XML version]({{ "sitemap.xml" | relative_url }}) available for digesting as well.
Pages
{% for post in site.pages %}
diff --git a/docs/_pages/splash-page.md b/docs/_pages/splash-page.md
index 59933679f603..f11bc0b0737b 100644
--- a/docs/_pages/splash-page.md
+++ b/docs/_pages/splash-page.md
@@ -7,8 +7,9 @@ header:
overlay_color: "#000"
overlay_filter: "0.5"
overlay_image: /assets/images/unsplash-image-1.jpg
- cta_label: "Download"
- cta_url: "https://github.com/mmistakes/minimal-mistakes/"
+ actions:
+ - label: "Download"
+ url: "https://github.com/mmistakes/minimal-mistakes/"
caption: "Photo credit: [**Unsplash**](https://unsplash.com)"
excerpt: "Bacon ipsum dolor sit amet salami ham hock ham, hamburger corned beef short ribs kielbasa biltong t-bone drumstick tri-tip tail sirloin pork chop."
intro:
@@ -19,12 +20,13 @@ feature_row:
title: "Placeholder 1"
excerpt: "This is some sample content that goes here with **Markdown** formatting."
- image_path: /assets/images/unsplash-gallery-image-2-th.jpg
+ image_caption: "Image courtesy of [Unsplash](https://unsplash.com/)"
alt: "placeholder image 2"
title: "Placeholder 2"
excerpt: "This is some sample content that goes here with **Markdown** formatting."
url: "#test-link"
btn_label: "Read More"
- btn_class: "btn--inverse"
+ btn_class: "btn--primary"
- image_path: /assets/images/unsplash-gallery-image-3-th.jpg
title: "Placeholder 3"
excerpt: "This is some sample content that goes here with **Markdown** formatting."
@@ -35,7 +37,7 @@ feature_row2:
excerpt: 'This is some sample content that goes here with **Markdown** formatting. Left aligned with `type="left"`'
url: "#test-link"
btn_label: "Read More"
- btn_class: "btn--inverse"
+ btn_class: "btn--primary"
feature_row3:
- image_path: /assets/images/unsplash-gallery-image-2-th.jpg
alt: "placeholder image 2"
@@ -43,7 +45,7 @@ feature_row3:
excerpt: 'This is some sample content that goes here with **Markdown** formatting. Right aligned with `type="right"`'
url: "#test-link"
btn_label: "Read More"
- btn_class: "btn--inverse"
+ btn_class: "btn--primary"
feature_row4:
- image_path: /assets/images/unsplash-gallery-image-2-th.jpg
alt: "placeholder image 2"
@@ -51,7 +53,7 @@ feature_row4:
excerpt: 'This is some sample content that goes here with **Markdown** formatting. Centered with `type="center"`'
url: "#test-link"
btn_label: "Read More"
- btn_class: "btn--inverse"
+ btn_class: "btn--primary"
---
{% include feature_row id="intro" type="center" %}
diff --git a/docs/_pages/tag-archive.html b/docs/_pages/tag-archive.html
deleted file mode 100644
index b30a57f5ac5f..000000000000
--- a/docs/_pages/tag-archive.html
+++ /dev/null
@@ -1,16 +0,0 @@
----
-layout: archive
-permalink: /tags/
-title: "Posts by Tag"
-author_profile: true
----
-
-{% include group-by-array collection=site.posts field="tags" %}
-
-{% for tag in group_names %}
- {% assign posts = group_items[forloop.index0] %}
-
{{ tag }}
- {% for post in posts %}
- {% include archive-single.html %}
- {% endfor %}
-{% endfor %}
diff --git a/docs/_pages/tag-archive.md b/docs/_pages/tag-archive.md
new file mode 100644
index 000000000000..3f4e3f0df86c
--- /dev/null
+++ b/docs/_pages/tag-archive.md
@@ -0,0 +1,6 @@
+---
+title: "Posts by Tag"
+permalink: /tags/
+layout: tags
+author_profile: true
+---
diff --git a/docs/_pages/terms.md b/docs/_pages/terms.md
index dff6b2cc5266..eac4d5d4f8a8 100644
--- a/docs/_pages/terms.md
+++ b/docs/_pages/terms.md
@@ -1,11 +1,10 @@
---
permalink: /terms/
title: "Terms and Privacy Policy"
-last_modified_at: 2016-11-03T11:57:46-04:00
+last_modified_at: 2017-10-20T12:42:38-04:00
+toc: true
---
-{% include toc %}
-
## Privacy Policy
The privacy of my visitors is extremely important. This Privacy Policy outlines the types of personal information that is received and collected and how it is used.
diff --git a/docs/_pages/year-archive.html b/docs/_pages/year-archive.html
deleted file mode 100644
index d2fa0685dd91..000000000000
--- a/docs/_pages/year-archive.html
+++ /dev/null
@@ -1,16 +0,0 @@
----
-layout: archive
-permalink: /year-archive/
-title: "Posts by Year"
-author_profile: true
----
-
-{% capture written_year %}'None'{% endcapture %}
-{% for post in site.posts %}
- {% capture year %}{{ post.date | date: '%Y' }}{% endcapture %}
- {% if year != written_year %}
-
{{ year }}
- {% capture written_year %}{{ year }}{% endcapture %}
- {% endif %}
- {% include archive-single.html %}
-{% endfor %}
\ No newline at end of file
diff --git a/docs/_pages/year-archive.md b/docs/_pages/year-archive.md
new file mode 100644
index 000000000000..1021452ad951
--- /dev/null
+++ b/docs/_pages/year-archive.md
@@ -0,0 +1,6 @@
+---
+title: "Posts by Year"
+permalink: /year-archive/
+layout: posts
+author_profile: true
+---
diff --git a/docs/_posts/2009-05-15-edge-case-nested-and-mixed-lists.md b/docs/_posts/2009-05-15-edge-case-nested-and-mixed-lists.md
index cc4fd5e52ff7..a8dccf09c792 100644
--- a/docs/_posts/2009-05-15-edge-case-nested-and-mixed-lists.md
+++ b/docs/_posts/2009-05-15-edge-case-nested-and-mixed-lists.md
@@ -19,10 +19,10 @@ Nested and mixed lists are an interesting beast. It's a corner case to make sure
1. ordered item
2. ordered item
- * **unordered**
- * **unordered**
- 1. ordered item
- 2. ordered item
+ * **unordered**
+ * **unordered**
+ 1. ordered item
+ 2. ordered item
3. ordered item
4. ordered item
@@ -30,10 +30,10 @@ Nested and mixed lists are an interesting beast. It's a corner case to make sure
1. ordered item
2. ordered item
- * **unordered**
- * **unordered**
- * unordered item
- * unordered item
+ * **unordered**
+ * **unordered**
+ * unordered item
+ * unordered item
3. ordered item
4. ordered item
@@ -43,8 +43,8 @@ Nested and mixed lists are an interesting beast. It's a corner case to make sure
* unordered item
1. ordered
2. ordered
- * unordered item
- * unordered item
+ * unordered item
+ * unordered item
* unordered item
* unordered item
@@ -57,4 +57,10 @@ Nested and mixed lists are an interesting beast. It's a corner case to make sure
1. **ordered item**
2. **ordered item**
* unordered item
-* unordered item
\ No newline at end of file
+* unordered item
+
+### Task Lists
+
+- [x] Finish my changes
+- [ ] Push my commits to GitHub
+- [ ] Open a pull request
\ No newline at end of file
diff --git a/docs/_posts/2009-10-05-edge-case-multiline-excerpt.md b/docs/_posts/2009-10-05-edge-case-multiline-excerpt.md
new file mode 100644
index 000000000000..6acc568a0655
--- /dev/null
+++ b/docs/_posts/2009-10-05-edge-case-multiline-excerpt.md
@@ -0,0 +1,6 @@
+---
+title: "Edge Case: Post with multiline excerpt"
+---
+
+Et ex ullamco duis don't
+combine these words quis laborum sunt sint. Nisi et Lorem reprehenderit cupidatat. Aliqua fugiat aliquip officia culpa elit. Adipisicing do eu duis aute et aute amet anim ut cillum aliqua. Aliqua adipisicing occaecat et ullamco fugiat.
\ No newline at end of file
diff --git a/docs/_posts/2009-10-06-edge-case-broken-highlighting.md b/docs/_posts/2009-10-06-edge-case-broken-highlighting.md
new file mode 100644
index 000000000000..bdf5b0be2715
--- /dev/null
+++ b/docs/_posts/2009-10-06-edge-case-broken-highlighting.md
@@ -0,0 +1,48 @@
+---
+title: "Edge Case: Invalid syntax highlight languages"
+categories:
+ - Edge Case
+tags:
+ - content
+ - css
+ - edge case
+---
+
+Good highlighting:
+
+```ruby
+str = ARGV.first
+if str
+ str = str.b[/\A_(.*)_\z/, 1]
+ if str and Gem::Version.correct?(str)
+ version = str
+ ARGV.shift
+ end
+end
+```
+
+Good (but dumb) highlighting:
+
+```
+str = ARGV.first
+if str
+ str = str.b[/\A_(.*)_\z/, 1]
+ if str and Gem::Version.correct?(str)
+ version = str
+ ARGV.shift
+ end
+end
+```
+
+Bad highlighting:
+
+```invalid
+str = ARGV.first
+if str
+ str = str.b[/\A_(.*)_\z/, 1]
+ if str and Gem::Version.correct?(str)
+ version = str
+ ARGV.shift
+ end
+end
+```
diff --git a/docs/_posts/2010-02-05-post-notice.md b/docs/_posts/2010-02-05-post-notice.md
index 071c7892e6c4..da63f9a32152 100644
--- a/docs/_posts/2010-02-05-post-notice.md
+++ b/docs/_posts/2010-02-05-post-notice.md
@@ -17,6 +17,16 @@ When using Kramdown `{: .notice}` can be added after a sentence to assign the `.
**Primary Notice:** Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. [Praesent libero](#). Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet.
{: .notice--primary}
+
+**Primary Notice with code block:** Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. [Praesent libero](#). Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet.
+
+```html
+
+ Some body.
+
+```
+
+
**Info Notice:** Lorem ipsum dolor sit amet, [consectetur adipiscing elit](#). Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet.
{: .notice--info}
diff --git a/docs/_posts/2010-06-02-post-video-youtube.md b/docs/_posts/2010-06-02-post-video-youtube.md
index 16bc910c38da..686f622b9e70 100644
--- a/docs/_posts/2010-06-02-post-video-youtube.md
+++ b/docs/_posts/2010-06-02-post-video-youtube.md
@@ -8,4 +8,4 @@ tags:
YouTube video embed below.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/_posts/2010-08-05-post-header-image-og-override.md b/docs/_posts/2010-08-05-post-header-image-og-override.md
new file mode 100644
index 000000000000..223f382a61b2
--- /dev/null
+++ b/docs/_posts/2010-08-05-post-header-image-og-override.md
@@ -0,0 +1,24 @@
+---
+title: "Post: Header Image with OpenGraph Override"
+header:
+ image: /assets/images/page-header-image.png
+ og_image: /assets/images/page-header-og-image.png
+ og_image_alt: "OpenGraph image description"
+categories:
+ - Layout
+ - Uncategorized
+tags:
+ - edge case
+ - image
+ - layout
+last_modified_at: 2017-10-26T15:12:19-04:00
+---
+
+This post has a header image with an OpenGraph override.
+
+```yaml
+header:
+ image: /assets/images/page-header-image.png
+ og_image: /assets/images/page-header-og-image.png
+ og_image_alt: "OpenGraph image description"
+```
\ No newline at end of file
diff --git a/docs/_posts/2010-08-05-post-header-overlay-image-og-override.md b/docs/_posts/2010-08-05-post-header-overlay-image-og-override.md
new file mode 100644
index 000000000000..e8501b7f53a7
--- /dev/null
+++ b/docs/_posts/2010-08-05-post-header-overlay-image-og-override.md
@@ -0,0 +1,30 @@
+---
+title: "Post: Overlay Image with OpenGraph Override"
+header:
+ overlay_image: /assets/images/unsplash-image-1.jpg
+ og_image: /assets/images/page-header-og-image.png
+ caption: "Photo credit: [**Unsplash**](https://unsplash.com)"
+ actions:
+ - label: "Learn more"
+ url: "https://unsplash.com"
+categories:
+ - Layout
+ - Uncategorized
+tags:
+ - edge case
+ - image
+ - layout
+last_modified_at: 2017-10-26T15:12:19-04:00
+---
+
+This post has a header image with an OpenGraph override.
+
+```yaml
+header:
+ overlay_image: /assets/images/unsplash-image-1.jpg
+ og_image: /assets/images/page-header-og-image.png
+ caption: "Photo credit: [**Unsplash**](https://unsplash.com)"
+ actions:
+ - label: "Learn more"
+ url: "https://unsplash.com"
+```
\ No newline at end of file
diff --git a/docs/_posts/2010-08-05-post-image-linked.md b/docs/_posts/2010-08-05-post-image-linked.md
index af3f3fe9f779..a59cd117126e 100644
--- a/docs/_posts/2010-08-05-post-image-linked.md
+++ b/docs/_posts/2010-08-05-post-image-linked.md
@@ -7,4 +7,4 @@ tags:
- Post Formats
---
-[](https://flic.kr/p/8ww3fZ)
\ No newline at end of file
+[](https://flic.kr/p/dNiUYB)
\ No newline at end of file
diff --git a/docs/_posts/2010-08-05-post-teaser-image-og-override.md b/docs/_posts/2010-08-05-post-teaser-image-og-override.md
new file mode 100644
index 000000000000..bd7ac0a219f8
--- /dev/null
+++ b/docs/_posts/2010-08-05-post-teaser-image-og-override.md
@@ -0,0 +1,22 @@
+---
+title: "Post: Teaser Image with OpenGraph Override"
+header:
+ teaser: /assets/images/page-header-teaser.png
+ og_image: /assets/images/page-header-og-image.png
+categories:
+ - Layout
+ - Uncategorized
+tags:
+ - edge case
+ - image
+ - layout
+last_modified_at: 2017-10-26T15:12:19-04:00
+---
+
+This post has a teaser image with an OpenGraph override.
+
+```yaml
+header:
+ teaser: /assets/images/page-header-teaser.png
+ og_image: /assets/images/page-header-og-image.png
+```
\ No newline at end of file
diff --git a/docs/_posts/2010-08-06-post-image-linked-caption.md b/docs/_posts/2010-08-06-post-image-linked-caption.md
index ada6f6a73ed6..67be312084cd 100644
--- a/docs/_posts/2010-08-06-post-image-linked-caption.md
+++ b/docs/_posts/2010-08-06-post-image-linked-caption.md
@@ -8,14 +8,14 @@ tags:
---
{% capture fig_img %}
-[](https://flic.kr/p/8wzarA)
+[](https://unsplash.com/)
{% endcapture %}
{% capture fig_caption %}
-Stairs? Were we're going we don't need no stairs.
+Image with a caption.
{% endcapture %}
{{ fig_img | markdownify | remove: "
" | remove: "
" }}
{{ fig_caption | markdownify | remove: "
" | remove: "
" }}
-
\ No newline at end of file
+
diff --git a/docs/_posts/2010-08-07-post-image-caption.md b/docs/_posts/2010-08-07-post-image-caption.md
index 0f67dda1c593..7606e55e9bac 100644
--- a/docs/_posts/2010-08-07-post-image-caption.md
+++ b/docs/_posts/2010-08-07-post-image-caption.md
@@ -8,7 +8,7 @@ tags:
---
{% capture fig_img %}
-
+
{% endcapture %}
diff --git a/docs/_posts/2010-09-09-post-gallery.md b/docs/_posts/2010-09-09-post-gallery.md
index f7a9e91ce9cb..3bdd4ff3f477 100644
--- a/docs/_posts/2010-09-09-post-gallery.md
+++ b/docs/_posts/2010-09-09-post-gallery.md
@@ -131,4 +131,12 @@ And place it like so:
And for giggles one more gallery just to make sure this works. To fill page content container add `class="full"`.
-{% include gallery id="gallery3" class="full" caption="This is a third gallery example with two images and fills the entire content container." %}
\ No newline at end of file
+{% include gallery id="gallery3" class="full" caption="This is a third gallery example with two images and fills the entire content container." %}
+
+Gallery column layout can be overrided by setting a `layout`.
+
+```liquid
+{% raw %}{% include gallery id="gallery" layout="half" caption="This is a half gallery layout example." %}{% endraw %}
+```
+
+{% include gallery id="gallery" layout="half" caption="This is a half gallery layout example." %}
\ No newline at end of file
diff --git a/docs/_posts/2012-01-02-layout-comments.md b/docs/_posts/2012-01-02-layout-comments.md
index cf697b80a601..c138699cdabc 100644
--- a/docs/_posts/2012-01-02-layout-comments.md
+++ b/docs/_posts/2012-01-02-layout-comments.md
@@ -9,4 +9,4 @@ tags:
- layout
---
-This post should display comments.
\ No newline at end of file
+This post should display comments if a `provider` is enabled.
\ No newline at end of file
diff --git a/docs/_posts/2012-01-02-layout-post-date-disabled.md b/docs/_posts/2012-01-02-layout-post-date-disabled.md
new file mode 100644
index 000000000000..a10a3e4648eb
--- /dev/null
+++ b/docs/_posts/2012-01-02-layout-post-date-disabled.md
@@ -0,0 +1,18 @@
+---
+title: "Layout: Post Date Disabled"
+show_date: false
+tags:
+ - post date
+---
+
+This post has the date disabled. The date this post was published should not be showing if `show_date: false` is set in `_config.yml` or in this post's YAML Front Matter.
+
+If you could keep awake (but of course you can't) you would see your own mother doing this, and you would find it very interesting to watch her. It is quite like tidying up drawers. You would see her on her knees, I expect, lingering humorously over some of your contents, wondering where on earth you had picked this thing up, making discoveries sweet and not so sweet, pressing this to her cheek as if it were as nice as a kitten, and hurriedly stowing that out of sight. When you wake in the morning, the naughtiness and evil passions with which you went to bed have been folded up small and placed at the bottom of your mind and on the top, beautifully aired, are spread out your prettier thoughts, ready for you to put on.
+
+I don't know whether you have ever seen a map of a person's mind. Doctors sometimes draw maps of other parts of you, and your own map can become intensely interesting, but catch them trying to draw a map of a child's mind, which is not only confused, but keeps going round all the time. There are zigzag lines on it, just like your temperature on a card, and these are probably roads in the island, for the Neverland is always more or less an island, with astonishing splashes of colour here and there, and coral reefs and rakish-looking craft in the offing, and savages and lonely lairs, and gnomes who are mostly tailors, and caves through which a river runs, and princes with six elder brothers, and a hut fast going to decay, and one very small old lady with a hooked nose. It would be an easy map if that were all, but there is also first day at school, religion, fathers, the round pond, needle-work, murders, hangings, verbs that take the dative, chocolate pudding day, getting into braces, say ninety-nine, three-pence for pulling out your tooth yourself, and so on, and either these are part of the island or they are another map showing through, and it is all rather confusing, especially as nothing will stand still.
+
+Of course the Neverlands vary a good deal. John's, for instance, had a lagoon with flamingoes flying over it at which John was shooting, while Michael, who was very small, had a flamingo with lagoons flying over it. John lived in a boat turned upside down on the sands, Michael in a wigwam, Wendy in a house of leaves deftly sewn together. John had no friends, Michael had friends at night, Wendy had a pet wolf forsaken by its parents, but on the whole the Neverlands have a family resemblance, and if they stood still in a row you could say of them that they have each other's nose, and so forth. On these magic shores children at play are for ever beaching their coracles [simple boat]. We too have been there; we can still hear the sound of the surf, though we shall land no more.
+
+Of all delectable islands the Neverland is the snuggest and most compact, not large and sprawly, you know, with tedious distances between one adventure and another, but nicely crammed. When you play at it by day with the chairs and table-cloth, it is not in the least alarming, but in the two minutes before you go to sleep it becomes very real. That is why there are night-lights.
+
+Occasionally in her travels through her children's minds Mrs. Darling found things she could not understand, and of these quite the most perplexing was the word Peter. She knew of no Peter, and yet he was here and there in John and Michael's minds, while Wendy's began to be scrawled all over with him. The name stood out in bolder letters than any of the other words, and as Mrs. Darling gazed she felt that it had an oddly cocky appearance.
\ No newline at end of file
diff --git a/docs/_posts/2012-01-02-layout-post-date.md b/docs/_posts/2012-01-02-layout-post-date.md
new file mode 100644
index 000000000000..b31c9a275b5c
--- /dev/null
+++ b/docs/_posts/2012-01-02-layout-post-date.md
@@ -0,0 +1,18 @@
+---
+title: "Layout: Post Date Enabled"
+show_date: true
+tags:
+ - post date
+---
+
+This post has post date enabled. The date the post was published should show if `show_date: true` is added to it's YAML Front Matter or as a default in `_config.yml`.
+
+If you could keep awake (but of course you can't) you would see your own mother doing this, and you would find it very interesting to watch her. It is quite like tidying up drawers. You would see her on her knees, I expect, lingering humorously over some of your contents, wondering where on earth you had picked this thing up, making discoveries sweet and not so sweet, pressing this to her cheek as if it were as nice as a kitten, and hurriedly stowing that out of sight. When you wake in the morning, the naughtiness and evil passions with which you went to bed have been folded up small and placed at the bottom of your mind and on the top, beautifully aired, are spread out your prettier thoughts, ready for you to put on.
+
+I don't know whether you have ever seen a map of a person's mind. Doctors sometimes draw maps of other parts of you, and your own map can become intensely interesting, but catch them trying to draw a map of a child's mind, which is not only confused, but keeps going round all the time. There are zigzag lines on it, just like your temperature on a card, and these are probably roads in the island, for the Neverland is always more or less an island, with astonishing splashes of colour here and there, and coral reefs and rakish-looking craft in the offing, and savages and lonely lairs, and gnomes who are mostly tailors, and caves through which a river runs, and princes with six elder brothers, and a hut fast going to decay, and one very small old lady with a hooked nose. It would be an easy map if that were all, but there is also first day at school, religion, fathers, the round pond, needle-work, murders, hangings, verbs that take the dative, chocolate pudding day, getting into braces, say ninety-nine, three-pence for pulling out your tooth yourself, and so on, and either these are part of the island or they are another map showing through, and it is all rather confusing, especially as nothing will stand still.
+
+Of course the Neverlands vary a good deal. John's, for instance, had a lagoon with flamingoes flying over it at which John was shooting, while Michael, who was very small, had a flamingo with lagoons flying over it. John lived in a boat turned upside down on the sands, Michael in a wigwam, Wendy in a house of leaves deftly sewn together. John had no friends, Michael had friends at night, Wendy had a pet wolf forsaken by its parents, but on the whole the Neverlands have a family resemblance, and if they stood still in a row you could say of them that they have each other's nose, and so forth. On these magic shores children at play are for ever beaching their coracles [simple boat]. We too have been there; we can still hear the sound of the surf, though we shall land no more.
+
+Of all delectable islands the Neverland is the snuggest and most compact, not large and sprawly, you know, with tedious distances between one adventure and another, but nicely crammed. When you play at it by day with the chairs and table-cloth, it is not in the least alarming, but in the two minutes before you go to sleep it becomes very real. That is why there are night-lights.
+
+Occasionally in her travels through her children's minds Mrs. Darling found things she could not understand, and of these quite the most perplexing was the word Peter. She knew of no Peter, and yet he was here and there in John and Michael's minds, while Wendy's began to be scrawled all over with him. The name stood out in bolder letters than any of the other words, and as Mrs. Darling gazed she felt that it had an oddly cocky appearance.
\ No newline at end of file
diff --git a/docs/_posts/2012-01-03-layout-table-of-contents-include-post.md b/docs/_posts/2012-01-03-layout-table-of-contents-include-post.md
new file mode 100644
index 000000000000..622b04da1d69
--- /dev/null
+++ b/docs/_posts/2012-01-03-layout-table-of-contents-include-post.md
@@ -0,0 +1,139 @@
+---
+title: "Layout: Post with Nested Table of Contents via Helper"
+tags:
+ - table of contents
+---
+
+Tests table of contents with multiple levels to verify indentation is readible via helper include (deprecated).
+
+```
+{% raw %}{% include toc %}{% endraw %}
+```
+
+{% include toc %}
+
+# Enim laboris id ea elit elit deserunt
+
+Magna incididunt elit id enim nisi quis excepteur reprehenderit Lorem dolore dolore ad enim. Labore esse elit excepteur et elit dolor. Elit ut consectetur labore velit elit esse voluptate id commodo. Magna cillum officia consequat non occaecat mollit esse nisi quis.
+
+Nostrud veniam excepteur commodo enim pariatur velit est. Dolor consequat elit occaecat enim veniam ullamco qui est anim ex elit. Est minim aute magna laborum reprehenderit magna reprehenderit ullamco voluptate id sit aliqua. Id labore veniam ad duis aliquip commodo qui ex ut ipsum irure. In et sit ea cupidatat consectetur in nisi amet in cupidatat excepteur commodo amet.
+
+## 2 Sit adipisicing tempor duis velit cupidatat occaecat do amet
+
+Ad non dolore irure in. In do ut nostrud reprehenderit consequat aliqua sunt culpa voluptate amet minim ea. Eu dolore deserunt consectetur eu in minim sit nulla id id est amet consectetur. Tempor dolore ipsum magna amet velit aliquip ea anim non eu Lorem deserunt. Irure excepteur id adipisicing elit dolor ipsum eiusmod non nulla nisi sint qui et. Occaecat pariatur tempor ex nisi pariatur.
+
+Proident culpa nostrud id est qui fugiat duis aute. Cillum commodo pariatur nostrud culpa Lorem exercitation non. Consequat elit deserunt dolore voluptate sunt labore minim ut consequat minim.
+
+Sunt pariatur in ex non nulla proident ex ullamco Lorem do ipsum. Cillum est mollit reprehenderit excepteur labore labore elit dolore adipisicing ad quis quis aliqua sunt. Proident amet est reprehenderit deserunt amet cupidatat incididunt irure est elit.
+
+### 2.1 Ex et quis exercitation fugiat excepteur eiusmod mollit consequat id pariatur non adipisicing magna tempor
+
+Nostrud sunt nostrud incididunt adipisicing officia esse minim irure duis dolore adipisicing cupidatat. Eu non labore veniam ad sunt pariatur qui. Irure reprehenderit qui elit duis cillum sit officia consectetur sint deserunt do aute velit. Do id occaecat magna occaecat reprehenderit veniam pariatur Lorem. Officia sit cupidatat adipisicing laborum.
+
+#### 2.1.1 Ut nostrud reprehenderit proident culpa enim irure cupidatat sunt ex ea minim nostrud
+
+Laborum laboris et ut proident sit qui pariatur nisi commodo. Deserunt eiusmod eiusmod elit anim exercitation quis. Anim laboris irure minim elit fugiat velit esse officia amet reprehenderit id. Dolor eiusmod incididunt excepteur sint aute qui esse nostrud. Nisi qui adipisicing consectetur enim pariatur sint veniam esse.
+
+#### 2.1.2 Nisi non nisi ullamco ipsum cillum
+Minim officia tempor eiusmod sint magna reprehenderit do amet ex velit. Irure nulla ut veniam eu veniam proident esse pariatur cillum. Esse anim et proident cillum esse magna sint.
+
+#### 2.1.3 Ut pariatur do do eiusmod consequat do pariatur nisi ex anim reprehenderit nostrud
+Reprehenderit consectetur tempor labore dolore ad. Ullamco qui sunt quis deserunt id ipsum sit qui nisi esse deserunt ad exercitation. Dolore qui in mollit ex qui minim et ipsum reprehenderit. Tempor magna ipsum proident voluptate mollit quis consectetur veniam non aliquip cupidatat nisi culpa aute.
+
+##### 2.1.1.1 Ut aute quis ipsum fugiat dolor
+Occaecat excepteur et ea et exercitation ad aute minim incididunt incididunt aute sint officia aliquip. Quis cupidatat nostrud dolor consequat laboris eu ullamco qui esse excepteur aute. Veniam ut ipsum aute Lorem proident minim ea fugiat Lorem cillum. Qui esse id minim consequat ullamco aliqua pariatur ea mollit. Minim ea ipsum laborum consequat esse mollit pariatur. Voluptate sit voluptate non ut consectetur irure laboris ex adipisicing dolore elit aliquip velit. In eu veniam voluptate incididunt aute eu reprehenderit ut id voluptate.
+
+##### 2.1.1.2 Consequat nostrud quis officia et aliquip quis magna mollit veniam
+Magna duis exercitation dolor amet. Ea irure laborum sit officia reprehenderit enim aute magna duis. Elit fugiat ut proident sit.
+
+###### 2.1.1.1.1 Id cillum proident labore occaecat reprehenderit excepteur fugiat est
+
+Irure qui veniam incididunt irure consequat mollit consectetur est nostrud deserunt eiusmod nostrud quis. Eiusmod id proident eu aute exercitation irure consectetur sit dolor dolor in esse. Qui eu dolor ea est magna amet laborum qui irure. Reprehenderit excepteur voluptate fugiat exercitation voluptate laboris nostrud qui magna et officia.
+
+###### 2.1.1.1.2 In consectetur ea qui quis culpa nulla
+
+Ad quis duis dolore voluptate laborum eiusmod consequat sint. Cupidatat officia ex laborum ad non mollit excepteur ea. Nostrud elit in consequat sunt adipisicing reprehenderit ipsum proident irure. Sint velit laborum sint laboris ea. Veniam occaecat et in Lorem proident minim deserunt labore laborum reprehenderit. Consequat laborum deserunt culpa consectetur. Incididunt reprehenderit amet esse duis dolore pariatur adipisicing quis elit.
+
+###### 2.1.1.1.3 Culpa magna pariatur magna officia adipisicing ex minim ea do est
+
+Dolore reprehenderit aute ex id. Ipsum laboris sit quis enim labore ut sint cillum exercitation. Commodo aliqua exercitation enim sunt velit do laborum mollit irure dolor.
+
+###### 2.1.1.1.4 Veniam ipsum non reprehenderit pariatur
+
+Laboris amet quis sunt id dolor consectetur Lorem id aliquip laboris fugiat. Non ex magna deserunt veniam eiusmod. Irure culpa culpa dolore pariatur. Elit enim deserunt ut amet adipisicing elit laborum exercitation cupidatat et. Aliqua aliqua laborum exercitation commodo reprehenderit reprehenderit amet laboris ea ea ex amet in. Aute minim voluptate et ipsum culpa consequat.
+
+##### 2.1.1.3 Ut qui labore officia ad laboris eu amet minim tempor qui cupidatat duis aute
+
+In in dolore laboris irure est consequat magna ea non aute cupidatat tempor. Officia sit pariatur consequat laborum aliqua nulla anim nisi aliquip reprehenderit consequat. Ad duis labore minim consequat reprehenderit labore ex minim cillum magna incididunt adipisicing dolor. Non velit mollit minim consectetur minim. Cillum elit et amet est reprehenderit non. Elit adipisicing nostrud ea veniam occaecat commodo deserunt.
+
+##### 2.1.1.4 Magna ipsum nisi velit anim
+
+Eiusmod tempor dolor proident pariatur consequat sit non nostrud. Eiusmod duis elit esse Lorem dolore et minim elit consectetur eu ullamco. Adipisicing sunt excepteur eu mollit in nostrud.
+
+###### 2.1.1.4.1 Mollit nulla est tempor fugiat occaecat nostrud
+
+Exercitation eu labore Lorem culpa id enim ut officia aute proident in est irure. Nostrud adipisicing magna elit tempor ipsum culpa in incididunt consectetur incididunt veniam aute tempor sint. Officia est consectetur sint sint nostrud proident mollit. Dolore duis proident mollit consectetur tempor.
+
+###### 2.1.1.2.1 Culpa aliquip irure et nostrud esse consequat fugiat dolor
+
+Ad ut commodo elit amet officia ipsum labore do amet. Eiusmod sint irure magna proident nisi adipisicing mollit excepteur mollit proident culpa duis. Est reprehenderit consequat eiusmod deserunt duis ipsum esse amet incididunt.
+
+#### 2.1.4 Laboris exercitation nisi tempor dolore
+
+Elit culpa est eiusmod nostrud occaecat. Labore incididunt nostrud consectetur sint. Ut pariatur laborum incididunt culpa proident incididunt veniam veniam laboris adipisicing mollit. Ullamco magna tempor fugiat veniam in ipsum nisi mollit labore amet et sit quis. In consectetur fugiat Lorem culpa veniam minim. Irure aliqua est mollit consectetur id Lorem velit minim sit velit. Eiusmod magna do dolor est id reprehenderit minim fugiat minim incididunt incididunt laboris velit consequat.
+
+### 2.2 Officia irure duis et est sunt
+
+Consequat anim quis non nulla. Eiusmod pariatur sunt non culpa culpa ipsum nulla anim in. Non ad exercitation ut reprehenderit ut dolor laborum tempor ad qui magna fugiat irure. Sint commodo ea sint sunt. Irure qui pariatur tempor veniam reprehenderit amet est. Amet laboris proident Lorem deserunt proident duis esse do sit eu dolor qui duis eu. Mollit laboris nisi aute nulla consectetur exercitation nulla aliqua anim.
+
+## 3 Laborum eu magna proident proident tempor
+
+Occaecat aliqua id voluptate mollit aliquip. Elit excepteur magna esse commodo pariatur reprehenderit in in quis. Id dolore proident proident mollit tempor duis magna ullamco nulla velit consequat. In ut est aliquip in commodo ullamco sit sint.
+
+### 3.1 Amet enim do laboris ipsum aliqua eiusmod non eu
+
+Laborum magna deserunt do anim quis proident adipisicing. Dolore qui ex minim reprehenderit. Consectetur in cillum ad dolore ut id deserunt irure aute sint magna dolore adipisicing.
+
+### 3.2 Do exercitation ex elit incididunt sit cupidatat
+
+Excepteur aliqua nisi ullamco sunt fugiat laborum elit aliquip officia culpa. Est exercitation enim laborum amet exercitation. Eu quis qui eiusmod incididunt id do aliquip nostrud do esse enim excepteur enim pariatur. Aute adipisicing velit non culpa quis exercitation. Quis cupidatat anim occaecat Lorem ad mollit aute eiusmod quis dolor duis. Proident anim et nostrud ut aliquip irure adipisicing reprehenderit proident dolore magna. Consequat eu fugiat esse proident duis eu proident fugiat laboris ea veniam nisi reprehenderit.
+
+### 3.3 Officia aliquip fugiat ex pariatur nisi et nostrud adipisicing eu minim laboris eiusmod ea sunt
+
+Consectetur irure elit nulla elit non officia. Culpa Lorem minim dolor laboris enim labore do minim laborum. Fugiat deserunt nisi ut do incididunt incididunt ea anim exercitation sit duis. Irure esse pariatur labore enim labore qui anim culpa laborum velit consequat. Culpa in adipisicing excepteur est ipsum. In reprehenderit eiusmod ad ad non.
+
+### 3.4 Ipsum velit laborum est nostrud qui enim ullamco velit dolor Lorem magna
+
+Nulla magna dolor minim commodo. Sunt nulla cupidatat consequat eiusmod elit irure eiusmod excepteur. Sit incididunt irure minim magna. Tempor ipsum exercitation minim sunt labore dolor ullamco veniam enim nisi veniam adipisicing occaecat proident.
+
+### 3.5 Officia fugiat fugiat voluptate ullamco eiusmod duis minim aliqua consequat consectetur qui do sunt fugiat
+
+Non aute culpa irure qui aute adipisicing aute id commodo id. Laborum ullamco laboris velit in quis duis ut consequat do minim. In minim amet ut reprehenderit et voluptate. In quis Lorem occaecat nostrud excepteur nostrud dolore in nulla ad Lorem nisi. Dolor exercitation Lorem qui sint aute ipsum officia eiusmod aliquip Lorem sit. Reprehenderit ex veniam excepteur laboris magna dolore fugiat sit exercitation esse et consequat in sit. Incididunt pariatur ad esse anim aute do id eu.
+
+#### 3.5.1 Mollit laborum ea aliquip mollit quis commodo fugiat tempor deserunt exercitation sint culpa ipsum tempor
+
+Est cillum laborum cupidatat ullamco cupidatat magna laborum enim duis consequat est eu. Magna cillum Lorem proident non ut officia. Esse irure et laboris eu occaecat aute.
+
+##### 3.5.1.1 Nisi anim commodo consequat quis amet
+
+Sunt eu dolor enim enim consectetur et anim irure dolor velit cillum. Esse reprehenderit cillum incididunt adipisicing amet nostrud adipisicing. Minim mollit nostrud ipsum ea ut sit ex elit. Do esse ad et ipsum nisi sint anim culpa excepteur ipsum. Commodo nisi irure qui reprehenderit incididunt.
+
+###### 3.5.1.1.1 Culpa nulla Lorem adipisicing ut sit cupidatat laborum laborum cupidatat proident
+
+Dolore dolor sit sunt anim eu amet consectetur quis ea proident ex aliqua. Sunt laborum consectetur consectetur enim velit eiusmod labore commodo commodo laboris deserunt. Eiusmod enim do amet laborum commodo qui.
+
+### 3.6 Reprehenderit culpa consectetur veniam minim cillum in nostrud
+
+Lorem dolore sit aliqua tempor do voluptate ut esse. Minim velit ad velit commodo minim laborum. Qui qui reprehenderit non proident ullamco veniam aliquip.
+
+## 4 Laboris aute consequat id eu et Lorem amet
+
+Ad qui voluptate dolor veniam. Veniam mollit aute eiusmod eu labore incididunt sint proident. Non minim consequat anim sint. Aliquip non nisi nostrud proident. Eiusmod ut duis commodo sunt laboris irure eu. Laboris quis amet ad qui officia.
+
+## 5 Esse eu consequat consequat aliqua fugiat nulla ad labore consectetur eu pariatur nisi aute
+
+Duis proident ullamco fugiat aliqua sunt anim ea do irure est amet quis nulla cillum. Commodo voluptate dolor culpa sint aliquip voluptate exercitation anim cillum ad eu in amet. Sint fugiat qui commodo quis ex eu commodo officia aliquip irure. Non dolore elit excepteur id laboris irure consequat magna consectetur. Qui proident deserunt culpa tempor sit aute velit proident cillum ea.
+
+## 6 Aliquip sunt laborum excepteur cupidatat officia ad tempor veniam esse amet ea commodo sunt
+
+Ex minim pariatur est nisi exercitation exercitation reprehenderit id aliqua deserunt est. Laborum ullamco do ipsum minim ipsum aliquip voluptate voluptate aliqua. Magna proident velit veniam et minim commodo officia officia mollit nisi. Excepteur occaecat deserunt irure adipisicing minim adipisicing cupidatat non anim exercitation ex. Amet quis sunt sint veniam non id nisi ipsum mollit voluptate quis tempor tempor.
diff --git a/docs/_posts/2012-01-03-layout-table-of-contents-indent-post.md b/docs/_posts/2012-01-03-layout-table-of-contents-indent-post.md
new file mode 100644
index 000000000000..e36f8104ccd4
--- /dev/null
+++ b/docs/_posts/2012-01-03-layout-table-of-contents-indent-post.md
@@ -0,0 +1,134 @@
+---
+title: "Layout: Post with Nested Table of Contents"
+tags:
+ - table of contents
+toc: true
+---
+
+Tests table of contents with multiple levels to verify indentation is readible.
+
+# Enim laboris id ea elit elit deserunt
+
+Magna incididunt elit id enim nisi quis excepteur reprehenderit Lorem dolore dolore ad enim. Labore esse elit excepteur et elit dolor. Elit ut consectetur labore velit elit esse voluptate id commodo. Magna cillum officia consequat non occaecat mollit esse nisi quis.
+
+Nostrud veniam excepteur commodo enim pariatur velit est. Dolor consequat elit occaecat enim veniam ullamco qui est anim ex elit. Est minim aute magna laborum reprehenderit magna reprehenderit ullamco voluptate id sit aliqua. Id labore veniam ad duis aliquip commodo qui ex ut ipsum irure. In et sit ea cupidatat consectetur in nisi amet in cupidatat excepteur commodo amet.
+
+## 2 Sit adipisicing tempor duis velit cupidatat occaecat do amet
+
+Ad non dolore irure in. In do ut nostrud reprehenderit consequat aliqua sunt culpa voluptate amet minim ea. Eu dolore deserunt consectetur eu in minim sit nulla id id est amet consectetur. Tempor dolore ipsum magna amet velit aliquip ea anim non eu Lorem deserunt. Irure excepteur id adipisicing elit dolor ipsum eiusmod non nulla nisi sint qui et. Occaecat pariatur tempor ex nisi pariatur.
+
+Proident culpa nostrud id est qui fugiat duis aute. Cillum commodo pariatur nostrud culpa Lorem exercitation non. Consequat elit deserunt dolore voluptate sunt labore minim ut consequat minim.
+
+Sunt pariatur in ex non nulla proident ex ullamco Lorem do ipsum. Cillum est mollit reprehenderit excepteur labore labore elit dolore adipisicing ad quis quis aliqua sunt. Proident amet est reprehenderit deserunt amet cupidatat incididunt irure est elit.
+
+### 2.1 Ex et quis exercitation fugiat excepteur eiusmod mollit consequat id pariatur non adipisicing magna tempor
+
+Nostrud sunt nostrud incididunt adipisicing officia esse minim irure duis dolore adipisicing cupidatat. Eu non labore veniam ad sunt pariatur qui. Irure reprehenderit qui elit duis cillum sit officia consectetur sint deserunt do aute velit. Do id occaecat magna occaecat reprehenderit veniam pariatur Lorem. Officia sit cupidatat adipisicing laborum.
+
+#### 2.1.1 Ut nostrud reprehenderit proident culpa enim irure cupidatat sunt ex ea minim nostrud
+
+Laborum laboris et ut proident sit qui pariatur nisi commodo. Deserunt eiusmod eiusmod elit anim exercitation quis. Anim laboris irure minim elit fugiat velit esse officia amet reprehenderit id. Dolor eiusmod incididunt excepteur sint aute qui esse nostrud. Nisi qui adipisicing consectetur enim pariatur sint veniam esse.
+
+#### 2.1.2 Nisi non nisi ullamco ipsum cillum
+Minim officia tempor eiusmod sint magna reprehenderit do amet ex velit. Irure nulla ut veniam eu veniam proident esse pariatur cillum. Esse anim et proident cillum esse magna sint.
+
+#### 2.1.3 Ut pariatur do do eiusmod consequat do pariatur nisi ex anim reprehenderit nostrud
+Reprehenderit consectetur tempor labore dolore ad. Ullamco qui sunt quis deserunt id ipsum sit qui nisi esse deserunt ad exercitation. Dolore qui in mollit ex qui minim et ipsum reprehenderit. Tempor magna ipsum proident voluptate mollit quis consectetur veniam non aliquip cupidatat nisi culpa aute.
+
+##### 2.1.1.1 Ut aute quis ipsum fugiat dolor
+Occaecat excepteur et ea et exercitation ad aute minim incididunt incididunt aute sint officia aliquip. Quis cupidatat nostrud dolor consequat laboris eu ullamco qui esse excepteur aute. Veniam ut ipsum aute Lorem proident minim ea fugiat Lorem cillum. Qui esse id minim consequat ullamco aliqua pariatur ea mollit. Minim ea ipsum laborum consequat esse mollit pariatur. Voluptate sit voluptate non ut consectetur irure laboris ex adipisicing dolore elit aliquip velit. In eu veniam voluptate incididunt aute eu reprehenderit ut id voluptate.
+
+##### 2.1.1.2 Consequat nostrud quis officia et aliquip quis magna mollit veniam
+Magna duis exercitation dolor amet. Ea irure laborum sit officia reprehenderit enim aute magna duis. Elit fugiat ut proident sit.
+
+###### 2.1.1.1.1 Id cillum proident labore occaecat reprehenderit excepteur fugiat est
+
+Irure qui veniam incididunt irure consequat mollit consectetur est nostrud deserunt eiusmod nostrud quis. Eiusmod id proident eu aute exercitation irure consectetur sit dolor dolor in esse. Qui eu dolor ea est magna amet laborum qui irure. Reprehenderit excepteur voluptate fugiat exercitation voluptate laboris nostrud qui magna et officia.
+
+###### 2.1.1.1.2 In consectetur ea qui quis culpa nulla
+
+Ad quis duis dolore voluptate laborum eiusmod consequat sint. Cupidatat officia ex laborum ad non mollit excepteur ea. Nostrud elit in consequat sunt adipisicing reprehenderit ipsum proident irure. Sint velit laborum sint laboris ea. Veniam occaecat et in Lorem proident minim deserunt labore laborum reprehenderit. Consequat laborum deserunt culpa consectetur. Incididunt reprehenderit amet esse duis dolore pariatur adipisicing quis elit.
+
+###### 2.1.1.1.3 Culpa magna pariatur magna officia adipisicing ex minim ea do est
+
+Dolore reprehenderit aute ex id. Ipsum laboris sit quis enim labore ut sint cillum exercitation. Commodo aliqua exercitation enim sunt velit do laborum mollit irure dolor.
+
+###### 2.1.1.1.4 Veniam ipsum non reprehenderit pariatur
+
+Laboris amet quis sunt id dolor consectetur Lorem id aliquip laboris fugiat. Non ex magna deserunt veniam eiusmod. Irure culpa culpa dolore pariatur. Elit enim deserunt ut amet adipisicing elit laborum exercitation cupidatat et. Aliqua aliqua laborum exercitation commodo reprehenderit reprehenderit amet laboris ea ea ex amet in. Aute minim voluptate et ipsum culpa consequat.
+
+##### 2.1.1.3 Ut qui labore officia ad laboris eu amet minim tempor qui cupidatat duis aute
+
+In in dolore laboris irure est consequat magna ea non aute cupidatat tempor. Officia sit pariatur consequat laborum aliqua nulla anim nisi aliquip reprehenderit consequat. Ad duis labore minim consequat reprehenderit labore ex minim cillum magna incididunt adipisicing dolor. Non velit mollit minim consectetur minim. Cillum elit et amet est reprehenderit non. Elit adipisicing nostrud ea veniam occaecat commodo deserunt.
+
+##### 2.1.1.4 Magna ipsum nisi velit anim
+
+Eiusmod tempor dolor proident pariatur consequat sit non nostrud. Eiusmod duis elit esse Lorem dolore et minim elit consectetur eu ullamco. Adipisicing sunt excepteur eu mollit in nostrud.
+
+###### 2.1.1.4.1 Mollit nulla est tempor fugiat occaecat nostrud
+
+Exercitation eu labore Lorem culpa id enim ut officia aute proident in est irure. Nostrud adipisicing magna elit tempor ipsum culpa in incididunt consectetur incididunt veniam aute tempor sint. Officia est consectetur sint sint nostrud proident mollit. Dolore duis proident mollit consectetur tempor.
+
+###### 2.1.1.2.1 Culpa aliquip irure et nostrud esse consequat fugiat dolor
+
+Ad ut commodo elit amet officia ipsum labore do amet. Eiusmod sint irure magna proident nisi adipisicing mollit excepteur mollit proident culpa duis. Est reprehenderit consequat eiusmod deserunt duis ipsum esse amet incididunt.
+
+#### 2.1.4 Laboris exercitation nisi tempor dolore
+
+Elit culpa est eiusmod nostrud occaecat. Labore incididunt nostrud consectetur sint. Ut pariatur laborum incididunt culpa proident incididunt veniam veniam laboris adipisicing mollit. Ullamco magna tempor fugiat veniam in ipsum nisi mollit labore amet et sit quis. In consectetur fugiat Lorem culpa veniam minim. Irure aliqua est mollit consectetur id Lorem velit minim sit velit. Eiusmod magna do dolor est id reprehenderit minim fugiat minim incididunt incididunt laboris velit consequat.
+
+### 2.2 Officia irure duis et est sunt
+
+Consequat anim quis non nulla. Eiusmod pariatur sunt non culpa culpa ipsum nulla anim in. Non ad exercitation ut reprehenderit ut dolor laborum tempor ad qui magna fugiat irure. Sint commodo ea sint sunt. Irure qui pariatur tempor veniam reprehenderit amet est. Amet laboris proident Lorem deserunt proident duis esse do sit eu dolor qui duis eu. Mollit laboris nisi aute nulla consectetur exercitation nulla aliqua anim.
+
+## 3 Laborum eu magna proident proident tempor
+
+Occaecat aliqua id voluptate mollit aliquip. Elit excepteur magna esse commodo pariatur reprehenderit in in quis. Id dolore proident proident mollit tempor duis magna ullamco nulla velit consequat. In ut est aliquip in commodo ullamco sit sint.
+
+### 3.1 Amet enim do laboris ipsum aliqua eiusmod non eu
+
+Laborum magna deserunt do anim quis proident adipisicing. Dolore qui ex minim reprehenderit. Consectetur in cillum ad dolore ut id deserunt irure aute sint magna dolore adipisicing.
+
+### 3.2 Do exercitation ex elit incididunt sit cupidatat
+
+Excepteur aliqua nisi ullamco sunt fugiat laborum elit aliquip officia culpa. Est exercitation enim laborum amet exercitation. Eu quis qui eiusmod incididunt id do aliquip nostrud do esse enim excepteur enim pariatur. Aute adipisicing velit non culpa quis exercitation. Quis cupidatat anim occaecat Lorem ad mollit aute eiusmod quis dolor duis. Proident anim et nostrud ut aliquip irure adipisicing reprehenderit proident dolore magna. Consequat eu fugiat esse proident duis eu proident fugiat laboris ea veniam nisi reprehenderit.
+
+### 3.3 Officia aliquip fugiat ex pariatur nisi et nostrud adipisicing eu minim laboris eiusmod ea sunt
+
+Consectetur irure elit nulla elit non officia. Culpa Lorem minim dolor laboris enim labore do minim laborum. Fugiat deserunt nisi ut do incididunt incididunt ea anim exercitation sit duis. Irure esse pariatur labore enim labore qui anim culpa laborum velit consequat. Culpa in adipisicing excepteur est ipsum. In reprehenderit eiusmod ad ad non.
+
+### 3.4 Ipsum velit laborum est nostrud qui enim ullamco velit dolor Lorem magna
+
+Nulla magna dolor minim commodo. Sunt nulla cupidatat consequat eiusmod elit irure eiusmod excepteur. Sit incididunt irure minim magna. Tempor ipsum exercitation minim sunt labore dolor ullamco veniam enim nisi veniam adipisicing occaecat proident.
+
+### 3.5 Officia fugiat fugiat voluptate ullamco eiusmod duis minim aliqua consequat consectetur qui do sunt fugiat
+
+Non aute culpa irure qui aute adipisicing aute id commodo id. Laborum ullamco laboris velit in quis duis ut consequat do minim. In minim amet ut reprehenderit et voluptate. In quis Lorem occaecat nostrud excepteur nostrud dolore in nulla ad Lorem nisi. Dolor exercitation Lorem qui sint aute ipsum officia eiusmod aliquip Lorem sit. Reprehenderit ex veniam excepteur laboris magna dolore fugiat sit exercitation esse et consequat in sit. Incididunt pariatur ad esse anim aute do id eu.
+
+#### 3.5.1 Mollit laborum ea aliquip mollit quis commodo fugiat tempor deserunt exercitation sint culpa ipsum tempor
+
+Est cillum laborum cupidatat ullamco cupidatat magna laborum enim duis consequat est eu. Magna cillum Lorem proident non ut officia. Esse irure et laboris eu occaecat aute.
+
+##### 3.5.1.1 Nisi anim commodo consequat quis amet
+
+Sunt eu dolor enim enim consectetur et anim irure dolor velit cillum. Esse reprehenderit cillum incididunt adipisicing amet nostrud adipisicing. Minim mollit nostrud ipsum ea ut sit ex elit. Do esse ad et ipsum nisi sint anim culpa excepteur ipsum. Commodo nisi irure qui reprehenderit incididunt.
+
+###### 3.5.1.1.1 Culpa nulla Lorem adipisicing ut sit cupidatat laborum laborum cupidatat proident
+
+Dolore dolor sit sunt anim eu amet consectetur quis ea proident ex aliqua. Sunt laborum consectetur consectetur enim velit eiusmod labore commodo commodo laboris deserunt. Eiusmod enim do amet laborum commodo qui.
+
+### 3.6 Reprehenderit culpa consectetur veniam minim cillum in nostrud
+
+Lorem dolore sit aliqua tempor do voluptate ut esse. Minim velit ad velit commodo minim laborum. Qui qui reprehenderit non proident ullamco veniam aliquip.
+
+## 4 Laboris aute consequat id eu et Lorem amet
+
+Ad qui voluptate dolor veniam. Veniam mollit aute eiusmod eu labore incididunt sint proident. Non minim consequat anim sint. Aliquip non nisi nostrud proident. Eiusmod ut duis commodo sunt laboris irure eu. Laboris quis amet ad qui officia.
+
+## 5 Esse eu consequat consequat aliqua fugiat nulla ad labore consectetur eu pariatur nisi aute
+
+Duis proident ullamco fugiat aliqua sunt anim ea do irure est amet quis nulla cillum. Commodo voluptate dolor culpa sint aliquip voluptate exercitation anim cillum ad eu in amet. Sint fugiat qui commodo quis ex eu commodo officia aliquip irure. Non dolore elit excepteur id laboris irure consequat magna consectetur. Qui proident deserunt culpa tempor sit aute velit proident cillum ea.
+
+## 6 Aliquip sunt laborum excepteur cupidatat officia ad tempor veniam esse amet ea commodo sunt
+
+Ex minim pariatur est nisi exercitation exercitation reprehenderit id aliqua deserunt est. Laborum ullamco do ipsum minim ipsum aliquip voluptate voluptate aliqua. Magna proident velit veniam et minim commodo officia officia mollit nisi. Excepteur occaecat deserunt irure adipisicing minim adipisicing cupidatat non anim exercitation ex. Amet quis sunt sint veniam non id nisi ipsum mollit voluptate quis tempor tempor.
diff --git a/docs/_posts/2012-01-03-layout-table-of-contents-post.md b/docs/_posts/2012-01-03-layout-table-of-contents-post.md
index eaa7cc2285e4..01c14a2cf451 100644
--- a/docs/_posts/2012-01-03-layout-table-of-contents-post.md
+++ b/docs/_posts/2012-01-03-layout-table-of-contents-post.md
@@ -1,31 +1,29 @@
---
-title: "Layout: Post with Table Of Contents"
+title: "Layout: Post with Table of Contents"
header:
image: assets/images/unsplash-image-9.jpg
caption: "Photo credit: [**Unsplash**](https://unsplash.com)"
tags:
- table of contents
+toc: true
+toc_label: "Unique Title"
+toc_icon: "heart"
---
-{% include toc title="Unique Title" icon="file-text" %}
+Enable table of contents on post or page by adding `toc: true` to its YAML Front Matter. The title and icon can also be changed with:
-Testing Kramdown auto-generated table of contents with unique title and icon assigned in the include like so:
-
-```liquid
-{% raw %}{% include toc title="Unique Title" icon="file-text" %}{% endraw %}
+```yaml
+---
+toc: true
+toc_label: "Unique Title"
+toc_icon: "heart" # corresponding Font Awesome icon name (without fa prefix)
+---
```
## HTML Elements
Below is just about everything you'll need to style in the theme. Check the source code to see the many embedded elements within paragraphs.
-
Heading 1
-
Heading 2
-
Heading 3
-
Heading 4
-
Heading 5
-
Heading 6
-
## Body text
Lorem ipsum dolor sit amet, test link adipiscing elit. **This is strong**. Nullam dignissim convallis est. Quisque aliquam.
@@ -85,7 +83,7 @@ HTML and CSS are our tools. Mauris a ante. Suspendisse quam sem, consequat at, c
Make any link standout more when applying the `.btn` class.
```html
-Success Button
+Success Button
```
diff --git a/test/_posts/2012-01-03-layout-table-of-contents-bottom-post.md b/docs/_posts/2012-01-03-layout-table-of-contents-sticky.md
similarity index 77%
rename from test/_posts/2012-01-03-layout-table-of-contents-bottom-post.md
rename to docs/_posts/2012-01-03-layout-table-of-contents-sticky.md
index 09e985ce28bf..a8eae408204d 100644
--- a/test/_posts/2012-01-03-layout-table-of-contents-bottom-post.md
+++ b/docs/_posts/2012-01-03-layout-table-of-contents-sticky.md
@@ -1,29 +1,24 @@
---
-title: "Layout: Post with Table Of Contents Included at Bottom"
-header:
- image: assets/images/unsplash-image-9.jpg
- caption: "Photo credit: [**Unsplash**](https://unsplash.com)"
+title: "Layout: Post with Sticky Table of Contents"
tags:
- table of contents
+toc: true
+toc_sticky: true
---
-Testing Kramdown auto-generated table of contents included near the end of post content. If positioned correctly with CSS, it should appear in aligned (and to the right) of the main content.
+"Stick" table of contents to the top of a page by adding `toc_sticky: true` to its YAML Front Matter.
-```liquid
-{% raw %}{% include toc title="Unique Title" icon="file-text" %}{% endraw %}
+```yaml
+---
+toc: true
+toc_sticky: true
+---
```
## HTML Elements
Below is just about everything you'll need to style in the theme. Check the source code to see the many embedded elements within paragraphs.
-
Heading 1
-
Heading 2
-
Heading 3
-
Heading 4
-
Heading 5
-
Heading 6
-
## Body text
Lorem ipsum dolor sit amet, test link adipiscing elit. **This is strong**. Nullam dignissim convallis est. Quisque aliquam.
@@ -83,7 +78,7 @@ HTML and CSS are our tools. Mauris a ante. Suspendisse quam sem, consequat at, c
Make any link standout more when applying the `.btn` class.
```html
-Success Button
+Success Button
```
@@ -95,6 +90,4 @@ Make any link standout more when applying the `.btn` class.
## Notices
**Watch out!** You can also add notices by appending `{: .notice}` to a paragraph.
-{: .notice}
-
-{% include toc title="Unique Title" icon="file-text" %}
\ No newline at end of file
+{: .notice}
\ No newline at end of file
diff --git a/docs/_posts/2012-03-15-layout-author-override.md b/docs/_posts/2012-03-15-layout-author-override.md
index 50635b9d2c45..7a886cdaa671 100644
--- a/docs/_posts/2012-03-15-layout-author-override.md
+++ b/docs/_posts/2012-03-15-layout-author-override.md
@@ -2,31 +2,44 @@
title: "Layout: Author Override"
author: Billy Rick
excerpt: "A post to test author overrides using a data file."
+last_modified_at: 2018-09-10T12:32:27-04:00
---
Sites that may have content authored from various individuals can be accommodated by using [data files](https://jekyllrb.com/docs/datafiles/).
To attribute an author to a post or page that is different from the site author specified in `_config.yml`:
-**Step 1.** Create `_data/authors.yml` and add authors using the following format. Anything variables found under `author` in `_config.yml` can be used (e.g. `name`, `avatar`, `uri`, social media profiles, etc.).
+**Step 1.** Create `_data/authors.yml` and add authors using the following format. Anything variables found under `author` in `_config.yml` can be used (e.g. `name`, `bio`, `avatar`, author `links`, etc.).
```yaml
# /_data/authors.yml
Billy Rick:
- name: "Billy Rick"
- uri: "http://thewhip.com"
- email: "billy@rick.com"
- bio: "What do you want, jewels? I am a very extravagant man."
- avatar: "/assets/images/bio-photo-2.jpg"
- twitter: "extravagantman"
+ name : "Billy Rick"
+ bio : "What do you want, jewels? I am a very extravagant man."
+ avatar : "/assets/images/bio-photo-2.jpg"
+ links:
+ - label: "Email"
+ icon: "fas fa-fw fa-square-envelope"
+ url: "mailto:billyrick@rick.com"
+ - label: "Website"
+ icon: "fas fa-fw fa-link"
+ url: "https://thewhip.com"
+ - label: "Twitter"
+ icon: "fab fa-fw fa-square-x-twitter"
+ url: "https://twitter.com/extravagantman"
Cornelius Fiddlebone:
- name: "Cornelius Fiddlebone"
- email: "cornelius@thewhip.com"
- bio: "I ordered what?"
- avatar: "/assets/images/bio-photo.jpg"
- twitter: "rhymeswithsackit"
+ name : "Cornelius Fiddlebone"
+ bio : "I ordered what?"
+ avatar : "/assets/images/bio-photo.jpg"
+ links:
+ - label: "Email"
+ icon: "fas fa-fw fa-square-envelope"
+ url: "mailto:cornelius@thewhip.com"
+ - label: "Twitter"
+ icon: "fab fa-fw fa-square-x-twitter"
+ url: "https://twitter.com/rhymeswithsackit"
```
**Step 2.** Assign one of the authors in `authors.yml` to a post or page you wish to override the `site.author` with.
diff --git a/docs/_posts/2012-03-15-layout-header-image-external.md b/docs/_posts/2012-03-15-layout-header-image-external.md
index 8dd7a01ed303..1795bdcd13fa 100644
--- a/docs/_posts/2012-03-15-layout-header-image-external.md
+++ b/docs/_posts/2012-03-15-layout-header-image-external.md
@@ -1,7 +1,7 @@
---
title: "Layout: Header Image (External URL)"
header:
- image: https://farm5.staticflickr.com/4140/4939863887_84705982fd_b.jpg
+ image: https://live.staticflickr.com/8084/8396909762_813a2b1829_h.jpg
categories:
- Layout
- Uncategorized
diff --git a/docs/_posts/2012-03-15-layout-header-overlay-image-tagline.md b/docs/_posts/2012-03-15-layout-header-overlay-image-tagline.md
new file mode 100644
index 000000000000..32588bde9b53
--- /dev/null
+++ b/docs/_posts/2012-03-15-layout-header-overlay-image-tagline.md
@@ -0,0 +1,28 @@
+---
+title: "Layout: Header Image Overlay with Custom Tagline"
+tagline: "This is a custom tagline content which overrides the *default* page excerpt."
+header:
+ overlay_image: /assets/images/unsplash-image-1.jpg
+ caption: "Photo credit: [**Unsplash**](https://unsplash.com)"
+categories:
+ - Layout
+ - Uncategorized
+tags:
+ - edge case
+ - image
+ - layout
+last_modified_at: 2020-01-07T13:05:25-05:00
+---
+
+This post should display a **header with an overlay image** and **custom tagline**, if the theme supports it.
+
+Non-square images can provide some unique styling issues.
+
+This post tests overlay header images with custom `page.tagline`.
+
+```yaml
+tagline: "This is a custom tagline content which overrides the default page excerpt."
+header:
+ overlay_image: /assets/images/unsplash-image-1.jpg
+ caption: "Photo credit: [**Unsplash**](https://unsplash.com)"
+```
\ No newline at end of file
diff --git a/docs/_posts/2012-03-15-layout-header-overlay-image.md b/docs/_posts/2012-03-15-layout-header-overlay-image.md
index 11ecba0e80c3..e2b1a1965e1e 100644
--- a/docs/_posts/2012-03-15-layout-header-overlay-image.md
+++ b/docs/_posts/2012-03-15-layout-header-overlay-image.md
@@ -3,7 +3,9 @@ title: "Layout: Header Image Overlay"
header:
overlay_image: /assets/images/unsplash-image-1.jpg
caption: "Photo credit: [**Unsplash**](https://unsplash.com)"
- cta_url: "https://unsplash.com"
+ actions:
+ - label: "Learn more"
+ url: "https://unsplash.com"
categories:
- Layout
- Uncategorized
@@ -11,7 +13,7 @@ tags:
- edge case
- image
- layout
-last_modified_at: 2016-11-03T11:45:09-04:00
+last_modified_at: 2018-03-20T16:00:52-04:00
---
This post should display a **header with an overlay image**, if the theme supports it.
@@ -24,7 +26,7 @@ This post tests overlay header images.
You can use it by specifying the opacity (between 0 and 1) of a black overlay like so:
-
+
```yaml
excerpt: "This post should [...]"
@@ -32,13 +34,14 @@ header:
overlay_image: /assets/images/unsplash-image-1.jpg
overlay_filter: 0.5 # same as adding an opacity of 0.5 to a black background
caption: "Photo credit: [**Unsplash**](https://unsplash.com)"
- cta_label: "More Info"
- cta_url: "https://unsplash.com"
+ actions:
+ - label: "More Info"
+ url: "https://unsplash.com"
```
Or if you want to do more fancy things, go full rgba:
-
+
```yaml
excerpt: "This post should [...]"
@@ -46,6 +49,7 @@ header:
overlay_image: /assets/images/unsplash-image-1.jpg
overlay_filter: rgba(255, 0, 0, 0.5)
caption: "Photo credit: [**Unsplash**](https://unsplash.com)"
- cta_label: "More Info"
- cta_url: "https://unsplash.com"
+ actions:
+ - label: "More Info"
+ url: "https://unsplash.com"
```
\ No newline at end of file
diff --git a/docs/_posts/2012-03-15-layout-more-tag.md b/docs/_posts/2012-03-15-layout-more-tag.md
index 45940a6ed57b..c6cdc44fb7c1 100644
--- a/docs/_posts/2012-03-15-layout-more-tag.md
+++ b/docs/_posts/2012-03-15-layout-more-tag.md
@@ -1,5 +1,6 @@
---
title: "Layout: More Tag"
+excerpt_separator:
categories:
- Layout
- Uncategorized
@@ -11,7 +12,7 @@ tags:
This content is before the [excerpt separator tag](http://jekyllrb.com/docs/posts/#post-excerpts).
-Right after this sentence there should be a **continue reading** link of some sort in archive-index pages.
+Additional content before the more tag.
diff --git a/docs/_posts/2012-03-15-layout-sidebar-custom.md b/docs/_posts/2012-03-15-layout-sidebar-custom.md
index ee49173eba29..3b3739bc8ce6 100644
--- a/docs/_posts/2012-03-15-layout-sidebar-custom.md
+++ b/docs/_posts/2012-03-15-layout-sidebar-custom.md
@@ -1,14 +1,16 @@
---
title: "Layout: Sidebar Custom"
excerpt: "A post with custom sidebar content."
+last_modified_at: 2021-06-23T07:53:04-04:00
author_profile: false
sidebar:
- title: "Title"
- image: http://placehold.it/350x250
+ image: "/assets/images/350x250.png"
image_alt: "image"
text: "Some text here."
- title: "Another Title"
text: "More text here."
+ nav: sidebar-sample
---
This post has a custom sidebar set in the post's YAML Front Matter.
@@ -18,9 +20,10 @@ An example of how that YAML could look is:
```yaml
sidebar:
- title: "Title"
- image: http://placehold.it/350x250
+ image: "/assets/images/your-image.jpg"
image_alt: "image"
text: "Some text here."
- title: "Another Title"
text: "More text here."
+ nav: sidebar-sample
```
\ No newline at end of file
diff --git a/docs/_posts/2012-05-22-markup-text-readability-wide-page.md b/docs/_posts/2012-05-22-markup-text-readability-wide-page.md
new file mode 100644
index 000000000000..83ccfede68db
--- /dev/null
+++ b/docs/_posts/2012-05-22-markup-text-readability-wide-page.md
@@ -0,0 +1,52 @@
+---
+title: "Wide Single Layout Page"
+classes: wide
+excerpt: "A page with `classes: wide` set to expand the main content's width."
+tags:
+ - sample post
+ - readability
+ - test
+---
+
+When using `layout: single` add the following front matter to a page or post to widen the main content:
+
+```yaml
+classes: wide
+```
+
+Portland in shoreditch Vice, labore typewriter pariatur hoodie fap sartorial Austin. Pinterest literally occupy Schlitz forage. Odio ad blue bottle vinyl, 90's narwhal commodo bitters pour-over nostrud. Ugh est hashtag in, fingerstache adipisicing laboris esse Pinterest shabby chic Portland. Shoreditch bicycle rights anim, flexitarian laboris put a bird on it vinyl cupidatat narwhal. Hashtag artisan skateboard, flannel Bushwick nesciunt salvia aute fixie do plaid post-ironic dolor McSweeney's. Cliche pour-over chambray nulla four loko skateboard sapiente hashtag.
+
+Vero laborum commodo occupy. Semiotics voluptate mumblecore pug. Cosby sweater ullamco quinoa ennui assumenda, sapiente occupy delectus lo-fi. Ea fashion axe Marfa cillum aliquip. Retro Bushwick keytar cliche. Before they sold out sustainable gastropub Marfa readymade, ethical Williamsburg skateboard brunch qui consectetur gentrify semiotics. Mustache cillum irony, fingerstache magna pour-over keffiyeh tousled selfies.
+
+## Cupidatat 90's lo-fi authentic try-hard
+
+In pug Portland incididunt mlkshk put a bird on it vinyl quinoa. Terry Richardson shabby chic +1, scenester Tonx excepteur tempor fugiat voluptate fingerstache aliquip nisi next level. Farm-to-table hashtag Truffaut, Odd Future ex meggings gentrify single-origin coffee try-hard 90's.
+
+ * Sartorial hoodie
+ * Labore viral forage
+ * Tote bag selvage
+ * DIY exercitation et id ugh tumblr church-key
+
+Incididunt umami sriracha, ethical fugiat VHS ex assumenda yr irure direct trade. Marfa Truffaut bicycle rights, kitsch placeat Etsy kogi asymmetrical. Beard locavore flexitarian, kitsch photo booth hoodie plaid ethical readymade leggings yr.
+
+Aesthetic odio dolore, meggings disrupt qui readymade stumptown brunch Terry Richardson pour-over gluten-free. Banksy american apparel in selfies, biodiesel flexitarian organic meh wolf quinoa gentrify banjo kogi. Readymade tofu ex, scenester dolor umami fingerstache occaecat fashion axe Carles jean shorts minim. Keffiyeh fashion axe nisi Godard mlkshk dolore. Lomo you probably haven't heard of them eu non, Odd Future Truffaut pug keytar meggings McSweeney's Pinterest cred. Etsy literally aute esse, eu bicycle rights qui meggings fanny pack. Gentrify leggings pug flannel duis.
+
+## Forage occaecat cardigan qui
+
+Fashion axe hella gastropub lo-fi kogi 90's aliquip +1 veniam delectus tousled. Cred sriracha locavore gastropub kale chips, iPhone mollit sartorial. Anim dolore 8-bit, pork belly dolor photo booth aute flannel small batch. Dolor disrupt ennui, tattooed whatever salvia Banksy sartorial roof party selfies raw denim sint meh pour-over. Ennui eu cardigan sint, gentrify iPhone cornhole.
+
+> Whatever velit occaecat quis deserunt gastropub, leggings elit tousled roof party 3 wolf moon kogi pug blue bottle ea. Fashion axe shabby chic Austin quinoa pickled laborum bitters next level, disrupt deep v accusamus non fingerstache.
+
+Tote bag asymmetrical elit sunt. Occaecat authentic Marfa, hella McSweeney's next level irure veniam master cleanse. Sed hoodie letterpress artisan wolf leggings, 3 wolf moon commodo ullamco. Anim occupy ea labore Terry Richardson. Tofu ex master cleanse in whatever pitchfork banh mi, occupy fugiat fanny pack Austin authentic. Magna fugiat 3 wolf moon, labore McSweeney's sustainable vero consectetur. Gluten-free disrupt enim, aesthetic fugiat jean shorts trust fund keffiyeh magna try-hard.
+
+## Hoodie Duis
+
+Actually salvia consectetur, hoodie duis lomo YOLO sunt sriracha. Aute pop-up brunch farm-to-table odio, salvia irure occaecat. Sriracha small batch literally skateboard. Echo Park nihil hoodie, aliquip forage artisan laboris. Trust fund reprehenderit nulla locavore. Stumptown raw denim kitsch, keffiyeh nulla twee dreamcatcher fanny pack ullamco 90's pop-up est culpa farm-to-table. Selfies 8-bit do pug odio.
+
+### Thundercats Ho!
+
+Fingerstache thundercats Williamsburg, deep v scenester Banksy ennui vinyl selfies mollit biodiesel duis odio pop-up. Banksy 3 wolf moon try-hard, sapiente enim stumptown deep v ad letterpress. Squid beard brunch, exercitation raw denim yr sint direct trade. Raw denim narwhal id, flannel DIY McSweeney's seitan. Letterpress artisan bespoke accusamus, meggings laboris consequat Truffaut qui in seitan. Sustainable cornhole Schlitz, twee Cosby sweater banh mi deep v forage letterpress flannel whatever keffiyeh. Sartorial cred irure, semiotics ethical sed blue bottle nihil letterpress.
+
+Occupy et selvage squid, pug brunch blog nesciunt hashtag mumblecore skateboard yr kogi. Ugh small batch swag four loko. Fap post-ironic qui tote bag farm-to-table american apparel scenester keffiyeh vero, swag non pour-over gentrify authentic pitchfork. Schlitz scenester lo-fi voluptate, tote bag irony bicycle rights pariatur vero Vice freegan wayfarers exercitation nisi shoreditch. Chambray tofu vero sed. Street art swag literally leggings, Cosby sweater mixtape PBR lomo Banksy non in pitchfork ennui McSweeney's selfies. Odd Future Banksy non authentic.
+
+Aliquip enim artisan dolor post-ironic. Pug tote bag Marfa, deserunt pour-over Portland wolf eu odio intelligentsia american apparel ugh ea. Sunt viral et, 3 wolf moon gastropub pug id. Id fashion axe est typewriter, mlkshk Portland art party aute brunch. Sint pork belly Cosby sweater, deep v mumblecore kitsch american apparel. Try-hard direct trade tumblr sint skateboard. Adipisicing bitters excepteur biodiesel, pickled gastropub aute veniam.
diff --git a/docs/_posts/2013-01-10-markup-image-alignment.md b/docs/_posts/2013-01-10-markup-image-alignment.md
index b92dab67b340..8c4a40e0a09b 100644
--- a/docs/_posts/2013-01-10-markup-image-alignment.md
+++ b/docs/_posts/2013-01-10-markup-image-alignment.md
@@ -19,7 +19,7 @@ The image above happens to be **centered**.
{: .align-left} The rest of this paragraph is filler for the sake of seeing the text wrap around the 150×150 image, which is **left aligned**.
-As you can see the should be some space above, below, and to the right of the image. The text should not be creeping on the image. Creeping is just not right. Images need breathing room too. Let them speak like you words. Let them do their jobs without any hassle from the text. In about one more sentence here, we'll see that the text moves from the right of the image down below the image in seamless transition. Again, letting the do it's thing. Mission accomplished!
+As you can see there should be some space above, below, and to the right of the image. The text should not be creeping on the image. Creeping is just not right. Images need breathing room too. Let them speak like you words. Let them do their jobs without any hassle from the text. In about one more sentence here, we'll see that the text moves from the right of the image down below the image in seamless transition. Again, letting the do it's thing. Mission accomplished!
And now for a **massively large image**. It also has **no alignment**.
@@ -49,7 +49,7 @@ The figure above happens to be **centered**. The caption also has a link in it,
The rest of this paragraph is filler for the sake of seeing the text wrap around the 150×150 image, which is **left aligned**.
-As you can see the should be some space above, below, and to the right of the image. The text should not be creeping on the image. Creeping is just not right. Images need breathing room too. Let them speak like you words. Let them do their jobs without any hassle from the text. In about one more sentence here, we'll see that the text moves from the right of the image down below the image in seamless transition. Again, letting the do it's thing. Mission accomplished!
+As you can see there should be some space above, below, and to the right of the image. The text should not be creeping on the image. Creeping is just not right. Images need breathing room too. Let them speak like you words. Let them do their jobs without any hassle from the text. In about one more sentence here, we'll see that the text moves from the right of the image down below the image in seamless transition. Again, letting the do it's thing. Mission accomplished!
And now for a **massively large image**. It also has **no alignment**.
diff --git a/docs/_posts/2013-01-11-markup-html-tags-and-formatting.md b/docs/_posts/2013-01-11-markup-html-tags-and-formatting.md
index 2a34d618d3b3..f7d9437a1f5d 100644
--- a/docs/_posts/2013-01-11-markup-html-tags-and-formatting.md
+++ b/docs/_posts/2013-01-11-markup-html-tags-and-formatting.md
@@ -10,12 +10,11 @@ tags:
- formatting
- html
- markup
+toc: true
---
A variety of common markup showing how the theme styles them.
-# Header one
-
## Header two
### Header three
@@ -102,6 +101,17 @@ Do It Live
3. List item three
4. List item four
+## Forms
+
+
+
+
+
## Buttons
Make any link standout more when applying the `.btn` class.
@@ -110,7 +120,8 @@ Make any link standout more when applying the `.btn` class.
Success Button
```
-[Primary Button](#){: .btn}
+[Default Button](#){: .btn}
+[Primary Button](#){: .btn .btn--primary}
[Success Button](#){: .btn .btn--success}
[Warning Button](#){: .btn .btn--warning}
[Danger Button](#){: .btn .btn--danger}
@@ -119,7 +130,8 @@ Make any link standout more when applying the `.btn` class.
[Light Outline Button](#){: .btn .btn--light-outline}
```markdown
-[Primary Button Text](#link){: .btn}
+[Default Button Text](#link){: .btn}
+[Primary Button Text](#link){: .btn .btn--primary}
[Success Button Text](#link){: .btn .btn--success}
[Warning Button Text](#link){: .btn .btn--warning}
[Danger Button Text](#link){: .btn .btn--danger}
@@ -128,23 +140,38 @@ Make any link standout more when applying the `.btn` class.
[Light Outline Button](#link){: .btn .btn--light-outline}
```
-[X-Large Button](#){: .btn .btn--x-large}
-[Large Button](#){: .btn .btn--large}
-[Default Button](#){: .btn}
-[Small Button](#){: .btn .btn--small}
+[X-Large Button](#){: .btn .btn--primary .btn--x-large}
+[Large Button](#){: .btn .btn--primary .btn--large}
+[Default Button](#){: .btn .btn--primary }
+[Small Button](#){: .btn .btn--primary .btn--small}
```markdown
-[X-Large Button](#link){: .btn .btn--x-large}
-[Large Button](#link){: .btn .btn--large}
-[Default Button](#link){: .btn}
-[Small Button](#link){: .btn .btn--small}
+[X-Large Button](#link){: .btn .btn--primary .btn--x-large}
+[Large Button](#link){: .btn .btn--primary .btn--large}
+[Default Button](#link){: .btn .btn--primary }
+[Small Button](#link){: .btn .btn--primary .btn--small}
```
## Notices
-**Watch out!** You can also add notices by appending `{: .notice}` to a paragraph.
+**Watch out!** This paragraph of text has been [emphasized](#) with the `{: .notice}` class.
{: .notice}
+**Watch out!** This paragraph of text has been [emphasized](#) with the `{: .notice--primary}` class.
+{: .notice--primary}
+
+**Watch out!** This paragraph of text has been [emphasized](#) with the `{: .notice--info}` class.
+{: .notice--info}
+
+**Watch out!** This paragraph of text has been [emphasized](#) with the `{: .notice--warning}` class.
+{: .notice--warning}
+
+**Watch out!** This paragraph of text has been [emphasized](#) with the `{: .notice--success}` class.
+{: .notice--success}
+
+**Watch out!** This paragraph of text has been [emphasized](#) with the `{: .notice--danger}` class.
+{: .notice--danger}
+
## HTML Tags
### Address Tag
@@ -219,4 +246,4 @@ Still sticking with science and Albert Einstein's E = MC2, which shou
### Variable Tag
-This allows you to denote variables.
+This allows you to denote variables.
\ No newline at end of file
diff --git a/docs/_posts/2013-08-16-markup-syntax-highlighting.md b/docs/_posts/2013-08-16-markup-syntax-highlighting.md
index a1d9d42ae616..d18e7e1fd937 100644
--- a/docs/_posts/2013-08-16-markup-syntax-highlighting.md
+++ b/docs/_posts/2013-08-16-markup-syntax-highlighting.md
@@ -1,12 +1,13 @@
---
title: "Markup: Syntax Highlighting"
excerpt: "Post displaying the various ways of highlighting code in Markdown."
-last_modified_at: 2017-07-07T15:32:43-04:00
+last_modified_at: 2018-01-03T09:45:06-05:00
header:
teaser: "assets/images/markup-syntax-highlighting-teaser.jpg"
tags:
- code
- syntax highlighting
+toc: true
---
Syntax highlighting is a feature that displays source code, in different colors and fonts according to the category of terms. This feature facilitates writing in a structured language such as a programming language or a markup language as both structures and syntax errors are visually distinct. Highlighting does not affect the meaning of the text itself; it is intended only for human readers.[^1]
@@ -46,17 +47,6 @@ GitHub Flavored Markdown [fenced code blocks](https://help.github.com/articles/c
{% endraw %}
```
-{% highlight html linenos %}
-{% raw %}
- {% if page.previous %}
- Previous article
- {% endif %}
- {% if page.next %}
- Next article
- {% endif %}
-{% endraw %}
-{% endhighlight %}
-
```ruby
module Jekyll
class TagIndex < Page
@@ -94,8 +84,44 @@ Indentation matters. Be sure the indent of the code block aligns with the first
3. Now you can do this.
+### Jekyll Highlight Tag
+
+An example of a code blocking using Jekyll's [`{% raw %}{% highlight %}{% endraw %}` tag](https://jekyllrb.com/docs/templates/#code-snippet-highlighting).
+
+{% highlight javascript linenos %}
+// 'gulp html' -- does nothing
+// 'gulp html --prod' -- minifies and gzips HTML files for production
+gulp.task('html', () => {
+ return gulp.src(paths.siteFolderName + paths.htmlPattern)
+ .pipe(when(argv.prod, htmlmin({
+ removeComments: true,
+ collapseWhitespace: true,
+ collapseBooleanAttributes: false,
+ removeAttributeQuotes: false,
+ removeRedundantAttributes: false,
+ minifyJS: true,
+ minifyCSS: true
+ })))
+ .pipe(when(argv.prod, size({title: 'optimized HTML'})))
+ .pipe(when(argv.prod, gulp.dest(paths.siteFolderName)))
+ .pipe(when(argv.prod, gzip({append: true})))
+ .pipe(when(argv.prod, size({
+ title: 'gzipped HTML',
+ gzip: true
+ })))
+ .pipe(when(argv.prod, gulp.dest(paths.siteFolderName)))
+});
+{% endhighlight %}
+
+{% highlight wl linenos %}
+Module[{},
+ Sqrt[2]
+ 4
+]
+{% endhighlight %}
+
### GitHub Gist Embed
An example of a Gist embed below.
-
+
\ No newline at end of file
diff --git a/docs/_posts/2016-02-24-welcome-to-jekyll.md b/docs/_posts/2016-02-24-welcome-to-jekyll.md
index 521593642c60..024fc97dc96f 100644
--- a/docs/_posts/2016-02-24-welcome-to-jekyll.md
+++ b/docs/_posts/2016-02-24-welcome-to-jekyll.md
@@ -1,7 +1,7 @@
---
title: "Welcome to Jekyll!"
header:
- teaser: "https://farm5.staticflickr.com/4076/4940499208_b79b77fb0a_z.jpg"
+ teaser: "/assets/images/500x300.png"
categories:
- Jekyll
tags:
diff --git a/docs/_posts/2016-09-21-gemified-theme-alpha.md b/docs/_posts/2016-09-21-gemified-theme-alpha.md
index 87917fb66bf5..db2467980fac 100644
--- a/docs/_posts/2016-09-21-gemified-theme-alpha.md
+++ b/docs/_posts/2016-09-21-gemified-theme-alpha.md
@@ -1,16 +1,16 @@
---
title: "Gemified Theme -- Alpha Release"
-last_modified_at: 2016-11-03T11:46:00-04:00
+last_modified_at: 2018-03-20T16:00:58-04:00
categories:
- Jekyll
tags:
- update
+toc: true
+toc_label: "Getting Started"
---
Jekyll [themes distributed as Ruby gems](http://jekyllrb.com/docs/themes/) are finally here to make installing and upgrading much easier. Gone are the days of forking a repo just to "install it". Or dealing with merge conflicts when pulling in upstream commits to "upgrade it".
-{% include toc title="Getting Started" %}
-
If you're interested in testing out Minimal Mistakes as a gemified theme read on. There are a few caveats though:
1. Support for a theme `assets` folder was recently [added to Jekyll core](https://github.com/jekyll/jekyll/pull/5364), but has yet to be released or rolled into the `github-pages` gem. Meaning you can't use Minimal Mistakes as a Ruby gem there just yet... locally served or self-hosted installs should be fine if you don't mind using a pre-release version of Jekyll.
@@ -56,7 +56,6 @@ group :jekyll_plugins do
gem "jekyll-sitemap"
gem "jekyll-gist"
gem "jekyll-feed"
- gem "jemoji"
end
```
@@ -68,17 +67,17 @@ Run `bundle install` (or `bundle update` if you're updating an existing repo) to
Add `theme: "minimal-mistakes-jekyll"` to your `_config.yml` file.
-If you're migrating from an existing Minimal Mistakes site you shouldn't have to change anything else after this. If it's a new site consult then docs to [properly config]({{ "/docs/configuration/" | absolute_url }}).
+If you're migrating from an existing Minimal Mistakes site you shouldn't have to change anything else after this. If it's a new site consult then docs to [properly config]({{ "/docs/configuration/" | relative_url }}).
-**Please Note:** Paths for image headers, overlays, teasers, [galleries]({{ "/docs/helpers/#gallery" | absolute_url }}), and [feature rows]({{ "/docs/helpers/#feature-row" | absolute_url }}) have changed and now require a full path. Instead of just `image: filename.jpg` you'll need to use the full path eg: `image: assets/images/filename.jpg`. The preferred location is now `assets/images` but can be placed elsewhere or external hosted. This applies for image references in `_config.yml` and `author.yml`.
+**Please Note:** Paths for image headers, overlays, teasers, [galleries]({{ "/docs/helpers/#gallery" | relative_url }}), and [feature rows]({{ "/docs/helpers/#feature-row" | relative_url }}) have changed and now require a full path. Instead of just `image: filename.jpg` you'll need to use the full path eg: `image: assets/images/filename.jpg`. The preferred location is now `assets/images` but can be placed elsewhere or external hosted. This applies for image references in `_config.yml` and `author.yml`.
{: .notice--danger}
## Step 5: `jekyll new` Tweaks
If this is a new site be sure to add the following files to `_data/` and customize as you see fit. There is currently no way of bundling them in with the theme, so be sure to consult the docs on how to properly use both.
-- [`_data/ui-text.yml`](https://github.com/mmistakes/minimal-mistakes/blob/master/_data/ui-text.yml) - UI text [documentation]({{ "/docs/ui-text/" | absolute_url }})
-- [`_data/navigation.yml`](https://github.com/mmistakes/minimal-mistakes/blob/master/_data/navigation.yml) - navigation [documentation]({{ "/docs/navigation/" | absolute_url }})
+- [`_data/ui-text.yml`](https://github.com/mmistakes/minimal-mistakes/blob/master/_data/ui-text.yml) - UI text [documentation]({{ "/docs/ui-text/" | relative_url }})
+- [`_data/navigation.yml`](https://github.com/mmistakes/minimal-mistakes/blob/master/_data/navigation.yml) - navigation [documentation]({{ "/docs/navigation/" | relative_url }})
You'll also need to:
diff --git a/docs/_posts/2016-10-06-gemified-theme-beta.md b/docs/_posts/2016-10-06-gemified-theme-beta.md
index 5ab3b9a09bce..5889f3c629f5 100644
--- a/docs/_posts/2016-10-06-gemified-theme-beta.md
+++ b/docs/_posts/2016-10-06-gemified-theme-beta.md
@@ -1,16 +1,16 @@
---
title: "Gemified Theme -- Beta Release"
-last_modified_at: 2016-11-03T11:45:04-04:00
+last_modified_at: 2018-03-20T16:01:04-04:00
categories:
- Jekyll
tags:
- update
+toc: true
+toc_label: "Getting Started"
---
Hot on the heels of Jekyll v3.3.0 is a beta release of Minimal Mistakes... as a gemified theme.
-{% include toc title="Getting Started" %}
-
[`minimal-mistakes-jekyll`](https://rubygems.org/gems/minimal-mistakes-jekyll) can only be used with Jekyll proper. If you're hosting on GitHub Pages or using that gem the theme won't work. 3rd party themes haven't been white-listed so it's a no go for now.
Fine with all that? Great. Let's continue.
@@ -52,17 +52,17 @@ Run `bundle install` (or `bundle update` if you're updating an existing repo) to
Add `theme: "minimal-mistakes-jekyll"` to your `_config.yml` file.
-If you're migrating from an existing Minimal Mistakes site you shouldn't have to change anything else after this. If it's a new site consult then docs to [properly config]({{ "/docs/configuration/" | absolute_url }}).
+If you're migrating from an existing Minimal Mistakes site you shouldn't have to change anything else after this. If it's a new site consult then docs to [properly config]({{ "/docs/configuration/" | relative_url }}).
-**Please Note:** Paths for image headers, overlays, teasers, [galleries]({{ "/docs/helpers/#gallery" | absolute_url }}), and [feature rows]({{ "/docs/helpers/#feature-row" | absolute_url }}) have changed and now require a full path. Instead of just `image: filename.jpg` you'll need to use the full path eg: `image: assets/images/filename.jpg`. The preferred location is now `assets/images` but can be placed elsewhere or external hosted. This all applies for image references in `_config.yml` and `author.yml` as well.
+**Please Note:** Paths for image headers, overlays, teasers, [galleries]({{ "/docs/helpers/#gallery" | relative_url }}), and [feature rows]({{ "/docs/helpers/#feature-row" | relative_url }}) have changed and now require a full path. Instead of just `image: filename.jpg` you'll need to use the full path eg: `image: assets/images/filename.jpg`. The preferred location is now `assets/images` but can be placed elsewhere or external hosted. This all applies for image references in `_config.yml` and `author.yml` as well.
{: .notice--danger}
## Step 5: `jekyll new` Tweaks
If this is a new site be sure to add the following files to `_data/` and customize as you see fit. There is currently no way of bundling them in with the theme, so be sure to consult the docs on how to properly use both.
-- [`_data/ui-text.yml`](https://github.com/mmistakes/minimal-mistakes/blob/master/_data/ui-text.yml) - UI text [documentation]({{ "/docs/ui-text/" | absolute_url }})
-- [`_data/navigation.yml`](https://github.com/mmistakes/minimal-mistakes/blob/master/_data/navigation.yml) - navigation [documentation]({{ "/docs/navigation/" | absolute_url }})
+- [`_data/ui-text.yml`](https://github.com/mmistakes/minimal-mistakes/blob/master/_data/ui-text.yml) - UI text [documentation]({{ "/docs/ui-text/" | relative_url }})
+- [`_data/navigation.yml`](https://github.com/mmistakes/minimal-mistakes/blob/master/_data/navigation.yml) - navigation [documentation]({{ "/docs/navigation/" | relative_url }})
You'll also need to:
diff --git a/docs/_posts/2017-01-23-layout-header-video.md b/docs/_posts/2017-01-23-layout-header-video.md
index 9054e157ad78..f1aab7490ca8 100644
--- a/docs/_posts/2017-01-23-layout-header-video.md
+++ b/docs/_posts/2017-01-23-layout-header-video.md
@@ -2,7 +2,7 @@
title: "Layout: Header Video"
header:
video:
- id: XsxDH4HcOWA
+ id: -PVofD2A9t8
provider: youtube
categories:
- Layout
@@ -23,38 +23,38 @@ This post should display a **header with a responsive video**, if the theme supp
### YouTube
-To embed the following YouTube video at url `https://www.youtube.com/watch?v=XsxDH4HcOWA` (long version) or `https://youtu.be/XsxDH4HcOWA` (short version) into a post or page's main content you'd use:
+To embed the following YouTube video at url `https://www.youtube.com/watch?v=-PVofD2A9t8` (long version) or `https://youtu.be/-PVofD2A9t8` (short version) into a post or page's main content you'd use:
```liquid
-{% raw %}{% include video id="XsxDH4HcOWA" provider="youtube" %}{% endraw %}
+{% raw %}{% include video id="-PVofD2A9t8" provider="youtube" %}{% endraw %}
```
-{% include video id="XsxDH4HcOWA" provider="youtube" %}
+{% include video id="-PVofD2A9t8" provider="youtube" %}
To embed it as a video header you'd use the following YAML Front Matter
```yaml
header:
video:
- id: XsxDH4HcOWA
+ id: -PVofD2A9t8
provider: youtube
```
### Vimeo
-To embed the following Vimeo video at url `https://vimeo.com/97649261` into a post or page's main content you'd use:
+To embed the following Vimeo video at url `https://vimeo.com/212731897` into a post or page's main content you'd use:
```liquid
-{% raw %}{% include video id="97649261" provider="vimeo" %}{% endraw %}
+{% raw %}{% include video id="212731897" provider="vimeo" %}{% endraw %}
```
-{% include video id="97649261" provider="vimeo" %}
+{% include video id="212731897" provider="vimeo" %}
To embed it as a video header you'd use the following YAML Front Matter
```yaml
header:
video:
- id: 97649261
+ id: 212731897
provider: vimeo
```
\ No newline at end of file
diff --git a/docs/_posts/2017-11-28-post-exclude-search.md b/docs/_posts/2017-11-28-post-exclude-search.md
new file mode 100644
index 000000000000..821e4edd1900
--- /dev/null
+++ b/docs/_posts/2017-11-28-post-exclude-search.md
@@ -0,0 +1,29 @@
+---
+title: "Exclude Post from Search Index"
+search: false
+categories:
+ - Jekyll
+last_modified_at: 2018-02-19T08:06:00-05:00
+---
+
+This post should not appear in the search index because it has the following YAML Front Matter:
+
+```yaml
+search: false
+```
+
+**Note:** `search: false` only works to exclude posts when using Lunr as a search provider.
+{: .notice--info}
+
+To exclude files when using Algolia as a search provider add an array to `algolia.files_to_exclude` in your `_config.yml`. For more configuration options be sure to check their [full documentation](https://community.algolia.com/jekyll-algolia/options.html).
+
+```yaml
+algolia:
+ # Exclude more files from indexing
+ files_to_exclude:
+ - index.html
+ - index.md
+ - excluded-file.html
+ - _posts/2017-11-28-post-exclude-search.md
+ - subdirectory/*.html
+```
\ No newline at end of file
diff --git a/docs/_sass/minimal-mistakes.scss b/docs/_sass/minimal-mistakes.scss
deleted file mode 100644
index 3fde7b872dfb..000000000000
--- a/docs/_sass/minimal-mistakes.scss
+++ /dev/null
@@ -1,40 +0,0 @@
-/*!
- * Minimal Mistakes Jekyll Theme 4.5.2 by Michael Rose
- * Copyright 2017 Michael Rose - mademistakes.com | @mmistakes
- * Licensed under MIT (https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE.txt)
-*/
-
-/* Variables */
-@import "minimal-mistakes/variables";
-
-/* Mixins and functions */
-@import "minimal-mistakes/vendor/breakpoint/breakpoint";
-@include breakpoint-set("to ems", true);
-@import "minimal-mistakes/vendor/font-awesome/font-awesome";
-@import "minimal-mistakes/vendor/magnific-popup/magnific-popup"; // Magnific Popup
-@import "minimal-mistakes/vendor/susy/susy";
-@import "minimal-mistakes/mixins";
-
-/* Core CSS */
-@import "minimal-mistakes/reset";
-@import "minimal-mistakes/base";
-@import "minimal-mistakes/forms";
-@import "minimal-mistakes/tables";
-@import "minimal-mistakes/animations";
-
-/* Components */
-@import "minimal-mistakes/buttons";
-@import "minimal-mistakes/notices";
-@import "minimal-mistakes/masthead";
-@import "minimal-mistakes/navigation";
-@import "minimal-mistakes/footer";
-@import "minimal-mistakes/syntax";
-
-/* Utility classes */
-@import "minimal-mistakes/utilities";
-
-/* Layout specific */
-@import "minimal-mistakes/page";
-@import "minimal-mistakes/archive";
-@import "minimal-mistakes/sidebar";
-@import "minimal-mistakes/print";
\ No newline at end of file
diff --git a/docs/_sass/minimal-mistakes/_animations.scss b/docs/_sass/minimal-mistakes/_animations.scss
deleted file mode 100644
index 25ef77fbbfce..000000000000
--- a/docs/_sass/minimal-mistakes/_animations.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-/* ==========================================================================
- ANIMATIONS
- ========================================================================== */
-
-@-webkit-keyframes intro {
- 0% {
- opacity: 0;
- }
- 100% {
- opacity: 1;
- }
-}
-
-@keyframes intro {
- 0% {
- opacity: 0;
- }
- 100% {
- opacity: 1;
- }
-}
\ No newline at end of file
diff --git a/docs/_sass/minimal-mistakes/_archive.scss b/docs/_sass/minimal-mistakes/_archive.scss
deleted file mode 100644
index d6ab5f66aa49..000000000000
--- a/docs/_sass/minimal-mistakes/_archive.scss
+++ /dev/null
@@ -1,317 +0,0 @@
-/* ==========================================================================
- ARCHIVE
- ========================================================================== */
-
-.archive {
- margin-bottom: 2em;
-
- @include breakpoint($large) {
- float: right;
- width: calc(100% - #{$right-sidebar-width-narrow});
- padding-right: $right-sidebar-width-narrow;
- }
-
- @include breakpoint($x-large) {
- width: calc(100% - #{$right-sidebar-width});
- padding-right: $right-sidebar-width;
- }
-
- a {
- color: inherit;
- text-decoration: none;
- }
-}
-
-.archive__subtitle {
- margin: 1.414em 0 0;
- padding-bottom: 0.5em;
- font-size: $type-size-5;
- color: mix(#fff, $gray, 25%);
- border-bottom: 1px solid $border-color;
-
- + .list__item .archive__item-title {
- margin-top: 0.5em;
- }
-}
-
-.archive__item-title {
- margin-bottom: 0.25em;
- font-family: $sans-serif-narrow;
- overflow: hidden;
- text-overflow: ellipsis;
-
- a + a {
- opacity: 0.5;
- }
-}
-
-/* remove border*/
-.page__content {
-
- .archive__item-title {
- margin-top: 1em;
- border-bottom: none;
- }
-}
-
-.archive__item-excerpt {
- margin-top: 0;
- font-size: $type-size-6;
-
- & + p {
- text-indent: 0;
- }
-}
-
-.archive__item-teaser {
- border-radius: $border-radius;
- overflow: hidden;
- img {
- width: 100%;
- }
-}
-
-.archive__item:hover {
- .archive__item-teaser {
- box-shadow: 0 0 10px rgba(#000, 0.25);
- }
-
- .archive__item-title {
- text-decoration: underline;
- }
-}
-
-
-/*
- List view
- ========================================================================== */
-
-.list__item {
-
- .page__meta {
- margin: 0 0 4px;
- }
-}
-
-
-/*
- Grid view
- ========================================================================== */
-
-.archive {
-
- .grid__wrapper {
- /* extend grid elements to the right */
-
- @include breakpoint($large) {
- margin-right: -1 * $right-sidebar-width-narrow;
- }
-
- @include breakpoint($x-large) {
- margin-right: -1 * $right-sidebar-width;
- }
- }
-}
-
-.grid__item {
- margin-bottom: 2em;
-
- @include breakpoint($small) {
- float: left;
- width: span(5 of 10);
-
- &:nth-child(2n+1) {
- clear: both;
- margin-left: 0;
- }
-
- &:nth-child(2n+2) {
- clear: none;
- margin-left: gutter(of 10);
- }
- }
-
- @include breakpoint($medium) {
- margin-left: 0; /* override margin*/
- margin-right: 0; /* override margin*/
- width: span(3 of 12);
-
- &:nth-child(2n+1) {
- clear: none;
- }
-
- &:nth-child(4n+1) {
- clear: both;
- }
-
- &:nth-child(4n+2) {
- clear: none;
- margin-left: gutter(1 of 12);
- }
-
- &:nth-child(4n+3) {
- clear: none;
- margin-left: gutter(1 of 12);
- }
-
- &:nth-child(4n+4) {
- clear: none;
- margin-left: gutter(1 of 12);
- }
- }
-
- .page__meta {
- margin: 0 0 4px;
- }
-
- .archive__item-title {
- margin-top: 0.5em;
- font-size: $type-size-5;
- }
-
- .archive__item-excerpt {
- display: none;
-
- @include breakpoint($medium) {
- display: block;
- font-size: $type-size-6;
- }
- }
-
- .archive__item-teaser {
-
- @include breakpoint($small) {
- max-height: 200px;
- }
-
- @include breakpoint($medium) {
- max-height: 120px;
- }
- }
-}
-
-
-/*
- Features
- ========================================================================== */
-
-.feature__wrapper {
- @include clearfix();
- margin-bottom: 2em;
- border-bottom: 1px solid $border-color;
-}
-
-.feature__item {
- margin-bottom: 2em;
- font-size: 1.25rem;
-
- @include breakpoint($small) {
- float: left;
- margin-bottom: 0;
- width: span(4 of 12);
-
- &:nth-child(3n+1) {
- clear: both;
- margin-left: 0;
- }
-
- &:nth-child(3n+2) {
- clear: none;
- margin-left: gutter(of 12);
- }
-
- &:nth-child(3n+3) {
- clear: none;
- margin-left: gutter(of 12);
- }
-
- .feature__item-teaser {
- max-height: 200px;
- overflow: hidden;
- }
- }
-
- &--left {
- float: left;
- margin-left: 0;
- margin-right: 0;
- width: 100%;
- clear: both;
- font-size: 1.25rem;
-
- .archive__item-teaser {
- margin-bottom: 2em;
- }
-
- @include breakpoint($small) {
-
- .archive__item-teaser {
- float: left;
- width: span(5 of 12);
- }
-
- .archive__item-body {
- float: right;
- padding-left: gutter(0.5 of 12);
- padding-right: gutter(1 of 12);
- width: span(7 of 12);
- }
- }
- }
-
- &--right {
- float: left;
- margin-left: 0;
- margin-right: 0;
- width: 100%;
- clear: both;
- font-size: 1.25rem;
-
- .archive__item-teaser {
- margin-bottom: 2em;
- }
-
- @include breakpoint($small) {
- text-align: right;
-
- .archive__item-teaser {
- float: right;
- width: span(5 of 12);
- }
-
- .archive__item-body {
- float: right;
- width: span(7 of 12);
- padding-left: gutter(0.5 of 12);
- padding-right: gutter(1 of 12);
- }
- }
- }
-
- &--center {
- float: left;
- margin-left: 0;
- margin-right: 0;
- width: 100%;
- clear: both;
- font-size: 1.25rem;
-
- .archive__item-teaser {
- margin-bottom: 2em;
- }
-
- @include breakpoint($small) {
- text-align: center;
-
- .archive__item-teaser {
- margin: 0 auto;
- width: span(5 of 12);
- }
-
- .archive__item-body {
- margin: 0 auto;
- width: span(7 of 12);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/docs/_sass/minimal-mistakes/_base.scss b/docs/_sass/minimal-mistakes/_base.scss
deleted file mode 100644
index c5311a29b848..000000000000
--- a/docs/_sass/minimal-mistakes/_base.scss
+++ /dev/null
@@ -1,315 +0,0 @@
-/* ==========================================================================
- BASE ELEMENTS
- ========================================================================== */
-
-html {
- /* sticky footer fix */
- position: relative;
- min-height: 100%;
-}
-
-body {
- margin: 0;
- padding: 0;
- color: $text-color;
- font-family: $global-font-family;
- line-height: 1.5;
-
- &.overflow--hidden {
- /* when primary navigation is visible, the content in the background won't scroll */
- overflow: hidden;
- }
-}
-
-h1, h2, h3, h4, h5, h6 {
- margin: 2em 0 0.5em;
- line-height: 1.2;
- font-family: $header-font-family;
- font-weight: bold;
-}
-
-h1 {
- margin-top: 0;
- font-size: $type-size-3;
-}
-
-h2 {
- font-size: $type-size-4;
-}
-
-h3 {
- font-size: $type-size-5;
-}
-
-h4 {
- font-size: $type-size-6;
-}
-
-h5 {
- font-size: $type-size-6;
-}
-
-h6 {
- font-size: $type-size-6;
-}
-
-small, .small {
- font-size: $type-size-6;
-}
-
-p {
- margin-bottom: 1.3em;
-}
-
-u,
-ins {
- text-decoration: none;
- border-bottom: 1px solid $text-color;
- a {
- color: inherit;
- }
-}
-
-del a {
- color: inherit;
-}
-
-/* reduce orphans and widows when printing */
-
-p, pre, blockquote, ul, ol, dl, figure, table, fieldset {
- orphans: 3;
- widows: 3;
-}
-
-/* abbreviations */
-
-abbr[title],
-abbr[data-original-title] {
- text-decoration: none;
- cursor: help;
- border-bottom: 1px dotted $text-color;
-}
-
-/* blockquotes */
-
-blockquote {
- margin: 2em 1em 2em 0;
- padding-left: 1em;
- padding-right: 1em;
- font-style: italic;
- border-left: 0.25em solid $primary-color;
-
- cite {
- font-style: italic;
-
- &:before {
- content: "\2014";
- padding-right: 5px;
- }
- }
-}
-
-/* links */
-
-a {
- &:focus {
- @extend %tab-focus;
- }
-
- &:hover,
- &:active {
- outline: 0;
- }
-}
-
-/* code */
-
-tt, code, kbd, samp, pre {
- font-family: $monospace;
-}
-
-pre {
- overflow-x: auto; /* add scrollbars to wide code blocks*/
-}
-
-p > code,
-a > code,
-li > code,
-figcaption > code,
-td > code {
- padding-top: 0.1rem;
- padding-bottom: 0.1rem;
- font-size: $type-size-6;
- background: $code-background-color;
- border: 1px solid $lighter-gray;
- border-radius: $border-radius;
- box-shadow: $box-shadow;
-
- &:before, &:after {
- letter-spacing: -0.2em;
- content: "\00a0"; /* non-breaking space*/
- }
-}
-
-/* horizontal rule */
-
-hr {
- display: block;
- margin: 1em 0;
- border: 0;
- border-top: 1px solid $border-color;
-}
-
-/* lists */
-
-ul li,
-ol li {
- margin-bottom: 0.5em;
-}
-
-li ul,
-li ol {
- margin-top: 0.5em;
-}
-
-/*
- Media and embeds
- ========================================================================== */
-
-/* Figures and images */
-
-figure {
- display: -webkit-box;
- display: flex;
- -webkit-box-pack: justify;
- justify-content: space-between;
- -webkit-box-align: start;
- align-items: flex-start;
- flex-wrap: wrap;
- margin: 2em 0;
-
- img,
- iframe,
- .fluid-width-video-wrapper {
- margin-bottom: 1em;
- }
-
- img {
- width: 100%;
- border-radius: $border-radius;
- -webkit-transition: $global-transition;
- transition: $global-transition;
- }
-
- > a {
- display: block;
- }
-
- &.half {
- > a,
- > img {
- @include breakpoint($small) {
- width: calc(50% - 0.5em);
- }
- }
-
- figcaption {
- width: 100%;
- }
- }
-
- &.third {
- > a,
- > img {
- @include breakpoint($small) {
- width: calc(33.3333% - 0.5em);
- }
- }
-
- figcaption {
- width: 100%;
- }
- }
-}
-
-/* Figure captions */
-
-figcaption {
- margin-bottom: 0.5em;
- color: mix(#fff, $text-color, 25%);
- font-family: $caption-font-family;
- font-size: $type-size-6;
-
- a {
- color: inherit;
- text-decoration: none;
- border-bottom: 1px solid $light-gray;
- -webkit-transition: $global-transition;
- transition: $global-transition;
-
- &:hover {
- color: #000;
- border-bottom-color: #000;
- }
- }
-}
-
-
-/* Fix IE9 SVG bug */
-
-svg:not(:root) {
- overflow: hidden;
-}
-
-
-/*
- Navigation lists
- ========================================================================== */
-
-/**
- * Removes margins, padding, and bullet points from navigation lists
- *
- * Example usage:
- *
- *