Switch theme to Doks

This commit is contained in:
Elara 2021-01-31 00:54:37 -08:00
commit 98666f3a08
150 changed files with 24437 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
node_modules

6
.gitmodules vendored Normal file
View File

@ -0,0 +1,6 @@
[submodule "themes/ananke"]
path = themes/ananke
url = https://github.com/theNewDynamic/gohugo-theme-ananke
[submodule "themes/doks"]
path = themes/doks
url = https://github.com/h-enk/doks

12
.idea/arsenm-dev-site.iml Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/arsenm-dev-site.iml" filepath="$PROJECT_DIR$/.idea/arsenm-dev-site.iml" />
</modules>
</component>
</project>

7
.idea/vcs.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/themes/ananke" vcs="Git" />
</component>
</project>

115
.idea/workspace.xml Normal file
View File

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="BranchesTreeState">
<expand>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="LOCAL_ROOT" type="e8cecc67:BranchNodeDescriptor" />
</path>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
</path>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="GROUP_NODE:origin" type="e8cecc67:BranchNodeDescriptor" />
</path>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="GROUP_NODE:origin" type="e8cecc67:BranchNodeDescriptor" />
<item name="GROUP_NODE:dependabot" type="e8cecc67:BranchNodeDescriptor" />
</path>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="GROUP_NODE:origin" type="e8cecc67:BranchNodeDescriptor" />
<item name="GROUP_NODE:dependabot" type="e8cecc67:BranchNodeDescriptor" />
<item name="GROUP_NODE:npm_and_yarn" type="e8cecc67:BranchNodeDescriptor" />
</path>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="GROUP_NODE:origin" type="e8cecc67:BranchNodeDescriptor" />
<item name="GROUP_NODE:dependabot" type="e8cecc67:BranchNodeDescriptor" />
<item name="GROUP_NODE:npm_and_yarn" type="e8cecc67:BranchNodeDescriptor" />
<item name="GROUP_NODE:src" type="e8cecc67:BranchNodeDescriptor" />
</path>
</expand>
<select />
</component>
<component name="ChangeListManager">
<list default="true" id="6d777def-cf1a-4067-90b0-e601bfe77217" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="HTML File" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="ProjectId" id="1ikie6rCic6zTz95QYEGOHpup76" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="DefaultHtmlFileTemplate" value="HTML File" />
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/../cstate" />
<property name="vue.rearranger.settings.migration" value="true" />
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="6d777def-cf1a-4067-90b0-e601bfe77217" name="Default Changelist" comment="" />
<created>1602458083066</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1602458083066</updated>
<workItem from="1602458084295" duration="5482000" />
<workItem from="1602564212348" duration="42000" />
<workItem from="1602565400251" duration="209000" />
<workItem from="1603217970037" duration="2349000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
<option name="oldMeFiltersMigrated" value="true" />
</component>
<component name="WindowStateProjectService">
<state x="973" y="362" width="326" height="365" key="FileChooserDialogImpl" timestamp="1603222206412">
<screen x="0" y="27" width="1920" height="1053" />
</state>
<state x="973" y="362" key="FileChooserDialogImpl/0.27.1920.1053/1920.0.1920.1080@0.27.1920.1053" timestamp="1603222206412" />
<state x="973" y="362" width="326" height="365" key="FileChooserDialogImpl/0.27.1920.1053/1920.0.2560.1080@0.27.1920.1053" timestamp="1602564252356" />
<state x="853" y="264" width="505" height="399" key="search.everywhere.popup" timestamp="1602458728726">
<screen x="0" y="27" width="1920" height="1053" />
</state>
<state x="853" y="264" width="505" height="399" key="search.everywhere.popup/0.27.1920.1053/1920.0.2560.1080@0.27.1920.1053" timestamp="1602458728726" />
</component>
</project>

124
CHANGELOG.md Normal file
View File

