From: Daniel Jr Date: Sat, 28 Sep 2024 17:20:04 +0000 (-0300) Subject: add cactus theme X-Git-Url: https://git.danielmrcl.dev/?a=commitdiff_plain;h=db5a4d8c89dfaf77e8c3d087fc9821e14ddf800b;p=danielmrcl.dev.git add cactus theme Signed-off-by: Daniel Jr --- diff --git a/themes/cactus/.gitignore b/themes/cactus/.gitignore new file mode 100644 index 0000000..d298be1 --- /dev/null +++ b/themes/cactus/.gitignore @@ -0,0 +1 @@ +public/ \ No newline at end of file diff --git a/themes/cactus/LICENSE b/themes/cactus/LICENSE new file mode 100644 index 0000000..f8a201f --- /dev/null +++ b/themes/cactus/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 ZERAN WU + +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. diff --git a/themes/cactus/README.md b/themes/cactus/README.md new file mode 100644 index 0000000..d7764bf --- /dev/null +++ b/themes/cactus/README.md @@ -0,0 +1,299 @@ +## Cactus + +A hugo theme for personal blog. Fork from hexo theme [cactus](https://github.com/probberechts/hexo-theme-cactus) created by @probberechts. + +[Live demo on github pages](https://www.takuzen.me/hugo-theme-cactus/). + +Some works are still in progress. See [TODOS](#todos) below. + +## Install + +1. clone cactus to your hugo site's `themes` folder. +``` +git clone https://github.com/monkeyWzr/hugo-theme-cactus.git themes/cactus +``` + +2. change your theme to cactus in your site config +```toml +# config.toml + +theme = "cactus" +``` + +3. config your site. See [Config] or a [complete config sample](exampleSite/config.toml) +4. test your site +``` +hugo server +``` + +5. publish your site in your prefered way. See hugo's doc: [Hosting & Deployment](https://gohugo.io/hosting-and-deployment/) + +## Config + +### Color themes + +```toml +[params] + + colortheme = "white" # dark, light, white, or classic +``` + +### Custom CSS + +```toml +[params] + css = ["css/custom.css"] +``` + +You can add multiple custom stylesheets which will be loaded after the main theme css. +For example, the above line will load the CSS-file placed at `/static/css/custom.css`. + +### Navigation + +```toml +# Main menu which appears below site header. +[[menu.main]] +name = "Home" +url = "/" +weight = 1 + +[[menu.main]] +name = "All posts" +url = "/posts" +weight = 2 + +[[menu.main]] +name = "Tags" +url = "/tags" +weight = 3 + +[[menu.main]] +name = "About" +url = "/about" +weight = 4 +``` + +### Homepage settings + +* description: description will be displayed in the homepage. Markdown syntax is supported in the description string. +```toml +[params] + + description = "Hugo is a general-purpose website framework. Technically speaking, Hugo is a static site generator. Unlike systems that dynamically build a page with each visitor request, Hugo builds pages when you create or update your content. Since websites are viewed far more often than they are edited, Hugo is designed to provide an optimal viewing experience for your website’s end users and an ideal writing experience for website authors." +``` + +* set your main section (used as the link for the "writings" title on the homepage) + +```toml +[params] + mainSection = "posts" +``` + +* change the default main section title from Writings, to something else: + +```toml +[params] + mainSectionTitle = "Blog" +``` + +* Show only the 5 most recent posts (default) + +```toml +[params] + showAllPostsOnHomePage = false + postsOnHomePage = 5 +``` +* show all posts + +```toml +[params] + showAllPostsOnHomePage = true + postsOnHomePage = 5 # this option will be ignored +``` + +* show tagsoverview (default) or not +* +```toml +[params] + tagsOverview = true +``` + +* display the table of contents inline on blog posts, rather than as part of the navigation menu: + +```toml +[params] + tocInline = true +``` + +* show projects list (default) or not. + +```toml +[params] + showProjectsList = true + projectsUrl = "https://github.com/monkeyWzr" +``` + +Projects section will not be shown if no data file is detected. See [Projects list](#projects-list) below. + +### Projects list + +Create your projects data file `data/projects.yaml|toml|json`. Hugo support yaml, toml and json formats. +for former hexo cactus users: please assign your json array to a `list` key. + +for example, `data/projects.json`: +```json +{ + "list": [ + { + "name":"Hexo", + "url":"https://hexo.io/", + "desc":"A fast, simple & powerful blog framework" + }, + { + "name":"Font Awesome", + "url":"http://fontawesome.io/", + "desc":"The iconic font and CSS toolkit" + } + ] +} +``` + +### Social media links + +```toml +[[params.social]] + name = "github" + link = "https://github.com/monkeyWzr" + +[[params.social]] + name = "email" + link = "monkeywzr@gmail.com" # no need for "mailto:" at the start + +[[params.social]] + name = "linkedin" + link = "https://www.linkedin.com/in/monkeywzr/" +``` + +The `name` key expects the name of a [Font Awesome icon](https://fontawesome.com/icons?d=gallery&s=brands). + +### Copyright + +Assign your copy right to `.Site.Copyright`. Cactus will append current year to the head. + +TODO: Customizable copyright year + +```toml +copyright = "Zeran Wu" # cactus theme will use site title if copyright is not set +``` + +### Comments + +Comments is disabled by default. Enable comments in your `.Site.Params`. +```toml +[params] + [params.comments] + enabled = true + # engine = "disqus" # in progress +``` + +You can also enable/disable comments per post. in your posts' front matter, add: +```yaml +comments: true +``` + +The site config is ignored when `comments` option exists in front matter. + +The default engine is disqus. **By now only disqus is supported in cactus.** I will add more options sooner or later. See [Comments Alternatives](https://gohugo.io/content-management/comments/#comments-alternatives) + +Before using disqus, you need to register and get your [disqus shortname](https://help.disqus.com/en/articles/1717111-what-s-a-shortname). Assign your shortname in `.Site.disqusShortname`, or cactus will use `.Site.Title` by default. + +``` +disqusShortname = "wzr" # cactus will use site title if not set +``` + +### highlight + +Use hugo's built-in [syntax highlighting](https://gohugo.io/getting-started/configuration-markup#highlight). + +default config: + +```toml +[markup] + [markup.highlight] + codeFences = true + guessSyntax = false + hl_Lines = "" + lineNoStart = 1 + lineNos = false + lineNumbersInTable = true + noClasses = true + style = "monokai" + tabWidth = 4 +``` + +### Analytics + +Cactus uses hugo's bulit in analytics templates. Check [hugo's documents](https://gohugo.io/templates/internal#google-analytics) for details. + +Set you tracking id in your site config. +```toml +googleAnalytics = "UA-XXXXXXXX-XX" # or G-XXXXXXXX if you are using Google Analytics v4 (gtag.js) +``` + +If you are using Google Analytics v3 (analytics.js), you can switch to asynchronous tracking by set `params.googleAnalyticsAsync` to `true`. +```toml +[params] +googleAnalyticsAsync = true # not required +``` + +### RSS + +The rss feed is not generated by default. you can enable it in your site config: + +```toml +[params] + rss = true +``` + +The rss link will be `https://example.com/index.xml` assuming your `baseURL` is set to `https://example.com/` + +Please also check [Configure RSS](https://gohugo.io/templates/rss/#configure-rss) + +### Mathjax + +Cactus supports mathjax. Just add `mathjax` option in your site config: +```toml +[params] + mathjax = true # not required +``` + +You can also enable/disable mathjax per post. In your posts' front matter, add: +```yaml +mathjax: true # or false +``` + +The site config will be ignored when `mathjax` option exists in front matter. + +### Archive +Pagination on posts archive can be disabled to show all posts in chronological order + +```toml +[params] + showAllPostsArchive = true # or false (default) +``` + +## TODOS + +- [ ] More comments engines +- [x] RSS +- [ ] I18n +- [x] Analytics +- [ ] Local Search +- [ ] toc template +- [ ] Customizable copyright year +- [ ] gallery +- [ ] expose [mathjax configuration](https://docs.mathjax.org/en/latest/web/configuration.html#web-configuration) + +## License + +MIT diff --git a/themes/cactus/assets/scss/_extend.scss b/themes/cactus/assets/scss/_extend.scss new file mode 100644 index 0000000..5eb2d52 --- /dev/null +++ b/themes/cactus/assets/scss/_extend.scss @@ -0,0 +1,119 @@ +// $base-style +h1, +.h1 { + display: block; + margin-top: 3rem; + margin-bottom: 1rem; + color: $color-accent-1; + letter-spacing: .01em; + font-weight: 700; + font-style: normal; + font-size: 1.5em; + + @include antialias(); +} +h2, +.h2 { + position: relative; + display: block; + margin-top: 2rem; + margin-bottom: .5rem; + color: $color-accent-2; + text-transform: none; + letter-spacing: normal; + font-weight: bold; + font-size: 1rem; +} +h3 { + color: $color-accent-2; + text-decoration: underline; + font-weight: bold; + font-size: .9rem; +} +h4 +h5 +h6 { + display: inline; + text-decoration: none; + color: $color-accent-3; + font-weight: bold; + font-size: .9rem; +} +h3 +h4 +h5 +h6 { + margin-top: .9rem; + margin-bottom: .5rem; +} +hr { + border: .5px dashed $color-accent-3; + opacity: .5; + margin: 0; + margin-top: 20px; + margin-bottom: 20px; +} +strong { + font-weight: bold; +} +em +cite { + font-style: italic; +} +sup +sub { + position: relative; + vertical-align: baseline; + font-size: .75em; + line-height: 0; +} +sup { + top: -.5em; +} +sub { + bottom: -.2em; +} +small { + font-size: .85em; +} +acronym +abbr { + border-bottom: 1px dotted; +} +ul +ol +dl { + line-height: $line-height; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-top: 0; + margin-bottom: 0; +} +ol { + list-style: decimal; +} +dt { + font-weight: bold; +} +table { + width: 100%; + border-collapse: collapse; + text-align: left; + font-size: $font-size - 2px; + overflow: auto; + display: block; +} +th { + padding: 8px; + border-bottom: 1px dashed $color-border; + color: $color-accent-2; + font-weight: bold; + font-size: $font-size - 1px; +} +td { + padding: 0 8px; + border-bottom: none; +} \ No newline at end of file diff --git a/themes/cactus/assets/scss/_fonts.scss b/themes/cactus/assets/scss/_fonts.scss new file mode 100644 index 0000000..37d2e4d --- /dev/null +++ b/themes/cactus/assets/scss/_fonts.scss @@ -0,0 +1,6 @@ +@font-face { + font-style: normal; + font-family: "JetBrains Mono"; + font-display: swap; + src: local("JetBrains Mono"), local("JetBrains-Mono"), url("../lib/JetBrainsMono/web/woff2/JetBrainsMono-Regular.woff2") format("woff2"), url("../lib/JetBrainsMono/web/woff/JetBrainsMono-Regular.woff") format("woff"), url("../lib/JetBrainsMono/web/eot/JetBrainsMono-Regular.eot") format("embedded-opentype"), url("../lib/JetBrainsMono/ttf/JetBrainsMono-Regular.ttf") format("truetype"); +}; \ No newline at end of file diff --git a/themes/cactus/assets/scss/_mixins.scss b/themes/cactus/assets/scss/_mixins.scss new file mode 100644 index 0000000..cc0eda6 --- /dev/null +++ b/themes/cactus/assets/scss/_mixins.scss @@ -0,0 +1,20 @@ +@mixin antialias() { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} +@mixin hyphens($value) { + hyphens: $value; + -moz-hyphens: $value; + -ms-hyphens: $value; + -webkit-hyphens: $value; +} +@mixin underline($size, $color) { + background-image: linear-gradient(transparent, transparent $size, $color $size, $color); + background-position: bottom; + background-size: 100% 6px; + background-repeat: repeat-x; +} +@mixin no-select() { + user-select: none; + -khtml-user-select: none; +} \ No newline at end of file diff --git a/themes/cactus/assets/scss/_util.scss b/themes/cactus/assets/scss/_util.scss new file mode 100644 index 0000000..83cbc8c --- /dev/null +++ b/themes/cactus/assets/scss/_util.scss @@ -0,0 +1,319 @@ +/* Basscss */ +.inline { + display: inline; +} +.block { + display: block; +} +.inline-block { + display: inline-block; +} +.table { + display: table; +} +.table-cell { + display: table-cell; +} +.overflow-hidden { + overflow: hidden; +} +.overflow-scroll { + overflow: scroll; +} +.overflow-auto { + overflow: auto; +} +.clearfix:before, +.clearfix:after { + display: table; + content: " "; +} +.clearfix:after { + clear: both; +} +.left { + float: left; +} +.right { + float: right; +} +.fit { + max-width: 100%; +} +.truncate { + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.max-width-1 { + max-width: 24rem; +} +.max-width-2 { + max-width: 32rem; +} +.max-width-3 { + max-width: 48rem; +} +.max-width-4 { + max-width: 64rem; +} +.border-box { + box-sizing: border-box; +} +.m0 { + margin: 0; +} +.mt0 { + margin-top: 0; +} +.mr0 { + margin-right: 0; +} +.mb0 { + margin-bottom: 0; +} +.ml0 { + margin-left: 0; +} +.mx0 { + margin-right: 0; + margin-left: 0; +} +.my0 { + margin-top: 0; + margin-bottom: 0; +} +.m1 { + margin: .5rem; +} +.mt1 { + margin-top: .5rem; +} +.mr1 { + margin-right: .5rem; +} +.mb1 { + margin-bottom: .5rem; +} +.ml1 { + margin-left: .5rem; +} +.mx1 { + margin-right: .5rem; + margin-left: .5rem; +} +.my1 { + margin-top: .5rem; + margin-bottom: .5rem; +} +.m2 { + margin: 1rem; +} +.mt2 { + margin-top: 1rem; +} +.mr2 { + margin-right: 1rem; +} +.mb2 { + margin-bottom: 1rem; +} +.ml2 { + margin-left: 1rem; +} +.mx2 { + margin-right: 1rem; + margin-left: 1rem; +} +.my2 { + margin-top: 1rem; + margin-bottom: 1rem; +} +.m3 { + margin: 2rem; +} +.mt3 { + margin-top: 2rem; +} +.mr3 { + margin-right: 2rem; +} +.mb3 { + margin-bottom: 2rem; +} +.ml3 { + margin-left: 2rem; +} +.mx3 { + margin-right: 2rem; + margin-left: 2rem; +} +.my3 { + margin-top: 2rem; + margin-bottom: 2rem; +} +.m4 { + margin: 4rem; +} +.mt4 { + margin-top: 4rem; +} +.mr4 { + margin-right: 4rem; +} +.mb4 { + margin-bottom: 4rem; +} +.ml4 { + margin-left: 4rem; +} +.mx4 { + margin-right: 4rem; + margin-left: 4rem; +} +.my4 { + margin-top: 4rem; + margin-bottom: 4rem; +} +.mxn1 { + margin-right: -.5rem; + margin-left: -.5rem; +} +.mxn2 { + margin-right: -1rem; + margin-left: -1rem; +} +.mxn3 { + margin-right: -2rem; + margin-left: -2rem; +} +.mxn4 { + margin-right: -4rem; + margin-left: -4rem; +} +.ml-auto { + margin-left: auto; +} +.mr-auto { + margin-right: auto; +} +.mx-auto { + margin-right: auto; + margin-left: auto; +} +.p0 { + padding: 0; +} +.pt0 { + padding-top: 0; +} +.pr0 { + padding-right: 0; +} +.pb0 { + padding-bottom: 0; +} +.pl0 { + padding-left: 0; +} +.px0 { + padding-right: 0; + padding-left: 0; +} +.py0 { + padding-top: 0; + padding-bottom: 0; +} +.p1 { + padding: .5rem; +} +.pt1 { + padding-top: .5rem; +} +.pr1 { + padding-right: .5rem; +} +.pb1 { + padding-bottom: .5rem; +} +.pl1 { + padding-left: .5rem; +} +.py1 { + padding-top: .5rem; + padding-bottom: .5rem; +} +.px1 { + padding-right: .5rem; + padding-left: .5rem; +} +.p2 { + padding: 1rem; +} +.pt2 { + padding-top: 1rem; +} +.pr2 { + padding-right: 1rem; +} +.pb2 { + padding-bottom: 1rem; +} +.pl2 { + padding-left: 1rem; +} +.py2 { + padding-top: 1rem; + padding-bottom: 1rem; +} +.px2 { + padding-right: 1rem; + padding-left: 1rem; +} +.p3 { + padding: 2rem; +} +.pt3 { + padding-top: 2rem; +} +.pr3 { + padding-right: 2rem; +} +.pb3 { + padding-bottom: 2rem; +} +.pl3 { + padding-left: 2rem; +} +.py3 { + padding-top: 2rem; + padding-bottom: 2rem; +} +.px3 { + padding-right: 2rem; + padding-left: 2rem; +} +.p4 { + padding: 4rem; +} +.pt4 { + padding-top: 4rem; +} +.pr4 { + padding-right: 4rem; +} +.pb4 { + padding-bottom: 4rem; +} +.pl4 { + padding-left: 4rem; +} +.py4 { + padding-top: 4rem; + padding-bottom: 4rem; +} +.px4 { + padding-right: 4rem; + padding-left: 4rem; +} \ No newline at end of file diff --git a/themes/cactus/assets/scss/_variables.scss b/themes/cactus/assets/scss/_variables.scss new file mode 100644 index 0000000..279b5b9 --- /dev/null +++ b/themes/cactus/assets/scss/_variables.scss @@ -0,0 +1,13 @@ +// Fonts +$font-family-body: "JetBrains Mono", monospace; +$font-family-mono: "JetBrains Mono", monospace; +$font-family-tt: "Inconsolata", monospace; +$font-size: 14px; +$line-height: 1.725; +$page-width: 48rem; +// Logo +$logo-width: 50px; +$logo-height: 50px; +$logo-grayout: true; +// Colors +$colors: "dark" // white dark light classic \ No newline at end of file diff --git a/themes/cactus/assets/scss/colors/classic.scss b/themes/cactus/assets/scss/colors/classic.scss new file mode 100644 index 0000000..7ff8cb2 --- /dev/null +++ b/themes/cactus/assets/scss/colors/classic.scss @@ -0,0 +1,13 @@ +$color-background: #fafafa; +$color-footer-mobile-1: darken($color-background, 2%); +$color-footer-mobile-2: darken($color-background, 10%); +$color-background-code: darken($color-background, 2%); +$color-border: #666; +$color-meta: #666; +$color-meta-code: lighten($color-meta, 10%); +$color-link: rgba(86, 124, 119, .4); +$color-text: #22272a; +$color-accent-1: #cc2a41; +$color-accent-2: rgba(86, 124, 119, .8); +$color-accent-3: #666; +$color-quote: #cc2a41; \ No newline at end of file diff --git a/themes/cactus/assets/scss/colors/dark.scss b/themes/cactus/assets/scss/colors/dark.scss new file mode 100644 index 0000000..c7fc243 --- /dev/null +++ b/themes/cactus/assets/scss/colors/dark.scss @@ -0,0 +1,13 @@ +$color-background: #1d1f21; +$color-footer-mobile-1: lighten($color-background, 2%); +$color-footer-mobile-2: lighten($color-background, 10%); +$color-background-code: lighten($color-background, 2%); +$color-border: #666; +$color-meta: #666; +$color-meta-code: #666; +$color-link: rgba(212, 128, 170, 1); +$color-text: #c9cacc; +$color-accent-3: #cccccc; +$color-accent-2: #eeeeee; +$color-accent-1: #2bbc8a; +$color-quote: #ccffb6; \ No newline at end of file diff --git a/themes/cactus/assets/scss/colors/light.scss b/themes/cactus/assets/scss/colors/light.scss new file mode 100644 index 0000000..dcfcbd6 --- /dev/null +++ b/themes/cactus/assets/scss/colors/light.scss @@ -0,0 +1,14 @@ +// by @GabiThume (https://github.com/gabithume) +$color-background: #e2e0de; +$color-footer-mobile-1: darken($color-background, 2%); +$color-footer-mobile-2: darken($color-background, 10%); +$color-background-code: darken($color-background, 2%); +$color-border: #666; +$color-meta: #666; +$color-meta-code: lighten($color-meta, 10%); +$color-link: rgba(43, 188, 138, 1); +$color-text: #363533; +$color-accent-3: #666666; +$color-accent-2: #111111; +$color-accent-1: #d44375; +$color-quote: #ab2251; \ No newline at end of file diff --git a/themes/cactus/assets/scss/colors/white.scss b/themes/cactus/assets/scss/colors/white.scss new file mode 100644 index 0000000..a4d1547 --- /dev/null +++ b/themes/cactus/assets/scss/colors/white.scss @@ -0,0 +1,14 @@ +// by @sergodeeva (https://github.com/sergodeeva) +$color-background: #FFFFFF; +$color-footer-mobile-1: darken($color-background, 2%); +$color-footer-mobile-2: darken($color-background, 10%); +$color-background-code: darken($color-background, 2%); +$color-border: #666; +$color-meta: #666; +$color-meta-code: lighten($color-meta, 10%); +$color-link: rgba(212, 128, 170, 1); +$color-text: #383838; +$color-accent-3: #8c8c8c; +$color-accent-2: #383838; +$color-accent-1: #2bbc8a; +$color-quote: #2bbc8a; \ No newline at end of file diff --git a/themes/cactus/assets/scss/partial/archive.scss b/themes/cactus/assets/scss/partial/archive.scss new file mode 100644 index 0000000..139c583 --- /dev/null +++ b/themes/cactus/assets/scss/partial/archive.scss @@ -0,0 +1,32 @@ +#archive { + .post-list { + padding: 0; + + .post-item { + margin-bottom: 1rem; + margin-left: 0; + list-style-type: none; + + .meta { + display: block; + margin-right: 16px; + min-width: 100px; + color: $color-meta; + font-size: 14px; + } + } + } + @media (min-width: 480px) { + .post-list { + .post-item { + display: flex; + margin-bottom: 5px; + margin-left: 1rem; + + .meta { + text-align: left; + } + } + } + } +} \ No newline at end of file diff --git a/themes/cactus/assets/scss/partial/article.scss b/themes/cactus/assets/scss/partial/article.scss new file mode 100644 index 0000000..82a005f --- /dev/null +++ b/themes/cactus/assets/scss/partial/article.scss @@ -0,0 +1,158 @@ +article { + header { + .posttitle { + margin-top: 0; + margin-bottom: 0; + text-transform: none; + font-size: 1.5em; + line-height: 1.25; + } + .meta { + margin-top: 0; + margin-bottom: 1rem; + } + .meta * { + color: $color-accent-3; + font-size: .85rem; + } + .author { + text-transform: uppercase; + letter-spacing: .01em; + font-weight: 700; + } + .postdate { + display: inline; + } + } + .content { + h2 { + &:before { + position: absolute; + top: -4px; + left: -1rem; + color: $color-accent-1; + content: "#"; + font-weight: bold; + font-size: 1.2rem; + } + } + } + .content img, + .content video { + display: block; + margin: auto; + max-width: 100%; + height: auto; + + /* http://webdesignerwall.com/tutorials/css-elastic-videos */ + .video-container { + position: relative; + overflow: hidden; + padding-top: 56.25% e; + // (9/16 * 100)% // 16:9 ratio + height: 0; + + iframe, + object, + embed { + position: absolute; + top: 0; + left: 0; + margin-top: 0; + width: 100%; + height: 100%; + } + } + blockquote { + margin: 1rem 10px; + padding: .5em 10px; + background: inherit; + color: $color-quote; + quotes: "\201C" "\201D" "\2018" "\2019"; + font-weight: bold; + + p { + margin: 0; + } + &:before { + margin-right: .25em; + color: $color-quote; + content: "\201C"; + vertical-align: -.4em; + font-size: 2em; + line-height: .1em; + } + footer { + margin: line-height 0; + color: $color-meta; + font-size: 11px; + + a { + background-image: linear-gradient(transparent, transparent 5px, $color-meta 5px, $color-meta); + color: $color-meta; + } + a:hover { + background-image: linear-gradient(transparent, transparent 4px, lighten($color-meta, 20%) 4px, lighten($color-meta, 20%)); + color: lighten($color-meta, 20%); + } + cite { + &:before { + padding: 0 .5em; + content: "—"; + } + } + } + } + .pullquote { + margin: 0; + width: 45%; + text-align: left; + + &.left { + margin-right: 1em; + margin-left: .5em; + } + &.right { + margin-right: .5em; + margin-left: 1em; + } + } + .caption { + position: relative; + display: block; + margin-top: .5em; + color: $color-meta; + text-align: center; + font-size: .9em; + } + } +} +.posttitle { + text-transform: none; + font-size: 1.5em; + line-height: 1.25; +} +.article-tag { + .tag-link { + &:before { + content: "#"; + @include underline(10px, $color-link); + } + } +} +.article-category { + .category-link { + @include underline(10px, $color-link); + } +} +@media (min-width: 480px) { + .article-read-time, + .article-tag, + .article-category { + display: inline; + + &:before { + content: "|"; + } + } +}; \ No newline at end of file diff --git a/themes/cactus/assets/scss/partial/categories.scss b/themes/cactus/assets/scss/partial/categories.scss new file mode 100644 index 0000000..dc75239 --- /dev/null +++ b/themes/cactus/assets/scss/partial/categories.scss @@ -0,0 +1,18 @@ +#categories { + .category-list-title { + color: $color-meta; + } + .category-list { + .category-list-item { + .category-list-count { + color: $color-meta; + } + .category-list-count:before { + content: " ("; + } + .category-list-count:after { + content: ")"; + } + } + } +} \ No newline at end of file diff --git a/themes/cactus/assets/scss/partial/comments.scss b/themes/cactus/assets/scss/partial/comments.scss new file mode 100644 index 0000000..2ed3c9d --- /dev/null +++ b/themes/cactus/assets/scss/partial/comments.scss @@ -0,0 +1,3 @@ +.blog-post-comments { + margin-top: 4rem; +} \ No newline at end of file diff --git a/themes/cactus/assets/scss/partial/footer.scss b/themes/cactus/assets/scss/partial/footer.scss new file mode 100644 index 0000000..da52981 --- /dev/null +++ b/themes/cactus/assets/scss/partial/footer.scss @@ -0,0 +1,66 @@ +#footer { + position: absolute; + bottom: 0; + margin-bottom: 10px; + width: 100%; + color: $color-meta; + vertical-align: top; + text-align: center; + font-size: 11px; + + ul { + margin: 0; + padding: 0; + list-style: none; + } + li { + display: inline-block; + margin-right: 15px; + border-right: 1px solid; + border-color: $color-border; + vertical-align: middle; + + a { + margin-right: 15px; + } + } + li:last-child { + margin-right: 0; + border-right: 0; + + a { + margin-right: 0; + } + } + a { + color: $color-meta; + text-decoration: underline; + background-image: none; + } + a:hover { + color: lighten($color-meta, 20%); + } + .footer-left { + height: 20px; + vertical-align: middle; + line-height: 20px; + } +} +@media (min-width: 39rem) { + #footer { + display: flex; + flex-flow: row wrap; + justify-content: space-between; + align-items: center; + align-content: center; + margin-bottom: 20px; + + .footer-left { + align-self: flex-start; + margin-right: 20px; + } + .footer-right { + align-self: flex-end; + } + } +}; \ No newline at end of file diff --git a/themes/cactus/assets/scss/partial/header.scss b/themes/cactus/assets/scss/partial/header.scss new file mode 100644 index 0000000..cbb83ff --- /dev/null +++ b/themes/cactus/assets/scss/partial/header.scss @@ -0,0 +1,123 @@ +#header { + margin: 0 auto 2rem; + width: 100%; + + h1, + .h1 { + margin-top: 0; + margin-bottom: 0; + color: $color-text; + letter-spacing: .01em; + font-weight: 700; + font-style: normal; + font-size: 1.5rem; + line-height: 2rem; + + @include antialias(); + } + a { + background: none; + color: inherit; + text-decoration: none; + } + #logo { + display: inline-block; + float: left; + margin-right: 20px; + width: $logo-width; + height: $logo-height; + border-radius: 5px; + background-size: $logo-width $logo-height; + background-repeat: no-repeat; + @if $logo-grayout { + filter: grayscale(100%); + -webkit-filter: grayscale(100%); + } + } + #nav { + color: $color-accent-1; + letter-spacing: .01em; + font-weight: 200; + font-style: normal; + font-size: .8rem; + + ul { + margin: 0; + padding: 0; + list-style-type: none; + line-height: 15px; + + a { + margin-right: 15px; + color: $color-accent-1; + } + a:hover { + @include underline(5px, $color-accent-1); + } + li { + display: inline-block; + margin-right: 15px; + border-right: 1px dotted; + border-color: $color-accent-1; + vertical-align: middle; + } + .icon { + display: none; + } + li:last-child { + margin-right: 0; + border-right: 0; + + a { + margin-right: 0; + } + } + } + } +} +@if $logo-grayout { + #header:hover { + #logo { + filter: none; + -webkit-filter: none; + } + } +} +@media screen and (max-width: 480px) { + #header #title { + display: table; + margin-right: 5rem; + min-height: $logo-height; + h1 { + display: table-cell; + vertical-align: middle; + } + } + #header #nav { + ul { + a:hover { + background: none; + } + li { + display: none; + border-right: 0; + } + li.icon { + position: absolute; + top: 77px; + right: 1rem; + display: inline-block; + } + } + ul.responsive { + li { + display: block; + } + } + li:not(:first-child) { + padding-top: 1rem; + padding-left: $logo-width + 20px; + font-size: 1rem; + } + } +}; \ No newline at end of file diff --git a/themes/cactus/assets/scss/partial/index.scss b/themes/cactus/assets/scss/partial/index.scss new file mode 100644 index 0000000..4ae7639 --- /dev/null +++ b/themes/cactus/assets/scss/partial/index.scss @@ -0,0 +1,40 @@ +.post-list { + padding: 0; + + .post-item { + margin-bottom: 1rem; + margin-left: 0; + list-style-type: none; + + .meta { + display: block; + margin-right: 16px; + min-width: 100px; + color: $color-meta; + font-size: 14px; + } + } +} +@media (min-width: 480px) { + .post-list { + .post-item { + display: flex; + margin-bottom: 5px; + + .meta { + text-align: left; + } + } + } +} +.project-list { + padding: 0; + list-style: none; + + .project-item { + margin-bottom: 5px; + p { + display: inline; + } + } +} \ No newline at end of file diff --git a/themes/cactus/assets/scss/partial/pagination.scss b/themes/cactus/assets/scss/partial/pagination.scss new file mode 100644 index 0000000..eecc53c --- /dev/null +++ b/themes/cactus/assets/scss/partial/pagination.scss @@ -0,0 +1,25 @@ +.pagination { + display: inline-block; + margin-top: 2rem; + width: 100%; + text-align: center; + + .page-number { + color: $color-text; + font-size: .8rem; + } + a { + padding: 4px 6px; + border-radius: 5px; + // background-color: $color-accent-1 + background-image: none; + color: $color-text; + text-decoration: none; + } + a:hover { + background-image: none; + } + a:hover:not(.active) { + color: $color-accent-2; + } +} \ No newline at end of file diff --git a/themes/cactus/assets/scss/partial/post/actions_desktop.scss b/themes/cactus/assets/scss/partial/post/actions_desktop.scss new file mode 100644 index 0000000..35aaf71 --- /dev/null +++ b/themes/cactus/assets/scss/partial/post/actions_desktop.scss @@ -0,0 +1,256 @@ +#header-post { + position: fixed; + top: 2rem; + right: 0; + display: inline-block; + float: right; + z-index: 100; + + a { + background: none; + color: inherit; + text-decoration: none; + } + a.icon { + background: none; + + &:hover { + color: $color-link; + } + } + nav { + ul { + display: block; + + list-style-image: none; + + list-style-position: outside; + + list-style-type: none; + + padding-inline-start: 40px; + + li { + display: list-item; + + margin-right: 0px; + } + } + } + nav > ul { + margin-block-end: 1em; + + margin-block-start: 1em; + } + + ul { + display: inline-block; + margin: 0; + padding: 0; + list-style-type: none; + + li { + display: inline-block; + margin-right: 15px; + vertical-align: middle; + } + li:last-child { + margin-right: 0; + } + } + #menu-icon { + float: right; + margin-right: 2rem; + margin-left: 15px; + + &:hover { + color: $color-accent-1; + } + } + #menu-icon-tablet { + float: right; + margin-right: 2rem; + margin-left: 15px; + + &:hover { + color: $color-accent-1; + } + } + #top-icon-tablet { + position: fixed; + right: 2rem; + bottom: 2rem; + margin-right: 2rem; + margin-left: 15px; + + &:hover { + color: $color-accent-1; + } + } + .active { + color: $color-accent-1; + } + #menu { + visibility: hidden; + margin-right: 2rem; + } + #nav { + color: $color-accent-1; + letter-spacing: .01em; + font-weight: 200; + font-style: normal; + font-size: .8rem; + + ul { + line-height: 15px; + + a { + margin-right: 15px; + color: $color-accent-1; + } + a:hover { + @include underline(5px, $color-accent-1); + } + li { + border-right: 1px dotted $color-accent-1; + } + li:last-child { + margin-right: 0; + border-right: 0; + + a { + margin-right: 0; + } + } + } + } + #actions { + float: right; + margin-top: 2rem; + margin-right: 2rem; + width: 100%; + text-align: right; + + ul { + display: block; + } + .info { + display: block; + font-style: italic; + } + } + #share { + clear: both; + padding-top: 1rem; + padding-right: 2rem; + text-align: right; + + li { + display: block; + margin: 0; + } + } + #toc { + float: right; + clear: both; + overflow: auto; + margin-top: 1rem; + padding-right: 2rem; + max-width: 20em; + max-height: calc(95vh - 7rem); + text-align: right; + + a:hover { + color: $color-link; + } + // .toc-level-1 > .toc-link + // display: none + + nav > ul > li { + color: $color-text; + font-size: .8rem; + + &:before { + color: $color-accent-1; + content: "#"; + margin-right: 8px; + } + } + nav > ul > li > ul > li { + color: $color-meta; + font-size: .7rem; + + &:before { + color: $color-accent-1; + content: "·"; + font-weight: bold; + margin-right: 3px; + } + } + nav > ul > li > ul > li > ul > li { + color: darken($color-meta, 20%); + font-size: .4rem; + } + .toc-level-5 { + display: none; + } + .toc-level-6 { + display: none; + } + .toc-number { + display: none; + } +// smartphone + phapblet + } +} +@media screen and (max-width: 500px) { + #header-post { + display: none; + } +} + +@media screen and (max-width: 900px) { + #header-post { + #menu-icon { + display: none; + } + #actions { + display: none; + } + } +} +@media screen and (max-width: 1199px) { + #header-post { + #toc { + display: none; + } + } +} +@media screen and (min-width: 900px) { + #header-post { + #menu-icon-tablet { + display: none !important; + } + #top-icon-tablet { + display: none !important; + } + } +} +@media screen and (min-width: 1199px) { + #header-post { + #actions { + width: auto; + + ul { + display: inline-block; + float: right; + } + .info { + display: inline; + float: left; + margin-right: 2rem; + font-style: italic; + } + } + } +}; \ No newline at end of file diff --git a/themes/cactus/assets/scss/partial/post/actions_mobile.scss b/themes/cactus/assets/scss/partial/post/actions_mobile.scss new file mode 100644 index 0000000..b4acd51 --- /dev/null +++ b/themes/cactus/assets/scss/partial/post/actions_mobile.scss @@ -0,0 +1,154 @@ +#footer-post { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 5000000; + width: 100%; + border-top: 1px solid $color-border; + background: $color-footer-mobile-1; + transition: opacity .2s; + + a { + background: none; + color: inherit; + text-decoration: none; + } + a.icon { + background: none; + + &:hover { + color: $color-link; + } + } + #nav-footer { + padding-right: 1rem; + padding-left: 1rem; + background: $color-footer-mobile-2; + text-align: center; + + a { + color: $color-accent-1; + font-size: 1em; + } + a:hover { + @include underline(5px, $color-accent-1); + } + ul { + display: table; + margin: 0; + padding: 0; + width: 100%; + list-style-type: none; + + li { + display: inline-table; + padding: 10px; + width: 20%; + vertical-align: middle; + } + } + } + #actions-footer { + overflow: auto; + margin-top: 1rem; + margin-bottom: 1rem; + padding-right: 1rem; + padding-left: 1rem; + width: 100%; + text-align: center; + white-space: nowrap; + + a { + display: inline-block; + padding-left: 1rem; + color: $color-accent-1; + } + } + #share-footer { + padding-right: 1rem; + padding-left: 1rem; + background: $color-footer-mobile-2; + text-align: center; + + ul { + display: table; + margin: 0; + padding: 0; + width: 100%; + list-style-type: none; + + li { + display: inline-table; + padding: 10px; + width: 20%; + vertical-align: middle; + } + } + } + #toc-footer { + clear: both; + padding-top: 1rem; + padding-bottom: 1rem; + background: $color-footer-mobile-2; + text-align: left; + + #TableOfContents { + ul { + margin: 0; + padding-left: 20px; + list-style-type: none; + + li { + line-height: 30px; + } + } + } + a:hover { + color: $color-link; + } + // .toc-level-1 > .toc-link + // display: none + + #TableOfContents > ul > li { + color: $color-text; + font-size: .8rem; + + &:before { + color: $color-accent-1; + content: "#"; + margin-right: 8px; + } + } + #TableOfContents > ul > li > ul > li { + color: $color-meta; + font-size: .7rem; + line-height: 15px; + + &:before { + color: $color-accent-1; + content: "·"; + + font-weight: bold; + + margin-right: 3px; + } + } + #TableOfContents > ul > li > ul > li > ul > li { + display: none; + } + // .toc-level-5 + // display: none + + // .toc-level-6 + // display: none + + // .toc-number + // display: none + } +} +@media screen and (min-width: 500px) { + #footer-post-container { + display: none; + } +}; \ No newline at end of file diff --git a/themes/cactus/assets/scss/partial/search.scss b/themes/cactus/assets/scss/partial/search.scss new file mode 100644 index 0000000..2965c63 --- /dev/null +++ b/themes/cactus/assets/scss/partial/search.scss @@ -0,0 +1,49 @@ +.search-input { + padding: 4px 7px; + width: 100%; + outline: none; + border: solid 1px $color-accent-3; + border-radius: 5px; + background-color: $color-background; + color: $color-text; + font-size: 1.2rem; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + + &:focus { + border: solid 1px $color-accent-1; + } +} +#search-result { + ul.search-result-list { + padding: 0; + list-style-type: none; + } + li { + margin: 2em auto; + } + a.search-result-title { + background-image: none; + color: $color-text; + text-transform: capitalize; + font-weight: bold; + line-height: 1.2; + } + p.search-result { + overflow: hidden; + margin: .4em auto; + max-height: 13em; + text-align: justify; + font-size: .8em; + } + em.search-keyword { + border-bottom: 1px dashed $color-link; + color: $color-link; + font-weight: bold; + } +} +.search-no-result { + display: none; + padding-bottom: .5em; + color: $color-text; +} \ No newline at end of file diff --git a/themes/cactus/assets/scss/partial/tags.scss b/themes/cactus/assets/scss/partial/tags.scss new file mode 100644 index 0000000..1af38ef --- /dev/null +++ b/themes/cactus/assets/scss/partial/tags.scss @@ -0,0 +1,13 @@ +#tag-cloud { + .tag-cloud-title { + color: $color-meta; + } + .tag-cloud-tags { + clear: both; + text-align: center; + a { + display: inline-block; + margin: 10px; + } + } +} \ No newline at end of file diff --git a/themes/cactus/assets/scss/partial/tooltip.scss b/themes/cactus/assets/scss/partial/tooltip.scss new file mode 100644 index 0000000..9cb6cd6 --- /dev/null +++ b/themes/cactus/assets/scss/partial/tooltip.scss @@ -0,0 +1,86 @@ +// ref: https://github.com/primer/primer/blob/master/modules/primer-tooltips/lib/tooltips.scss +.tooltipped { + position: relative; +} +// This is the tooltip bubble +.tooltipped::after { + position: absolute; + z-index: 1000000; + display: none; + padding: .2em .5em; + -webkit-font-smoothing: subpixel-antialiased; + color: $color-background; + font-display: swap; + font-weight: 400; + font-size: $font-size * 0.8; + font-family: $font-family-body; + line-height: $line-height; + text-rendering: geometricPrecision; + text-align: center; + word-wrap: break-word; + white-space: pre; + content: attr(aria-label); + background: $color-text; + border-radius: 3px; + opacity: 0; +} +// This is the tooltip arrow +.tooltipped::before { + position: absolute; + z-index: 1000001; + display: none; + width: 0; + height: 0; + color: $color-text; + pointer-events: none; + content: ''; + border: 6px solid transparent; + opacity: 0; +} +// delay animation for tooltip +@keyframes tooltip-appear { + from { + opacity: 0; + } + to { + opacity: 1; + } +}; + +// This will indicate when we'll activate the tooltip +.tooltipped:hover, +.tooltipped:active, +.tooltipped:focus { + &::before, + &::after { + display: inline-block; + text-decoration: none; + animation-name: tooltip-appear; + animation-duration: 0.1s; + animation-fill-mode: forwards; + animation-timing-function: ease-in; + } +// Tooltipped south +} +.tooltipped-s, +.tooltipped-sw { + &::after { + top: 100%; + right: 50%; + margin-top: 6px; + } + &::before { + top: auto; + right: 50%; + bottom: -7px; + margin-right: -6px; + border-bottom-color: $color-text; + } +} +.tooltipped-sw::after { + margin-right: -16px; +} +// Move the tooltip body to the center of the object. +.tooltipped-s::after { + transform: translateX(50%); +} \ No newline at end of file diff --git a/themes/cactus/assets/scss/rtl.scss b/themes/cactus/assets/scss/rtl.scss new file mode 100644 index 0000000..44aebba --- /dev/null +++ b/themes/cactus/assets/scss/rtl.scss @@ -0,0 +1,105 @@ +@font-face { + font-family: Vazir; + src: url('../lib/vazir-font/Vazir.eot'); + src: url("../lib/vazir-font/Vazir.eot?#iefix") format('embedded-opentype'), url("../lib/vazir-font/Vazir.woff2") format('woff2'), url("../lib/vazir-font/Vazir.woff") format('woff'), url("../lib/vazir-font/Vazir.ttf") format('truetype'); + font-weight: normal; +} + +@font-face { + font-family: Vazir; + src: url('../lib/vazir-font/Vazir-Bold.eot'); + src: url("../lib/vazir-font/Vazir-Bold.eot?#iefix") format('embedded-opentype'), url("../lib/vazir-font/Vazir-Bold.woff2") format('woff2'), url("../lib/vazir-font/Vazir-Bold.woff") format('woff'), url("../lib/vazir-font/Vazir-Bold.ttf") format('truetype'); + font-weight: bold; +} + +@font-face { + font-family: Vazir; + src: url('../lib/vazir-font/Vazir-Light.eot'); + src: url("../lib/vazir-font/Vazir-Light.eot?#iefix") format('embedded-opentype'), url("../lib/vazir-font/Vazir-Light.woff2") format('woff2'), url("../lib/vazir-font/Vazir-Light.woff") format('woff'), url("../lib/vazir-font/Vazir-Light.ttf") format('truetype'); + font-weight: 300; +} + +.rtl { + font-family: Vazir, sans-serif; + direction: rtl; + + #nav { + li { + margin-right: 0px !important; + padding-left: 15px; + border-right: 0px !important; + border-left: 1px dotted; + } + li:last-child { + margin-right: 15px !important; + border-left: 0 !important; + } + } + #header { + #logo { + float: right; + margin-right: 0; + margin-left: 20px; + } + } + #footer { + li { + margin-right: 0px; + padding-left: 15px; + border-right: 0px; + border-left: 1px dotted; + } + li:last-child { + margin-right: 15px !important; + border-left: 0 !important; + } + #logo { + float: right; + } + } + article { + .content { + h2:before { + right: -1rem; + } + } + } + .post-list { + .post-item { + .meta { + margin-left: 16px; + margin-right: inherit; + } + } + } +} +@media screen and (min-width: 480px) { + .rtl { + .post-list { + .post-item { + .meta { + text-align: left; + } + } + } + } +} +@media screen and (max-width: 480px) { + .rtl { + #header { + #title { + margin-left: 5rem; + margin-right: 0; + } + #nav { + ul { + li { + left: 1rem; + right: auto; + border: 0; + } + } + } + } + } +}; \ No newline at end of file diff --git a/themes/cactus/assets/scss/style.scss b/themes/cactus/assets/scss/style.scss new file mode 100644 index 0000000..f8215d4 --- /dev/null +++ b/themes/cactus/assets/scss/style.scss @@ -0,0 +1,231 @@ +@import "variables"; +@import "colors/{{ site.Params.colortheme | default "white" }}"; +@import "util"; +@import "mixins"; +@import "extend"; +@import "fonts"; + +// global-reset() + +*, +*:before, +*:after { + box-sizing: border-box; +} +html { + margin: 0; + padding: 0; + height: 100%; + border-top: 2px solid $color-text; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; + height: 100%; + background-color: $color-background; + color: $color-text; + font-display: swap; + font-weight: 400; + font-size: $font-size; + font-family: $font-family-body; + line-height: $line-height; + text-rendering: geometricPrecision; + flex: 1; + + @include antialias(); + + @extend $base-style !optional; +} +.content { + position: relative; + display: flex; + flex-direction: column; + min-height: 100%; + overflow-wrap: break-word; + + p { + @include hyphens(auto); + } + code { + @include hyphens(manual); + } + a { + color: $color-text; + text-decoration: none; + + @include underline(5px, $color-text); + + &:hover { + background-image: linear-gradient(transparent, transparent 4px, $color-link 4px, $color-link); + } + } + a.icon { + background: none; + + &:hover { + color: $color-link; + } + } + h1 a, + .h1 a, + h2 a, + h3 a, + h4 a, + h5 a, + h6 a { + background: none; + color: inherit; + text-decoration: none; + } + h1 a:hover, + .h1 a:hover, + h2 a:hover, + h3 a:hover, + h4 a:hover, + h5 a:hover, + h6 a:hover { + @include underline(6px, $color-link); + } + h6 { + a { + background: none; + color: inherit; + text-decoration: none; + } + } + h6 { + a:hover { + @include underline(6px, $color-link); + } + } +} +@media (min-width: 540px) { + .image-wrap { + flex-direction: row; + margin-bottom: 2rem; + + .image-block { + flex: 1 0 35%; + margin-right: 2rem; + } + p { + flex: 1 0 65%; + } + } +} +.max-width { + max-width: $page-width; +} +@media (max-width: 480px) { // smaller margins at smaller screen widths + .px3 { + padding-right: 1rem; + padding-left: 1rem; + } + .my4 { + margin-top: 2rem; + margin-bottom: 2rem; + } +} + +@media (min-width: 480px) { + p { + text-align: justify; + } +} + +@import "partial/header"; +@import "partial/post/actions_desktop"; +@import "partial/post/actions_mobile"; +@import "partial/index"; +@import "partial/article"; +@import "partial/archive"; +@import "partial/comments"; +@import "partial/footer"; +@import "partial/pagination"; +@import "partial/search"; +@import "partial/tags"; +@import "partial/tooltip"; +@import "partial/categories"; + +pre { + overflow-x: auto; + padding: 15px 15px 10px 15px; + border: 1px dotted $color-border; + border-radius: 2px; + -webkit-border-radius: 2px; + font-size: 13px; + font-family: $font-family-mono; + line-height: 22px; + position: relative; + + .code-copy-btn { + position: absolute; + top: 0; + right: 0; + border: 0; + border-radius: 0 2px; + padding: 0; + font-family: "JetBrains Mono", monospace; + font-weight: 800; + font-size: 0.9em; + line-height: 1.7; + color: #fff; + background-color: #8c8c8c; + min-width: 60px; + text-align: center; + cursor: pointer; + letter-spacing: 0em; + } + + .code-copy-btn:hover { + background-color: #666; + color: #2bbc8a; + } + + code { + display: block; + padding: 0; + border: none; + } +} + +code { + font-family: $font-family-mono; + padding: 0 5px; + border: 1px dotted $color-border; + border-radius: 2px; + -webkit-border-radius: 2px; +} + +.highlight { + + & > div { + border-radius: 2px; + -webkit-border-radius: 2px; + } + + pre { + border: none; + background: none; + } + + table { + + pre { + margin-top: 0; + } + + td:first-child { + pre { + padding-right: 0; + } + } + + td:last-child { + pre { + padding-left: 0; + } + } + } +} \ No newline at end of file diff --git a/themes/cactus/images/screenshot-classic.png b/themes/cactus/images/screenshot-classic.png new file mode 100644 index 0000000..7c23d9d Binary files /dev/null and b/themes/cactus/images/screenshot-classic.png differ diff --git a/themes/cactus/images/screenshot-dark.png b/themes/cactus/images/screenshot-dark.png new file mode 100644 index 0000000..91e3688 Binary files /dev/null and b/themes/cactus/images/screenshot-dark.png differ diff --git a/themes/cactus/images/screenshot-light.png b/themes/cactus/images/screenshot-light.png new file mode 100644 index 0000000..3d5503d Binary files /dev/null and b/themes/cactus/images/screenshot-light.png differ diff --git a/themes/cactus/images/screenshot-tagsOverview.png b/themes/cactus/images/screenshot-tagsOverview.png new file mode 100644 index 0000000..fd246e5 Binary files /dev/null and b/themes/cactus/images/screenshot-tagsOverview.png differ diff --git a/themes/cactus/images/screenshot.png b/themes/cactus/images/screenshot.png new file mode 100644 index 0000000..14dbd06 Binary files /dev/null and b/themes/cactus/images/screenshot.png differ diff --git a/themes/cactus/images/tn.png b/themes/cactus/images/tn.png new file mode 100644 index 0000000..02d9490 Binary files /dev/null and b/themes/cactus/images/tn.png differ diff --git a/themes/cactus/layouts/_default/baseof.html b/themes/cactus/layouts/_default/baseof.html new file mode 100644 index 0000000..f7a3080 --- /dev/null +++ b/themes/cactus/layouts/_default/baseof.html @@ -0,0 +1,20 @@ + + +{{ partial "head.html" . }} + +
+ + {{ partial "header.html" . }} + + {{ block "main" . }} + {{ end }} + + {{ partial "footer.html" . }} + +
+ + + + + + diff --git a/themes/cactus/layouts/_default/list.html b/themes/cactus/layouts/_default/list.html new file mode 100644 index 0000000..e8c3e31 --- /dev/null +++ b/themes/cactus/layouts/_default/list.html @@ -0,0 +1,30 @@ +{{ define "main"}} +
+
    + + {{ $pages := .Paginator.Pages }} + {{ if .Site.Params.showAllPostsArchive }} + {{ $pages = .Pages }} + {{ end }} + + {{ range (sort $pages "Date" "desc") }} + {{ $pageYear := (.Date.Format "2006") }} + {{ if (ne $pageYear ($.Scratch.Get "year")) }} + {{ $.Scratch.Set "year" $pageYear }} +

    {{ $pageYear }}

    + {{ end }} +
  • +
    + +
    + + {{ if .Title }} {{ .Title }} {{ else }} Untitled {{ end }} + +
  • + {{ end }} +
