├── CNAME ├── _includes ├── after-content.html ├── before-related.html ├── footer │ └── custom.html ├── comments-providers │ ├── custom.html │ ├── custom_scripts.html │ ├── facebook.html │ ├── scripts.html │ ├── disqus.html │ ├── utterances.html │ ├── discourse.html │ ├── giscus.html │ ├── staticman.html │ └── staticman_v2.html ├── page__hero_video.html ├── head │ └── custom.html ├── posts-tag.html ├── posts-category.html ├── paginator.html ├── page__taxonomy.html ├── analytics-providers │ ├── custom.html │ ├── google-universal.html │ ├── google-gtag.html │ └── google.html ├── author-profile-custom-links.html ├── copyright.html ├── copyright.js ├── toc ├── documents-collection.html ├── search │ ├── lunr-search-scripts.html │ ├── google-search-scripts.html │ ├── search_form.html │ └── algolia-search-scripts.html ├── skip-links.html ├── analytics.html ├── page__related.html ├── figure ├── schema.html ├── page__date.html ├── sidebar.html ├── tag-list.html ├── category-list.html ├── post_pagination.html ├── video ├── nav_list ├── gallery ├── comment.html ├── group-by-array ├── head.html ├── posts-taxonomy.html ├── archive-single.html ├── scripts.html ├── feature_row ├── footer.html ├── page__meta.html ├── breadcrumbs.html ├── masthead.html ├── social-share.html ├── page__hero.html ├── paginator-v2.html └── paginator-v1.html ├── Gemfile ├── _sass ├── minimal-mistakes │ ├── vendor │ │ ├── susy │ │ │ ├── _su.scss │ │ │ ├── _susy.scss │ │ │ ├── plugins │ │ │ │ ├── _svg-grid.scss │ │ │ │ └── svg-grid │ │ │ │ │ ├── _prefix.scss │ │ │ │ │ ├── _svg-unprefix.scss │ │ │ │ │ ├── _svg-settings.scss │ │ │ │ │ ├── _svg-grid-math.scss │ │ │ │ │ ├── _svg-api.scss │ │ │ │ │ └── _svg-utilities.scss │ │ │ ├── _susy-prefix.scss │ │ │ └── susy │ │ │ │ ├── _unprefix.scss │ │ │ │ ├── _utilities.scss │ │ │ │ └── _parse.scss │ │ ├── breakpoint │ │ │ ├── _no-query.scss │ │ │ ├── parsers │ │ │ │ ├── single │ │ │ │ │ └── _default.scss │ │ │ │ ├── double │ │ │ │ │ ├── _default.scss │ │ │ │ │ ├── _double-string.scss │ │ │ │ │ └── _default-pair.scss │ │ │ │ ├── triple │ │ │ │ │ └── _default.scss │ │ │ │ ├── _single.scss │ │ │ │ ├── _triple.scss │ │ │ │ ├── _resolution.scss │ │ │ │ ├── _double.scss │ │ │ │ ├── resolution │ │ │ │ │ └── _resolution.scss │ │ │ │ └── _query.scss │ │ │ ├── _settings.scss │ │ │ ├── _legacy-settings.scss │ │ │ ├── _breakpoint.scss │ │ │ ├── _respond-to.scss │ │ │ ├── _context.scss │ │ │ └── _helpers.scss │ │ └── magnific-popup │ │ │ └── _settings.scss │ ├── skins │ │ ├── _default.scss │ │ ├── _air.scss │ │ ├── _mint.scss │ │ ├── _dirt.scss │ │ ├── _dark.scss │ │ ├── _aqua.scss │ │ ├── _contrast.scss │ │ ├── _sunrise.scss │ │ ├── _neon.scss │ │ └── _plum.scss │ ├── _copyright.scss │ ├── _animations.scss │ ├── _tables.scss │ ├── _footer.scss │ ├── _masthead.scss │ ├── _mixins.scss │ ├── _buttons.scss │ ├── _notices.scss │ ├── _search.scss │ ├── _reset.scss │ └── _print.scss └── minimal-mistakes.scss ├── favicon.ico ├── assets ├── images │ ├── logo.png │ ├── badusb.jpg │ ├── bio-photo.png │ ├── badusb-hero.jpg │ ├── companyenum.jpg │ ├── pentest-mag.png │ ├── autopwn-suite.jpg │ ├── splash-banner.png │ ├── powershell-tools.jpg │ ├── hands-on-security.png │ ├── trophy-achievements.png │ └── google-cybersecurity-professional-certificate-v2.png └── js │ ├── lunr │ ├── lunr-en.js │ └── lunr-store.js │ └── plugins │ └── jquery.fitvids.js ├── _layouts ├── tags.html ├── categories.html ├── tag.html ├── category.html ├── collection.html ├── home.html ├── archive.html ├── archive-taxonomy.html ├── splash.html ├── posts.html ├── default.html ├── search.html ├── single.html └── compress.html ├── _data └── navigation.yml ├── .gitignore ├── package.json ├── LICENSE ├── minimal-mistakes-jekyll.gemspec ├── .github └── workflows │ └── jekyll.yml ├── _pages ├── projects.md └── projects │ └── powershell-projects.md └── staticman.yml /CNAME: -------------------------------------------------------------------------------- 1 | kaangultekin.net -------------------------------------------------------------------------------- /_includes/after-content.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_includes/before-related.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | gemspec 3 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/susy/_su.scss: -------------------------------------------------------------------------------- 1 | // Su 2 | // == 3 | 4 | @import 'susy/su'; 5 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GamehunterKaan/kaangultekin.net/master/favicon.ico -------------------------------------------------------------------------------- /_includes/footer/custom.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GamehunterKaan/kaangultekin.net/master/assets/images/logo.png -------------------------------------------------------------------------------- /assets/images/badusb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GamehunterKaan/kaangultekin.net/master/assets/images/badusb.jpg -------------------------------------------------------------------------------- /assets/images/bio-photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GamehunterKaan/kaangultekin.net/master/assets/images/bio-photo.png -------------------------------------------------------------------------------- /_includes/comments-providers/custom.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /assets/images/badusb-hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GamehunterKaan/kaangultekin.net/master/assets/images/badusb-hero.jpg -------------------------------------------------------------------------------- /assets/images/companyenum.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GamehunterKaan/kaangultekin.net/master/assets/images/companyenum.jpg -------------------------------------------------------------------------------- /assets/images/pentest-mag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GamehunterKaan/kaangultekin.net/master/assets/images/pentest-mag.png -------------------------------------------------------------------------------- /_includes/comments-providers/custom_scripts.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /assets/images/autopwn-suite.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GamehunterKaan/kaangultekin.net/master/assets/images/autopwn-suite.jpg -------------------------------------------------------------------------------- /assets/images/splash-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GamehunterKaan/kaangultekin.net/master/assets/images/splash-banner.png -------------------------------------------------------------------------------- /assets/images/powershell-tools.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GamehunterKaan/kaangultekin.net/master/assets/images/powershell-tools.jpg -------------------------------------------------------------------------------- /_layouts/tags.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: archive 3 | --- 4 | 5 | {{ content }} 6 | 7 | {% include posts-taxonomy.html taxonomies=site.tags %} 8 | -------------------------------------------------------------------------------- /assets/images/hands-on-security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GamehunterKaan/kaangultekin.net/master/assets/images/hands-on-security.png -------------------------------------------------------------------------------- /assets/images/trophy-achievements.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GamehunterKaan/kaangultekin.net/master/assets/images/trophy-achievements.png -------------------------------------------------------------------------------- /_layouts/categories.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: archive 3 | --- 4 | 5 | {{ content }} 6 | 7 | {% include posts-taxonomy.html taxonomies=site.categories %} 8 | -------------------------------------------------------------------------------- /_includes/page__hero_video.html: -------------------------------------------------------------------------------- 1 | {% assign video = page.header.video %} 2 | {% include video id=video.id provider=video.provider danmaku=video.danmaku %} 3 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/susy/_susy.scss: -------------------------------------------------------------------------------- 1 | // Susy (Un-Prefixed) 2 | // ================== 3 | 4 | @import 'susy-prefix'; 5 | @import 'susy/unprefix'; 6 | -------------------------------------------------------------------------------- /_includes/head/custom.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/susy/plugins/_svg-grid.scss: -------------------------------------------------------------------------------- 1 | // SVG Grid Background 2 | // =================== 3 | 4 | @import 'svg-grid/prefix'; 5 | @import 'svg-grid/svg-unprefix'; 6 | -------------------------------------------------------------------------------- /assets/images/google-cybersecurity-professional-certificate-v2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GamehunterKaan/kaangultekin.net/master/assets/images/google-cybersecurity-professional-certificate-v2.png -------------------------------------------------------------------------------- /_includes/posts-tag.html: -------------------------------------------------------------------------------- 1 | {% assign posts = site.tags[include.taxonomy] | where_exp: "post", "post.hidden != true" %} 2 | {%- for post in posts -%} 3 | {% include archive-single.html %} 4 | {%- endfor -%} 5 | -------------------------------------------------------------------------------- /_includes/posts-category.html: -------------------------------------------------------------------------------- 1 | {% assign posts = site.categories[include.taxonomy] | where_exp: "post", "post.hidden != true" %} 2 | {%- for post in posts -%} 3 | {% include archive-single.html %} 4 | {%- endfor -%} 5 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_prefix.scss: -------------------------------------------------------------------------------- 1 | // Prefixed SVG Plugin 2 | // =================== 3 | 4 | @import 'svg-settings'; 5 | @import 'svg-utilities'; 6 | @import 'svg-grid-math'; 7 | @import 'svg-api'; 8 | -------------------------------------------------------------------------------- /_includes/paginator.html: -------------------------------------------------------------------------------- 1 | {% if paginator.total_pages > 1 %} 2 | {% if site.paginate %} 3 | {% include paginator-v1.html %} 4 | {% elsif site.pagination.enabled %} 5 | {% include paginator-v2.html %} 6 | {% endif %} 7 | {% endif %} 8 | -------------------------------------------------------------------------------- /_includes/page__taxonomy.html: -------------------------------------------------------------------------------- 1 | {% if site.tag_archive.type and page.tags[0] %} 2 | {% include tag-list.html %} 3 | {% endif %} 4 | 5 | {% if site.category_archive.type and page.categories[0] %} 6 | {% include category-list.html %} 7 | {% endif %} -------------------------------------------------------------------------------- /_sass/minimal-mistakes/skins/_default.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Default skin 3 | ========================================================================== */ 4 | 5 | // Intentionally left blank 6 | -------------------------------------------------------------------------------- /_includes/analytics-providers/custom.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /_includes/author-profile-custom-links.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_layouts/tag.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: archive 3 | --- 4 | 5 | {{ content }} 6 | 7 | {% assign entries_layout = page.entries_layout | default: 'list' %} 8 |
9 | {% include posts-tag.html taxonomy=page.taxonomy type=entries_layout %} 10 |
11 | -------------------------------------------------------------------------------- /_includes/copyright.html: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /_includes/copyright.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Minimal Mistakes Jekyll Theme 4.27.3 by Michael Rose 3 | * Copyright 2013-2025 Michael Rose - mademistakes.com | @mmistakes 4 | * Free for personal and commercial use under the MIT license 5 | * https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE 6 | */ 7 | -------------------------------------------------------------------------------- /_layouts/category.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: archive 3 | --- 4 | 5 | {{ content }} 6 | 7 | {% assign entries_layout = page.entries_layout | default: 'list' %} 8 |
9 | {% include posts-category.html taxonomy=page.taxonomy type=entries_layout %} 10 |
11 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/_copyright.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Minimal Mistakes Jekyll Theme 4.27.3 by Michael Rose 3 | * Copyright 2013-2025 Michael Rose - mademistakes.com | @mmistakes 4 | * Free for personal and commercial use under the MIT license 5 | * https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE 6 | */ 7 | -------------------------------------------------------------------------------- /_includes/toc: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_layouts/collection.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: archive 3 | --- 4 | 5 | {{ content }} 6 | 7 | {% assign entries_layout = page.entries_layout | default: 'list' %} 8 |
9 | {% include documents-collection.html collection=page.collection sort_by=page.sort_by sort_order=page.sort_order type=entries_layout %} 10 |
11 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/susy/_susy-prefix.scss: -------------------------------------------------------------------------------- 1 | // Susy (Prefixed) 2 | // =============== 3 | 4 | $susy-version: 3; 5 | 6 | @import 'susy/utilities'; 7 | @import 'susy/su-validate'; 8 | @import 'susy/su-math'; 9 | @import 'susy/settings'; 10 | @import 'susy/normalize'; 11 | @import 'susy/parse'; 12 | @import 'susy/syntax-helpers'; 13 | @import 'susy/api'; 14 | -------------------------------------------------------------------------------- /_includes/analytics-providers/google-universal.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/_no-query.scss: -------------------------------------------------------------------------------- 1 | @function breakpoint-no-query($query) { 2 | @if type-of($query) == 'list' { 3 | $keyword: nth($query, 1); 4 | 5 | @if type-of($keyword) == 'string' and ($keyword == 'no-query' or $keyword == 'no query' or $keyword == 'fallback') { 6 | @return nth($query, 2); 7 | } 8 | @else { 9 | @return false; 10 | } 11 | } 12 | @else { 13 | @return false; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/_animations.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | ANIMATIONS 3 | ========================================================================== */ 4 | 5 | @-webkit-keyframes intro { 6 | 0% { 7 | opacity: 0; 8 | } 9 | 100% { 10 | opacity: 1; 11 | } 12 | } 13 | 14 | @keyframes intro { 15 | 0% { 16 | opacity: 0; 17 | } 18 | 100% { 19 | opacity: 1; 20 | } 21 | } -------------------------------------------------------------------------------- /_data/navigation.yml: -------------------------------------------------------------------------------- 1 | # main links 2 | main: 3 | - title: "GitHub" 4 | url: https://github.com/GamehunterKaan 5 | - title: "About Me" 6 | url: https://kaangultekin.net/aboutme/ 7 | # - title: "About" 8 | # url: https://mmistakes.github.io/minimal-mistakes/about/ 9 | # - title: "Sample Posts" 10 | # url: /year-archive/ 11 | # - title: "Sample Collections" 12 | # url: /collection-archive/ 13 | # - title: "Sitemap" 14 | # url: /sitemap/ -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-unprefix.scss: -------------------------------------------------------------------------------- 1 | // Unprefix Susy SVG Grid 2 | // ====================== 3 | 4 | 5 | 6 | // SVG Grid 7 | // -------- 8 | /// Un-prefixed alias for `susy-svg-grid` 9 | /// 10 | /// @group plugin_svg-grid 11 | /// @alias susy-svg-grid 12 | @function svg-grid( 13 | $grid: $susy, 14 | $colors: susy-get('svg-grid-colors'), 15 | $offset: null 16 | ) { 17 | @return susy-svg-grid($grid, $colors, $offset); 18 | } 19 | -------------------------------------------------------------------------------- /_includes/comments-providers/facebook.html: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /_includes/documents-collection.html: -------------------------------------------------------------------------------- 1 | {% assign entries = include.entries | default: site[include.collection] | where_exp: "post", "post.hidden != true" %} 2 | 3 | {% if include.sort_by %} 4 | {% assign entries = entries | sort: include.sort_by %} 5 | {% endif %} 6 | 7 | {% if include.sort_order == 'reverse' %} 8 | {% assign entries = entries | reverse %} 9 | {% endif %} 10 | 11 | {%- for post in entries -%} 12 | {% include archive-single.html type=include.type %} 13 | {%- endfor -%} 14 | -------------------------------------------------------------------------------- /_includes/search/lunr-search-scripts.html: -------------------------------------------------------------------------------- 1 | {% assign lang = site.locale | slice: 0,2 | default: "en" %} 2 | {% case lang %} 3 | {% when "gr" %} 4 | {% assign lang = "gr" %} 5 | {% else %} 6 | {% assign lang = "en" %} 7 | {% endcase %} 8 | 9 | 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Vim 2 | *~ 3 | *.sw[p_] 4 | 5 | # IntelliJ IDEA 6 | *.idea 7 | 8 | # Sublime Text 9 | *.sublime-project 10 | *.sublime-workspace 11 | 12 | # Ruby Gem 13 | *.gem 14 | .bundle 15 | Gemfile.lock 16 | **/vendor/bundle 17 | 18 | # Node.js and NPM 19 | node_modules 20 | npm-debug.log* 21 | package-lock.json 22 | codekit-config.json 23 | 24 | # macOS 25 | .DS_Store 26 | 27 | # Jekyll generated files 28 | .jekyll-cache 29 | .jekyll-metadata 30 | .sass-cache 31 | _asset_bundler_cache 32 | _site 33 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/parsers/single/_default.scss: -------------------------------------------------------------------------------- 1 | @function breakpoint-parse-default($feature) { 2 | $default: breakpoint-get('default feature'); 3 | 4 | // Set Context 5 | $context-setter: private-breakpoint-set-context($default, $feature); 6 | 7 | @if (breakpoint-get('to ems') == true) and (type-of($feature) == 'number') { 8 | @return '#{$default}: #{breakpoint-to-base-em($feature)}'; 9 | } 10 | @else { 11 | @return '#{$default}: #{$feature}'; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /_includes/analytics-providers/google-gtag.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | -------------------------------------------------------------------------------- /_includes/skip-links.html: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-settings.scss: -------------------------------------------------------------------------------- 1 | // SVG Settings 2 | // ============ 3 | 4 | 5 | // Susy SVG Defaults 6 | // ================= 7 | /// This plugin adds the `svg-grid-colors` property 8 | /// and default value to `$_susy-defaults` — 9 | /// you can override that value in `$susy` 10 | /// or any other grid settings map. 11 | /// @group plugin_svg-grid 12 | $_susy-defaults: map-merge(( 13 | 'svg-grid-colors': hsla(120, 50%, 50%, 0.5) hsla(120, 50%, 75%, 0.5), 14 | ), $_susy-defaults); 15 | -------------------------------------------------------------------------------- /_includes/analytics.html: -------------------------------------------------------------------------------- 1 | {% if jekyll.environment == 'production' and site.analytics.provider and page.analytics != false %} 2 | 3 | {% case site.analytics.provider %} 4 | {% when "google" %} 5 | {% include /analytics-providers/google.html %} 6 | {% when "google-universal" %} 7 | {% include /analytics-providers/google-universal.html %} 8 | {% when "google-gtag" %} 9 | {% include /analytics-providers/google-gtag.html %} 10 | {% when "custom" %} 11 | {% include /analytics-providers/custom.html %} 12 | {% endcase %} 13 | 14 | {% endif %} -------------------------------------------------------------------------------- /_includes/page__related.html: -------------------------------------------------------------------------------- 1 | {% assign posts = include.posts | where_exp: "post", "post.hidden != true" %} 2 | 12 | -------------------------------------------------------------------------------- /_layouts/home.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: archive 3 | --- 4 | 5 | {{ content }} 6 | 7 |

{{ site.data.ui-text[site.locale].recent_posts | default: "Recent Posts" }}