@ -0,0 +1,124 @@
# Changelog
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### [0.1.5](https://github.com/h-enk/doks/compare/v0.1.4...v0.1.5) (2021-01-12)
### Features
* add hugo extended as a dependency ([258224c](https://github.com/h-enk/doks/commit/258224c7880911c709f80e478cacf265fafbbb5c))
* add hugothemes reqs ([b3afb4b](https://github.com/h-enk/doks/commit/b3afb4b4055f5cfe5a28d355ac26f577fc442392))
* remove exampleSite ([70db6bc](https://github.com/h-enk/doks/commit/70db6bca005c2e2f82e3ac64d9150c4d87889758))
### Documentation
* update code of conduct ([411123b](https://github.com/h-enk/doks/commit/411123b207cfe0715c31455f9e5cbcfd9a2d93cc))
* update frontpage ([f2f4937](https://github.com/h-enk/doks/commit/f2f49370a1ecd7d312de1b348e08e26d0a327121))
* update homepage ([4e65d01](https://github.com/h-enk/doks/commit/4e65d012c5887ff8db9650006d8c6f2303d1b338))
* update readme ([7283eb9](https://github.com/h-enk/doks/commit/7283eb997da055892d95015f1411b8528f9b2298))
* update readme ([9dc2f0e](https://github.com/h-enk/doks/commit/9dc2f0ebfe75f968f77290d911e3be035b34e954))
* update readme ([3ed1ad6](https://github.com/h-enk/doks/commit/3ed1ad6376959a678ceac990310dd51d2f2864f8))
* update readme ([6a35faf](https://github.com/h-enk/doks/commit/6a35fafe485d82f4a327b8b4ed10a703eac4af1b))
* update readme ([40dd5e4](https://github.com/h-enk/doks/commit/40dd5e4eea340f2fae24484bb86325f4410378ff))
* update readme ([7b75c47](https://github.com/h-enk/doks/commit/7b75c47c9e0e5953b781ce4f784a3083361970fb))
* update readme ([2d33818](https://github.com/h-enk/doks/commit/2d3381885ab6578ed44720e8f99033429034ba2a))
* update readme ([632623f](https://github.com/h-enk/doks/commit/632623f29401f38e0a853508346a94267372dfa1))
* update readme for docs discussions ([fb9e340](https://github.com/h-enk/doks/commit/fb9e340f6e48293ed2d32a73754ae081f41a0fc9))
* update showcase link ([74724eb](https://github.com/h-enk/doks/commit/74724eb4c53d15475492b2b7c103b3056260fd28))
### Dependencies
* bump to latest versions ([83f4163](https://github.com/h-enk/doks/commit/83f41636f71e547f4928597bdf67128fe954f83e))
* bump to latest versions ([372d9cb](https://github.com/h-enk/doks/commit/372d9cb64d4d68b6e95b252112e27ff9123b456c))
* bump versions to latest ([6184067](https://github.com/h-enk/doks/commit/6184067621a33cf0e53a4ae9fab269a91a11b730))
* bump versions to latest ([940f30d](https://github.com/h-enk/doks/commit/940f30dcebfde1a4a8900118fdf84f57410ed63a))
* bump versions to latest ([751d6c6](https://github.com/h-enk/doks/commit/751d6c68caa1811be92eaae378e16413f09eb12e))
* bump versions to latest ([b66c0a6](https://github.com/h-enk/doks/commit/b66c0a6221cddbaf997c032222276185cc910d9d))
* bump versions to latest ([1d7e3b8](https://github.com/h-enk/doks/commit/1d7e3b873b537e498ef4ef5ce5548b252a62c4bc))
* bump versions to latest ([0aa2e0f](https://github.com/h-enk/doks/commit/0aa2e0f7e07e930ba507f8652e0d6375c562def7))
* bump versions to latest ([ce5c733](https://github.com/h-enk/doks/commit/ce5c7336f95c3d6e6be4c7b3fb7db3812b7ac4ac))
* bump versions to latest ([cc62487](https://github.com/h-enk/doks/commit/cc6248722a91f163359ce42e83f06e0ae5277ef7))
### [0.1.4](https://github.com/h-enk/doks/compare/v0.1.3...v0.1.4) (2020-12-03)
### Documentation
* update content ([63ca41e](https://github.com/h-enk/doks/commit/63ca41e1076375eb99aad5ca6d77d95516b6f349))
### Dependencies
* bump versions ([c254be6](https://github.com/h-enk/doks/commit/c254be61754071600665858d6a7d2e2fbc105af3))
* bump versions to latest ([831442c](https://github.com/h-enk/doks/commit/831442c1a6f3372b2930681ca9c937d123b5f6a3))
* bump versions to latest ([0377b0d](https://github.com/h-enk/doks/commit/0377b0de75a3cc8027bd255961f6d0c184d82575))
* bump versions to latest ([358bad6](https://github.com/h-enk/doks/commit/358bad680156937886f2957b6c6fcdbcdd97782e))
* bump versions to latest ([7ce56d0](https://github.com/h-enk/doks/commit/7ce56d0a362c5099c0a6c50f6ad0f1c7ba969218))
### [0.1.3](https://github.com/h-enk/doks/compare/v0.1.2...v0.1.3) (2020-11-17)
### Dependencies
* add doks version file ([f8dcfbe](https://github.com/h-enk/doks/commit/f8dcfbeebfda5fef533b9b7bc2463fa0dfafd5fa))
* update doks version file ([d326669](https://github.com/h-enk/doks/commit/d326669c1d170cd5a76df1faafea472f3132fdf5))
### [0.1.2](https://github.com/h-enk/doks/compare/v0.1.1...v0.1.2) (2020-11-17)
### Dependencies
* bump versions ([6ce5813](https://github.com/h-enk/doks/commit/6ce5813543417f2328846a78b971201d7611781d))
### [0.1.1](https://github.com/h-enk/doks/compare/v0.1.0...v0.1.1) (2020-11-10)
### Documentation
* update content ([c4c83eb](https://github.com/h-enk/doks/commit/c4c83eb9b68674553c6a7e988249a808d75250b4))
* update reasons ([1cec423](https://github.com/h-enk/doks/commit/1cec4237b395ff306b765d47b29b8410c2884921))
### Dependencies
* bump eslint ([d794dab](https://github.com/h-enk/doks/commit/d794dabbe389b0f616ccfca564607f9be4670e0c))
* reinstall ([6705f4b](https://github.com/h-enk/doks/commit/6705f4bbc4da4cd967e7165ab3681137014633bb))
## 0.1.0 (2020-11-06)
### Features
* add flexsearch ([97d8e2c](https://github.com/h-enk/doks/commit/97d8e2c0e2568f9f9f653dcc243d06aa25482e70))
* add standard-version ([6d83ec3](https://github.com/h-enk/doks/commit/6d83ec308e0a9c4db5aa8d2f2c8309ad09673605))
* update static assets ([1b16e6b](https://github.com/h-enk/doks/commit/1b16e6bb3d87888b51eff2a8ce7d482cc1a5daf6))
### Bug Fixes
* update badges ([90cea78](https://github.com/h-enk/doks/commit/90cea786c1aec4cc7004fdf9571ad05a739aa96c))
* update file path ([73004c3](https://github.com/h-enk/doks/commit/73004c3f8eaee87957ab53bb1f27716acde7a361))
### Documentation
* update ci badge ([7c4373a](https://github.com/h-enk/doks/commit/7c4373a3a9a29f35f858f27ad4b67ad0379a3da0))
* update content ([c6ea4f3](https://github.com/h-enk/doks/commit/c6ea4f3ae54e1c7b890dffb2243c0a81eb96b295))
* update content ([c8c403d](https://github.com/h-enk/doks/commit/c8c403dbf9963eeef3c7dca7f6334929bbc5383b))
* update gist id ([81d7b1a](https://github.com/h-enk/doks/commit/81d7b1a5df91f238378723018a84d0dd4cd12dd5))
* update README ([a1d2e80](https://github.com/h-enk/doks/commit/a1d2e8091a0a2051fdbb3384ad797d8cd5251ce6))
* update README ([a9aa6ab](https://github.com/h-enk/doks/commit/a9aa6ab1af1ef5c8619dd3d7c64d96d5a21d956c))
* update README ([d0bcf8d](https://github.com/h-enk/doks/commit/d0bcf8d69dfd2d28d9f603945efc37a64b8b529b))
* update README ([f6dcccc](https://github.com/h-enk/doks/commit/f6dcccc458a1a4c5cac655976a665fb66b1f7b7a))
* update README ([eb4e714](https://github.com/h-enk/doks/commit/eb4e714f4f1fd97117a9fc155df6b6e4be55c0ed))
### Dependencies
* bump postcss ([12411c3](https://github.com/h-enk/doks/commit/12411c38a98fb362ff348e5c151fcb7813e8691e))
* bump postcss-cli ([88b49b5](https://github.com/h-enk/doks/commit/88b49b552849ab807f17ff9bfacfc847d9c2dbd2))
* bump versions ([53cf8ba](https://github.com/h-enk/doks/commit/53cf8ba6e260687c4fc5eea0774a7d0e6aa559f8))
* update for dependabot PR's ([bad7deb](https://github.com/h-enk/doks/commit/bad7debffa8d8e6b442edf6e51f07f915fdfdd83))

76
CODE_OF_CONDUCT.md Normal file
View File

@ -0,0 +1,76 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at hello@getdoks.org. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 Henk Verlinde
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
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.

113
README.md Normal file
View File

@ -0,0 +1,113 @@
<p align="center">
<a href="https://getdoks.org/">
<img alt="Doks" src="https://doks.netlify.app/doks.svg" width="60">
</a>
</p>
<h1 align="center">
Doks
</h1>
<h3 align="center">
Modern documentation theme
</h3>
<p align="center">
Doks is a Hugo theme helping you build modern documentation websites that are secure, fast, and SEO-ready — by default.
</p>
<p align="center">
<a href="https://github.com/h-enk/doks/blob/master/LICENSE">
<img src="https://img.shields.io/github/license/h-enk/doks?style=flat-square" alt="GitHub">
</a>
<a href="https://github.com/h-enk/doks/releases">
<img src="https://img.shields.io/github/v/release/h-enk/doks?include_prereleases&style=flat-square"alt="GitHub release (latest SemVer including pre-releases)">
</a>
<a href="https://github.com/h-enk/doks/actions?query=workflow%3A%22Hyas+CI%22">
<img src="https://img.shields.io/github/workflow/status/h-enk/doks/Hyas%20CI/master?style=flat-square" alt="GitHub Workflow Status (branch)">
</a>
<a href="https://app.netlify.com/sites/doks/deploys">
<img src="https://img.shields.io/netlify/895a161c-86be-48a2-8c57-a8c5d68cd1a4?style=flat-square" alt="Netlify">
</a>
</p>
![Doks — Modern Documentation Theme](https://raw.githubusercontent.com/h-enk/doks/master/images/tn.png)
## Demo
- [doks.netlify.app](https://doks.netlify.app/)
## Quick start
Get your Doks site in 1 min.
[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/h-enk/doks)
## Why Doks?
Nine reasons why you should use Doks:
1. __Security aware__. Get A+ scores on [Mozilla Observatory](https://observatory.mozilla.org/analyze/doks.netlify.app) out of the box. Easily change the default Security Headers to suit your needs.
2. __Fast by default__. Get 100 scores on [Google Lighthouse](https://googlechrome.github.io/lighthouse/viewer/?gist=7731347bb8ce999eff7428a8e763b637) by default. Doks removes unused css, prefetches links, and lazy loads images.
3. __SEO-ready__. Use sensible defaults for structured data, open graph, and Twitter cards. Or easily change the SEO settings to your liking.
4. __Development tools__. Code with confidence. Check styles, scripts, and markdown for errors and fix automatically or manually.
5. __Bootstrap framework__. Build robust, flexible, and intuitive websites with Bootstrap. Or use any other front-end framework if you prefer.
6. __Netlify-ready__. Deploy to Netlify with sensible defaults. Easily use Netlify Functions, Netlify Redirects, and Netlify Headers.
7. __Full text search__. Search your Doks site with FlexSearch. Easily customize index settings and search options to your liking.
8. __Page layouts__. Build pages with a landing page, blog, or documentation layout. Add custom sections and components to suit your needs.
9. __Dark mode__. Switch to a low-light UI with the click of a button. Change colors with variables to match your branding.
## Requirements
Doks uses npm for dependency management and customized build scripts. Installing npm is pretty simple. Download and install [Node.js](https://nodejs.org/) (it includes npm) for your platform. I recommend installing the current release.
## Get started
Have your local Doks site in three steps:
### 1. Create new Doks project
```bash
git clone https://github.com/h-enk/doks.git my-doks-site
```
### 2. Install npm packages
```bash
npm install
```
### 3. Start local development server
```bash
npm run start
```
## Other commands
Doks comes with [commands](https://getdoks.org/docs/prologue/commands/) for common tasks.
## Documentation
- [Netlify](https://docs.netlify.com/)
- [Hugo](https://gohugo.io/documentation/)
- [Doks](https://getdoks.org/)
## Communities
- [Netlify Community](https://community.netlify.com/)
- [Hugo Forums](https://discourse.gohugo.io/)
- [Doks Discussions](https://github.com/h-enk/doks/discussions)
## Blog
<!--START_SECTION:feed-->
* [Say hello to Doks 👋](https:&#x2F;&#x2F;getdoks.org&#x2F;blog&#x2F;say-hello-to-doks&#x2F;)
<!--END_SECTION:feed-->

13
archetypes/blog.md Normal file
View File

@ -0,0 +1,13 @@
---
title: "{{ replace .Name "-" " " | title }}"
description: ""
lead: ""
date: {{ .Date }}
lastmod: {{ .Date }}
draft: true
weight: 50
images: ["{{ .Name | urlize }}.jpg"]
contributors: []
---
{{< img src="{{ .Name | urlize }}.jpg" alt="{{ replace .Name "-" " " | title }}" caption="{{ replace .Name "-" " " | title }}" class="wide" >}}

8
archetypes/default.md Normal file
View File

@ -0,0 +1,8 @@
---
title: "{{ replace .Name "-" " " | title }}"
description: ""
date: {{ .Date }}
lastmod: {{ .Date }}
draft: true
images: []
---

16
archetypes/docs.md Normal file
View File

@ -0,0 +1,16 @@
---
title: "{{ replace .Name "-" " " | title }}"
description: ""
lead: ""
date: {{ .Date }}
lastmod: {{ .Date }}
draft: true
images: []
menu:
docs:
parent: ""
weight: 999
toc: true
---
{{< img src="{{ .Name | urlize }}.jpg" alt="{{ replace .Name "-" " " | title }}" caption="{{ replace .Name "-" " " | title }}" >}}

0
assets/fonts/.gitkeep Normal file
View File

0
assets/images/.gitkeep Normal file
View File

31
assets/js/app.js Normal file
View File

@ -0,0 +1,31 @@
document.getElementById('mode').addEventListener('click', () => {
document.body.classList.toggle('dark');
localStorage.setItem('theme', document.body.classList.contains('dark') ? 'dark' : 'light');
});
if (localStorage.getItem('theme') === 'dark') {
document.body.classList.add('dark');
}
/* eslint-disable */
var clipboard = new ClipboardJS('.btn-clipboard');
clipboard.on('success', function(e) {
/*
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
*/
e.clearSelection();
});
clipboard.on('error', function(e) {
console.error('Action:', e.action);
console.error('Trigger:', e.trigger);
});
/* eslint-enable */

147
assets/js/index.js Normal file
View File

@ -0,0 +1,147 @@
var suggestions = document.getElementById('suggestions');
var userinput = document.getElementById('userinput');
document.addEventListener('keydown', inputFocus);
function inputFocus(e) {
if (e.keyCode === 191 ) {
e.preventDefault();
userinput.focus();
}
if (e.keyCode === 27 ) {
userinput.blur();
suggestions.classList.add('d-none');
}
}
document.addEventListener('click', function(event) {
var isClickInsideElement = suggestions.contains(event.target);
if (!isClickInsideElement) {
suggestions.classList.add('d-none');
}
});
/*
Source:
- https://dev.to/shubhamprakash/trap-focus-using-javascript-6a3
*/
document.addEventListener('keydown',suggestionFocus);
function suggestionFocus(e){
const focusableSuggestions= suggestions.querySelectorAll('a');
const focusable= [...focusableSuggestions];
const index = focusable.indexOf(document.activeElement);
let nextIndex = 0;
if (e.keyCode === 38) {
e.preventDefault();
nextIndex= index > 0 ? index-1 : 0;
focusableSuggestions[nextIndex].focus();
}
else if (e.keyCode === 40) {
e.preventDefault();
nextIndex= index+1 < focusable.length ? index+1 : index;
focusableSuggestions[nextIndex].focus();
}
}
/*
Source:
- https://github.com/nextapps-de/flexsearch#index-documents-field-search
- https://raw.githack.com/nextapps-de/flexsearch/master/demo/autocomplete.html
*/
(function(){
var index = new FlexSearch({
preset: 'score',
cache: true,
doc: {
id: 'id',
field: [
'title',
'description',
'content',
],
store: [
'href',
'title',
'description',
],
},
});
var docs = [
{{ range $index, $page := (where .Site.Pages "Section" "docs") -}}
{
id: {{ $index }},
href: "{{ .Permalink | absURL }}",
title: {{ .Title | jsonify }},
description: {{ .Params.description | jsonify }},
content: {{ .Content | jsonify }}
},
{{ end -}}
];
index.add(docs);
userinput.addEventListener('input', show_results, true);
suggestions.addEventListener('click', accept_suggestion, true);
function show_results(){
var value = this.value;
var results = index.search(value, 5);
var entry, childs = suggestions.childNodes;
var i = 0, len = results.length;
suggestions.classList.remove('d-none');
results.forEach(function(page) {
entry = document.createElement('div');
entry.innerHTML = '<a href><span></span><span></span></a>';
a = entry.querySelector('a'),
t = entry.querySelector('span:first-child'),
d = entry.querySelector('span:nth-child(2)');
a.href = page.href;
t.textContent = page.title;
d.textContent = page.description;
console.log(page.description);
suggestions.appendChild(entry);
});
while(childs.length > len){
suggestions.removeChild(childs[i])
}
}
function accept_suggestion(){
while(suggestions.lastChild){
suggestions.removeChild(suggestions.lastChild);
}
return false;
}
}());

0
assets/js/vendor/.gitkeep vendored Normal file
View File

0
assets/lambda/.gitignore vendored Normal file
View File

View File

@ -0,0 +1,11 @@
exports.handler = (event, context, callback) => {
callback (null, {
statusCode: 200,
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
message: 'Hi from Lambda.',
}),
});
}

26
assets/scss/app.scss Normal file
View File

@ -0,0 +1,26 @@
/** Import Bootstrap functions */
@import "bootstrap/scss/functions";
/** Import theme variables */
@import "common/variables";
/** Import Bootstrap */
@import "bootstrap/scss/bootstrap";
/** Import theme styles */
@import "common/fonts";
@import "common/global";
@import "common/dark";
@import "components/alerts";
@import "components/buttons";
@import "components/code";
// @import "components/syntax";
@import "components/comments";
@import "components/forms";
@import "components/images";
@import "components/search";
@import "layouts/footer";
@import "layouts/header";
@import "layouts/pages";
@import "layouts/posts";
@import "layouts/sidebar";

View File

@ -0,0 +1,293 @@
/** Theme variables */
// Source: https://material.io/design/color/dark-theme.html
$body-bg-dark: $gray-900;
$body-overlay-dark: darken($body-bg-dark, 2.5%);
$border-dark: darken($body-bg-dark, 2.5%);
$body-color-dark: $gray-300;
$dots-dark: darken($body-color-dark, 50%);
$link-color-dark: $blue-300;
$button-color-dark: $link-color-dark;
$focus-color-dark: lighten($link-color-dark, 2.5%);
$selection-color-dark: lighten($link-color-dark, 2.5%);
$navbar-dark-color: $body-color-dark;
$navbar-dark-hover-color: $link-color-dark;
$navbar-dark-active-color: $link-color-dark;
/** Theme styles */
body.dark {
background: $body-bg-dark;
color: $body-color-dark;
}
body.dark a {
color: $link-color-dark;
}
body.dark a.text-body {
color: $body-color-dark !important;
}
body.dark .btn-primary {
@include button-variant($button-color-dark, $button-color-dark);
color: $body-bg-dark !important;
}
body.dark .navbar {
background: $body-bg-dark;
opacity: 0.975;
border-bottom: 1px solid $border-dark;
}
body.dark.home .navbar {
border-bottom: 0;
}
body.dark .navbar-light .navbar-brand {
color: $navbar-dark-color !important;
}
body.dark .navbar-light .navbar-nav .nav-link {
color: $navbar-dark-color;
}
body.dark .navbar-light .navbar-nav .nav-link:hover,
body.dark .navbar-light .navbar-nav .nav-link:focus {
color: $navbar-dark-hover-color;
}
body.dark .navbar-light .navbar-nav .nav-link.disabled {
color: $navbar-dark-disabled-color;
}
body.dark .navbar-light .navbar-nav .show > .nav-link,
body.dark .navbar-light .navbar-nav .active > .nav-link,
body.dark .navbar-light .navbar-nav .nav-link.show,
body.dark .navbar-light .navbar-nav .nav-link.active {
color: $navbar-dark-active-color;
}
body.dark .navbar-light .navbar-text {
color: $navbar-dark-color;
}
body.dark .alert-primary a {
color: $body-bg-dark;
}
body.dark .alert-warning {
background: $body-overlay-dark;
color: $body-color-dark;
}
body.dark .page-links a {
color: $body-color-dark;
}
body.dark .showcase-meta a {
color: $body-color-dark;
}
body.dark .showcase-meta a:hover,
body.dark .showcase-meta a:focus {
color: $link-color-dark;
}
body.dark .docs-link:hover,
body.dark .docs-link.active,
body.dark .page-links a:hover {
text-decoration: none;
color: $link-color-dark;
}
body.dark .navbar-light .navbar-text a {
color: $navbar-dark-active-color;
}
body.dark .docs-links h3.sidebar-link a,
body.dark .page-links h3.sidebar-link a {
color: $body-color-dark;
}
body.dark .navbar-light .navbar-text a:hover,
body.dark .navbar-light .navbar-text a:focus {
color: $navbar-dark-active-color;
}
body.dark .navbar .btn-link {
color: $navbar-dark-color;
}
body.dark .content .btn-link {
color: $link-color-dark;
}
body.dark .content .btn-link:hover {
color: $link-color-dark;
}
body.dark .navbar .btn-link:hover {
color: $navbar-dark-hover-color;
}
body.dark .navbar .btn-link:active {
color: $navbar-dark-active-color;
}
body.dark .form-control.is-search {
background: $body-overlay-dark;
/*
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-search'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right calc(0.375em + 0.1875rem) center;
background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
*/
}
body.dark .navbar-form::after {
color: $gray-700;
border: 1px solid $body-bg-dark;
}
body.dark .form-control:focus {
box-shadow: 0 0 0 0.2rem $focus-color-dark;
}
body.dark .border-top {
border-top: 1px solid $border-dark !important;
}
@include media-breakpoint-up(lg) {
body.dark .docs-sidebar {
order: 0;
border-right: 1px solid $border-dark;
}
}
body.dark .docs-navigation {
border-top: 1px solid $border-dark;
}
body.dark ::selection {
background: $selection-color-dark;
}
body.dark pre {
background: $body-overlay-dark;
color: $body-color-dark;
}
body.dark code {
background: $body-overlay-dark;
color: $body-color-dark;
}
body.dark blockquote {
border-left: 3px solid $border-dark;
}
body.dark .footer {
border-top: 1px solid $border-dark;
}
body.dark .docs-links,
body.dark .docs-toc {
scrollbar-width: thin;
scrollbar-color: $body-bg-dark $body-bg-dark;
}
body.dark .docs-links::-webkit-scrollbar,
body.dark .docs-toc::-webkit-scrollbar {
width: 5px;
}
body.dark .docs-links::-webkit-scrollbar-track,
body.dark .docs-toc::-webkit-scrollbar-track {
background: $body-bg-dark;
}
body.dark .docs-links::-webkit-scrollbar-thumb,
body.dark .docs-toc::-webkit-scrollbar-thumb {
background: $body-bg-dark;
}
body.dark .docs-links:hover,
body.dark .docs-toc:hover {
scrollbar-width: thin;
scrollbar-color: $border-dark $body-bg-dark;
}
body.dark .docs-links:hover::-webkit-scrollbar-thumb,
body.dark .docs-toc:hover::-webkit-scrollbar-thumb {
background: $border-dark;
}
body.dark .docs-links::-webkit-scrollbar-thumb:hover,
body.dark .docs-toc::-webkit-scrollbar-thumb:hover {
background: $border-dark;
}
body.dark .docs-links h3:not(:first-child) {
border-top: 1px solid $border-dark;
}
body.dark a.docs-link {
color: $body-color-dark;
}
body.dark .page-links li:not(:first-child) {
border-top: 1px dashed $border-dark;
}
body.dark .card {
background: $body-bg-dark;
border: 1px solid $border-dark;
}
body.dark .card.bg-light {
background: $body-overlay-dark !important;
}
body.dark .navbar .menu-icon .navicon {
background: $navbar-dark-color;
}
body.dark .navbar .menu-icon .navicon::before,
body.dark .navbar .menu-icon .navicon::after {
background: $navbar-dark-color;
}
body.dark .logo-light {
display: none !important;
}
body.dark .logo-dark {
display: inline-block !important;
}
body.dark .bg-light {
background: darken($body-bg-dark, 1.5%) !important;
}
body.dark .bg-dots {
background-image: radial-gradient($dots-dark 15%, transparent 15%);
}
body.dark .text-muted {
color: darken($body-color-dark, 7.5%) !important;
}
body.dark .alert-primary {
background: $link-color-dark;
color: $body-bg-dark;
}
body.dark .figure-caption {
color: $body-color-dark;
}

View File

@ -0,0 +1,71 @@
/* jost-regular - latin */
@font-face {
font-family: "Jost";
font-style: normal;
font-weight: 400;
font-display: swap;
src:
local("Jost"),
url("/fonts/vendor/jost/jost-v4-latin-regular.woff2") format("woff2"),
url("/fonts/vendor/jost/jost-v4-latin-regular.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}
/* jost-500 - latin */
@font-face {
font-family: "Jost";
font-style: normal;
font-weight: 500;
font-display: swap;
src:
local("Jost"),
url("/fonts/vendor/jost/jost-v4-latin-500.woff2") format("woff2"),
url("/fonts/vendor/jost/jost-v4-latin-500.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}
/* jost-700 - latin */
@font-face {
font-family: "Jost";
font-style: normal;
font-weight: 700;
font-display: swap;
src:
local("Jost"),
url("/fonts/vendor/jost/jost-v4-latin-700.woff2") format("woff2"),
url("/fonts/vendor/jost/jost-v4-latin-700.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}
/* jost-italic - latin */
@font-face {
font-family: "Jost";
font-style: italic;
font-weight: 400;
font-display: swap;
src:
local("Jost"),
url("/fonts/vendor/jost/jost-v4-latin-italic.woff2") format("woff2"),
url("/fonts/vendor/jost/jost-v4-latin-italic.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}
/* jost-500italic - latin */
@font-face {
font-family: "Jost";
font-style: italic;
font-weight: 500;
font-display: swap;
src:
local("Jost"),
url("/fonts/vendor/jost/jost-v4-latin-500italic.woff2") format("woff2"),
url("/fonts/vendor/jost/jost-v4-latin-500italic.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}
/* jost-700italic - latin */
@font-face {
font-family: "Jost";
font-style: italic;
font-weight: 700;
font-display: swap;
src:
local("Jost"),
url("/fonts/vendor/jost/jost-v4-latin-700italic.woff2") format("woff2"),
url("/fonts/vendor/jost/jost-v4-latin-700italic.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}

View File

@ -0,0 +1,210 @@
.contributors .content,
.blog .content,
.page .content,
.error404 .content,
.docs.list .content,
.tutorial.list .content,
.showcase.list .content {
padding-top: 1rem;
padding-bottom: 3rem;
}
h1,
h2,
h3,
h4,
h5,
h6,
.h1,
.h2,
.h3,
.h4,
.h5,
.h6 {
margin: 2rem 0 1rem;
}
@include media-breakpoint-up(md) {
body {
font-size: $font-size-md;
padding-top: 4rem !important;
}
h1,
h2,
h3,
h4,
h5,
h6,
.h1,
.h2,
.h3,
.h4,
.h5,
.h6 {
margin-bottom: 1.125rem;
}
}
.home h1 {
/* font-size: calc(1.375rem + 1.5vw); */
font-size: calc(1.875rem + 1.5vw);
}
.section {
padding-top: 5rem;
padding-bottom: 5rem;
}
.section-md {
padding-top: 3rem;
padding-bottom: 3rem;
}
.section-sm {
padding-top: 1rem;
padding-bottom: 1rem;
}
/*
.section svg {
display: inline-block;
width: 2rem;
height: 2rem;
vertical-align: text-top;
}
*/
body {
padding-top: 3.5625rem;
}
.docs-sidebar {
order: 2;
}
@include media-breakpoint-up(lg) {
.docs-sidebar {
order: 0;
border-right: 1px solid $gray-200;
}
@supports ((position:-webkit-sticky) or (position:sticky)) {
.docs-sidebar {
position: -webkit-sticky;
position: sticky;
top: 4rem;
z-index: 1000;
height: calc(100vh - 4rem);
}
}
}
@include media-breakpoint-up(xl) {
.docs-sidebar {
flex: 0 1 320px;
}
}
.docs-links {
padding-bottom: 5rem;
}
@include media-breakpoint-up(lg) {
@supports ((position: -webkit-sticky) or (position: sticky)) {
.docs-links {
max-height: calc(100vh - 4rem);
overflow-y: scroll;
}
}
}
@include media-breakpoint-up(lg) {
.docs-links {
display: block;
width: auto;
margin-right: -1.5rem;
padding-bottom: 4rem;
}
}
.docs-toc {
order: 2;
}
@supports ((position:-webkit-sticky) or (position:sticky)) {
.docs-toc {
position: -webkit-sticky;
position: sticky;
top: 4rem;
height: calc(100vh - 4rem);
overflow-y: auto;
}
}
.docs-content {
padding-bottom: 3rem;
order: 1;
}
.docs-navigation {
border-top: 1px solid $gray-200;
margin-top: 2rem;
margin-bottom: 0;
padding-top: 2rem;
}
.docs-navigation a {
font-size: $font-size-base * 0.9;
}
@include media-breakpoint-up(lg) {
.docs-navigation {
margin-bottom: -1rem;
}
.docs-navigation a {
font-size: $font-size-base;
}
}
#TableOfContents ul {
padding-left: 0;
list-style: none;
}
::selection {
background: lighten($primary, 55%);
}
.bg-dots {
background-image: radial-gradient($gray-300 15%, transparent 15%);
background-position: 0 0;
background-size: 1rem 1rem;
-webkit-mask: linear-gradient(to top, #fff, transparent);
mask: linear-gradient(to top, #fff, transparent);
width: 100%;
height: 9rem;
margin-top: -10rem;
z-index: -1;
}
.bg-dots-md {
margin-top: -11rem;
}
.bg-dots-lg {
margin-top: -12rem;
}
// https://fossheim.io/writing/posts/css-text-gradient/
.gradient-text {
background-color: $primary;
background-image: linear-gradient(90deg, $primary, $blue-300 50%, $pink-500);
background-size: 100%;
background-repeat: repeat;
-webkit-background-clip: text;
-moz-background-clip: text;
-webkit-text-fill-color: transparent;
-moz-text-fill-color: transparent;
}

View File

@ -0,0 +1,130 @@
// Color system
$white: #fff;
$gray-100: #f8f9fa;
$gray-200: #e9ecef;
$gray-300: #dee2e6;
$gray-400: #ced4da;
$gray-500: #adb5bd;
$gray-600: #6c757d;
$gray-700: #495057;
$gray-800: #343a40;
$gray-900: #212529;
$black: #000;
$yellow: #ffe000;
$black: #1d2d35;
$beige: #fbf7f0;
$red: #e55235;
$purple: #5d2f86;
$brown: #aa9c84;
$blue-300: #8ed6fb;
$pink-500: #d32e9d;
$primary: $purple;
/** Bootstrap navbar fix (https://git.io/fADqW) */
$navbar-dark-toggler-icon-bg: none;
$navbar-light-toggler-icon-bg: none;
// Options
//
// Quickly modify global styling by enabling or disabling optional features.
$enable-responsive-font-sizes: true;
// Body
//
// Settings for the `<body>` element.
$body-bg: $white;
$body-color: $black;
// Grid containers
//
// Define the maximum width of `.container` for different screen sizes.
$container-max-widths: (
sm: 540px,
md: 720px,
lg: 960px,
xl: 1240px
);
@include _assert-ascending($container-max-widths, "$container-max-widths");
// Grid columns
//
// Set the number of columns and specify the width of the gutters.
$grid-columns: 16;
$grid-gutter-width: 48px;
$grid-row-columns: 6;
// Components
//
// Define common padding and border radius sizes and more.
$border-color: $gray-200;
// Typography
//
// Font, line-height, and color for body text, headings, and more.
// stylelint-disable value-keyword-case
$font-family-sans-serif: "Jost", -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
$font-family-monospace: sfmono-regular, menlo, monaco, consolas, "Liberation Mono", "Courier New", monospace;
$font-family-base: $font-family-sans-serif;
// stylelint-enable value-keyword-case
$font-size-base: 1rem; // Assumes the browser default, typically `16px`
$font-size-xl: $font-size-base * 1.375;
$font-size-lg: $font-size-base * 1.25;
$font-size-md: $font-size-base * 1.125;
$font-size-sm: $font-size-base * 0.875;
$line-height-base: 1.5;
$headings-font-family: null;
$headings-font-weight: 700;
$lead-font-weight: 400;
// Spacing
//
// Control the default styling of most Bootstrap elements by modifying these
// variables. Mostly focused on spacing.
// You can add more entries to the $spacers map, should you need more variation.
$spacer: 1rem;
// Navbar
$navbar-padding-y: $spacer / 2;
$navbar-padding-x: 0;
$navbar-nav-link-padding-x: 0.5rem;
$navbar-light-color: $black;
$navbar-light-hover-color: $primary;
$navbar-light-active-color: $primary;
// Cards
$card-border-color: $gray-200;
// Alerts
//
// Define alert colors, border radius, and padding.
$alert-padding-y: 1rem;
$alert-padding-x: 1.5rem;
$alert-margin-bottom: 0;
$alert-border-radius: 0;
$alert-link-font-weight: $headings-font-weight;
$alert-border-width: 0;
$alert-bg-level: 0;
$alert-border-level: 0;
$alert-color-level: 0;

View File

@ -0,0 +1,63 @@
.alert {
font-family: $font-family-monospace;
font-size: $font-size-sm;
}
.alert-icon {
margin-right: 0.75rem;
}
.docs .alert {
margin: 2rem -1.5rem;
}
.alert .alert-link {
text-decoration: underline;
}
.alert-dark {
color: $white;
background-color: $black;
}
.alert-dark .alert-link {
color: $white;
}
.alert-light {
color: $black;
}
.alert-warning {
background: $beige;
color: $black;
}
/*
.alert-light {
color: #215888;
background: linear-gradient(-45deg, rgb(212, 245, 255), rgb(234, 250, 255), rgb(234, 250, 255), #d3f6ef);
}
.alert-light .alert-link {
color: #215888;
}
*/
.alert-white {
background-color: rgba(255, 255, 255, 0.95);
}
.alert-primary {
color: $white;
background-color: $primary;
}
.alert-primary .alert-link {
color: $white;
}
.alert .alert-link:hover,
.alert .alert-link:focus {
text-decoration: none;
}

View File

@ -0,0 +1,74 @@
.navbar .btn-link {
color: $navbar-light-color;
padding: 0.4375rem 0;
}
#mode {
margin-right: 1.25rem;
}
.btn-link:focus {
outline: 0;
box-shadow: none;
}
#navigation {
margin-left: 1.25rem;
}
@include media-breakpoint-up(md) {
#mode {
margin-right: 0.5rem;
}
.navbar .btn-link {
padding: 0.5625em 0.25rem 0.5rem 0.125rem;
}
}
.navbar .btn-link:hover {
color: $navbar-light-hover-color;
}
.navbar .btn-link:active {
color: $navbar-light-active-color;
}
body .toggle-dark {
display: block;
}
body .toggle-light {
display: none;
}
body.dark .toggle-light {
display: block;
}
body.dark .toggle-dark {
display: none;
}
.btn-clipboard {
display: none;
}
@include media-breakpoint-up(md) {
.btn-clipboard {
display: block;
margin: 2.0625rem 0.25rem -4rem auto;
}
}
.copy-status::after,
.copy-status:hover::after {
content: "Copy";
display: block;
}
.copy-status:focus::after,
.copy-status:active::after {
content: "Copied";
display: block;
}

View File

@ -0,0 +1,43 @@
pre,
code,
kbd,
samp {
font-family: $font-family-monospace;
font-size: $font-size-sm;
border-radius: $border-radius;
}
pre {
background: $beige;
color: $black;
line-height: $line-height-lg;
margin: 2rem 0;
overflow: auto;
padding: 1.25rem 1.5rem;
tab-size: 4;
}
code {
background: $beige;
color: $black;
padding: 0.25rem 0.5rem;
}
pre code {
background: none;
font-size: inherit;
padding: 0;
}
@include media-breakpoint-down(xs) {
pre {
margin: 2rem -1.5rem;
}
pre,
code,
kbd,
samp {
border-radius: 0;
}
}

View File

@ -0,0 +1,30 @@
.comment-list {
@extend .list-unstyled;
}
.comment-list ol {
list-style: none;
}
.comment-form p {
@extend .form-group;
}
.comment-form input[type="text"],
.comment-form input[type="email"],
.comment-form input[type="url"],
.comment-form textarea {
@extend .form-control;
}
.comment-form input[type="submit"] {
@extend .btn;
@extend .btn-secondary;
}
blockquote {
margin-bottom: 1rem;
font-size: 1.25rem;
border-left: 3px solid $gray-300;
padding-left: 1rem;
}

View File

@ -0,0 +1,19 @@
/** Search form */
.search-form {
@extend .form-inline;
}
.search-form label {
@extend .form-group;
font-weight: normal;
}
.search-form .search-field {
@extend .form-control;
}
.search-form .search-submit {
@extend .btn;
@extend .btn-secondary;
}

View File

@ -0,0 +1,48 @@
figure {
margin: 2rem 0;
}
.figure-caption {
margin: 0.25rem 0 0.75rem;
}
figure.wide {
margin: 2rem -1.5rem;
}
figure.wide .figure-caption {
margin: 0.25rem 1.5rem 0.75rem;
}
@include media-breakpoint-up(md) {
figure.wide {
margin: 2rem -2.5rem;
}
figure.wide .figure-caption {
margin: 0.25rem 2.5rem 0.75rem;
}
}
@include media-breakpoint-up(lg) {
figure.wide {
margin: 2rem -5rem;
}
figure.wide .figure-caption {
margin: 0.25rem 5rem 0.75rem;
}
}
.blur-up {
filter: blur(5px);
}
.blur-up.lazyloaded {
filter: unset;
}
.img-simple {
margin-top: 0.375rem;
margin-bottom: 1.25rem;
}

View File

@ -0,0 +1,75 @@
.navbar-form {
position: relative;
}
#suggestions {
position: absolute;
right: 0;
margin-top: 0.5rem;
width: calc(100vw - 3rem);
}
#suggestions a {
display: block;
text-decoration: none;
padding: 0.75rem;
margin: 0 0.5rem;
}
#suggestions a:focus {
background: $gray-100;
outline: 0;
}
#suggestions div:not(:first-child) {
border-top: 1px dashed $gray-200;
}
#suggestions div:first-child {
margin-top: 0.5rem;
}
#suggestions div:last-child {
margin-bottom: 0.5rem;
}
#suggestions a:hover {
background: $gray-100;
}
#suggestions span {
display: flex;
font-size: $font-size-base;
}
#suggestions span:first-child {
font-weight: $headings-font-weight;
color: $black;
}
#suggestions span:nth-child(2) {
color: $gray-700;
}
@include media-breakpoint-up(sm) {
#suggestions {
width: 30rem;
}
#suggestions a {
display: flex;
}
#suggestions span:first-child {
width: 9rem;
padding-right: 1rem;
border-right: 1px solid $gray-200;
display: inline-block;
text-align: right;
}
#suggestions span:nth-child(2) {
width: 19rem;
padding-left: 1rem;
}
}

View File

@ -0,0 +1,131 @@
/*!
* GitHub Light v0.5.0
* Copyright (c) 2012 - 2017 GitHub, Inc.
* Licensed under MIT (https://github.com/primer/github-syntax-theme-generator/blob/master/LICENSE)
*/
.c1,
.c /* comment, punctuation.definition.comment, string.comment */ {
color: #6a737d;
}
.v /* variable */,
.smw /* sublimelinter.mark.warning */ {
color: #e36209;
}
// .c1 /* constant, entity.name.constant, variable.other.constant, variable.language, support, meta.property-name, support.constant, support.variable, meta.module-reference, markup.raw, meta.diff.header, meta.output */,
.s .v /* string variable */ {
color: #005cc5;
}
.e /* entity */,
.en /* entity.name */ {
color: #6f42c1;
}
.smi /* variable.parameter.function, storage.modifier.package, storage.modifier.import, storage.type.java, variable.other */,
.s .s1 /* string source */ {
color: #24292e;
}
.ent /* entity.name.tag, markup.quote */ {
color: #22863a;
}
.k /* keyword, storage, storage.type */ {
color: #d73a49;
}
.s /* string */,
.pds /* punctuation.definition.string, source.regexp, string.regexp.character-class */,
.s .pse .s1 /* string punctuation.section.embedded source */,
.sr /* string.regexp */,
.sr .cce /* string.regexp constant.character.escape */,
.sr .sre /* string.regexp source.ruby.embedded */,
.sr .sra /* string.regexp string.regexp.arbitrary-repitition */ {
color: #032f62;
}
.bu /* invalid.broken, invalid.deprecated, invalid.unimplemented, message.error, brackethighlighter.unmatched, sublimelinter.mark.error */ {
color: #b31d28;
}
.ii /* invalid.illegal */ {
color: #fafbfc;
background-color: #b31d28;
}
.c2 /* carriage-return */ {
color: #fafbfc;
background-color: #d73a49;
}
.c2::before /* carriage-return */ {
content: "^M";
}
.sr .cce /* string.regexp constant.character.escape */ {
font-weight: bold;
color: #22863a;
}
.ml /* markup.list */ {
color: #735c0f;
}
.mh /* markup.heading */,
.mh .en /* markup.heading entity.name */,
.ms /* meta.separator */ {
font-weight: bold;
color: #005cc5;
}
.mi /* markup.italic */ {
font-style: italic;
color: #24292e;
}
.mb /* markup.bold */ {
font-weight: bold;
color: #24292e;
}
.md /* markup.deleted, meta.diff.header.from-file, punctuation.definition.deleted */ {
color: #b31d28;
background-color: #ffeef0;
}
.mi1 /* markup.inserted, meta.diff.header.to-file, punctuation.definition.inserted */ {
color: #22863a;
background-color: #f0fff4;
}
.mc /* markup.changed, punctuation.definition.changed */ {
color: #e36209;
background-color: #ffebda;
}
.mi2 /* markup.ignored, markup.untracked */ {
color: #f6f8fa;
background-color: #005cc5;
}
.mdr /* meta.diff.range */ {
font-weight: bold;
color: #6f42c1;
}
.ba /* brackethighlighter.tag, brackethighlighter.curly, brackethighlighter.round, brackethighlighter.square, brackethighlighter.angle, brackethighlighter.quote */ {
color: #586069;
}
.sg /* sublimelinter.gutter-mark */ {
color: #959da5;
}
.corl /* constant.other.reference.link, string.other.link */ {
text-decoration: underline;
color: #032f62;
}

View File

@ -0,0 +1,20 @@
.footer {
border-top: 1px solid $gray-200;
padding-top: 1.125rem;
padding-bottom: 1.125rem;
}
.footer ul {
margin-bottom: 0;
}
.footer li {
font-size: $font-size-sm;
margin-bottom: 0;
}
@include media-breakpoint-up(md) {
.footer li {
font-size: $font-size-base;
}
}

View File

@ -0,0 +1,264 @@
.banner .nav li {
@extend .nav-item;
}
.banner .nav a {
@extend .nav-link;
}
.navbar-text {
margin-left: 1rem;
}
.navbar-brand {
font-weight: $headings-font-weight;
}
.navbar-light .navbar-brand,
.navbar-light .navbar-brand:hover,
.navbar-light .navbar-brand:active {
color: $body-color;
}
@include media-breakpoint-up(md) {
.navbar-brand {
font-size: $font-size-xl;
}
.navbar-text {
margin-left: 1.25rem;
}
}
.navbar-nav {
flex-direction: row;
}
.nav-item {
margin-left: 1.25rem;
}
@include media-breakpoint-up(md) {
.nav-item {
margin-left: 0.5rem;
}
}
@include media-breakpoint-down(sm) {
.nav-item:first-child {
margin-left: 0;
}
}
@include media-breakpoint-down(md) {
.navbar .container {
padding-left: 1.5rem;
padding-right: 1.5rem;
}
}
.break {
flex-basis: 100%;
height: 0;
}
.navbar {
background-color: rgba(255, 255, 255, 0.95);
border-bottom: 1px solid $gray-200;
margin-top: 4px;
}
.header-bar {
border-top: 4px solid;
border-image-source: linear-gradient(90deg, $primary, #8ed6fb 50%, #d32e9d);
border-image-slice: 1;
}
.home .navbar {
border-bottom: 0;
}
.navbar-form {
position: relative;
margin-top: 0.25rem;
}
@include media-breakpoint-up(md) {
.navbar-brand {
margin-right: 1rem !important;
}
.main-nav .nav-item:first-child .nav-link,
.social-nav .nav-item:first-child .nav-link {
padding-left: 0;
}
.main-nav .nav-item:last-child .nav-link,
.social-nav .nav-item:last-child .nav-link {
padding-right: 0;
}
.navbar-form {
margin-top: 0;
margin-left: 6rem;
margin-right: 1.5rem;
}
}
@include media-breakpoint-up(lg) {
.navbar-form {
margin-left: 15rem;
}
}
@include media-breakpoint-up(xl) {
.navbar-form {
margin-left: 30rem;
}
}
.form-control.is-search {
/*
padding-right: calc(1.5em + 0.75rem);
*/
padding-right: 2.5rem;
background: $gray-100;
border: 0;
/*
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-search'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right calc(0.375em + 0.1875rem) center;
background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
*/
}
.navbar-form::after {
position: absolute;
top: 0.4625rem;
right: 0.5375rem;
display: flex;
align-items: center;
justify-content: center;
height: 1.5rem;
padding-right: 0.4375rem;
padding-left: 0.4375rem;
font-size: $font-size-base * 0.75;
color: $gray-700;
content: "/";
border: 1px solid $gray-300;
border-radius: 0.25rem;
}
/*! purgecss start ignore */
.algolia-autocomplete {
display: flex !important;
}
.algolia-autocomplete .ds-dropdown-menu {
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
}
@include media-breakpoint-down(sm) {
.algolia-autocomplete .ds-dropdown-menu {
max-width: 512px !important;
min-width: 312px !important;
width: auto !important;
}
.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column::after {
content: "|";
margin-right: 0.25rem;
}
}
.algolia-autocomplete .algolia-docsearch-suggestion--title {
margin-bottom: 0;
}
.algolia-autocomplete .algolia-docsearch-suggestion--highlight {
padding: 0 0.05em;
}
.algolia-autocomplete .algolia-docsearch-footer {
margin-top: 1rem;
margin-right: 0.5rem;
margin-bottom: 0.5rem;
}
/*! purgecss end ignore */
/*
* Source: https://medium.com/creative-technology-concepts-code/responsive-mobile-dropdown-navigation-using-css-only-7218e4498a99
*/
/* Style the menu icon for the dropdown */
.navbar .menu-icon {
cursor: pointer;
/* display: inline-block; */
/* float: right; */
padding: 1.125rem 0.625rem;
margin: 0 0 0 -0.625rem;
/* position: relative; */
user-select: none;
}
.navbar .menu-icon .navicon {
background: $navbar-light-color;
display: block;
height: 2px;
position: relative;
transition: background 0.2s ease-out;
width: 18px;
}
.navbar .menu-icon .navicon::before,
.navbar .menu-icon .navicon::after {
background: $navbar-light-color;
content: "";
display: block;
height: 100%;
position: absolute;
transition: all 0.2s ease-out;
width: 100%;
}
.navbar .menu-icon .navicon::before {
top: 5px;
}
.navbar .menu-icon .navicon::after {
top: -5px;
}
/* Add the icon and menu animations when the checkbox is clicked */
.navbar .menu-btn {
display: none;
}
.navbar .menu-btn:checked ~ .navbar-collapse {
display: block;
max-height: 100vh;
}
.navbar .menu-btn:checked ~ .menu-icon .navicon {
background: transparent;
}
.navbar .menu-btn:checked ~ .menu-icon .navicon::before {
transform: rotate(-45deg);
}
.navbar .menu-btn:checked ~ .menu-icon .navicon::after {
transform: rotate(45deg);
}
.navbar .menu-btn:checked ~ .menu-icon:not(.steps) .navicon::before,
.navbar .menu-btn:checked ~ .menu-icon:not(.steps) .navicon::after {
top: 0;
}

View File

@ -0,0 +1,40 @@
.docs-content > h2[id]::before,
.docs-content > h3[id]::before,
.docs-content > h4[id]::before {
display: block;
height: 6rem;
margin-top: -6rem;
content: "";
}
.anchor {
visibility: hidden;
padding-left: 0.5rem;
}
h1:hover a,
h2:hover a,
h3:hover a,
h4:hover a {
visibility: visible;
text-decoration: none;
}
.card-list {
margin-top: 2.25rem;
}
.edit-page {
margin-top: 3rem;
font-size: $font-size-base;
}
.edit-page svg {
margin-right: 0.5rem;
margin-bottom: 0.25rem;
}
p.meta {
margin-top: 0.5rem;
font-size: $font-size-base;
}

View File

@ -0,0 +1,28 @@
.home .card,
.contributors.list .card,
.blog.list .card {
margin-top: 2rem;
margin-bottom: 2rem;
transition: transform 0.3s;
}
.home .card:hover,
.contributors.list .card:hover,
.blog.list .card:hover {
transform: scale(1.025);
}
.home .card-body,
.contributors.list .card-body,
.blog.list .card-body {
padding: 0 2rem 1rem;
}
.blog-header {
text-align: center;
margin-bottom: 2rem;
}
.blog-footer {
text-align: center;
}

View File

@ -0,0 +1,110 @@
.docs-links,
.docs-toc {
scrollbar-width: thin;
scrollbar-color: $white $white;
}
.docs-links::-webkit-scrollbar,
.docs-toc::-webkit-scrollbar {
width: 5px;
}
.docs-links::-webkit-scrollbar-track,
.docs-toc::-webkit-scrollbar-track {
background: $white;
}
.docs-links::-webkit-scrollbar-thumb,
.docs-toc::-webkit-scrollbar-thumb {
background: $white;
}
.docs-links:hover,
.docs-toc:hover {
scrollbar-width: thin;
scrollbar-color: $gray-200 $white;
}
.docs-links:hover::-webkit-scrollbar-thumb,
.docs-toc:hover::-webkit-scrollbar-thumb {
background: $gray-200;
}
.docs-links::-webkit-scrollbar-thumb:hover,
.docs-toc::-webkit-scrollbar-thumb:hover {
background: $gray-200;
}
.docs-links h3,
.page-links h3 {
text-transform: uppercase;
font-size: $font-size-base;
margin: 1.25rem 0 0.5rem 0;
padding: 1.5rem 0 0 0;
}
@include media-breakpoint-up(lg) {
.docs-links h3,
.page-links h3 {
margin: 1.125rem 1.5rem 0.75rem 0;
padding: 1.375rem 0 0 0;
}
}
.docs-links h3:not(:first-child) {
border-top: 1px solid $gray-200;
}
a.docs-link {
color: $body-color;
display: block;
padding: 0.125rem 0;
font-size: $font-size-base;
}
.page-links li {
margin-top: 0.375rem;
padding-top: 0.375rem;
}
.page-links li ul li {
border-top: none;
padding-left: 1rem;
margin-top: 0.125rem;
padding-top: 0.125rem;
}
.page-links li:not(:first-child) {
border-top: 1px dashed $gray-200;
}
.page-links a {
color: $body-color;
display: block;
padding: 0.125rem 0;
font-size: $font-size-base * 0.9375;
}
.docs-link:hover,
.docs-link.active,
.page-links a:hover {
text-decoration: none;
color: $link-color;
}
.docs-links h3.sidebar-link,
.page-links h3.sidebar-link {
text-transform: none;
font-size: $font-size-md;
font-weight: normal;
}
.docs-links h3.sidebar-link a,
.page-links h3.sidebar-link a {
color: $body-color;
}
.docs-links h3.sidebar-link a:hover,
.page-links h3.sidebar-link a:hover {
text-decoration: underline;
}

0
assets/scss/vendor/.gitkeep vendored Normal file
View File

17
babel.config.js Normal file
View File

@ -0,0 +1,17 @@
module.exports = {
presets: [
[
'@babel/preset-env',
{
targets: {
browsers: [
// Best practice: https://github.com/babel/babel/issues/7789
'>=1%',
'not ie 11',
'not op_mini all'
]
}
}
]
]
};

View File

@ -0,0 +1,93 @@
baseurl = "/"
disableAliases = true
disableHugoGeneratorInject = true
enableEmoji = true
enableGitInfo = false
enableRobotsTXT = true
languageCode = "en-US"
paginate = 7
rssLimit = 10
# add redirects/headers
[outputs]
home = ["HTML", "RSS", "REDIRECTS", "HEADERS"]
section = ["HTML", "RSS", "SITEMAP"]
# remove .{ext} from text/netlify
[mediaTypes."text/netlify"]
suffixes = [""]
delimiter = ""
# add output format for netlify _redirects
[outputFormats.REDIRECTS]
mediaType = "text/netlify"
baseName = "_redirects"
isPlainText = true
notAlternative = true
# add output format for netlify _headers
[outputFormats.HEADERS]
mediaType = "text/netlify"
baseName = "_headers"
isPlainText = true
notAlternative = true
# add output format for section sitemap.xml
[outputFormats.SITEMAP]
mediaType = "application/xml"
baseName = "sitemap"
isHTML = false
isPlainText = true
noUgly = true
rel = "sitemap"
[markup]
[markup.goldmark]
[markup.goldmark.extensions]
linkify = false
[markup.goldmark.renderer]
unsafe = true
[markup.highlight]
codeFences = true
guessSyntax = false
hl_Lines = ""
lineNoStart = 1
lineNos = false
lineNumbersInTable = true
noClasses = false
style = "dracula"
tabWidth = 4
[sitemap]
changefreq = "weekly"
filename = "sitemap.xml"
priority = 0.5
[taxonomies]
contributor = "contributors"
[permalinks]
blog = "/blog/:title/"
[module]
[[module.mounts]]
source = "assets"
target = "assets"
[[module.mounts]]
source = "static"
target = "static"
[[module.mounts]]
source = "node_modules/lazysizes"
target = "assets/js/vendor/lazysizes"
[[module.mounts]]
source = "node_modules/instant.page"
target = "assets/js/vendor/instant.page"
[[module.mounts]]
source = "node_modules/lazysizes"
target = "assets/js/vendor/lazysizes"
[[module.mounts]]
source = "node_modules/flexsearch"
target = "assets/js/vendor/flexsearch"
[[module.mounts]]
source = "node_modules/clipboard"
target = "assets/js/vendor/clipboard"

View File

@ -0,0 +1,33 @@
[[docs]]
name = "Docs"
weight = 10
identifier = "docs"
url = "/docs/"
[[main]]
name = "Home"
url = "/"
weight = 10
[[main]]
name = "Docs"
url = "/docs/"
weight = 20
# [[social]]
# name = "Twitter"
# pre = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-twitter\"><path d=\"M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z\"></path></svg>"
# url = "https://twitter.com/gethyas"
# weight = 10
[[social]]
name = "GitHub"
pre = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-github\"><path d=\"M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22\"></path></svg>"
url = "https://github.com/h-enk/doks"
post = "v0.1.0"
weight = 20
# [[footer]]
# name = "Privacy"
# url = "/privacy-policy/"
# weight = 10

View File

@ -0,0 +1,47 @@
# Meta Data for SEO
## Homepage
title = "Arsen Dev"
titleSeparator = "|"
titleAddition = "Home"
description = "Doks is a Hugo theme helping you build modern docu`tation websites that are secure, fast, and SEO-ready — by default."
## Open Graph + Twitter Cards
images = ["doks.png"]
twitterSite = "henkverlinde"
twitterCreator = "henkverlinde"
facebookAuthor = "verlinde.henk"
facebookPublisher = "verlinde.henk"
ogLocale = "en_US"
## JSON-LD
schemaType = "Organization"
schemaLogo = "logo-doks.png"
schemaTwitter = "https://twitter.com/henkverlinde"
schemaLinkedIn = "https://www.linkedin.com/in/henkverlinde/"
schemaGitHub = "https://github.com/h-enk"
schemaSection = "blog"
## Sitelinks Search Box
siteLinksSearchBox = false
## Chrome Browser
themeColor = "#fff"
# Images
quality = 85
bgColor = "#fff"
landscapePhotoWidths = [900, 800, 700, 600, 500]
portraitPhotoWidths = [800, 700, 600, 500]
lqipWidth = "20x"
# Footer
footer = "Copyright &copy; 2021 Arsen Musayelyan"
# Alert
alert = false
alertText = ""
# Edit Page
docsRepo = "https://github.com/h-enk/doks"
editPage = false

23
config/postcss.config.js Normal file
View File

@ -0,0 +1,23 @@
const autoprefixer = require('autoprefixer');
const purgecss = require('@fullhuman/postcss-purgecss');
const whitelister = require('purgecss-whitelister');
module.exports = {
plugins: [
autoprefixer(),
purgecss({
content: [
'./layouts/**/*.html',
'./content/**/*.md',
],
safelist: [
'lazyloaded',
...whitelister([
'./assets/scss/components/_code.scss',
'./assets/scss/components/_search.scss',
'./assets/scss/common/_dark.scss',
]),
],
}),
],
}

View File

0
config/staging/.gitkeep Normal file
View File

22
content/_index.md Normal file
View File

@ -0,0 +1,22 @@
---
title: "Home"
draft: false
---
### My Projects
---
- Pak: A cross-platform wrapper written in go designed to unify package managers. It uses TOML configs to define package managers. Options include commands, shortcuts, root user invocation, root user invocation command, and package manager command.
{{< button-gitea project="pak" text="Pak" color="green" >}}
- Opensend: A program made to share files and websites between computers securely and reliably, written in go, using zeroconf for discovery, AES and RSA for encryption, and Tar + Zstandard for compression.
{{< button-gitea project="opensend" text="Opensend" owner="opensend" color="green" >}}
- Statusboard: A full-stack web application that tracks website status written in Swift, Swift Crypto, and the Vapor stack. It uses a tabler web UI for the dashboard, a JSON config to define servers to track, and an SQLite database to keep track of log-ins and show private servers. My instance can be found [here](https://status.arsenm.dev)
{{< button-gitea project="statusboard" text="Statusboard" color="green" >}}
- Chromebook Linux Audio: A collection of bash scripts to compile and install the required kernel and audio server to enable audio and other chromebook features in a mainline linux distro.
{{< button-gitlab project="chromebook-linux-audio" text="Chromebook Linux Audio" color="OrangeRed" >}}

4
content/docs/_index.md Normal file
View File

@ -0,0 +1,4 @@
---
title: "Docs"
draft: false
---

View File

@ -0,0 +1,8 @@
---
title: "AdvMake Docs"
draft: false
description: "Documentation for the AdvMake build system"
menu:
docs:
parent: "docs"
---

View File

@ -0,0 +1,242 @@
---
title: "Build Files"
draft: false
description: "Understanding AdvMake Build Files"
---
{{< button-gitea color="green" project="advmake" text="AdvMake" >}}
{{< button-gitlab color="OrangeRed" project="advmake" text="AdvMake" >}}
### Format
AdvMake uses [Starlark](https://github.com/bazelbuild/starlark) as the format for its build files.
Extra builtins are also defined for both convenience and extra functionality.
Starlark is a Python-like language meant for configuration files.
### Configuration
Build files are by default called `AdvMakefile`, but that can be set via `-f`
An AdvMakefile example can be found at AdvMake's repo as it uses AdvMake itself.
AdvMake runs functions exposed by starlark in the format `<name>_<target>`.
To set the default name and target, the global variables `defaultName`, and `defaultTarget` must be set.
Here is an example from AdvMake's AdvMakefile:
```python
defaultName = "advmake"
defaultTarget = "build"
```
This will tell AdvMake to run the function `advmake_build()` when run with no arguments.
If AdvMake is run with one argument (such as `advmake install`), it will use the default name with the specified target,
so in that case, it would run `advmake_install()`.
If run with two arguments, AdvMake will use the first argument as the name and the second as the target.
So, running `advmake hello world` would run the function `hello_world()`.
### Builtins
As previously mentioned, AdvMake comes with extra builtins. Those are as follows:
#### `log()`
The log function uses zerolog in go to log a message to STDOUT. It has two arguments.
The first is a string with the message to log, and the second is `level` which is optional
Examples:
```python
log("Info log") # Default level is info
log("Warn log", level="warn") # Warn level log
log("Debug log", level="debug") # Debug level log
log("Fatal log", level="fatal") # Fatal level log. This will exit the program when executed
```
---
#### `execute()`
The execute function runs a script using `sh -c`. This function has three arguments.
The first is required and is a string with the script to run, the second is `output`
which is optional. It can be set to `return`, `stdout`, or `both`, and the default is `both`.
The `output` argument controls where the script's output will be directed:
- `return`: Returns script output as string
- `stdout`: Prints script output to STDOUT, returning nothing
- `both`: Prints to STDOUT and returns as string
The third argument is `concurrent` which can be either `True` or `False`, default `False`.
If `concurrent` is set to `True`, all the lines in the script will be split and run concurrently
via goroutines. The maximum threads for goroutines can be controlled using the `GOMAXPROCS` environment
variable and is by default the amount of CPU cores present.
Examples:
```python
user = execute("whoami") # This will print the username to STDOUT and set the user variable to it
user = execute("whoami", output="return") # This will set the user variable to the username but not print it
execute("""
cp file destination
mv destination destination-1
echo 'hello world'
""") # Example of a multiline script
execute("""
install -Dm755 program /usr/bin
install -Dm755 program.cfg /etc
""", concurrent=True) # Example of a concurrent multiline script
```
---
#### `getEnv()`
The getEnv function simply returns the value of the environment variable specified in its first argument.
Example:
```python
term = getEnv("TERM") # Sets variable term to value of $TERM
print("Nice " + term) # Prints "Nice $TERM"
```
---
#### `setEnv()`
The setEnv function sets an environment variable. It has three arguments.
The first is the key, it is the name of the environment variable.
The second is the new value, what the key should be set to.
The third is optional, it is `onlyIfUnset` and it can be set to `True` or `False`, default `False`
`onlyIfUnset` checks that the variable is not already set before setting it, this can be useful for
setting defaults.
Examples:
```python
setEnv("MY_ENV_VAR", "Hello, World") # Sets $MY_ENV_VAR to "Hello, World"
setEnv("CC", "gcc", onlyIfUnset=True) # Sets $CC to "gcc", but only if $CC is not already set
```
---
#### `expandFile()`
The expandFile function replaces all instances of $VAR with the value specified.
expandFile has two arguments. The first accepts a filename to modify.
The second accepts a dictionary to act as mappings for value replacements.
Example:
```python
expandFile("a.txt", {"A": "Hello", "B": "World"}) # Replace $A with Hello and $B with world in file a.txt
```
---
#### `download()`
The download function downloads a file at a URL.
download has two arguments. The first is a URL, and the second is an optional
argument called `filename`. If `filename` is not provided, the filename will
be taken from the URL.
Examples:
```python
download("https://www.arsenm.dev/logo-white.png") # Downloads logo-white.png
download("https://www.arsenm.dev/logo-white.png", filename="logo.png") # Downloads logo-white.png as logo.png
```
---
#### `lookPath()`
The lookPath function uses go's `exec.LookPath()` to find the absolute path of a command.
It has a single argument which is the command to look for. If a command is not found, lookPath
returns `-1`.
Examples:
```python
lookPath("sh") # /bin/sh
lookPath("nonExistentCommand") # -1
```
---
#### `userChoice()`
The userChoice function presents the user with a choice. It has two arguments. The first
is a prompt to be displayed to the user, and the second is a list of choices.
Example:
```python
userChoice("Choose command", ["find", "ls"])
# This returns:
# [1] "find"
# [2] "ls"
# Choose command:
```
The function will return the chosen object (if input to above is `1`, function returns `"find"`)
---
#### `input()`
The input function is a simple function that uses go's `fmt.Print()` and `fmt.Scanln()` to replicate
the functionality of python's `input()` function. It has a single argument, which is the prompt and returns
the inputted text.
Example:
```python
x = input("Name: ") # This will print "Name: " and then wait for input.
```
---
#### `fileExists()`
The fileExists function checks if a specified file exists and is accessible in the filesystem. It has a single
argument which is the path to the file being checked, and returns a boolean reflecting the state of the file.
Examples:
```python
if fileExists("/etc/passwd"):
print("/etc/passwd exists!") # /etc/passwd exists!
if fileExists("/abcdef"):
print("/abcdef exists!") # No output because /abcdef most likely does not exist
```
---
#### `getOS()`
The getOS function returns the value of `runtime.GOOS`. It has no arguments.
Example:
```python
if getOS() == "linux":
print("This is Linux!")
```
---
#### `getArch()`
The getArch function returns the value of `runtime.GOARCH`. It has no arguments.
Example:
```python
if getArch() == "386":
print("x86 32-bit")
```
---
#### `getCPUNum()`
The getCPUNum function returns the amount of CPUs available to AdvMake. It has no arguments.
Example:
```python
print(getCPUNum() + " CPUs available!")
```
---

View File

@ -0,0 +1,50 @@
---
title: "Installation"
draft: false
description: "Installing AdvMake"
---
{{< button-gitea color="green" project="advmake" text="AdvMake" >}}
{{< button-gitlab color="OrangeRed" project="advmake" text="AdvMake" >}}
## Building from source
### Downloading
AdvMake is hosted on my Gitea instance. If that is down, it is also mirrored on Gitlab.
To download AdvMake, you can either use the download button on Gitea or Gitlab, or
you can use the git CLI
To clone AdvMake using the CLI, run one of the following commands:
```bash
git clone https://gitea.arsenm.dev/Arsen6331/advmake.git
OR
git clone https://gitlab.com/moussaelianarsen/advmake.git
```
### Building
AdvMake is written in Go. This means go must be installed on your computer. Most
linux distros call the package that provides it either `go` or `golang`.
Once go is installed, you can check that it runs by running
```bash
go version
```
To compile AdvMake, run
```bash
go build
```
### Installing
To install AdvMake, run:
```bash
sudo install -Dm755 advmake /usr/bin
```
Once the command completes, AdvMake should be ready and you can run the following to make sure it works:
```bash
advmake -h
```

View File

@ -0,0 +1,8 @@
---
title: "KbdEmu Docs"
draft: true
description: "Documentation for KbdEmu, the HID emulator"
menu:
docs:
parent: "docs"
---

View File

@ -0,0 +1,70 @@
---
title: "Installation"
draft: false
description: "Installing kbdemu"
---
{{< appveyor-ci project="kbdemu" projectID="km2f1wiy7enuh6il" >}}
{{< minio-s3 project="kbdemu" >}}
## Using precompiled binary
KbdEmu uses continuous integration to compile. You can find the binary by
clicking the CI badge above, selecting "Ubuntu2004" for the linux build or
"macOS" for the macOS build, and then going to the artifacts tab.
## Building from source
### Downloading
KbdEmu is hosted in two places, Gitea and Gitlab. Either one can be used as
it is mirrored from Gitea to Gitlab
{{< button-gitea color="green" project="kbdemu" text="KbdEmu" >}}
{{< button-gitlab color="OrangeRed" project="kbdemu" text="KbdEmu" >}}
To download kbdemu, you can either use the download button on one of the above, or
you can use the git command
To clone kbdemu using the command, run one of the following commands:
```bash
git clone https://gitea.arsenm.dev/Arsen6331/kbdemu
OR
git clone https://gitlab.com/moussaelianarsen/kbdemu
```
Now, you will want to `cd` into the root of this repo before completing the rest
of these instructions
### Building
Since KbdEmu is written in go, you will need go installed in order to compile it.
Most linux distros call the package providing it either `go` or `golang`.
Once go is installed, you can check that it runs by running
```bash
go version
```
To compile KbdEmu, run the following commands:
```bash
go get github.com/go-vgo/robotgo
go get github.com/BurntSushi/toml
go get github.com/rs/zerolog/log
source .envrc
go build
```
### Installing
To install kbdemu, run the following command:
```bash
sudo install -Dm755 kbdemu /usr/bin
```
Once this command completes, to test whether kbdemu was installed properly, run
this command:
```bash
kbdemu
```
You should get an error warning you that kbdemu cannot find a TOML file. If you do,
kbdemu is properly installed.

View File

@ -0,0 +1,69 @@
---
title: "Usage"
draft: false
description: "Using kbdemu"
---
{{< appveyor-ci project="kbdemu" projectID="km2f1wiy7enuh6il" >}}
{{< minio-s3 project="kbdemu" >}}
This page assumes you have already installed KbdEmu. If not, follow the installation
instructions on the installation page.
{{< button text="Installation" link="../installation" color="blue">}}
### Configs
KbdEmu uses TOML configs to tell it what to do. This is the example config which
contains all supported features:
```toml
[[action]]
type = "var"
action = "set key to z"
[[action]]
type = "kbd"
action = "hold key @key@"
[[action]]
type = "misc"
action = "wait 1 second"
[[action]]
type = "kbd"
action = "release key @key@"
[[action]]
type = "kbd"
action = "press space"
[[action]]
type = "kbd"
action = "type AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
[[action]]
type = "mse"
action = "scroll up 5"
[[action]]
type = "mse"
action= "right click"
[[action]]
type = "mse"
action = "move to {0,0}"
[[action]]
type = "misc"
action = "show message Actions complete!"
```
As you can see, the configs are pretty simple. Here is a list of all the currently
supported features:
{{<table "f6 w-100 mw8 center">}}
| Var Type | Misc Type | Kbd Type | Mse Type |
|-------------------|-------------------|--------------|----------------|
| Setting Variables | Delays | Hold Keys | Scrolling |
| | Showing Messages | Release Keys | Mouse Clicks |
| | | Type Strings | Mouse Movement |
{{</table>}}

View File

@ -0,0 +1,8 @@
---
title: "OpenSend Docs"
draft: false
description: "Documentation for the OpenSend file sharing program"
menu:
docs:
parent: "docs"
---

View File

@ -0,0 +1,37 @@
---
title: "GUI"
draft: false
description: "Opensend fyne GUI"
---
{{< appveyor-ci project="opensend" projectID="wrv3bbuujw57578h" >}}
{{< minio-s3 project="opensend" >}}
This page assumes you have already installed Opensend. If not, follow the installation
instructions on the installation page.
{{< button text="Installation" link="../installation" color="blue">}}
### GUI Installation
Opensend GUI has been written in golang using [fyne](https://fyne.io). Its source code can be found here:
{{< button-gitea text="Opensend GUI" project="opensend-gui" owner="opensend" color="green" >}}
To download Opensend GUI, run the following command
```bash
git clone https://gitea.arsenm.dev/opensend/opensend-gui.git
```
To build Opensend GUI, `go` must be installed. The process for that is explained in the installation instructions for Opensend. Once `go` is installed, run:
```bash
go build
```
This may take a while as `go` downloads and compiles Opensend GUI and Fyne.
Once the build is complete, there should be a file named `opensend-gui` in the directory. Run this file to open the GUI which should look like this:
{{< image src="/opensend/gui_start.webp" alt="Opensend GUI on start" >}}

View File

@ -0,0 +1,60 @@
---
title: "Installation"
draft: false
description: "Installing opensend"
---
{{< appveyor-ci project="opensend" projectID="wrv3bbuujw57578h" >}}
{{< minio-s3 project="opensend" >}}
## Using precompiled binary
Opensend uses continuous integration to compile. You can find the binary by clicking the download binary badge above.
## Building from source
### Downloading
Opensend is hosted on Gitea.
{{< button-gitea color="green" project="opensend" owner="opensend" text="Opensend" >}}
To download opensend, you can either use the download button on one of the above, or
you can use the git command
To clone opensend using the command, run the following command:
```bash
git clone https://gitea.arsenm.dev/opensend/opensend.git
```
Now, you will want to `cd` into the root of this repo before completing the rest
of these instructions
### Building
Since Opensend is written in go, you will need go installed in order to compile it.
Most linux distros call the package providing it either `go` or `golang`.
Once go is installed, you can check that it runs by running
```bash
go version
```
To compile Opensend, run the following command:
```bash
make
```
### Installing
To install opensend, run one of the following commands:
```bash
sudo make install # Linux
sudo make install-macos # macOS
```
Once this command completes, to test whether opensend was installed properly, run
this command:
```bash
opensend -h
```
You should get the usage for opensend.

View File

@ -0,0 +1,53 @@
---
title: "Usage"
draft: false
description: "Using opensend"
---
{{< appveyor-ci project="opensend" projectID="wrv3bbuujw57578h" >}}
{{< minio-s3 project="opensend" >}}
This page assumes you have already installed Opensend. If not, follow the installation
instructions on the installation page.
{{< button text="Installation" link="../installation" color="blue">}}
### Configuration
Opensend allows configuration by TOML and by command line flags. It looks at the following paths for configs in the specified order:
#### Config files
1. Config path from `--config` flag
2. `~/.config/opensend.toml`
3. `/etc/opensend.toml`
#### Command line flags
```text
Usage of opensend:
-d string
Data to send
-dest-dir string
Destination directory for files or dirs sent over opensend (default "/home/arsen/Downloads")
-r Receive data
-s Send data
-send-to string
Use IP address of receiver instead of mDNS
-skip-mdns
Skip zeroconf service registration (use if mdns fails)
-t string
Type of data being sent
```
The purpose of the mdns-skipping flags is to account for the iSH app in iOS, as the mdns resolver and registration fails on it.
### Algorithms and software used
- RSA for asymmetric encryption
- AES for symmetric encryption
- Tar for archiving directories
- Zstandard for compression
- Base91 for encoding
- Gob for serialization
- JSON for serialization
- TCP sockets for transfer
- Zeroconf/mDNS for device discovery

View File

@ -0,0 +1,8 @@
---
title: "Pak Docs"
draft: false
description: "Documentation for the Pak package manager wrapper"
menu:
docs:
parent: "docs"
---

View File

@ -0,0 +1,42 @@
---
title: "Configuration"
draft: false
description: "Configuring pak"
---
{{< appveyor-ci project="pak" projectID="e4yacqd78gkte8a0" >}}
{{< minio-s3 project="pak" >}}
### Config file
Pak uses a custom config file at `/etc/pak.cfg`. For example, this is what the
apt config looks like:
```cfg
# Write the name of the package manager in all lowercase below
apt
# Write a comma separated list of commands from the manager below
install,remove,update,upgrade,search,download
# Write "yes" or "no" depending on whether you want to use root
yes
# Write command to use for root
sudo
# Write a comma separated list of shortcuts below
rm,inst
# Write a comma separated list of shortcut mappings from the manager below
remove,install
```
This file is read by pak to tell it what to do. The comments above each keyword
explain what it's for.
Here is a list of all the fields and their uses:
1. Command to invoke the package manager.
2. Comma-separated list of commands supported by the package manager.
3. Whether or not to invoke the root command.
4. Command to use for root invocation (`sudo`, `doas`, etc.)
5. Comma-separated list of shortcuts for pak to accept
6. Comma-separated list of shortcut mappings (what each shortcut sends to the
package manager). These do not necessarily need to be in the commands list.
Once you have made the config, just place it at `/etc/pak.cfg` and pak will
automatically use it.

View File

@ -0,0 +1,91 @@
---
title: "Installation"
draft: false
description: "Installing pak"
---
{{< appveyor-ci project="pak" projectID="e4yacqd78gkte8a0" >}}
{{< minio-s3 project="pak" >}}
## Using precompiled binary
Pak uses continuous integration to compile. You can find the binary either by
clicking the CI badge above or by going to the gitlab repo using the button below and
navigating to the releases.
{{< button-gitlab color="OrangeRed" project="pak" text="Pak" >}}
## Using the AUR
If you are running an arch-based linux distro, you can use the Arch User Repository
to install pak. First, make sure the `yay` AUR helper is installed, then run the following:
```bash
yay -S pak
```
## Building from source
### Downloading
Pak is hosted on my Gitea instance. If that is down, it is also mirrored on Gitlab.
{{< button-gitea color="green" project="pak" text="Pak" >}}
{{< button-gitlab color="OrangeRed" project="pak" text="Pak" >}}
To download pak, you can either use the download button on Gitea or Gitlab, or
you can use the git CLI
To clone pak using the CLI, run one of the following commands:
```bash
git clone https://gitea.arsenm.dev/Arsen6331/pak
OR
git clone https://gitlab.com/moussaelianarsen/pak
```
### Building
Pak is written in Go. This means go must be installed on your computer. Most
linux distros call the package that provides it either `go` or `golang`.
Once go is installed, you can check that it runs by running
```bash
go version
```
To compile pak, run
```bash
make
```
Then, you will need to figure out which package manager you have. Here is a list
of package managers with ready to use configs:
- apt
- aptitude
- brew
- yay (with wrapper)
- pacman (with wrapper)
- zypper
- snap
If your package manager is not in the list, you can make a config for it. Go to
the Configuration page for more information.
### Installing
If your package manager is in the list, use one of these:
- apt: `sudo make aptinstall`
- aptitude: `sudo make aptitude`
- brew: `sudo make brewinstall`
- yay: `sudo make yayinstall`
- pacman: `sudo make pacinstall`
- zypper: `sudo make zyppinstall`
- snap: `sudo make snapinstall`
- custom: `sudo make installbinonly`
Once the command completes, unless you're using a custom config, pak should be ready
and you can run the following to make sure it works:
```bash
pak
```
Go to the Configuration page for instructions on making a custom config, you **must**
have a config for pak to function.

28
content/docs/pak/usage.md Normal file
View File

@ -0,0 +1,28 @@
---
title: "Usage"
draft: false
description: "Using pak"
---
{{< appveyor-ci project="pak" projectID="e4yacqd78gkte8a0" >}}
{{< minio-s3 project="pak" >}}
Using pak is simple, just run `pak` and one of the commands from the config file.
Pak understands partial commands, so these commands will be identical:
```bash
pak in <package>
OR
pak inst <package>
OR
pak install <package>
```
The lack of `sudo` is intentional. Pak will not allow running from root by default
as it already invokes root internally. To bypass this, simply give pak the `-r` flag.
Using shortcuts in pak is just as simple as commands, just run `pak` and a shortcut,
like this:
```bash
pak rm <package>
```

0
data/.gitkeep Normal file
View File

4
data/doks.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "doks",
"version": "0.1.5"
}

4
data/hyas.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "hyas",
"version": "1.3.5"
}

BIN
images/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

BIN
images/tn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

10
layouts/404.html Normal file
View File

@ -0,0 +1,10 @@
{{ define "main" }}
<div class="row justify-content-center">
<div class="col-md-12 col-lg-10 col-xl-8">
<article>
<h1 class="text-center">Page not found :(</h1>
<p class="text-center">The page you are looking for doesn't exist or has been moved.</p>
</article>
</div>
</div>
{{ end }}

View File

View File

@ -0,0 +1,30 @@
<!doctype html>
<html lang="{{ .Site.LanguageCode | default "en" }}">
{{ partial "head/head.html" . }}
{{ if eq .Kind "home" -}}
{{ .Scratch.Set "class" "home" -}}
{{ else if eq .Kind "404" -}}
{{ .Scratch.Set "class" "error404" -}}
{{ else if eq .Kind "page" -}}
{{ .Scratch.Set "class" .Type -}}
{{ .Scratch.Add "class" " single" -}}
{{ else -}}
{{ .Scratch.Set "class" .Type -}}
{{ .Scratch.Add "class" " list" -}}
{{ end -}}
<body class="{{ .Scratch.Get "class" }}">
{{ partial "header/header.html" . }}
<div class="wrap container" role="document">
<div class="content">
{{ block "main" . }}{{ end }}
</div>
</div>
{{ block "sidebar-prefooter" . }}{{ end }}
{{ block "sidebar-footer" . }}{{ end }}
{{ partial "footer/footer.html" . }}
{{ if and .IsHome .Site.Params.alert }}
{{ partial "footer/alert.html" . }}
{{ end }}
{{ partial "footer/script-footer.html" . }}
</body>
</html>

10
layouts/_default/index.js Normal file
View File

@ -0,0 +1,10 @@
var docs = [
{{ range $index, $page := (where .Site.Pages "Section" "docs") -}}
{
id: {{ $index }},
title: "{{ .Title }}",
description: "{{ .Params.description }}",
href: "{{ .URL | absURL }}"
},
{{ end -}}
];

View File

@ -0,0 +1,5 @@
{{- $.Scratch.Add "index" slice -}}
{{- range .Site.RegularPages -}}
{{- $.Scratch.Add "index" (dict "title" .Title "description" .Params.description "contents" .Plain "permalink" .Permalink) -}}
{{- end -}}
{{- $.Scratch.Get "index" | jsonify -}}

View File

@ -0,0 +1,13 @@
{{ define "main" }}
<div class="row justify-content-center">
<div class="col-md-12 col-lg-10 col-xl-8">
{{ range .Paginator.Pages }}
<article>
<h2><a href="{{ .Permalink }}">{{ .Title }}</a></h2>
{{ .Description }}
</article>
{{ end }}
{{ template "_internal/pagination.html" . }}
</div>
</div>
{{ end }}

View File

@ -0,0 +1,46 @@
{{ printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>" | safeHTML -}}
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
{{ range $i, $e := .Data.Pages -}}
{{ if ne .Params.sitemap_exclude true }}
<url>
<loc>{{ .Permalink }}</loc>{{ if not .Lastmod.IsZero }}
<lastmod>{{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}</lastmod>{{ end }}{{ with .Sitemap.ChangeFreq }}
<changefreq>{{ . }}</changefreq>{{ end }}{{ if ge .Sitemap.Priority 0.0 }}
<priority>{{ .Sitemap.Priority }}</priority>{{ end }}{{ if .IsTranslated }}{{ range .Translations }}
<xhtml:link
rel="alternate"
hreflang="{{ .Lang }}"
href="{{ .Permalink }}"
/>{{ end }}
<xhtml:link
rel="alternate"
hreflang="{{ .Lang }}"
href="{{ .Permalink }}"
/>{{ end }}
</url>
{{ end -}}
{{ end -}}
{{ range .Sections -}}
{{ range $i, $e := .Data.Pages -}}
{{ if ne .Params.sitemap_exclude true -}}
<url>
<loc>{{ .Permalink }}</loc>{{ if not .Lastmod.IsZero }}
<lastmod>{{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}</lastmod>{{ end }}{{ with .Sitemap.ChangeFreq }}
<changefreq>{{ . }}</changefreq>{{ end }}{{ if ge .Sitemap.Priority 0.0 }}
<priority>{{ .Sitemap.Priority }}</priority>{{ end }}{{ if .IsTranslated }}{{ range .Translations }}
<xhtml:link
rel="alternate"
hreflang="{{ .Lang }}"
href="{{ .Permalink }}"
/>{{ end }}
<xhtml:link
rel="alternate"
hreflang="{{ .Lang }}"
href="{{ .Permalink }}"
/>{{ end }}
</url>
{{ end -}}
{{ end -}}
{{ end -}}
</urlset>

View File

@ -0,0 +1,10 @@
{{ define "main" }}
<div class="row justify-content-center">
<div class="col-md-12 col-lg-10 col-xl-8">
<article>
<h1>{{ .Title }}</h1>
{{ .Content }}
</article>
</div>
</div>
{{ end }}

21
layouts/blog/list.html Normal file
View File

@ -0,0 +1,21 @@
{{ define "main" }}
<div class="row justify-content-center">
<div class="col-md-12 col-lg-10 col-xl-8">
<article>
<h1 class="text-center">{{ .Title }}</h1>
<div class="text-center">{{ .Content }}</div>
<div class="card-list">
{{ range .Data.Pages -}}
<div class="card">
<div class="card-body">
<h2 class="h3"><a class="stretched-link text-body" href="{{ .Permalink }}">{{ .Params.title }}</a></h2>
<p>{{ .Params.lead | safeHTML }}</p>
{{ partial "main/blog-meta.html" . -}}
</div>
</div>
{{ end -}}
</div>
</article>
</div>
</div>
{{ end }}

14
layouts/blog/single.html Normal file
View File

@ -0,0 +1,14 @@
{{ define "main" }}
<div class="row justify-content-center">
<div class="col-md-12 col-lg-10 col-xl-8">
<article>
<div class="blog-header">
<h1>{{ .Title }}</h1>
{{ partial "main/blog-meta.html" . }}
</div>
<p class="lead">{{ .Params.lead | safeHTML }}</p>
{{ .Content }}
</article>
</div>
</div>
{{ end }}

View File

@ -0,0 +1,23 @@
{{ define "main" }}
<div class="row justify-content-center">
<div class="col-md-12 col-lg-10 col-xl-8">
<article>
<h1 class="text-center">{{ .Title }}</h1>
<div class="text-center">{{ .Content }}</div>
<div class="card-list">
{{ range .Data.Pages -}}
<div class="card">
<div class="card-body">
<h2 class="h3"><a class="stretched-link text-body" href="{{ .Permalink }}">{{ .Params.title }}</a></h2>
{{ if eq .Section "blog" -}}
<p>{{ .Params.lead | safeHTML }}</p>
{{ partial "main/blog-meta.html" . -}}
{{ end -}}
</div>
</div>
{{ end -}}
</div>
</article>
</div>
</div>
{{ end }}

34
layouts/docs/list.html Normal file
View File

@ -0,0 +1,34 @@
{{ define "main" }}
<div class="row justify-content-center">
<div class="col-md-12 col-lg-10 col-xl-8">
<article>
<a href="..">
<p class="text-center">&Leftarrow; {{ .Parent.Name }}</p>
</a>
<h1 style="margin: 0;" class="text-center">{{ .Title }}</h1>
<div class="text-center">{{ .Content }}</div>
<div class="card-list">
{{ $currentSection := .CurrentSection }}
{{ range .Paginator.Pages }}
{{ if in (.Permalink | string) $currentSection.RelPermalink }}
<div class="card my-3">
<div class="card-body">
<a class="stretched-link" href="{{ .Permalink }}">{{ .Params.title | title }} &Rightarrow;</a>
</div>
</div>
{{ end }}
{{ end }}
{{ range .CurrentSection.Sections }}
{{ if in (.Permalink | string) $currentSection.RelPermalink }}
<div class="card my-3">
<div class="card-body">
<a class="stretched-link" href="{{ .Permalink }}">{{ .Params.title | title }} &Rightarrow;</a>
</div>
</div>
{{ end }}
{{ end }}
</div>
</article>
</div>
</div>
{{ end }}

30
layouts/docs/single.html Normal file
View File

@ -0,0 +1,30 @@
{{ define "main" }}
<div class="row flex-xl-nowrap">
<div class="col-lg-5 col-xl-4 docs-sidebar">
<nav class="docs-links" aria-label="Main navigation">
{{ partial "sidebar/docs-menu.html" . }}
</nav>
</div>
{{ if ne .Params.toc false -}}
<nav class="docs-toc d-none d-xl-block col-xl-3" aria-label="Secondary navigation">
{{ partial "sidebar/docs-toc.html" . }}
</nav>
{{ end -}}
{{ if .Params.toc -}}
<main class="docs-content col-lg-11 col-xl-9">
{{ else -}}
<main class="docs-content col-lg-11 col-xl-9 mx-xl-auto">
{{ end -}}
<a href="..">
&Leftarrow; {{ .Parent.Name }}
</a>
<h1 style="margin-top: 0.2rem;">{{ .Title }}</h1>
<p class="lead">{{ .Params.lead | safeHTML }}</p>
{{ partial "main/headline-hash.html" .Content }}
{{ if .Site.Params.editPage -}}
{{ partial "main/edit-page.html" . }}
{{ end -}}
{{ partial "main/docs-navigation.html" . }}
</main>
</div>
{{ end }}

9
layouts/index.headers Normal file
View File

@ -0,0 +1,9 @@
/*
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Security-Policy: default-src 'self'; frame-ancestors https://jamstackthemes.dev; manifest-src 'self'; connect-src 'self'; font-src 'self'; img-src 'self' data:; script-src 'self'; style-src 'self'
X-Frame-Options: SAMEORIGIN
Referrer-Policy: strict-origin
Feature-Policy: geolocation 'self'
Cache-Control: public, max-age=31536000

23
layouts/index.html Normal file
View File

@ -0,0 +1,23 @@
{{ define "main" }}
<section class="section container-fluid mt-n3 pb-3">
<div class="row justify-content-center">
<div class="col-lg-12 text-center">
<h1 class="mt-0">{{ .Title }}</h1>
</div>
<div class="col-lg-9 col-xl-8 text-center">
<p class="lead">{{ .Params.Lead | safeHTML }}</p>
</div>
</div>
</section>
{{ end }}
{{ define "sidebar-footer" }}
<section class="section section-sm container-fluid">
<div class="row justify-content-center text-center">
<div class="col-lg-9">
{{- .Content -}}
</div>
</div>
</section>
<br>
{{ end }}

6
layouts/index.redirects Normal file
View File

@ -0,0 +1,6 @@
# redirects for Netlify - https://www.netlify.com/docs/redirects/
{{- range $p := .Site.Pages -}}
{{- range .Aliases }}
{{ . }} {{ $p.RelPermalink -}}
{{- end }}
{{- end -}}

View File

@ -0,0 +1,3 @@
<div class="alert alert-primary fixed-bottom text-center" role="alert">
{{ .Site.Params.alertText | safeHTML }}
</div>

View File

@ -0,0 +1,18 @@
<footer class="footer text-muted">
<div class="container">
<div class="row">
<div class="col-lg-8 order-last order-lg-first">
<ul class="list-inline">
<li class="list-inline-item">{{ .Site.Params.footer | safeHTML }}</li>
</ul>
</div>
<div class="col-lg-8 order-first order-lg-last text-lg-right">
<ul class="list-inline">
{{ range .Site.Menus.footer -}}
<li class="list-inline-item"><a href="{{ .URL | absURL }}">{{ .Name }}</a></li>
{{ end -}}
</ul>
</div>
</div>
</div>
</footer>

View File

@ -0,0 +1,19 @@
{{ $indexTemplate := resources.Get "js/index.js" -}}
{{ $index := $indexTemplate | resources.ExecuteAsTemplate "index.js" . -}}
{{ $lazysizes := resources.Get "js/vendor/lazysizes/lazysizes.min.js" -}}
{{ $flexsearch := resources.Get "js/vendor/flexsearch/dist/flexsearch.min.js" -}}
{{ $clipboard := resources.Get "js/vendor/clipboard/dist/clipboard.min.js" -}}
{{ if eq (hugo.Environment) "development" -}}
{{ $app := resources.Get "js/app.js" -}}
{{ $js := slice $lazysizes $clipboard $flexsearch $app | resources.Concat "main.js" -}}
<script src="{{ $js.Permalink }}" defer></script>
<script src="{{ $index.Permalink }}" defer></script>
{{ else -}}
{{ $instantPage := resources.Get "js/vendor/instant.page/instantpage.js" | minify -}}
{{ $app := resources.Get "js/app.js" | minify -}}
{{ $js := slice $lazysizes $clipboard $flexsearch $instantPage $app | resources.Concat "main.js" -}}
{{ $jsProd := $js | resources.Fingerprint "sha512" -}}
{{ $indexProd := $index | resources.Minify | resources.Fingerprint "sha512" -}}
<script src="{{ $jsProd.Permalink }}" integrity="{{ $jsProd.Data.Integrity }}" crossorigin="anonymous" defer></script>
<script src="{{ $indexProd.Permalink }}" integrity="{{ $indexProd.Data.Integrity }}" crossorigin="anonymous" defer></script>
{{ end -}}

View File

@ -0,0 +1,5 @@
<meta name="theme-color" content="{{ $.Site.Params.themeColor }}">
<link rel="apple-touch-icon" sizes="180x180" href="{{ "apple-touch-icon.png" | absURL }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{ "favicon-32x32.png" | absURL }}">
<link rel="icon" type="image/png" sizes="16x16" href="{{ "favicon-16x16.png" | absURL }}">
<link rel="manifest" href="{{ "site.webmanifest" | absURL }}">

View File

@ -0,0 +1,11 @@
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<script src="https://code.iconify.design/1/1.0.7/iconify.min.js"></script>
{{ block "head/resource-hints" . }}{{ partial "head/resource-hints.html" . }}{{ end }}
{{ block "head/stylesheet" . }}{{ partial "head/stylesheet.html" . }}{{ end }}
{{ block "head/seo" . }}{{ partial "head/seo.html" . }}{{ end }}
{{ block "head/favicons" . }}{{ partial "head/favicons.html" . }}{{ end }}
{{ block "head/script-header" . }}{{ partial "head/script-header.html" . }}{{ end }}
</head>

View File

@ -0,0 +1,93 @@
<meta property="og:title" content="{{ .Title }}">
<meta property="og:description" content="{{ with .Description }}{{ . }}{{ else }}{{if .IsPage}}{{ .Summary }}{{ else }}{{ with .Site.Params.description }}{{ . }}{{ end }}{{ end }}{{ end }}">
<meta property="og:type" content="{{ if .IsPage }}article{{ else }}website{{ end }}">
{{ if $.Scratch.Get "paginator" -}}
{{ $paginator := .Paginate (where .Site.RegularPages.ByDate.Reverse "Section" "blog" ) -}}
<meta property="og:url" content="{{ .Paginator.URL | absURL }}">
{{ else -}}
<meta property="og:url" content="{{ .Permalink }}">
{{ end -}}
{{ with $.Params.images -}}
{{ range first 6 . -}}
<meta property="og:image" content="{{ $.Permalink }}{{ . }}">
{{ end -}}
{{ else -}}
{{ $images := $.Resources.ByType "image" -}}
{{ $featured := $images.GetMatch "*feature*" -}}
{{ if not $featured -}}
{{ $featured = $images.GetMatch "{*cover*,*thumbnail*}" }}
{{ end -}}
{{ with $featured -}}
<meta property="og:image" content="{{ $featured.Permalink }}"/>
{{ else -}}
{{ with $.Site.Params.images -}}
<meta property="og:image" content="{{ index . 0 | absURL }}"/>
{{ end -}}
{{ end -}}
{{ end -}}
{{ $iso8601 := "2006-01-02T15:04:05-07:00" -}}
{{ if .IsPage -}}
{{ if not .PublishDate.IsZero -}}
<meta property="article:published_time" {{ .PublishDate.Format $iso8601 | printf "content=%q" | safeHTMLAttr }}>
{{ else if not .Date.IsZero -}}
<meta property="article:published_time" {{ .Date.Format $iso8601 | printf "content=%q" | safeHTMLAttr }}>
{{ end -}}
{{ if not .Lastmod.IsZero -}}
<meta property="article:modified_time" {{ .Lastmod.Format $iso8601 | printf "content=%q" | safeHTMLAttr }}>
{{ end -}}
{{ else -}}
{{ if not .Date.IsZero -}}
<meta property="og:updated_time" {{ .Lastmod.Format $iso8601 | printf "content=%q" | safeHTMLAttr }}>
{{ end -}}
{{ end -}}
{{ with .Params.audio -}}
<meta property="og:audio" content="{{ . }}">
{{ end -}}
{{ with .Params.locale -}}
<meta property="og:locale" content="{{ . }}">
{{ end -}}
{{ with .Site.Params.title -}}
<meta property="og:site_name" content="{{ . }}">
{{ end -}}
{{ with .Params.videos -}}
{{ range . -}}
<meta property="og:video" content="{{ . | absURL }}">
{{ end -}}
{{ end -}}
{{ $permalink := .Permalink -}}
{{ $siteSeries := .Site.Taxonomies.series -}}
{{ with .Params.series -}}
{{ range $name := . -}}
{{ $series := index $siteSeries $name -}}
{{ range $page := first 6 $series.Pages -}}
{{ if ne $page.Permalink $permalink -}}
<meta property="og:see_also" content="{{ $page.Permalink }}">
{{ end -}}
{{ end -}}
{{ end -}}
{{ end -}}
{{ if .IsPage -}}
{{ range .Site.Authors -}}
{{ with .Social.facebook -}}
<meta property="article:author" content="https://www.facebook.com/{{ . }}">
{{ end -}}
{{ with .Site.Social.facebook -}}
<meta property="article:publisher" content="https://www.facebook.com/{{ . }}">
{{ end -}}
<meta property="article:section" content="{{ .Section }}">
{{ with .Params.tags -}}
{{ range first 6 . -}}
<meta property="article:tag" content="{{ . }}">
{{ end -}}
{{ end -}}
{{ end -}}
{{ end -}}
{{ with .Site.Social.facebook_admin -}}
<meta property="fb:admins" content="{{ . }}">
{{ end -}}

View File

@ -0,0 +1,2 @@
<link rel="preload" as="font" href="{{ "fonts/vendor/jost/jost-v4-latin-regular.woff2" | absURL }}" type="font/woff2" crossorigin>
<link rel="preload" as="font" href="{{ "fonts/vendor/jost/jost-v4-latin-700.woff2" | absURL }}" type="font/woff2" crossorigin>

View File

View File

@ -0,0 +1,50 @@
{{ if eq .Kind "404" -}}
<meta name="robots" content="noindex, follow">
{{ else -}}
{{ with .Params.robots -}}
<meta name="robots" content="{{ . }}">
{{ else -}}
<meta name="robots" content="index, follow">
<meta name="googlebot" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
<meta name="bingbot" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
{{ end -}}
{{ end -}}
{{ if .IsHome -}}
<title>{{ .Site.Params.title }} {{ .Site.Params.titleSeparator }} {{ .Site.Params.titleAddition }}</title>
{{ else -}}
<title>{{ .Title }} {{ .Site.Params.titleSeparator }} {{ .Site.Params.title }}</title>
{{ end -}}
{{ with .Description -}}
<meta name="description" content="{{ . }}">
{{ else -}}
<meta name="description" content="{{ .Site.Params.description }}">
{{ end -}}
{{ if $.Scratch.Get "paginator" }}
<link rel="canonical" href="{{ .Paginator.URL | absURL }}">
{{ if .Paginator.HasPrev -}}
<link rel="prev" href="{{ .Paginator.Prev.URL | absURL }}">
{{ end -}}
{{ if .Paginator.HasNext -}}
<link rel="next" href="{{ .Paginator.Next.URL | absURL }}">
{{ end -}}
{{ else -}}
<link rel="canonical" href="{{ .Permalink }}">
{{ end -}}
{{ partial "head/twitter_cards.html" . }}
<meta name="twitter:site" content="@{{ .Site.Params.twitterSite }}">
<meta name="twitter:creator" content="@{{ .Site.Params.twitterCreator }}">
{{ partial "head/opengraph.html" . }}
<meta property="article:publisher" content="https://www.facebook.com/{{ .Site.Params.facebookPublisher }}">
<meta property="article:author" content="https://www.facebook.com/{{ .Site.Params.facebookAuthor }}">
<meta property="og:locale" content="{{ .Site.Params.ogLocale }}">
{{ range .AlternativeOutputFormats -}}
<link rel="{{ .Rel }}" type="{{ .MediaType.Type }}" href="{{ .Permalink | safeURL }}">
{{ end -}}
{{ partial "head/structured-data.html" . }}

View File

@ -0,0 +1,109 @@
{{ if .IsHome -}}
{{ if eq .Site.Params.schemaType "Organization" -}}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"url": "{{ "/" | absURL }}",
"name": "{{ .Site.Params.title }}",
"logo": "{{ "/" | absURL }}{{ .Site.Params.schemaLogo }}",
"sameAs": [
"{{ .Site.Params.schemaTwitter | safeURL }}",
"{{ .Site.Params.schemaLinkedIn | safeURL }}",
"{{ .Site.Params.schemaGitHub | safeURL }}"
]
}
</script>
{{ end -}}
{{ if eq .Site.Params.schemaType "Person" -}}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"url": "{{ "/" | absURL }}",
"name": "{{ .Site.Params.title }}",
"sameAs": [
"{{ .Site.Params.schemaTwitter | safeURL }}",
"{{ .Site.Params.schemaLinkedIn | safeURL }}",
"{{ .Site.Params.schemaGitHub | safeURL }}"
]
}
</script>
{{ end -}}
{{ if .Site.Params.siteLinksSearchBox -}}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"url": "{{ "/" | absURL }}",
"potentialAction": {
"@type": "SearchAction",
"target": "{{ "/" | absURL }}?q={search_term_string}",
"query-input": "required name=search_term_string"
}
}
</script>
{{ end -}}
{{ end -}}
{{ if .IsPage -}}
{{ if eq .Section .Site.Params.schemaSection -}}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "{{ .Permalink }}"
},
"headline": "{{ .Title }}",
"image": [{{ range $i, $e := .Params.images }}{{ if $i }}, {{ end }}{{ printf "%s%s" $.Permalink $e }}{{ end }}],
"datePublished": "{{ .PublishDate.Format "2006-01-02T15:04:05CET" }}",
"dateModified": "{{ .Lastmod.Format "2006-01-02T15:04:05CET" }}",
"author": {
"@type": "{{ .Site.Params.schemaType }}",
"name": "{{ .Site.Params.title }}"
},
"publisher": {
"@type": "{{ .Site.Params.schemaType }}",
"name": "{{ .Site.Params.title }}",
{{ if eq .Site.Params.schemaType "Organization" -}}
"logo": {
"@type": "ImageObject",
"url": "{{ "/" | absURL }}{{ .Site.Params.schemaLogo }}"
}
{{ end -}}
},
"description": "{{ .Description }}"
}
</script>
{{ end -}}
{{ end -}}
{{ $dot := . -}}
{{ $dot.Scratch.Set "path" "" -}}
{{ $dot.Scratch.Set "breadcrumb" slice -}}
{{ $url := replace .Permalink ( printf "%s" .Site.BaseURL) "" -}}
{{ $.Scratch.Add "path" .Site.BaseURL -}}
{{ $.Scratch.Add "breadcrumb" (slice (dict "url" .Site.BaseURL "name" "home" "position" 1 )) -}}
{{ range $index, $element := split $url "/" -}}
{{ $dot.Scratch.Add "path" $element -}}
{{ $.Scratch.Add "path" "/" -}}
{{ if ne $element "" -}}
{{ $.Scratch.Add "breadcrumb" (slice (dict "url" ($.Scratch.Get "path") "name" . "position" (add $index 2))) -}}
{{ end -}}
{{ end -}}
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [{{ range $.Scratch.Get "breadcrumb" }}{{ if ne .position 1 }},{{ end }}{
"@type": "ListItem",
"position": {{ .position }},
"name": "{{ .name | humanize | title }}",
"item": "{{ .url }}"
}{{ end }}]
}
</script>

View File

@ -0,0 +1,11 @@
{{ if eq (hugo.Environment) "development" -}}
{{ $options := (dict "targetPath" "main.css" "enableSourceMap" true "includePaths" (slice "node_modules")) -}}
{{ $css := resources.Get "scss/app.scss" | toCSS $options -}}
<link rel="stylesheet" href="{{ $css.Permalink }}">
{{ else -}}
{{ $options := (dict "targetPath" "main.css" "outputStyle" "compressed" "includePaths" (slice "node_modules")) -}}
{{ $css := resources.Get "scss/app.scss" | toCSS $options | postCSS (dict "config" "config/postcss.config.js") -}}
{{ $secureCSS := $css | resources.Fingerprint "sha512" -}}
<link rel="stylesheet" href="{{ $secureCSS.Permalink }}" integrity="{{ $secureCSS.Data.Integrity }}" crossorigin="anonymous">
{{ end -}}
<noscript><style>img.lazyload { display: none; }</style></noscript>

View File

@ -0,0 +1,33 @@
{{ with $.Params.images -}}
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="{{ $.Permalink }}{{ index . 0 }}">
{{ else -}}
{{ $images := $.Resources.ByType "image" -}}
{{ $featured := $images.GetMatch "*feature*" -}}
{{ if not $featured -}}
{{ $featured = $images.GetMatch "{*cover*,*thumbnail*}" -}}
{{ end -}}
{{ with $featured -}}
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="{{ $featured.Permalink }}">
{{ else -}}
{{ with $.Site.Params.images -}}
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="{{ index . 0 | absURL }}">
{{ else -}}
<meta name="twitter:card" content="summary">
{{ end -}}
{{ end -}}
{{ end -}}
<meta name="twitter:title" content="{{ .Title }}">
<meta name="twitter:description" content="{{ with .Description }}{{ . }}{{ else }}{{if .IsPage}}{{ .Summary }}{{ else }}{{ with .Site.Params.description }}{{ . }}{{ end }}{{ end }}{{ end }}">
{{ with .Site.Social.twitter -}}
<meta name="twitter:site" content="@{{ . }}">
{{ end -}}
{{ range .Site.Authors -}}
{{ with .twitter -}}
<meta name="twitter:creator" content="@{{ . }}">
{{ end -}}
{{ end -}}

View File

@ -0,0 +1,39 @@
<div class="header-bar fixed-top"></div>
<header class="navbar fixed-top navbar-expand-md navbar-light">
<div class="container">
<input class="menu-btn order-0" type="checkbox" id="menu-btn">
<label class="menu-icon d-md-none" for="menu-btn"><span class="navicon"></span></label>
<a class="navbar-brand order-1 order-md-0 mr-auto" href="{{ "/" | absURL }}">{{ .Site.Params.Title }}</a>
<button id="mode" class="btn btn-link order-2 order-md-4" type="button" aria-label="Toggle mode">
<span class="toggle-dark"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-moon"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path></svg></span>
<span class="toggle-light"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-sun"><circle cx="12" cy="12" r="5"></circle><line x1="12" y1="1" x2="12" y2="3"></line><line x1="12" y1="21" x2="12" y2="23"></line><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line><line x1="1" y1="12" x2="3" y2="12"></line><line x1="21" y1="12" x2="23" y2="12"></line><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line></svg></span>
</button>
<ul class="navbar-nav social-nav order-3 order-md-5">
{{ range .Site.Menus.social -}}
<li class="nav-item">
<a class="nav-link" href="{{ .URL | absURL }}">{{ .Pre | safeHTML }}<span class="ml-2 sr-only">{{ .Name | safeHTML }}</span></a>
</li>
{{ end -}}
</ul>
<div class="collapse navbar-collapse order-4 order-md-1">
<ul class="navbar-nav main-nav mr-auto order-5 order-md-2">
{{- $current := . -}}
{{ range .Site.Menus.main -}}
{{- $active := or ($current.IsMenuCurrent "main" .) ($current.HasMenuCurrent "main" .) -}}
{{- $active = or $active (eq .Name $current.Title) -}}
{{- $active = or $active (and (eq .Name "Docs") (eq $current.Section "docs")) -}}
{{- $active = or $active (and (eq .Name "Guides") (eq $current.Section "guides")) -}}
{{- $active = or $active (and (eq .Name "Blog") (eq $current.Section "blog" "authors")) -}}
<li class="nav-item{{ if $active }} active{{ end }}">
<a class="nav-link" href="{{ .URL | absURL }}">{{ .Name }}</a>
</li>
{{ end -}}
</ul>
<div class="break order-6 d-md-none"></div>
<form class="navbar-form flex-grow-1 order-7 order-md-3">
<input id="userinput" class="form-control is-search" type="search" placeholder="Search docs..." aria-label="Search docs..." autocomplete="off">
<div id="suggestions" class="shadow bg-white rounded"></div>
</form>
</div>
</div>
</header>

View File

@ -0,0 +1 @@
<p><small>Posted {{ .PublishDate.Format "January 2, 2006" }} by {{ if .Params.contributors -}}{{ range $index, $contributor := .Params.contributors }}{{ if gt $index 0 }} and {{ end }}<a class="stretched-link position-relative" href="{{ "/contributors/" | absURL }}{{ . | urlize }}/">{{ . }}</a>{{ end -}}{{ end -}}&nbsp;&hyphen;&nbsp;<strong>{{ .ReadingTime -}}&nbsp;min read</strong></small><p>

View File

@ -0,0 +1,24 @@
{{ if or .Prev .Next -}}
<div class="docs-navigation d-flex justify-content-between">
<!-- https://www.feliciano.tech/blog/custom-sort-hugo-single-pages/ -->
{{ $pages := where site.RegularPages "Section" .Section -}}
{{ with $pages.Next . -}}
<a href="{{ .Permalink }}">
<div class="card my-1">
<div class="card-body py-2">
&Leftarrow; {{ .Title }}
</div>
</div>
</a>
{{ end -}}
{{ with $pages.Prev . -}}
<a class="ml-auto" href="{{ .Permalink }}">
<div class="card my-1">
<div class="card-body py-2">
{{ .Title }} &Rightarrow;
</div>
</div>
</a>
{{ end -}}
</div>
{{ end -}}

View File

@ -0,0 +1 @@
<p class="edit-page"><a href="{{ .Site.Params.docsRepo }}/blob/master/content/{{ .File.Path }}"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-edit-2"><path d="M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"></path></svg>Edit this page on GitHub</a></p>

Some files were not shown because too many files have changed in this diff Show More