+ {{ if eq .Site.Params.showAllPostsArchive false }} + {{ partial "pagination.html" . }} + {{ end }} +
+{{ end }} \ No newline at end of file diff --git a/themes/cactus/layouts/_default/single.html b/themes/cactus/layouts/_default/single.html new file mode 100644 index 0000000..6107133 --- /dev/null +++ b/themes/cactus/layouts/_default/single.html @@ -0,0 +1,12 @@ +{{ define "main" }} +
+ +
+ {{ if (eq .Type "search") }} + + {{ else }} + {{ .Content }} + {{ end }} +
+
+{{ end }} \ No newline at end of file diff --git a/themes/cactus/layouts/_default/terms.html b/themes/cactus/layouts/_default/terms.html new file mode 100644 index 0000000..704ab99 --- /dev/null +++ b/themes/cactus/layouts/_default/terms.html @@ -0,0 +1,41 @@ +{{ define "main" }} +
+
+ {{ if (eq .Type "tags")}} +
+ {{ if (eq (len .Data.Terms) 0) }} +
+ No tags +
+ {{ end }} +
+ {{ $AllRegularPagesCount := len .Site.RegularPages }} + {{ range $elem := .Data.Terms.Alphabetical }} + + {{- .Page.Title -}} + + {{ end }} +
+
+ {{ else if (eq .Type "categories")}} +
+ {{ if (eq (len .Data.Terms) 0) }} +
+ No categories +
+ {{ end }} +
+
    + {{ range .Data.Terms.Alphabetical }} +
  • + {{ .Page.Title }} + {{ .Count }} +
  • + {{ end }} +
