├── index.html
├── assets
├── css
│ ├── main.scss
│ └── bootstrap-iso.less
├── favicon.ico
├── img
│ ├── lineart.png
│ ├── triangle.png
│ ├── screenshot.png
│ ├── portfolio
│ │ ├── toh.png
│ │ ├── ttt.png
│ │ ├── cabin.png
│ │ ├── cake.png
│ │ ├── game.png
│ │ ├── ninja.png
│ │ ├── safe.png
│ │ ├── circus.png
│ │ ├── github.png
│ │ ├── submarine.png
│ │ └── jekyllblog2.png
│ ├── mermaid-example.png
│ ├── pexels
│ │ ├── travel.jpeg
│ │ ├── book-glass.jpeg
│ │ ├── computer.jpeg
│ │ └── search-map.jpeg
│ ├── feature-img
│ │ ├── story.jpeg
│ │ ├── circuit.jpeg
│ │ └── desk-messy.jpeg
│ ├── header
│ │ ├── triangular.jpeg
│ │ ├── triangular-medium.jpeg
│ │ └── triangular-small.jpeg
│ ├── thumbnails
│ │ └── feature-img
│ │ │ ├── story.jpeg
│ │ │ ├── circuit.jpeg
│ │ │ └── desk-messy.jpeg
│ └── triangle.svg
├── fonts
│ ├── Pacifico
│ │ ├── Pacifico.eot
│ │ ├── Pacifico.ttf
│ │ ├── Pacifico.woff
│ │ ├── Pacifico.woff2
│ │ └── original-pacifico-regular.ttf
│ ├── katex
│ │ ├── KaTeX_Main-Bold.ttf
│ │ ├── KaTeX_AMS-Regular.ttf
│ │ ├── KaTeX_Main-Bold.woff
│ │ ├── KaTeX_Main-Bold.woff2
│ │ ├── KaTeX_Main-Italic.ttf
│ │ ├── KaTeX_Math-Italic.ttf
│ │ ├── KaTeX_AMS-Regular.woff
│ │ ├── KaTeX_AMS-Regular.woff2
│ │ ├── KaTeX_Fraktur-Bold.ttf
│ │ ├── KaTeX_Fraktur-Bold.woff
│ │ ├── KaTeX_Fraktur-Bold.woff2
│ │ ├── KaTeX_Main-Italic.woff
│ │ ├── KaTeX_Main-Italic.woff2
│ │ ├── KaTeX_Main-Regular.ttf
│ │ ├── KaTeX_Main-Regular.woff
│ │ ├── KaTeX_Main-Regular.woff2
│ │ ├── KaTeX_Math-Italic.woff
│ │ ├── KaTeX_Math-Italic.woff2
│ │ ├── KaTeX_SansSerif-Bold.ttf
│ │ ├── KaTeX_Script-Regular.ttf
│ │ ├── KaTeX_Size1-Regular.ttf
│ │ ├── KaTeX_Size1-Regular.woff
│ │ ├── KaTeX_Size2-Regular.ttf
│ │ ├── KaTeX_Size2-Regular.woff
│ │ ├── KaTeX_Size3-Regular.ttf
│ │ ├── KaTeX_Size3-Regular.woff
│ │ ├── KaTeX_Size4-Regular.ttf
│ │ ├── KaTeX_Size4-Regular.woff
│ │ ├── KaTeX_Caligraphic-Bold.ttf
│ │ ├── KaTeX_Fraktur-Regular.ttf
│ │ ├── KaTeX_Fraktur-Regular.woff
│ │ ├── KaTeX_Main-BoldItalic.ttf
│ │ ├── KaTeX_Main-BoldItalic.woff
│ │ ├── KaTeX_Math-BoldItalic.ttf
│ │ ├── KaTeX_Math-BoldItalic.woff
│ │ ├── KaTeX_SansSerif-Bold.woff
│ │ ├── KaTeX_SansSerif-Bold.woff2
│ │ ├── KaTeX_SansSerif-Italic.ttf
│ │ ├── KaTeX_Script-Regular.woff
│ │ ├── KaTeX_Script-Regular.woff2
│ │ ├── KaTeX_Size1-Regular.woff2
│ │ ├── KaTeX_Size2-Regular.woff2
│ │ ├── KaTeX_Size3-Regular.woff2
│ │ ├── KaTeX_Size4-Regular.woff2
│ │ ├── KaTeX_Caligraphic-Bold.woff
│ │ ├── KaTeX_Caligraphic-Bold.woff2
│ │ ├── KaTeX_Caligraphic-Regular.ttf
│ │ ├── KaTeX_Fraktur-Regular.woff2
│ │ ├── KaTeX_Main-BoldItalic.woff2
│ │ ├── KaTeX_Math-BoldItalic.woff2
│ │ ├── KaTeX_SansSerif-Italic.woff
│ │ ├── KaTeX_SansSerif-Italic.woff2
│ │ ├── KaTeX_SansSerif-Regular.ttf
│ │ ├── KaTeX_SansSerif-Regular.woff
│ │ ├── KaTeX_SansSerif-Regular.woff2
│ │ ├── KaTeX_Typewriter-Regular.ttf
│ │ ├── KaTeX_Typewriter-Regular.woff
│ │ ├── KaTeX_Caligraphic-Regular.woff
│ │ ├── KaTeX_Caligraphic-Regular.woff2
│ │ └── KaTeX_Typewriter-Regular.woff2
│ ├── font-awesome
│ │ ├── fa-brands-400.ttf
│ │ ├── fa-solid-900.ttf
│ │ ├── fa-brands-400.woff2
│ │ ├── fa-regular-400.ttf
│ │ ├── fa-solid-900.woff2
│ │ ├── fa-regular-400.woff2
│ │ ├── fa-v4compatibility.ttf
│ │ └── fa-v4compatibility.woff2
│ └── source-sans-pro
│ │ ├── source-sans-pro-bold.woff2
│ │ ├── source-sans-pro-italic.woff2
│ │ ├── source-sans-pro-regular.woff2
│ │ └── source-sans-pro-bold-italic.woff2
├── data
│ └── search.liquid
├── Dockerfile
├── js
│ ├── partials
│ │ ├── masonry_init.js
│ │ ├── navbar.js
│ │ ├── cookie_consent_init.js
│ │ └── dark-mode.js
│ ├── comments-lazy-load.min.js
│ ├── main.min.js
│ └── vendor
│ │ └── katex.auto-render.min.js
└── package.json
├── .github
├── workflows
│ ├── ruby-2.7.4
│ │ └── Gemfile
│ ├── labeler.yml
│ ├── build.yml
│ ├── release-drafter.yml
│ ├── docker-build.yml
│ ├── gem-github-page.yml
│ ├── gem-build.yml
│ ├── publish-build.yml
│ ├── vendor-testing.yml
│ └── e2e-tests.yml
├── labeler.yml
├── dependabot.yaml
├── hooks
│ ├── README.md
│ └── pre-commit
├── PULL_REQUEST_TEMPLATE.md
├── Docs.md
├── release-drafter.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ └── feature_request.md
├── stale.yml
├── tests
│ ├── jest.config.js
│ ├── package.json
│ ├── e2e
│ │ └── helpers.js
│ ├── unit
│ │ └── fixtures
│ │ │ └── comment-containers.js
│ └── playwright.config.js
├── config.yml
├── scripts
│ ├── validate-jekyll-search.sh
│ ├── validate-masonry.sh
│ ├── validate-imagesloaded.sh
│ ├── validate-vendor.sh
│ ├── validate-mermaid.sh
│ └── validate-katex.sh
└── .travis.yml
├── pages
├── tags.md
├── categories.md
├── archive.md
├── 404.md
├── search.md
├── portfolio.md
├── gallery.md
└── about.md
├── _sass
├── external
│ ├── font-awesome
│ │ ├── _fixed-width.scss
│ │ ├── _sizing.scss
│ │ ├── v4-shims.scss
│ │ ├── _screen-reader.scss
│ │ ├── _icons.scss
│ │ ├── _list.scss
│ │ ├── fontawesome.scss
│ │ ├── _rotated-flipped.scss
│ │ ├── _stacked.scss
│ │ ├── _bordered-pulled.scss
│ │ ├── solid.scss
│ │ ├── regular.scss
│ │ ├── brands.scss
│ │ ├── _core.scss
│ │ ├── _functions.scss
│ │ └── _mixins.scss
│ ├── _katex.scss
│ ├── _font-awesome.scss
│ ├── _pacifico.scss
│ └── _source-sans-pro.scss
├── layouts
│ ├── _page.scss
│ ├── _tags.scss
│ ├── _search.scss
│ ├── _blog.scss
│ └── _categories.scss
├── includes
│ ├── _post_nav.scss
│ ├── _footer.scss
│ ├── _aligner.scss
│ ├── _share_buttons.scss
│ ├── _gallery.scss
│ ├── _blog_nav.scss
│ ├── _portfolio.scss
│ └── _navbar.scss
├── type-on-strap.scss
└── base
│ └── _utility.scss
├── _includes
├── citation.html
├── social
│ ├── disqus.liquid
│ ├── cusdis.liquid
│ ├── utterances.liquid
│ ├── icons.liquid
│ └── giscus.liquid
├── default
│ ├── tags_list.liquid
│ ├── category_list.liquid
│ ├── footer.liquid
│ ├── navbar.liquid
│ └── search_json.liquid
├── blog
│ ├── post_nav.liquid
│ ├── post_info.liquid
│ ├── blog.liquid
│ ├── blog_nav.liquid
│ └── post_footer.liquid
├── portfolio.html
├── aligner.html
└── gallery.html
├── _data
├── biblio.yml
├── menu.yml
├── social.yml
├── authors.yml
├── icons.yml
├── language.yml
├── comments.yml
└── icons_builder.yml
├── _posts
├── 2013-10-18-blogging-with-title.md
├── 2014-11-27-whats-your-title.md
├── 2019-05-18-color-post.md
├── 2021-04-27-dark-mode.md
├── 2018-10-29-feature-images.md
├── 2014-11-28-markdown-and-html.md
├── 2014-08-08-Markup-Syntax-Highlighting.md
└── 2019-06-30-sample-post.md
├── Gemfile
├── _layouts
├── default.html
├── search.liquid
├── home.liquid
├── custom.liquid
├── archive.liquid
├── page.liquid
├── post.liquid
└── tags.liquid
├── .gitignore
├── _portfolio
├── jekyllblog.md
├── ninja.md
├── circus.md
├── gitlecture.md
├── hanoi.md
├── tictactoe.md
├── submarine.md
├── cake.md
└── safe.md
├── LICENSE
├── type-on-strap.gemspec
├── .gitpod.yml
└── _config.yml
/index.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: home
3 | ---
4 |
--------------------------------------------------------------------------------
/assets/css/main.scss:
--------------------------------------------------------------------------------
1 | ---
2 | ---
3 |
4 | @import "type-on-strap";
5 |
--------------------------------------------------------------------------------
/.github/workflows/ruby-2.7.4/Gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 | gem 'github-pages'
3 |
--------------------------------------------------------------------------------
/assets/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/favicon.ico
--------------------------------------------------------------------------------
/assets/img/lineart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/lineart.png
--------------------------------------------------------------------------------
/assets/img/triangle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/triangle.png
--------------------------------------------------------------------------------
/assets/img/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/screenshot.png
--------------------------------------------------------------------------------
/assets/img/portfolio/toh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/portfolio/toh.png
--------------------------------------------------------------------------------
/assets/img/portfolio/ttt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/portfolio/ttt.png
--------------------------------------------------------------------------------
/assets/img/mermaid-example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/mermaid-example.png
--------------------------------------------------------------------------------
/assets/img/pexels/travel.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/pexels/travel.jpeg
--------------------------------------------------------------------------------
/assets/img/portfolio/cabin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/portfolio/cabin.png
--------------------------------------------------------------------------------
/assets/img/portfolio/cake.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/portfolio/cake.png
--------------------------------------------------------------------------------
/assets/img/portfolio/game.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/portfolio/game.png
--------------------------------------------------------------------------------
/assets/img/portfolio/ninja.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/portfolio/ninja.png
--------------------------------------------------------------------------------
/assets/img/portfolio/safe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/portfolio/safe.png
--------------------------------------------------------------------------------
/assets/img/feature-img/story.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/feature-img/story.jpeg
--------------------------------------------------------------------------------
/assets/img/header/triangular.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/header/triangular.jpeg
--------------------------------------------------------------------------------
/assets/img/pexels/book-glass.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/pexels/book-glass.jpeg
--------------------------------------------------------------------------------
/assets/img/pexels/computer.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/pexels/computer.jpeg
--------------------------------------------------------------------------------
/assets/img/pexels/search-map.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/pexels/search-map.jpeg
--------------------------------------------------------------------------------
/assets/img/portfolio/circus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/portfolio/circus.png
--------------------------------------------------------------------------------
/assets/img/portfolio/github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/portfolio/github.png
--------------------------------------------------------------------------------
/assets/fonts/Pacifico/Pacifico.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/Pacifico/Pacifico.eot
--------------------------------------------------------------------------------
/assets/fonts/Pacifico/Pacifico.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/Pacifico/Pacifico.ttf
--------------------------------------------------------------------------------
/assets/fonts/Pacifico/Pacifico.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/Pacifico/Pacifico.woff
--------------------------------------------------------------------------------
/assets/img/feature-img/circuit.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/feature-img/circuit.jpeg
--------------------------------------------------------------------------------
/assets/img/portfolio/submarine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/portfolio/submarine.png
--------------------------------------------------------------------------------
/pages/tags.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tags
3 | title: Tags
4 | permalink: /tags/
5 | icon: "fa-tags"
6 | position: 5
7 | ---
8 |
9 |
--------------------------------------------------------------------------------
/assets/fonts/Pacifico/Pacifico.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/Pacifico/Pacifico.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Main-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Main-Bold.ttf
--------------------------------------------------------------------------------
/assets/img/feature-img/desk-messy.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/feature-img/desk-messy.jpeg
--------------------------------------------------------------------------------
/assets/img/portfolio/jekyllblog2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/portfolio/jekyllblog2.png
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_AMS-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_AMS-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Main-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Main-Bold.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Main-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Main-Bold.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Main-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Main-Italic.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Math-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Math-Italic.ttf
--------------------------------------------------------------------------------
/assets/img/header/triangular-medium.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/header/triangular-medium.jpeg
--------------------------------------------------------------------------------
/assets/img/header/triangular-small.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/header/triangular-small.jpeg
--------------------------------------------------------------------------------
/assets/fonts/font-awesome/fa-brands-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/font-awesome/fa-brands-400.ttf
--------------------------------------------------------------------------------
/assets/fonts/font-awesome/fa-solid-900.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/font-awesome/fa-solid-900.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_AMS-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_AMS-Regular.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_AMS-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_AMS-Regular.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Fraktur-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Fraktur-Bold.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Fraktur-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Fraktur-Bold.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Fraktur-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Fraktur-Bold.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Main-Italic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Main-Italic.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Main-Italic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Main-Italic.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Main-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Main-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Main-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Main-Regular.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Main-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Main-Regular.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Math-Italic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Math-Italic.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Math-Italic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Math-Italic.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_SansSerif-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_SansSerif-Bold.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Script-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Script-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Size1-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Size1-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Size1-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Size1-Regular.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Size2-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Size2-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Size2-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Size2-Regular.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Size3-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Size3-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Size3-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Size3-Regular.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Size4-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Size4-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Size4-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Size4-Regular.woff
--------------------------------------------------------------------------------
/assets/fonts/font-awesome/fa-brands-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/font-awesome/fa-brands-400.woff2
--------------------------------------------------------------------------------
/assets/fonts/font-awesome/fa-regular-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/font-awesome/fa-regular-400.ttf
--------------------------------------------------------------------------------
/assets/fonts/font-awesome/fa-solid-900.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/font-awesome/fa-solid-900.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Caligraphic-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Caligraphic-Bold.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Fraktur-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Fraktur-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Fraktur-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Fraktur-Regular.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Main-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Main-BoldItalic.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Main-BoldItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Main-BoldItalic.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Math-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Math-BoldItalic.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Math-BoldItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Math-BoldItalic.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_SansSerif-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_SansSerif-Bold.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_SansSerif-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_SansSerif-Bold.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_SansSerif-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_SansSerif-Italic.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Script-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Script-Regular.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Script-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Script-Regular.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Size1-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Size1-Regular.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Size2-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Size2-Regular.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Size3-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Size3-Regular.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Size4-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Size4-Regular.woff2
--------------------------------------------------------------------------------
/assets/img/thumbnails/feature-img/story.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/thumbnails/feature-img/story.jpeg
--------------------------------------------------------------------------------
/assets/fonts/font-awesome/fa-regular-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/font-awesome/fa-regular-400.woff2
--------------------------------------------------------------------------------
/assets/fonts/font-awesome/fa-v4compatibility.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/font-awesome/fa-v4compatibility.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Caligraphic-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Caligraphic-Bold.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Caligraphic-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Caligraphic-Bold.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Caligraphic-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Caligraphic-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Fraktur-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Fraktur-Regular.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Main-BoldItalic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Main-BoldItalic.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Math-BoldItalic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Math-BoldItalic.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_SansSerif-Italic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_SansSerif-Italic.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_SansSerif-Italic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_SansSerif-Italic.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_SansSerif-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_SansSerif-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_SansSerif-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_SansSerif-Regular.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_SansSerif-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_SansSerif-Regular.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Typewriter-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Typewriter-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Typewriter-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Typewriter-Regular.woff
--------------------------------------------------------------------------------
/assets/img/thumbnails/feature-img/circuit.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/thumbnails/feature-img/circuit.jpeg
--------------------------------------------------------------------------------
/assets/fonts/font-awesome/fa-v4compatibility.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/font-awesome/fa-v4compatibility.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Caligraphic-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Caligraphic-Regular.woff
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Caligraphic-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Caligraphic-Regular.woff2
--------------------------------------------------------------------------------
/assets/fonts/katex/KaTeX_Typewriter-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/katex/KaTeX_Typewriter-Regular.woff2
--------------------------------------------------------------------------------
/assets/img/thumbnails/feature-img/desk-messy.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/img/thumbnails/feature-img/desk-messy.jpeg
--------------------------------------------------------------------------------
/assets/fonts/Pacifico/original-pacifico-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/Pacifico/original-pacifico-regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/source-sans-pro/source-sans-pro-bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/source-sans-pro/source-sans-pro-bold.woff2
--------------------------------------------------------------------------------
/pages/categories.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: categories
3 | title: Categories
4 | permalink: /categories/
5 | hide: true
6 | excluded: true
7 | showCounts: false
8 | ---
9 |
--------------------------------------------------------------------------------
/assets/fonts/source-sans-pro/source-sans-pro-italic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/source-sans-pro/source-sans-pro-italic.woff2
--------------------------------------------------------------------------------
/assets/fonts/source-sans-pro/source-sans-pro-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/source-sans-pro/source-sans-pro-regular.woff2
--------------------------------------------------------------------------------
/assets/fonts/source-sans-pro/source-sans-pro-bold-italic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sylhare/Type-on-Strap/HEAD/assets/fonts/source-sans-pro/source-sans-pro-bold-italic.woff2
--------------------------------------------------------------------------------
/pages/archive.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: archive
3 | title: "Blog Archive"
4 | permalink: /archive/
5 | hide: true
6 | excluded: true
7 | icon: "fa-archive"
8 | position: 6
9 | ---
10 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/_fixed-width.scss:
--------------------------------------------------------------------------------
1 | // fixed-width icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-fw {
5 | text-align: center;
6 | width: $fa-fw-width;
7 | }
8 |
--------------------------------------------------------------------------------
/_includes/citation.html:
--------------------------------------------------------------------------------
1 | {%- assign citation = site.data.biblio | where:"key", include.key | first -%}
2 | {{citation.authors}} , {{citation.title}}
--------------------------------------------------------------------------------
/pages/404.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: "404 Page not found"
4 | permalink: /404.html
5 | hide: true
6 | excluded: true
7 | ---
8 |
9 | Sorry, the requested page wasn't found on the server.
10 |
--------------------------------------------------------------------------------
/.github/labeler.yml:
--------------------------------------------------------------------------------
1 | question:
2 | - '(\?|How|What|Why|When|Where|Who)'
3 |
4 | bug:
5 | - '(bug|issue|problem|broken|error|fail|does not work|not working)'
6 |
7 | enhancement:
8 | - '(enhancement|feature)'
9 |
--------------------------------------------------------------------------------
/_data/biblio.yml:
--------------------------------------------------------------------------------
1 | - authors: John Smith
2 | title: A Title About Citations
3 | key: ref1
4 |
5 | - authors: Michael's Rose
6 | title: "[Minimal Mistakes](https://mmistakes.github.io/minimal-mistakes/markup-syntax-highlighting)"
7 | key: highlight
8 |
--------------------------------------------------------------------------------
/pages/search.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: search
3 | title: Search
4 | permalink: /search/
5 | subtitle: "What are you looking for?"
6 | feature-img: "assets/img/pexels/search-map.jpeg"
7 | icon: "fa-search"
8 | excluded: true
9 | position: 5
10 | ---
11 |
--------------------------------------------------------------------------------
/.github/dependabot.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | version: 2
3 | updates:
4 | - package-ecosystem: "github-actions"
5 | directory: "/.github"
6 | schedule:
7 | interval: "monthly"
8 | groups:
9 | actions:
10 | patterns:
11 | - "*"
12 |
--------------------------------------------------------------------------------
/pages/portfolio.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title : Portfolio
4 | permalink: /portfolio/
5 | subtitle: "Projects I am working on"
6 | feature-img: "assets/img/pexels/computer.jpeg"
7 | position: 4
8 | tags: [Page]
9 | ---
10 |
11 | {% include portfolio.html %}
12 |
--------------------------------------------------------------------------------
/_posts/2013-10-18-blogging-with-title.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: >
4 | Blogging with title
5 | tags: [Test, Image]
6 | categories: Tutorial
7 | ---
8 |
9 | # I am a BIG title
10 |
11 | This is a very tiny tiny post with less than 250 letters.
12 |
13 |
14 |
--------------------------------------------------------------------------------
/_data/menu.yml:
--------------------------------------------------------------------------------
1 | # To add links to the navigation bar.
2 | - example:
3 | title: Example
4 | url: https://example.com
5 | hide: true
6 | position: 2
7 | - type-on-strap:
8 | title: "Type on Strap"
9 | url: https://github.com/sylhare/Type-on-Strap
10 | position: 1
11 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source "https://rubygems.org"
2 |
3 | # Should be included in Jekyll but depending on the version Jekyll and Ruby version, it may not be included
4 | gem 'webrick'
5 | gem 'kramdown-parser-gfm'
6 |
7 | # For github pages compatibility
8 | # gem 'github-pages', group: :jekyll_plugins
9 | gemspec
--------------------------------------------------------------------------------
/_sass/layouts/_page.scss:
--------------------------------------------------------------------------------
1 | .title-padder {
2 | padding: $title-padding;
3 | }
4 |
5 | h1.title {
6 | @extend .subtle-txt-shadow;
7 | padding: 0.5em 0;
8 | }
9 |
10 |
11 | .subtitle {
12 | font-weight: normal;
13 | margin-top: 5px;
14 | text-shadow: 1px 1px 2px var(--text-shadow);
15 | }
16 |
--------------------------------------------------------------------------------
/.github/hooks/README.md:
--------------------------------------------------------------------------------
1 | # Git hooks
2 |
3 | Git hooks are provided in `hooks/`. The pre-commit hook, when enabled, will check for non-staged assets before commit and abort if found any.
4 |
5 | ## Setup
6 |
7 | `ln lib/hooks/pre-commit .git/hooks/pre-commit`
8 |
9 | ## Bypass
10 |
11 | `git commit -n`
12 |
--------------------------------------------------------------------------------
/assets/css/bootstrap-iso.less:
--------------------------------------------------------------------------------
1 | /*
2 | To create an isolated version of Bootstrap
3 | Use Gulp (npm install) in order to compile it:
4 |
5 | gulp isolate-bootstrap-css
6 |
7 | */
8 |
9 | .bootstrap-iso {
10 | @import (less) 'vendor/bootstrap.css';
11 | /*@import (less) 'vendor/bootstrap-theme.css'; //optional */
12 | }
--------------------------------------------------------------------------------
/assets/data/search.liquid:
--------------------------------------------------------------------------------
1 | ---
2 | ---
3 | {% comment %}
4 | The json is created in search_json.liquid and included here to be compressed
5 | {% endcomment %}
6 | {% capture _search %}{% include default/search_json.liquid %}{% endcapture %}
7 | {% assign emptyField = '{ },' %}
8 | {{ _search | split: " " | join: " " | remove: emptyField }}
9 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | ### Description
5 |
6 |
7 | ### Screenshot
8 |
9 |
--------------------------------------------------------------------------------
/_data/social.yml:
--------------------------------------------------------------------------------
1 | # RSS specific
2 | rss: true # Icons on the footer
3 | feed:
4 | path: feed.xml # RSS feed path
5 |
6 | # For the share button options at the bottom of the articles
7 | share:
8 | email: true
9 | facebook: true
10 | linkedin: true
11 | pinterest: true
12 | pocket:
13 | reddit: true
14 | tumblr: true
15 | twitter: true
16 | wordpress:
17 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/_sizing.scss:
--------------------------------------------------------------------------------
1 | // sizing icons
2 | // -------------------------
3 |
4 | // literal magnification scale
5 | @for $i from 1 through 10 {
6 | .#{$fa-css-prefix}-#{$i}x {
7 | font-size: $i * 1em;
8 | }
9 | }
10 |
11 | // step-based scale (with alignment)
12 | @each $size, $value in $fa-sizes {
13 | .#{$fa-css-prefix}-#{$size} {
14 | @include fa-size($value);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/v4-shims.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | * Copyright 2024 Fonticons, Inc.
5 | */
6 | // V4 shims compile (Web Fonts-based)
7 | // -------------------------
8 |
9 | @import 'functions';
10 | @import 'variables';
11 | @import 'shims';
12 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/_screen-reader.scss:
--------------------------------------------------------------------------------
1 | // screen-reader utilities
2 | // -------------------------
3 |
4 | // only display content to screen readers
5 | .sr-only,
6 | .#{$fa-css-prefix}-sr-only {
7 | @include fa-sr-only;
8 | }
9 |
10 | // use in conjunction with .sr-only to only display content when it's focused
11 | .sr-only-focusable,
12 | .#{$fa-css-prefix}-sr-only-focusable {
13 | @include fa-sr-only-focusable;
14 | }
15 |
--------------------------------------------------------------------------------
/.github/workflows/labeler.yml:
--------------------------------------------------------------------------------
1 | name: "Issue Labeler"
2 | on:
3 | issues:
4 | types: [opened, edited]
5 |
6 | permissions:
7 | issues: write
8 | contents: read
9 |
10 | jobs:
11 | triage:
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: github/issue-labeler@v3.4
15 | with:
16 | repo-token: ${{ github.token }}
17 | configuration-path: .github/labeler.yml
18 | enable-versioned-regex: 0
19 |
--------------------------------------------------------------------------------
/_sass/external/_katex.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * KaTeX v0.16.25
3 | * Plus added customizations for the theme
4 | */
5 |
6 | @import "katex/katex";
7 |
8 | .katex-display {
9 | @media screen and (max-width: $sm-break) {
10 | overflow-x: auto;
11 | }
12 | & {
13 | padding-bottom: 3px;
14 | padding-top: 1px;
15 | width: auto;
16 | height: auto;
17 | }
18 | }
19 |
20 | .math-display {
21 | display: inline-block;
22 | width: 100%;
23 | }
24 |
25 |
26 |
--------------------------------------------------------------------------------
/assets/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM sylhare/jekyll:latest
2 | LABEL maintainer="sylhare"
3 | LABEL image="sylhare/type-on-strap"
4 |
5 | # Create Type-on-strap Gemfile
6 | RUN echo "source \"https://rubygems.org\"" >> Gemfile
7 | RUN echo "gem 'type-on-strap', '>= 2.4.11', '< 3.0'" >> Gemfile
8 | RUN echo "Adding the Gemfile"
9 | RUN cat Gemfile
10 |
11 | # Install the theme
12 | RUN bundle update
13 | RUN bundle install
14 |
15 | # Make it accessible from outside
16 | EXPOSE 4000
17 |
18 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 |
3 | on:
4 | workflow_run:
5 | workflows: ["Build"]
6 | types:
7 | - completed
8 |
9 |
10 | jobs:
11 | build:
12 | runs-on: ubuntu-latest
13 |
14 | steps:
15 | - name: Fail if previous workflow failed
16 | run: exit 1
17 | if: ${{ github.event.workflow_run.conclusion != 'success' }}
18 |
19 | - uses: actions/checkout@v4
20 | - name: Hello world
21 | run: echo "Build passed! 🎉"
--------------------------------------------------------------------------------
/_sass/external/_font-awesome.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Type-on-strap Font Awesome kit v6.7.1
3 | * Find the version and license of the included Font Awesome here: _sass/external/font-awesome/fontawesome.scss
4 | */
5 | $fa-inverse: var(--background);
6 | $fa-font-path: "../fonts/font-awesome" !default;
7 |
8 | @import 'font-awesome/fontawesome';
9 | @import 'font-awesome/brands';
10 | @import 'font-awesome/regular';
11 | @import 'font-awesome/solid';
12 | @import 'font-awesome/v4-shims';
13 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/_icons.scss:
--------------------------------------------------------------------------------
1 | // specific icon class definition
2 | // -------------------------
3 |
4 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
5 | readers do not read off random characters that represent icons */
6 |
7 | @each $name, $icon in $fa-icons {
8 | .#{$fa-css-prefix}-#{$name} {
9 | #{$fa-icon-property}: unquote("\"#{ $icon }\"");
10 | #{$fa-duotone-icon-property}: unquote("\"#{$icon}#{$icon}\"");
11 | }
12 | }
13 |
14 |
--------------------------------------------------------------------------------
/pages/gallery.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: Gallery
4 | subtitle: From the pexels folder
5 | permalink: /gallery/
6 | gallery_path: "assets/img/pexels"
7 | excluded: true
8 | position: 3
9 | tags: [Page]
10 | ---
11 |
12 | This is a photo gallery made from the static files in the `assets/img/pexels` folder.
13 | I wanted to automatically create a simple gallery from a folder without having to create a markdown page as you would for the portfolio.
14 |
15 |
16 | {% include gallery.html gallery_path=page.gallery_path %}
17 |
--------------------------------------------------------------------------------
/.github/Docs.md:
--------------------------------------------------------------------------------
1 | # GitHub folder
2 |
3 | > You don't need that folder for your GitHub page
4 |
5 | You can delete this folder or add your own workflows in it.
6 |
7 | ## Structure
8 |
9 | - [hooks](./hooks): custom git hooks for gulp task
10 | - [workflows](./workflows): Workflows of this repository for the GitHub actions
11 | - [config.yml](./config.yml): Config file for "request-info" bot
12 | - [release-drafter.yml](./release-drafter.yml): Config file for "release-drafter" bot
13 | - [stale.yml](./stale.yml): Config file for "stale" bot
14 |
--------------------------------------------------------------------------------
/.github/workflows/release-drafter.yml:
--------------------------------------------------------------------------------
1 | name: Release Drafter
2 |
3 | on:
4 | push:
5 | branches:
6 | - master
7 | - main
8 | pull_request:
9 | types: [opened, reopened, synchronize]
10 |
11 | permissions:
12 | contents: read
13 |
14 | jobs:
15 | update_release_draft:
16 | permissions:
17 | contents: write
18 | pull-requests: write
19 | runs-on: ubuntu-latest
20 | steps:
21 | - uses: release-drafter/release-drafter@v6
22 | env:
23 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
24 |
25 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/_list.scss:
--------------------------------------------------------------------------------
1 | // icons in a list
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-ul {
5 | list-style-type: none;
6 | margin-left: var(--#{$fa-css-prefix}-li-margin, #{$fa-li-margin});
7 | padding-left: 0;
8 |
9 | > li { position: relative; }
10 | }
11 |
12 | .#{$fa-css-prefix}-li {
13 | left: calc(-1 * var(--#{$fa-css-prefix}-li-width, #{$fa-li-width}));
14 | position: absolute;
15 | text-align: center;
16 | width: var(--#{$fa-css-prefix}-li-width, #{$fa-li-width});
17 | line-height: inherit;
18 | }
19 |
--------------------------------------------------------------------------------
/_includes/social/disqus.liquid:
--------------------------------------------------------------------------------
1 |
7 |
8 |
--------------------------------------------------------------------------------
/_sass/includes/_post_nav.scss:
--------------------------------------------------------------------------------
1 | #post-nav {
2 | width: 100%;
3 | display: inline-block;
4 | @extend %padding-nav;
5 |
6 | a {
7 | width: 100%;
8 | padding: 0;
9 | margin: 0;
10 | }
11 |
12 | p {
13 | @extend .meta;
14 | }
15 |
16 | #previous-post {
17 | float: left;
18 | width: 50%;
19 | }
20 |
21 | #next-post {
22 | float: right;
23 | text-align: right;
24 | width: 50%;
25 | }
26 |
27 | @media screen and (max-width: $sm-break) {
28 | a, p {
29 | font-size: 0.8em;
30 | }
31 | }
32 | }
33 |
34 |
--------------------------------------------------------------------------------
/_sass/includes/_footer.scss:
--------------------------------------------------------------------------------
1 | .site-footer {
2 | @extend %padding-post;
3 | z-index: -1;
4 | display: inline-block;
5 | text-align: center;
6 | width: 100%;
7 | color: var(--meta);
8 | font-size: 0.9em;
9 |
10 | .footer-icons {
11 | ul {
12 | list-style: none;
13 | margin: 0;
14 |
15 | li {
16 | display: inline;
17 | }
18 |
19 | a {
20 | color: var(--link);
21 | }
22 |
23 | a:hover {
24 | .fa-circle {
25 | filter: brightness(0.85);
26 | }
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/pages/about.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: About
4 | permalink: /about/
5 | feature-img: "assets/img/pexels/travel.jpeg"
6 | tags: [Page]
7 | ---
8 |
9 | Type on Strap is based on Type Theme, a free and open-source theme for [Jekyll](http://jekyllrb.com/), licensed under the MIT License.
10 |
11 | Head over to the [theme's documentation](https://github.com/sylhare/Type-on-Strap) for much more information about Type on Strap or to install this theme on your own Jekyll site.
12 |
13 | This file is an example of a page in Jekyll, that automatically shows up in the header navigation, you can delete or modify this file freely.
14 |
15 |
--------------------------------------------------------------------------------
/.github/release-drafter.yml:
--------------------------------------------------------------------------------
1 | name-template: 'v$RESOLVED_VERSION'
2 | tag-template: 'v$RESOLVED_VERSION'
3 | version-resolver:
4 | major:
5 | labels:
6 | - 'breaking'
7 | - 'major'
8 | minor:
9 | labels:
10 | - 'feature'
11 | - 'enhancement'
12 | default: patch
13 | categories:
14 | - title: '🚀 Features'
15 | labels:
16 | - 'feature'
17 | - 'enhancement'
18 | - title: '🐛 Bug Fixes'
19 | labels:
20 | - 'fix'
21 | - 'bug'
22 | - title: '🧰 Maintenance'
23 | labels:
24 | - 'devops'
25 | - 'custom'
26 | - 'dependencies'
27 | template: |
28 | ## What's new:
29 |
30 | $CHANGES
31 |
--------------------------------------------------------------------------------
/_sass/includes/_aligner.scss:
--------------------------------------------------------------------------------
1 | /* --- Aligner --- */
2 |
3 | .row {
4 | display: flex;
5 | flex-wrap: wrap;
6 | flex-direction: row;
7 | align-items: center;
8 | justify-content: center;
9 | padding: 0.9% 0 1.5% 0;
10 | }
11 |
12 | .caption-style {
13 | order: 1;
14 | flex: 1 1 100%;
15 | display: block;
16 | font-style: italic;
17 | font-size: 0.8em;
18 | text-align: center;
19 | color: var(--meta);
20 | font-weight: 200;
21 | padding-bottom: 5px;
22 | padding-top: 5px;
23 | }
24 |
25 | .column {
26 | flex: 1 0;
27 |
28 | img {
29 | min-width: 250px;
30 | }
31 | .single {
32 | width: 100%;
33 | display: block;
34 | }
35 | }
--------------------------------------------------------------------------------
/assets/js/partials/masonry_init.js:
--------------------------------------------------------------------------------
1 | /* @preserve Masonry Init */
2 | try {
3 | var elem = document.querySelector('.grid');
4 | var msnry = new Masonry(elem, {
5 | itemSelector: '.grid-item',
6 | columnWidth: '.grid-sizer',
7 | gutter: '.gutter-sizer',
8 | percentPosition: true
9 | });
10 |
11 | // layout Masonry after each image loads
12 | var imgLoad = imagesLoaded(elem);
13 | imgLoad.on('progress', function (instance, image) {
14 | msnry.layout();
15 | });
16 | } catch (err) {
17 | if (err instanceof ReferenceError) {
18 | // Do nothing, Masonry is defined only in the gallery page
19 | } else {
20 | throw err;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/_data/authors.yml:
--------------------------------------------------------------------------------
1 | rohanchandra: # author-id
2 | name: "Rohan Chandra"
3 | avatar: "https://avatars2.githubusercontent.com/u/816965?s=460&v=4"
4 | url: "https://github.com/rohanchandra"
5 | sylhare:
6 | name: Sylhare
7 | avatar: "https://avatars3.githubusercontent.com/u/20642750?s=460&v=4"
8 | url: "https://github.com/sylhare"
9 | mmistakes:
10 | name: "Michael Rose"
11 | avatar: "https://avatars3.githubusercontent.com/u/1376749?s=460&v=4"
12 | url: "https://github.com/mmistakes"
13 | mhagnumdw:
14 | name: Mhagnumdw
15 | avatar: "https://avatars2.githubusercontent.com/u/17688846?s=460&v=4"
16 | url:
17 | unknown:
18 | name: Unknown
19 | avatar:
20 | url:
21 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: bug
6 | assignees: 'sylhare'
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Additional context**
27 | Add any other context about the problem here.
28 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/fontawesome.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | * Copyright 2024 Fonticons, Inc.
5 | */
6 | // Font Awesome core compile (Web Fonts-based)
7 | // -------------------------
8 |
9 | @import 'functions';
10 | @import 'variables';
11 | @import 'mixins';
12 | @import 'core';
13 | @import 'sizing';
14 | @import 'fixed-width';
15 | @import 'list';
16 | @import 'bordered-pulled';
17 | @import 'animated';
18 | @import 'rotated-flipped';
19 | @import 'stacked';
20 | @import 'icons';
21 | @import 'screen-reader';
22 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: enhancement
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/_layouts/default.html:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 | {% capture _head %}{% include default/head.liquid %}{% endcapture %}
9 | {{ _head | split: " " | join: " "}}
10 |
11 | {% capture _navbar %}{% include default/navbar.liquid %}{% endcapture %}
12 | {{ _navbar | split: " " | join: " "}}
13 |
14 | {{ content }}
15 |
16 | {% capture _footer %}{% include default/footer.liquid %}{% endcapture %}
17 | {{ _footer | split: " " | join: " "}}
18 |
19 |
20 |
--------------------------------------------------------------------------------
/_includes/default/tags_list.liquid:
--------------------------------------------------------------------------------
1 | {% assign tags = include.tags | split:'|' | sort | uniq %}
2 |
3 | {% if tags.size > 0 %}
4 |
5 |
6 | {% if tags.size == 1 %}
7 | Tag
8 | {% else %}
9 | Tags
10 | {% endif %}
11 |
12 | {% for tag in tags %}
13 |
14 | {{ tag }}
15 |
16 | {% endfor %}
17 |
18 |
19 | {% else %}
20 |
21 | {% endif %}
22 |
--------------------------------------------------------------------------------
/_includes/blog/post_nav.liquid:
--------------------------------------------------------------------------------
1 |
2 | {% if page.next.url %}
3 |
9 | {% endif %}
10 |
11 | {% if page.previous.url %}
12 |
18 | {% endif %}
19 |
20 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/_rotated-flipped.scss:
--------------------------------------------------------------------------------
1 | // rotating + flipping icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-rotate-90 {
5 | transform: rotate(90deg);
6 | }
7 |
8 | .#{$fa-css-prefix}-rotate-180 {
9 | transform: rotate(180deg);
10 | }
11 |
12 | .#{$fa-css-prefix}-rotate-270 {
13 | transform: rotate(270deg);
14 | }
15 |
16 | .#{$fa-css-prefix}-flip-horizontal {
17 | transform: scale(-1, 1);
18 | }
19 |
20 | .#{$fa-css-prefix}-flip-vertical {
21 | transform: scale(1, -1);
22 | }
23 |
24 | .#{$fa-css-prefix}-flip-both,
25 | .#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical {
26 | transform: scale(-1, -1);
27 | }
28 |
29 | .#{$fa-css-prefix}-rotate-by {
30 | transform: rotate(var(--#{$fa-css-prefix}-rotate-angle, 0));
31 | }
32 |
--------------------------------------------------------------------------------
/_sass/includes/_share_buttons.scss:
--------------------------------------------------------------------------------
1 | ul.share-buttons {
2 | list-style: none;
3 | padding: 1.5% 0 0.75% 0;
4 | margin: 0;
5 | text-align: center;
6 |
7 | li.meta {
8 | display: inline;
9 | margin-right: 0.5em;
10 | vertical-align: super;
11 | }
12 |
13 | li {
14 | display: inline;
15 |
16 | a:hover {
17 | text-decoration: none;
18 | }
19 | }
20 |
21 | .sr-only {
22 | position: absolute;
23 | clip: rect(1px 1px 1px 1px);
24 | clip: rect(1px, 1px, 1px, 1px);
25 | padding: 0;
26 | border: 0;
27 | height: 1px;
28 | width: 1px;
29 | overflow: hidden;
30 | }
31 |
32 | .fa-stack {
33 | vertical-align: top;
34 | width: 1.75em;
35 |
36 | .fab {
37 | font-size: 30px;
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/.github/stale.yml:
--------------------------------------------------------------------------------
1 | # Number of days of inactivity before an issue becomes stale
2 | daysUntilStale: 15
3 |
4 | # Number of days of inactivity before a stale issue is closed
5 | daysUntilClose: 7
6 |
7 | # Issues with these labels will never be considered stale
8 | exemptLabels:
9 | - pinned
10 | - security
11 |
12 | # Label to use when marking an issue as stale
13 | staleLabel: wontfix
14 |
15 | # Comment to post when marking an issue as stale. Set to `false` to disable
16 | markComment: >
17 | This issue has been automatically marked as stale because it has not had
18 | recent activity. It will be closed if no further activity occurs. Thank you
19 | for your contributions.
20 |
21 | # Comment to post when closing a stale issue. Set to `false` to disable
22 | closeComment: false
23 |
--------------------------------------------------------------------------------
/_includes/portfolio.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% for item in site.portfolio %}
4 |
14 | {% endfor %}
15 |
16 |
--------------------------------------------------------------------------------
/_includes/default/category_list.liquid:
--------------------------------------------------------------------------------
1 | {% assign categories = include.categories | split:'|' | sort | uniq %}
2 |
3 | {% if categories.size > 0 %}
4 |
5 |
6 | {% if categories.size == 1 %}
7 | Category
8 | {% else %}
9 | Categories
10 | {% endif %}
11 |
12 | {% for category in categories %}
13 |
14 | {{ category }}
15 |
16 | {% endfor %}
17 |
18 |
19 | {% else %}
20 |
21 | {% endif %}
22 |
23 |
--------------------------------------------------------------------------------
/_includes/default/footer.liquid:
--------------------------------------------------------------------------------
1 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/_sass/external/_pacifico.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font: SIL OFL 1.1, CSS: MIT License
3 | */
4 |
5 | $pacifico-font-path: "../../assets/fonts/Pacifico" !default;
6 |
7 | @font-face {
8 | font-family: 'Pacifico';
9 | src: url('#{$pacifico-font-path}/Pacifico.eot'); /* IE9 Compat Modes */
10 | src: url('#{$pacifico-font-path}/Pacifico.eot?#iefix') format('embedded-opentype'),
11 | url('#{$pacifico-font-path}/Pacifico.woff2') format('woff2'),
12 | url('#{$pacifico-font-path}/Pacifico.woff') format('woff'),/* Modern Browsers */
13 | url('#{$pacifico-font-path}/Pacifico.ttf') format('truetype'),/* Safari, Android, iOS */
14 | url('#{$pacifico-font-path}/Pacifico.svg#Pacifico') format('svg');/* Legacy iOS */
15 | font-weight: normal;
16 | font-style: normal;
17 | }
18 |
--------------------------------------------------------------------------------
/.github/tests/jest.config.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Jest configuration for Type-on-Strap theme unit tests
3 | * @see https://jestjs.io/docs/configuration
4 | */
5 | module.exports = {
6 | testEnvironment: 'jsdom',
7 | testMatch: [
8 | '**/unit/**/*.test.js',
9 | ],
10 | testPathIgnorePatterns: [
11 | '/node_modules/',
12 | '/_site/',
13 | '/e2e/',
14 | '/playwright-report/',
15 | '/test-results/',
16 | ],
17 | collectCoverageFrom: [
18 | 'unit/**/*.js',
19 | '!unit/**/*.test.js',
20 | '!**/node_modules/**',
21 | ],
22 | coverageDirectory: 'coverage',
23 | coverageReporters: ['text', 'lcov', 'html'],
24 | setupFiles: [],
25 | roots: ['/unit'],
26 | clearMocks: true,
27 | resetMocks: true,
28 | restoreMocks: true,
29 | verbose: true,
30 | };
31 |
32 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/_stacked.scss:
--------------------------------------------------------------------------------
1 | // stacking icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-stack {
5 | display: inline-block;
6 | height: 2em;
7 | line-height: 2em;
8 | position: relative;
9 | vertical-align: $fa-stack-vertical-align;
10 | width: $fa-stack-width;
11 | }
12 |
13 | .#{$fa-css-prefix}-stack-1x,
14 | .#{$fa-css-prefix}-stack-2x {
15 | left: 0;
16 | position: absolute;
17 | text-align: center;
18 | width: 100%;
19 | z-index: var(--#{$fa-css-prefix}-stack-z-index, #{$fa-stack-z-index});
20 | }
21 |
22 | .#{$fa-css-prefix}-stack-1x {
23 | line-height: inherit;
24 | }
25 |
26 | .#{$fa-css-prefix}-stack-2x {
27 | font-size: 2em;
28 | }
29 |
30 | .#{$fa-css-prefix}-inverse {
31 | color: var(--#{$fa-css-prefix}-inverse, #{$fa-inverse});
32 | }
33 |
--------------------------------------------------------------------------------
/_includes/aligner.html:
--------------------------------------------------------------------------------
1 | {% assign images = include.images | split: ',' %}
2 |
3 | {% if include.column == "auto" %}
4 | {% assign column = 100.0 | divided_by: images.size %}
5 | {% elsif include.column > 0 %}
6 | {% assign column = 100.0 | divided_by: include.column %}
7 | {% endif %}
8 |
9 |
10 |
11 | {% for image in images %}
12 |
13 |
16 |
17 | {% endfor %}
18 | {% if include.caption %}
19 | {% endif %}
20 | {{ include.caption }}
21 |
22 |
23 |
24 | {% assign column = false %}
25 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Idea
2 | .idea/*
3 |
4 | # Mac OS
5 | .DS_Store
6 |
7 | # Byte-compiled / optimized / DLL files
8 | *.manifest
9 | *.spec
10 |
11 | # Jekyll dev or build
12 | _site/*
13 | _development_tool/*
14 | .sass-cache/*
15 | *.css.map
16 | *.scssc
17 | .bundle/*
18 | /vendor/
19 | .jekyll-cache/*
20 | */.jekyll-cache/*
21 |
22 | # Theme Gem
23 | Gemfile.lock
24 | *.gem
25 | .gems
26 | jekyll-theme-type-on-strap.gemspec
27 |
28 | # Node.js
29 | **/node_modules/*
30 | **/package-lock.json
31 |
32 | # Testing
33 | .github/tests/node_modules/
34 | .github/tests/playwright-report/
35 | .github/tests/test-results/
36 | .github/tests/_site/
37 | .github/tests/.jekyll-cache/
38 | .github/tests/playwright/.cache/
39 | .github/tests/coverage/
40 |
41 | # Misc
42 | *-test.md
43 | *copy.md
44 | test/*
45 | /type-on-strap*/*
46 | test-results/*
47 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/_bordered-pulled.scss:
--------------------------------------------------------------------------------
1 | // bordered + pulled icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-border {
5 | border-color: var(--#{$fa-css-prefix}-border-color, #{$fa-border-color});
6 | border-radius: var(--#{$fa-css-prefix}-border-radius, #{$fa-border-radius});
7 | border-style: var(--#{$fa-css-prefix}-border-style, #{$fa-border-style});
8 | border-width: var(--#{$fa-css-prefix}-border-width, #{$fa-border-width});
9 | padding: var(--#{$fa-css-prefix}-border-padding, #{$fa-border-padding});
10 | }
11 |
12 | .#{$fa-css-prefix}-pull-left {
13 | float: left;
14 | margin-right: var(--#{$fa-css-prefix}-pull-margin, #{$fa-pull-margin});
15 | }
16 |
17 | .#{$fa-css-prefix}-pull-right {
18 | float: right;
19 | margin-left: var(--#{$fa-css-prefix}-pull-margin, #{$fa-pull-margin});
20 | }
21 |
--------------------------------------------------------------------------------
/_sass/includes/_gallery.scss:
--------------------------------------------------------------------------------
1 | /* ---- grid ---- */
2 |
3 | .grid {
4 | padding-bottom: 6%;
5 | padding-top: 1%;
6 |
7 |
8 | /* clear fix */
9 | &:after {
10 | content: '';
11 | display: block;
12 | clear: both;
13 | }
14 | }
15 |
16 | /* ---- .grid-item within masonry ---- */
17 |
18 | .grid-sizer,
19 | .grid-item {
20 | /* state column width */
21 | width: 32.6%;
22 | }
23 |
24 | .grid-item {
25 | float: left;
26 | border-radius: 5px;
27 |
28 | img {
29 | /* for image formatting in the masonry */
30 | display: block;
31 | max-width: 100%;
32 | min-height: 30%;
33 | }
34 | }
35 |
36 | /* --- Masonry gutter size --- */
37 |
38 | .gutter-sizer {
39 | width: 1%;
40 | }
41 |
42 | .grid-item:first-of-type {
43 | margin-bottom: 1%;
44 | }
45 |
46 | .grid-item {
47 | margin-bottom: 1%;
48 | }
49 |
--------------------------------------------------------------------------------
/_includes/gallery.html:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 | {% for image in site.static_files %}
13 | {% if image.path contains include.gallery_path %}
14 | {% unless image.path contains '.md' %}
15 |
16 | {% endunless %}
17 | {% endif %}
18 | {% endfor %}
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/_includes/social/cusdis.liquid:
--------------------------------------------------------------------------------
1 |
13 |
14 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/solid.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | * Copyright 2024 Fonticons, Inc.
5 | */
6 | @import 'functions';
7 | @import 'variables';
8 |
9 | :root, :host {
10 | --#{$fa-css-prefix}-style-family-classic: '#{ $fa-style-family }';
11 | --#{$fa-css-prefix}-font-solid: normal 900 1em/1 '#{ $fa-style-family }';
12 | }
13 |
14 |
15 | @font-face {
16 | font-family: 'Font Awesome 6 Free';
17 | font-style: normal;
18 | font-weight: 900;
19 | font-display: $fa-font-display;
20 | src: url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),
21 | url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype');
22 | }
23 |
24 | .fas,
25 | .#{$fa-css-prefix}-solid {
26 | font-weight: 900;
27 | }
28 |
--------------------------------------------------------------------------------
/assets/js/partials/navbar.js:
--------------------------------------------------------------------------------
1 | /* @preserve Navbar */
2 | document.addEventListener("DOMContentLoaded", function (event) {
3 |
4 | /*
5 | * Display the menu items on smaller screens
6 | */
7 | const pull = document.getElementById('pull');
8 | const menu = document.querySelector('nav ul');
9 |
10 | ['click', 'touch'].forEach(function (e) {
11 | pull?.addEventListener(e, function () {
12 | menu.classList.toggle('hide')
13 | }, false);
14 | });
15 |
16 | /*
17 | * Make the header images move on scroll
18 | */
19 | window.addEventListener('scroll', function () {
20 | const offset = -(window.scrollY || window.pageYOffset || document.body.scrollTop) / 3;
21 | const main = document.getElementById('main');
22 | if (main) {
23 | main.style.backgroundPosition = '100% ' + (offset - 50) + 'px' + ', 0%, center top';
24 | }
25 | });
26 | });
27 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/regular.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | * Copyright 2024 Fonticons, Inc.
5 | */
6 | @import 'functions';
7 | @import 'variables';
8 |
9 | :root, :host {
10 | --#{$fa-css-prefix}-style-family-classic: '#{ $fa-style-family }';
11 | --#{$fa-css-prefix}-font-regular: normal 400 1em/1 '#{ $fa-style-family }';
12 | }
13 |
14 |
15 | @font-face {
16 | font-family: 'Font Awesome 6 Free';
17 | font-style: normal;
18 | font-weight: 400;
19 | font-display: $fa-font-display;
20 | src: url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'),
21 | url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype');
22 | }
23 |
24 | .far,
25 | .#{$fa-css-prefix}-regular {
26 | font-weight: 400;
27 | }
28 |
--------------------------------------------------------------------------------
/_data/icons.yml:
--------------------------------------------------------------------------------
1 | # For the Icons on the footer of the website
2 | # For the Share buttons at the end of the articles, use the "social.yml"
3 | behance:
4 | bitbucket:
5 | calendly:
6 | dribbble:
7 | facebook:
8 | flickr:
9 | github: sylhare
10 | gitlab:
11 | google-scholar: # e.g. "WXAAOb0AAAAJ"
12 | instagram:
13 | hacker-news:
14 | keybase:
15 | linkedin:
16 | mail: # e.g. "sam@mail.com"
17 | map: # e.g. "34.0886/-118.3191"
18 | mastodon: # e.g. "fostodon.org/@sam"
19 | matrix: # e.g. "@sam:matrix.org"
20 | medium:
21 | patreon:
22 | phone: # e.g. "+11111111111"
23 | pinterest:
24 | reddit:
25 | soundcloud:
26 | sms: # e.g. "+11111111111"
27 | stack-exchange: # e.g. "123456789"
28 | stack-overflow: # e.g. "123456789"
29 | steam:
30 | telegram:
31 | tumblr:
32 | twitch:
33 | twitter:
34 | vimeo:
35 | vk:
36 | wordpress:
37 | youtube: # e.g. "UCqECaJ8Gagnn7YCbPEzWH6g"
38 |
--------------------------------------------------------------------------------
/_data/language.yml:
--------------------------------------------------------------------------------
1 | # Localization strings
2 | str_follow_on: "Follow on"
3 | str_rss_follow: "Follow RSS feed"
4 | str_share_on: "Share on"
5 | str_add_to: "Add to"
6 | str_email: "Email"
7 | str_tweet: "Tweet"
8 | str_pin_it: "Pin it"
9 | str_next_post: "Next post"
10 | str_previous_post: "Previous post"
11 | str_next_page: "Next"
12 | str_previous_page: "Prev"
13 | str_javascript_required_disqus: "Please enable JavaScript to view comments."
14 | str_no_result_found: "No result found"
15 | str_cookie_approve: "Approve"
16 | str_cookie_disclaimer: "We would like to use third party cookies and scripts to improve the functionality of this website."
17 | str_months: [January, February, March, April, May, June, July, August, September, October, November, December]
18 | str_dark: 'Dark'
19 | str_light: 'Light'
20 | str_date_format: '%B %-d, %Y'
21 | str_last_modified: 'Last modified on'
22 |
23 | # Localization settings
24 | cusdis_lang: # zh-cn, es, tr, pt-BR
25 |
--------------------------------------------------------------------------------
/_sass/includes/_blog_nav.scss:
--------------------------------------------------------------------------------
1 | /* --- Pagination --- */
2 | .pagination {
3 | @extend %padding-nav;
4 | display: inline-block;
5 | text-align: center;
6 | //margin-bottom: 2em;
7 | width: 100%;
8 | clear: both;
9 |
10 | &:before {
11 | content: '';
12 | display: inline-block;
13 | height: 100%;
14 | vertical-align: middle;
15 | }
16 |
17 | .page_number {
18 | display: inline-block;
19 | vertical-align: sub;
20 |
21 | @media (max-width: $x-sm-break) {
22 | display: none;
23 | }
24 | }
25 |
26 | .button {
27 | margin: 0;
28 | display: inline-block;
29 |
30 | .fa {
31 | &.fa-chevron-right, &.fa-chevron-left {
32 | font-size: initial;
33 | }
34 | }
35 |
36 | i .fa-chevron-left .fa-chevron-right {
37 | vertical-align: inherit;
38 | }
39 | }
40 |
41 | .previous {
42 | float: left;
43 | }
44 |
45 | .next {
46 | float: right;
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/_includes/social/utterances.liquid:
--------------------------------------------------------------------------------
1 |
8 |
9 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/brands.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | * Copyright 2024 Fonticons, Inc.
5 | */
6 | @import 'functions';
7 | @import 'variables';
8 |
9 | :root, :host {
10 | --#{$fa-css-prefix}-style-family-brands: 'Font Awesome 6 Brands';
11 | --#{$fa-css-prefix}-font-brands: normal 400 1em/1 'Font Awesome 6 Brands';
12 | }
13 |
14 | @font-face {
15 | font-family: 'Font Awesome 6 Brands';
16 | font-style: normal;
17 | font-weight: 400;
18 | font-display: $fa-font-display;
19 | src: url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'),
20 | url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype');
21 | }
22 |
23 | .fab,
24 | .#{$fa-css-prefix}-brands {
25 | font-weight: 400;
26 | }
27 |
28 | @each $name, $icon in $fa-brand-icons {
29 | .#{$fa-css-prefix}-#{$name} { #{$fa-icon-property}: unquote("\"#{ $icon }\""); }
30 | }
31 |
--------------------------------------------------------------------------------
/.github/hooks/pre-commit:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | # OPTIONAL
3 | # Called by "git commit" with no arguments.
4 | # The hook should run gulp to optimize assets.
5 | # Will exit with non-zero status if it wants to stop the commit.
6 |
7 | : << 'END' # Ancillary code to ensure environment before running gulp
8 | # If it's on the right directory, proceed. Else, try to fix it. If fail, abort commit.
9 | if [ ${PWD##*/} != "assets" ] ; then
10 | cd assets || exit 1
11 | fi
12 |
13 | # If gulp is installed and gulpfile.js is present, then proceed. Else, abort commit.
14 | if ! [ -f "gulpfile.js" ] || ! command -v gulp; then
15 | printf "gulpfile.js not found or gulp-cli not installed! Run npm i to install it.\n"
16 | exit 1
17 | fi
18 | END
19 |
20 | # If there are non-staged assets, abort commit.
21 | if git status --porcelain | grep -E '^(\?\?|AM|\nM).*assets/.*$' >/dev/null; then
22 | printf "There are non-staged assets, be sure to run gulp before committing changes!\n"
23 | exit 1
24 | fi
25 |
26 | # Proceed with the commit.
27 | exit 0
28 |
29 |
--------------------------------------------------------------------------------
/_layouts/search.liquid:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | ---
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
25 |
--------------------------------------------------------------------------------
/_portfolio/jekyllblog.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Jekyll
4 | feature-img: "assets/img/portfolio/cabin.png"
5 | img: "assets/img/portfolio/cabin.png"
6 | date: 2017-05-26
7 | ---
8 |
9 | Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam,
10 | eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
11 | Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
12 | sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
13 | Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur,
14 | adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
15 | Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
16 | Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,
17 | vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
18 |
19 |
--------------------------------------------------------------------------------
/_portfolio/ninja.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Ninja
4 | img: "assets/img/portfolio/ninja.png"
5 | date: April, 08 2014
6 | tags: [Lorem]
7 | ---
8 |
9 | 
10 |
11 | Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam,
12 | eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
13 | Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
14 | sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
15 | Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur,
16 | adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
17 | Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
18 | Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,
19 | vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
20 |
21 |
--------------------------------------------------------------------------------
/assets/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "type-on-strap-helper",
3 | "version": "2.4.13",
4 | "description": "Gulp file to manage the Type on Strap jekyll theme",
5 | "main": "gulpfile.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 0",
8 | "update": "ncu dev -u",
9 | "fix": "npm audit fix"
10 | },
11 | "repository": {
12 | "type": "git",
13 | "url": "git+https://github.com/sylhare/Type-on-Strap.git"
14 | },
15 | "keywords": [
16 | "jekyll"
17 | ],
18 | "author": "sylhare",
19 | "license": "MIT",
20 | "bugs": {
21 | "url": "https://github.com/Sylhare/Type-on-Strap/issues"
22 | },
23 | "homepage": "https://github.com/sylhare/Type-on-Strap#readme",
24 | "engines": {
25 | "node": ">=14.0.0"
26 | },
27 | "devDependencies": {
28 | "gulp": "^4.0.2",
29 | "gulp-clean-css": "^4.3.0",
30 | "gulp-concat": "^2.6.1",
31 | "gulp-imagemin": "^8.0.0",
32 | "gulp-less": "^5.0.0",
33 | "gulp-replace": "^1.1.4",
34 | "gulp-responsive": "^3.0.1",
35 | "gulp-uglify-es": "^3.0.0",
36 | "gulp-webp": "^4.0.1"
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/_portfolio/circus.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Circus
4 | img: "assets/img/portfolio/circus.png"
5 | date: September 2014
6 | tags: [Ipsum]
7 | ---
8 |
9 | 
10 |
11 | Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam,
12 | eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
13 | Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
14 | sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
15 | Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur,
16 | adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
17 | Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
18 | Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,
19 | vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
20 |
21 |
--------------------------------------------------------------------------------
/_portfolio/gitlecture.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Github
4 | img: "assets/img/portfolio/github.png"
5 | date: 20-10-2017
6 | tags: [Lorem]
7 | ---
8 |
9 | 
10 |
11 | Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam,
12 | eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
13 | Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
14 | sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
15 | Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur,
16 | adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
17 | Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
18 | Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,
19 | vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
20 |
21 |
--------------------------------------------------------------------------------
/_posts/2014-11-27-whats-your-title.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: What's your title
4 | hide_title: true
5 | feature-img: assets/img/feature-img/story.jpeg
6 | author: mhagnumdw
7 | tags: [Test, Image]
8 | categories: Demo
9 | ---
10 |
11 | This is an example of a post which includes a feature image that has a
12 | text, where you don't want to redisplay the title.
13 | Mind your image size in order for the text to be displayed where you want it to.
14 | The only limit is your imagination.
15 |
16 | Here is how the yaml looks inside the post:
17 |
18 | ```yml
19 | title: What's your title
20 | hide_title: true
21 | feature-img: assets/img/feature-img/story.jpeg
22 | author: mhagnumdw
23 | tags: [Test, Lorem]
24 | ```
25 |
26 | You may wonder, why is there a title when you are not actually displaying it.
27 | Well that's due to some jekyll limitation:
28 |
29 | > You **can't** set the **title** to an **empty string**
30 |
31 | The title is used elsewhere than inside the post, for example in the blog page that list this post.
32 | An empty title would break those pages and possibly prevents jekyll to render your blog.
33 |
--------------------------------------------------------------------------------
/_portfolio/hanoi.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Tower of Hanoi
4 | img: "assets/img/portfolio/toh.png"
5 | date: September 2014
6 | ---
7 |
8 | The tower of Hanoi...
9 |
10 | 
11 |
12 | Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam,
13 | eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
14 | Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
15 | sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
16 | Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur,
17 | adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
18 | Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
19 | Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,
20 | vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
21 |
22 |
--------------------------------------------------------------------------------
/_layouts/home.liquid:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | ---
4 |
5 |
23 |
24 |
{{ site.header_text | default: "Change header_text in _config.yml"}}
25 |
26 | {% capture _blog %}{% include blog/blog.liquid %}{% endcapture %}
27 | {{ _blog | split: " " | join: " "}}
28 |
29 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016-2025 Sylhare
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/.github/workflows/docker-build.yml:
--------------------------------------------------------------------------------
1 | name: Build
2 |
3 | on:
4 | push:
5 | branches: [ master ]
6 | pull_request:
7 | branches: [ master ]
8 |
9 | jobs:
10 | image:
11 |
12 | runs-on: ubuntu-latest
13 | strategy:
14 | matrix:
15 | # The jekyll/builder was replaced by the action jekyll-build-pages
16 | docker-image: [ 'sylhare/jekyll' ]
17 |
18 | steps:
19 | - uses: actions/checkout@v4
20 | - name: Build
21 | uses: actions/jekyll-build-pages@v1
22 | with:
23 | destination: "./output"
24 | - name: Build with Docker
25 | continue-on-error: true
26 | run: |
27 | cd assets && docker build .
28 | - name: Build the site in the container
29 | run: |
30 | docker run \
31 | -v ${{ github.workspace }}:/srv/jekyll -v ${{ github.workspace }}/_site:/srv/jekyll/_site \
32 | ${{ matrix.docker-image }}:latest /bin/bash -c "chmod -R 777 /srv/jekyll && jekyll build --future"
33 | - name: Pull docker images
34 | continue-on-error: true
35 | run: |
36 | docker pull sylhare/type-on-strap
37 | docker pull sylhare/jekyll
--------------------------------------------------------------------------------
/_sass/includes/_portfolio.scss:
--------------------------------------------------------------------------------
1 | .portfolio-link {
2 | display: block;
3 | position: relative;
4 | margin: 0 auto;
5 | max-width: 400px;
6 |
7 | .caption {
8 | margin: 0;
9 | position: absolute;
10 | width: 100%;
11 | height: 100%;
12 | text-align: center;
13 | opacity: 0;
14 | -webkit-transition: all ease .5s;
15 | -moz-transition: all ease .5s;
16 | transition: all ease .5s;
17 |
18 | &::before {
19 | content: ' ';
20 | display: inline-block;
21 | vertical-align: middle;
22 | height: 100%;
23 | }
24 |
25 | &:hover {
26 | opacity: 1;
27 | }
28 |
29 | .caption-content {
30 | font-size: 15px;
31 | color: white;
32 | text-shadow: -1px 0 #ddd, 0 1px #ddd, 1px 0 #ddd, 0 -1px #ddd;
33 | display: inline-block;
34 | vertical-align: middle;
35 |
36 | @media screen and (max-width: $sm-break) {
37 | font-size: 7px;
38 | }
39 | }
40 | }
41 | }
42 |
43 | .portfolio-grid {
44 | display: flex;
45 | flex-wrap: wrap;
46 | justify-content: space-around;
47 |
48 | }
49 |
50 | .portfolio-cell {
51 | flex: 0 0 32%;
52 | margin-bottom: 10px;
53 | }
54 |
--------------------------------------------------------------------------------
/_portfolio/tictactoe.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Tic tac toe
4 | feature-img: "assets/img/portfolio/ttt.png"
5 | img: "assets/img/portfolio/ttt.png"
6 | date: September 2014
7 | ---
8 |
9 | Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
10 | totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
11 | Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
12 | sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
13 | Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit,
14 | sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
15 | Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
16 | Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,
17 | vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
18 |
19 | Use this area of the page to describe your project.
20 | The icon above is part of a free icon set by Flat Icons.
21 |
22 |
--------------------------------------------------------------------------------
/_posts/2019-05-18-color-post.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Color Post
4 | tags: [Test, Color]
5 | color: brown
6 | author: sylhare
7 | categories: Example
8 | last_modified: "01-02-2023"
9 | excerpt_separator:
10 | ---
11 |
12 | # What a colorful post!
13 |
14 | This is an idea that came from [xukimseven/HardCandy-Jekyll](https://github.com/xukimseven/HardCandy-Jekyll)
15 | looking at this cheerful and colorful theme, I wanted to enable something similar for Type-on-Strap.
16 |
17 | You can go fork and star _HardCandy-Jekyll_ too! 😉
18 |
19 |
20 |
21 | ## How does it work?
22 |
23 | Basically you need to add just one thing, the color:
24 |
25 | ```yml
26 | ---
27 | layout: post
28 | title: Color Post
29 | color: brown
30 | ---
31 | ```
32 |
33 | It can either be a html color like `brown` (which look like red to me). Or with the rgb:
34 |
35 | ```yml
36 | ---
37 | layout: post
38 | title: Color Post
39 | color: rgb(165,42,42)
40 | ---
41 | ```
42 |
43 | The background used is `lineart.png` from [xukimseven](https://github.com/xukimseven) you can edit it in the config file.
44 | If you want another one, put it in `/assets/img` as well.
45 |
46 | > ⚠️ It's a bit hacking the css in the `post.html`
47 |
--------------------------------------------------------------------------------
/.github/config.yml:
--------------------------------------------------------------------------------
1 | # Configuration for request-info
2 | # https://github.com/behaviorbot/request-info
3 |
4 | # *OPTIONAL* Comment to reply with
5 | requestInfoReplyComment: >
6 | We would appreciate it if you could provide us with more info about this issue/pr!
7 |
8 | # *OPTIONAL* default titles to check against for lack of descriptiveness (MUST BE ALL LOWERCASE)
9 | requestInfoDefaultTitles:
10 | - update [readme.md](README.md)
11 | - updates
12 |
13 | # *OPTIONAL* Label to be added to Issues and Pull Requests with insufficient information given
14 | requestInfoLabelToAdd: need-more-info
15 |
16 | # *OPTIONAL* Require Pull Requests to contain more information than what is provided in the PR template (Will fail if the pull request's body is equal to the provided template)
17 | checkPullRequestTemplate: true
18 |
19 | # *OPTIONAL* Only warn about insufficient information on these events type (Keys must be lowercase. Valid values are 'issue' and 'pullRequest')
20 | requestInfoOn:
21 | pullRequest: true
22 | issue: true
23 |
24 | # *OPTIONAL* Add a list of people whose Issues/PRs will not be commented on (keys must be GitHub usernames)
25 | requestInfoUserstoExclude:
26 | - sylhare
27 | - # the other users you wanna add here
28 |
--------------------------------------------------------------------------------
/_portfolio/submarine.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Lorem Ipsum
4 | feature-img: "assets/img/portfolio/submarine.png"
5 | img: "assets/img/portfolio/submarine.png"
6 | date: 2017-09-03
7 | ---
8 |
9 | Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
10 | totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
11 | Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
12 | sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
13 | Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit,
14 | sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
15 | Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
16 | Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,
17 | vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
18 |
19 | Use this area of the page to describe your project.
20 | The icon above is part of a free icon set by Flat Icons.
21 |
--------------------------------------------------------------------------------
/_portfolio/cake.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Cake
4 | feature-img: "assets/img/portfolio/cake.png"
5 | img: "assets/img/portfolio/cake.png"
6 | date: 27 September 2015
7 | tags: [Lorem, Ipsum]
8 | ---
9 |
10 | Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
11 | totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
12 | Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
13 | sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
14 | Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit,
15 | sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
16 | Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
17 | Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,
18 | vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
19 |
20 | Use this area of the page to describe your project.
21 | The icon above is part of a free icon set by Flat Icons.
22 |
--------------------------------------------------------------------------------
/_portfolio/safe.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Creative
4 | feature-img: "assets/img/portfolio/safe.png"
5 | img: "assets/img/portfolio/safe.png"
6 | date: August, 16 2014
7 | tags: [Ipsum]
8 | ---
9 |
10 |
11 | Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
12 | totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
13 | Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
14 | sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
15 | Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit,
16 | sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
17 | Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
18 | Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,
19 | vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
20 |
21 | Use this area of the page to describe your project.
22 | The icon above is part of a free icon set by Flat Icons.
23 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/_core.scss:
--------------------------------------------------------------------------------
1 | // base icon class definition
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix} {
5 | font-family: var(--#{$fa-css-prefix}-style-family, '#{$fa-style-family}');
6 | font-weight: var(--#{$fa-css-prefix}-style, #{$fa-style});
7 | }
8 |
9 | .fas,
10 | .far,
11 | .fab,
12 | .#{$fa-css-prefix}-solid,
13 | .#{$fa-css-prefix}-regular,
14 | .#{$fa-css-prefix}-brands,
15 | .#{$fa-css-prefix} {
16 | -moz-osx-font-smoothing: grayscale;
17 | -webkit-font-smoothing: antialiased;
18 | display: var(--#{$fa-css-prefix}-display, #{$fa-display});
19 | font-style: normal;
20 | font-variant: normal;
21 | line-height: 1;
22 | text-rendering: auto;
23 | }
24 |
25 | .fas::before,
26 | .far::before,
27 | .fab::before,
28 | .#{$fa-css-prefix}-solid::before,
29 | .#{$fa-css-prefix}-regular::before,
30 | .#{$fa-css-prefix}-brands::before,
31 | .fa::before {
32 | content: var(#{$fa-icon-property});
33 | }
34 |
35 | .#{$fa-css-prefix}-classic,
36 | .fas,
37 | .#{$fa-css-prefix}-solid,
38 | .far,
39 | .#{$fa-css-prefix}-regular {
40 | font-family: 'Font Awesome 6 Free';
41 | }
42 | .#{$fa-css-prefix}-brands,
43 | .fab {
44 | font-family: 'Font Awesome 6 Brands';
45 | }
46 |
47 | %fa-icon {
48 | @include fa-icon;
49 | }
50 |
--------------------------------------------------------------------------------
/.github/tests/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "type-on-strap-tests",
3 | "version": "1.0.0",
4 | "description": "Test suite for Type-on-Strap Jekyll theme",
5 | "private": true,
6 | "scripts": {
7 | "test": "npm run test:unit && npm run test:e2e",
8 | "test:unit": "jest",
9 | "test:unit:watch": "jest --watch",
10 | "test:unit:coverage": "jest --coverage",
11 | "test:e2e": "playwright test",
12 | "test:e2e:headed": "playwright test --headed",
13 | "test:e2e:debug": "playwright test --debug",
14 | "test:e2e:ui": "playwright test --ui",
15 | "test:e2e:report": "playwright show-report",
16 | "test:data": "node scripts/validate-data.js",
17 | "playwright:install": "playwright install --with-deps",
18 | "server": "npx http-server ../../_site -p 4000 -c-1"
19 | },
20 | "keywords": [
21 | "test",
22 | "jekyll",
23 | "theme",
24 | "e2e",
25 | "playwright"
26 | ],
27 | "author": "",
28 | "license": "MIT",
29 | "devDependencies": {
30 | "@playwright/test": "^1.48.0",
31 | "@types/jest": "^29.5.12",
32 | "@types/node": "^20.14.10",
33 | "http-server": "^14.1.1",
34 | "jest": "^29.7.0",
35 | "jest-environment-jsdom": "^29.7.0",
36 | "js-yaml": "^4.1.0"
37 | }
38 | }
39 |
40 |
--------------------------------------------------------------------------------
/.github/workflows/gem-github-page.yml:
--------------------------------------------------------------------------------
1 | name: Type-on-strap CI (GitHub Pages)
2 |
3 | on:
4 | pull_request:
5 | branches: [ master ]
6 |
7 | jobs:
8 | ruby:
9 |
10 | runs-on: ubuntu-latest
11 | strategy:
12 | matrix:
13 | ruby: [ '2.7.4', '3.2', '3.4' ]
14 |
15 | steps:
16 | - uses: actions/checkout@v4
17 | - name: Set up Ruby
18 | # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
19 | # change this to (see https://github.com/ruby/setup-ruby#versioning):
20 | uses: ruby/setup-ruby@v1
21 | with:
22 | ruby-version: ${{ matrix.ruby }}
23 | bundler-cache: true # runs 'bundle install' and caches installed gems automatically
24 | - name: Install github-pages gem 2.7.4
25 | continue-on-error: true
26 | run: bundle install
27 | working-directory: ./.github/workflows/ruby-2.7.4
28 | if: matrix.ruby == '2.7.4'
29 | - name: Install github-pages gem
30 | run: |
31 | gem install github-pages
32 | gem update --system
33 | if: matrix.ruby != '2.7.4'
34 | - name: Install
35 | run: bundle install
36 | - name: Build jekyll site
37 | run: bundle exec jekyll build
38 | - name: Start Jekyll site
39 | run: timeout 10s bundle exec jekyll serve
40 | continue-on-error: true
41 |
--------------------------------------------------------------------------------
/_layouts/custom.liquid:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | ---
4 |
5 |
6 |
7 | {% unless page.hide_title %}
8 | {{ page.title }}
9 | {% endunless %}
10 | {% if page.is_post %}
11 | {% include blog/post_info.liquid author=page.author date=page.date %}
12 | {% endif %}
13 |
14 |
15 |
16 |
17 |
18 | {% if include.is_post %} {% include social/share_buttons.html %} {% endif %}
19 |
20 |
21 | {% capture tag_list %}{{ page.tags | join: "|"}}{% endcapture %}
22 | {% include default/tags_list.liquid tags=tag_list %}
23 |
24 |
25 |
26 |
27 |
28 | {% if site.post_navigation %}
29 | {% include blog/post_nav.liquid %}
30 | {% endif %}
31 |
32 |
33 | {% if site.cusdis_app_id %}{% include social/cusdis.liquid %}{% endif %}
34 |
35 |
36 | {% if site.disqus_shortname or site.theme_settings.disqus_shortname %}
37 | {% include social/disqus.liquid %}{% endif %}
38 |
--------------------------------------------------------------------------------
/_layouts/archive.liquid:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | ---
4 |
5 |
6 |
7 | {% assign postsByYear = site.posts | group_by_exp:"post", "post.date | date: '%Y'" %}
8 |
17 | {% for year in postsByYear %}
18 |
19 |
{{ year.name }} ({{year.items.size}})
20 |
30 |
31 | {% endfor %}
32 |
33 |
--------------------------------------------------------------------------------
/_sass/layouts/_tags.scss:
--------------------------------------------------------------------------------
1 | .tag-category-container {
2 | display: flex;
3 | flex-wrap: wrap;
4 | justify-content: center;
5 | align-items: flex-start;
6 | gap: 1em;
7 | width: 100%;
8 | padding-bottom: $padding-x-small;
9 | }
10 |
11 | .tag-list,
12 | .category-list {
13 | flex: 0 1 auto;
14 | padding-bottom: 0;
15 |
16 | a.button {
17 | margin: 0.1em;
18 | padding: 0.2em 0.4em;
19 | font-size: 0.9em;
20 | }
21 |
22 | p {
23 | margin: 0;
24 | padding: 0 0.2em 0 0;
25 | }
26 |
27 | ul {
28 | text-align: center;
29 | list-style: none;
30 |
31 | li, div {
32 | display: inline;
33 | }
34 |
35 | div.meta {
36 | margin-right: 0.5em;
37 | }
38 | }
39 | }
40 |
41 | .tag-anchor {
42 | margin-top: $padding-x-small;
43 |
44 | a {
45 | color: var(--link);
46 |
47 | &:hover {
48 | text-decoration: none;
49 | }
50 | }
51 | }
52 |
53 | .tag-posts {
54 | display: inline-block;
55 | width: 100%;
56 |
57 | .tag-title {
58 | margin-top: 0;
59 | margin-bottom: 0;
60 |
61 | a {
62 | margin-left: $padding-x-small;
63 | }
64 |
65 | .post-info {
66 | float: right;
67 | }
68 | }
69 |
70 | .meta {
71 | display: inline;
72 | float: right;
73 | font-size: 0.8em;
74 | line-height: normal;
75 | }
76 |
77 | @media screen and (max-width: $sm-break) {
78 | .meta {
79 | display: none;
80 | }
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/.github/tests/e2e/helpers.js:
--------------------------------------------------------------------------------
1 | const { test } = require('@playwright/test');
2 |
3 | /**
4 | * Helper to open mobile menu - forces menu visibility for mobile tests
5 | */
6 | async function openMobileMenu(page) {
7 | await page.waitForLoadState('domcontentloaded');
8 | await page.waitForTimeout(300);
9 |
10 | const menu = page.locator('nav ul');
11 | await menu.evaluate(el => {
12 | el.classList.remove('hide');
13 | el.style.opacity = '1';
14 | el.style.fontSize = '';
15 | });
16 |
17 | await page.waitForTimeout(200);
18 | }
19 |
20 | /**
21 | * Helper function to check if theme toggle is available on the page.
22 | * @param {import('@playwright/test').Page} page - Playwright page object
23 | * @returns {Promise} True if theme toggle exists
24 | */
25 | async function hasThemeToggle(page) {
26 | const themeToggle = page.locator('#theme-toggle');
27 | return await themeToggle.count() > 0;
28 | }
29 |
30 | /**
31 | * Helper function to check if gallery has images and skip test if not
32 | */
33 | async function checkGalleryHasImages(page) {
34 | const images = page.locator('.gallery img, .gallery-item img, img[class*="gallery"]');
35 | const count = await images.count();
36 | if (count === 0) {
37 | test.skip(true, 'Gallery has no images configured');
38 | }
39 | return { images, count };
40 | }
41 |
42 | module.exports = {
43 | openMobileMenu,
44 | hasThemeToggle,
45 | checkGalleryHasImages,
46 | };
47 |
48 |
--------------------------------------------------------------------------------
/_includes/blog/post_info.liquid:
--------------------------------------------------------------------------------
1 | {% assign author = site.data.authors[include.author] %}
2 | {% assign date = include.date | default: "today" | date: site.data.language.str_date_format | default: '%B %-d, %Y' %}
3 |
4 |
5 |
6 | {% if author %}
7 |
17 |
-
18 | {% endif %}
19 | {% assign date_month = date | date: "%m" | minus: 1 %}
20 |
{{ site.data.language.str_months[date_month] | default: date | date: "%B" }} {{ date | date: "%d, %Y" }}
21 |
22 | {% if include.last_modified %}
23 | {% assign last_modified_month = include.last_modified | date: "%m" | minus: 1 %}
24 |
{{ site.data.language.str_last_modified | default: "Last modified on" }} {{ site.data.language.str_months[last_modified_month] | default: include.last_modified | date: "%B" }} {{ include.last_modified | date: "%d, %Y" }}
25 | {% endif %}
26 |
27 |
--------------------------------------------------------------------------------
/_layouts/page.liquid:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | ---
4 |
5 |
6 |
7 | {% if page.hide_title %}
8 |
9 | {% else %}
10 |
{{ page.title }}
11 | {% if page.subtitle %}
12 |
{{ page.subtitle }}
13 | {% endif %}
14 | {% endif %}
15 |
16 |
17 |
18 | {% if page.bootstrap %}
19 |
20 | {% endif %}
21 | {{ content }}
22 | {% if page.bootstrap %}
23 |
24 | {% endif %}
25 |
26 |
27 |
28 |
29 | {% capture category_list %}{{ page.categories | join: "|" }}{% endcapture %}
30 | {% include default/category_list.liquid categories=category_list %}
31 |
32 |
33 | {% capture tag_list %}{{ page.tags | join: "|" }}{% endcapture %}
34 | {% include default/tags_list.liquid tags=tag_list %}
35 |
36 |
37 |
--------------------------------------------------------------------------------
/_includes/social/icons.liquid:
--------------------------------------------------------------------------------
1 | {% if site.data.social.rss or site.theme_settings.rss %}
2 |
3 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | {% endif %}
13 |
14 | {% for footer in site.data.icons %}
15 | {% unless footer[1] == nil %}
16 | {% assign brand = footer[0] %}
17 | {% assign id = footer[1] %}
18 | {% assign data = site.data.icons_builder[brand] %}
19 | {% if data.icon == nil %}
20 | {% assign icon = "fab fa-" | append: brand %}
21 | {% else %}
22 | {% assign icon = data.icon %}
23 | {% endif %}
24 |
25 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | {% endunless %}
36 | {% endfor %}
37 |
--------------------------------------------------------------------------------
/type-on-strap.gemspec:
--------------------------------------------------------------------------------
1 | # coding: utf-8
2 |
3 | Gem::Specification.new do |spec|
4 | spec.name = "type-on-strap"
5 | spec.version = "2.4.13"
6 | spec.authors = ["Sylhare", "Rohan Chandra"]
7 | spec.email = ["sylhare@outlook.com", "hellorohan@outlook.com"]
8 |
9 | spec.summary = "A simple and responsive jekyll theme template"
10 | spec.description = %q{A simple and responsive jekyll theme template based on type-theme. Great for blogs, easy to customize and responsive.}
11 | spec.homepage = "https://github.com/sylhare/Type-on-Strap"
12 | spec.license = "MIT"
13 |
14 | spec.rdoc_options = ["--charset=UTF-8"]
15 | spec.extra_rdoc_files = %w(README.md LICENSE)
16 | spec.metadata["plugin_type"] = "theme"
17 |
18 | spec.files = Dir["**/*"].select do |f|
19 | f.match(%r!^(assets/(js|css|fonts|data)/|_(includes|layouts|sass)/|_data/(icons_builder.yml|language.yml)|(LICENSE|README.md))!i)
20 | end
21 |
22 | spec.post_install_message = <<~MSG
23 | Thanks for using Type on strap v2+!
24 | MSG
25 |
26 | spec.required_ruby_version = ">= 2.7.2", "< 4.0"
27 |
28 | spec.add_runtime_dependency "jekyll", ">= 3.8", "< 5.0"
29 | spec.add_runtime_dependency "jekyll-feed", ">= 0.15.1", "<= 0.17"
30 | spec.add_runtime_dependency "jekyll-paginate", "~> 1.1.0"
31 | spec.add_runtime_dependency "jekyll-seo-tag", ">= 2.7.1", "<= 2.8"
32 | end
33 |
--------------------------------------------------------------------------------
/_layouts/post.liquid:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | ---
4 |
5 |
6 |
7 | {% if page.hide_title %}
8 |
9 | {% else %}
10 |
{{ page.title }}
11 | {% include blog/post_info.liquid author=page.author date=page.date last_modified=page.last_modified %}
12 | {% endif %}
13 |
14 |
15 |
16 |
17 | {% if page.bootstrap %}{% endif %}
18 | {{ content }}
19 | {% if page.bootstrap %}
{% endif %}
20 |
21 |
22 |
23 | {% include social/share_buttons.liquid %}
24 |
25 |
26 |
27 |
28 | {% capture category_list %}{{ page.categories | join: "|" }}{% endcapture %}
29 | {% include default/category_list.liquid categories=category_list %}
30 |
31 |
32 | {% capture tag_list %}{{ page.tags | join: "|" }}{% endcapture %}
33 | {% include default/tags_list.liquid tags=tag_list %}
34 |
35 |
36 |
37 |
38 | {% include blog/post_footer.liquid color=page.color img=page.feature-img %}
39 |
--------------------------------------------------------------------------------
/.github/scripts/validate-jekyll-search.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # Validate Simple-Jekyll-Search (sylhare fork)
3 |
4 | set -e
5 |
6 | # Get the script directory and project root
7 | SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8 | PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
9 | cd "$PROJECT_ROOT"
10 |
11 | # Colors for output
12 | GREEN='\033[0;32m'
13 | YELLOW='\033[1;33m'
14 | RED='\033[0;31m'
15 | NC='\033[0m'
16 |
17 | echo "=================================================="
18 | echo "Simple-Jekyll-Search Validation (v1.15.1)"
19 | echo "=================================================="
20 | echo ""
21 |
22 | echo "Note: Using sylhare's fork at https://github.com/sylhare/Simple-Jekyll-Search"
23 | echo ""
24 |
25 | if [ ! -f "assets/js/vendor/simple-jekyll-search.min.js" ]; then
26 | echo -e "${RED}❌ Local file not found${NC}"
27 | exit 1
28 | fi
29 |
30 | echo -n "Current version: "
31 | VERSION=$(head -3 assets/js/vendor/simple-jekyll-search.min.js | grep -o 'v[0-9]*\.[0-9]*\.[0-9]*' | head -1) || true
32 |
33 | if [ -n "$VERSION" ]; then
34 | echo "$VERSION"
35 | if [ "$VERSION" = "v1.15.1" ]; then
36 | echo -e "${GREEN}✅ Using expected version (v1.15.1)${NC}"
37 | else
38 | echo -e "${YELLOW}⚠️ Version mismatch - expected v1.15.1, found ${VERSION}${NC}"
39 | fi
40 | else
41 | echo "Unable to detect version"
42 | echo -e "${YELLOW}⚠️ Cannot verify version from file header${NC}"
43 | fi
44 |
45 | echo ""
46 | echo -e "${GREEN}✅ Simple-Jekyll-Search check complete${NC}"
47 | exit 0
48 |
49 |
--------------------------------------------------------------------------------
/_sass/layouts/_search.scss:
--------------------------------------------------------------------------------
1 | .search-bar {
2 | display: block;
3 | width: 100%;
4 | height: 46px;
5 | padding: 6px 12px;
6 | font-size: 18px;
7 | line-height: 1.43;
8 | color: var(--text);
9 | background: var(--background) none;
10 | border: 1px solid #ccc;
11 | border-radius: 4px;
12 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
13 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
14 | -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
15 | -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
16 | transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
17 |
18 | &:focus,
19 | &:hover {
20 | border-color: var(--link);
21 | outline: 0;
22 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px var(--link);
23 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px var(--link);
24 | filter: opacity(0.6);
25 | }
26 |
27 | &::-moz-placeholder {
28 | color: var(--meta);
29 | opacity: 0.7;
30 | }
31 |
32 | &:-ms-input-placeholder,
33 | &::-webkit-input-placeholder {
34 | color: var(--meta);
35 | opacity: 0.7;
36 | }
37 |
38 | input {
39 | &[type=text] {
40 | height: 46px;
41 | padding: 10px 16px;
42 | font-size: 18px;
43 | line-height: 1.33;
44 | border-radius: 6px;
45 | }
46 | }
47 | }
48 |
49 | .search-title a {
50 | h3 {
51 | margin: 0;
52 | color: var(--link);
53 | }
54 |
55 | &:hover {
56 | text-decoration: none;
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/_includes/blog/blog.liquid:
--------------------------------------------------------------------------------
1 |
2 | {% unless paginator.posts %}
3 |
4 | {% endunless %}
5 | {% for post in paginator.posts %}
6 |
7 | {% if post.thumbnail %}
8 |
9 |
10 |
11 |
12 |
13 | {% endif %}
14 |
15 |
16 |
21 | {% include blog/post_info.liquid author=post.author date=post.date %}
22 |
23 | {% if site.excerpt or site.theme_settings.excerpt %}
24 |
25 | {% if site.excerpt == "truncate" %}
26 | {{ post.content | strip_html | truncate: '250' | escape }}
27 | {% else %}
28 | {{ post.excerpt | strip_html | escape }}
29 | {% endif %}
30 |
31 | {% endif %}
32 |
33 |
34 | {% endfor %}
35 |
36 |
37 | {% include blog/blog_nav.liquid %}
38 |
--------------------------------------------------------------------------------
/.github/.travis.yml:
--------------------------------------------------------------------------------
1 | language: ruby
2 | rvm:
3 | # - 2.4.0
4 | # - 2.5.5
5 | - 2.6.3
6 |
7 | env:
8 | global:
9 | - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
10 |
11 | notifications:
12 | email: false
13 |
14 | before_install:
15 | # - gem update --system
16 | - gem install bundler
17 |
18 | script:
19 | - bundle install
20 | - bundle exec jekyll build
21 |
22 | after_script:
23 | - gem install type-on-strap
24 | - gem install jekyll-theme-type-on-strap
25 | - docker pull sylhare/type-on-strap
26 |
27 | branches:
28 | only:
29 | - master
30 | - /^v.*$/
31 |
32 | jobs:
33 | include:
34 | - stage: gem release
35 | rvm: 2.6.3
36 | script: echo "Deploying to rubygems.org ..."
37 | deploy:
38 | provider: rubygems
39 | gem: type-on-strap
40 | api_key:
41 | secure: DNJmBojaNJU0VFS2RE3Gy5CBnll1GXm7wtvxVMDfAqFNbCQdq2LR/v3LDNNm/ZEPMQfgdvlom8s5Pm26nnxbWFAAFcLTBD/cyJffvudgiCo3ONLkpm/PsVJiTyNbzZyb/XPE879S+LVtdKGlhLFSBaqUKfrhyRHT1W9LWrrjZMTQngUZCPlJmw6AsLvqT2x1CcBvVD2Q6tN8bOwq2blsDUtI6449ey1qWfgaERvM8KvF76aB32YQ7t8986NMkfHRDXPlgxm64pCc4kduBqAk9UHP5JAJzO4c3zEhX5Mb6Hc1CoxdgF3WSpmiN6HVVMaSC1byL4evocR+Enh5Gjc0VxEmIjCESpyheQG7YkkaadC7Lrvb18/qoSj0iDeB386k11XMiRN1dxu1CehPOkyQh5V5UEbZrm/9W9U/eQGgG1YoqicShcfxLDGeWRK4moLW8a8pvvBs+dduZyCWUgaC08S1u+HwvO8TpWcslr9/J05sRV4PAjk+u66+FVdILn0YWsbOKTezY/APTDfHnn/NQGZWXI4W5PMtf+KfPjL9kU0ouhqGpElGxrg2Hlw8kaPY3QrYLviVC7/DvWNWPGt9hmvcneuEg16zJTMoeNzckK5AUimyzvvjpVPVBh30T1YpZtcg+gFgesTHjyo/piFxEFX4ttYKoxvLMABONbniXcE=
42 | on:
43 | tags: true
44 | repo: sylhare/Type-on-Strap
45 |
--------------------------------------------------------------------------------
/_includes/social/giscus.liquid:
--------------------------------------------------------------------------------
1 |
17 |
18 |
--------------------------------------------------------------------------------
/.gitpod.yml:
--------------------------------------------------------------------------------
1 | # Documentation: https://www.gitpod.io/docs/references/gitpod-yml
2 | image: gitpod/workspace-full
3 |
4 | # Task(s)
5 | tasks:
6 | - before: |
7 | gem install bundle
8 | bundle config set --local path 'vendor/bundle'
9 | init: |
10 | bundle update
11 | bundle install
12 | - name: Run type on strap
13 | init: bundle install
14 | command: bundle exec jekyll serve
15 |
16 | # In case the user is trying to make a pull request, he needs GitLens, which by default is not installed. This code will help us install it.
17 | vscode:
18 | extensions:
19 | - eamodio.gitlens
20 |
21 | # Ports configuration, since Gitpod needs to open Type on Strap on a new tab when the server loads up.
22 | ports:
23 | - port: 4000
24 | onOpen: open-browser
25 |
26 | # For opening workspaces faster than ever, prebuilds are suggested
27 | github:
28 | prebuilds:
29 | # enable for the master/default branch (defaults to true)
30 | master: true
31 | # enable for all branches in this repo (defaults to false)
32 | branches: false
33 | # enable for pull requests coming from this repo (defaults to true)
34 | pullRequests: true
35 | # enable for pull requests coming from forks (defaults to false)
36 | pullRequestsFromForks: true
37 | # add a "Review in Gitpod" button as a comment to pull requests (defaults to true)
38 | addComment: false
39 | # add a "Review in Gitpod" button to pull requests (defaults to false)
40 | addBadge: true
41 | # add a label once the prebuild is ready to pull requests (defaults to false)
42 | addLabel: prebuilt
43 |
--------------------------------------------------------------------------------
/.github/workflows/gem-build.yml:
--------------------------------------------------------------------------------
1 | name: Type-on-strap CI
2 |
3 | on:
4 | pull_request:
5 | branches: [ master ]
6 |
7 | jobs:
8 | ruby:
9 |
10 | runs-on: ubuntu-latest
11 | strategy:
12 | matrix:
13 | ruby: [ '3.2', '3.3', '3.4' ]
14 |
15 | steps:
16 | - uses: actions/checkout@v4
17 | - name: Set up Ruby
18 | # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
19 | # change this to (see https://github.com/ruby/setup-ruby#versioning):
20 | uses: ruby/setup-ruby@v1
21 | with:
22 | ruby-version: ${{ matrix.ruby }}
23 | bundler-cache: true # runs 'bundle install' and caches installed gems automatically
24 | - name: Install
25 | run: bundle install
26 | - name: Build jekyll site
27 | run: bundle exec jekyll build
28 | - name: Start Jekyll site
29 | run: timeout 10s bundle exec jekyll serve
30 | continue-on-error: true
31 | - name: Build the gem
32 | continue-on-error: true
33 | run: |
34 | gem build *.gemspec
35 | echo `find . -name "*.gem" | tail -1 | awk -F"[/]" '{print $2}'`
36 | - name: Install theme gems
37 | run: |
38 | gem cleanup type-on-strap
39 | gem install type-on-strap --source "https://rubygems.org"
40 | gem install jekyll-theme-type-on-strap --source "https://rubygems.org"
41 | - name: GPR
42 | run: |
43 | gem cleanup type-on-strap
44 | gem install type-on-strap --version "2.4.11" --source "https://rubygems.pkg.github.com/sylhare"
45 |
--------------------------------------------------------------------------------
/_sass/type-on-strap.scss:
--------------------------------------------------------------------------------
1 | /* TYPE_ON_STRAP Main style sheet */
2 |
3 | /* Variables */
4 | // All the options to customize your theme in one file
5 | @import 'base/variables';
6 |
7 | /* External */
8 | // CSS from external sources
9 | @import 'external/reset';
10 | @import 'external/font-awesome';
11 | @import 'external/pacifico';
12 | @import 'external/katex';
13 | @import 'external/source-sans-pro';
14 |
15 | /* Base */
16 | // For general CSS in the theme
17 | @import 'base/global';
18 | @import 'base/highlight';
19 | @import 'base/utility';
20 |
21 | /* Includes */
22 | // Linked with the html in the _includes folder
23 | @import 'includes/post_nav';
24 | @import 'includes/footer';
25 | @import 'includes/navbar';
26 | @import 'includes/share_buttons';
27 | @import 'includes/blog_nav';
28 | @import 'includes/gallery';
29 | @import 'includes/portfolio';
30 | @import 'includes/aligner';
31 |
32 | /* Posts */
33 | // Linked with the html in the _layouts folder
34 | @import 'layouts/posts';
35 | @import 'layouts/categories';
36 | @import 'layouts/blog';
37 | @import 'layouts/page';
38 | @import 'layouts/tags';
39 | @import 'layouts/search';
40 |
41 | /**
42 |
43 | CUSTOM STYLING
44 |
45 | In the case you want to add your own style on top of the type-on-strap one.
46 | You can add a custom scss file using:
47 |
48 | @import 'custom';
49 |
50 | Put it right after this comment for your changes to be applied over the default style.
51 | (Once it processed into the assets/css/main.css by Jekyll at run time)
52 |
53 | Then create your _custom.scss right next to type-on-strap.scss and add in it all
54 | of the unique scss that your blog needs.
55 |
56 | */
57 |
--------------------------------------------------------------------------------
/.github/workflows/publish-build.yml:
--------------------------------------------------------------------------------
1 | name: Publish build
2 |
3 | on:
4 | workflow_dispatch:
5 | push:
6 | tags:
7 | - v*
8 |
9 | jobs:
10 | build:
11 | if: ${{ github.ref == 'refs/heads/master' }}
12 | name: Build
13 | runs-on: ubuntu-latest
14 | permissions:
15 | contents: read
16 | packages: write
17 |
18 | steps:
19 | - uses: actions/checkout@v4
20 | - name: Set up Ruby 3.4
21 | uses: ruby/setup-ruby@v1
22 | with:
23 | ruby-version: 3.4.0
24 | - name: Install
25 | run: bundle install
26 | - name: Build the gem
27 | run: |
28 | gem build *.gemspec
29 | echo `find . -name "*.gem" | tail -1 | awk -F"[/]" '{print $2}'`
30 | - name: Publish to GPR
31 | continue-on-error: true
32 | run: |
33 | echo ${{ github.repository_owner }}
34 | mkdir -p $HOME/.gem
35 | touch $HOME/.gem/credentials
36 | chmod 0600 $HOME/.gem/credentials
37 | printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
38 | gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
39 | env:
40 | GEM_HOST_API_KEY: "Bearer ${{secrets.GITHUB_TOKEN}}"
41 | OWNER: ${{ github.repository_owner }}
42 |
43 | - name: Publish to RubyGems
44 | run: |
45 | mkdir -p $HOME/.gem
46 | touch $HOME/.gem/credentials
47 | chmod 0600 $HOME/.gem/credentials
48 | printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
49 | wc -l $HOME/.gem/credentials
50 | gem push *.gem
51 | env:
52 | GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
53 |
--------------------------------------------------------------------------------
/.github/scripts/validate-masonry.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # Validate Masonry against CDN source
3 |
4 | set -e
5 |
6 | # Get the script directory and project root
7 | SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8 | PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
9 | cd "$PROJECT_ROOT"
10 |
11 | # Version configuration
12 | MASONRY_VERSION="4.2.2"
13 |
14 | # Colors for output
15 | GREEN='\033[0;32m'
16 | RED='\033[0;31m'
17 | NC='\033[0m'
18 |
19 | echo "=================================================="
20 | echo "Masonry Validation (v${MASONRY_VERSION})"
21 | echo "=================================================="
22 | echo ""
23 |
24 | # Function to validate a file
25 | validate_file() {
26 | local name=$1
27 | local local_file=$2
28 | local cdn_url=$3
29 |
30 | echo "Validating ${name}..."
31 |
32 | if [ ! -f "$local_file" ]; then
33 | echo -e "${RED}❌ Local file not found: ${local_file}${NC}"
34 | return 1
35 | fi
36 |
37 | LOCAL_SHA=$(shasum -a 256 "$local_file" | awk '{print $1}')
38 | CDN_SHA=$(curl -sL "$cdn_url" | shasum -a 256 | awk '{print $1}')
39 |
40 | echo " Local SHA256: $LOCAL_SHA"
41 | echo " CDN SHA256: $CDN_SHA"
42 |
43 | if [ "$LOCAL_SHA" = "$CDN_SHA" ]; then
44 | echo -e " ${GREEN}✅ Files match!${NC}"
45 | return 0
46 | else
47 | echo -e " ${RED}❌ Files DO NOT match!${NC}"
48 | return 1
49 | fi
50 | }
51 |
52 | if validate_file "Masonry" \
53 | "assets/js/vendor/masonry.pkgd.min.js" \
54 | "https://unpkg.com/masonry-layout@${MASONRY_VERSION}/dist/masonry.pkgd.min.js"; then
55 |
56 | echo ""
57 | echo -e "${GREEN}✅ Masonry validation passed!${NC}"
58 | exit 0
59 | else
60 | echo ""
61 | echo -e "${RED}❌ Masonry validation failed!${NC}"
62 | exit 1
63 | fi
64 |
65 |
--------------------------------------------------------------------------------
/assets/js/comments-lazy-load.min.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function t(t,e){const s=document.getElementById(t);if(!s||"true"!==s.getAttribute("data-lazy-load"))return;let n=!1;function c(){n||(n=!0,e(s))}if("IntersectionObserver"in window){const t=new IntersectionObserver((function(e){e.forEach((function(e){e.isIntersecting&&(c(),t.unobserve(s))}))}),{rootMargin:"400px"});t.observe(s)}else"complete"===document.readyState?c():window.addEventListener("load",c)}t("cusdis_thread",(function(t){const e=t.getAttribute("data-lang");if(e){const t=document.createElement("script");t.src="https://cusdis.com/js/widget/lang/"+e+".js",t.async=!0,document.body.appendChild(t)}const s=document.createElement("script");s.src="https://cusdis.com/js/cusdis.es.js",s.async=!0,document.body.appendChild(s)})),t("disqus_thread",(function(t){const e=t.getAttribute("data-shortname");if(!e)return void console.error("Disqus shortname not provided");window.disqus_shortname=e;const s=document.createElement("script");s.type="text/javascript",s.async=!0,s.src="//"+e+".disqus.com/embed.js",(document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0]).appendChild(s)})),t("giscus_thread",(function(t){const e=document.createElement("script");e.src="https://giscus.app/client.js",e.async=!0,e.crossOrigin="anonymous";const s=t.attributes;for(let t=0;t value !== undefined && value !== null)
7 | .map(([key, value]) => `${key}="${value}"`)
8 | .join(' ');
9 | }
10 |
11 | function cusdisContainer({ lazyLoad = 'true', lang } = {}) {
12 | const attrs = buildAttributes({
13 | id: 'cusdis_thread',
14 | 'data-lazy-load': lazyLoad,
15 | 'data-lang': lang,
16 | });
17 | return `
`;
18 | }
19 |
20 | function disqusContainer({ lazyLoad = 'true', shortname } = {}) {
21 | const attrs = buildAttributes({
22 | id: 'disqus_thread',
23 | 'data-lazy-load': lazyLoad,
24 | 'data-shortname': shortname,
25 | });
26 | return `
`;
27 | }
28 |
29 | function giscusContainer({ lazyLoad = 'true', repo, repoId, category, mapping, theme } = {}) {
30 | const attrs = buildAttributes({
31 | id: 'giscus_thread',
32 | 'data-lazy-load': lazyLoad,
33 | 'data-repo': repo,
34 | 'data-repo-id': repoId,
35 | 'data-category': category,
36 | 'data-mapping': mapping,
37 | 'data-theme': theme,
38 | });
39 | return `
`;
40 | }
41 |
42 | function utterancesContainer({ lazyLoad = 'true', repo, issueTerm, theme, label } = {}) {
43 | const attrs = buildAttributes({
44 | id: 'utterances_thread',
45 | 'data-lazy-load': lazyLoad,
46 | 'data-repo': repo,
47 | 'data-issue-term': issueTerm,
48 | 'data-theme': theme,
49 | 'data-label': label,
50 | });
51 | return `
`;
52 | }
53 |
54 | module.exports = {
55 | cusdisContainer,
56 | disqusContainer,
57 | giscusContainer,
58 | utterancesContainer,
59 | };
60 |
61 |
--------------------------------------------------------------------------------
/.github/scripts/validate-vendor.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # Local runner - validates all vendor dependencies at once
3 | # Use this for quick local testing
4 |
5 | set -e
6 |
7 | # Get the script directory and project root
8 | SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9 | PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
10 | cd "$PROJECT_ROOT"
11 |
12 | # Colors
13 | GREEN='\033[0;32m'
14 | RED='\033[0;31m'
15 | YELLOW='\033[1;33m'
16 | BLUE='\033[0;34m'
17 | NC='\033[0m'
18 |
19 | echo ""
20 | echo -e "${BLUE}=========================================="
21 | echo "Vendor Dependencies Validation"
22 | echo "==========================================${NC}"
23 | echo ""
24 |
25 | FAILED=0
26 | PASSED=0
27 |
28 | # Make all scripts executable
29 | chmod +x .github/scripts/validate-*.sh
30 |
31 | # Run each validation
32 | run_validation() {
33 | local script=$1
34 | local name=$2
35 |
36 | echo -e "${YELLOW}▶ ${name}${NC}"
37 | if "$script" 2>&1 | sed 's/^/ /'; then
38 | ((PASSED++))
39 | else
40 | ((FAILED++))
41 | fi
42 | echo ""
43 | }
44 |
45 | run_validation ".github/scripts/validate-katex.sh" "KaTeX"
46 | run_validation ".github/scripts/validate-mermaid.sh" "Mermaid"
47 | run_validation ".github/scripts/validate-masonry.sh" "Masonry"
48 | run_validation ".github/scripts/validate-imagesloaded.sh" "imagesLoaded"
49 | run_validation ".github/scripts/validate-jekyll-search.sh" "Simple-Jekyll-Search"
50 |
51 | echo "=========================================="
52 | echo "Summary"
53 | echo "=========================================="
54 | echo -e "${GREEN}Passed: ${PASSED}${NC}"
55 | echo -e "${RED}Failed: ${FAILED}${NC}"
56 | echo ""
57 |
58 | if [ $FAILED -eq 0 ]; then
59 | echo -e "${GREEN}✅ All vendor dependencies validated successfully!${NC}"
60 | exit 0
61 | else
62 | echo -e "${RED}❌ ${FAILED} validation(s) failed. Please re-download the failed files.${NC}"
63 | exit 1
64 | fi
65 |
66 |
--------------------------------------------------------------------------------
/_includes/default/navbar.liquid:
--------------------------------------------------------------------------------
1 |
48 |
--------------------------------------------------------------------------------
/.github/scripts/validate-mermaid.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # Validate Mermaid against CDN source
3 |
4 | set -e
5 |
6 | # Get the script directory and project root
7 | SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8 | PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
9 | cd "$PROJECT_ROOT"
10 |
11 | # Version configuration
12 | MERMAID_VERSION="11.12.0"
13 |
14 | # Colors for output
15 | GREEN='\033[0;32m'
16 | RED='\033[0;31m'
17 | NC='\033[0m'
18 |
19 | echo "=================================================="
20 | echo "Mermaid Validation (v${MERMAID_VERSION})"
21 | echo "=================================================="
22 | echo ""
23 |
24 | # Function to validate a file
25 | validate_file() {
26 | local name=$1
27 | local local_file=$2
28 | local cdn_url=$3
29 |
30 | echo "Validating ${name}..."
31 |
32 | if [ ! -f "$local_file" ]; then
33 | echo -e "${RED}❌ Local file not found: ${local_file}${NC}"
34 | return 1
35 | fi
36 |
37 | LOCAL_SHA=$(shasum -a 256 "$local_file" | awk '{print $1}')
38 | CDN_SHA=$(curl -sL "$cdn_url" | shasum -a 256 | awk '{print $1}')
39 |
40 | echo " Local SHA256: $LOCAL_SHA"
41 | echo " CDN SHA256: $CDN_SHA"
42 |
43 | if [ "$LOCAL_SHA" = "$CDN_SHA" ]; then
44 | echo -e " ${GREEN}✅ Files match!${NC}"
45 | return 0
46 | else
47 | echo -e " ${RED}❌ Files DO NOT match!${NC}"
48 | return 1
49 | fi
50 | }
51 |
52 | if validate_file "Mermaid" \
53 | "assets/js/vendor/mermaid.min.js" \
54 | "https://cdn.jsdelivr.net/npm/mermaid@${MERMAID_VERSION}/dist/mermaid.min.js"; then
55 |
56 | echo ""
57 | echo "Version in file:"
58 | grep -o 'version:"[0-9]*\.[0-9]*\.[0-9]*"' assets/js/vendor/mermaid.min.js | head -1 || echo " Not found"
59 | echo ""
60 |
61 | echo -e "${GREEN}✅ Mermaid validation passed!${NC}"
62 | exit 0
63 | else
64 | echo ""
65 | echo -e "${RED}❌ Mermaid validation failed!${NC}"
66 | exit 1
67 | fi
68 |
69 |
--------------------------------------------------------------------------------
/_includes/blog/blog_nav.liquid:
--------------------------------------------------------------------------------
1 | {% if paginator.total_pages > 1 %}
2 |
43 | {% endif %}
44 |
--------------------------------------------------------------------------------
/.github/tests/playwright.config.js:
--------------------------------------------------------------------------------
1 | const { defineConfig, devices } = require('@playwright/test');
2 |
3 | /**
4 | * Playwright configuration for Type-on-Strap theme e2e tests
5 | * @see https://playwright.dev/docs/test-configuration
6 | */
7 | module.exports = defineConfig({
8 | testDir: './e2e',
9 | timeout: 30 * 1000, // Maximum time one test can run
10 | fullyParallel: true,
11 | forbidOnly: !!process.env.CI,
12 | retries: process.env.CI ? 2 : 0,
13 | workers: process.env.CI ? 1 : undefined,
14 | reporter: [
15 | ['html', { outputFolder: 'playwright-report' }],
16 | ['list'],
17 | ],
18 | use: {
19 | // Base URL for tests
20 | // Note: Site is served from _site/ root, but links contain /Type-on-Strap/ prefix
21 | baseURL: process.env.BASE_URL || 'http://localhost:4000',
22 | trace: 'on-first-retry',
23 | screenshot: 'only-on-failure',
24 | video: 'retain-on-failure',
25 | },
26 | projects: [
27 | {
28 | name: 'chromium',
29 | use: { ...devices['Desktop Chrome'] },
30 | grep: /@desktop/,
31 | grepInvert: /@mobile/,
32 | },
33 | {
34 | name: 'firefox',
35 | use: { ...devices['Desktop Firefox'] },
36 | grep: /@desktop/,
37 | grepInvert: /@mobile/,
38 | },
39 | {
40 | name: 'webkit',
41 | use: { ...devices['Desktop Safari'] },
42 | grep: /@desktop/,
43 | grepInvert: /@mobile/,
44 | },
45 | // Mobile tests
46 | {
47 | name: 'mobile-chrome',
48 | use: { ...devices['Pixel 5'] },
49 | grep: /@mobile/,
50 | grepInvert: /@desktop/,
51 | },
52 | {
53 | name: 'mobile-safari',
54 | use: { ...devices['iPhone 12'] },
55 | grep: /@mobile/,
56 | grepInvert: /@desktop/,
57 | },
58 | ],
59 | webServer: {
60 | command: 'cd ../.. && bundle exec jekyll build --baseurl "" --quiet && cd .github/tests && npm run server',
61 | url: 'http://localhost:4000',
62 | reuseExistingServer: !process.env.CI,
63 | timeout: 120 * 1000,
64 | },
65 | });
66 |
67 |
--------------------------------------------------------------------------------
/_data/comments.yml:
--------------------------------------------------------------------------------
1 | # Comments configuration
2 | # Configure different comment systems here
3 |
4 | # Disqus configuration
5 | disqus:
6 | shortname: # Your Disqus shortname
7 |
8 | # Cusdis configuration
9 | cusdis:
10 | app_id: # Your Cusdis app ID
11 | lang: # Language code (e.g., zh-cn, es, tr, pt-BR)
12 |
13 | # Utterances configuration
14 | utterances:
15 | repo: # Your public comments repository (e.g. owner/repo)
16 | issue-term: # Issue term (e.g. "comment" - considers issues with this word in the title as comments)
17 | theme: # OPTIONAL: Take the `color_theme` by default, or set a custom one like github-dark-orange
18 | label: # OPTIONAL: Adds an issue label in the issue
19 |
20 | # Giscus configuration
21 | giscus:
22 | repo: # Your public comments repository (e.g. owner/repo)
23 | repo-id: # Your repo id, go to https://giscus.app to check it
24 | category: # Category to search discussions. When removed, discussions will be searched in all categories
25 | category-id: # Your category id, go to https://giscus.app to check it
26 | mapping: # Discussion mapping (e.g. pathname, url, title, og:title)
27 | term: # OPTIONAL: Some mappings require specific term, go to https://giscus.app to check it
28 | strict: 0 # OPTIONAL: Avoid mismatches on similar titles (0 or 1)
29 | reactions-enabled: 1 # OPTIONAL: Enable reactions (0 or 1)
30 | emit-metadata: 0 # OPTIONAL: Emit discussion metadata (0 or 1)
31 | input-position: bottom # OPTIONAL: Place the comment box (top or bottom)
32 | theme: # OPTIONAL: Take the `color_theme` by default, or set a custom one like dark_dimmed
33 | lang: en # OPTIONAL: Choose the language. "en" is used by default
34 | loading: # OPTIONAL: Loading behavior (lazy or eager)
--------------------------------------------------------------------------------
/assets/js/partials/cookie_consent_init.js:
--------------------------------------------------------------------------------
1 | /* @preserve Cookie Consent Init */
2 | /*
3 | * This script is used to display a cookie consent banner.
4 | * The variables isCookieConsent, cookieName, analyticsName are defined in head.liquid from the _config.yml
5 | * The variables cookieNotice and cookieNoticeAccept are defined in head.liquid from the _data/translations.yml
6 | */
7 | function createCookie(name, value, days) {
8 | var expires = "";
9 | if (days) {
10 | var date = new Date();
11 | date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
12 | expires = "; expires=" + date.toUTCString();
13 | }
14 | document.cookie = `${name}=${value}${expires}; path=/`;
15 | }
16 |
17 | function readCookie(name) {
18 | var nameEQ = name + "=";
19 | var ca = document.cookie.split(';');
20 | for (var i = 0; i < ca.length; i++) {
21 | var c = ca[i];
22 | while (c.charAt(0) === ' ') c = c.substring(1, c.length);
23 | if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
24 | }
25 | return null;
26 | }
27 |
28 | function addCookieConsentListener() {
29 | document.getElementById('cookie-notice-accept').addEventListener("click", function () {
30 | createCookie(cookieName, 'true', 31);
31 | document.getElementById('cookie-notice').style.display = 'none';
32 | location.reload();
33 | });
34 | }
35 |
36 | function googleAnalytics() {
37 | if (analyticsName.toLowerCase() !== '') {
38 | // Google tag manager
39 | window.dataLayer = window.dataLayer || [];
40 | function gtag() { dataLayer.push(arguments); }
41 | gtag('js', new Date());
42 | gtag('config', analyticsName, { 'anonymize_ip': true });
43 | if (analyticsNameGA4) {
44 | gtag('config', analyticsNameGA4, { 'anonymize_ip': true });
45 | }
46 | }
47 | }
48 |
49 | if (isCookieConsent.toLowerCase() === 'true') {
50 | addCookieConsentListener();
51 | if (readCookie(cookieName) === 'true') {
52 | googleAnalytics();
53 | } else {
54 | document.getElementById('cookie-notice').style.display = 'block';
55 | }
56 | } else {
57 | googleAnalytics();
58 | }
59 |
60 |
61 |
--------------------------------------------------------------------------------
/_data/icons_builder.yml:
--------------------------------------------------------------------------------
1 | # Default data to build the footer icons
2 | # DO NOT MODIFY, use the "icons.yml" instead.
3 | behance:
4 | pre: "https://www.behance.net/"
5 | bitbucket:
6 | pre: "https://bitbucket.org/"
7 | calendly:
8 | pre: "https://calendly.com/"
9 | icon: "far fa-calendar-plus"
10 | dribbble:
11 | pre: "https://www.dribbble.com/"
12 | facebook:
13 | pre: "https://www.facebook.com/"
14 | flickr:
15 | pre: "https://flickr.com/photos/"
16 | github:
17 | pre: "https://github.com/"
18 | gitlab:
19 | pre: "https://gitlab.com/"
20 | google-scholar:
21 | pre: "https://scholar.google.com/citations?hl=en&user="
22 | icon: "fas fa-user-graduate"
23 | instagram:
24 | pre: "https://instagram.com/"
25 | hacker-news:
26 | pre: "https://news.ycombinator.com/user?id="
27 | keybase:
28 | pre: "https://keybase.io/"
29 | linkedin:
30 | pre: "https://www.linkedin.com/in/"
31 | mail:
32 | pre: "mailto:"
33 | icon: "fas fa-envelope"
34 | map:
35 | pre: "https://www.openstreetmap.org/#map=15/"
36 | icon: "fas fa-map-marked"
37 | mastodon:
38 | pre: "https://"
39 | matrix:
40 | pre: "https://matrix.to/#/"
41 | icon: "fab fa-connectdevelop"
42 | medium:
43 | pre: "https://medium.com/@"
44 | patreon:
45 | pre: "https://www.patreon.com/"
46 | phone:
47 | pre: "tel:"
48 | icon: "fas fa-phone"
49 | pinterest:
50 | pre: "https://www.pinterest.com/"
51 | reddit:
52 | pre: "https://www.reddit.com/user/"
53 | soundcloud:
54 | pre: "https://soundcloud.com/"
55 | sms:
56 | pre: "sms:"
57 | pos: "?body=Hi"
58 | icon: "fas fa-sms"
59 | stack-exchange:
60 | pre: "https://stackexchange.com/users/"
61 | stack-overflow:
62 | pre: "https://stackoverflow.com/users/"
63 | steam:
64 | pre: "https://steamcommunity.com/id/"
65 | telegram:
66 | pre: "https://t.me/"
67 | tumblr:
68 | pre: "https://"
69 | pos: ".tumblr.com/"
70 | twitch:
71 | pre: "https://twitch.tv/"
72 | twitter:
73 | pre: "https://twitter.com/"
74 | vimeo:
75 | pre: "https://vimeo.com/"
76 | vk:
77 | pre: "https://vk.com/"
78 | wordpress:
79 | pre: "https://"
80 | pos: ".wordpress.com/"
81 | youtube:
82 | pre: "https://www.youtube.com/channel/"
83 |
--------------------------------------------------------------------------------
/assets/js/partials/dark-mode.js:
--------------------------------------------------------------------------------
1 | /* @preserve Dark mode Init */
2 | /*
3 | * There are two colour palettes on CSS for the data-theme: 'light' and 'dark'.
4 | * Initially the script checks if a theme is set in session storage and
5 | * alternatively listens to a MediaQuery callback looking for "prefers-color-scheme: dark".
6 | *
7 | * The variables darkBtn and lightBtn are defined in head.liquid from the _data/translations.yml
8 | * The isAutoTheme is defined in head.liquid from the _config.yml
9 | */
10 |
11 | const themeButton = {
12 | 'light': ` ${darkBtn} `,
13 | 'dark': ` ${lightBtn} `
14 | };
15 |
16 | function currentTheme(){
17 | return localStorage.getItem('theme');
18 | }
19 |
20 | function setMode(theme) {
21 | document.documentElement.setAttribute('data-theme', theme);
22 | localStorage.setItem('theme', theme);
23 | const toggle = document.getElementById('theme-toggle');
24 | if (toggle) {
25 | toggle.innerHTML = themeButton[theme];
26 | }
27 | }
28 |
29 | function themeToggle() {
30 | let sessionPrefers = currentTheme();
31 | if (sessionPrefers === 'light') {
32 | setMode('dark');
33 | } else {
34 | setMode('light');
35 | }
36 | }
37 |
38 | function bootstrapTheme() {
39 | if (isAutoTheme) {
40 | if (!currentTheme()) {
41 | // Load browser's preference
42 | let browserPrefersDark = window.matchMedia('(prefers-color-scheme: dark)');
43 | if (browserPrefersDark.matches) localStorage.setItem('theme', 'dark');
44 | browserPrefersDark.addEventListener('change', () => {
45 | if (browserPrefersDark.matches) localStorage.setItem('theme', 'dark');
46 | });
47 | }
48 | // Load theme
49 | let sessionPrefers = currentTheme();
50 | setMode(sessionPrefers ? sessionPrefers : 'light');
51 | }
52 | }
53 |
54 | // Init
55 | (function () {
56 | bootstrapTheme();
57 | })()
58 |
--------------------------------------------------------------------------------
/_sass/external/_source-sans-pro.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/)
3 | * (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | $ssp-font-path: "../../assets/fonts/source-sans-pro" !default;
7 | /* latin */
8 | @font-face {
9 | font-family: 'Source Sans Pro';
10 | font-style: italic;
11 | font-display: auto;
12 | font-weight: 400;
13 | src: local("Source Sans Pro Italic"), local("SourceSansPro-Italic"), url('#{$ssp-font-path}/source-sans-pro-italic.woff2') format("woff2");
14 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
15 | }
16 |
17 | /* latin */
18 | @font-face {
19 | font-family: 'Source Sans Pro';
20 | font-style: italic;
21 | font-display: auto;
22 | font-weight: 700;
23 | src: local("Source Sans Pro Bold Italic"), local("SourceSansPro-BoldItalic"), url('#{$ssp-font-path}/source-sans-pro-bold-italic.woff2') format("woff2");
24 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
25 | }
26 |
27 | /* latin */
28 | @font-face {
29 | font-family: 'Source Sans Pro';
30 | font-style: normal;
31 | font-display: auto;
32 | font-weight: 400;
33 | src: local("Source Sans Pro Regular"), local("SourceSansPro-Regular"), url('#{$ssp-font-path}/source-sans-pro-regular.woff2') format("woff2");
34 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
35 | }
36 |
37 | /* latin */
38 | @font-face {
39 | font-family: 'Source Sans Pro';
40 | font-style: normal;
41 | font-display: auto;
42 | font-weight: 700;
43 | src: local("Source Sans Pro Bold"), local("SourceSansPro-Bold"), url('#{$ssp-font-path}/source-sans-pro-bold.woff2') format("woff2");
44 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
45 | }
46 |
--------------------------------------------------------------------------------
/_posts/2021-04-27-dark-mode.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Dark Mode
4 | tags: [Katex, Mermaid, Markdown]
5 | categories: Demo
6 | ---
7 |
8 | More colors with less light. Click the **half-moon** most top-right button to turn the lights ON/OFF.
9 | Here is a bit of everything, so you can check how the theme look, have fun! 👌
10 |
11 |
12 | # Headers
13 | ## Level 2
14 | ### Level 3
15 | #### Level 4
16 | ##### Level 5
17 | ###### Level 6
18 |
19 | # [Headers with links](http://localhost)
20 | ## [Level 2](http://localhost)
21 | ### [Level 3](http://localhost)
22 | #### [Level 4](http://localhost)
23 | ##### [Level 5](http://localhost)
24 | ###### [Level 6](http://localhost)
25 |
26 | ## Code highlight
27 | Mode specific code highlighting themes. [Kramdown](https://kramdown.gettalong.org/) which is responsible for the color highlighting may be more limited than your IDE.
28 |
29 | ```python
30 | #!/usr/bin/env python
31 | """
32 | Test file for syntax
33 | """
34 | # TODO: Use dark mode
35 | from sys import os
36 |
37 | def foo(bar):
38 | try:
39 | print(bar)
40 | except NameError:
41 | print("Variable bar is not defined")
42 |
43 |
44 | class Bar(object):
45 | def __init__(self):
46 | foo(1)
47 | self.octal = '\04'
48 | self.text = """Example \t\n"""
49 |
50 | def __exit__(self, *args):
51 | print('exit\u1111\xFF')
52 | pass
53 |
54 | @staticmethod
55 | def example():
56 | assert (1.0 and 2L) or True
57 | return { "example": [(1,), (r'raw', u'unicode')]}
58 | ```
59 |
60 | ## Tables
61 |
62 | | hex | dec | oct |
63 | | - | - | - |
64 | | 0 | 0 | 0 |
65 | | 5 | 5 | 5 |
66 | | A | 10 | 12 |
67 | | F | 16 | 20 |
68 | | F5 | 21 | 25 |
69 |
70 | ## KaTeX
71 |
72 | Some KaTeX diagrams to check in dark mode:
73 |
74 | $$
75 | \begin{CD}
76 | A @>a>> B \\
77 | @VbVV @AAcA \\
78 | C @= D
79 | \end{CD}
80 | $$
81 |
82 | $$\utilde{AB}$$
83 |
84 | ## Mermaid
85 |
86 |
87 | flowchart TB
88 | c1-->a2
89 | subgraph one
90 | a1-->a2
91 | end
92 | subgraph two
93 | b1-->b2
94 | end
95 | subgraph three
96 | c1-->c2
97 | end
98 |
99 |
--------------------------------------------------------------------------------
/.github/scripts/validate-katex.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # Validate KaTeX against CDN source
3 |
4 | set -e
5 |
6 | # Get the script directory and project root
7 | SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8 | PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
9 | cd "$PROJECT_ROOT"
10 |
11 | # Version configuration
12 | KATEX_VERSION="0.16.25"
13 |
14 | # Colors for output
15 | GREEN='\033[0;32m'
16 | RED='\033[0;31m'
17 | NC='\033[0m'
18 |
19 | echo "=================================================="
20 | echo "KaTeX Validation (v${KATEX_VERSION})"
21 | echo "=================================================="
22 | echo ""
23 |
24 | # Function to validate a file
25 | validate_file() {
26 | local name=$1
27 | local local_file=$2
28 | local cdn_url=$3
29 |
30 | echo "Validating ${name}..."
31 |
32 | if [ ! -f "$local_file" ]; then
33 | echo -e "${RED}❌ Local file not found: ${local_file}${NC}"
34 | return 1
35 | fi
36 |
37 | LOCAL_SHA=$(shasum -a 256 "$local_file" | awk '{print $1}')
38 | CDN_SHA=$(curl -sL "$cdn_url" | shasum -a 256 | awk '{print $1}')
39 |
40 | echo " Local SHA256: $LOCAL_SHA"
41 | echo " CDN SHA256: $CDN_SHA"
42 |
43 | if [ "$LOCAL_SHA" = "$CDN_SHA" ]; then
44 | echo -e " ${GREEN}✅ Files match!${NC}"
45 | return 0
46 | else
47 | echo -e " ${RED}❌ Files DO NOT match!${NC}"
48 | return 1
49 | fi
50 | }
51 |
52 | FAILED=0
53 |
54 | if ! validate_file "KaTeX main library" \
55 | "assets/js/vendor/katex.min.js" \
56 | "https://cdn.jsdelivr.net/npm/katex@${KATEX_VERSION}/dist/katex.min.js"; then
57 | ((FAILED++))
58 | fi
59 | echo ""
60 |
61 | if ! validate_file "KaTeX auto-render" \
62 | "assets/js/vendor/katex.auto-render.min.js" \
63 | "https://cdn.jsdelivr.net/npm/katex@${KATEX_VERSION}/dist/contrib/auto-render.min.js"; then
64 | ((FAILED++))
65 | fi
66 | echo ""
67 |
68 | echo "Version in file:"
69 | head -20 assets/js/vendor/katex.min.js | grep -o 'version:"[^"]*"' | head -1 || echo " Not found"
70 | echo ""
71 |
72 | if [ $FAILED -eq 0 ]; then
73 | echo -e "${GREEN}✅ KaTeX validation passed!${NC}"
74 | exit 0
75 | else
76 | echo -e "${RED}❌ KaTeX validation failed!${NC}"
77 | exit 1
78 | fi
79 |
80 |
--------------------------------------------------------------------------------
/_sass/base/_utility.scss:
--------------------------------------------------------------------------------
1 | // Mix-ins
2 | %padding-nav {
3 | padding: $padding-small $padding-x-large;
4 | @media (max-width: $xl-break) {
5 | padding: $padding-small ($padding-large * 2);
6 | }
7 | @media (max-width: $l-break) {
8 | padding: $padding-small $padding-large;
9 | }
10 | @media (max-width: $m-break) {
11 | padding: $padding-small $padding-medium;
12 | }
13 | @media (max-width: $sm-break) {
14 | padding: $padding-small $padding-x-small;
15 | }
16 | }
17 |
18 | %padding-post {
19 | padding: $padding-x-small $padding-x-large;
20 | @media (max-width: $xl-break) {
21 | padding: $padding-x-small ($padding-large * 2);
22 | }
23 | @media (max-width: $l-break) {
24 | padding: $padding-x-small $padding-large;
25 | }
26 | @media (max-width: $m-break) {
27 | padding: $padding-x-small $padding-medium;
28 | }
29 | @media (max-width: $sm-break) {
30 | padding: $padding-x-small $padding-small;
31 | }
32 | }
33 |
34 | %padding-header {
35 | padding: $padding-medium $padding-large;
36 | @media (min-width: $xl-break) {
37 | padding: $padding-large $padding-large;
38 | }
39 | @media (max-width: $sm-break) {
40 | padding: $padding-large;
41 | }
42 | }
43 |
44 | .txt-shadow {
45 | text-shadow: 0.07em 0.10em 0.15em var(--text-shadow);
46 | }
47 |
48 | .subtle-txt-shadow {
49 | text-shadow: 1px 1px 2px var(--text-shadow);
50 | }
51 |
52 | // Buttons
53 | .button {
54 | border-radius: 0.3em;
55 | border: 1px solid;
56 | display: inline-block;
57 | margin: 1em 0;
58 | padding: 0.5em 0.75em;
59 | }
60 |
61 | a.button {
62 | @extend .button-link;
63 | }
64 |
65 | .button-link {
66 | &:hover {
67 | background: var(--link);
68 | border: 1px solid var(--link);
69 | color: var(--background);
70 | text-decoration: none;
71 | filter: none;
72 | }
73 | }
74 |
75 | .body-link {
76 | &:hover {
77 | text-decoration: underline;
78 | filter: brightness(0.85);
79 | }
80 | }
81 |
82 | .post-link {
83 | &:hover {
84 | text-decoration: none;
85 | color: var(--link);
86 | }
87 | }
88 |
89 | // States
90 | .disabled {
91 | opacity: 0.7;
92 | }
93 |
94 | // Custom
95 | .text-center {
96 | text-align: center;
97 | }
98 |
99 | .right {
100 | float: right;
101 | }
102 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/_functions.scss:
--------------------------------------------------------------------------------
1 | // functions
2 | // --------------------------
3 |
4 | // fa-content: convenience function used to set content property
5 | @function fa-content($fa-var) {
6 | @return unquote("\"#{ $fa-var }\"");
7 | }
8 |
9 | // fa-divide: Originally obtained from the Bootstrap https://github.com/twbs/bootstrap
10 | //
11 | // Licensed under: The MIT License (MIT)
12 | //
13 | // Copyright (c) 2011-2021 Twitter, Inc.
14 | // Copyright (c) 2011-2021 The Bootstrap Authors
15 | //
16 | // Permission is hereby granted, free of charge, to any person obtaining a copy
17 | // of this software and associated documentation files (the "Software"), to deal
18 | // in the Software without restriction, including without limitation the rights
19 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20 | // copies of the Software, and to permit persons to whom the Software is
21 | // furnished to do so, subject to the following conditions:
22 | //
23 | // The above copyright notice and this permission notice shall be included in
24 | // all copies or substantial portions of the Software.
25 | //
26 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
32 | // THE SOFTWARE.
33 |
34 | @function fa-divide($dividend, $divisor, $precision: 10) {
35 | $sign: if($dividend > 0 and $divisor > 0, 1, -1);
36 | $dividend: abs($dividend);
37 | $divisor: abs($divisor);
38 | $quotient: 0;
39 | $remainder: $dividend;
40 | @if $dividend == 0 {
41 | @return 0;
42 | }
43 | @if $divisor == 0 {
44 | @error "Cannot divide by 0";
45 | }
46 | @if $divisor == 1 {
47 | @return $dividend;
48 | }
49 | @while $remainder >= $divisor {
50 | $quotient: $quotient + 1;
51 | $remainder: $remainder - $divisor;
52 | }
53 | @if $remainder > 0 and $precision > 0 {
54 | $remainder: fa-divide($remainder * 10, $divisor, $precision - 1) * .1;
55 | }
56 | @return ($quotient + $remainder) * $sign;
57 | }
58 |
--------------------------------------------------------------------------------
/_sass/external/font-awesome/_mixins.scss:
--------------------------------------------------------------------------------
1 | // mixins
2 | // --------------------------
3 |
4 | // base rendering for an icon
5 | @mixin fa-icon {
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | display: inline-block;
9 | font-style: normal;
10 | font-variant: normal;
11 | font-weight: normal;
12 | line-height: 1;
13 | }
14 |
15 | // sets relative font-sizing and alignment (in _sizing)
16 | @mixin fa-size ($font-size) {
17 | font-size: fa-divide($font-size, $fa-size-scale-base) * 1em; // converts step in sizing scale into an em-based value that's relative to the scale's base
18 | line-height: fa-divide(1, $font-size) * 1em; // sets the line-height of the icon back to that of it's parent
19 | vertical-align: (fa-divide(6, $font-size) - fa-divide(3, 8)) * 1em; // vertically centers the icon taking into account the surrounding text's descender
20 | }
21 |
22 | // only display content to screen readers
23 | // see: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/
24 | // see: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/
25 | @mixin fa-sr-only() {
26 | position: absolute;
27 | width: 1px;
28 | height: 1px;
29 | padding: 0;
30 | margin: -1px;
31 | overflow: hidden;
32 | clip: rect(0, 0, 0, 0);
33 | white-space: nowrap;
34 | border-width: 0;
35 | }
36 |
37 | // use in conjunction with .sr-only to only display content when it's focused
38 | @mixin fa-sr-only-focusable() {
39 | &:not(:focus) {
40 | @include fa-sr-only();
41 | }
42 | }
43 |
44 | // sets a specific icon family to use alongside style + icon mixins
45 | @mixin fa-family-classic() {
46 | @extend .fa-classic;
47 | }
48 |
49 | // convenience mixins for declaring pseudo-elements by CSS variable,
50 | // including all style-specific font properties
51 | @mixin fa-icon-solid($fa-var) {
52 | @extend .fa-solid;
53 |
54 | & { #{$fa-icon-property}: unquote("\"#{ $fa-var }\""); #{$fa-duotone-icon-property}: unquote("\"#{ $fa-var }#{ $fa-var }\""); }
55 | }
56 | @mixin fa-icon-regular($fa-var) {
57 | @extend .fa-regular;
58 |
59 | & { #{$fa-icon-property}: unquote("\"#{ $fa-var }\""); #{$fa-duotone-icon-property}: unquote("\"#{ $fa-var }#{ $fa-var }\""); }
60 | }
61 | @mixin fa-icon-brands($fa-var) {
62 | @extend .fa-brands;
63 |
64 | & { #{$fa-icon-property}: unquote("\"#{ $fa-var }\""); #{$fa-duotone-icon-property}: unquote("\"#{ $fa-var }#{ $fa-var }\""); }
65 | }
66 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | # SITE CONFIGURATION
2 | baseurl: "/Type-on-Strap"
3 | url: "https://sylhare.github.io"
4 |
5 | # THEME-SPECIFIC CONFIGURATION
6 | title: Type on Strap # site's title
7 | description: "A website with blog posts and pages" # used by search engines
8 | avatar: assets/img/triangle.png # Empty for no avatar in navbar
9 | favicon: assets/favicon.ico # Icon displayed in the tab
10 |
11 | # Header and footer text
12 | header_text: Change header_text in _config.yml # Change Blog header text
13 | header_feature_image: assets/img/header/triangular.jpeg
14 | header_feature_image_responsive: true
15 | footer_text: >
16 | Powered by Jekyll with Type on Strap
17 |
18 | # Blog
19 | excerpt: true # Or "truncate" (first 250 characters), "false" to disable
20 | post_navigation: true
21 | color_image: /assets/img/lineart.png # A bit transparent for color posts.
22 |
23 | # Features
24 | # More in the _data folder for comments, share buttons, author and language
25 | # For layout customization, go to the "_sass > base" folder, and check "_variables.scss"
26 | katex: true # Enable if using math markup
27 | mermaid: default # Enable mermaid-js for diagrams, use theme: base, forest, dark, default, neutral
28 | google_analytics: # Measurement ID, e.g. "G-00000"
29 | cookie_consent: false # To respect the usage of cookies
30 | color_theme: auto # auto, dark or light
31 |
32 | # PAGINATION
33 | paginate: 5
34 | paginate_path: "/blog/page:num"
35 |
36 | # PORTFOLIO
37 | collections:
38 | portfolio:
39 | output: true
40 | permalink: /:collection/:name
41 |
42 | # BUILD SETTINGS
43 | sass:
44 | style: compressed
45 | quiet_deps: true
46 | plugins: [jekyll-paginate, jekyll-seo-tag, jekyll-feed]
47 | exclude: [".jekyll-cache", ".jekyll-metadata", ".idea", "vendor/*", "assets/node_modules/*", ".github/*"]
48 |
49 | # theme: type-on-strap # if using the theme as a jekyll theme gem
50 | remote_theme: sylhare/Type-on-Strap # If using as a remote_theme in github
51 |
--------------------------------------------------------------------------------
/_sass/layouts/_blog.scss:
--------------------------------------------------------------------------------
1 | /* --- Header text feature --- */
2 | .call-out {
3 | @extend %padding-header;
4 | display: inline-block;
5 | width: 100%;
6 | height: 100%;
7 | font-size: 1.2em;
8 | text-align: center;
9 | color: var(--header-text);
10 | background: no-repeat var(--header-background);
11 | backdrop-filter: brightness(0.5);
12 | background-size: cover;
13 |
14 | h1 {
15 | font-family: $font-family-logo;
16 | @extend .subtle-txt-shadow;
17 | }
18 |
19 | /* --- Responsive --- */
20 | @media screen and (max-width: $m-break) {
21 | background-size: 170% auto;
22 | }
23 |
24 | @media screen and (max-width: 450px) {
25 | background-size: 200% auto;
26 | }
27 |
28 | @media screen and (max-width: 400px) {
29 | background-size: 250% auto;
30 | }
31 |
32 | @media screen and (max-width: 380px) {
33 | background-size: 280% auto;
34 | }
35 |
36 | p:last-child {
37 | margin-bottom: 0;
38 | }
39 | }
40 |
41 | #main {
42 | background-position: 100% -50px, 0 center, center top;
43 | }
44 |
45 | /* --- Post listing --- */
46 | .posts {
47 | .post-teaser {
48 | @extend %padding-post;
49 | width: 100%;
50 | margin-bottom: 0;
51 | display: inline-block;
52 | background-size: cover;
53 | border-bottom: 1px solid rgba(0, 0, 0, 0.1);
54 |
55 | p a {
56 | @extend .body-link;
57 | }
58 |
59 | .post-img {
60 | vertical-align: middle;
61 | border-radius: 10px;
62 | overflow: hidden;
63 |
64 | @media (min-width: $break) {
65 | height: 250px;
66 | }
67 |
68 | //Smaller screen
69 | @media screen and (max-width: $break) {
70 | height: 150px;
71 | }
72 |
73 | img {
74 | width: 100%;
75 | padding: 0;
76 | vertical-align: middle;
77 | }
78 |
79 | }
80 |
81 | .post-img img {
82 | -moz-transition-timing-function: ease-out;
83 | -webkit-transition-timing-function: ease-out;
84 | transition-timing-function: ease-out;
85 |
86 | -moz-transition: all 2s;
87 | -webkit-transition: all 2s;
88 | transition: all 2s;
89 |
90 | &:hover {
91 | -moz-transform: scale(1.1);
92 | -webkit-transform: scale(1.1);
93 | transform: scale(1.1);
94 | }
95 | }
96 | }
97 |
98 | .excerpt {
99 | margin-top: 1em;
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/_includes/default/search_json.liquid:
--------------------------------------------------------------------------------
1 | {% assign dateFormat = site.data.language.str_date_format | default: '%B %-d, %Y' %}
2 | [
3 | {% for post in site.posts %}
4 | {
5 | {% unless post.excluded %}
6 | "title" : "{{ post.title | strip_newlines | escape }}",
7 | "category" : "{{ post.category }}",
8 | "tags" : "{{ post.tags | join: ', ' | prepend: " " }}",
9 | "url" : "{{ post.url | relative_url }}",
10 | "date" : "{{ post.date | date: dateFormat }}",
11 | "excerpt" : {{ post.content | strip_html | strip_newlines | strip | escape | truncate: '250' | escape | jsonify }},
12 | "content" : {{ post.content | strip_html | strip_newlines | strip | escape | jsonify }}
13 | {% endunless %}
14 | }{% unless forloop.last %},{% endunless %}
15 | {% endfor %}
16 | {% if site.pages.size > 0 %},{% endif %}
17 | {% for page in site.pages %}
18 | {
19 | {% unless page.excluded or page.title == nil %}
20 | "title" : "{{ page.title | strip_newlines | escape }}",
21 | "category" : "{{ page.category }}",
22 | "tags" : "{{ page.tags | join: ', ' | prepend: " " }}",
23 | "url" : "{{ page.url | relative_url }}",
24 | "date" : "{{ page.date | date: dateFormat | default: "N/A" }}",
25 | "excerpt" : {{ page.content | strip_html | strip_newlines | strip | escape | truncate: '250' | escape | jsonify }},
26 | "content" : {{ page.content | strip_html | strip_newlines | strip | escape | jsonify }}
27 | {% endunless %}
28 | }{% unless forloop.last %},{% endunless %}
29 | {% endfor %}
30 | {% for collection in site.collections %}
31 | {% unless collection.label == 'posts' or site[collection.label].size == 0 %}
32 | {% for page in site[collection.label] %}
33 | ,{
34 | {% if page.excluded or page.title != nil %}
35 | "title" : "{{ page.title | strip_newlines | escape }}",
36 | "category" : "{{ page.category }}",
37 | "tags" : "{{ page.tags | join: ', ' | prepend: " " }}",
38 | "url" : "{{ page.url | relative_url }}",
39 | "date" : "{{ page.date | date: dateFormat | default: "N/A" }}",
40 | "excerpt" : {{ page.content | strip_html | strip_newlines | strip | escape | truncate: '250' | jsonify }},
41 | "content" : {{ page.content | strip_html | strip_newlines | strip | escape | jsonify }}
42 | {% endif %}
43 | }
44 | {% endfor %}
45 | {% endunless %}
46 | {% endfor %}
47 | ]
48 |
--------------------------------------------------------------------------------
/_posts/2018-10-29-feature-images.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Feature images
4 | feature-img: "assets/img/feature-img/desk-messy.jpeg"
5 | thumbnail: "assets/img/thumbnails/feature-img/desk-messy.jpeg"
6 | last_modified: "2025-05-30"
7 | tags: [Test, Image]
8 | categories: Example
9 | ---
10 |
11 | Hopefully you will find enough information about how to set images in your blog here.
12 | This is an example of a post which includes a feature image specified in the front matter of the post.
13 | The feature image spans the full-width of the page, and is shown with the title on permalink pages:
14 |
15 | ```yaml
16 | feature-img: "assets/img/feature-img/desk-messy.jpeg"
17 | thumbnail: "assets/img/thumbnails/feature-img/desk-messy.jpeg"
18 | ```
19 |
20 | You can also use a thumbnail, a smaller version of the same image to improve loading of the page.
21 | The thumbnail will also be used when you share your article on other platform (linkedin, whatsapp, facebook, ...).
22 |
23 | > - And now it is working
24 |
25 | You can also add images aligned in your post using the `aligner` include.
26 | Make sure to separate all of the image path from in a string separated with `,`.
27 | It by default look into `assets/img/` so give the path from there, example:
28 |
29 | {% highlight ruby %}
30 | {% raw %}
31 | {% include aligner.html images="pexels/book-glass.jpeg,triangle.png" caption="A caption under the images" %}
32 | {% endraw %}
33 | {% endhighlight %}
34 |
35 | {% include aligner.html images="pexels/book-glass.jpeg,feature-img/desk-messy.jpeg" caption="A caption under the images" %}
36 |
37 |
38 | Here you have two images side by side, but you can set more and set the amount per columns
39 | (by specifying the number of columns or let it be automatic using `"auto"`):
40 |
41 | {% highlight ruby %}
42 | {% raw %}
43 | {% include aligner.html images="portfolio/cabin.png,portfolio/cake.png,portfolio/circus.png" column=3 %}
44 | {% endraw %}
45 | {% endhighlight %}
46 |
47 | {% include aligner.html images="portfolio/cabin.png,portfolio/cake.png,portfolio/circus.png" column=3 %}
48 |
49 | it also works with only one images, it is made to display it smaller than normally.
50 | However you can just use the Markdown way of doing it to get the image normal sized and centered.
51 |
52 | {% highlight ruby %}
53 | {% raw %}
54 | # Markdown way
55 | 
56 | # Aligner with only one image
57 | {% include aligner.html images="pexels/computer.jpeg" %}
58 | {% endraw %}
59 | {% endhighlight %}
60 |
61 | {% include aligner.html images="pexels/computer.jpeg" %}
62 |
--------------------------------------------------------------------------------
/_posts/2014-11-28-markdown-and-html.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Markdown and HTML
4 | tags: [Katex, Markdown]
5 | author: rohanchandra
6 | categories: Syntax
7 | ---
8 |
9 | Jekyll supports the use of [Markdown](http://daringfireball.net/projects/markdown/syntax) with inline HTML tags which makes it easier to quickly write posts with Jekyll, without having to worry too much about text formatting. A sample of the formatting follows.
10 |
11 | ## Table of content
12 |
13 |
14 | * TOC
15 | {:toc}
16 | *
17 | You need to put this at the beginning of the page where you want the table of content to be displayed
18 |
19 | ```html
20 | * TOC
21 | {:toc}
22 | ```
23 |
24 | It will then render the markdown and html titles (lines that begins with `#` or using the ` ` tages)
25 |
26 |
27 | ## Title
28 |
29 | ### Subtitle
30 |
31 | Tables have also been extended from Markdown:
32 |
33 | | First Header | Second Header |
34 | |--------------|---------------|
35 | | Content Cell | Content Cell |
36 | | Content Cell | Content Cell |
37 |
38 | Here's an example of an image, which is included using Markdown:
39 |
40 | 
41 |
42 | This is another example of list:
43 |
44 | - list of things
45 | 1. Sub list
46 | 2. of Other things
47 | 3. with numbers
48 | - And many more
49 | - Sub sub list
50 | - can go on ...
51 | - and on ...
52 | - and on !
53 | - That's it.
54 |
55 | ### Other subtitle
56 |
57 | Highlighting for code in Jekyll is done using Base16 or Rouge. This theme makes use of Rouge by default.
58 |
59 | {% highlight js %}
60 | // count to ten
61 | for (var i = 1; i <= 10; i++) {
62 | console.log(i);
63 | }
64 |
65 | // count to twenty
66 | var j = 0;
67 | while (j < 20) {
68 | j++;
69 | console.log(j);
70 | }
71 | {% endhighlight %}
72 |
73 | ### Math
74 |
75 | Type on Strap uses KaTeX to display maths. Equations such as $$S_n = a \times \frac{1-r^n}{1-r}$$ can be displayed inline.
76 |
77 | Alternatively, they can be shown on a new line:
78 |
79 | $$ f(x) = \int \frac{2x^2+4x+6}{x-2} $$
80 |
81 | And in your markdown file:
82 |
83 | ```markdown
84 | $$ f(x) = \int \frac{2x^2+4x+6}{x-2} $$
85 | ```
86 |
87 |
88 | ### Expandable content
89 |
90 | Click on the expandable content to display it:
91 |
92 |
93 | Click here!
94 | Now you see me
95 |
96 |
97 | And in your markdown file:
98 |
99 | ```html
100 |
101 | Click here!
102 | Now you see me
103 |
104 | ```
105 |
--------------------------------------------------------------------------------
/assets/js/main.min.js:
--------------------------------------------------------------------------------
1 | /* @preserve Cookie Consent Init */
2 | function createCookie(e,t,n){var o="";if(n){var a=new Date;a.setTime(a.getTime()+24*n*60*60*1e3),o="; expires="+a.toUTCString()}document.cookie=`${e}=${t}${o}; path=/`}function readCookie(e){for(var t=e+"=",n=document.cookie.split(";"),o=0;o ${darkBtn} `,dark:` ${lightBtn} `};function currentTheme(){return localStorage.getItem("theme")}function setMode(e){document.documentElement.setAttribute("data-theme",e),localStorage.setItem("theme",e);const t=document.getElementById("theme-toggle");t&&(t.innerHTML=themeButton[e])}function themeToggle(){setMode("light"===currentTheme()?"dark":"light")}function bootstrapTheme(){if(isAutoTheme){if(!currentTheme()){let e=window.matchMedia("(prefers-color-scheme: dark)");e.matches&&localStorage.setItem("theme","dark"),e.addEventListener("change",(()=>{e.matches&&localStorage.setItem("theme","dark")}))}let e=currentTheme();setMode(e||"light")}}bootstrapTheme();
4 | /* @preserve Masonry Init */
5 | try{var elem=document.querySelector(".grid"),msnry=new Masonry(elem,{itemSelector:".grid-item",columnWidth:".grid-sizer",gutter:".gutter-sizer",percentPosition:!0}),imgLoad=imagesLoaded(elem);imgLoad.on("progress",(function(e,t){msnry.layout()}))}catch(e){if(!(e instanceof ReferenceError))throw e}
6 | /* @preserve Navbar */document.addEventListener("DOMContentLoaded",(function(e){const t=document.getElementById("pull"),n=document.querySelector("nav ul");["click","touch"].forEach((function(e){t?.addEventListener(e,(function(){n.classList.toggle("hide")}),!1)})),window.addEventListener("scroll",(function(){const e=-(window.scrollY||window.pageYOffset||document.body.scrollTop)/3,t=document.getElementById("main");t&&(t.style.backgroundPosition="100% "+(e-50)+"px, 0%, center top")}))}));
--------------------------------------------------------------------------------
/_includes/blog/post_footer.liquid:
--------------------------------------------------------------------------------
1 | {% assign color = include.color %}
2 | {% assign img = include.img %}
3 | {% capture _post_footer %}
4 |
5 |
37 |
38 |
39 | {% if site.post_navigation or site.theme_settings.post_navigation %}
40 | {% include blog/post_nav.liquid %}
41 | {% endif %}
42 |
43 |
44 | {% if site.data.comments.giscus.repo and site.data.comments.giscus.repo-id and site.data.comments.giscus.category-id and site.data.comments.giscus.mapping %}
45 | {% include social/giscus.liquid %}
46 | {% endif %}
47 |
48 |
49 | {% if site.data.comments.utterances.repo and site.data.comments.utterances.issue-term %}
50 | {% include social/utterances.liquid %}
51 | {% elsif site.comments.utterances.repo and site.comments.utterances.issue-term %}
52 | {% include social/utterances.liquid %}
53 | {% endif %}
54 |
55 |
56 | {% if site.data.comments.cusdis.app_id %}
57 | {% include social/cusdis.liquid %}
58 | {% elsif site.comments.cusdis_app_id or site.cusdis_app_id %}
59 | {% include social/cusdis.liquid %}
60 | {% endif %}
61 |
62 |
63 | {% if site.data.comments.disqus.shortname %}
64 | {% include social/disqus.liquid %}
65 | {% elsif site.comments.disqus_shortname or site.theme_settings.disqus_shortname or site.disqus_shortname %}
66 | {% include social/disqus.liquid %}
67 | {% endif %}
68 | {% endcapture %}
69 | {{ _post_footer | split: " " | join: " " }}
70 |
--------------------------------------------------------------------------------
/.github/workflows/vendor-testing.yml:
--------------------------------------------------------------------------------
1 | name: Vendor Dependency Testing
2 |
3 | on:
4 | push:
5 | paths:
6 | - 'assets/js/vendor/**'
7 | - 'assets/fonts/katex/**'
8 | - '_sass/external/katex/**'
9 | - '_includes/default/head.liquid'
10 | - '.github/scripts/**'
11 | pull_request:
12 | paths:
13 | - 'assets/js/vendor/**'
14 | - 'assets/fonts/katex/**'
15 | - '_sass/external/katex/**'
16 | - '_includes/default/head.liquid'
17 | - '.github/scripts/**'
18 | workflow_dispatch: # Allow manual triggering
19 |
20 | jobs:
21 | test-vendor-dependencies:
22 | runs-on: ubuntu-latest
23 |
24 | steps:
25 | - name: Checkout repository
26 | uses: actions/checkout@v4
27 |
28 | - name: Set up Ruby
29 | uses: ruby/setup-ruby@v1
30 | with:
31 | ruby-version: '3.4'
32 | bundler-cache: true
33 |
34 | - name: Install Jekyll dependencies
35 | run: |
36 | bundle install
37 |
38 | - name: Make scripts executable
39 | run: |
40 | chmod +x .github/scripts/*.sh
41 |
42 | - name: Validate KaTeX
43 | run: |
44 | .github/scripts/validate-katex.sh
45 |
46 | - name: Validate Mermaid
47 | run: |
48 | .github/scripts/validate-mermaid.sh
49 |
50 | - name: Validate Masonry
51 | run: |
52 | .github/scripts/validate-masonry.sh
53 |
54 | - name: Validate imagesLoaded
55 | run: |
56 | .github/scripts/validate-imagesloaded.sh
57 |
58 | - name: Validate Simple-Jekyll-Search
59 | run: |
60 | .github/scripts/validate-jekyll-search.sh
61 |
62 | - name: Test Jekyll build
63 | run: |
64 | bundle exec jekyll build --verbose
65 |
66 | - name: Check for build warnings
67 | run: |
68 | if bundle exec jekyll build 2>&1 | grep -i "warning\|error"; then
69 | echo "⚠️ Build warnings/errors detected"
70 | echo "This may indicate issues with vendor updates"
71 | else
72 | echo "✅ No build warnings/errors"
73 | fi
74 |
75 | - name: Verify asset generation
76 | run: |
77 | echo "Checking generated assets..."
78 | ls -la _site/assets/js/vendor/
79 | ls -la _site/assets/fonts/katex/ | head -10
80 |
81 | # Check file sizes are reasonable
82 | echo "File sizes:"
83 | ls -lh _site/assets/js/vendor/*.js
84 |
85 | - name: Test production build
86 | run: |
87 | JEKYLL_ENV=production bundle exec jekyll build
88 | echo "✅ Production build successful"
89 |
90 | - name: Upload test results
91 | if: always()
92 | uses: actions/upload-artifact@v4
93 | with:
94 | name: vendor-test-results
95 | path: |
96 | _site/
97 | .github/scripts/
98 | retention-days: 7
99 |
--------------------------------------------------------------------------------
/assets/img/triangle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/_sass/includes/_navbar.scss:
--------------------------------------------------------------------------------
1 | // To clear things when we float the element inside nav and ul
2 | .clear {
3 | *zoom: 1;
4 |
5 | &:after {
6 | clear: both;
7 | }
8 |
9 | &:before,
10 | &:after {
11 | content: " ";
12 | display: table;
13 | }
14 | }
15 |
16 | .site-header {
17 | padding: 2% 2% 1% 2%;
18 | background: var(--background);
19 | display: inline-block;
20 | float: left;
21 | width: 100%;
22 |
23 | .separator {
24 | user-select: none;
25 | opacity: 0;
26 |
27 | &:first-child {
28 | display: none;
29 | }
30 | }
31 |
32 | a {
33 | color: var(--header-link);
34 | }
35 |
36 | .avatar {
37 | height: 3em;
38 | width: 3em;
39 | float: left;
40 | margin-top: -13px;
41 | border-radius: 0.2em;
42 | margin-right: 0.5em;
43 | padding: 10px 10px;
44 |
45 | }
46 |
47 | .site-title {
48 | float: left;
49 | font-weight: bold;
50 | font-family: $font-family-logo;
51 | font-size: 1.3em;
52 | }
53 | }
54 |
55 | nav {
56 | list-style: none;
57 | margin: 0;
58 | padding: 0;
59 |
60 | ul {
61 | margin: 0;
62 | padding: 0;
63 | list-style: none;
64 | line-height: 1.5;
65 | float: right;
66 | text-align: right;
67 | display: block;
68 | }
69 |
70 | li {
71 | display: inline;
72 | float: left;
73 | margin-right: 0.4em;
74 | }
75 |
76 | a {
77 | &:hover {
78 | color: var(--link);
79 | }
80 |
81 | pull {
82 | i {
83 | margin-top: 22px;
84 | margin-right: 18px;
85 | float: right;
86 | }
87 | }
88 | }
89 | }
90 |
91 | /* ---- Responsive ---- */
92 |
93 | @media (min-width: $break + 1) {
94 | a#pull {
95 | display: none;
96 | }
97 |
98 | .navbar-label-with-icon {
99 | display: none;
100 | }
101 | }
102 |
103 | @media screen and (max-width: $break) {
104 | .site-header {
105 | img.avatar {
106 | margin-top: -7px
107 | }
108 |
109 | .site-title {
110 | margin-top: 7px;
111 | }
112 | }
113 |
114 | nav {
115 | height: auto;
116 |
117 | .separator {
118 | display: none !important;
119 | }
120 |
121 | ul {
122 | width: 100%;
123 | overflow: hidden;
124 |
125 | /* fade out, then shrink */
126 | transition: opacity .25s 0s, font-size .25s 0s;
127 | transition-delay: 0s;
128 |
129 | &.hide {
130 | font-size: 0;
131 | margin: 0;
132 | opacity: 0;
133 | padding: 0;
134 | }
135 | }
136 |
137 | li {
138 | width: 100%;
139 | text-align: center;
140 | font-size: 1em;
141 | margin: 0;
142 | background-color: var(--background);
143 | backdrop-filter: brightness(0.98);
144 |
145 | &:nth-of-type(4n) {
146 | background-color: var(--background);
147 | }
148 |
149 | a {
150 | width: 100%;
151 | display: block;
152 | }
153 |
154 | }
155 | }
156 | }
157 |
--------------------------------------------------------------------------------
/.github/workflows/e2e-tests.yml:
--------------------------------------------------------------------------------
1 | name: Tests
2 |
3 | on:
4 | push:
5 | branches: [ master, main ]
6 | pull_request:
7 | branches: [ master, main ]
8 | workflow_dispatch:
9 |
10 | jobs:
11 | e2e-tests:
12 | name: E2E Tests
13 | runs-on: ubuntu-latest
14 | timeout-minutes: 30
15 |
16 | strategy:
17 | fail-fast: false
18 | matrix:
19 | browser: [chromium, firefox, webkit]
20 |
21 | steps:
22 | - name: Checkout repository
23 | uses: actions/checkout@v4
24 |
25 | - name: Setup Ruby
26 | uses: ruby/setup-ruby@v1
27 | with:
28 | ruby-version: '3.4'
29 | bundler-cache: true
30 |
31 | - name: Setup Node.js
32 | uses: actions/setup-node@v4
33 | with:
34 | node-version: 'lts/*'
35 |
36 | - name: Build Jekyll site
37 | run: |
38 | bundle exec jekyll build
39 | ls -la _site/
40 | env:
41 | JEKYLL_ENV: production
42 |
43 | - name: Install test dependencies
44 | run: |
45 | cd .github/tests
46 | npm i
47 |
48 | - name: Install Playwright browsers
49 | run: |
50 | cd .github/tests
51 | npx playwright install --with-deps ${{ matrix.browser }}
52 |
53 | - name: Run E2E tests
54 | run: |
55 | cd .github/tests
56 | npx playwright test --project=${{ matrix.browser }}
57 | env:
58 | CI: true
59 | BASE_URL: http://localhost:4000
60 |
61 | - name: Upload test results
62 | if: always()
63 | uses: actions/upload-artifact@v4
64 | with:
65 | name: playwright-results-${{ matrix.browser }}
66 | path: .github/tests/test-results/
67 | retention-days: 7
68 |
69 | - name: Upload Playwright report
70 | if: always()
71 | uses: actions/upload-artifact@v4
72 | with:
73 | name: playwright-report-${{ matrix.browser }}
74 | path: .github/tests/playwright-report/
75 | retention-days: 7
76 |
77 | unit-tests:
78 | name: Unit Tests
79 | runs-on: ubuntu-latest
80 | timeout-minutes: 10
81 |
82 | steps:
83 | - name: Checkout repository
84 | uses: actions/checkout@v4
85 |
86 | - name: Setup Node.js
87 | uses: actions/setup-node@v4
88 | with:
89 | node-version: 'lts/*'
90 |
91 | - name: Install test dependencies
92 | run: |
93 | cd .github/tests
94 | npm i
95 |
96 | - name: Run unit tests
97 | run: |
98 | cd .github/tests
99 | npm run test:unit
100 |
101 | - name: Upload coverage
102 | if: always()
103 | uses: actions/upload-artifact@v4
104 | with:
105 | name: coverage-report
106 | path: .github/tests/coverage/
107 | retention-days: 7
108 |
109 |
110 |
--------------------------------------------------------------------------------
/_posts/2014-08-08-Markup-Syntax-Highlighting.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: "Markup: Syntax Highlighting"
4 | author: mmistakes
5 | tags: [Highlight, Markdown]
6 | categories: Syntax
7 | ---
8 |
9 | Syntax highlighting[^1] is a feature that displays source code.
10 | This feature facilitates writing in a structured language such as a programming language or a markup language as it makes import things visually distinct.
11 |
12 |
13 | ### GFM Code Blocks
14 |
15 | GitHub Flavored Markdown [fenced code blocks](https://help.github.com/articles/creating-and-highlighting-code-blocks/) are supported. To modify styling and highlight colors edit `/_sass/syntax.scss`.
16 |
17 | ```css
18 | #container {
19 | float: left;
20 | margin: 0 -240px 0 0;
21 | width: 100%;
22 | }
23 | ```
24 |
25 | {% highlight scss linenos %}
26 | .highlight {
27 | margin: 0;
28 | padding: 1em;
29 | font-family: $monospace;
30 | font-size: $type-size-7;
31 | line-height: 1.8;
32 | }
33 | {% endhighlight %}
34 |
35 | ```html
36 | {% raw %}{% endraw %}
44 | ```
45 |
46 | ```ruby
47 | module Jekyll
48 | class TagIndex < Page
49 | def initialize(site, base, dir, tag)
50 | @site = site
51 | @base = base
52 | @dir = dir
53 | @name = 'index.html'
54 | self.process(@name)
55 | self.read_yaml(File.join(base, '_layouts'), 'tag_index.html')
56 | self.data['tag'] = tag
57 | tag_title_prefix = site.config['tag_title_prefix'] || 'Tagged: '
58 | tag_title_suffix = site.config['tag_title_suffix'] || '–'
59 | self.data['title'] = "#{tag_title_prefix}#{tag}"
60 | self.data['description'] = "An archive of posts tagged #{tag}."
61 | end
62 | end
63 | end
64 | ```
65 |
66 | ### Code Blocks in Lists
67 |
68 | Indentation matters. Be sure the indent of the code block aligns with the first non-space character after the list item marker (e.g., `1.`). Usually this will mean indenting 3 spaces instead of 4.
69 |
70 | 1. Do step 1.
71 | 2. Now do this:
72 |
73 | ```ruby
74 | def print_hi(name)
75 | puts "Hi, #{name}"
76 | end
77 | print_hi('Tom')
78 | #=> prints 'Hi, Tom' to STDOUT.
79 | ```
80 |
81 | 3. Now you can do this.
82 |
83 | ### GitHub Gist Embed
84 |
85 | An example of a Gist embed below:
86 |
87 |
88 |
89 | Here is how it looks like:
90 |
91 | {% highlight html %}
92 | {% raw %}
93 |
95 | {% endraw %}
96 | {% endhighlight %}
97 |
98 |
99 |
100 | [^1]: {% include citation.html key="highlight" %}
101 |
--------------------------------------------------------------------------------
/_posts/2019-06-30-sample-post.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Sample post
4 | tags: [A Tag, Katex]
5 | last_modified: "2025-05-30"
6 | excerpt_separator:
7 | categories: Example
8 | ---
9 |
10 | Consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor.
11 | Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur.
12 |
13 | Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem.
14 |
15 | * Consectetur adipiscing elit
16 | * Donec a diam lectus
17 | * Sed sit amet ipsum mauris
18 |
19 | Ut turpis felis, pulvinar a semper sed, adipiscing id dolor. Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet. Ut convallis libero in urna ultrices accumsan. Donec sed odio eros. Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi at sem facilisis semper ac in est.
20 |
21 | Nunc diam velit, adipiscing ut tristique vitae, sagittis vel odio. Maecenas convallis ullamcorper ultricies. Curabitur ornare, ligula *semper consectetur sagittis*, nisi diam iaculis velit, id fringilla sem nunc vel mi. Nam dictum, odio nec pretium volutpat, arcu ante placerat erat, non tristique elit urna et turpis. Quisque mi metus, ornare sit amet fermentum et, tincidunt et orci. Fusce eget orci a orci congue vestibulum.
22 |
23 | {% include aligner.html images="pexels/travel.jpeg" column=1 caption="A relaxing image illustrating the content" %}
24 |
25 | Ut dolor diam, elementum et vestibulum eu, porttitor vel elit. Curabitur venenatis pulvinar tellus gravida ornare. Sed et erat faucibus nunc euismod ultricies ut id justo. Nullam cursus suscipit nisi, et ultrices justo sodales nec. Fusce venenatis facilisis lectus ac semper. Aliquam at massa ipsum. Quisque bibendum purus convallis nulla ultrices ultricies. Nullam aliquam, mi eu aliquam tincidunt, purus velit laoreet tortor, viverra pretium nisi quam vitae mi. Fusce vel volutpat elit. Nam sagittis nisi dui.
26 |
27 | > Suspendisse lectus leo, consectetur in tempor sit amet, placerat quis neque
28 |
29 | Etiam luctus porttitor lorem, sed suscipit est rutrum non. Curabitur lobortis nisl a enim congue semper. Aenean commodo ultrices imperdiet. Vestibulum ut justo vel sapien venenatis tincidunt.
30 |
31 | $$ \Theta \ne \Gamma $$
32 |
33 | Phasellus eget dolor sit amet ipsum dapibus condimentum vitae quis lectus. Aliquam ut massa in turpis dapibus convallis. Praesent elit lacus, vestibulum at malesuada et, ornare et est. Ut augue nunc, sodales ut euismod non, adipiscing vitae orci[^1]. Mauris ut placerat justo. Mauris in ultricies enim. Quisque nec est eleifend nulla ultrices egestas quis ut quam. Donec sollicitudin lectus a mauris pulvinar id aliquam urna cursus. Cras quis ligula sem, vel elementum mi. Phasellus non ullamcorper urna.
34 |
35 | [^1]:
36 | {% include citation.html key="ref1" %}
37 |
--------------------------------------------------------------------------------
/_sass/layouts/_categories.scss:
--------------------------------------------------------------------------------
1 | #archive,
2 | #categories {
3 | .category-list {
4 | width: 100%;
5 | padding-bottom: $padding-x-small;
6 | text-align: center;
7 |
8 | .category-links {
9 | margin: 30px 0;
10 | color: var(--meta);
11 | font-size: 0.9em;
12 | }
13 |
14 | .category-link {
15 | color: var(--meta);
16 | text-decoration: underline;
17 | transition: color 0.2s ease;
18 |
19 | &:hover {
20 | color: var(--link);
21 | text-decoration: underline;
22 | }
23 | }
24 |
25 | .separator {
26 | color: var(--meta);
27 | }
28 | }
29 |
30 | .archive-group,
31 | .category-group {
32 | padding: 15px 0 10px;
33 |
34 | .title {
35 | margin-bottom: 10px;
36 | }
37 |
38 | .items {
39 | padding-left: $padding-medium;
40 |
41 | .item-wrapper {
42 | position: relative;
43 | margin: 25px 0;
44 | display: flex;
45 | justify-content: space-between;
46 | align-items: center;
47 | gap: 15px;
48 | }
49 |
50 | .category-post-link {
51 | flex: 1;
52 | min-width: 0;
53 | text-decoration: none;
54 | }
55 |
56 | .item {
57 | .item-content {
58 | flex: 1;
59 | min-width: 0;
60 | }
61 |
62 | .meta {
63 | color: var(--meta);
64 | font-size: 0.85rem;
65 | }
66 |
67 | .title {
68 | font-weight: 600;
69 | color: var(--text);
70 | }
71 | }
72 |
73 | .item-tags {
74 | display: flex;
75 | flex-wrap: wrap;
76 | gap: 5px;
77 | align-items: center;
78 | justify-content: flex-end;
79 |
80 | .tag-link {
81 | text-decoration: none;
82 | }
83 |
84 | .tag {
85 | background-color: var(--selection);
86 | color: var(--text);
87 | padding: 3px 10px;
88 | border-radius: 12px;
89 | font-size: 0.75rem;
90 | font-weight: 500;
91 | white-space: nowrap;
92 | transition: background-color 0.2s ease, color 0.2s ease, border 0.2s ease;
93 | cursor: pointer;
94 | border: 1px solid transparent;
95 | }
96 | }
97 |
98 | .item-wrapper::before {
99 | content: "";
100 | position: absolute;
101 | left: -5%;
102 | width: 8px;
103 | background-color: var(--selection);
104 | border-radius: 8px;
105 | height: 100%;
106 | }
107 |
108 | .item-wrapper:hover::before {
109 | background-color: var(--link);
110 | }
111 |
112 | .category-post-link:hover {
113 | text-decoration: none;
114 |
115 | .meta, .title {
116 | color: var(--link);
117 | }
118 | }
119 |
120 | .item-wrapper:hover .tag {
121 | background-color: var(--link);
122 | color: var(--header-text);
123 | border-color: transparent;
124 | }
125 |
126 | .item-wrapper:hover .tag:hover {
127 | background-color: var(--page-background);
128 | color: var(--link);
129 | border-color: var(--link);
130 | }
131 | }
132 | }
133 | }
134 |
--------------------------------------------------------------------------------
/_layouts/tags.liquid:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | ---
4 |
5 |
6 |
7 |
8 | {% assign rawtags = "" %}
9 | {% for post in site.posts %}
10 | {% if post.tags.size > 0 %}
11 | {% assign post_tags = post.tags | join:'|' | append:'|' %}
12 | {% assign rawtags = rawtags | append:post_tags %}
13 | {% endif %}
14 | {% endfor %}
15 |
16 |
17 | {% assign portfolio = site.portfolio | map: 'tags' | join: ',' | split: ',' | uniq %}
18 | {% for tag in portfolio %}
19 | {% assign portfolio_tags = tag | join: '|' | append: '|' %}
20 | {% assign rawtags = rawtags | append: portfolio_tags %}
21 | {% endfor %}
22 |
23 |
24 | {% for page in site.pages %}
25 | {% if page.tags.size > 0 %}
26 | {% assign page_tags = page.tags | join:'|' | append:'|' %}
27 | {% assign rawtags = rawtags | append:page_tags %}
28 | {% endif %}
29 | {% endfor %}
30 |
31 |
32 | {% include default/tags_list.liquid tags=rawtags %}
33 |
34 |
35 |
36 | {% for tag in tags %}
37 |
38 | {{ tag }}
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | {% for page in site.pages %}
48 | {% if page.tags contains tag %}
49 |
50 |
51 |
52 | {{ page.title }}
53 |
54 | {% include blog/post_info.liquid date=page.date %}
55 |
56 | {% endif %}
57 | {% endfor %}
58 |
59 |
60 | {% for post in site.posts %}
61 | {% if post.tags contains tag %}
62 |
63 |
64 |
65 | {{ post.title }}
66 |
67 |
68 | {% include blog/post_info.liquid date=post.date %}
69 |
70 | {% endif %}
71 | {% endfor %}
72 |
73 |
74 | {% for note in site.portfolio %}
75 | {% if note.tags contains tag %}
76 |
77 |
78 |
79 | {{ note.title }}
80 |
81 |
82 | {% include blog/post_info.liquid date=note.date %}
83 |
84 | {% endif %}
85 | {% endfor %}
86 |
87 |
88 | {% endfor %}
89 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/assets/js/vendor/katex.auto-render.min.js:
--------------------------------------------------------------------------------
1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={757:function(t){t.exports=e}},n={};function r(e){var o=n[e];if(void 0!==o)return o.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var o={};r.d(o,{default:function(){return p}});var i=r(757),a=r.n(i);const l=function(e,t,n){let r=n,o=0;const i=e.length;for(;re.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))).join("|")+")");for(;n=e.search(o),-1!==n;){n>0&&(r.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));const o=t.findIndex((t=>e.startsWith(t.left)));if(n=l(t[o].right,e,t[o].left.length),-1===n)break;const i=e.slice(0,n+t[o].right.length),a=s.test(i)?i:e.slice(t[o].left.length,n);r.push({type:"math",data:a,rawData:i,display:t[o].display}),e=e.slice(n+t[o].right.length)}return""!==e&&r.push({type:"text",data:e}),r};const c=function(e,t){const n=d(e,t.delimiters);if(1===n.length&&"text"===n[0].type)return null;const r=document.createDocumentFragment();for(let e=0;e-1===e.indexOf(" "+t+" ")))&&f(r,t)}}};var p=function(e,t){if(!e)throw new Error("No element provided to render");const n={};for(const e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);n.delimiters=n.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],n.ignoredTags=n.ignoredTags||["script","noscript","style","textarea","pre","code","option"],n.ignoredClasses=n.ignoredClasses||[],n.errorCallback=n.errorCallback||console.error,n.macros=n.macros||{},f(e,n)};return o=o.default}()}));
--------------------------------------------------------------------------------