8 | 9 | {% if paginator %} 10 | {% assign posts = paginator.posts %} 11 | {% else %} 12 | {% assign posts = site.posts %} 13 | {% endif %} 14 | 15 | {% assign entries_layout = page.entries_layout | default: 'list' %} 16 |
17 | {% include documents-collection.html entries=posts type=entries_layout %} 18 |
19 | 20 | {% include paginator.html %} 21 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default.scss: -------------------------------------------------------------------------------- 1 | @function breakpoint-parse-double-default($first, $second) { 2 | $feature: ''; 3 | $value: ''; 4 | 5 | @if type-of($first) == 'string' { 6 | $feature: $first; 7 | $value: $second; 8 | } 9 | @else { 10 | $feature: $second; 11 | $value: $first; 12 | } 13 | 14 | // Set Context 15 | $context-setter: private-breakpoint-set-context($feature, $value); 16 | 17 | @if (breakpoint-get('to ems') == true) { 18 | $value: breakpoint-to-base-em($value); 19 | } 20 | 21 | @return '(#{$feature}: #{$value})' 22 | } 23 | -------------------------------------------------------------------------------- /_includes/figure: -------------------------------------------------------------------------------- 1 |
2 | {%- if include.popup -%}{%- endif -%} 3 | {% if include.alt %}{{ include.alt | escape_once }}{% endif %} 5 | {%- if include.popup -%}{%- endif -%} 6 | {%- if include.caption -%} 7 |
8 | {{ include.caption | markdownify | remove: "

" | remove: "

" }} 9 |
10 | {%- endif -%} 11 |
12 | -------------------------------------------------------------------------------- /_includes/analytics-providers/google.html: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/parsers/triple/_default.scss: -------------------------------------------------------------------------------- 1 | @function breakpoint-parse-triple-default($feature, $first, $second) { 2 | 3 | // Sort into min and max 4 | $min: min($first, $second); 5 | $max: max($first, $second); 6 | 7 | // Set Context 8 | $context-setter: private-breakpoint-set-context(min-#{$feature}, $min); 9 | $context-setter: private-breakpoint-set-context(max-#{$feature}, $max); 10 | 11 | // Make them EMs if need be 12 | @if (breakpoint-get('to ems') == true) { 13 | $min: breakpoint-to-base-em($min); 14 | $max: breakpoint-to-base-em($max); 15 | } 16 | 17 | @return '(min-#{$feature}: #{$min}) and (max-#{$feature}: #{$max})'; 18 | } 19 | -------------------------------------------------------------------------------- /_includes/schema.html: -------------------------------------------------------------------------------- 1 | 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minimal-mistakes", 3 | "private": true, 4 | "version": "4.27.3", 5 | "description": "Minimal Mistakes 2 column Jekyll theme.", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/mmistakes/minimal-mistakes.git" 9 | }, 10 | "keywords": [ 11 | "jekyll", 12 | "theme", 13 | "minimal" 14 | ], 15 | "author": "Michael Rose", 16 | "license": "MIT", 17 | "bugs": { 18 | "url": "https://github.com/mmistakes/minimal-mistakes/issues" 19 | }, 20 | "homepage": "https://mmistakes.github.io/minimal-mistakes/", 21 | "engines": { 22 | "node": ">= 0.10.0" 23 | }, 24 | "devDependencies": { 25 | "uglify-js": "^3.17.4" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_double-string.scss: -------------------------------------------------------------------------------- 1 | @function breakpoint-parse-double-string($first, $second) { 2 | $feature: ''; 3 | $value: ''; 4 | 5 | // Test to see which is the feature and which is the value 6 | @if (breakpoint-string-value($first) == true) { 7 | $feature: $first; 8 | $value: $second; 9 | } 10 | @else if (breakpoint-string-value($second) == true) { 11 | $feature: $second; 12 | $value: $first; 13 | } 14 | @else { 15 | @warn "Neither #{$first} nor #{$second} is a valid media query name."; 16 | } 17 | 18 | // Set Context 19 | $context-setter: private-breakpoint-set-context($feature, $value); 20 | 21 | @return '(#{$feature}: #{$value})'; 22 | } -------------------------------------------------------------------------------- /_includes/page__date.html: -------------------------------------------------------------------------------- 1 | {% assign date_format = site.date_format | default: "%B %-d, %Y" %} 2 | {% if page.last_modified_at %} 3 |

{{ site.data.ui-text[site.locale].date_label | default: "Updated:" }}

4 | {% elsif page.date %} 5 |

{{ site.data.ui-text[site.locale].date_label | default: "Updated:" }}

6 | {% endif %} -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default-pair.scss: -------------------------------------------------------------------------------- 1 | @function breakpoint-parse-default-pair($first, $second) { 2 | $default: breakpoint-get('default pair'); 3 | $min: ''; 4 | $max: ''; 5 | 6 | // Sort into min and max 7 | $min: min($first, $second); 8 | $max: max($first, $second); 9 | 10 | // Set Context 11 | $context-setter: private-breakpoint-set-context(min-#{$default}, $min); 12 | $context-setter: private-breakpoint-set-context(max-#{$default}, $max); 13 | 14 | // Make them EMs if need be 15 | @if (breakpoint-get('to ems') == true) { 16 | $min: breakpoint-to-base-em($min); 17 | $max: breakpoint-to-base-em($max); 18 | } 19 | 20 | @return '(min-#{$default}: #{$min}) and (max-#{$default}: #{$max})'; 21 | } 22 | -------------------------------------------------------------------------------- /_includes/sidebar.html: -------------------------------------------------------------------------------- 1 | {% if page.author_profile or layout.author_profile or page.sidebar %} 2 | 19 | {% endif %} 20 | -------------------------------------------------------------------------------- /_includes/comments-providers/scripts.html: -------------------------------------------------------------------------------- 1 | {% if site.comments.provider and page.comments %} 2 | {% case site.comments.provider %} 3 | {% when "disqus" %} 4 | {% include /comments-providers/disqus.html %} 5 | {% when "discourse" %} 6 | {% include /comments-providers/discourse.html %} 7 | {% when "facebook" %} 8 | {% include /comments-providers/facebook.html %} 9 | {% when "staticman" %} 10 | {% include /comments-providers/staticman.html %} 11 | {% when "staticman_v2" %} 12 | {% include /comments-providers/staticman_v2.html %} 13 | {% when "utterances" %} 14 | {% include /comments-providers/utterances.html %} 15 | {% when "giscus" %} 16 | {% include /comments-providers/giscus.html %} 17 | {% when "custom" %} 18 | {% include /comments-providers/custom_scripts.html %} 19 | {% endcase %} 20 | {% endif %} -------------------------------------------------------------------------------- /_layouts/archive.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 | {% if page.header.overlay_color or page.header.overlay_image or page.header.image %} 6 | {% include page__hero.html %} 7 | {% elsif page.header.video.id and page.header.video.provider %} 8 | {% include page__hero_video.html %} 9 | {% endif %} 10 | 11 | {% if page.url != "/" and site.breadcrumbs %} 12 | {% unless paginator %} 13 | {% include breadcrumbs.html %} 14 | {% endunless %} 15 | {% endif %} 16 | 17 |
18 | {% include sidebar.html %} 19 | 20 |
21 | {% unless page.header.overlay_color or page.header.overlay_image %} 22 |

{{ page.title }}

23 | {% endunless %} 24 | {{ content }} 25 |
26 |
27 | -------------------------------------------------------------------------------- /_includes/comments-providers/disqus.html: -------------------------------------------------------------------------------- 1 | {% if site.comments.disqus.shortname %} 2 | 14 | 15 | {% endif %} 16 | -------------------------------------------------------------------------------- /_includes/tag-list.html: -------------------------------------------------------------------------------- 1 | {% case site.tag_archive.type %} 2 | {% when "liquid" %} 3 | {% assign path_type = "#" %} 4 | {% when "jekyll-archives" %} 5 | {% assign path_type = nil %} 6 | {% endcase %} 7 | 8 | {% if site.tag_archive.path %} 9 | {% assign tags_sorted = page.tags | sort_natural %} 10 | 11 |

12 | {{ site.data.ui-text[site.locale].tags_label | default: "Tags:" }} 13 | 14 | {% for tag_word in tags_sorted %} 15 | {% unless forloop.last %}, {% endunless %} 16 | {% endfor %} 17 | 18 |

19 | {% endif %} -------------------------------------------------------------------------------- /_sass/minimal-mistakes/skins/_air.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Air skin 3 | ========================================================================== */ 4 | 5 | /* Colors */ 6 | $background-color: #eeeeee !default; 7 | $text-color: #222831 !default; 8 | $muted-text-color: #393e46 !default; 9 | $primary-color: #0092ca !default; 10 | $border-color: mix(#fff, #393e46, 75%) !default; 11 | $footer-background-color: $primary-color !default; 12 | $link-color: #393e46 !default; 13 | $masthead-link-color: $text-color !default; 14 | $masthead-link-color-hover: $text-color !default; 15 | $navicon-link-color-hover: mix(#fff, $text-color, 80%) !default; 16 | 17 | .page__footer { 18 | color: #fff !important; // override 19 | } 20 | 21 | .page__footer-follow .social-icons .svg-inline--fa { 22 | color: inherit; 23 | } 24 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/parsers/_single.scss: -------------------------------------------------------------------------------- 1 | ////////////////////////////// 2 | // Import Pieces 3 | ////////////////////////////// 4 | @import "single/default"; 5 | 6 | @function breakpoint-parse-single($feature, $empty-media, $first) { 7 | $parsed: ''; 8 | $leader: ''; 9 | // If we're forcing 10 | @if not ($empty-media) or not ($first) { 11 | $leader: 'and '; 12 | } 13 | 14 | // If it's a single feature that can stand alone, we let it 15 | @if (breakpoint-single-string($feature)) { 16 | $parsed: $feature; 17 | // Set Context 18 | $context-setter: private-breakpoint-set-context($feature, $feature); 19 | } 20 | // If it's not a stand alone feature, we pass it off to the default handler. 21 | @else { 22 | $parsed: breakpoint-parse-default($feature); 23 | } 24 | 25 | @return $leader + '(' + $parsed + ')'; 26 | } 27 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/_tables.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | TABLES 3 | ========================================================================== */ 4 | 5 | table { 6 | display: block; 7 | margin-bottom: 1em; 8 | width: 100%; 9 | font-family: $global-font-family; 10 | font-size: $type-size-6; 11 | border-collapse: collapse; 12 | overflow-x: auto; 13 | 14 | & + table { 15 | margin-top: 1em; 16 | } 17 | } 18 | 19 | thead { 20 | background-color: $border-color; 21 | border-bottom: 2px solid mix(#000, $border-color, 25%); 22 | } 23 | 24 | th { 25 | padding: 0.5em; 26 | font-weight: bold; 27 | text-align: start; 28 | } 29 | 30 | td { 31 | padding: 0.5em; 32 | border-bottom: 1px solid mix(#000, $border-color, 25%); 33 | } 34 | 35 | tr, 36 | td, 37 | th { 38 | vertical-align: middle; 39 | } 40 | -------------------------------------------------------------------------------- /_includes/comments-providers/utterances.html: -------------------------------------------------------------------------------- 1 | 22 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/skins/_mint.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Mint skin 3 | ========================================================================== */ 4 | 5 | /* Colors */ 6 | $background-color: #f3f6f6 !default; 7 | $text-color: #40514e !default; 8 | $muted-text-color: #40514e !default; 9 | $primary-color: #11999e !default; 10 | $border-color: mix(#fff, #40514e, 75%) !default; 11 | $footer-background-color: #30e3ca !default; 12 | $link-color: #11999e !default; 13 | $masthead-link-color: $text-color !default; 14 | $masthead-link-color-hover: $text-color !default; 15 | $navicon-link-color-hover: mix(#fff, $text-color, 80%) !default; 16 | 17 | .page__footer { 18 | color: #fff !important; // override 19 | } 20 | 21 | .page__footer-follow .social-icons i, 22 | .page__footer-follow .social-icons .svg-inline--fa { 23 | color: inherit; 24 | } 25 | -------------------------------------------------------------------------------- /_includes/comments-providers/discourse.html: -------------------------------------------------------------------------------- 1 | {% if site.comments.discourse.server %} 2 | {% capture canonical %}{% if site.permalink contains '.html' %}{{ page.url | absolute_url }}{% else %}{{ page.url | absolute_url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %} 3 | 12 | 13 | {% endif %} 14 | -------------------------------------------------------------------------------- /_includes/category-list.html: -------------------------------------------------------------------------------- 1 | {% case site.category_archive.type %} 2 | {% when "liquid" %} 3 | {% assign path_type = "#" %} 4 | {% when "jekyll-archives" %} 5 | {% assign path_type = nil %} 6 | {% endcase %} 7 | 8 | {% if site.category_archive.path %} 9 | {% assign categories_sorted = page.categories | sort_natural %} 10 | 11 |

12 | {{ site.data.ui-text[site.locale].categories_label | default: "Categories:" }} 13 | 14 | {% for category_word in categories_sorted %} 15 | {% unless forloop.last %}, {% endunless %} 16 | {% endfor %} 17 | 18 |

19 | {% endif %} -------------------------------------------------------------------------------- /_layouts/archive-taxonomy.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | author_profile: false 4 | --- 5 | 6 | {% if page.header.overlay_color or page.header.overlay_image or page.header.image %} 7 | {% include page__hero.html %} 8 | {% elsif page.header.video.id and page.header.video.provider %} 9 | {% include page__hero_video.html %} 10 | {% endif %} 11 | 12 | {% if page.url != "/" and site.breadcrumbs %} 13 | {% unless paginator %} 14 | {% include breadcrumbs.html %} 15 | {% endunless %} 16 | {% endif %} 17 | 18 |
19 | {% include sidebar.html %} 20 | 21 |
22 | {% unless page.header.overlay_color or page.header.overlay_image %} 23 |

{{ page.title }}

24 | {% endunless %} 25 | {% for post in page.posts %} 26 | {% include archive-single.html %} 27 | {% endfor %} 28 |
29 |
30 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/parsers/_triple.scss: -------------------------------------------------------------------------------- 1 | ////////////////////////////// 2 | // Import Pieces 3 | ////////////////////////////// 4 | @import "triple/default"; 5 | 6 | @function breakpoint-parse-triple($feature, $empty-media, $first) { 7 | $parsed: ''; 8 | $leader: ''; 9 | 10 | // If we're forcing 11 | @if not ($empty-media) or not ($first) { 12 | $leader: 'and '; 13 | } 14 | 15 | // separate the string features from the value numbers 16 | $string: null; 17 | $numbers: null; 18 | @each $val in $feature { 19 | @if type-of($val) == string { 20 | $string: $val; 21 | } 22 | @else { 23 | @if type-of($numbers) == 'null' { 24 | $numbers: $val; 25 | } 26 | @else { 27 | $numbers: append($numbers, $val); 28 | } 29 | } 30 | } 31 | 32 | $parsed: breakpoint-parse-triple-default($string, nth($numbers, 1), nth($numbers, 2)); 33 | 34 | @return $leader + $parsed; 35 | 36 | } 37 | -------------------------------------------------------------------------------- /_includes/post_pagination.html: -------------------------------------------------------------------------------- 1 | {% if page.previous or page.next %} 2 | 14 | {% endif %} 15 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/parsers/_resolution.scss: -------------------------------------------------------------------------------- 1 | @import "resolution/resolution"; 2 | 3 | @function breakpoint-build-resolution($query-print, $query-resolution, $empty-media, $first) { 4 | $leader: ''; 5 | // If we're forcing 6 | @if not ($empty-media) or not ($first) { 7 | $leader: 'and '; 8 | } 9 | 10 | @if breakpoint-get('transform resolutions') and $query-resolution { 11 | $resolutions: breakpoint-make-resolutions($query-resolution); 12 | $length: length($resolutions); 13 | $query-holder: ''; 14 | 15 | @for $i from 1 through $length { 16 | $query: '#{$query-print} #{$leader}#{nth($resolutions, $i)}'; 17 | @if $i == 1 { 18 | $query-holder: $query; 19 | } 20 | @else { 21 | $query-holder: '#{$query-holder}, #{$query}'; 22 | } 23 | } 24 | 25 | @return $query-holder; 26 | } 27 | @else { 28 | // Return with attached resolution 29 | @return $query-print; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /_includes/search/google-search-scripts.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_includes/video: -------------------------------------------------------------------------------- 1 | {% capture video_id %}{{ include.id }}{% endcapture %} 2 | {% capture video_provider %}{{ include.provider }}{% endcapture %} 3 | {% capture video_danmaku %}{{ include.danmaku | default: 0 }}{% endcapture %} 4 | 5 | {% capture video_src %} 6 | {% case video_provider %} 7 | {% when "vimeo" %} 8 | https://player.vimeo.com/video/{{ video_id }}?dnt=true 9 | {% when "youtube" %} 10 | https://www.youtube-nocookie.com/embed/{{ video_id }} 11 | {% when "google-drive" %} 12 | https://drive.google.com/file/d/{{ video_id }}/preview 13 | {% when "bilibili" %} 14 | https://player.bilibili.com/player.html?bvid={{ video_id }}&page=1&as_wide=1&high_quality=1&danmaku={{ video_danmaku }} 15 | {% endcase %} 16 | {% endcapture %} 17 | {% assign video_src = video_src | strip %} 18 | 19 | 20 | {% unless video_src == "" %} 21 |
22 | 23 |
24 | {% endunless %} 25 | -------------------------------------------------------------------------------- /_layouts/splash.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 | {% if page.header.overlay_color or page.header.overlay_image or page.header.image %} 6 | {% include page__hero.html %} 7 | {% elsif page.header.video.id and page.header.video.provider %} 8 | {% include page__hero_video.html %} 9 | {% endif %} 10 | 11 |
12 |
13 | {% if page.title %}{% endif %} 14 | {% if page.excerpt %}{% endif %} 15 | {% if page.date %}{% endif %} 16 | {% if page.last_modified_at %}{% endif %} 17 | 18 |
19 | {{ content }} 20 |
21 |
22 |
23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013-2024 Michael Rose and contributors 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 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/susy/susy/_unprefix.scss: -------------------------------------------------------------------------------- 1 | // Unprefix Susy 2 | // ============= 3 | 4 | 5 | // Span 6 | // ---- 7 | /// Un-prefixed alias for `susy-span` 8 | /// (available by default) 9 | /// 10 | /// @group api 11 | /// @alias susy-span 12 | /// 13 | /// @param {list} $span 14 | /// @param {map} $config [()] 15 | @function span( 16 | $span, 17 | $config: () 18 | ) { 19 | @return susy-span($span, $config); 20 | } 21 | 22 | 23 | // Gutter 24 | // ------ 25 | /// Un-prefixed alias for `susy-gutter` 26 | /// (available by default) 27 | /// 28 | /// @group api 29 | /// @alias susy-gutter 30 | /// 31 | /// @param {integer | list} $context [null] - 32 | /// @param {map} $config [()] 33 | @function gutter( 34 | $context: susy-get('columns'), 35 | $config: () 36 | ) { 37 | @return susy-gutter($context, $config); 38 | } 39 | 40 | 41 | // Slice 42 | // ----- 43 | /// Un-prefixed alias for `susy-slice` 44 | /// (available by default) 45 | /// 46 | /// @group api 47 | /// @alias susy-slice 48 | /// 49 | /// @param {list} $span 50 | /// @param {map} $config [()] 51 | @function slice( 52 | $span, 53 | $config: () 54 | ) { 55 | @return susy-slice($span, $config); 56 | } 57 | -------------------------------------------------------------------------------- /_includes/nav_list: -------------------------------------------------------------------------------- 1 | 28 | -------------------------------------------------------------------------------- /_layouts/posts.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: archive 3 | --- 4 | 5 | {{ content }} 6 | 7 | 17 | 18 | {% assign entries_layout = page.entries_layout | default: 'list' %} 19 | {% assign postsByYear = site.posts | where_exp: "item", "item.hidden != true" | group_by_exp: 'post', 'post.date | date: "%Y"' %} 20 | {% for year in postsByYear %} 21 |
22 |

{{ year.name }}

23 |
24 | {% for post in year.items %} 25 | {% include archive-single.html type=entries_layout %} 26 | {% endfor %} 27 |
28 | {{ site.data.ui-text[site.locale].back_to_top | default: 'Back to Top' }} ↑ 29 |
30 | {% endfor %} 31 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/skins/_dirt.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Dirt skin 3 | ========================================================================== */ 4 | 5 | /* Colors */ 6 | $background-color: #f3f3f3 !default; 7 | $text-color: #343434 !default; 8 | $muted-text-color: #8e8b82 !default; 9 | $primary-color: #343434 !default; 10 | $border-color: #e9dcbe !default; 11 | $footer-background-color: #e9dcbe !default; 12 | $link-color: #343434 !default; 13 | $masthead-link-color: $text-color !default; 14 | $masthead-link-color-hover: $text-color !default; 15 | $navicon-link-color-hover: mix(#fff, $text-color, 80%) !default; 16 | 17 | /* dirt syntax highlighting (base16) */ 18 | $base00: #231e18 !default; 19 | $base01: #302b25 !default; 20 | $base02: #48413a !default; 21 | $base03: #9d8b70 !default; 22 | $base04: #b4a490 !default; 23 | $base05: #cabcb1 !default; 24 | $base06: #d7c8bc !default; 25 | $base07: #e4d4c8 !default; 26 | $base08: #d35c5c !default; 27 | $base09: #ca7f32 !default; 28 | $base0a: #e0ac16 !default; 29 | $base0b: #b7ba53 !default; 30 | $base0c: #6eb958 !default; 31 | $base0d: #88a4d3 !default; 32 | $base0e: #bb90e2 !default; 33 | $base0f: #b49368 !default; 34 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes.scss: -------------------------------------------------------------------------------- 1 | /* Copyright comment */ 2 | @import "minimal-mistakes/copyright"; 3 | 4 | /* Variables */ 5 | @import "minimal-mistakes/variables"; 6 | 7 | /* Mixins and functions */ 8 | @import "minimal-mistakes/vendor/breakpoint/breakpoint"; 9 | @include breakpoint-set("to ems", true); 10 | @import "minimal-mistakes/vendor/magnific-popup/magnific-popup"; // Magnific Popup 11 | @import "minimal-mistakes/vendor/susy/susy"; 12 | @import "minimal-mistakes/mixins"; 13 | 14 | /* Core CSS */ 15 | @import "minimal-mistakes/reset"; 16 | @import "minimal-mistakes/base"; 17 | @import "minimal-mistakes/forms"; 18 | @import "minimal-mistakes/tables"; 19 | @import "minimal-mistakes/animations"; 20 | 21 | /* Components */ 22 | @import "minimal-mistakes/buttons"; 23 | @import "minimal-mistakes/notices"; 24 | @import "minimal-mistakes/masthead"; 25 | @import "minimal-mistakes/navigation"; 26 | @import "minimal-mistakes/footer"; 27 | @import "minimal-mistakes/search"; 28 | @import "minimal-mistakes/syntax"; 29 | 30 | /* Utility classes */ 31 | @import "minimal-mistakes/utilities"; 32 | 33 | /* Layout specific */ 34 | @import "minimal-mistakes/page"; 35 | @import "minimal-mistakes/archive"; 36 | @import "minimal-mistakes/sidebar"; 37 | @import "minimal-mistakes/print"; 38 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/parsers/_double.scss: -------------------------------------------------------------------------------- 1 | ////////////////////////////// 2 | // Import Pieces 3 | ////////////////////////////// 4 | @import "double/default-pair"; 5 | @import "double/double-string"; 6 | @import "double/default"; 7 | 8 | @function breakpoint-parse-double($feature, $empty-media, $first) { 9 | $parsed: ''; 10 | $leader: ''; 11 | // If we're forcing 12 | @if not ($empty-media) or not ($first) { 13 | $leader: 'and '; 14 | } 15 | 16 | $first: nth($feature, 1); 17 | $second: nth($feature, 2); 18 | 19 | // If we've got two numbers, we know we need to use the default pair because there are no media queries that has a media feature that is a number 20 | @if type-of($first) == 'number' and type-of($second) == 'number' { 21 | $parsed: breakpoint-parse-default-pair($first, $second); 22 | } 23 | // If they are both strings, we send it through the string parser 24 | @else if type-of($first) == 'string' and type-of($second) == 'string' { 25 | $parsed: breakpoint-parse-double-string($first, $second); 26 | } 27 | // If it's a string/number pair, we parse it as a normal double 28 | @else { 29 | $parsed: breakpoint-parse-double-default($first, $second); 30 | } 31 | 32 | @return $leader + $parsed; 33 | } 34 | -------------------------------------------------------------------------------- /_includes/gallery: -------------------------------------------------------------------------------- 1 | {% if include.id %} 2 | {% assign gallery = page[include.id] %} 3 | {% else %} 4 | {% assign gallery = page.gallery %} 5 | {% endif %} 6 | 7 | {% if include.layout %} 8 | {% assign gallery_layout = include.layout %} 9 | {% else %} 10 | {% if gallery.size == 2 %} 11 | {% assign gallery_layout = 'half' %} 12 | {% elsif gallery.size >= 3 %} 13 | {% assign gallery_layout = 'third' %} 14 | {% else %} 15 | {% assign gallery_layout = '' %} 16 | {% endif %} 17 | {% endif %} 18 | 19 | 36 | -------------------------------------------------------------------------------- /_includes/comment.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | {{ include.name }} 4 |
5 |
6 | 13 |

14 | {% if include.date %} 15 | {% if include.index %}{% endif %} 18 | {% endif %} 19 |

20 |
{{ include.message | markdownify }}
21 |
22 |
23 | -------------------------------------------------------------------------------- /minimal-mistakes-jekyll.gemspec: -------------------------------------------------------------------------------- 1 | require "json" 2 | 3 | package_json = JSON.parse(File.read("package.json")) 4 | 5 | Gem::Specification.new do |spec| 6 | spec.name = "minimal-mistakes-jekyll" 7 | spec.version = package_json["version"] 8 | spec.authors = ["Michael Rose", "iBug"] 9 | 10 | spec.summary = %q{A flexible two-column Jekyll theme.} 11 | spec.homepage = "https://github.com/mmistakes/minimal-mistakes" 12 | spec.license = "MIT" 13 | 14 | spec.metadata["plugin_type"] = "theme" 15 | 16 | spec.files = `git ls-files -z`.split("\x0").select do |f| 17 | f.match(%r{^(assets|_(data|includes|layouts|sass)/|(LICENSE|README|CHANGELOG)((\.(txt|md|markdown)|$)))}i) 18 | end 19 | 20 | spec.add_runtime_dependency "jekyll", ">= 3.7", "< 5.0" 21 | spec.add_runtime_dependency "jekyll-paginate", "~> 1.1" 22 | spec.add_runtime_dependency "jekyll-sitemap", "~> 1.3" 23 | spec.add_runtime_dependency "jekyll-gist", "~> 1.5" 24 | spec.add_runtime_dependency "jekyll-feed", "~> 0.1" 25 | spec.add_runtime_dependency "jekyll-include-cache", "~> 0.1" 26 | 27 | spec.add_development_dependency "bundler" 28 | spec.add_development_dependency "rake", ">= 12.3.3" 29 | end 30 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | 4 | 5 | {% include copyright.html %} 6 | 7 | 8 | {% include head.html %} 9 | {% include head/custom.html %} 10 | 11 | 12 | 13 | {% include_cached skip-links.html %} 14 | {% include_cached masthead.html %} 15 | 16 |
17 | {{ content }} 18 | {% include after-content.html %} 19 |
20 | 21 | {% if site.search == true %} 22 |
23 | {% include_cached search/search_form.html %} 24 |
25 | {% endif %} 26 | 27 | 33 | 34 | {% include scripts.html %} 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /_includes/group-by-array: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | {% assign __empty_array = '' | split: ',' %} 10 | {% assign group_names = __empty_array %} 11 | {% assign group_items = __empty_array %} 12 | 13 | 14 | {% assign __names = include.collection | map: include.field %} 15 | 16 | 17 | {% assign __names = __names | join: ',' | join: ',' | split: ',' %} 18 | 19 | 20 | {% assign __names = __names | sort %} 21 | {% for name in __names %} 22 | 23 | 24 | {% unless name == previous %} 25 | 26 | 27 | {% assign group_names = group_names | push: name %} 28 | {% endunless %} 29 | 30 | {% assign previous = name %} 31 | {% endfor %} 32 | 33 | 34 | 35 | {% for name in group_names %} 36 | 37 | 38 | {% assign __item = __empty_array %} 39 | {% for __element in include.collection %} 40 | {% if __element[include.field] contains name %} 41 | {% assign __item = __item | push: __element %} 42 | {% endif %} 43 | {% endfor %} 44 | 45 | 46 | {% assign group_items = group_items | push: __item %} 47 | {% endfor %} -------------------------------------------------------------------------------- /_includes/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% include seo.html %} 4 | 5 | {% unless site.atom_feed.hide %} 6 | 7 | {% endunless %} 8 | 9 | {%- comment %} https://docs.google.com/presentation/d/1rmxwWa9P6_xHqonmh5ONXRS-jPc5XKbnv99Rjkhe04s/present {% endcomment -%} 10 | 11 | 12 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | {% if site.head_scripts %} 25 | {% for script in site.head_scripts %} 26 | 27 | {% endfor %} 28 | {% endif %} 29 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/skins/_dark.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Dark skin 3 | ========================================================================== */ 4 | 5 | /* Colors */ 6 | $background-color: #252a34 !default; 7 | $text-color: #eaeaea !default; 8 | $primary-color: #00adb5 !default; 9 | $border-color: mix(#fff, $background-color, 20%) !default; 10 | $code-background-color: mix(#000, $background-color, 15%) !default; 11 | $code-background-color-dark: mix(#000, $background-color, 20%) !default; 12 | $form-background-color: mix(#000, $background-color, 15%) !default; 13 | $footer-background-color: mix(#000, $background-color, 30%) !default; 14 | $link-color: mix($primary-color, $text-color, 40%) !default; 15 | $link-color-hover: mix(#fff, $link-color, 25%) !default; 16 | $link-color-visited: mix(#000, $link-color, 25%) !default; 17 | $masthead-link-color: $text-color !default; 18 | $masthead-link-color-hover: mix(#000, $text-color, 20%) !default; 19 | $navicon-link-color-hover: mix(#000, $background-color, 30%) !default; 20 | 21 | .author__urls.social-icons i, 22 | .author__urls.social-icons .svg-inline--fa, 23 | .page__footer-follow .social-icons i, 24 | .page__footer-follow .social-icons .svg-inline--fa { 25 | color: inherit; 26 | } 27 | 28 | .ais-search-box .ais-search-box--input { 29 | background-color: $form-background-color; 30 | } 31 | -------------------------------------------------------------------------------- /_includes/posts-taxonomy.html: -------------------------------------------------------------------------------- 1 | {% assign items_max = 0 %} 2 | {% for item in include.taxonomies %} 3 | {% if item[1].size > items_max %} 4 | {% assign items_max = item[1].size %} 5 | {% endif %} 6 | {% endfor %} 7 | 8 | 21 | 22 | {% assign entries_layout = page.entries_layout | default: 'list' %} 23 | {% for i in (1..items_max) reversed %} 24 | {% for taxonomy in include.taxonomies %} 25 | {% if taxonomy[1].size == i %} 26 |
27 |

{{ taxonomy[0] }}

28 |
29 | {% for post in taxonomy.last %} 30 | {% include archive-single.html type=entries_layout %} 31 | {% endfor %} 32 |
33 | {{ site.data.ui-text[site.locale].back_to_top | default: 'Back to Top' }} ↑ 34 |
35 | {% endif %} 36 | {% endfor %} 37 | {% endfor %} 38 | -------------------------------------------------------------------------------- /_includes/archive-single.html: -------------------------------------------------------------------------------- 1 | {% if post.header.teaser %} 2 | {% capture teaser %}{{ post.header.teaser }}{% endcapture %} 3 | {% else %} 4 | {% assign teaser = site.teaser %} 5 | {% endif %} 6 | 7 | {% if post.id %} 8 | {% assign title = post.title | markdownify | remove: "

" | remove: "

" %} 9 | {% else %} 10 | {% assign title = post.title %} 11 | {% endif %} 12 | 13 |
14 |
15 | {% if include.type == "grid" and teaser %} 16 |
17 | 18 |
19 | {% endif %} 20 |

21 | {% if post.link %} 22 | {{ title }} Permalink 23 | {% else %} 24 | {{ title }} 25 | {% endif %} 26 |

27 | {% include page__meta.html type=include.type %} 28 | {% if post.excerpt %}

{{ post.excerpt | markdownify | strip_html | truncate: 160 }}

{% endif %} 29 |
30 |
31 | -------------------------------------------------------------------------------- /_includes/scripts.html: -------------------------------------------------------------------------------- 1 | {% if site.footer_scripts %} 2 | {% for script in site.footer_scripts %} 3 | 4 | {% endfor %} 5 | {% else %} 6 | 7 | {% endif %} 8 | 9 | {% if site.search == true or page.layout == "search" %} 10 | {%- assign search_provider = site.search_provider | default: "lunr" -%} 11 | {%- case search_provider -%} 12 | {%- when "lunr" -%} 13 | {% include_cached search/lunr-search-scripts.html %} 14 | {%- when "google" -%} 15 | {% include_cached search/google-search-scripts.html %} 16 | {%- when "algolia" -%} 17 | {% include_cached search/algolia-search-scripts.html %} 18 | {%- endcase -%} 19 | {% endif %} 20 | 21 | {% include analytics.html %} 22 | {% include /comments-providers/scripts.html %} 23 | 24 | {% if site.after_footer_scripts %} 25 | {% for script in site.after_footer_scripts %} 26 | 27 | {% endfor %} 28 | {% endif %} 29 | 30 | {% if page.use_mermaid %} 31 | 32 | 38 | {% endif %} 39 | -------------------------------------------------------------------------------- /_includes/search/search_form.html: -------------------------------------------------------------------------------- 1 |
2 | {%- assign search_provider = site.search_provider | default: "lunr" -%} 3 | {%- case search_provider -%} 4 | {%- when "lunr" -%} 5 | 11 |
12 | {%- when "google" -%} 13 | 19 |
20 | 21 |
22 | {%- when "algolia" -%} 23 | 24 |
25 | {%- endcase -%} 26 |
27 | -------------------------------------------------------------------------------- /_includes/feature_row: -------------------------------------------------------------------------------- 1 | {% if include.id %} 2 | {% assign feature_row = page[include.id] %} 3 | {% else %} 4 | {% assign feature_row = page.feature_row %} 5 | {% endif %} 6 | 7 |
8 | 9 | {% for f in feature_row %} 10 |
11 |
12 | {% if f.image_path %} 13 |
14 | {% if f.alt %}{{ f.alt }}{% endif %} 16 | {% if f.image_caption %} 17 | {{ f.image_caption | markdownify | remove: "

" | remove: "

" }}
18 | {% endif %} 19 |
20 | {% endif %} 21 | 22 |
23 | {% if f.title %} 24 |

{{ f.title }}

25 | {% endif %} 26 | 27 | {% if f.excerpt %} 28 |
29 | {{ f.excerpt | markdownify }} 30 |
31 | {% endif %} 32 | 33 | {% if f.url %} 34 |

{{ f.btn_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}

35 | {% endif %} 36 |
37 |
38 |
39 | {% endfor %} 40 | 41 |
42 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/skins/_aqua.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Aqua skin 3 | ========================================================================== */ 4 | 5 | /* Colors */ 6 | $gray : #1976d2 !default; 7 | $dark-gray : mix(#000, $gray, 40%) !default; 8 | $darker-gray : mix(#000, $gray, 60%) !default; 9 | $light-gray : mix(#fff, $gray, 50%) !default; 10 | $lighter-gray : mix(#fff, $gray, 90%) !default; 11 | 12 | $body-color : #fff !default; 13 | $background-color : #f0fff0 !default; 14 | $code-background-color : $lighter-gray !default; 15 | $code-background-color-dark : $light-gray !default; 16 | $text-color : $dark-gray !default; 17 | $border-color : $lighter-gray !default; 18 | 19 | $primary-color : $gray !default; 20 | $success-color : #27ae60 !default; 21 | $warning-color : #e67e22 !default; 22 | $danger-color : #c0392b !default; 23 | $info-color : #03a9f4 !default; 24 | 25 | /* links */ 26 | $link-color : $info-color !default; 27 | $link-color-hover : mix(#000, $link-color, 25%) !default; 28 | $link-color-visited : mix(#fff, $link-color, 25%) !default; 29 | $masthead-link-color : $primary-color !default; 30 | $masthead-link-color-hover : mix(#000, $primary-color, 25%) !default; 31 | 32 | /* notices */ 33 | $notice-background-mix: 90% !default; 34 | $code-notice-background-mix: 95% !default; 35 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/skins/_contrast.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Contrast skin 3 | ========================================================================== */ 4 | 5 | /* Colors */ 6 | $text-color: #000 !default; 7 | $muted-text-color: $text-color !default; 8 | $primary-color: #b60000 !default; 9 | $border-color: mix(#fff, $text-color, 75%) !default; 10 | $footer-background-color: #000 !default; 11 | $link-color: #0000ff !default; 12 | $masthead-link-color: $text-color !default; 13 | $masthead-link-color-hover: $text-color !default; 14 | $navicon-link-color-hover: mix(#fff, $text-color, 80%) !default; 15 | 16 | /* contrast syntax highlighting (base16) */ 17 | $base00: #000000 !default; 18 | $base01: #242422 !default; 19 | $base02: #484844 !default; 20 | $base03: #6c6c66 !default; 21 | $base04: #918f88 !default; 22 | $base05: #b5b3aa !default; 23 | $base06: #d9d7cc !default; 24 | $base07: #fdfbee !default; 25 | $base08: #ff6c60 !default; 26 | $base09: #e9c062 !default; 27 | $base0a: #ffffb6 !default; 28 | $base0b: #a8ff60 !default; 29 | $base0c: #c6c5fe !default; 30 | $base0d: #96cbfe !default; 31 | $base0e: #ff73fd !default; 32 | $base0f: #b18a3d !default; 33 | 34 | .page__content { 35 | .notice, 36 | .notice--primary, 37 | .notice--info, 38 | .notice--warning, 39 | .notice--success, 40 | .notice--danger { 41 | color: $text-color; 42 | } 43 | } 44 | 45 | .page__footer { 46 | color: #fff !important; // override 47 | } 48 | 49 | .page__footer-follow .social-icons i, 50 | .page__footer-follow .social-icons .svg-inline--fa { 51 | color: inherit; 52 | } 53 | -------------------------------------------------------------------------------- /_includes/comments-providers/giscus.html: -------------------------------------------------------------------------------- 1 | 35 | -------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- 1 | {% unless site.atom_feed.hide %} 2 | {% assign show_atom = true %} 3 | {% endunless %} 4 | {% if site.footer.links or show_atom %} 5 | 24 | {% endif %} 25 | 26 | 27 | -------------------------------------------------------------------------------- /_layouts/search.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 | {% if page.header.overlay_color or page.header.overlay_image or page.header.image %} 6 | {% include page__hero.html %} 7 | {% endif %} 8 | 9 | {% if page.url != "/" and site.breadcrumbs %} 10 | {% unless paginator %} 11 | {% include breadcrumbs.html %} 12 | {% endunless %} 13 | {% endif %} 14 | 15 |
16 | {% include sidebar.html %} 17 | 18 |
19 | {% unless page.header.overlay_color or page.header.overlay_image %} 20 |

{{ page.title }}

21 | {% endunless %} 22 | 23 | {{ content }} 24 | 25 | {%- assign search_provider = site.search_provider | default: "lunr" -%} 26 | {%- case search_provider -%} 27 | {%- when "lunr" -%} 28 | 29 |
30 | {%- when "google" -%} 31 |
32 | 33 |
34 |
35 | 36 |
37 | {%- when "algolia" -%} 38 | 39 |
40 | {%- endcase -%} 41 |
42 |
43 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-grid-math.scss: -------------------------------------------------------------------------------- 1 | // SVG Grid Math 2 | // ============= 3 | 4 | 5 | 6 | // SVG Column Position 7 | // ------------------- 8 | /// Determine the proper horizontal position 9 | /// for a column rectangle 10 | /// 11 | /// @access private 12 | /// 13 | /// @param {Integer} $column - 14 | /// 1-indexed column location on the grid 15 | /// @param {Map} $grid - 16 | /// Normalized settings map representing the current grid 17 | /// 18 | /// @return {Length} - 19 | /// Horizontal position of svg column rectangle, 20 | /// as distance from the grid edge 21 | @function _susy-svg-column-position( 22 | $column, 23 | $grid 24 | ) { 25 | $x: $column - 1; 26 | 27 | @if ($x > 0) { 28 | $x: susy-span(first $x wide, $grid); 29 | } 30 | 31 | @return $x; 32 | } 33 | 34 | 35 | 36 | // SVG Offset 37 | // ---------- 38 | /// Determine if a grid image needs to be offset, 39 | /// to account for edge gutters. 40 | /// 41 | /// @access private 42 | /// 43 | /// @param {Map} $grid - 44 | /// Normalized settings map representing the current grid 45 | /// 46 | /// @return {Length | null} - 47 | /// Expected distance from container edge to first column, 48 | /// based on spread values and gutter-widths 49 | @function _susy-svg-offset( 50 | $grid 51 | ) { 52 | $columns: su-valid-columns(map-get($grid, 'columns')); 53 | $gutters: su-valid-gutters(map-get($grid, 'gutters')); 54 | $container: su-valid-spread(map-get($grid, 'container-spread')) + 1; 55 | 56 | @if ($container == 0) { 57 | @return null; 58 | } 59 | 60 | $gutter: su-call('su-gutter', $grid); 61 | 62 | @if (type-of($gutter) == 'string') { 63 | @return 'calc(#{$container} * #{$gutter} / 2)'; 64 | } 65 | 66 | @return $container * $gutter / 2; 67 | } 68 | -------------------------------------------------------------------------------- /_includes/page__meta.html: -------------------------------------------------------------------------------- 1 | {% assign document = post | default: page %} 2 | {% if document.read_time or document.show_date %} 3 |

4 | {% if document.show_date and document.date %} 5 | {% assign date = document.date %} 6 | 7 | 8 | {% assign date_format = site.date_format | default: "%B %-d, %Y" %} 9 | 10 | 11 | {% endif %} 12 | 13 | {% if document.read_time and document.show_date %}{% endif %} 14 | 15 | {% if document.read_time %} 16 | {% assign words_per_minute = document.words_per_minute | default: site.words_per_minute | default: 200 %} 17 | {% assign words = document.content | strip_html | number_of_words %} 18 | 19 | 20 | 21 | {% if words < words_per_minute %} 22 | {{ site.data.ui-text[site.locale].less_than | default: "less than" }} 1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }} 23 | {% elsif words == words_per_minute %} 24 | 1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }} 25 | {% else %} 26 | {{ words | divided_by: words_per_minute }} {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }} 27 | {% endif %} 28 | 29 | {% endif %} 30 |

31 | {% endif %} 32 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/_footer.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | FOOTER 3 | ========================================================================== */ 4 | 5 | .page__footer { 6 | @include clearfix; 7 | float: inline-start; 8 | margin-inline: 0; 9 | width: 100%; 10 | margin-top: 3em; 11 | color: $muted-text-color; 12 | -webkit-animation: $intro-transition; 13 | animation: $intro-transition; 14 | -webkit-animation-delay: 0.45s; 15 | animation-delay: 0.45s; 16 | background-color: $footer-background-color; 17 | 18 | footer { 19 | @include clearfix; 20 | margin-inline: auto; 21 | margin-top: 2em; 22 | max-width: 100%; 23 | padding: 0 1em 2em; 24 | 25 | @include breakpoint($x-large) { 26 | max-width: $x-large; 27 | } 28 | } 29 | 30 | a { 31 | color: inherit; 32 | text-decoration: none; 33 | 34 | &:hover { 35 | text-decoration: underline; 36 | } 37 | } 38 | 39 | .fas, 40 | .fab, 41 | .far, 42 | .fal { 43 | color: $muted-text-color; 44 | } 45 | } 46 | 47 | .page__footer-copyright { 48 | font-family: $global-font-family; 49 | font-size: $type-size-7; 50 | } 51 | 52 | .page__footer-follow { 53 | ul { 54 | margin: 0; 55 | padding: 0; 56 | list-style-type: none; 57 | } 58 | 59 | li { 60 | display: inline-block; 61 | padding-top: 5px; 62 | padding-bottom: 5px; 63 | font-family: $sans-serif-narrow; 64 | font-size: $type-size-6; 65 | text-transform: uppercase; 66 | } 67 | 68 | li + li::before { 69 | content: ""; 70 | padding-inline-end: 5px; 71 | } 72 | 73 | a { 74 | padding-inline-end: 10px; 75 | font-weight: bold; 76 | } 77 | 78 | .social-icons { 79 | a { 80 | white-space: nowrap; 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /_includes/breadcrumbs.html: -------------------------------------------------------------------------------- 1 | {% case site.category_archive.type %} 2 | {% when "liquid" %} 3 | {% assign path_type = "#" %} 4 | {% when "jekyll-archives" %} 5 | {% assign path_type = nil %} 6 | {% endcase %} 7 | 8 | {% if page.collection != 'posts' %} 9 | {% assign path_type = nil %} 10 | {% assign crumb_path = '/' %} 11 | {% else %} 12 | {% assign crumb_path = site.category_archive.path %} 13 | {% endif %} 14 | 15 | 41 | -------------------------------------------------------------------------------- /_includes/masthead.html: -------------------------------------------------------------------------------- 1 | {% capture logo_path %}{{ site.logo }}{% endcapture %} 2 | 3 |
4 |
5 |
6 | 37 |
38 |
39 |
40 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/skins/_sunrise.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Sunrise skin 3 | ========================================================================== */ 4 | 5 | /* Colors */ 6 | $dark-gray: #0e2431 !default; 7 | $background-color: #e8d5b7 !default; 8 | $text-color: #000 !default; 9 | $muted-text-color: $dark-gray !default; 10 | $primary-color: #fc3a52 !default; 11 | $border-color: mix(#000, $background-color, 20%) !default; 12 | $code-background-color: mix(#fff, $background-color, 20%) !default; 13 | $code-background-color-dark: mix(#000, $background-color, 10%) !default; 14 | $form-background-color: mix(#fff, $background-color, 15%) !default; 15 | $footer-background-color: #f9b248 !default; 16 | $link-color: mix(#000, $primary-color, 10%) !default; 17 | $link-color-hover: mix(#fff, $link-color, 25%) !default; 18 | $link-color-visited: mix(#000, $link-color, 25%) !default; 19 | $masthead-link-color: $text-color !default; 20 | $masthead-link-color-hover: mix(#000, $text-color, 20%) !default; 21 | $navicon-link-color-hover: mix(#000, $background-color, 30%) !default; 22 | 23 | /* notices */ 24 | $notice-background-mix: 75% !default; 25 | 26 | /* sunrise syntax highlighting (base16) */ 27 | $base00: #1d1f21 !default; 28 | $base01: #282a2e !default; 29 | $base02: #373b41 !default; 30 | $base03: #969896 !default; 31 | $base04: #b4b7b4 !default; 32 | $base05: #c5c8c6 !default; 33 | $base06: #e0e0e0 !default; 34 | $base07: #ffffff !default; 35 | $base08: #cc6666 !default; 36 | $base09: #de935f !default; 37 | $base0a: #f0c674 !default; 38 | $base0b: #b5bd68 !default; 39 | $base0c: #8abeb7 !default; 40 | $base0d: #81a2be !default; 41 | $base0e: #b294bb !default; 42 | $base0f: #a3685a !default; 43 | 44 | .author__urls.social-icons i, 45 | .author__urls.social-icons .svg-inline--fa, 46 | .page__footer-follow .social-icons i, 47 | .page__footer-follow .social-icons .svg-inline--fa { 48 | color: inherit; 49 | } 50 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/parsers/resolution/_resolution.scss: -------------------------------------------------------------------------------- 1 | @function breakpoint-make-resolutions($resolution) { 2 | $length: length($resolution); 3 | 4 | $output: (); 5 | 6 | @if $length == 2 { 7 | $feature: ''; 8 | $value: ''; 9 | 10 | // Find which is number 11 | @if type-of(nth($resolution, 1)) == 'number' { 12 | $value: nth($resolution, 1); 13 | } 14 | @else { 15 | $value: nth($resolution, 2); 16 | } 17 | 18 | // Determine min/max/standard 19 | @if index($resolution, 'min-resolution') { 20 | $feature: 'min-'; 21 | } 22 | @else if index($resolution, 'max-resolution') { 23 | $feature: 'max-'; 24 | } 25 | 26 | $standard: '(#{$feature}resolution: #{$value})'; 27 | 28 | // If we're not dealing with dppx, 29 | @if unit($value) != 'dppx' { 30 | $base: 96dpi; 31 | @if unit($value) == 'dpcm' { 32 | $base: 243.84dpcm; 33 | } 34 | // Write out feature tests 35 | $webkit: ''; 36 | $moz: ''; 37 | $webkit: '(-webkit-#{$feature}device-pixel-ratio: #{$value / $base})'; 38 | $moz: '(#{$feature}-moz-device-pixel-ratio: #{$value / $base})'; 39 | // Append to output 40 | $output: append($output, $standard, space); 41 | $output: append($output, $webkit, space); 42 | $output: append($output, $moz, space); 43 | } 44 | @else { 45 | $webkit: ''; 46 | $moz: ''; 47 | $webkit: '(-webkit-#{$feature}device-pixel-ratio: #{$value / 1dppx})'; 48 | $moz: '(#{$feature}-moz-device-pixel-ratio: #{$value / 1dppx})'; 49 | $fallback: '(#{$feature}resolution: #{$value / 1dppx * 96dpi})'; 50 | // Append to output 51 | $output: append($output, $standard, space); 52 | $output: append($output, $webkit, space); 53 | $output: append($output, $moz, space); 54 | $output: append($output, $fallback, space); 55 | } 56 | 57 | } 58 | 59 | @return $output; 60 | } 61 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/_masthead.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | MASTHEAD 3 | ========================================================================== */ 4 | 5 | .masthead { 6 | position: relative; 7 | border-bottom: 1px solid $border-color; 8 | -webkit-animation: $intro-transition; 9 | animation: $intro-transition; 10 | -webkit-animation-delay: 0.15s; 11 | animation-delay: 0.15s; 12 | z-index: 20; 13 | 14 | &__inner-wrap { 15 | @include clearfix; 16 | margin-inline: auto; 17 | padding: 1em; 18 | max-width: 100%; 19 | display: -webkit-box; 20 | display: -ms-flexbox; 21 | display: flex; 22 | -webkit-box-pack: justify; 23 | -ms-flex-pack: justify; 24 | justify-content: space-between; 25 | font-family: $sans-serif-narrow; 26 | 27 | @include breakpoint($x-large) { 28 | max-width: $max-width; 29 | } 30 | 31 | nav { 32 | z-index: 10; 33 | } 34 | 35 | a { 36 | text-decoration: none; 37 | } 38 | } 39 | } 40 | 41 | .site-logo img { 42 | max-height: 2rem; 43 | } 44 | 45 | .site-title { 46 | display: -webkit-box; 47 | display: -ms-flexbox; 48 | display: flex; 49 | -ms-flex-item-align: center; 50 | align-self: center; 51 | font-weight: bold; 52 | // z-index: 20; 53 | } 54 | 55 | .site-subtitle { 56 | display: block; 57 | font-size: $type-size-8; 58 | } 59 | 60 | .masthead__menu { 61 | float: inline-start; 62 | margin-inline: 0; 63 | width: 100%; 64 | clear: both; 65 | 66 | .site-nav { 67 | margin-inline-start: 0; 68 | 69 | @include breakpoint($small) { 70 | float: inline-end; 71 | } 72 | } 73 | 74 | ul { 75 | margin: 0; 76 | padding: 0; 77 | clear: both; 78 | list-style-type: none; 79 | } 80 | } 81 | 82 | .masthead__menu-item { 83 | display: block; 84 | list-style-type: none; 85 | white-space: nowrap; 86 | 87 | &--lg { 88 | padding-inline-end: 2em; 89 | font-weight: 700; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /_includes/comments-providers/staticman.html: -------------------------------------------------------------------------------- 1 | {% if site.repository and site.staticman.branch %} 2 | 40 | {% endif %} 41 | -------------------------------------------------------------------------------- /_includes/comments-providers/staticman_v2.html: -------------------------------------------------------------------------------- 1 | {% if site.repository and site.comments.staticman.branch %} 2 | 40 | {% endif %} 41 | -------------------------------------------------------------------------------- /_includes/social-share.html: -------------------------------------------------------------------------------- 1 |
2 |

{{ site.data.ui-text[site.locale].share_on_label | default: "Share on" }}

3 | 4 | 5 | X 6 | 7 | 8 | 9 | Facebook 10 | 11 | 12 | 13 | LinkedIn 14 | 15 | 16 | 17 | Bluesky 18 | 19 |
20 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/_settings.scss: -------------------------------------------------------------------------------- 1 | ////////////////////////////// 2 | // Has Setting 3 | ////////////////////////////// 4 | @function breakpoint-has($setting) { 5 | @if map-has-key($breakpoint, $setting) { 6 | @return true; 7 | } 8 | @else { 9 | @return false; 10 | } 11 | } 12 | 13 | ////////////////////////////// 14 | // Get Settings 15 | ////////////////////////////// 16 | @function breakpoint-get($setting) { 17 | @if breakpoint-has($setting) { 18 | @return map-get($breakpoint, $setting); 19 | } 20 | @else { 21 | @return map-get($Breakpoint-Settings, $setting); 22 | } 23 | } 24 | 25 | ////////////////////////////// 26 | // Set Settings 27 | ////////////////////////////// 28 | @function breakpoint-set($setting, $value) { 29 | @if (str-index($setting, '-') or str-index($setting, '_')) and str-index($setting, ' ') == null { 30 | @warn "Words in Breakpoint settings should be separated by spaces, not dashes or underscores. Please replace dashes and underscores between words with spaces. Settings will not work as expected until changed."; 31 | } 32 | $breakpoint: map-merge($breakpoint, ($setting: $value)) !global; 33 | @return true; 34 | } 35 | 36 | @mixin breakpoint-change($setting, $value) { 37 | $breakpoint-change: breakpoint-set($setting, $value); 38 | } 39 | 40 | @mixin breakpoint-set($setting, $value) { 41 | @include breakpoint-change($setting, $value); 42 | } 43 | 44 | @mixin bkpt-change($setting, $value) { 45 | @include breakpoint-change($setting, $value); 46 | } 47 | @mixin bkpt-set($setting, $value) { 48 | @include breakpoint-change($setting, $value); 49 | } 50 | 51 | ////////////////////////////// 52 | // Remove Setting 53 | ////////////////////////////// 54 | @function breakpoint-reset($settings...) { 55 | @if length($settings) == 1 { 56 | $settings: nth($settings, 1); 57 | } 58 | 59 | @each $setting in $settings { 60 | $breakpoint: map-remove($breakpoint, $setting) !global; 61 | } 62 | @return true; 63 | } 64 | 65 | @mixin breakpoint-reset($settings...) { 66 | $breakpoint-reset: breakpoint-reset($settings); 67 | } 68 | 69 | @mixin bkpt-reset($settings...) { 70 | $breakpoint-reset: breakpoint-reset($settings); 71 | } -------------------------------------------------------------------------------- /_sass/minimal-mistakes/skins/_neon.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Neon skin 3 | ========================================================================== */ 4 | 5 | /* Colors */ 6 | $background-color: #141010 !default; 7 | $text-color: #fff6fb !default; 8 | $primary-color: #f21368 !default; 9 | $border-color: mix(#fff, $background-color, 20%) !default; 10 | $code-background-color: mix(#000, $background-color, 15%) !default; 11 | $code-background-color-dark: mix(#000, $background-color, 20%) !default; 12 | $form-background-color: mix(#000, $background-color, 15%) !default; 13 | $footer-background-color: mix($primary-color, #000, 10%) !default; 14 | $link-color: $primary-color !default; 15 | $link-color-hover: mix(#fff, $link-color, 25%) !default; 16 | $link-color-visited: mix(#000, $link-color, 25%) !default; 17 | $masthead-link-color: $text-color !default; 18 | $masthead-link-color-hover: mix(#000, $text-color, 20%) !default; 19 | $navicon-link-color-hover: mix(#000, $background-color, 30%) !default; 20 | 21 | /* notices */ 22 | $notice-background-mix: 90% !default; 23 | $code-notice-background-mix: 95% !default; 24 | 25 | /* neon syntax highlighting (base16) */ 26 | $base00: #ffffff !default; 27 | $base01: #e0e0e0 !default; 28 | $base02: #d0d0d0 !default; 29 | $base03: #b0b0b0 !default; 30 | $base04: #000000 !default; 31 | $base05: #101010 !default; 32 | $base06: #151515 !default; 33 | $base07: #202020 !default; 34 | $base08: #ff0086 !default; 35 | $base09: #fd8900 !default; 36 | $base0a: #aba800 !default; 37 | $base0b: #00c918 !default; 38 | $base0c: #1faaaa !default; 39 | $base0d: #3777e6 !default; 40 | $base0e: #ad00a1 !default; 41 | $base0f: #cc6633 !default; 42 | 43 | .author__urls.social-icons i, 44 | .author__urls.social-icons .svg-inline--fa, 45 | .page__footer-follow .social-icons i, 46 | .page__footer-follow .social-icons .svg-inline--fa { 47 | color: inherit; 48 | } 49 | 50 | /* next/previous buttons */ 51 | .pagination--pager { 52 | color: $text-color; 53 | background-color: $primary-color; 54 | border-color: transparent; 55 | 56 | &:visited { 57 | color: $text-color; 58 | } 59 | } 60 | 61 | .ais-search-box .ais-search-box--input { 62 | background-color: $form-background-color; 63 | } -------------------------------------------------------------------------------- /_sass/minimal-mistakes/skins/_plum.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Plum skin 3 | ========================================================================== */ 4 | 5 | /* Colors */ 6 | $background-color: #521477 !default; 7 | $text-color: #fffd86 !default; 8 | $primary-color: #c327ab !default; 9 | $border-color: mix(#fff, $background-color, 20%) !default; 10 | $code-background-color: mix(#000, $background-color, 15%) !default; 11 | $code-background-color-dark: mix(#000, $background-color, 20%) !default; 12 | $form-background-color: mix(#000, $background-color, 15%) !default; 13 | $footer-background-color: mix(#000, $background-color, 25%) !default; 14 | $link-color: $primary-color !default; 15 | $link-color-hover: mix(#fff, $link-color, 25%) !default; 16 | $link-color-visited: mix(#000, $link-color, 25%) !default; 17 | $masthead-link-color: $text-color !default; 18 | $masthead-link-color-hover: mix(#000, $text-color, 20%) !default; 19 | $navicon-link-color-hover: mix(#000, $background-color, 30%) !default; 20 | 21 | /* notices */ 22 | $notice-background-mix: 70% !default; 23 | $code-notice-background-mix: 80% !default; 24 | 25 | /* plum syntax highlighting (base16) */ 26 | $base00: #ffffff !default; 27 | $base01: #e0e0e0 !default; 28 | $base02: #d0d0d0 !default; 29 | $base03: #b0b0b0 !default; 30 | $base04: #000000 !default; 31 | $base05: #101010 !default; 32 | $base06: #151515 !default; 33 | $base07: #202020 !default; 34 | $base08: #ff0086 !default; 35 | $base09: #fd8900 !default; 36 | $base0a: #aba800 !default; 37 | $base0b: #00c918 !default; 38 | $base0c: #1faaaa !default; 39 | $base0d: #3777e6 !default; 40 | $base0e: #ad00a1 !default; 41 | $base0f: #cc6633 !default; 42 | 43 | .author__urls.social-icons i, 44 | .author__urls.social-icons .svg-inline--fa, 45 | .page__footer-follow .social-icons i, 46 | .page__footer-follow .social-icons .svg-inline--fa { 47 | color: inherit; 48 | } 49 | 50 | .page__content { 51 | a, 52 | a:visited { 53 | color: inherit; 54 | } 55 | } 56 | 57 | /* next/previous buttons */ 58 | .pagination--pager { 59 | color: $text-color; 60 | background-color: $primary-color; 61 | border-color: transparent; 62 | 63 | &:visited { 64 | color: $text-color; 65 | } 66 | } 67 | 68 | .ais-search-box .ais-search-box--input { 69 | background-color: $form-background-color; 70 | } -------------------------------------------------------------------------------- /.github/workflows/jekyll.yml: -------------------------------------------------------------------------------- 1 | # This workflow uses actions that are not certified by GitHub. 2 | # They are provided by a third-party and are governed by 3 | # separate terms of service, privacy policy, and support 4 | # documentation. 5 | 6 | # Sample workflow for building and deploying a Jekyll site to GitHub Pages 7 | name: Deploy Jekyll site to Pages 8 | 9 | on: 10 | # Runs on pushes targeting the default branch 11 | push: 12 | branches: ["master"] 13 | 14 | # Allows you to run this workflow manually from the Actions tab 15 | workflow_dispatch: 16 | 17 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 18 | permissions: 19 | contents: read 20 | pages: write 21 | id-token: write 22 | 23 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 24 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 25 | concurrency: 26 | group: "pages" 27 | cancel-in-progress: false 28 | 29 | jobs: 30 | # Build job 31 | build: 32 | runs-on: ubuntu-latest 33 | steps: 34 | - name: Checkout 35 | uses: actions/checkout@v4 36 | - name: Setup Ruby 37 | # https://github.com/ruby/setup-ruby/releases/tag/v1.207.0 38 | uses: ruby/setup-ruby@4a9ddd6f338a97768b8006bf671dfbad383215f4 39 | with: 40 | ruby-version: '3.0' # Not needed with a .ruby-version file 41 | bundler-cache: true # runs 'bundle install' and caches installed gems automatically 42 | cache-version: 0 # Increment this number if you need to re-download cached gems 43 | - name: Setup Pages 44 | id: pages 45 | uses: actions/configure-pages@v5 46 | - name: Build with Jekyll 47 | # Outputs to the './_site' directory by default 48 | run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" 49 | env: 50 | JEKYLL_ENV: production 51 | - name: Upload artifact 52 | # Automatically uploads an artifact from the './_site' directory by default 53 | uses: actions/upload-pages-artifact@v3 54 | 55 | # Deployment job 56 | deploy: 57 | environment: 58 | name: github-pages 59 | url: ${{ steps.deployment.outputs.page_url }} 60 | runs-on: ubuntu-latest 61 | needs: build 62 | steps: 63 | - name: Deploy to GitHub Pages 64 | id: deployment 65 | uses: actions/deploy-pages@v4 -------------------------------------------------------------------------------- /_sass/minimal-mistakes/_mixins.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | MIXINS 3 | ========================================================================== */ 4 | 5 | %tab-focus { 6 | /* Default*/ 7 | outline: thin dotted $focus-color; 8 | /* Webkit*/ 9 | outline: 5px auto $focus-color; 10 | outline-offset: -2px; 11 | } 12 | 13 | /* 14 | em function 15 | ========================================================================== */ 16 | 17 | @function em($target, $context: $doc-font-size) { 18 | @return ($target / $context) * 1em; 19 | } 20 | 21 | 22 | /* 23 | Bourbon clearfix 24 | ========================================================================== */ 25 | 26 | /* 27 | * Provides an easy way to include a clearfix for containing floats. 28 | * link http://cssmojo.com/latest_new_clearfix_so_far/ 29 | * 30 | * example scss - Usage 31 | * 32 | * .element { 33 | * @include clearfix; 34 | * } 35 | * 36 | * example css - CSS Output 37 | * 38 | * .element::after { 39 | * clear: both; 40 | * content: ""; 41 | * display: table; 42 | * } 43 | */ 44 | 45 | @mixin clearfix { 46 | clear: both; 47 | 48 | &::after { 49 | clear: both; 50 | content: ""; 51 | display: table; 52 | } 53 | } 54 | 55 | /* 56 | Compass YIQ Color Contrast 57 | https://github.com/easy-designs/yiq-color-contrast 58 | ========================================================================== */ 59 | 60 | @function yiq-is-light( 61 | $color, 62 | $threshold: $yiq-contrasted-threshold 63 | ) { 64 | $red: red($color); 65 | $green: green($color); 66 | $blue: blue($color); 67 | 68 | $yiq: (($red*299)+($green*587)+($blue*114))/1000; 69 | 70 | @if $yiq-debug { @debug $yiq, $threshold; } 71 | 72 | @return if($yiq >= $threshold, true, false); 73 | } 74 | 75 | @function yiq-contrast-color( 76 | $color, 77 | $dark: $yiq-contrasted-dark-default, 78 | $light: $yiq-contrasted-light-default, 79 | $threshold: $yiq-contrasted-threshold 80 | ) { 81 | @return if(yiq-is-light($color, $threshold), $yiq-contrasted-dark-default, $yiq-contrasted-light-default); 82 | } 83 | 84 | @mixin yiq-contrasted( 85 | $background-color, 86 | $dark: $yiq-contrasted-dark-default, 87 | $light: $yiq-contrasted-light-default, 88 | $threshold: $yiq-contrasted-threshold 89 | ) { 90 | background-color: $background-color; 91 | color: yiq-contrast-color($background-color, $dark, $light, $threshold); 92 | } -------------------------------------------------------------------------------- /_pages/projects.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: single 3 | permalink: /projects/ 4 | hidden: true 5 | --- 6 | 7 |
8 |
9 | AutoPWN-Suite Preview 10 |
11 |

AutoPWN-Suite

12 |

A comprehensive offensive automation framework that streamlines post-exploitation and red-team workflows.

13 |
14 | Learn More 15 | GitHub 16 |
17 |
18 |
19 | 20 |
21 | BadUSB Attacks 22 |
23 |

BadUSB Attacks (PoCs)

24 |

Collection of BadUSB proof-of-concepts showcasing peripheral-based attack vectors — built for research and awareness.

25 |
26 | Learn More 27 | GitHub 28 |
29 |
30 |
31 | 32 |
33 | PowerShell Tools 34 |
35 |

PowerShell Projects

36 |

A set of PowerShell utilities and a public research-oriented fileless PoC focused on automation and defense testing.

37 |
38 | Learn More 39 | GitHub 40 |
41 |
42 |
43 | 44 |
45 | CompanyEnum 46 |
47 |

CompanyEnum

48 |

An OSINT tool for gathering and visualizing public company data through an interactive Web UI.

49 |
50 | Learn More 51 | GitHub 52 |
53 |
54 |
55 |
56 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/_buttons.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | BUTTONS 3 | ========================================================================== */ 4 | 5 | /* 6 | Default button 7 | ========================================================================== */ 8 | 9 | .btn { 10 | /* default */ 11 | display: inline-block; 12 | margin-bottom: 0.25em; 13 | padding: 0.5em 1em; 14 | font-family: $sans-serif; 15 | font-size: $type-size-6; 16 | font-weight: bold; 17 | text-align: center; 18 | text-decoration: none; 19 | border-width: 0; 20 | border-radius: $border-radius; 21 | cursor: pointer; 22 | 23 | .icon { 24 | margin-inline-end: 0.5em; 25 | } 26 | 27 | .icon + .hidden { 28 | margin-inline-start: -0.5em; /* override for hidden text*/ 29 | } 30 | 31 | /* button colors */ 32 | $buttoncolors: 33 | (primary, $primary-color), 34 | (inverse, #fff), 35 | (light-outline, transparent), 36 | (success, $success-color), 37 | (warning, $warning-color), 38 | (danger, $danger-color), 39 | (info, $info-color), 40 | /* brands */ 41 | (bluesky, $bluesky-color), 42 | (facebook, $facebook-color), 43 | (linkedin, $linkedin-color), 44 | (mastodon, $mastodon-color), 45 | (twitter, $twitter-color), 46 | (x, $x-color); 47 | 48 | @each $buttoncolor, $color in $buttoncolors { 49 | &--#{$buttoncolor} { 50 | @include yiq-contrasted($color); 51 | @if ($buttoncolor == inverse) { 52 | border: 1px solid $border-color; 53 | } 54 | @if ($buttoncolor == light-outline) { 55 | border: 1px solid #fff; 56 | } 57 | 58 | &:visited { 59 | @include yiq-contrasted($color); 60 | } 61 | 62 | &:hover { 63 | @include yiq-contrasted(mix(#000, $color, 20%)); 64 | } 65 | } 66 | } 67 | 68 | /* fills width of parent container */ 69 | &--block { 70 | display: block; 71 | width: 100%; 72 | 73 | + .btn--block { 74 | margin-top: 0.25em; 75 | } 76 | } 77 | 78 | /* disabled */ 79 | &--disabled { 80 | pointer-events: none; 81 | cursor: not-allowed; 82 | filter: alpha(opacity=65); 83 | box-shadow: none; 84 | opacity: 0.65; 85 | } 86 | 87 | /* extra large button */ 88 | &--x-large { 89 | font-size: $type-size-4; 90 | } 91 | 92 | /* large button */ 93 | &--large { 94 | font-size: $type-size-5; 95 | } 96 | 97 | /* small button */ 98 | &--small { 99 | font-size: $type-size-7; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /assets/js/lunr/lunr-en.js: -------------------------------------------------------------------------------- 1 | --- 2 | layout: none 3 | --- 4 | 5 | var idx = lunr(function () { 6 | this.field('title') 7 | this.field('excerpt') 8 | this.field('categories') 9 | this.field('tags') 10 | this.ref('id') 11 | 12 | this.pipeline.remove(lunr.trimmer) 13 | 14 | for (var item in store) { 15 | this.add({ 16 | title: store[item].title, 17 | excerpt: store[item].excerpt, 18 | categories: store[item].categories, 19 | tags: store[item].tags, 20 | id: item 21 | }) 22 | } 23 | }); 24 | 25 | $(document).ready(function() { 26 | $('input#search').on('keyup', function () { 27 | var resultdiv = $('#results'); 28 | var query = $(this).val().toLowerCase(); 29 | var result = 30 | idx.query(function (q) { 31 | query.split(lunr.tokenizer.separator).forEach(function (term) { 32 | q.term(term, { boost: 100 }) 33 | if(query.lastIndexOf(" ") != query.length-1){ 34 | q.term(term, { usePipeline: false, wildcard: lunr.Query.wildcard.TRAILING, boost: 10 }) 35 | } 36 | if (term != ""){ 37 | q.term(term, { usePipeline: false, editDistance: 1, boost: 1 }) 38 | } 39 | }) 40 | }); 41 | resultdiv.empty(); 42 | resultdiv.prepend('

'+result.length+' {{ site.data.ui-text[site.locale].results_found | default: "Result(s) found" }}

'); 43 | for (var item in result) { 44 | var ref = result[item].ref; 45 | if(store[ref].teaser){ 46 | var searchitem = 47 | '
'+ 48 | '
'+ 49 | '

'+ 50 | ''+store[ref].title+''+ 51 | '

'+ 52 | '
'+ 53 | ''+ 54 | '
'+ 55 | '

'+store[ref].excerpt.split(" ").splice(0,20).join(" ")+'...

'+ 56 | '
'+ 57 | '
'; 58 | } 59 | else{ 60 | var searchitem = 61 | '
'+ 62 | '
'+ 63 | '

'+ 64 | ''+store[ref].title+''+ 65 | '

'+ 66 | '

'+store[ref].excerpt.split(" ").splice(0,20).join(" ")+'...

'+ 67 | '
'+ 68 | '
'; 69 | } 70 | resultdiv.append(searchitem); 71 | } 72 | }); 73 | }); 74 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/_notices.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | NOTICE TEXT BLOCKS 3 | ========================================================================== */ 4 | 5 | /** 6 | * Default Kramdown usage (no indents!): 7 | *
8 | * #### Headline for the Notice 9 | * Text for the notice 10 | *
11 | */ 12 | 13 | @mixin notice($notice-color) { 14 | margin: 2em 0 !important; /* override*/ 15 | padding: 1em; 16 | color: $text-color; 17 | font-family: $global-font-family; 18 | font-size: $type-size-6 !important; 19 | text-indent: initial; /* override*/ 20 | background-color: mix($background-color, $notice-color, $notice-background-mix); 21 | border-radius: $border-radius; 22 | box-shadow: 0 1px 1px rgba($notice-color, 0.25); 23 | 24 | h4 { 25 | margin-top: 0 !important; /* override*/ 26 | margin-bottom: 0.75em; 27 | line-height: inherit; 28 | } 29 | 30 | @at-root .page__content #{&} h4 { 31 | /* using at-root to override .page-content h4 font size*/ 32 | margin-bottom: 0; 33 | font-size: 1em; 34 | } 35 | 36 | p { 37 | &:last-child { 38 | margin-bottom: 0 !important; /* override*/ 39 | } 40 | } 41 | 42 | h4 + p { 43 | /* remove space above paragraphs that appear directly after notice headline*/ 44 | margin-top: 0; 45 | padding-top: 0; 46 | } 47 | 48 | a { 49 | color: mix(#000, $notice-color, 10%); 50 | 51 | &:hover { 52 | color: mix(#000, $notice-color, 50%); 53 | } 54 | } 55 | 56 | @at-root #{selector-unify(&, "blockquote")} { 57 | border-inline-start-color: mix(#000, $notice-color, 10%); 58 | } 59 | 60 | code { 61 | background-color: mix($background-color, $notice-color, $code-notice-background-mix) 62 | } 63 | 64 | pre code { 65 | background-color: inherit; 66 | } 67 | 68 | ul { 69 | &:last-child { 70 | margin-bottom: 0; /* override*/ 71 | } 72 | } 73 | } 74 | 75 | /* Default notice */ 76 | 77 | .notice, 78 | .markdown-alert { 79 | @include notice($light-gray); 80 | } 81 | 82 | /* Primary notice */ 83 | 84 | .notice--primary, 85 | .markdown-alert-important { 86 | @include notice($primary-color); 87 | } 88 | 89 | /* Info notice */ 90 | 91 | .notice--info, 92 | .markdown-alert-note { 93 | @include notice($info-color); 94 | } 95 | 96 | /* Warning notice */ 97 | 98 | .notice--warning, 99 | .markdown-alert-warning { 100 | @include notice($warning-color); 101 | } 102 | 103 | /* Success notice */ 104 | 105 | .notice--success, 106 | .markdown-alert-tip { 107 | @include notice($success-color); 108 | } 109 | 110 | /* Danger notice */ 111 | 112 | .notice--danger, 113 | .markdown-alert-caution { 114 | @include notice($danger-color); 115 | } 116 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/_search.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | SEARCH 3 | ========================================================================== */ 4 | 5 | .layout--search { 6 | .archive__item-teaser { 7 | margin-bottom: 0.25em; 8 | } 9 | } 10 | 11 | .search__toggle { 12 | margin-inline: 1rem; 13 | height: $nav-toggle-height; 14 | border: 0; 15 | outline: none; 16 | color: $primary-color; 17 | background-color: transparent; 18 | cursor: pointer; 19 | -webkit-transition: 0.2s; 20 | transition: 0.2s; 21 | 22 | &:hover { 23 | color: mix(#000, $primary-color, 25%); 24 | } 25 | } 26 | 27 | .search-icon { 28 | width: 100%; 29 | height: 100%; 30 | } 31 | 32 | .search-content { 33 | display: none; 34 | visibility: hidden; 35 | padding-top: 1em; 36 | padding-bottom: 1em; 37 | 38 | &__inner-wrap { 39 | width: 100%; 40 | margin-inline: auto; 41 | padding-inline: 1em; 42 | -webkit-animation: $intro-transition; 43 | animation: $intro-transition; 44 | -webkit-animation-delay: 0.15s; 45 | animation-delay: 0.15s; 46 | 47 | @include breakpoint($x-large) { 48 | max-width: $max-width; 49 | } 50 | 51 | } 52 | 53 | &__form { 54 | background-color: transparent; 55 | } 56 | 57 | .search-input { 58 | display: block; 59 | margin-bottom: 0; 60 | padding: 0; 61 | border: none; 62 | outline: none; 63 | box-shadow: none; 64 | background-color: transparent; 65 | font-size: $type-size-3; 66 | 67 | @include breakpoint($large) { 68 | font-size: $type-size-2; 69 | } 70 | 71 | @include breakpoint($x-large) { 72 | font-size: $type-size-1; 73 | } 74 | } 75 | 76 | &.is--visible { 77 | display: block; 78 | visibility: visible; 79 | 80 | &::after { 81 | content: ""; 82 | display: block; 83 | } 84 | } 85 | 86 | .results__found { 87 | margin-top: 0.5em; 88 | font-size: $type-size-6; 89 | } 90 | 91 | .archive__item { 92 | margin-bottom: 2em; 93 | 94 | @include breakpoint($large) { 95 | width: 75%; 96 | } 97 | 98 | @include breakpoint($x-large) { 99 | width: 50%; 100 | } 101 | } 102 | 103 | .archive__item-title { 104 | margin-top: 0; 105 | } 106 | 107 | .archive__item-excerpt { 108 | margin-bottom: 0; 109 | } 110 | } 111 | 112 | /* Algolia search */ 113 | 114 | .ais-search-box { 115 | max-width: 100% !important; 116 | margin-bottom: 2em; 117 | } 118 | 119 | .archive__item-title .ais-Highlight { 120 | color: $primary-color; 121 | font-style: normal; 122 | text-decoration: underline; 123 | } 124 | 125 | .archive__item-excerpt .ais-Highlight { 126 | color: $primary-color; 127 | font-style: normal; 128 | font-weight: bold; 129 | } 130 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/_legacy-settings.scss: -------------------------------------------------------------------------------- 1 | @mixin legacy-settings-warning { 2 | $legacyVars: ( 3 | 'default-media': 'default media', 4 | 'default-feature': 'default feature', 5 | 'force-media-all': 'force all media type', 6 | 'to-ems': 'to ems', 7 | 'resolutions': 'transform resolutions', 8 | 'no-queries': 'no queries', 9 | 'no-query-fallbacks': 'no query fallbacks', 10 | 'base-font-size': 'base font size', 11 | 'legacy-syntax': 'legacy syntax' 12 | ); 13 | 14 | @each $legacy, $new in $legacyVars { 15 | @if global-variable-exists('breakpoint-' + $legacy) { 16 | @warn "In order to avoid variable namspace collisions, we have updated the way to change settings for Breakpoint. Please change all instances of `$breakpoint-#{$legacy}: {{setting}}` to `@include breakpoint-set('#{$new}', {{setting}})`. Variable settings, as well as this warning will be deprecated in a future release." 17 | } 18 | }; 19 | 20 | ////////////////////////////// 21 | // Hand correct each setting 22 | ////////////////////////////// 23 | @if global-variable-exists('breakpoint-default-media') and $breakpoint-default-media != breakpoint-get('default media') { 24 | @include breakpoint-set('default media', $breakpoint-default-media); 25 | } 26 | @if global-variable-exists('breakpoint-default-feature') and $breakpoint-default-feature != breakpoint-get('default feature') { 27 | @include breakpoint-set('default feature', $breakpoint-default-feature); 28 | } 29 | @if global-variable-exists('breakpoint-force-media-all') and $breakpoint-force-media-all != breakpoint-get('force all media type') { 30 | @include breakpoint-set('force all media type', $breakpoint-force-media-all); 31 | } 32 | @if global-variable-exists('breakpoint-to-ems') and $breakpoint-to-ems != breakpoint-get('to ems') { 33 | @include breakpoint-set('to ems', $breakpoint-to-ems); 34 | } 35 | @if global-variable-exists('breakpoint-resolutions') and $breakpoint-resolutions != breakpoint-get('transform resolutions') { 36 | @include breakpoint-set('transform resolutions', $breakpoint-resolutions); 37 | } 38 | @if global-variable-exists('breakpoint-no-queries') and $breakpoint-no-queries != breakpoint-get('no queries') { 39 | @include breakpoint-set('no queries', $breakpoint-no-queries); 40 | } 41 | @if global-variable-exists('breakpoint-no-query-fallbacks') and $breakpoint-no-query-fallbacks != breakpoint-get('no query fallbacks') { 42 | @include breakpoint-set('no query fallbacks', $breakpoint-no-query-fallbacks); 43 | } 44 | @if global-variable-exists('breakpoint-base-font-size') and $breakpoint-base-font-size != breakpoint-get('base font size') { 45 | @include breakpoint-set('base font size', $breakpoint-base-font-size); 46 | } 47 | @if global-variable-exists('breakpoint-legacy-syntax') and $breakpoint-legacy-syntax != breakpoint-get('legacy syntax') { 48 | @include breakpoint-set('legacy syntax', $breakpoint-legacy-syntax); 49 | } 50 | } -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/magnific-popup/_settings.scss: -------------------------------------------------------------------------------- 1 | //////////////////////// 2 | // Settings // 3 | //////////////////////// 4 | 5 | // overlay 6 | $mfp-overlay-color: #000; // Color of overlay screen 7 | $mfp-overlay-opacity: 0.8; // Opacity of overlay screen 8 | $mfp-shadow: 0 0 8px rgba(0, 0, 0, 0.6); // Shadow on image or iframe 9 | 10 | // spacing 11 | $mfp-popup-padding-left: 8px; // Padding from left and from right side 12 | $mfp-popup-padding-left-mobile: 6px; // Same as above, but is applied when width of window is less than 800px 13 | 14 | $mfp-z-index-base: 1040; // Base z-index of popup 15 | 16 | // controls 17 | $mfp-include-arrows: true; // Include styles for nav arrows 18 | $mfp-controls-opacity: 1; // Opacity of controls 19 | $mfp-controls-color: #fff; // Color of controls 20 | $mfp-controls-border-color: #fff; // Border color of controls 21 | $mfp-inner-close-icon-color: #fff; // Color of close button when inside 22 | $mfp-controls-text-color: #ccc; // Color of preloader and "1 of X" indicator 23 | $mfp-controls-text-color-hover: #fff; // Hover color of preloader and "1 of X" indicator 24 | $mfp-IE7support: true; // Very basic IE7 support 25 | 26 | // Iframe-type options 27 | $mfp-include-iframe-type: true; // Enable Iframe-type popups 28 | $mfp-iframe-padding-top: 40px; // Iframe padding top 29 | $mfp-iframe-background: #000; // Background color of iframes 30 | $mfp-iframe-max-width: 900px; // Maximum width of iframes 31 | $mfp-iframe-ratio: 9/16; // Ratio of iframe (9/16 = widescreen, 3/4 = standard, etc.) 32 | 33 | // Image-type options 34 | $mfp-include-image-type: true; // Enable Image-type popups 35 | $mfp-image-background: #444 !default; 36 | $mfp-image-padding-top: 40px; // Image padding top 37 | $mfp-image-padding-bottom: 40px; // Image padding bottom 38 | $mfp-include-mobile-layout-for-image: true; // Removes paddings from top and bottom 39 | 40 | // Image caption options 41 | $mfp-caption-title-color: #f3f3f3; // Caption title color 42 | $mfp-caption-subtitle-color: #bdbdbd; // Caption subtitle color 43 | .mfp-counter { font-family: $serif; } // Caption font family 44 | 45 | // A11y 46 | $mfp-use-visuallyhidden: false; -------------------------------------------------------------------------------- /_includes/page__hero.html: -------------------------------------------------------------------------------- 1 | {% capture overlay_img_path %}{{ page.header.overlay_image | relative_url }}{% endcapture %} 2 | 3 | {% if page.header.overlay_filter contains "gradient" %} 4 | {% capture overlay_filter %}{{ page.header.overlay_filter }}{% endcapture %} 5 | {% elsif page.header.overlay_filter contains "rgba" %} 6 | {% capture overlay_filter %}{{ page.header.overlay_filter }}{% endcapture %} 7 | {% capture overlay_filter %}linear-gradient({{ overlay_filter }}, {{ overlay_filter }}){% endcapture %} 8 | {% elsif page.header.overlay_filter %} 9 | {% capture overlay_filter %}rgba(0, 0, 0, {{ page.header.overlay_filter }}){% endcapture %} 10 | {% capture overlay_filter %}linear-gradient({{ overlay_filter }}, {{ overlay_filter }}){% endcapture %} 11 | {% endif %} 12 | 13 | {% if page.header.image_description %} 14 | {% assign image_description = page.header.image_description %} 15 | {% else %} 16 | {% assign image_description = page.title %} 17 | {% endif %} 18 | 19 | {% assign image_description = image_description | markdownify | strip_html | strip_newlines | escape_once %} 20 | 21 |
24 | {% if page.header.overlay_color or page.header.overlay_image %} 25 |
26 |

27 | {% if paginator and site.paginate_show_page_num %} 28 | {{ site.title }}{% unless paginator.page == 1 %} {{ site.data.ui-text[site.locale].page | default: "Page" }} {{ paginator.page }}{% endunless %} 29 | {% else %} 30 | {{ page.title | default: site.title | markdownify | remove: "

" | remove: "

" }} 31 | {% endif %} 32 |

33 | {% if page.tagline %} 34 |

{{ page.tagline | markdownify | remove: "

" | remove: "

" }}

35 | {% elsif page.header.show_overlay_excerpt != false and page.excerpt %} 36 |

{{ page.excerpt | markdownify | remove: "

" | remove: "

" }}

37 | {% endif %} 38 | {% include page__meta.html %} 39 | {% if page.header.actions %} 40 |

41 | {% for action in page.header.actions %} 42 | {{ action.label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }} 43 | {% endfor %} 44 |

45 | {% endif %} 46 |
47 | {% else %} 48 | {{ image_description }} 49 | {% endif %} 50 | {% if page.header.caption %} 51 | {{ page.header.caption | markdownify | remove: "

" | remove: "

" }}
52 | {% endif %} 53 |
54 | -------------------------------------------------------------------------------- /_includes/search/algolia-search-scripts.html: -------------------------------------------------------------------------------- 1 | 83 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/_breakpoint.scss: -------------------------------------------------------------------------------- 1 | ////////////////////////////// 2 | // Default Variables 3 | ////////////////////////////// 4 | $Breakpoint-Settings: ( 5 | 'default media': all, 6 | 'default feature': min-width, 7 | 'default pair': width, 8 | 9 | 'force all media type': false, 10 | 'to ems': false, 11 | 'transform resolutions': true, 12 | 13 | 'no queries': false, 14 | 'no query fallbacks': false, 15 | 16 | 'base font size': 16px, 17 | 18 | 'legacy syntax': false 19 | ); 20 | 21 | $breakpoint: () !default; 22 | 23 | ////////////////////////////// 24 | // Imports 25 | ////////////////////////////// 26 | @import "settings"; 27 | @import "context"; 28 | @import "helpers"; 29 | @import "parsers"; 30 | @import "no-query"; 31 | 32 | @import "respond-to"; 33 | 34 | @import "legacy-settings"; 35 | 36 | ////////////////////////////// 37 | // Breakpoint Mixin 38 | ////////////////////////////// 39 | 40 | @mixin breakpoint($query, $no-query: false) { 41 | @include legacy-settings-warning; 42 | 43 | // Reset contexts 44 | @include private-breakpoint-reset-contexts(); 45 | 46 | $breakpoint: breakpoint($query, false); 47 | 48 | $query-string: map-get($breakpoint, 'query'); 49 | $query-fallback: map-get($breakpoint, 'fallback'); 50 | 51 | $private-breakpoint-context-holder: map-get($breakpoint, 'context holder') !global; 52 | $private-breakpoint-query-count: map-get($breakpoint, 'query count') !global; 53 | 54 | // Allow for an as-needed override or usage of no query fallback. 55 | @if $no-query != false { 56 | $query-fallback: $no-query; 57 | } 58 | 59 | @if $query-fallback != false { 60 | $context-setter: private-breakpoint-set-context('no-query', $query-fallback); 61 | } 62 | 63 | // Print Out Query String 64 | @if not breakpoint-get('no queries') { 65 | @media #{$query-string} { 66 | @content; 67 | } 68 | } 69 | 70 | @if breakpoint-get('no query fallbacks') != false or breakpoint-get('no queries') == true { 71 | 72 | $type: type-of(breakpoint-get('no query fallbacks')); 73 | $print: false; 74 | 75 | @if ($type == 'bool') { 76 | $print: true; 77 | } 78 | @else if ($type == 'string') { 79 | @if $query-fallback == breakpoint-get('no query fallbacks') { 80 | $print: true; 81 | } 82 | } 83 | @else if ($type == 'list') { 84 | @each $wrapper in breakpoint-get('no query fallbacks') { 85 | @if $query-fallback == $wrapper { 86 | $print: true; 87 | } 88 | } 89 | } 90 | 91 | // Write Fallback 92 | @if ($query-fallback != false) and ($print == true) { 93 | $type-fallback: type-of($query-fallback); 94 | 95 | @if ($type-fallback != 'bool') { 96 | #{$query-fallback} & { 97 | @content; 98 | } 99 | } 100 | @else { 101 | @content; 102 | } 103 | } 104 | } 105 | 106 | @include private-breakpoint-reset-contexts(); 107 | } 108 | 109 | 110 | @mixin mq($query, $no-query: false) { 111 | @include breakpoint($query, $no-query) { 112 | @content; 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/_respond-to.scss: -------------------------------------------------------------------------------- 1 | //////////////////////// 2 | // Default the Breakpoints variable 3 | //////////////////////// 4 | $breakpoints: () !default; 5 | $BREAKPOINTS: () !default; 6 | 7 | //////////////////////// 8 | // Respond-to API Mixin 9 | //////////////////////// 10 | @mixin respond-to($context, $no-query: false) { 11 | @if length($breakpoints) > 0 and length($BREAKPOINTS) == 0 { 12 | @warn "In order to avoid variable namespace collisions, we have updated the way to add breakpoints for respond-to. Please change all instances of `$breakpoints: add-breakpoint()` to `@include add-breakpoint()`. The `add-breakpoint()` function will be deprecated in a future release."; 13 | $BREAKPOINTS: $breakpoints !global; 14 | $breakpoints: () !global; 15 | } 16 | 17 | @if type-of($BREAKPOINTS) != 'map' { 18 | // Just in case someone writes gibberish to the $breakpoints variable. 19 | @warn "Your breakpoints aren't a map! `respond-to` expects a map. Please check the value of $BREAKPOINTS variable."; 20 | @content; 21 | } 22 | @else if map-has-key($BREAKPOINTS, $context) { 23 | @include breakpoint(map-get($BREAKPOINTS, $context), $no-query) { 24 | @content; 25 | } 26 | } 27 | @else if not map-has-key($BREAKPOINTS, $context) { 28 | @warn "`#{$context}` isn't a defined breakpoint! Please add it using `$breakpoints: add-breakpoint(`#{$context}`, $value);`"; 29 | @content; 30 | } 31 | @else { 32 | @warn "You haven't created any breakpoints yet! Make some already! `@include add-breakpoint($name, $bkpt)`"; 33 | @content; 34 | } 35 | } 36 | 37 | ////////////////////////////// 38 | // Add Breakpoint to Breakpoints 39 | // TODO: Remove function in next release 40 | ////////////////////////////// 41 | @function add-breakpoint($name, $bkpt, $overwrite: false) { 42 | $output: ($name: $bkpt); 43 | 44 | @if length($breakpoints) == 0 { 45 | @return $output; 46 | } 47 | @else { 48 | @if map-has-key($breakpoints, $name) and $overwrite != true { 49 | @warn "You already have a breakpoint named `#{$name}`, please choose another breakpoint name, or pass in `$overwrite: true` to overwrite the previous breakpoint."; 50 | @return $breakpoints; 51 | } 52 | @else if not map-has-key($breakpoints, $name) or $overwrite == true { 53 | @return map-merge($breakpoints, $output); 54 | } 55 | } 56 | } 57 | 58 | @mixin add-breakpoint($name, $bkpt, $overwrite: false) { 59 | $output: ($name: $bkpt); 60 | 61 | @if length($BREAKPOINTS) == 0 { 62 | $BREAKPOINTS: $output !global; 63 | } 64 | @else { 65 | @if map-has-key($BREAKPOINTS, $name) and $overwrite != true { 66 | @warn "You already have a breakpoint named `#{$name}`, please choose another breakpoint name, or pass in `$overwrite: true` to overwrite the previous breakpoint."; 67 | $BREAKPOINTS: $BREAKPOINTS !global; 68 | } 69 | @else if not map-has-key($BREAKPOINTS, $name) or $overwrite == true { 70 | $BREAKPOINTS: map-merge($BREAKPOINTS, $output) !global; 71 | } 72 | } 73 | } 74 | 75 | @function get-breakpoint($name: false) { 76 | @if $name == false { 77 | @return $BREAKPOINTS; 78 | } 79 | @else { 80 | @return map-get($BREAKPOINTS, $name); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /assets/js/lunr/lunr-store.js: -------------------------------------------------------------------------------- 1 | --- 2 | layout: none 3 | --- 4 | 5 | var store = [ 6 | {%- for c in site.collections -%} 7 | {%- if forloop.last -%} 8 | {%- assign l = true -%} 9 | {%- endif -%} 10 | {%- assign docs = c.docs | where_exp:'doc','doc.search != false' -%} 11 | {%- for doc in docs -%} 12 | {%- if doc.header.teaser -%} 13 | {%- capture teaser -%}{{ doc.header.teaser }}{%- endcapture -%} 14 | {%- else -%} 15 | {%- assign teaser = site.teaser -%} 16 | {%- endif -%} 17 | { 18 | "title": {{ doc.title | jsonify }}, 19 | "excerpt": 20 | {%- if site.search_full_content == true -%} 21 | {{ doc.content | newline_to_br | 22 | replace:"
", " " | 23 | replace:"

", " " | 24 | replace:"", " " | 25 | replace:"", " " | 26 | replace:"", " " | 27 | replace:"", " " | 28 | replace:"", " " | 29 | replace:"", " "| 30 | strip_html | strip_newlines | jsonify }}, 31 | {%- else -%} 32 | {{ doc.content | newline_to_br | 33 | replace:"
", " " | 34 | replace:"

", " " | 35 | replace:"", " " | 36 | replace:"", " " | 37 | replace:"", " " | 38 | replace:"", " " | 39 | replace:"", " " | 40 | replace:"", " "| 41 | strip_html | strip_newlines | truncatewords: 50 | jsonify }}, 42 | {%- endif -%} 43 | "categories": {{ doc.categories | jsonify }}, 44 | "tags": {{ doc.tags | jsonify }}, 45 | "url": {{ doc.url | relative_url | jsonify }}, 46 | "teaser": {{ teaser | relative_url | jsonify }} 47 | }{%- unless forloop.last and l -%},{%- endunless -%} 48 | {%- endfor -%} 49 | {%- endfor -%}{%- if site.lunr.search_within_pages -%}, 50 | {%- assign pages = site.pages | where_exp: 'doc', 'doc.search != false' | where_exp: 'doc', 'doc.title != null' -%} 51 | {%- for doc in pages -%} 52 | {%- if forloop.last -%} 53 | {%- assign l = true -%} 54 | {%- endif -%} 55 | { 56 | "title": {{ doc.title | jsonify }}, 57 | "excerpt": 58 | {%- if site.search_full_content == true -%} 59 | {{ doc.content | newline_to_br | 60 | replace:"
", " " | 61 | replace:"

", " " | 62 | replace:"", " " | 63 | replace:"", " " | 64 | replace:"", " " | 65 | replace:"", " " | 66 | replace:"", " " | 67 | replace:"", " "| 68 | strip_html | strip_newlines | jsonify }}, 69 | {%- else -%} 70 | {{ doc.content | newline_to_br | 71 | replace:"
", " " | 72 | replace:"

", " " | 73 | replace:"", " " | 74 | replace:"", " " | 75 | replace:"", " " | 76 | replace:"", " " | 77 | replace:"", " " | 78 | replace:"", " "| 79 | strip_html | strip_newlines | truncatewords: 50 | jsonify }}, 80 | {%- endif -%} 81 | "url": {{ doc.url | absolute_url | jsonify }} 82 | }{%- unless forloop.last and l -%},{%- endunless -%} 83 | {%- endfor -%} 84 | {%- endif -%}] 85 | -------------------------------------------------------------------------------- /_includes/paginator-v2.html: -------------------------------------------------------------------------------- 1 | 69 | -------------------------------------------------------------------------------- /assets/js/plugins/jquery.fitvids.js: -------------------------------------------------------------------------------- 1 | /*jshint browser:true */ 2 | /*! 3 | * FitVids 1.1 4 | * 5 | * Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com 6 | * Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/ 7 | * Released under the WTFPL license - http://sam.zoy.org/wtfpl/ 8 | * 9 | */ 10 | 11 | ;(function( $ ){ 12 | 13 | 'use strict'; 14 | 15 | $.fn.fitVids = function( options ) { 16 | var settings = { 17 | customSelector: null, 18 | ignore: null 19 | }; 20 | 21 | if(!document.getElementById('fit-vids-style')) { 22 | // appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js 23 | var head = document.head || document.getElementsByTagName('head')[0]; 24 | var css = '.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}'; 25 | var div = document.createElement("div"); 26 | div.innerHTML = '

x

'; 27 | head.appendChild(div.childNodes[1]); 28 | } 29 | 30 | if ( options ) { 31 | $.extend( settings, options ); 32 | } 33 | 34 | return this.each(function(){ 35 | var selectors = [ 36 | 'iframe[src*="player.vimeo.com"]', 37 | 'iframe[src*="youtube.com"]', 38 | 'iframe[src*="youtube-nocookie.com"]', 39 | 'iframe[src*="kickstarter.com"][src*="video.html"]', 40 | 'object', 41 | 'embed' 42 | ]; 43 | 44 | if (settings.customSelector) { 45 | selectors.push(settings.customSelector); 46 | } 47 | 48 | var ignoreList = '.fitvidsignore'; 49 | 50 | if(settings.ignore) { 51 | ignoreList = ignoreList + ', ' + settings.ignore; 52 | } 53 | 54 | var $allVideos = $(this).find(selectors.join(',')); 55 | $allVideos = $allVideos.not('object object'); // SwfObj conflict patch 56 | $allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video. 57 | 58 | $allVideos.each(function(count){ 59 | var $this = $(this); 60 | if($this.parents(ignoreList).length > 0) { 61 | return; // Disable FitVids on this video. 62 | } 63 | if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; } 64 | if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width')))) 65 | { 66 | $this.attr('height', 9); 67 | $this.attr('width', 16); 68 | } 69 | var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(), 70 | width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(), 71 | aspectRatio = height / width; 72 | if(!$this.attr('id')){ 73 | var videoID = 'fitvid' + count; 74 | $this.attr('id', videoID); 75 | } 76 | $this.wrap('
').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+'%'); 77 | $this.removeAttr('height').removeAttr('width'); 78 | }); 79 | }); 80 | }; 81 | // Works with either jQuery or Zepto 82 | })( window.jQuery || window.Zepto ); -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/_context.scss: -------------------------------------------------------------------------------- 1 | ////////////////////////////// 2 | // Private Breakpoint Variables 3 | ////////////////////////////// 4 | $private-breakpoint-context-holder: (); 5 | $private-breakpoint-query-count: 0 !default; 6 | 7 | ////////////////////////////// 8 | // Breakpoint Has Context 9 | // Returns whether or not you are inside a Breakpoint query 10 | ////////////////////////////// 11 | @function breakpoint-has-context() { 12 | @if length($private-breakpoint-query-count) { 13 | @return true; 14 | } 15 | @else { 16 | @return false; 17 | } 18 | } 19 | 20 | ////////////////////////////// 21 | // Breakpoint Get Context 22 | // $feature: Input feature to get it's current MQ context. Returns false if no context 23 | ////////////////////////////// 24 | @function breakpoint-get-context($feature) { 25 | @if map-has-key($private-breakpoint-context-holder, $feature) { 26 | $get: map-get($private-breakpoint-context-holder, $feature); 27 | // Special handling of no-query from get side so /false/ prepends aren't returned 28 | @if $feature == 'no-query' { 29 | @if type-of($get) == 'list' and length($get) > 1 and nth($get, 1) == false { 30 | $get: nth($get, length($get)); 31 | } 32 | } 33 | @return $get; 34 | } 35 | @else { 36 | @if breakpoint-has-context() and $feature == 'media' { 37 | @return breakpoint-get('default media'); 38 | } 39 | @else { 40 | @return false; 41 | } 42 | } 43 | } 44 | 45 | ////////////////////////////// 46 | // Private function to set context 47 | ////////////////////////////// 48 | @function private-breakpoint-set-context($feature, $value) { 49 | @if $value == 'monochrome' { 50 | $feature: 'monochrome'; 51 | } 52 | 53 | $current: map-get($private-breakpoint-context-holder, $feature); 54 | @if $current and length($current) == $private-breakpoint-query-count { 55 | @warn "You have already queried against `#{$feature}`. Unexpected things may happen if you query against the same feature more than once in the same `and` query. Breakpoint is overwriting the current context with `#{$value}`"; 56 | } 57 | 58 | @if not map-has-key($private-breakpoint-context-holder, $feature) { 59 | $v-holder: (); 60 | @for $i from 1 to $private-breakpoint-query-count { 61 | @if $feature == 'media' { 62 | $v-holder: append($v-holder, breakpoint-get('default media')); 63 | } 64 | @else { 65 | $v-holder: append($v-holder, false); 66 | } 67 | } 68 | $v-holder: append($v-holder, $value); 69 | $private-breakpoint-context-holder: map-merge($private-breakpoint-context-holder, ($feature: $v-holder)) !global; 70 | } 71 | @else { 72 | $v-holder: map-get($private-breakpoint-context-holder, $feature); 73 | $length: length($v-holder); 74 | @for $i from $length to $private-breakpoint-query-count - 1 { 75 | @if $feature == 'media' { 76 | $v-holder: append($v-holder, breakpoint-get('default media')); 77 | } 78 | @else { 79 | $v-holder: append($v-holder, false); 80 | } 81 | } 82 | $v-holder: append($v-holder, $value); 83 | $private-breakpoint-context-holder: map-merge($private-breakpoint-context-holder, ($feature: $v-holder)) !global; 84 | } 85 | 86 | @return true; 87 | } 88 | 89 | ////////////////////////////// 90 | // Private function to reset context 91 | ////////////////////////////// 92 | @mixin private-breakpoint-reset-contexts { 93 | $private-breakpoint-context-holder: () !global; 94 | $private-breakpoint-query-count: 0 !global; 95 | } -------------------------------------------------------------------------------- /_includes/paginator-v1.html: -------------------------------------------------------------------------------- 1 | {% if paginator.total_pages > 1 %} 2 | 70 | {% endif %} 71 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-api.scss: -------------------------------------------------------------------------------- 1 | /// Plugin: SVG Grid Image 2 | /// ====================== 3 | /// @group plugin_svg-grid 4 | /// @see susy-svg-grid 5 | 6 | 7 | 8 | /// ## Overview 9 | /// If you want to generate svg-backgrounds 10 | /// for help visualizing and debugging your grids, 11 | /// import the SVG Grid Plugin. 12 | /// 13 | /// The plugin adds `svg-grid-colors` setting 14 | /// to your global defaults, 15 | /// which you can override in `$susy`. 16 | /// It also provides you with a new function, 17 | /// `susy-svg-grid()`, 18 | /// which will return inline svg for use in 19 | /// backgrounds or generated content. 20 | /// 21 | /// This function come with an unprefixed alias by default, 22 | /// using the `svg-grid` import. 23 | /// If you only only want prefixed versions of the API, 24 | /// import the `svg-grid/prefix` partial instead. 25 | /// 26 | /// @group plugin_svg-grid 27 | /// 28 | /// @example scss - importing the plugin 29 | /// // The full path to import Susy will depend on your setup… 30 | /// 31 | /// // unprefixed 32 | /// @import 'plugins/svg-grid'; 33 | /// 34 | /// // prefixed 35 | /// @import 'plugins/svg-grid/prefix'; 36 | /// 37 | /// @example scss - generating background grids 38 | /// .grid { 39 | /// background: susy-svg-grid() no-repeat scroll; 40 | /// } 41 | 42 | 43 | 44 | // SVG Grid 45 | // -------- 46 | /// Return inline svg-data in to display the grid. 47 | /// 48 | /// @group plugin_svg-grid 49 | /// 50 | /// @param {Map | List} $grid [$susy] - 51 | /// Map or shorthand defining the current grid 52 | /// @param {Color | List | null} $colors [null] - 53 | /// Column color, or list of colors for column-gradient, 54 | /// used to override the global `svg-grid-colors` setting 55 | /// @param {Length | null} $offset [null] - 56 | /// Manually override the default grid-image offset, 57 | /// to account for grid edges 58 | /// 59 | /// @return {String} - 60 | /// CSS inline-data SVG string, in `url()` format, 61 | /// for use in image or content properties 62 | /// @example scss 63 | /// .grid { 64 | /// background: susy-svg-grid() no-repeat scroll; 65 | /// } 66 | @function susy-svg-grid( 67 | $grid: $susy, 68 | $colors: null, 69 | $offset: null 70 | ) { 71 | // Grid parsing & normalizing 72 | $grid: susy-compile($grid, $context-only: true); 73 | 74 | // Color and gradient handling 75 | $gradient: ''; 76 | 77 | @if (not $colors) { 78 | $colors: susy-get('svg-grid-colors'); 79 | } 80 | 81 | @if length($colors) > 1 { 82 | $gradient: _susy-svg-gradient($colors); 83 | $colors: 'url(%23susy-svg-gradient)'; 84 | } @else { 85 | $colors: _susy-svg-color($colors); 86 | } 87 | 88 | // Get a default image-width 89 | $span: ( 90 | 'span': map-get($grid, 'columns'), 91 | 'spread': map-get($grid, 'container-spread'), 92 | ); 93 | $span: map-merge($grid, $span); 94 | $image-width: su-call('su-span', $span); 95 | $image-width: if((type-of($image-width) == 'number'), $image-width, 100%); 96 | 97 | // SVG construction 98 | $columns: map-get($grid, 'columns'); 99 | $offset: $offset or _susy-svg-offset($grid); 100 | 101 | $attrs: 'fill="#{$colors}" width="#{$image-width}"'; 102 | $svg: 'data:image/svg+xml,'; 103 | $svg: $svg + '%3Csvg xmlns="http://www.w3.org/2000/svg" #{$attrs} %3E'; 104 | $svg: $svg + $gradient; 105 | 106 | @for $column from 1 through length($columns) { 107 | $width: susy-span(1 narrow at $column, $grid); 108 | $x: _susy-svg-column-position($column, $grid); 109 | 110 | $svg: $svg + _susy-svg-rect($x, $width, $offset); 111 | } 112 | 113 | @return url('#{$svg}%3C/svg%3E'); 114 | } 115 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-utilities.scss: -------------------------------------------------------------------------------- 1 | // SVG Utilities 2 | // ============= 3 | 4 | 5 | 6 | // SVG Validate Units 7 | // ------------------ 8 | /// Make sure a length is supported in svg 9 | /// 10 | /// @access private 11 | /// 12 | /// @param {Length} $length - 13 | /// The length to validate 14 | /// @param {String} $name [null] - 15 | /// Optional name of length origin, 16 | /// for error reporting 17 | /// 18 | /// @return {Length} - 19 | /// An svg-validated length, or comparable valid length 20 | @function _susy-svg-validate-units( 21 | $length, 22 | $name: null 23 | ) { 24 | $_svg-units: ('em', 'ex', 'px', 'pt', 'pc', 'cm', 'mm', 'in', '%'); 25 | $string: type-of($length) == 'string'; 26 | 27 | @if ($length == 0) or ($string) or index($_svg-units, unit($length)) { 28 | @return $length; 29 | } 30 | 31 | @return _susy-error( 32 | '`#{unit($length)}` #{$name} units are not supported in SVG', 33 | '_susy-svg-validate-units'); 34 | } 35 | 36 | 37 | 38 | // SVG Rect 39 | // -------- 40 | /// Build a single svg rectangle 41 | /// 42 | /// @access private 43 | /// 44 | /// @param {Length} $x - 45 | /// Horizontal position for the rectangle 46 | /// @param {Length} $width - 47 | /// Width of the rectangle 48 | /// @param {Length} $offset [null] - 49 | /// Offset the rectangle, to account for edge gutters 50 | /// 51 | /// @return {String} - 52 | /// Escaped string representing one svg rectangle 53 | @function _susy-svg-rect( 54 | $x, 55 | $width, 56 | $offset: null 57 | ) { 58 | $x: _susy-svg-validate-units($x); 59 | $width: _susy-svg-validate-units($width); 60 | $offset: if($offset == 0, null, $offset); 61 | 62 | @if (type-of($offset) == 'number') and (type-of($x) == 'number') { 63 | @if comparable($x, $offset) { 64 | $x: $x + $offset; 65 | } @else { 66 | $x: 'calc(#{$x} + #{$offset})'; 67 | } 68 | } @else if $offset and ($x != 0) { 69 | $x: 'calc(#{$x} + #{$offset})'; 70 | } @else if $offset { 71 | $x: $offset; 72 | } 73 | 74 | @return '%3Crect x="#{$x}" width="#{$width}" height="100%"/%3E'; 75 | } 76 | 77 | 78 | 79 | // SVG Color 80 | // --------- 81 | /// Stringify colors, and escape hex symbol 82 | /// 83 | /// @access private 84 | /// 85 | /// @param {Color} $color - 86 | /// Color to stringify and escape 87 | /// 88 | /// @return {String} - 89 | /// Escaped string value of color 90 | @function _susy-svg-color( 91 | $color 92 | ) { 93 | $color: inspect($color); // convert to string 94 | 95 | @if (str-index($color, '#') == 1) { 96 | $color: '%23' + str-slice($color, 2); 97 | } 98 | 99 | @return $color; 100 | } 101 | 102 | 103 | 104 | // SVG Gradient 105 | // ------------ 106 | /// Create a multi-color svg gradient 107 | /// 108 | /// @access private 109 | /// 110 | /// @param {List} $colors - 111 | /// List of colors to be equally spaced from `0%` to `100%` 112 | /// in each column rectangle 113 | /// 114 | /// @return {String} - 115 | /// Escaped string representing one svg gradient 116 | /// (`id="susy-svg-gradient"`) 117 | @function _susy-svg-gradient( 118 | $colors 119 | ) { 120 | $gradient: '%3Cdefs%3E%3ClinearGradient spreadMethod="pad"'; 121 | $gradient: '#{$gradient} id="susy-svg-gradient"'; 122 | $gradient: '#{$gradient} x1="0%" y1="0%" x2="100%" y2="0%"%3E'; 123 | 124 | @for $i from 1 through length($colors) { 125 | $color: _susy-svg-color(nth($colors, $i)); 126 | $offset: percentage(($i - 1) / (length($colors) - 1)); 127 | $stop: '%3Cstop offset="#{$offset}" style="stop-color:#{$color};" /%3E'; 128 | 129 | $gradient: $gradient + $stop; 130 | } 131 | 132 | @return $gradient + '%3C/linearGradient%3E%3C/defs%3E'; 133 | } 134 | -------------------------------------------------------------------------------- /_layouts/single.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 | {% if page.header.overlay_color or page.header.overlay_image or page.header.image %} 6 | {% include page__hero.html %} 7 | {% elsif page.header.video.id and page.header.video.provider %} 8 | {% include page__hero_video.html %} 9 | {% endif %} 10 | 11 | {% assign breadcrumbs_enabled = site.breadcrumbs %} 12 | {% if page.breadcrumbs != null %} 13 | {% assign breadcrumbs_enabled = page.breadcrumbs %} 14 | {% endif %} 15 | {% if page.url != "/" and breadcrumbs_enabled %} 16 | {% unless paginator %} 17 | {% include breadcrumbs.html %} 18 | {% endunless %} 19 | {% endif %} 20 | 21 |
22 | {% include sidebar.html %} 23 | 24 |
25 | {% if page.title %}{% endif %} 26 | {% if page.excerpt %}{% endif %} 27 | {% if page.date %}{% endif %} 28 | {% if page.last_modified_at %}{% endif %} 29 | 30 |
31 | {% unless page.header.overlay_color or page.header.overlay_image %} 32 |
33 | {% if page.title -%} 34 |

35 | 36 |

37 | {%- endif %} 38 | {% include page__meta.html %} 39 |
40 | {% endunless %} 41 | 42 |
43 | {% if page.toc %} 44 | 50 | {% endif %} 51 | {{ content }} 52 | {% if page.link %}
{{ site.data.ui-text[site.locale].ext_link_label | default: "Direct Link" }}
{% endif %} 53 |
54 | 55 |
56 | {% if site.data.ui-text[site.locale].meta_label %} 57 |

{{ site.data.ui-text[site.locale].meta_label }}

58 | {% endif %} 59 | {% include page__taxonomy.html %} 60 | {% include page__date.html %} 61 |
62 | 63 | {% if page.share %}{% include social-share.html %}{% endif %} 64 | 65 | {% include post_pagination.html %} 66 |
67 | 68 | {% if site.comments.provider and page.comments %} 69 | {% if jekyll.environment == 'production' %} 70 | {% include comments.html %} 71 | {% else %} 72 |

73 | Comments are configured with provider: {{ site.comments.provider }}, 74 | but are disabled in non-production environments. 75 |

76 | {% endif %} 77 | {% endif %} 78 |
79 | 80 | {% comment %}{% endcomment %} 81 | {% if page.id and page.related and site.related_posts.size > 0 %} 82 | {% include page__related.html posts=site.related_posts %} 83 | {% comment %}{% endcomment %} 84 | {% elsif page.id and page.related %} 85 | {% include page__related.html posts=site.posts %} 86 | {% endif %} 87 |
88 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/parsers/_query.scss: -------------------------------------------------------------------------------- 1 | @function breakpoint-parse-query($query) { 2 | // Parse features out of an individual query 3 | $feature-holder: (); 4 | $query-holder: (); 5 | $length: length($query); 6 | 7 | @if $length == 2 { 8 | // If we've got a string/number, number/string, check to see if it's a valid string/number pair or two singles 9 | @if (type-of(nth($query, 1)) == 'string' and type-of(nth($query, 2)) == 'number') or (type-of(nth($query, 1)) == 'number' and type-of(nth($query, 2)) == 'string') { 10 | 11 | $number: ''; 12 | $value: ''; 13 | 14 | @if type-of(nth($query, 1)) == 'string' { 15 | $number: nth($query, 2); 16 | $value: nth($query, 1); 17 | } 18 | @else { 19 | $number: nth($query, 1); 20 | $value: nth($query, 2); 21 | } 22 | 23 | // If the string value can be a single value, check to see if the number passed in is a valid input for said single value. Fortunately, all current single-value options only accept unitless numbers, so this check is easy. 24 | @if breakpoint-single-string($value) { 25 | @if unitless($number) { 26 | $feature-holder: append($value, $number, space); 27 | $query-holder: append($query-holder, $feature-holder, comma); 28 | @return $query-holder; 29 | } 30 | } 31 | // If the string is a media type, split the query 32 | @if breakpoint-is-media($value) { 33 | $query-holder: append($query-holder, nth($query, 1)); 34 | $query-holder: append($query-holder, nth($query, 2)); 35 | @return $query-holder; 36 | } 37 | // If it's not a single feature, we're just going to assume it's a proper string/value pair, and roll with it. 38 | @else { 39 | $feature-holder: append($value, $number, space); 40 | $query-holder: append($query-holder, $feature-holder, comma); 41 | @return $query-holder; 42 | } 43 | 44 | } 45 | // If they're both numbers, we assume it's a double and roll with that 46 | @else if (type-of(nth($query, 1)) == 'number' and type-of(nth($query, 2)) == 'number') { 47 | $feature-holder: append(nth($query, 1), nth($query, 2), space); 48 | $query-holder: append($query-holder, $feature-holder, comma); 49 | @return $query-holder; 50 | } 51 | // If they're both strings and neither are singles, we roll with that. 52 | @else if (type-of(nth($query, 1)) == 'string' and type-of(nth($query, 2)) == 'string') { 53 | @if not breakpoint-single-string(nth($query, 1)) and not breakpoint-single-string(nth($query, 2)) { 54 | $feature-holder: append(nth($query, 1), nth($query, 2), space); 55 | $query-holder: append($query-holder, $feature-holder, comma); 56 | @return $query-holder; 57 | } 58 | } 59 | } 60 | @else if $length == 3 { 61 | // If we've got three items and none is a list, we check to see 62 | @if type-of(nth($query, 1)) != 'list' and type-of(nth($query, 2)) != 'list' and type-of(nth($query, 3)) != 'list' { 63 | // If none of the items are single string values and none of the values are media values, we're good. 64 | @if (not breakpoint-single-string(nth($query, 1)) and not breakpoint-single-string(nth($query, 2)) and not breakpoint-single-string(nth($query, 3))) and ((not breakpoint-is-media(nth($query, 1)) and not breakpoint-is-media(nth($query, 2)) and not breakpoint-is-media(nth($query, 3)))) { 65 | $feature-holder: append(nth($query, 1), nth($query, 2), space); 66 | $feature-holder: append($feature-holder, nth($query, 3), space); 67 | $query-holder: append($query-holder, $feature-holder, comma); 68 | @return $query-holder; 69 | } 70 | // let's check to see if the first item is a media type 71 | @else if breakpoint-is-media(nth($query, 1)) { 72 | $query-holder: append($query-holder, nth($query, 1)); 73 | $feature-holder: append(nth($query, 2), nth($query, 3), space); 74 | $query-holder: append($query-holder, $feature-holder); 75 | @return $query-holder; 76 | } 77 | } 78 | } 79 | 80 | // If it's a single item, or if it's not a special case double or triple, we can simply return the query. 81 | @return $query; 82 | } 83 | -------------------------------------------------------------------------------- /staticman.yml: -------------------------------------------------------------------------------- 1 | # Name of the property. You can have multiple properties with completely 2 | # different config blocks for different sections of your site. 3 | # For example, you can have one property to handle comment submission and 4 | # another one to handle posts. 5 | # To encrypt strings use the following endpoint: 6 | # https://{your Staticman API URL}/v[2|3]/encrypt/{TEXT TO BE ENCRYPTED} 7 | 8 | comments: 9 | # (*) REQUIRED 10 | # 11 | # Names of the fields the form is allowed to submit. If a field that is 12 | # not here is part of the request, an error will be thrown. 13 | allowedFields: ["name", "email", "url", "message"] 14 | 15 | # (*) REQUIRED WHEN USING NOTIFICATIONS 16 | # 17 | # When allowedOrigins is defined, only requests sent from one of the domains 18 | # listed will be accepted. The origin is sent as part as the `options` object 19 | # (e.g. {% endcapture %}{% assign _content = _content | remove: _end %}{% endfor %}{% if _profile and _endings %}{% assign _profile_endings = _content | size | plus: 1 %}{% endif %}{% for _element in site.compress_html.startings %}{% capture _start %}<{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _start %}{% endfor %}{% if _profile and site.compress_html.startings %}{% assign _profile_startings = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.comments == "all" %}{% assign _comments = "" | split: " " %}{% else %}{% assign _comments = site.compress_html.comments %}{% endif %}{% if _comments.size == 2 %}{% capture _comment_befores %}.{{ _content }}{% endcapture %}{% assign _comment_befores = _comment_befores | split: _comments.first %}{% for _comment_before in _comment_befores %}{% if forloop.first %}{% continue %}{% endif %}{% capture _comment_outside %}{% if _carry %}{{ _comments.first }}{% endif %}{{ _comment_before }}{% endcapture %}{% capture _comment %}{% unless _carry %}{{ _comments.first }}{% endunless %}{{ _comment_outside | split: _comments.last | first }}{% if _comment_outside contains _comments.last %}{{ _comments.last }}{% assign _carry = false %}{% else %}{% assign _carry = true %}{% endif %}{% endcapture %}{% assign _content = _content | remove_first: _comment %}{% endfor %}{% if _profile %}{% assign _profile_comments = _content | size | plus: 1 %}{% endif %}{% endif %}{% assign _pre_befores = _content | split: "" %}{% assign _pres_after = "" %}{% if _pres.size != 0 %}{% if site.compress_html.blanklines %}{% assign _lines = _pres.last | split: _LINE_FEED %}{% capture _pres_after %}{% for _line in _lines %}{% assign _trimmed = _line | split: " " | join: " " %}{% if _trimmed != empty or forloop.last %}{% unless forloop.first %}{{ _LINE_FEED }}{% endunless %}{{ _line }}{% endif %}{% endfor %}{% endcapture %}{% else %}{% assign _pres_after = _pres.last | split: " " | join: " " %}{% endif %}{% endif %}{% capture _content %}{{ _content }}{% if _pre_before contains "" %}{% endif %}{% unless _pre_before contains "" and _pres.size == 1 %}{{ _pres_after }}{% endunless %}{% endcapture %}{% endfor %}{% if _profile %}{% assign _profile_collapse = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.clippings == "all" %}{% assign _clippings = "html head title base link meta style body article section nav aside h1 h2 h3 h4 h5 h6 hgroup header footer address p hr blockquote ol ul li dl dt dd figure figcaption main div table caption colgroup col tbody thead tfoot tr td th" | split: " " %}{% else %}{% assign _clippings = site.compress_html.clippings %}{% endif %}{% for _element in _clippings %}{% assign _edges = " ;; ;" | replace: "e", _element | split: ";" %}{% assign _content = _content | replace: _edges[0], _edges[1] | replace: _edges[2], _edges[3] | replace: _edges[4], _edges[5] %}{% endfor %}{% if _profile and _clippings %}{% assign _profile_clippings = _content | size | plus: 1 %}{% endif %}{{ _content }}{% if _profile %}
Step Bytes
raw {{ content | size }}{% if _profile_endings %}
endings {{ _profile_endings }}{% endif %}{% if _profile_startings %}
startings {{ _profile_startings }}{% endif %}{% if _profile_comments %}
comments {{ _profile_comments }}{% endif %}{% if _profile_collapse %}
collapse {{ _profile_collapse }}{% endif %}{% if _profile_clippings %}
clippings {{ _profile_clippings }}{% endif %}
{% endif %}{% endif %} 11 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/_reset.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | STYLE RESETS 3 | ========================================================================== */ 4 | 5 | * { box-sizing: border-box; } 6 | 7 | html { 8 | /* apply a natural box layout model to all elements */ 9 | box-sizing: border-box; 10 | background-color: $background-color; 11 | font-size: $doc-font-size; 12 | 13 | @include breakpoint($medium) { 14 | font-size: $doc-font-size-medium; 15 | } 16 | 17 | @include breakpoint($large) { 18 | font-size: $doc-font-size-large; 19 | } 20 | 21 | @include breakpoint($x-large) { 22 | font-size: $doc-font-size-x-large; 23 | } 24 | 25 | -webkit-text-size-adjust: 100%; 26 | -ms-text-size-adjust: 100%; 27 | } 28 | 29 | /* Remove margin */ 30 | 31 | body { margin: 0; } 32 | 33 | /* Selected elements */ 34 | 35 | ::-moz-selection { 36 | color: #fff; 37 | background: #000; 38 | } 39 | 40 | ::selection { 41 | color: #fff; 42 | background: #000; 43 | } 44 | 45 | /* Display HTML5 elements in IE6-9 and FF3 */ 46 | 47 | article, 48 | aside, 49 | details, 50 | figcaption, 51 | figure, 52 | footer, 53 | header, 54 | hgroup, 55 | main, 56 | nav, 57 | section { 58 | display: block; 59 | } 60 | 61 | /* Display block in IE6-9 and FF3 */ 62 | 63 | audio, 64 | canvas, 65 | video { 66 | display: inline-block; 67 | } 68 | 69 | /* Prevents modern browsers from displaying 'audio' without controls */ 70 | 71 | audio:not([controls]) { 72 | display: none; 73 | } 74 | 75 | a { 76 | color: $link-color; 77 | } 78 | 79 | /* Apply focus state */ 80 | 81 | a:focus { 82 | @extend %tab-focus; 83 | } 84 | 85 | /* Remove outline from links */ 86 | 87 | a:hover, 88 | a:active { 89 | outline: 0; 90 | } 91 | 92 | /* Prevent sub and sup affecting line-height in all browsers */ 93 | 94 | sub, 95 | sup { 96 | position: relative; 97 | font-size: 75%; 98 | line-height: 0; 99 | vertical-align: baseline; 100 | } 101 | 102 | sup { 103 | top: -0.5em; 104 | } 105 | 106 | sub { 107 | bottom: -0.25em; 108 | } 109 | 110 | /* img border in anchor's and image quality */ 111 | 112 | img { 113 | /* Responsive images (ensure images don't scale beyond their parents) */ 114 | max-width: 100%; /* part 1: Set a maximum relative to the parent*/ 115 | width: auto\9; /* IE7-8 need help adjusting responsive images*/ 116 | height: auto; /* part 2: Scale the height according to the width, otherwise you get stretching*/ 117 | 118 | vertical-align: middle; 119 | border: 0; 120 | -ms-interpolation-mode: bicubic; 121 | } 122 | 123 | /* Prevent max-width from affecting Google Maps */ 124 | 125 | #map_canvas img, 126 | .google-maps img { 127 | max-width: none; 128 | } 129 | 130 | /* Consistent form font size in all browsers, margin changes, misc */ 131 | 132 | button, 133 | input, 134 | select, 135 | textarea { 136 | margin: 0; 137 | font-size: 100%; 138 | vertical-align: middle; 139 | } 140 | 141 | button, 142 | input { 143 | line-height: normal; /* FF3/4 have !important on line-height in UA stylesheet*/ 144 | } 145 | 146 | button::-moz-focus-inner, 147 | input::-moz-focus-inner { /* inner padding and border oddities in FF3/4*/ 148 | padding: 0; 149 | border: 0; 150 | } 151 | 152 | button, 153 | html input[type="button"], // avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls 154 | input[type="reset"], 155 | input[type="submit"] { 156 | -webkit-appearance: button; /* corrects inability to style clickable `input` types in iOS*/ 157 | cursor: pointer; /* improves usability and consistency of cursor style between image-type `input` and others*/ 158 | } 159 | 160 | label, 161 | select, 162 | button, 163 | input[type="button"], 164 | input[type="reset"], 165 | input[type="submit"], 166 | input[type="radio"], 167 | input[type="checkbox"] { 168 | cursor: pointer; /* improves usability and consistency of cursor style between image-type `input` and others*/ 169 | } 170 | 171 | input[type="search"] { /* Appearance in Safari/Chrome*/ 172 | box-sizing: border-box; 173 | -webkit-appearance: textfield; 174 | } 175 | 176 | input[type="search"]::-webkit-search-decoration, 177 | input[type="search"]::-webkit-search-cancel-button { 178 | -webkit-appearance: none; /* inner-padding issues in Chrome OSX, Safari 5*/ 179 | } 180 | 181 | textarea { 182 | overflow: auto; /* remove vertical scrollbar in IE6-9*/ 183 | vertical-align: top; /* readability and alignment cross-browser*/ 184 | } 185 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/susy/susy/_utilities.scss: -------------------------------------------------------------------------------- 1 | // Sass Utilities 2 | // ============== 3 | // - Susy Error Output Override [variable] 4 | // - Susy Error [function] 5 | 6 | 7 | 8 | // Susy Error Output Override 9 | // -------------------------- 10 | /// Turn off error output for testing 11 | /// @group x-utility 12 | /// @access private 13 | $_susy-error-output-override: false !default; 14 | 15 | 16 | 17 | // Susy Error 18 | // ---------- 19 | /// Optionally return error messages without failing, 20 | /// as a way to test error cases 21 | /// 22 | /// @group x-utility 23 | /// @access private 24 | /// 25 | /// @param {string} $message - 26 | /// A useful error message, explaining the problem 27 | /// @param {string} $source - 28 | /// The original source of the error for debugging 29 | /// @param {bool} $override [$_susy-error-output-override] - 30 | /// Optionally return the error rather than failing 31 | /// @return {string} - 32 | /// Combined error with source and message 33 | /// @throws When `$override == true` 34 | @function _susy-error( 35 | $message, 36 | $source, 37 | $override: $_susy-error-output-override 38 | ) { 39 | @if $override { 40 | @return 'ERROR [#{$source}] #{$message}'; 41 | } 42 | 43 | @error '[#{$source}] #{$message}'; 44 | } 45 | 46 | 47 | // Su Is Comparable 48 | // ---------------- 49 | /// Check that the units in a grid are comparable 50 | /// 51 | /// @group x-validation 52 | /// @access private 53 | /// 54 | /// @param {numbers} $lengths… - 55 | /// Arglist of all the number values to compare 56 | /// (columns, gutters, span, etc) 57 | /// 58 | /// @return {'fluid' | 'static' | false} - 59 | /// The type of span (fluid or static) when units match, 60 | /// or `false` for mismatched units 61 | @function _su-is-comparable( 62 | $lengths... 63 | ) { 64 | $first: nth($lengths, 1); 65 | 66 | @if (length($lengths) == 1) { 67 | @return if(unitless($first), 'fluid', 'static'); 68 | } 69 | 70 | @for $i from 2 through length($lengths) { 71 | $comp: nth($lengths, $i); 72 | 73 | $fail: not comparable($first, $comp); 74 | $fail: $fail or (unitless($first) and not unitless($comp)); 75 | $fail: $fail or (unitless($comp) and not unitless($first)); 76 | 77 | @if $fail { 78 | @return false; 79 | } 80 | } 81 | 82 | @return if(unitless($first), 'fluid', 'static'); 83 | } 84 | 85 | 86 | // Su Map Add Units 87 | // ---------------- 88 | /// The calc features use a map of units and values 89 | /// to compile the proper algorythm. 90 | /// This function adds a new value to any comparable existing unit/value, 91 | /// or adds a new unit/value pair to the map 92 | /// 93 | /// @group x-utility 94 | /// @access private 95 | /// 96 | /// @param {map} $map - 97 | /// A map of unit/value pairs, e.g. ('px': 120px) 98 | /// @param {length} $value - 99 | /// A new length to be added to the map 100 | /// @return {map} - 101 | /// The updated map, with new value added 102 | /// 103 | /// @example scss - 104 | /// $map: (0px: 120px); 105 | /// $map: _su-map-add-units($map, 1in); // add a comparable unit 106 | /// $map: _su-map-add-units($map, 3vw); // add a new unit 107 | /// 108 | /// @each $units, $value in $map { 109 | /// /* #{$units}: #{$value} */ 110 | /// } 111 | @function _su-map-add-units( 112 | $map, 113 | $value 114 | ) { 115 | $unit: $value * 0; 116 | $has: map-get($map, $unit) or 0; 117 | 118 | @if ($has == 0) { 119 | @each $try, $could in $map { 120 | $match: comparable($try, $value); 121 | $unit: if($match, $try, $unit); 122 | $has: if($match, $could, $has); 123 | } 124 | } 125 | 126 | @return map-merge($map, ($unit: $has + $value)); 127 | } 128 | 129 | 130 | // Susy Flatten 131 | // ------------ 132 | /// Flatten a multidimensional list 133 | /// 134 | /// @group x-utility 135 | /// @access private 136 | /// 137 | /// @param {list} $list - 138 | /// The list to be flattened 139 | /// @return {list} - 140 | /// The flattened list 141 | /// 142 | /// @example scss - 143 | /// $list: 120px (30em 30em) 120px; 144 | /// /* #{_susy-flatten($list)} */ 145 | @function _susy-flatten( 146 | $list 147 | ) { 148 | $flat: (); 149 | 150 | // Don't iterate over maps 151 | @if (type-of($list) == 'map') { 152 | @return $list; 153 | } 154 | 155 | // Iterate over lists (or single items) 156 | @each $item in $list { 157 | @if (type-of($item) == 'list') { 158 | $item: _susy-flatten($item); 159 | $flat: join($flat, $item); 160 | } @else { 161 | $flat: append($flat, $item); 162 | } 163 | } 164 | 165 | // Return flattened list 166 | @return $flat; 167 | } 168 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/_print.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | PRINT STYLES 3 | ========================================================================== */ 4 | 5 | @media print { 6 | 7 | [hidden] { 8 | display: none; 9 | } 10 | 11 | * { 12 | -moz-box-sizing: border-box; 13 | -webkit-box-sizing: border-box; 14 | box-sizing: border-box; 15 | } 16 | 17 | html { 18 | margin: 0; 19 | padding: 0; 20 | min-height: auto !important; 21 | font-size: 16px; 22 | } 23 | 24 | body { 25 | margin: 0 auto; 26 | background: #fff !important; 27 | color: #000 !important; 28 | font-size: 1rem; 29 | line-height: 1.5; 30 | -moz-osx-font-smoothing: grayscale; 31 | -webkit-font-smoothing: antialiased; 32 | text-rendering: optimizeLegibility; 33 | } 34 | 35 | h1, 36 | h2, 37 | h3, 38 | h4, 39 | h5, 40 | h6 { 41 | color: #000; 42 | line-height: 1.2; 43 | margin-bottom: 0.75rem; 44 | margin-top: 0; 45 | } 46 | 47 | h1 { 48 | font-size: 2.5rem; 49 | } 50 | 51 | h2 { 52 | font-size: 2rem; 53 | } 54 | 55 | h3 { 56 | font-size: 1.75rem; 57 | } 58 | 59 | h4 { 60 | font-size: 1.5rem; 61 | } 62 | 63 | h5 { 64 | font-size: 1.25rem; 65 | } 66 | 67 | h6 { 68 | font-size: 1rem; 69 | } 70 | 71 | a, 72 | a:visited { 73 | color: #000; 74 | text-decoration: underline; 75 | word-wrap: break-word; 76 | } 77 | 78 | table { 79 | border-collapse: collapse; 80 | } 81 | 82 | thead { 83 | display: table-header-group; 84 | } 85 | 86 | table, 87 | th, 88 | td { 89 | border-bottom: 1px solid #000; 90 | } 91 | 92 | td, 93 | th { 94 | padding: 8px 16px; 95 | } 96 | 97 | img { 98 | border: 0; 99 | display: block; 100 | max-width: 100% !important; 101 | vertical-align: middle; 102 | } 103 | 104 | hr { 105 | border: 0; 106 | border-bottom: 2px solid #bbb; 107 | height: 0; 108 | margin: 2.25rem 0; 109 | padding: 0; 110 | } 111 | 112 | dt { 113 | font-weight: bold; 114 | } 115 | 116 | dd { 117 | margin: 0; 118 | margin-bottom: 0.75rem; 119 | } 120 | 121 | abbr[title], 122 | acronym[title] { 123 | border: 0; 124 | text-decoration: none; 125 | } 126 | 127 | table, 128 | blockquote, 129 | pre, 130 | code, 131 | figure, 132 | li, 133 | hr, 134 | ul, 135 | ol, 136 | a, 137 | tr { 138 | page-break-inside: avoid; 139 | } 140 | 141 | h2, 142 | h3, 143 | h4, 144 | p, 145 | a { 146 | orphans: 3; 147 | widows: 3; 148 | } 149 | 150 | h1, 151 | h2, 152 | h3, 153 | h4, 154 | h5, 155 | h6 { 156 | page-break-after: avoid; 157 | page-break-inside: avoid; 158 | } 159 | 160 | h1 + p, 161 | h2 + p, 162 | h3 + p { 163 | page-break-before: avoid; 164 | } 165 | 166 | img { 167 | page-break-after: auto; 168 | page-break-before: auto; 169 | page-break-inside: avoid; 170 | } 171 | 172 | pre { 173 | white-space: pre-wrap !important; 174 | word-wrap: break-word; 175 | } 176 | 177 | a[href^='http://']:after, 178 | a[href^='https://']:after, 179 | a[href^='ftp://']:after { 180 | content: " (" attr(href) ")"; 181 | font-size: 80%; 182 | } 183 | 184 | abbr[title]:after, 185 | acronym[title]:after { 186 | content: " (" attr(title) ")"; 187 | } 188 | 189 | #main { 190 | max-width: 100%; 191 | } 192 | 193 | .page { 194 | margin: 0; 195 | padding: 0; 196 | width: 100%; 197 | } 198 | 199 | .page-break, 200 | .page-break-before { 201 | page-break-before: always; 202 | } 203 | 204 | .page-break-after { 205 | page-break-after: always; 206 | } 207 | 208 | .no-print { 209 | display: none; 210 | } 211 | 212 | a.no-reformat:after { 213 | content: ''; 214 | } 215 | 216 | abbr[title].no-reformat:after, 217 | acronym[title].no-reformat:after { 218 | content: ''; 219 | } 220 | 221 | .page__hero-caption { 222 | color: #000 !important; 223 | background: #fff !important; 224 | opacity: 1; 225 | 226 | a { 227 | color: #000 !important; 228 | } 229 | } 230 | 231 | /* 232 | Hide the following elements on print 233 | ========================================================================== */ 234 | 235 | .masthead, 236 | .toc, 237 | .page__share, 238 | .page__related, 239 | .pagination, 240 | .ads, 241 | .page__footer, 242 | .page__comments-form, 243 | .author__avatar, 244 | .author__content, 245 | .author__urls-wrapper, 246 | .nav__list, 247 | .sidebar, 248 | .adsbygoogle { 249 | display: none !important; 250 | height: 1px !important; 251 | } 252 | } -------------------------------------------------------------------------------- /_pages/projects/powershell-projects.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: PowerShell Projects 3 | layout: splash 4 | permalink: /projects/powershell-projects/ 5 | use_mermaid: true 6 | classes: wide 7 | header: 8 | title: PowerShell Projects 9 | overlay_color: "#242730ff" 10 | overlay_image: /assets/images/powershell-tools.jpg 11 | overlay_filter: 0.3 12 | actions: 13 | - label: " View On GitHub" 14 | url: "https://github.com/stars/GamehunterKaan/lists/powershell-projects" 15 | excerpt: > 16 | A collection of PowerShell projects, including open-source utilities for network scanning and file discovery, alongside internal research on fileless techniques for defensive validation. 17 | --- 18 | 19 | # PowerShell Projects — Catalog, Research & Defensive Guidance 20 | A defender- and researcher-oriented summary of PowerShell projects I maintain. This page outlines project goals, conceptual architecture, defensive implications, and how teams can responsibly use the work for detection tuning and purple-team exercises. 21 | 22 | 23 | ## Executive summary 24 | 25 | PowerShell is a built-in automation platform widely used by administrators, defenders, and researchers. The projects summarized here span utilities, network/recon tooling, and focused research. One significant internal research area is a fileless, in-memory PowerShell research effort. That work is intended for defensive testing, detection development, and coordinated purple-team validation; it is available under controlled conditions and is not published as a weaponized artifact. 26 | 27 | --- 28 | 29 | ## Categories (at a glance) 30 | 31 |
32 | flowchart TB 33 | A[PowerShell Projects] --> B["Utilities"] 34 | A --> C["Network & Recon"] 35 | A --> D["Research (internal/private)"] 36 | A --> E["Automation & Orchestration"] 37 | B --> B1["PowerShell-File-Search"] 38 | C --> C1["PowerShell-Network-Scanner"] 39 | D --> D1["Fileless PowerShell Research (internal)"] 40 | E --> E1["Supporting automation scripts"] 41 |
42 | 43 | - **Utilities:** File discovery, log helpers, and small admin aids used for incident triage. 44 | - **Network & Recon:** Lightweight discovery and mapping tools for controlled lab recon. 45 | - **Research (internal/private):** Focused work on detection gaps and memory-resident behaviors; access is coordinated. 46 | - **Automation & Orchestration:** Scripts to provision labs, collect telemetry, and run repeatable tests. 47 | 48 | --- 49 | 50 | ## Project summaries (short, 2–3 lines each) 51 | 52 | ### 🔹 PowerShell-File-Search 53 | A fast PowerShell utility for locating and filtering files across endpoints—useful for incident triage and targeted artifact collection. 54 | **Use:** IR and admin helper. · **Link:** `https://github.com/GamehunterKaan/PowerShell-File-Search` 55 | 56 | ### 🔹 PowerShell-Network-Scanner 57 | Lightweight discovery tool to find live hosts and enumerate basic services in test environments. 58 | **Use:** Recon and mapping in controlled exercises. · **Link:** `https://github.com/GamehunterKaan/PowerShell-Network-Scanner` 59 | 60 | ### 🔹 Fileless PowerShell Research *(internal / access-controlled)* 61 | A defensive research program that examines in-memory (fileless) behaviors and related telemetry. The research focuses on detection hypotheses, SOC playbooks, and sanitized testcases for purple-team validation. Access is granted only under written authorization and defined scope. 62 | **Use:** Detection development, SOC training, and internal validation. · 63 | 64 | --- 65 | 66 | ## Research: fileless PowerShell (internal, defensive) 67 | 68 | > **Important:** The content below is descriptive and defensive. It intentionally excludes operational details and implementation techniques. 69 | 70 | ### Purpose & scope 71 | The internal fileless research is intended to help defenders understand how memory-resident techniques manifest in telemetry and to provide sanitized testcases that improve detection coverage and incident response playbooks. It is **not** publicly released as an exploit toolkit. 72 | 73 | ### Research goals (defensive) 74 | - Surface observable telemetry patterns that distinguish suspicious in-memory activity from benign administration tasks. 75 | - Produce detection hypotheses, telemetry requirements, and SOC playbooks. 76 | - Create sanitized, reproducible testcases for purple-team validation and EDR tuning. 77 | 78 |
79 | flowchart LR 80 | Lab[Authorized Lab] --> Execute[Controlled In-Memory Tests] 81 | Execute --> Telemetry[Collect Process & Memory Telemetry] 82 | Telemetry --> Hypotheses[Form Detection Hypotheses] 83 | Hypotheses --> Tune[Tune EDR & SOC Rules] 84 | Tune --> Validate[Purple-Team Validation] 85 |
86 | 87 | --- 88 | 89 | ## Access & coordination 90 | 91 | Because the internal fileless research involves sensitive techniques, raw artifacts and testcases are available **only** under coordinated engagements with written authorization and defined scope. If you are a researcher, SOC team, or vendor seeking access for defensive validation, contact me to arrange a controlled engagement. -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/breakpoint/_helpers.scss: -------------------------------------------------------------------------------- 1 | ////////////////////////////// 2 | // Converts the input value to Base EMs 3 | ////////////////////////////// 4 | @function breakpoint-to-base-em($value) { 5 | $value-unit: unit($value); 6 | 7 | // Will convert relative EMs into root EMs. 8 | @if breakpoint-get('base font size') and type-of(breakpoint-get('base font size')) == 'number' and $value-unit == 'em' { 9 | $base-unit: unit(breakpoint-get('base font size')); 10 | 11 | @if $base-unit == 'px' or $base-unit == '%' or $base-unit == 'em' or $base-unit == 'pt' { 12 | @return base-conversion($value) / base-conversion(breakpoint-get('base font size')) * 1em; 13 | } 14 | @else { 15 | @warn '#{breakpoint-get(\'base font size\')} is not set in valid units for font size!'; 16 | @return false; 17 | } 18 | } 19 | @else { 20 | @return base-conversion($value); 21 | } 22 | } 23 | 24 | @function base-conversion($value) { 25 | $unit: unit($value); 26 | 27 | @if $unit == 'px' { 28 | @return $value / 16px * 1em; 29 | } 30 | @else if $unit == '%' { 31 | @return $value / 100% * 1em; 32 | } 33 | @else if $unit == 'em' { 34 | @return $value; 35 | } 36 | @else if $unit == 'pt' { 37 | @return $value / 12pt * 1em; 38 | } 39 | @else { 40 | @return $value; 41 | // @warn 'Everything is terrible! What have you done?!'; 42 | } 43 | } 44 | 45 | ////////////////////////////// 46 | // Returns whether the feature can have a min/max pair 47 | ////////////////////////////// 48 | $breakpoint-min-max-features: 'color', 49 | 'color-index', 50 | 'aspect-ratio', 51 | 'device-aspect-ratio', 52 | 'device-height', 53 | 'device-width', 54 | 'height', 55 | 'monochrome', 56 | 'resolution', 57 | 'width'; 58 | 59 | @function breakpoint-min-max($feature) { 60 | @each $item in $breakpoint-min-max-features { 61 | @if $feature == $item { 62 | @return true; 63 | } 64 | } 65 | @return false; 66 | } 67 | 68 | ////////////////////////////// 69 | // Returns whether the feature can have a string value 70 | ////////////////////////////// 71 | $breakpoint-string-features: 'orientation', 72 | 'scan', 73 | 'color', 74 | 'aspect-ratio', 75 | 'device-aspect-ratio', 76 | 'pointer', 77 | 'luminosity'; 78 | 79 | @function breakpoint-string-value($feature) { 80 | @each $item in $breakpoint-string-features { 81 | @if breakpoint-min-max($item) { 82 | @if $feature == 'min-#{$item}' or $feature == 'max-#{$item}' { 83 | @return true; 84 | } 85 | } 86 | @else if $feature == $item { 87 | @return true; 88 | } 89 | } 90 | @return false; 91 | } 92 | 93 | ////////////////////////////// 94 | // Returns whether the feature is a media type 95 | ////////////////////////////// 96 | $breakpoint-media-types: 'all', 97 | 'braille', 98 | 'embossed', 99 | 'handheld', 100 | 'print', 101 | 'projection', 102 | 'screen', 103 | 'speech', 104 | 'tty', 105 | 'tv'; 106 | 107 | @function breakpoint-is-media($feature) { 108 | @each $media in $breakpoint-media-types { 109 | @if ($feature == $media) or ($feature == 'not #{$media}') or ($feature == 'only #{$media}') { 110 | @return true; 111 | } 112 | } 113 | 114 | @return false; 115 | } 116 | 117 | ////////////////////////////// 118 | // Returns whether the feature can stand alone 119 | ////////////////////////////// 120 | $breakpoint-single-string-features: 'color', 121 | 'color-index', 122 | 'grid', 123 | 'monochrome'; 124 | 125 | @function breakpoint-single-string($feature) { 126 | @each $item in $breakpoint-single-string-features { 127 | @if $feature == $item { 128 | @return true; 129 | } 130 | } 131 | @return false; 132 | } 133 | 134 | ////////////////////////////// 135 | // Returns whether the feature 136 | ////////////////////////////// 137 | @function breakpoint-is-resolution($feature) { 138 | $resolutions: 'device-pixel-ratio', 'dpr'; 139 | 140 | @if breakpoint-get('transform resolutions') { 141 | $resolutions: append($resolutions, 'resolution'); 142 | } 143 | 144 | @each $reso in $resolutions { 145 | @if index($feature, $reso) or index($feature, 'min-#{$reso}') or index($feature, 'max-#{$reso}') { 146 | @return true; 147 | } 148 | } 149 | 150 | @return false; 151 | } 152 | -------------------------------------------------------------------------------- /_sass/minimal-mistakes/vendor/susy/susy/_parse.scss: -------------------------------------------------------------------------------- 1 | /// Shorthand Syntax Parser 2 | /// ======================= 3 | /// The syntax parser converts [shorthand syntax][short] 4 | /// into a map of settings that can be compared/merged with 5 | /// other config maps and global setting. 6 | /// 7 | /// [short]: b-api.html 8 | /// 9 | /// @group x-parser 10 | 11 | 12 | 13 | // Parse 14 | // ----- 15 | /// The `parse` function provides all the syntax-sugar in Susy, 16 | /// converting user shorthand 17 | /// into a usable map of keys and values 18 | /// that can be normalized and passed to Su. 19 | /// 20 | /// @group x-parser 21 | /// @see $susy 22 | /// 23 | /// @param {list} $shorthand - 24 | /// Shorthand expression to define the width of the span, 25 | /// optionally containing: 26 | /// - a count, length, or column-list span; 27 | /// - `at $n`, `first`, or `last` location on asymmetrical grids; 28 | /// - `narrow`, `wide`, or `wider` for optionally spreading 29 | /// across adjacent gutters; 30 | /// - `of $n ` for available grid columns 31 | /// and spread of the container 32 | /// (span counts like `of 6` are only valid 33 | /// in the context of symmetrical grids); 34 | /// - and `set-gutters $n` to override global gutter settings 35 | /// @param {bool} $context-only [false] - 36 | /// Allow the parser to ignore span and span-spread values, 37 | /// only parsing context and container-spread. 38 | /// This makes it possible to accept spanless values, 39 | /// like the `gutters()` syntax. 40 | /// When parsing context-only, 41 | /// the `of` indicator is optional. 42 | /// 43 | /// @return {map} - 44 | /// Map of span and grid settings 45 | /// parsed from shorthand input – 46 | /// including all the properties available globally – 47 | /// `columns`, `gutters`, `spread`, `container-spread` – 48 | /// along with the span-specific properties 49 | /// `span`, and `location`. 50 | /// 51 | /// @throw 52 | /// when a shorthand value is not recognized 53 | @function susy-parse( 54 | $shorthand, 55 | $context-only: false 56 | ) { 57 | $parse-error: 'Unknown shorthand property:'; 58 | $options: ( 59 | 'first': 'location', 60 | 'last': 'location', 61 | 'alpha': 'location', 62 | 'omega': 'location', 63 | 'narrow': 'spread', 64 | 'wide': 'spread', 65 | 'wider': 'spread', 66 | ); 67 | 68 | $return: (); 69 | $span: null; 70 | $columns: null; 71 | 72 | $of: null; 73 | $next: false; 74 | 75 | // Allow context-only shorthand, without span 76 | @if ($context-only) and (not index($shorthand, 'of')) { 77 | @if su-valid-columns($shorthand, 'fail-silent') { 78 | $shorthand: 'of' $shorthand; 79 | } @else { 80 | $shorthand: join('of', $shorthand); 81 | } 82 | } 83 | 84 | // loop through the shorthand list 85 | @for $i from 1 through length($shorthand) { 86 | $item: nth($shorthand, $i); 87 | $type: type-of($item); 88 | $error: false; 89 | $details: '[#{$type}] `#{$item}`'; 90 | 91 | // if we know what's supposed to be coming next… 92 | @if $next { 93 | 94 | // Add to the return map 95 | $return: map-merge($return, ($next: $item)); 96 | 97 | // Reset next to `false` 98 | $next: false; 99 | 100 | } @else { // If we don't know what's supposed to be coming… 101 | 102 | // Keywords… 103 | @if ($type == 'string') { 104 | // Check the map for keywords… 105 | @if map-has-key($options, $item) { 106 | $setting: map-get($options, $item); 107 | 108 | // Spread could be on the span or the container… 109 | @if ($setting == 'spread') and ($of) { 110 | $return: map-merge($return, ('container-spread': $item)); 111 | } @else { 112 | $return: map-merge($return, ($setting: $item)); 113 | } 114 | 115 | } @else if ($item == 'all') { 116 | // `All` is a span shortcut 117 | $span: 'all'; 118 | } @else if ($item == 'at') { 119 | // Some keywords setup what's next… 120 | $next: 'location'; 121 | } @else if ($item == 'set-gutters') { 122 | $next: 'gutters'; 123 | } @else if ($item == 'of') { 124 | $of: true; 125 | } @else { 126 | $error: true; 127 | } 128 | 129 | } @else if ($type == 'number') or ($type == 'list') { // Numbers & lists… 130 | 131 | @if not ($span or $of) { 132 | // We don't have a span, and we're not expecting context… 133 | $span: $item; 134 | } @else if ($of) and (not $columns) { 135 | // We are expecting context… 136 | $columns: $item; 137 | } @else { 138 | $error: true; 139 | } 140 | 141 | } @else { 142 | $error: true; 143 | } 144 | } 145 | 146 | @if $error { 147 | @return _susy-error('#{$parse-error} #{$details}', 'susy-parse'); 148 | } 149 | } 150 | 151 | // If we have span, merge it in 152 | @if $span { 153 | $return: map-merge($return, ('span': $span)); 154 | } 155 | 156 | // If we have columns, merge them in 157 | @if $columns { 158 | $return: map-merge($return, ('columns': $columns)); 159 | } 160 | 161 | // Return the map of settings… 162 | @return $return; 163 | } 164 | --------------------------------------------------------------------------------