+
+
+ {{ end }} +
+
+{{ end }} \ No newline at end of file diff --git a/themes/cactus/layouts/index.html b/themes/cactus/layouts/index.html new file mode 100644 index 0000000..10c5e28 --- /dev/null +++ b/themes/cactus/layouts/index.html @@ -0,0 +1,111 @@ +{{ define "main" }} +
+ {{ if isset .Site.Params "description" }} + {{ .Site.Params.description | $.Page.RenderString }} + {{ end }} + {{ if isset .Site.Params "social" }} +

Find me on + {{ $length := (len .Site.Params.social) }} + {{ range $index, $elem := .Site.Params.social}} + {{ if eq $elem.name "email" }} + + + + {{ else if eq $elem.name "rss" }} + + + + {{ else if eq $elem.name "scholar" }} + + + + {{ else }} + + + + {{ end }} + {{ if (lt (add $index 2) $length) }} + {{- print " , " -}} + {{ else if (lt (add $index 1) $length) }} + {{- print " and " -}} + {{ else }} + {{- print "." -}} + {{ end }} + {{ end }} +

+ {{ end }} + {{ partial "optional-about.html" . }} +
+ +
+ {{ .Site.Params.mainSectionTitle | default "Writings" }} + {{ if (and (and (isset .Site.Params "tagsoverview") (eq .Site.Params.tagsOverview true)) (gt (len .Site.Taxonomies.tags) 0)) }} + Topics + + {{ $AllRegularPagesCount := len .Site.RegularPages }} + {{ range $elem := .Site.Taxonomies.tags.Alphabetical }} + + {{- .Page.Title -}} + + {{ end }} + + Most recent + {{ end }} + + {{ $showAllPostsOnHomePage := false }} + {{ if (isset .Site.Params "showallpostsonhomepage") }} + {{ $showAllPostsOnHomePage = .Site.Params.ShowAllPostsOnHomePage }} + {{ end }} + {{ $dataFormat := .Site.Params.dateFormat | default "2006-01-02" }} + {{ $mainPosts := (sort ( where site.RegularPages "Type" "in" site.Params.mainSections ) "Date" "desc") }} + {{ if $showAllPostsOnHomePage }} + + + {{ partial "pagination.html" . }} + + {{ else }} + + {{ end }} +
+ + {{ $showProjectsList := false }} + {{ if (isset .Site.Params "showprojectslist") }} + {{ $showProjectsList = .Site.Params.showProjectsList }} + {{ else if .Site.Data.projects }} + {{ $showProjectsList = true }} + {{ end }} + {{ if $showProjectsList }} + {{ $projectsUrl := "#" }} + {{ if isset .Site.Params "projectsurl" }} + {{ $projectsUrl = .Site.Params.projectsUrl }} + {{ end }} +
+ Projects +
    + {{ range .Site.Data.projects.list }} +
  • + {{ .name }}: {{ .desc | markdownify }} +
  • + {{ end }} +
+
+ {{ end }} +{{ end }} diff --git a/themes/cactus/layouts/partials/comments.html b/themes/cactus/layouts/partials/comments.html new file mode 100644 index 0000000..b17721e --- /dev/null +++ b/themes/cactus/layouts/partials/comments.html @@ -0,0 +1,22 @@ +{{ if (not (isset .Site.Params "comments")) }} + {{ .Scratch.Set "enable_comments" false }} +{{ else if (isset .Params "comments") }} + {{ .Scratch.Set "enable_comments" .Params.comments }} +{{ else if (isset .Site.Params.Comments "enabled") }} + {{ .Scratch.Set "enable_comments" .Site.Params.Comments.Enabled }} +{{ else }} + {{ .Scratch.Set "enable_comments" true }} +{{ end }} + +{{ $enable_comments := .Scratch.Get "enable_comments" }} +{{ if $enable_comments }} +
+ {{ if (or (not (isset .Site.Params.Comments "engine")) (eq .Site.Params.Comments.Engine "disqus")) }} + {{ partial "comments/disqus.html" . }} + {{ else if eq .Site.Params.Comments.Engine "utterances" }} + {{ partial "comments/utterances.html" . }} + {{ else if eq .Site.Params.Comments.Engine "cactus_comments" }} + {{ partial "comments/cactus_comments.html" . }} + {{ end }} +
+{{ end }} diff --git a/themes/cactus/layouts/partials/comments/cactus_comments.html b/themes/cactus/layouts/partials/comments/cactus_comments.html new file mode 100644 index 0000000..7873bbb --- /dev/null +++ b/themes/cactus/layouts/partials/comments/cactus_comments.html @@ -0,0 +1,11 @@ +
+ +
diff --git a/themes/cactus/layouts/partials/comments/disqus.html b/themes/cactus/layouts/partials/comments/disqus.html new file mode 100644 index 0000000..8acd459 --- /dev/null +++ b/themes/cactus/layouts/partials/comments/disqus.html @@ -0,0 +1,17 @@ +
+ + + comments powered by Disqus +
diff --git a/themes/cactus/layouts/partials/comments/utterances.html b/themes/cactus/layouts/partials/comments/utterances.html new file mode 100644 index 0000000..205617a --- /dev/null +++ b/themes/cactus/layouts/partials/comments/utterances.html @@ -0,0 +1,10 @@ +
+ +
diff --git a/themes/cactus/layouts/partials/favicon.html b/themes/cactus/layouts/partials/favicon.html new file mode 100644 index 0000000..5b4c0b3 --- /dev/null +++ b/themes/cactus/layouts/partials/favicon.html @@ -0,0 +1,2 @@ + + diff --git a/themes/cactus/layouts/partials/footer.html b/themes/cactus/layouts/partials/footer.html new file mode 100644 index 0000000..31eb4aa --- /dev/null +++ b/themes/cactus/layouts/partials/footer.html @@ -0,0 +1,14 @@ +
+ + +
diff --git a/themes/cactus/layouts/partials/head.html b/themes/cactus/layouts/partials/head.html new file mode 100644 index 0000000..b46ee84 --- /dev/null +++ b/themes/cactus/layouts/partials/head.html @@ -0,0 +1,45 @@ + + + + + + {{ if eq .Site.Params.Comments.enabled true }} + + + {{ end }} + + + {{ if .IsPage }} {{ .Title }} | {{ end }}{{ .Site.Title }} + + {{ with .Site.Params.description }}{{ end }} + + + + {{ template "_internal/opengraph.html" . }} + {{ template "_internal/twitter_cards.html" . }} + {{ .Scratch.Set "colortheme" "white"}} + {{ if .Site.Params.Colortheme }} + {{ .Scratch.Set "colortheme" .Site.Params.Colortheme }} + {{ end }} + {{ $colortheme := .Scratch.Get "colortheme" }} + + {{- $options := (dict "targetPath" "css/styles.css" "outputStyle" "compressed" "enableSourceMap" "true") -}} + {{- $styles := resources.Get "scss/style.scss" | resources.ExecuteAsTemplate "scss/style.scss" . | resources.ToCSS $options | resources.Fingerprint "sha512" }} + + + + {{ range .Site.Params.css }} {{ end }} + {{ ` + + ` | safeHTML }} + + {{ partial "favicon.html" . }} + {{ if .Site.Params.rss }} + {{ with .OutputFormats.Get "RSS" }} + {{ printf `` .Permalink .Rel .MediaType.Type $.Site.Title | safeHTML }} + {{ end }} + {{ end }} + diff --git a/themes/cactus/layouts/partials/header.html b/themes/cactus/layouts/partials/header.html new file mode 100644 index 0000000..3ecdb0b --- /dev/null +++ b/themes/cactus/layouts/partials/header.html @@ -0,0 +1,25 @@ + + diff --git a/themes/cactus/layouts/partials/optional-about.html b/themes/cactus/layouts/partials/optional-about.html new file mode 100644 index 0000000..e69de29 diff --git a/themes/cactus/layouts/partials/page_nav.html b/themes/cactus/layouts/partials/page_nav.html new file mode 100644 index 0000000..9ca1c2a --- /dev/null +++ b/themes/cactus/layouts/partials/page_nav.html @@ -0,0 +1,57 @@ +
+ + + + + +
    + {{ range .Site.Menus.main }} +
  • {{ .Name }}
  • + {{ end }} +
+
+
+ +
    + {{ if .Prev }} +
  • + + + +
  • + {{ end }} + {{ if .Next }} +
  • + + + +
  • + {{ end }} +
  • + + + +
  • +
  • + + + +
  • +
+ + + + +
+
+ + {{ if not .Site.Params.tocInline }} +
+ {{ .TableOfContents }} +
+ {{ end }} +
+
diff --git a/themes/cactus/layouts/partials/page_nav_mobile.html b/themes/cactus/layouts/partials/page_nav_mobile.html new file mode 100644 index 0000000..bf9decb --- /dev/null +++ b/themes/cactus/layouts/partials/page_nav_mobile.html @@ -0,0 +1,38 @@ +
+
+ + + + {{ if not .Site.Params.tocInline }} + + {{ end }} + + + + + +
+
diff --git a/themes/cactus/layouts/partials/pagination.html b/themes/cactus/layouts/partials/pagination.html new file mode 100644 index 0000000..fc2058f --- /dev/null +++ b/themes/cactus/layouts/partials/pagination.html @@ -0,0 +1,13 @@ +{{ $pag := $.Paginator }} +{{ if gt $pag.TotalPages 1 }} + +{{ end }} diff --git a/themes/cactus/layouts/partials/share.html b/themes/cactus/layouts/partials/share.html new file mode 100644 index 0000000..4aeadd7 --- /dev/null +++ b/themes/cactus/layouts/partials/share.html @@ -0,0 +1,54 @@ + diff --git a/themes/cactus/layouts/partials/title.html b/themes/cactus/layouts/partials/title.html new file mode 100644 index 0000000..e69de29 diff --git a/themes/cactus/layouts/posts/single.html b/themes/cactus/layouts/posts/single.html new file mode 100644 index 0000000..5df437a --- /dev/null +++ b/themes/cactus/layouts/posts/single.html @@ -0,0 +1,117 @@ + + +{{ partial "head.html" . }} + +
+ + {{ partial "page_nav.html" . }} + +
+
+

+ {{ .Title }} +

+
+ {{ if (or (isset .Site "author") (isset .Site "title"))}} + + {{ end }} + + {{ $showReadTime := .Site.Params.showReadTime | default false }} + {{if $showReadTime}} +
+ + {{ $readTime := math.Round (div (countwords .Content) 220.0) }} + {{ $readTime }} minute read +
+ {{ end }} + {{ if gt .Params.categories 0 }} + + {{ end }} + {{ if gt .Params.tags 0 }} + + {{ end }} +
+
+ + {{ with .Resources.ByType "image" }} +
+ {{ range $index, $value := . }} + + + + {{ end }} +
+ {{ end }} + {{ if .Site.Params.tocInline }} +
+ {{ .TableOfContents }} +
+ {{ end }} +
+ {{ .Content}} +
+
+ + {{ partial "comments.html" . }} + + {{ partial "page_nav_mobile.html" . }} + + {{ partial "footer.html" . }} + +
+ + + + + +{{ if not (isset site.Params "disablecopy") }} + +{{ end }} +{{ $mathjax := false }} +{{ if isset .Params "mathjax" }} + {{ $mathjax = .Params.mathjax }} +{{ else if isset .Site.Params "mathjax" }} + {{ $mathjax = .Site.Params.mathjax }} +{{ end }} +{{ if $mathjax }} + + +{{ end }} + diff --git a/themes/cactus/static/images/favicon.ico b/themes/cactus/static/images/favicon.ico new file mode 100644 index 0000000..84a85d3 Binary files /dev/null and b/themes/cactus/static/images/favicon.ico differ diff --git a/themes/cactus/static/images/logo.png b/themes/cactus/static/images/logo.png new file mode 100644 index 0000000..43a6ef0 Binary files /dev/null and b/themes/cactus/static/images/logo.png differ diff --git a/themes/cactus/static/js/code-copy.js b/themes/cactus/static/js/code-copy.js new file mode 100644 index 0000000..5a07bf8 --- /dev/null +++ b/themes/cactus/static/js/code-copy.js @@ -0,0 +1,36 @@ +(() => { + + function createCopyButton(codeNode) { + const copyBtn = document.createElement('button') + copyBtn.className = 'code-copy-btn' + copyBtn.type = 'button' + copyBtn.innerText = 'copy' + + let resetTimer + copyBtn.addEventListener('click', () => { + navigator.clipboard.writeText(codeNode.innerText).then(() => { + copyBtn.innerText = 'copied!' + }).then(() => { + clearTimeout(resetTimer) + resetTimer = setTimeout(() => { + copyBtn.innerText = 'copy' + }, 1000) + }) + }) + + return copyBtn + } + + document.querySelectorAll('pre > code') + .forEach((codeNode) => { + const copyBtn = createCopyButton(codeNode); + const preNode = codeNode.parentNode + codeNode.parentNode.insertBefore(copyBtn, codeNode) + }) + + document.querySelectorAll('.highlight table > tbody > tr > td:first-child .code-copy-btn') + .forEach((btn) => { + btn.remove() + }) + +})() \ No newline at end of file diff --git a/themes/cactus/static/js/feather.min.js b/themes/cactus/static/js/feather.min.js new file mode 100644 index 0000000..156cd61 --- /dev/null +++ b/themes/cactus/static/js/feather.min.js @@ -0,0 +1,13 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.feather=n():e.feather=n()}("undefined"!=typeof self?self:this,function(){return function(e){var n={};function i(t){if(n[t])return n[t].exports;var l=n[t]={i:t,l:!1,exports:{}};return e[t].call(l.exports,l,l.exports,i),l.l=!0,l.exports}return i.m=e,i.c=n,i.d=function(e,n,t){i.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},i.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},i.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(n,"a",n),n},i.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},i.p="",i(i.s=80)}([function(e,n,i){(function(n){var i="object",t=function(e){return e&&e.Math==Math&&e};e.exports=t(typeof globalThis==i&&globalThis)||t(typeof window==i&&window)||t(typeof self==i&&self)||t(typeof n==i&&n)||Function("return this")()}).call(this,i(75))},function(e,n){var i={}.hasOwnProperty;e.exports=function(e,n){return i.call(e,n)}},function(e,n,i){var t=i(0),l=i(11),r=i(33),o=i(62),a=t.Symbol,c=l("wks");e.exports=function(e){return c[e]||(c[e]=o&&a[e]||(o?a:r)("Symbol."+e))}},function(e,n,i){var t=i(6);e.exports=function(e){if(!t(e))throw TypeError(String(e)+" is not an object");return e}},function(e,n){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,n,i){var t=i(8),l=i(7),r=i(10);e.exports=t?function(e,n,i){return l.f(e,n,r(1,i))}:function(e,n,i){return e[n]=i,e}},function(e,n){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,n,i){var t=i(8),l=i(35),r=i(3),o=i(18),a=Object.defineProperty;n.f=t?a:function(e,n,i){if(r(e),n=o(n,!0),r(i),l)try{return a(e,n,i)}catch(e){}if("get"in i||"set"in i)throw TypeError("Accessors not supported");return"value"in i&&(e[n]=i.value),e}},function(e,n,i){var t=i(4);e.exports=!t(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,n){e.exports={}},function(e,n){e.exports=function(e,n){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:n}}},function(e,n,i){var t=i(0),l=i(19),r=i(17),o=t["__core-js_shared__"]||l("__core-js_shared__",{});(e.exports=function(e,n){return o[e]||(o[e]=void 0!==n?n:{})})("versions",[]).push({version:"3.1.3",mode:r?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=o(i(43)),l=o(i(41)),r=o(i(40));function o(e){return e&&e.__esModule?e:{default:e}}n.default=Object.keys(l.default).map(function(e){return new t.default(e,l.default[e],r.default[e])}).reduce(function(e,n){return e[n.name]=n,e},{})},function(e,n){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(e,n,i){var t=i(72),l=i(20);e.exports=function(e){return t(l(e))}},function(e,n){e.exports={}},function(e,n,i){var t=i(11),l=i(33),r=t("keys");e.exports=function(e){return r[e]||(r[e]=l(e))}},function(e,n){e.exports=!1},function(e,n,i){var t=i(6);e.exports=function(e,n){if(!t(e))return e;var i,l;if(n&&"function"==typeof(i=e.toString)&&!t(l=i.call(e)))return l;if("function"==typeof(i=e.valueOf)&&!t(l=i.call(e)))return l;if(!n&&"function"==typeof(i=e.toString)&&!t(l=i.call(e)))return l;throw TypeError("Can't convert object to primitive value")}},function(e,n,i){var t=i(0),l=i(5);e.exports=function(e,n){try{l(t,e,n)}catch(i){t[e]=n}return n}},function(e,n){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,n){var i=Math.ceil,t=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?t:i)(e)}},function(e,n,i){var t; +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +!function(){"use strict";var i=function(){function e(){}function n(e,n){for(var i=n.length,t=0;t0?l(t(e),9007199254740991):0}},function(e,n,i){var t=i(1),l=i(14),r=i(68),o=i(15),a=r(!1);e.exports=function(e,n){var i,r=l(e),c=0,p=[];for(i in r)!t(o,i)&&t(r,i)&&p.push(i);for(;n.length>c;)t(r,i=n[c++])&&(~a(p,i)||p.push(i));return p}},function(e,n,i){var t=i(0),l=i(11),r=i(5),o=i(1),a=i(19),c=i(36),p=i(37),y=p.get,h=p.enforce,x=String(c).split("toString");l("inspectSource",function(e){return c.call(e)}),(e.exports=function(e,n,i,l){var c=!!l&&!!l.unsafe,p=!!l&&!!l.enumerable,y=!!l&&!!l.noTargetGet;"function"==typeof i&&("string"!=typeof n||o(i,"name")||r(i,"name",n),h(i).source=x.join("string"==typeof n?n:"")),e!==t?(c?!y&&e[n]&&(p=!0):delete e[n],p?e[n]=i:r(e,n,i)):p?e[n]=i:a(n,i)})(Function.prototype,"toString",function(){return"function"==typeof this&&y(this).source||c.call(this)})},function(e,n){var i={}.toString;e.exports=function(e){return i.call(e).slice(8,-1)}},function(e,n,i){var t=i(8),l=i(73),r=i(10),o=i(14),a=i(18),c=i(1),p=i(35),y=Object.getOwnPropertyDescriptor;n.f=t?y:function(e,n){if(e=o(e),n=a(n,!0),p)try{return y(e,n)}catch(e){}if(c(e,n))return r(!l.f.call(e,n),e[n])}},function(e,n,i){var t=i(0),l=i(31).f,r=i(5),o=i(29),a=i(19),c=i(71),p=i(65);e.exports=function(e,n){var i,y,h,x,s,u=e.target,d=e.global,f=e.stat;if(i=d?t:f?t[u]||a(u,{}):(t[u]||{}).prototype)for(y in n){if(x=n[y],h=e.noTargetGet?(s=l(i,y))&&s.value:i[y],!p(d?y:u+(f?".":"#")+y,e.forced)&&void 0!==h){if(typeof x==typeof h)continue;c(x,h)}(e.sham||h&&h.sham)&&r(x,"sham",!0),o(i,y,x,e)}}},function(e,n){var i=0,t=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++i+t).toString(36))}},function(e,n,i){var t=i(0),l=i(6),r=t.document,o=l(r)&&l(r.createElement);e.exports=function(e){return o?r.createElement(e):{}}},function(e,n,i){var t=i(8),l=i(4),r=i(34);e.exports=!t&&!l(function(){return 7!=Object.defineProperty(r("div"),"a",{get:function(){return 7}}).a})},function(e,n,i){var t=i(11);e.exports=t("native-function-to-string",Function.toString)},function(e,n,i){var t,l,r,o=i(76),a=i(0),c=i(6),p=i(5),y=i(1),h=i(16),x=i(15),s=a.WeakMap;if(o){var u=new s,d=u.get,f=u.has,g=u.set;t=function(e,n){return g.call(u,e,n),n},l=function(e){return d.call(u,e)||{}},r=function(e){return f.call(u,e)}}else{var v=h("state");x[v]=!0,t=function(e,n){return p(e,v,n),n},l=function(e){return y(e,v)?e[v]:{}},r=function(e){return y(e,v)}}e.exports={set:t,get:l,has:r,enforce:function(e){return r(e)?l(e):t(e,{})},getterFor:function(e){return function(n){var i;if(!c(n)||(i=l(n)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return i}}}},function(e,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=Object.assign||function(e){for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{};if("undefined"==typeof document)throw new Error("`feather.replace()` only works in a browser environment.");var n=document.querySelectorAll("[data-feather]");Array.from(n).forEach(function(n){return function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=function(e){return Array.from(e.attributes).reduce(function(e,n){return e[n.name]=n.value,e},{})}(e),o=i["data-feather"];delete i["data-feather"];var a=r.default[o].toSvg(t({},n,i,{class:(0,l.default)(n.class,i.class)})),c=(new DOMParser).parseFromString(a,"image/svg+xml").querySelector("svg");e.parentNode.replaceChild(c,e)}(n,e)})}},function(e,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t,l=i(12),r=(t=l)&&t.__esModule?t:{default:t};n.default=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(console.warn("feather.toSvg() is deprecated. Please use feather.icons[name].toSvg() instead."),!e)throw new Error("The required `key` (icon name) parameter is missing.");if(!r.default[e])throw new Error("No icon matching '"+e+"'. See the complete list of icons at https://feathericons.com");return r.default[e].toSvg(n)}},function(e){e.exports={activity:["pulse","health","action","motion"],airplay:["stream","cast","mirroring"],"alert-circle":["warning","alert","danger"],"alert-octagon":["warning","alert","danger"],"alert-triangle":["warning","alert","danger"],"align-center":["text alignment","center"],"align-justify":["text alignment","justified"],"align-left":["text alignment","left"],"align-right":["text alignment","right"],anchor:[],archive:["index","box"],"at-sign":["mention","at","email","message"],award:["achievement","badge"],aperture:["camera","photo"],"bar-chart":["statistics","diagram","graph"],"bar-chart-2":["statistics","diagram","graph"],battery:["power","electricity"],"battery-charging":["power","electricity"],bell:["alarm","notification","sound"],"bell-off":["alarm","notification","silent"],bluetooth:["wireless"],"book-open":["read","library"],book:["read","dictionary","booklet","magazine","library"],bookmark:["read","clip","marker","tag"],box:["cube"],briefcase:["work","bag","baggage","folder"],calendar:["date"],camera:["photo"],cast:["chromecast","airplay"],circle:["off","zero","record"],clipboard:["copy"],clock:["time","watch","alarm"],"cloud-drizzle":["weather","shower"],"cloud-lightning":["weather","bolt"],"cloud-rain":["weather"],"cloud-snow":["weather","blizzard"],cloud:["weather"],codepen:["logo"],codesandbox:["logo"],code:["source","programming"],coffee:["drink","cup","mug","tea","cafe","hot","beverage"],columns:["layout"],command:["keyboard","cmd","terminal","prompt"],compass:["navigation","safari","travel","direction"],copy:["clone","duplicate"],"corner-down-left":["arrow","return"],"corner-down-right":["arrow"],"corner-left-down":["arrow"],"corner-left-up":["arrow"],"corner-right-down":["arrow"],"corner-right-up":["arrow"],"corner-up-left":["arrow"],"corner-up-right":["arrow"],cpu:["processor","technology"],"credit-card":["purchase","payment","cc"],crop:["photo","image"],crosshair:["aim","target"],database:["storage","memory"],delete:["remove"],disc:["album","cd","dvd","music"],"dollar-sign":["currency","money","payment"],droplet:["water"],edit:["pencil","change"],"edit-2":["pencil","change"],"edit-3":["pencil","change"],eye:["view","watch"],"eye-off":["view","watch","hide","hidden"],"external-link":["outbound"],facebook:["logo","social"],"fast-forward":["music"],figma:["logo","design","tool"],"file-minus":["delete","remove","erase"],"file-plus":["add","create","new"],"file-text":["data","txt","pdf"],film:["movie","video"],filter:["funnel","hopper"],flag:["report"],"folder-minus":["directory"],"folder-plus":["directory"],folder:["directory"],framer:["logo","design","tool"],frown:["emoji","face","bad","sad","emotion"],gift:["present","box","birthday","party"],"git-branch":["code","version control"],"git-commit":["code","version control"],"git-merge":["code","version control"],"git-pull-request":["code","version control"],github:["logo","version control"],gitlab:["logo","version control"],globe:["world","browser","language","translate"],"hard-drive":["computer","server","memory","data"],hash:["hashtag","number","pound"],headphones:["music","audio","sound"],heart:["like","love","emotion"],"help-circle":["question mark"],hexagon:["shape","node.js","logo"],home:["house","living"],image:["picture"],inbox:["email"],instagram:["logo","camera"],key:["password","login","authentication","secure"],layers:["stack"],layout:["window","webpage"],"life-bouy":["help","life ring","support"],link:["chain","url"],"link-2":["chain","url"],linkedin:["logo","social media"],list:["options"],lock:["security","password","secure"],"log-in":["sign in","arrow","enter"],"log-out":["sign out","arrow","exit"],mail:["email","message"],"map-pin":["location","navigation","travel","marker"],map:["location","navigation","travel"],maximize:["fullscreen"],"maximize-2":["fullscreen","arrows","expand"],meh:["emoji","face","neutral","emotion"],menu:["bars","navigation","hamburger"],"message-circle":["comment","chat"],"message-square":["comment","chat"],"mic-off":["record","sound","mute"],mic:["record","sound","listen"],minimize:["exit fullscreen","close"],"minimize-2":["exit fullscreen","arrows","close"],minus:["subtract"],monitor:["tv","screen","display"],moon:["dark","night"],"more-horizontal":["ellipsis"],"more-vertical":["ellipsis"],"mouse-pointer":["arrow","cursor"],move:["arrows"],music:["note"],navigation:["location","travel"],"navigation-2":["location","travel"],octagon:["stop"],package:["box","container"],paperclip:["attachment"],pause:["music","stop"],"pause-circle":["music","audio","stop"],"pen-tool":["vector","drawing"],percent:["discount"],"phone-call":["ring"],"phone-forwarded":["call"],"phone-incoming":["call"],"phone-missed":["call"],"phone-off":["call","mute"],"phone-outgoing":["call"],phone:["call"],play:["music","start"],"pie-chart":["statistics","diagram"],"play-circle":["music","start"],plus:["add","new"],"plus-circle":["add","new"],"plus-square":["add","new"],pocket:["logo","save"],power:["on","off"],printer:["fax","office","device"],radio:["signal"],"refresh-cw":["synchronise","arrows"],"refresh-ccw":["arrows"],repeat:["loop","arrows"],rewind:["music"],"rotate-ccw":["arrow"],"rotate-cw":["arrow"],rss:["feed","subscribe"],save:["floppy disk"],scissors:["cut"],search:["find","magnifier","magnifying glass"],send:["message","mail","email","paper airplane","paper aeroplane"],settings:["cog","edit","gear","preferences"],"share-2":["network","connections"],shield:["security","secure"],"shield-off":["security","insecure"],"shopping-bag":["ecommerce","cart","purchase","store"],"shopping-cart":["ecommerce","cart","purchase","store"],shuffle:["music"],"skip-back":["music"],"skip-forward":["music"],slack:["logo"],slash:["ban","no"],sliders:["settings","controls"],smartphone:["cellphone","device"],smile:["emoji","face","happy","good","emotion"],speaker:["audio","music"],star:["bookmark","favorite","like"],"stop-circle":["media","music"],sun:["brightness","weather","light"],sunrise:["weather","time","morning","day"],sunset:["weather","time","evening","night"],tablet:["device"],tag:["label"],target:["logo","bullseye"],terminal:["code","command line","prompt"],thermometer:["temperature","celsius","fahrenheit","weather"],"thumbs-down":["dislike","bad","emotion"],"thumbs-up":["like","good","emotion"],"toggle-left":["on","off","switch"],"toggle-right":["on","off","switch"],tool:["settings","spanner"],trash:["garbage","delete","remove","bin"],"trash-2":["garbage","delete","remove","bin"],triangle:["delta"],truck:["delivery","van","shipping","transport","lorry"],tv:["television","stream"],twitch:["logo"],twitter:["logo","social"],type:["text"],umbrella:["rain","weather"],unlock:["security"],"user-check":["followed","subscribed"],"user-minus":["delete","remove","unfollow","unsubscribe"],"user-plus":["new","add","create","follow","subscribe"],"user-x":["delete","remove","unfollow","unsubscribe","unavailable"],user:["person","account"],users:["group"],"video-off":["camera","movie","film"],video:["camera","movie","film"],voicemail:["phone"],volume:["music","sound","mute"],"volume-1":["music","sound"],"volume-2":["music","sound"],"volume-x":["music","sound","mute"],watch:["clock","time"],"wifi-off":["disabled"],wifi:["connection","signal","wireless"],wind:["weather","air"],"x-circle":["cancel","close","delete","remove","times","clear"],"x-octagon":["delete","stop","alert","warning","times","clear"],"x-square":["cancel","close","delete","remove","times","clear"],x:["cancel","close","delete","remove","times","clear"],youtube:["logo","video","play"],"zap-off":["flash","camera","lightning"],zap:["flash","camera","lightning"],"zoom-in":["magnifying glass"],"zoom-out":["magnifying glass"]}},function(e){e.exports={activity:'',airplay:'',"alert-circle":'',"alert-octagon":'',"alert-triangle":'',"align-center":'',"align-justify":'',"align-left":'',"align-right":'',anchor:'',aperture:'',archive:'',"arrow-down-circle":'',"arrow-down-left":'',"arrow-down-right":'',"arrow-down":'',"arrow-left-circle":'',"arrow-left":'',"arrow-right-circle":'',"arrow-right":'',"arrow-up-circle":'',"arrow-up-left":'',"arrow-up-right":'',"arrow-up":'',"at-sign":'',award:'',"bar-chart-2":'',"bar-chart":'',"battery-charging":'',battery:'',"bell-off":'',bell:'',bluetooth:'',bold:'',"book-open":'',book:'',bookmark:'',box:'',briefcase:'',calendar:'',"camera-off":'',camera:'',cast:'',"check-circle":'',"check-square":'',check:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',"chevrons-down":'',"chevrons-left":'',"chevrons-right":'',"chevrons-up":'',chrome:'',circle:'',clipboard:'',clock:'',"cloud-drizzle":'',"cloud-lightning":'',"cloud-off":'',"cloud-rain":'',"cloud-snow":'',cloud:'',code:'',codepen:'',codesandbox:'',coffee:'',columns:'',command:'',compass:'',copy:'',"corner-down-left":'',"corner-down-right":'',"corner-left-down":'',"corner-left-up":'',"corner-right-down":'',"corner-right-up":'',"corner-up-left":'',"corner-up-right":'',cpu:'',"credit-card":'',crop:'',crosshair:'',database:'',delete:'',disc:'',"divide-circle":'',"divide-square":'',divide:'',"dollar-sign":'',"download-cloud":'',download:'',dribbble:'',droplet:'',"edit-2":'',"edit-3":'',edit:'',"external-link":'',"eye-off":'',eye:'',facebook:'',"fast-forward":'',feather:'',figma:'',"file-minus":'',"file-plus":'',"file-text":'',file:'',film:'',filter:'',flag:'',"folder-minus":'',"folder-plus":'',folder:'',framer:'',frown:'',gift:'',"git-branch":'',"git-commit":'',"git-merge":'',"git-pull-request":'',github:'',gitlab:'',globe:'',grid:'',"hard-drive":'',hash:'',headphones:'',heart:'',"help-circle":'',hexagon:'',home:'',image:'',inbox:'',info:'',instagram:'',italic:'',key:'',layers:'',layout:'',"life-buoy":'',"link-2":'',link:'',linkedin:'',list:'',loader:'',lock:'',"log-in":'',"log-out":'',mail:'',"map-pin":'',map:'',"maximize-2":'',maximize:'',meh:'',menu:'',"message-circle":'',"message-square":'',"mic-off":'',mic:'',"minimize-2":'',minimize:'',"minus-circle":'',"minus-square":'',minus:'',monitor:'',moon:'',"more-horizontal":'',"more-vertical":'',"mouse-pointer":'',move:'',music:'',"navigation-2":'',navigation:'',octagon:'',package:'',paperclip:'',"pause-circle":'',pause:'',"pen-tool":'',percent:'',"phone-call":'',"phone-forwarded":'',"phone-incoming":'',"phone-missed":'',"phone-off":'',"phone-outgoing":'',phone:'',"pie-chart":'',"play-circle":'',play:'',"plus-circle":'',"plus-square":'',plus:'',pocket:'',power:'',printer:'',radio:'',"refresh-ccw":'',"refresh-cw":'',repeat:'',rewind:'',"rotate-ccw":'',"rotate-cw":'',rss:'',save:'',scissors:'',search:'',send:'',server:'',settings:'',"share-2":'',share:'',"shield-off":'',shield:'',"shopping-bag":'',"shopping-cart":'',shuffle:'',sidebar:'',"skip-back":'',"skip-forward":'',slack:'',slash:'',sliders:'',smartphone:'',smile:'',speaker:'',square:'',star:'',"stop-circle":'',sun:'',sunrise:'',sunset:'',tablet:'',tag:'',target:'',terminal:'',thermometer:'',"thumbs-down":'',"thumbs-up":'',"toggle-left":'',"toggle-right":'',tool:'',"trash-2":'',trash:'',trello:'',"trending-down":'',"trending-up":'',triangle:'',truck:'',tv:'',twitch:'',twitter:'',type:'',umbrella:'',underline:'',unlock:'',"upload-cloud":'',upload:'',"user-check":'',"user-minus":'',"user-plus":'',"user-x":'',user:'',users:'',"video-off":'',video:'',voicemail:'',"volume-1":'',"volume-2":'',"volume-x":'',volume:'',watch:'',"wifi-off":'',wifi:'',wind:'',"x-circle":'',"x-octagon":'',"x-square":'',x:'',youtube:'',"zap-off":'',zap:'',"zoom-in":'',"zoom-out":''}},function(e){e.exports={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"}},function(e,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=Object.assign||function(e){for(var n=1;n2&&void 0!==arguments[2]?arguments[2]:[];!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),this.name=n,this.contents=i,this.tags=l,this.attrs=t({},o.default,{class:"feather feather-"+n})}return l(e,[{key:"toSvg",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return""+this.contents+""}},{key:"toString",value:function(){return this.contents}}]),e}();n.default=c},function(e,n,i){"use strict";var t=o(i(12)),l=o(i(39)),r=o(i(38));function o(e){return e&&e.__esModule?e:{default:e}}e.exports={icons:t.default,toSvg:l.default,replace:r.default}},function(e,n,i){e.exports=i(0)},function(e,n,i){var t=i(2)("iterator"),l=!1;try{var r=0,o={next:function(){return{done:!!r++}},return:function(){l=!0}};o[t]=function(){return this},Array.from(o,function(){throw 2})}catch(e){}e.exports=function(e,n){if(!n&&!l)return!1;var i=!1;try{var r={};r[t]=function(){return{next:function(){return{done:i=!0}}}},e(r)}catch(e){}return i}},function(e,n,i){var t=i(30),l=i(2)("toStringTag"),r="Arguments"==t(function(){return arguments}());e.exports=function(e){var n,i,o;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(i=function(e,n){try{return e[n]}catch(e){}}(n=Object(e),l))?i:r?t(n):"Object"==(o=t(n))&&"function"==typeof n.callee?"Arguments":o}},function(e,n,i){var t=i(47),l=i(9),r=i(2)("iterator");e.exports=function(e){if(void 0!=e)return e[r]||e["@@iterator"]||l[t(e)]}},function(e,n,i){"use strict";var t=i(18),l=i(7),r=i(10);e.exports=function(e,n,i){var o=t(n);o in e?l.f(e,o,r(0,i)):e[o]=i}},function(e,n,i){var t=i(2),l=i(9),r=t("iterator"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(l.Array===e||o[r]===e)}},function(e,n,i){var t=i(3);e.exports=function(e,n,i,l){try{return l?n(t(i)[0],i[1]):n(i)}catch(n){var r=e.return;throw void 0!==r&&t(r.call(e)),n}}},function(e,n){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},function(e,n,i){var t=i(52);e.exports=function(e,n,i){if(t(e),void 0===n)return e;switch(i){case 0:return function(){return e.call(n)};case 1:return function(i){return e.call(n,i)};case 2:return function(i,t){return e.call(n,i,t)};case 3:return function(i,t,l){return e.call(n,i,t,l)}}return function(){return e.apply(n,arguments)}}},function(e,n,i){"use strict";var t=i(53),l=i(24),r=i(51),o=i(50),a=i(27),c=i(49),p=i(48);e.exports=function(e){var n,i,y,h,x=l(e),s="function"==typeof this?this:Array,u=arguments.length,d=u>1?arguments[1]:void 0,f=void 0!==d,g=0,v=p(x);if(f&&(d=t(d,u>2?arguments[2]:void 0,2)),void 0==v||s==Array&&o(v))for(i=new s(n=a(x.length));n>g;g++)c(i,g,f?d(x[g],g):x[g]);else for(h=v.call(x),i=new s;!(y=h.next()).done;g++)c(i,g,f?r(h,d,[y.value,g],!0):y.value);return i.length=g,i}},function(e,n,i){var t=i(32),l=i(54);t({target:"Array",stat:!0,forced:!i(46)(function(e){Array.from(e)})},{from:l})},function(e,n,i){var t=i(6),l=i(3);e.exports=function(e,n){if(l(e),!t(n)&&null!==n)throw TypeError("Can't set "+String(n)+" as a prototype")}},function(e,n,i){var t=i(56);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,n=!1,i={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(i,[]),n=i instanceof Array}catch(e){}return function(i,l){return t(i,l),n?e.call(i,l):i.__proto__=l,i}}():void 0)},function(e,n,i){var t=i(0).document;e.exports=t&&t.documentElement},function(e,n,i){var t=i(28),l=i(13);e.exports=Object.keys||function(e){return t(e,l)}},function(e,n,i){var t=i(8),l=i(7),r=i(3),o=i(59);e.exports=t?Object.defineProperties:function(e,n){r(e);for(var i,t=o(n),a=t.length,c=0;a>c;)l.f(e,i=t[c++],n[i]);return e}},function(e,n,i){var t=i(3),l=i(60),r=i(13),o=i(15),a=i(58),c=i(34),p=i(16)("IE_PROTO"),y=function(){},h=function(){var e,n=c("iframe"),i=r.length;for(n.style.display="none",a.appendChild(n),n.src=String("javascript:"),(e=n.contentWindow.document).open(),e.write("