From 027a587f840b908f14b9a5c81e6ac996eade2ff8 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Sun, 21 Jan 2024 01:36:04 +0000 Subject: [PATCH] Deploy achaayb/cheri.dev to achaayb/cheri.dev:gh-pages --- 404.html | 102 ++++++++++++++++ CNAME | 1 + about/index.html | 200 ++++++++++++++++++++++++++++++++ blog/index.html | 179 ++++++++++++++++++++++++++++ giscus_dark.css | 1 + giscus_light.css | 1 + icon/alert.svg | 1 + icon/arrow-up.svg | 1 + icon/backlink.svg | 1 + icon/check.svg | 1 + icon/copy.svg | 1 + icon/email.svg | 1 + icon/fingerprint.svg | 1 + icon/github.svg | 1 + icon/important.svg | 1 + icon/linkedin.svg | 12 ++ icon/moon.svg | 1 + icon/note.svg | 1 + icon/question.svg | 1 + icon/rss.svg | 1 + icon/sun.svg | 1 + icon/tip.svg | 1 + icon/toc.svg | 1 + icon/twitter.svg | 1 + icon/warning.svg | 1 + img/achaayb.jpeg | Bin 0 -> 19199 bytes index.html | 169 +++++++++++++++++++++++++++ js/lightense.min.js | 2 + js/main.js | 252 ++++++++++++++++++++++++++++++++++++++++ main.css | 1 + projects/data.toml | 35 ++++++ projects/index.html | 269 +++++++++++++++++++++++++++++++++++++++++++ robots.txt | 4 + sitemap.xml | 21 ++++ 34 files changed, 1267 insertions(+) create mode 100644 404.html create mode 100644 CNAME create mode 100644 about/index.html create mode 100644 blog/index.html create mode 100644 giscus_dark.css create mode 100644 giscus_light.css create mode 100644 icon/alert.svg create mode 100644 icon/arrow-up.svg create mode 100644 icon/backlink.svg create mode 100644 icon/check.svg create mode 100644 icon/copy.svg create mode 100644 icon/email.svg create mode 100644 icon/fingerprint.svg create mode 100644 icon/github.svg create mode 100644 icon/important.svg create mode 100644 icon/linkedin.svg create mode 100644 icon/moon.svg create mode 100644 icon/note.svg create mode 100644 icon/question.svg create mode 100644 icon/rss.svg create mode 100644 icon/sun.svg create mode 100644 icon/tip.svg create mode 100644 icon/toc.svg create mode 100644 icon/twitter.svg create mode 100644 icon/warning.svg create mode 100644 img/achaayb.jpeg create mode 100644 index.html create mode 100644 js/lightense.min.js create mode 100644 js/main.js create mode 100644 main.css create mode 100644 projects/data.toml create mode 100644 projects/index.html create mode 100644 robots.txt create mode 100644 sitemap.xml diff --git a/404.html b/404.html new file mode 100644 index 0000000..7e8ad6e --- /dev/null +++ b/404.html @@ -0,0 +1,102 @@ + + + + + + + + + + 404 + + + + + + + + + + + + + + +
+
+
404
+
+
Not Found
+
+ « back to home » +
+ + + + + + diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..1a78620 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +cheri.dev \ No newline at end of file diff --git a/about/index.html b/about/index.html new file mode 100644 index 0000000..a5984b6 --- /dev/null +++ b/about/index.html @@ -0,0 +1,200 @@ + + + + + + + + + + + + About me + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + +
+
+
+ + + +
+
+
+ + + +
+

Introduction

+

Hi, I'm Ali. a self-taught Backend/DevOps engineer with experience in cybersecurity I've designed complex solutions in partnership with multiple businesses. My main language is Python, however I'm not very interested in working on typical CRUD applications. I do best in demanding situations that force me to step outside of my comfort zone.

+

What i bring to the table

+

Python enthusiast with a deep understanding of its internals. +My expertise lies in architecting intricate solutions, where I bring both creativity and technical knowledge to the table. +As a proficient DevOps practitioner, I not only excel in development but also offer top-notch monitoring, visibility, and performance optimization for all my projects. +Comfortable with the agile approach, I ensure that the projects I undertake are not only well-architected but also agile in their execution.

+

Companies i have worked with

+ +

I have also partnered with various companies as an independent freelancer.

+ +
+ + + +
+ +
+ + +
+
+
+ + + + + + + + + diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000..12b79b5 --- /dev/null +++ b/blog/index.html @@ -0,0 +1,179 @@ + + + + + + + + + + + + My Blog + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+
+ + + +
+
+ + +
+
+ + + + + + diff --git a/giscus_dark.css b/giscus_dark.css new file mode 100644 index 0000000..30fb809 --- /dev/null +++ b/giscus_dark.css @@ -0,0 +1 @@ +main{--primary-default: 88, 113, 162;--bg-default: 22, 22, 24;--color-prettylights-syntax-comment: #8b949e;--color-prettylights-syntax-constant: #79c0ff;--color-prettylights-syntax-entity: #d2a8ff;--color-prettylights-syntax-storage-modifier-import: #c9d1d9;--color-prettylights-syntax-entity-tag: #7ee787;--color-prettylights-syntax-keyword: #ff7b72;--color-prettylights-syntax-string: #a5d6ff;--color-prettylights-syntax-variable: #ffa657;--color-prettylights-syntax-brackethighlighter-unmatched: #f85149;--color-prettylights-syntax-invalid-illegal-text: #f0f6fc;--color-prettylights-syntax-invalid-illegal-bg: #8e1519;--color-prettylights-syntax-carriage-return-text: #f0f6fc;--color-prettylights-syntax-carriage-return-bg: #b62324;--color-prettylights-syntax-string-regexp: #7ee787;--color-prettylights-syntax-markup-list: #f2cc60;--color-prettylights-syntax-markup-heading: #1f6feb;--color-prettylights-syntax-markup-italic: #c9d1d9;--color-prettylights-syntax-markup-bold: #c9d1d9;--color-prettylights-syntax-markup-deleted-text: #ffdcd7;--color-prettylights-syntax-markup-deleted-bg: #67060c;--color-prettylights-syntax-markup-inserted-text: #aff5b4;--color-prettylights-syntax-markup-inserted-bg: #033a16;--color-prettylights-syntax-markup-changed-text: #ffdfb6;--color-prettylights-syntax-markup-changed-bg: #5a1e02;--color-prettylights-syntax-markup-ignored-text: #c9d1d9;--color-prettylights-syntax-markup-ignored-bg: #1158c7;--color-prettylights-syntax-meta-diff-range: #d2a8ff;--color-prettylights-syntax-brackethighlighter-angle: #8b949e;--color-prettylights-syntax-sublimelinter-gutter-mark: #484f58;--color-prettylights-syntax-constant-other-reference-link: #a5d6ff;--color-btn-text: rgb(235 235 245 / 86%);--color-btn-bg: rgba(var(--bg-default), 1);--color-btn-border: rgba(var(--bg-default), 1);--color-btn-shadow: 0 1px 0 rgba(var(--bg-default), 1);--color-btn-inset-shadow: inset 0 1px 0 rgba(var(--bg-default), 1);--color-btn-hover-bg: rgba(var(--bg-default), 0.5);--color-btn-hover-border: rgba(var(--bg-default), 0.5);--color-btn-active-bg: rgba(var(--primary-default), 0.2);--color-btn-active-border: rgba(var(--primary-default), 1);--color-btn-selected-bg: rgba(var(--primary-default), 0.15);--color-btn-primary-text: rgb(255 255 255 / 100%);--color-btn-primary-bg: rgba(var(--primary-default), 0.45);--color-btn-primary-border: rgba(var(--primary-default), 0.5);--color-btn-primary-shadow: 0 1px 0 rgb(27 31 36 / 10%);--color-btn-primary-inset-shadow: inset 0 1px 0 hsl(0deg 0% 100% / 3%);--color-btn-primary-hover-bg: rgba(var(--primary-default), 0.53);--color-btn-primary-hover-border: rgba(var(--primary-default), 0.75);--color-btn-primary-selected-bg: rgba(var(--primary-default), 0.45);--color-btn-primary-selected-shadow: inset 0 1px 0 rgb(0 45 17 / 20%);--color-btn-primary-disabled-text: rgb(255 255 255 / 80%);--color-btn-primary-disabled-bg: rgba(var(--primary-default), 0.5);--color-btn-primary-disabled-border: rgba(var(--primary-default), 0.5);--color-action-list-item-default-hover-bg: rgb(177 186 196 / 12%);--color-segmented-control-bg: rgb(110 118 129 / 10%);--color-segmented-control-button-bg: #0d1117;--color-segmented-control-button-selected-border: rgba(var(--bg-default), 0.85);--color-fg-default: rgb(235 235 245 / 86%);--color-fg-muted: rgb(235 235 245 / 60%);--color-fg-subtle: rgb(235 235 245 / 50%);--color-canvas-default: rgb(30 30 32 / 100%);--color-canvas-overlay: rgb(30 30 32 / 100%);--color-canvas-inset: rgba(var(--bg-default), 0.85);--color-canvas-subtle: rgba(var(--bg-default), 1);--color-border-default: rgba(var(--bg-default), 0.85);--color-border-muted: rgb(175 184 193 / 20%);--color-neutral-muted: rgb(175 184 193 / 20%);--color-accent-fg: rgba(var(--primary-default), 0.85);--color-accent-emphasis: rgba(var(--primary-default), 0.95);--color-accent-muted: rgba(var(--primary-default), 0.4);--color-accent-subtle: rgba(var(--primary-default), 0.1);--color-success-fg: #3fb950;--color-attention-fg: #d29922;--color-attention-muted: rgb(187 128 9 / 40%);--color-attention-subtle: rgb(187 128 9 / 15%);--color-danger-fg: #f85149;--color-danger-muted: rgb(248 81 73 / 40%);--color-danger-subtle: rgb(248 81 73 / 10%);--color-primer-shadow-inset: 0 1px 0 rgba(var(--bg-default), 1), inset 0 1px 0 rgba(var(--bg-default), 1);--color-scale-gray-7: rgb(22 22 24 / 100%);--color-scale-blue-8: rgb(16 185 129 / 15%);/*! Extensions from @primer/css/alerts/flash.scss */--color-social-reaction-bg-hover: var(--color-scale-gray-7);--color-social-reaction-bg-reacted-hover: var(--color-scale-blue-8)}main .pagination-loader-container{background-image:url("https://github.com/images/modules/pulls/progressive-disclosure-line-dark.svg")}main .gsc-loading-image{background-image:url("https://github.githubassets.com/images/mona-loading-dark.gif")}.gsc-comment-box-buttons a{border-radius:.25rem !important} \ No newline at end of file diff --git a/giscus_light.css b/giscus_light.css new file mode 100644 index 0000000..7b4aa98 --- /dev/null +++ b/giscus_light.css @@ -0,0 +1 @@ +main{--primary-default: 88, 113, 162;--bg-default: 246, 246, 247;--color-prettylights-syntax-comment: #6e7781;--color-prettylights-syntax-constant: #0550ae;--color-prettylights-syntax-entity: #8250df;--color-prettylights-syntax-storage-modifier-import: #24292f;--color-prettylights-syntax-entity-tag: #116329;--color-prettylights-syntax-keyword: #cf222e;--color-prettylights-syntax-string: #0a3069;--color-prettylights-syntax-variable: #953800;--color-prettylights-syntax-brackethighlighter-unmatched: #82071e;--color-prettylights-syntax-invalid-illegal-text: #f6f8fa;--color-prettylights-syntax-invalid-illegal-bg: #82071e;--color-prettylights-syntax-carriage-return-text: #f6f8fa;--color-prettylights-syntax-carriage-return-bg: #cf222e;--color-prettylights-syntax-string-regexp: #116329;--color-prettylights-syntax-markup-list: #3b2300;--color-prettylights-syntax-markup-heading: #0550ae;--color-prettylights-syntax-markup-italic: #24292f;--color-prettylights-syntax-markup-bold: #24292f;--color-prettylights-syntax-markup-deleted-text: #82071e;--color-prettylights-syntax-markup-deleted-bg: #ffebe9;--color-prettylights-syntax-markup-inserted-text: #116329;--color-prettylights-syntax-markup-inserted-bg: #dafbe1;--color-prettylights-syntax-markup-changed-text: #953800;--color-prettylights-syntax-markup-changed-bg: #ffd8b5;--color-prettylights-syntax-markup-ignored-text: #eaeef2;--color-prettylights-syntax-markup-ignored-bg: #0550ae;--color-prettylights-syntax-meta-diff-range: #8250df;--color-prettylights-syntax-brackethighlighter-angle: #57606a;--color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f;--color-prettylights-syntax-constant-other-reference-link: #0a3069;--color-btn-text: #24292f;--color-btn-bg: rgba(var(--bg-default), 1);--color-btn-border: rgba(var(--bg-default), 1);--color-btn-shadow: 0 1px 0 rgba(var(--bg-default), 1);--color-btn-inset-shadow: inset 0 1px 0 rgba(var(--bg-default), 1);--color-btn-hover-bg: rgba(var(--bg-default), 0.5);--color-btn-hover-border: rgba(var(--bg-default), 0.5);--color-btn-active-bg: rgba(var(--primary-default), 0.2);--color-btn-active-border: rgba(var(--primary-default), 1);--color-btn-selected-bg: rgba(var(--primary-default), 0.15);--color-btn-primary-text: rgb(255 255 255 / 100%);--color-btn-primary-bg: rgba(var(--primary-default), 1);--color-btn-primary-border: rgba(var(--primary-default), 1);--color-btn-primary-shadow: 0 1px 0 rgb(31 35 40 / 10%);--color-btn-primary-inset-shadow: inset 0 1px 0 rgb(255 255 255 / 3%);--color-btn-primary-hover-bg: rgba(var(--primary-default), 0.9);--color-btn-primary-hover-border: rgba(var(--primary-default), 0.75);--color-btn-primary-selected-bg: rgba(var(--primary-default), 1);--color-btn-primary-selected-shadow: inset 0 1px 0 rgb(0 45 17 / 20%);--color-btn-primary-disabled-text: rgb(255 255 255 / 80%);--color-btn-primary-disabled-bg: rgba(var(--primary-default), 0.5);--color-btn-primary-disabled-border: rgba(var(--primary-default), 0.5);--color-action-list-item-default-hover-bg: rgb(208 215 222 / 32%);--color-segmented-control-bg: #eaeef2;--color-segmented-control-button-bg: #fff;--color-segmented-control-button-selected-border: rgba(var(--bg-default), 0.85);--color-fg-default: rgb(60 60 67);--color-fg-muted: rgb(60 60 67 / 75%);--color-fg-subtle: rgb(60 60 67 / 33%);--color-canvas-default: rgb(255 255 255);--color-canvas-overlay: rgb(255 255 255);--color-canvas-inset: rgba(var(--bg-default), 0.85);--color-canvas-subtle: rgba(var(--bg-default), 1);--color-border-default: rgba(var(--bg-default), 0.85);--color-border-muted: rgb(175 184 193 / 20%);--color-neutral-muted: rgb(175 184 193 / 20%);--color-accent-fg: rgba(var(--primary-default), 0.85);--color-accent-emphasis: rgba(var(--primary-default), 0.95);--color-accent-muted: rgba(var(--primary-default), 0.4);--color-accent-subtle: rgba(var(--primary-default), 0.1);--color-success-fg: #1a7f37;--color-attention-fg: #9a6700;--color-attention-muted: rgb(212 167 44 / 40%);--color-attention-subtle: #fff8c5;--color-danger-fg: #d1242f;--color-danger-muted: rgb(255 129 130 / 40%);--color-danger-subtle: #ffebe9;--color-primer-shadow-inset: 0 1px 0 rgba(var(--bg-default), 1), inset 0 1px 0 rgba(var(--bg-default), 1);--color-scale-gray-1: rgb(234 238 242 / 100%);--color-scale-blue-1: rgb(16 185 129 / 15%);/*! Extensions from @primer/css/alerts/flash.scss */--color-social-reaction-bg-hover: var(--color-scale-gray-1);--color-social-reaction-bg-reacted-hover: var(--color-scale-blue-1)}main .pagination-loader-container{background-image:url("https://github.com/images/modules/pulls/progressive-disclosure-line.svg")}main .gsc-loading-image{background-image:url("https://github.githubassets.com/images/mona-loading-default.gif")}.gsc-comment:not(.gsc-reply-box) .gsc-replies{border-radius:unset}.gsc-comment-box-buttons a{border-radius:.25rem !important} \ No newline at end of file diff --git a/icon/alert.svg b/icon/alert.svg new file mode 100644 index 0000000..0ab867b --- /dev/null +++ b/icon/alert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/arrow-up.svg b/icon/arrow-up.svg new file mode 100644 index 0000000..f210d57 --- /dev/null +++ b/icon/arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/backlink.svg b/icon/backlink.svg new file mode 100644 index 0000000..1fa5351 --- /dev/null +++ b/icon/backlink.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/check.svg b/icon/check.svg new file mode 100644 index 0000000..cf25b87 --- /dev/null +++ b/icon/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/copy.svg b/icon/copy.svg new file mode 100644 index 0000000..82eb732 --- /dev/null +++ b/icon/copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/email.svg b/icon/email.svg new file mode 100644 index 0000000..588b236 --- /dev/null +++ b/icon/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/fingerprint.svg b/icon/fingerprint.svg new file mode 100644 index 0000000..7866287 --- /dev/null +++ b/icon/fingerprint.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/github.svg b/icon/github.svg new file mode 100644 index 0000000..e78e987 --- /dev/null +++ b/icon/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/important.svg b/icon/important.svg new file mode 100644 index 0000000..d4356a4 --- /dev/null +++ b/icon/important.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/linkedin.svg b/icon/linkedin.svg new file mode 100644 index 0000000..04cc15c --- /dev/null +++ b/icon/linkedin.svg @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/icon/moon.svg b/icon/moon.svg new file mode 100644 index 0000000..b26b5d2 --- /dev/null +++ b/icon/moon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/note.svg b/icon/note.svg new file mode 100644 index 0000000..7e6118c --- /dev/null +++ b/icon/note.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/question.svg b/icon/question.svg new file mode 100644 index 0000000..9611d3a --- /dev/null +++ b/icon/question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/rss.svg b/icon/rss.svg new file mode 100644 index 0000000..3c7750f --- /dev/null +++ b/icon/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/sun.svg b/icon/sun.svg new file mode 100644 index 0000000..d166a5c --- /dev/null +++ b/icon/sun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/tip.svg b/icon/tip.svg new file mode 100644 index 0000000..36f7a57 --- /dev/null +++ b/icon/tip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/toc.svg b/icon/toc.svg new file mode 100644 index 0000000..bda321f --- /dev/null +++ b/icon/toc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/twitter.svg b/icon/twitter.svg new file mode 100644 index 0000000..2fc5f0f --- /dev/null +++ b/icon/twitter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon/warning.svg b/icon/warning.svg new file mode 100644 index 0000000..6b90b3e --- /dev/null +++ b/icon/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/achaayb.jpeg b/img/achaayb.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b267ea01a6cf086b4cb6921f37ffcddb0cc6a0a3 GIT binary patch literal 19199 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 Mit{?E+m%@V+4pVQaR2}S literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..b9f05d5 --- /dev/null +++ b/index.html @@ -0,0 +1,169 @@ + + + + + + + + + + + + Ali Chaayb - Personal Website + + + + + + + + + + + + + + + + + +
+
+
+ avatar +
+
+ Ali Chaayb + @cheridev +
+
Backend/Devops Engineer (≧⌣≦)
+
+
+ + +
+

Hi, I'm Ali. a self-taught Backend/DevOps engineer with experience in cybersecurity I've designed complex solutions in partnership with multiple businesses. My main language is Python, however I'm not very interested in working on typical CRUD applications. I do best in demanding situations that force me to step outside of my comfort zone.

+
+ +
+
+ + + + + + + + + diff --git a/js/lightense.min.js b/js/lightense.min.js new file mode 100644 index 0000000..1f979a6 --- /dev/null +++ b/js/lightense.min.js @@ -0,0 +1,2 @@ +/*! lightense-images v1.0.17 | © Tunghsiao Liu | MIT */ +!function (e, t) { "object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : "object" == typeof exports ? exports.Lightense = t() : e.Lightense = t() }(this, (function () { return e = { 352: e => { function t(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); t && (r = r.filter((function (t) { return Object.getOwnPropertyDescriptor(e, t).enumerable }))), n.push.apply(n, r) } return n } function n(e) { for (var n = 1; n < arguments.length; n++) { var i = null != arguments[n] ? arguments[n] : {}; n % 2 ? t(Object(i), !0).forEach((function (t) { r(e, t, i[t]) })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(i)) : t(Object(i)).forEach((function (t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(i, t)) })) } return e } function r(e, t, n) { return t in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e } function i(e) { return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e })(e) } var o = function () { "use strict"; var e, t = { time: 300, padding: 40, offset: 40, keyboard: !0, cubicBezier: "cubic-bezier(.2, 0, .1, 1)", background: "var(--bg-color-80, rgba(255, 255, 255, .98))", zIndex: 1e6, beforeShow: void 0, afterShow: void 0, beforeHide: void 0, afterHide: void 0 }, r = {}; function o(e) { var t = r[e]; if (t) { if ("function" != typeof t) throw "config.".concat(e, " must be a function!"); Reflect.apply(t, r, [r]) } } function a(e) { switch (i(e)) { case "undefined": throw "You need to pass an element!"; case "string": return document.querySelectorAll(e); case "object": return e } } function c(e) { var t = e.length; if (t) for (var n = 0; n < t; n++)s(e[n]); else s(e) } function s(e) { e.src && !e.classList.contains("lightense-target") && (e.classList.add("lightense-target"), e.addEventListener("click", (function (i) { if (r.keyboard && (i.metaKey || i.ctrlKey)) return window.open(e.src, "_blank"); !function (e) { if (r.target = e, r.target.classList.contains("lightense-open")) return g(); o("beforeShow"), r.scrollY = window.scrollY, function (e, t, n) { e.addEventListener(t, (function r(i) { Reflect.apply(n, this, i), e.removeEventListener(t, r) })) }(r.target, "transitionend", (function () { o("afterShow") })); var i = new Image; i.onload = function () { !function (e) { var n = e.width, i = e.height, o = window.pageYOffset || document.documentElement.scrollTop || 0, a = window.pageXOffset || document.documentElement.scrollLeft || 0, c = r.target.getBoundingClientRect(), s = n / c.width, d = window.innerWidth || document.documentElement.clientWidth || 0, l = window.innerHeight || document.documentElement.clientHeight || 0, u = r.target.getAttribute("data-lightense-padding") || r.target.getAttribute("data-padding") || r.padding, g = d > u ? d - u : d - t.padding, p = l > u ? l - u : l - t.padding, f = n / i, b = g / p; r.scaleFactor = n < g && i < p ? s : f < b ? p / i * s : g / n * s; var h = d / 2, m = o + l / 2, v = c.left + a + c.width / 2, y = c.top + o + c.height / 2; r.translateX = Math.round(h - v), r.translateY = Math.round(m - y) }(this), function () { r.target.classList.add("lightense-open"), r.wrap = document.createElement("div"), r.wrap.className = "lightense-wrap", setTimeout((function () { r.target.style.transform = "scale(" + r.scaleFactor + ")" }), 20), r.target.parentNode.insertBefore(r.wrap, r.target), r.wrap.appendChild(r.target), setTimeout((function () { r.wrap.style.transform = "translate3d(" + r.translateX + "px, " + r.translateY + "px, 0)" }), 20); var e = { cubicBezier: r.target.getAttribute("data-lightense-cubic-bezier") || r.cubicBezier, background: r.target.getAttribute("data-lightense-background") || r.target.getAttribute("data-background") || r.background, zIndex: r.target.getAttribute("data-lightense-z-index") || r.zIndex }, t = n(n({}, r), e); d("lightense-images-css-computed", "\n :root {\n --lightense-z-index: ".concat(t.zIndex - 1, ";\n --lightense-backdrop: ").concat(t.background, ";\n --lightense-duration: ").concat(t.time, "ms;\n --lightense-timing-func: ").concat(t.cubicBezier, ";\n }")), r.container.style.visibility = "visible", setTimeout((function () { r.container.style.opacity = "1" }), 20) }(), window.addEventListener("keyup", f, !1), window.addEventListener("scroll", p, !1), r.container.addEventListener("click", g, !1) }, i.src = r.target.src }(this) }), !1)) } function d(e, t) { var n = document.head || document.getElementsByTagName("head")[0]; document.getElementById(e) && document.getElementById(e).remove(); var r = document.createElement("style"); r.id = e, r.styleSheet ? r.styleSheet.cssText = t : r.appendChild(document.createTextNode(t)), n.appendChild(r) } function l() { d("lightense-images-css", "\n:root {\n --lightense-z-index: ".concat(r.zIndex - 1, ";\n --lightense-backdrop: ").concat(r.background, ";\n --lightense-duration: ").concat(r.time, "ms;\n --lightense-timing-func: ").concat(r.cubicBezier, ";\n}\n\n.lightense-backdrop {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden;\n z-index: calc(var(--lightense-z-index) - 1);\n padding: 0;\n margin: 0;\n transition: opacity var(--lightense-duration) ease;\n cursor: zoom-out;\n opacity: 0;\n background-color: var(--lightense-backdrop);\n visibility: hidden;\n}\n\n@supports (-webkit-backdrop-filter: blur(30px)) {\n .lightense-backdrop {\n background-color: var(--lightense-backdrop);\n -webkit-backdrop-filter: blur(30px);\n }\n}\n\n@supports (backdrop-filter: blur(30px)) {\n .lightense-backdrop {\n background-color: var(--lightense-backdrop);\n backdrop-filter: blur(30px);\n }\n}\n\n.lightense-wrap {\n position: relative;\n transition: transform var(--lightense-duration) var(--lightense-timing-func);\n z-index: var(--lightense-z-index);\n pointer-events: none;\n}\n\n.lightense-target {\n cursor: zoom-in;\n transition: transform var(--lightense-duration) var(--lightense-timing-func);\n pointer-events: auto;\n}\n\n.lightense-open {\n cursor: zoom-out;\n}\n\n.lightense-transitioning {\n pointer-events: none;\n}")) } function u() { null === document.querySelector(".lightense-backdrop") ? (r.container = document.createElement("div"), r.container.className = "lightense-backdrop", document.body.appendChild(r.container)) : r.container = document.querySelector(".lightense-backdrop") } function g() { o("beforeHide"), window.removeEventListener("keyup", f, !1), window.removeEventListener("scroll", p, !1), r.container.removeEventListener("click", g, !1), r.target.classList.remove("lightense-open"), r.wrap.style.transform = "", r.target.style.transform = "", r.target.classList.add("lightense-transitioning"), r.container.style.opacity = "", setTimeout((function () { o("afterHide"), r.container.style.visibility = "", r.container.style.backgroundColor = "", r.wrap.parentNode.replaceChild(r.target, r.wrap), r.target.classList.remove("lightense-transitioning") }), r.time) } function p() { Math.abs(r.scrollY - window.scrollY) >= r.offset && g() } function f(e) { e.preventDefault(), 27 === e.keyCode && g() } return function (i) { var o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; e = a(i), r = n(n({}, t), o), l(), u(), c(e) } }(); e.exports = o } }, t = {}, function n(r) { var i = t[r]; if (void 0 !== i) return i.exports; var o = t[r] = { exports: {} }; return e[r](o, o.exports, n), o.exports }(352); var e, t })); \ No newline at end of file diff --git a/js/main.js b/js/main.js new file mode 100644 index 0000000..916de42 --- /dev/null +++ b/js/main.js @@ -0,0 +1,252 @@ +function enableThemeToggle() { + const themeToggle = document.querySelector('#theme-toggle'); + const hlLink = document.querySelector('link#hl'); + const preferDark = window.matchMedia("(prefers-color-scheme: dark)"); + function toggleTheme(theme) { + if (theme == "dark") document.body.classList.add('dark'); else document.body.classList.remove('dark'); + if (hlLink) hlLink.href = `/hl-${theme}.css`; + themeToggle.innerHTML = theme == "dark" ? themeToggle.dataset.sunIcon : themeToggle.dataset.moonIcon; + sessionStorage.setItem("theme", theme); + toggleGiscusTheme(theme); + } + function toggleGiscusTheme(theme) { + const iframe = document.querySelector('iframe.giscus-frame'); + if (iframe) iframe.contentWindow.postMessage({ giscus: { setConfig: { theme: `${location.origin}/giscus_${theme}.css` } } }, 'https://giscus.app'); + } + function initGiscusTheme(evt) { + if (evt.origin !== 'https://giscus.app') return; + if (!(typeof evt.data === 'object' && evt.data.giscus)) return; + toggleGiscusTheme(sessionStorage.getItem("theme") || (preferDark.matches ? "dark" : "light")); + window.removeEventListener('message', initGiscusTheme); + } + window.addEventListener('message', initGiscusTheme); + themeToggle.addEventListener('click', () => toggleTheme(sessionStorage.getItem("theme") == "dark" ? "light" : "dark")); + preferDark.addEventListener("change", e => toggleTheme(e.matches ? "dark" : "light")); + if (!sessionStorage.getItem("theme") && preferDark.matches) toggleTheme("dark"); + if (sessionStorage.getItem("theme") == "dark") toggleTheme("dark"); +} + +function enablePrerender() { + const prerender = (a) => { + if (!a.classList.contains('instant')) return; + const script = document.createElement('script'); + script.type = 'speculationrules'; + script.textContent = JSON.stringify({ prerender: [{ source: 'list', urls: [a.href] }] }); + document.body.append(script); + a.classList.remove('instant'); + } + const prefetch = (a) => { + if (!a.classList.contains('instant')) return; + const link = document.createElement('link'); + link.rel = 'prefetch'; + link.href = a.href; + document.head.append(link); + a.classList.remove('instant'); + } + const support = HTMLScriptElement.supports && HTMLScriptElement.supports('speculationrules'); + const handle = support ? prerender : prefetch; + document.querySelectorAll('a.instant').forEach(a => { + if (a.href.endsWith(window.location.pathname)) return; + let timer; + a.addEventListener('mouseenter', () => { + timer = setTimeout(() => handle(a), 50); + }); + a.addEventListener('mouseleave', () => clearTimeout(timer)); + a.addEventListener('touchstart', () => handle(a), { passive: true }); + }); +} + +function enableNavFold() { + const nav = document.querySelector('header nav'); + if (!nav) return; + const toggler = nav.querySelector('#toggler'); + if (!toggler) return; + const foldItems = nav.querySelectorAll('.fold'); + toggler.addEventListener('click', () => { + if (window.innerWidth < 768 && [...foldItems].every(item => !item.classList.contains('shown'))) return; + foldItems.forEach(item => item.classList.toggle('shown')); + }); +} + +function enableRssMask() { + const rssBtn = document.querySelector('#rss-btn'); + const mask = document.querySelector('#rss-mask'); + const copyBtn = document.querySelector('#rss-mask button'); + if (!rssBtn || !mask) return; + rssBtn.addEventListener('click', (e) => { + e.preventDefault(); + mask.showModal(); + }); + const close = (e) => { + if (e.target == mask) mask.close(); + }; + mask.addEventListener('click', close); + const copy = () => { + navigator.clipboard.writeText(copyBtn.dataset.link).then(() => { + copyBtn.innerHTML = copyBtn.dataset.checkIcon; + copyBtn.classList.add('copied'); + copyBtn.removeEventListener('click', copy); + setTimeout(() => { + mask.close(); + copyBtn.innerHTML = copyBtn.dataset.copyIcon; + copyBtn.classList.remove('copied'); + copyBtn.addEventListener('click', copy); + }, 400); + }); + } + copyBtn.addEventListener('click', copy); +} + +function enableOutdateAlert() { + const alert = document.querySelector('#outdate_alert'); + if (!alert) return; + const publish = document.querySelector('#publish'); + const updated = document.querySelector('#updated'); + const updateDate = new Date(updated ? updated.textContent : publish.textContent); + const intervalDays = Math.floor((Date.now() - updateDate.getTime()) / (24 * 60 * 60 * 1000)); + const alertDays = parseInt(alert.dataset.days); + if (intervalDays >= alertDays) { + const msg = alert.dataset.alertTextBefore + intervalDays + alert.dataset.alertTextAfter; + alert.querySelector('.content').textContent = msg; + alert.classList.remove('hidden'); + } +} + +function enableTocToggle() { + const tocToggle = document.querySelector('#toc-toggle'); + if (!tocToggle) return; + const header = document.querySelector('header'); + const blurred = header.classList.contains('blur'); + const aside = document.querySelector('aside'); + const anchors = aside.querySelectorAll('a'); + const toggle = () => { + tocToggle.classList.toggle('active'); + aside.classList.toggle('shown'); + if (blurred) header.classList.toggle('blur'); + }; + tocToggle.addEventListener('click', toggle); + anchors.forEach(header => header.addEventListener('click', toggle)); +} + +function enableTocIndicate() { + const toc = document.querySelector('aside nav'); + if (!toc) return; + const headers = document.querySelectorAll('h2, h3'); + const tocMap = new Map(); + headers.forEach(header => tocMap.set(header, toc.querySelector(`a[href="#${header.id}"]`))); + let activated = null; + const observer = new IntersectionObserver((entries) => entries.forEach(entry => { + if (entry.isIntersecting) { + const target = tocMap.get(entry.target); + if (target == activated) return; + if (activated) activated.classList.remove('active'); + target.classList.add('active'); + activated = target; + } + }), { rootMargin: '-9% 0px -90% 0px' }); + headers.forEach(header => observer.observe(header)); +} + +function enableTocTooltip() { + const anchors = document.querySelectorAll('aside nav a'); + if (anchors.length == 0) return; + const toggleTooltip = () => { + anchors.forEach(anchor => { + if (anchor.offsetWidth < anchor.scrollWidth) { + anchor.setAttribute('title', anchor.textContent); + } else { + anchor.removeAttribute('title'); + } + }); + }; + window.addEventListener('resize', toggleTooltip); + toggleTooltip(); +} + +function addCopyBtns() { + const cfg = document.querySelector('#copy-cfg'); + if (!cfg) return; + const copyIcon = cfg.dataset.copyIcon; + const checkIcon = cfg.dataset.checkIcon; + document.querySelectorAll('pre').forEach(block => { + if (block.classList.contains('mermaid')) return; + const wrapper = document.createElement('div'); + wrapper.className = 'codeblock'; + const btn = document.createElement('button'); + btn.className = 'copy'; + btn.ariaLabel = 'copy'; + btn.innerHTML = copyIcon; + const copy = () => { + navigator.clipboard.writeText(block.textContent).then(() => { + btn.innerHTML = checkIcon; + btn.classList.add('copied'); + btn.removeEventListener('click', copy); + setTimeout(() => { + btn.innerHTML = copyIcon; + btn.classList.remove('copied'); + btn.addEventListener('click', copy); + }, 1500); + }); + }; + btn.addEventListener('click', copy); + wrapper.appendChild(block.cloneNode(true)); + wrapper.appendChild(btn); + block.replaceWith(wrapper); + }); +} + +function addBackToTopBtn() { + const backBtn = document.querySelector('#back-to-top'); + if (!backBtn) return; + const toTop = () => window.scrollTo({ top: 0, behavior: 'smooth' }); + const toggle = () => { + const scrollTop = document.documentElement.scrollTop || document.body.scrollTop; + if (scrollTop > 200 && !backBtn.classList.contains('shown')) { + backBtn.classList.add('shown'); + backBtn.addEventListener('click', toTop); + } else if (scrollTop <= 200 && backBtn.classList.contains('shown')) { + backBtn.classList.remove('shown'); + backBtn.removeEventListener('click', toTop); + } + }; + window.addEventListener('scroll', toggle); + toggle(); +} + +function addFootnoteBacklink() { + const backlinkIcon = document.querySelector('.prose').dataset.backlinkIcon; + const footnotes = document.querySelectorAll('.footnote-definition'); + footnotes.forEach(footnote => { + const backlink = document.createElement('button'); + backlink.className = 'backlink'; + backlink.ariaLabel = 'backlink'; + backlink.innerHTML = backlinkIcon; + backlink.addEventListener('click', () => window.scrollTo({ + top: document.querySelector(`.footnote-reference a[href="#${footnote.id}"]`).getBoundingClientRect().top + window.scrollY - 50, + })); + footnote.appendChild(backlink); + }); +} + +function enableImgLightense() { + window.addEventListener("load", () => Lightense(".prose img", { background: 'rgba(43, 43, 43, 0.19)' })); +} + +//-------------------------------------------- + +enableThemeToggle(); +enablePrerender(); +enableNavFold(); +enableRssMask(); +if (document.body.classList.contains('post')) { + enableOutdateAlert(); + enableTocToggle(); + enableTocIndicate(); + addBackToTopBtn(); + enableTocTooltip(); +} +if (document.querySelector('.prose')) { + addCopyBtns(); + addFootnoteBacklink(); + enableImgLightense(); +} diff --git a/main.css b/main.css new file mode 100644 index 0000000..629a73f --- /dev/null +++ b/main.css @@ -0,0 +1 @@ +*,*::before,*::after{box-sizing:border-box}body{min-height:100%;font-family:var(--main-font);background-color:var(--bg-color);color:var(--text-color)}html{scroll-behavior:smooth}button:focus-visible,a:focus-visible{outline:var(--primary-color) solid 3px}::selection{background-color:var(--primary-color);color:var(--bg-color)}body::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:rgba(0,0,0,0)}::-webkit-scrollbar-thumb{background:rgba(174,183,202,.631372549);border-radius:0px}::-webkit-scrollbar-thumb:hover{background:rgba(138,144,161,.631372549)}.prose h1{font-size:1.5em;font-weight:bolder;margin:1em 0 .5em 0}.prose h2{font-size:1.3em;padding-top:80px;margin-top:-45px}.prose h3{font-size:1.1em;padding-top:65px;margin-top:-45px}.prose h4{font-size:1.05em;margin:30px 0 15px 0}.prose .zola-anchor{visibility:hidden;margin-left:.75em;font-size:.85em}.prose h1,.prose h2,.prose h3,.prose h4,.prose h5,.prose h6{width:fit-content}.prose h1:hover a.zola-anchor,.prose h2:hover a.zola-anchor,.prose h3:hover a.zola-anchor,.prose h4:hover a.zola-anchor,.prose h5:hover a.zola-anchor,.prose h6:hover a.zola-anchor{visibility:visible !important}.prose p{font-size:1em;line-height:inherit;word-wrap:break-word}.prose a{border-bottom:1.5px solid var(--primary-color);color:var(--primary-color);text-decoration:none}.prose img{max-width:100%;display:block;margin:0 auto;border-radius:var(--img-border-radius)}.prose figure{margin:0 auto}.prose figcaption{width:100%;text-align:center;margin:5px auto}.prose blockquote{border-left:2px var(--text-pale-color) solid;padding-left:16px;margin:0 0 24px 0;color:var(--text-pale-color)}.prose li{margin:1em 0}.prose li::marker{color:var(--primary-color)}.prose hr{border:none;background-color:var(--primary-pale-color);height:3px;margin:36px 0}.prose table{width:100%;border-spacing:0;border:1px solid var(--primary-pale-color)}.prose thead{background-color:var(--primary-pale-color)}.prose th,.prose td{line-height:2;text-align:center;border:1px solid var(--primary-pale-color);padding:1px 10px}.prose p>code,.prose li>code,.prose td>code,.prose th>code{font-family:var(--code-font);font-size:.85em;padding:1px 6px;margin:0 2px;color:var(--primary-color);background-color:var(--inline-code-bg-color);border-radius:var(--inline-code-border-radius)}.prose pre{font-size:.8em;margin:1.25em 0;padding:12px 48px 12px 16px;line-height:1.5;border:1.5px solid var(--primary-color);border-color:var(--block-code-border-color);border-radius:var(--block-code-border-radius);overflow:auto}.prose pre code{font-family:var(--code-font)}.prose pre[data-linenos]{padding:12px 48px 12px 8px}.prose pre table{width:100%;border-collapse:collapse;border:none}.prose pre table th,.prose pre table td{line-height:1.5}.prose pre table tr td:first-of-type{color:var(--text-pale-color)}.prose pre table td{padding:0;padding-right:48px;text-align:initial;border:initial}.prose pre table td:nth-of-type(1){text-align:right;user-select:none;padding-right:1em}.prose pre table td:nth-of-type(1) mark::before{left:-8px;width:calc(100% + 1em + 8px)}.prose pre mark{display:block;color:inherit;background-color:rgba(0,0,0,0);position:relative;overflow:visible}.prose pre mark::before{pointer-events:none;content:"";position:absolute;top:0;bottom:0;width:calc(100% + 48px + 48px);background-color:var(--highlight-mark-color)}.prose pre.mermaid{border:none}.prose pre>code>mark::before{width:calc(100% + 48px + 16px);left:-16px}.prose .codeblock{margin:1em 0;position:relative;overflow:auto}.prose .codeblock pre{margin:0}.prose .codeblock .copy{display:none;z-index:9;position:absolute;right:.6em;top:.6em;width:24px;height:24px;padding:2px;cursor:pointer;background:rgba(0,0,0,0);border:none;color:var(--text-pale-color)}.prose .codeblock .copy.copied,.prose .codeblock .copy:hover{display:block;color:var(--primary-color)}.prose .codeblock:hover .copy{display:block}.prose .codeblock-with-filename{margin-top:calc(0px - 1.2em - 24px - 1em - 1.5px)}.prose .codeblock-with-filename .filename{z-index:1;position:relative;top:calc(1.2em + 24px + 1em + 1.5px);padding:12px 16px;line-height:1.2;color:var(--text-pale-color);border-bottom:1.5px solid var(--primary-pale-color);pointer-events:none}.prose .codeblock-with-filename pre>code{display:inline-block;min-width:100%;margin-top:3.2em}.prose .footnote-definition{display:flex}.prose .footnote-definition .footnote-definition-label{position:static;font-size:1em;line-height:inherit;vertical-align:auto;margin-right:.5em}.prose .footnote-definition .footnote-definition-label::after{content:"."}.prose .footnote-definition p{margin:0}.prose .footnote-definition button.backlink{border:none;background:none;display:flex;align-items:center;margin-left:.5em;color:var(--primary-color);cursor:pointer}.prose .callout{line-height:inherit;margin-bottom:20px;border:1.5px solid var(--primary-color);padding:6px 12px;display:flex;gap:12px}.prose .callout .icon{height:1.75em;display:flex;align-items:center}.prose .callout .content p{margin:0}.prose .callout .content p+p{margin:.2em 0 .5em}.prose .callout.note{color:var(--callout-note-color);border-color:var(--callout-note-color)}.prose .callout.important{color:var(--callout-important-color);border-color:var(--callout-important-color)}.prose .callout.warning{color:var(--callout-warning-color);border-color:var(--callout-warning-color)}.prose .callout.alert{color:var(--callout-alert-color);border-color:var(--callout-alert-color)}.prose .callout.question{color:var(--callout-question-color);border-color:var(--callout-question-color)}.prose .callout.tip{color:var(--callout-tip-color);border-color:var(--callout-tip-color)}.prose .mermaid{background:#fff}body.prose-page main{font-size:var(--paragraph-font-size);min-height:100vh;padding-top:30px;margin:0 auto;max-width:var(--main-max-width);display:flex;flex-direction:column;justify-content:space-between}body.prose-page article{padding:30px 15px;font-size:var(--paragraph-font-size);line-height:var(--paragraph-line-height)}body.prose-page .giscus{padding:0 15px}.layout-list .category{font-size:1.1em;margin:2em 15px 1em}.layout-list .post-list{padding:0 15px;margin-top:2em}.layout-list .post-list.categorized{margin-top:1em}.layout-list .post{display:flex;justify-content:space-between;align-items:flex-end;gap:5px;padding:4px 0px;margin:8px 0;font-size:1em;text-decoration:none;color:var(--primary-color);-webkit-tap-highlight-color:rgba(0,0,0,0);border-bottom:1.5px solid rgba(0,0,0,0);position:relative}.layout-list .post:hover{border-bottom-color:var(--primary-color)}.layout-list .post .date{white-space:nowrap}.layout-list .post.featured::before{content:"*";position:absolute;top:0;bottom:0;left:0;transform:translateX(-200%);line-height:30px;height:100%}@media (max-width: 768px){.layout-list .post.featured::before{transform:translateX(-150%)}}.layout-list .read-more{display:flex;justify-content:end;margin:1.5em 15px 0px}.layout-list .read-more a{color:var(--primary-color);text-decoration:none;border-bottom:1.5px solid var(--primary-color)}body.homepage #wrapper{width:100%;min-height:100vh;display:flex;justify-content:center;align-items:center;font-size:var(--homepage-font-size)}body.homepage main{width:100%;max-width:var(--homepage-max-width);padding:4em 0}@media screen and (max-width: 425px){body.homepage main{padding:2em 0}}body.homepage #info{padding:0 15px;display:flex;gap:1em}body.homepage #info img{height:var(--avatar-size);width:var(--avatar-size);border-radius:50%}body.homepage #info #text{display:flex;flex-direction:column;justify-content:space-around;line-height:1.5}body.homepage #info #name,body.homepage #info #id{font-size:1.1em}body.homepage #info #id{margin-left:.5em;color:var(--primary-color)}body.homepage #info #bio{font-size:1em}body.homepage #links{padding:0 15px;margin:1em 0 1.75em;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:.5em 1em;font-size:1.1em}body.homepage #links a,body.homepage #links button{text-decoration:none;color:var(--text-color)}@media (hover: hover){body.homepage #links a:hover,body.homepage #links button:hover{color:var(--primary-color)}}body.homepage #links #left{display:flex;flex-wrap:wrap;gap:1em}body.homepage #links #left a{border-bottom:1.5px solid var(--primary-color);line-height:1.5}body.homepage #links #right{display:flex;gap:.5em;margin-left:auto}body.homepage #links #right a,body.homepage #links #right button{width:var(--icon-size);height:var(--icon-size)}body.homepage #links #right button{padding:0;border:none;background-color:rgba(0,0,0,0);cursor:pointer}@media (max-width: 425px){body.homepage #links #left{gap:.75em}}body.homepage #brief{padding:0 15px 3em;font-size:1em;line-height:var(--homepage-line-height)}@media (max-width: 425px){body.homepage #brief{padding-bottom:1.5em}}header{z-index:99;position:fixed;top:0;width:100%;height:45px;background-color:var(--bg-color);border-bottom:1.5px solid var(--primary-color)}@supports (-webkit-backdrop-filter: none) or (backdrop-filter: none){header.blur{background-color:initial;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}header #rss-mask{-webkit-backdrop-filter:blur(32px);backdrop-filter:blur(32px)}}header #header-wrapper{height:100%;max-width:var(--main-max-width);margin:0 auto;padding:0 15px;display:flex;justify-content:space-between;align-items:center;position:relative}header nav{font-size:1.35em;display:flex;align-items:center}header nav a{color:var(--text-color);text-decoration:none}header nav a:hover{color:var(--primary-color)}header nav .separator{width:24px;text-align:center;line-height:1;cursor:pointer;border:none;padding:0;background:rgba(0,0,0,0);margin:0 .1em;color:var(--text-color);-webkit-tap-highlight-color:rgba(0,0,0,0)}header nav .wrap.left{margin:0 .3em 0 -.1em}header nav .wrap.right{margin:0 0 0 .3em}header nav .wrap-separator{margin:0 .5em 0 .1em}header nav .fold{display:none}header nav .fold.shown{display:initial}header #btns{display:flex;gap:1em;align-items:center;padding-top:1.5px}header #btns a,header #btns button{width:var(--icon-size);height:var(--icon-size);border:none;background-color:rgba(0,0,0,0);padding:0;text-decoration:none;color:var(--text-color);cursor:pointer}@media (hover: hover){header #btns a:hover,header #btns button:hover{color:var(--primary-color)}}header #toc-toggle{display:none}@media (max-width: 1024px){header #toc-toggle{display:inline-block}header #toc-toggle.active{color:var(--primary-color)}}dialog#rss-mask{margin:12.5px auto;padding:0px;border:none;overflow:visible;background:rgba(0,0,0,0)}dialog#rss-mask::backdrop{background-color:initial;-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px)}dialog#rss-mask div{width:fit-content;display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:1em}dialog#rss-mask a{border-bottom:1.5px solid var(--primary-color);color:var(--primary-color);text-decoration:none;line-height:1.5;line-break:anywhere}dialog#rss-mask button{width:var(--icon-size);height:var(--icon-size);background:rgba(0,0,0,0);border:none;color:var(--text-pale-color);padding:0;cursor:pointer}dialog#rss-mask button.copied,dialog#rss-mask button:hover{color:var(--primary-color)}footer{font-size:.95em;padding:15px;display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:15px;color:var(--text-pale-color)}footer .copyright{margin-right:auto}footer .credits{margin-left:auto}footer a{color:var(--text-pale-color)}@media (max-width: 374px){footer{flex-direction:column;gap:0}footer .copyright,footer .credits{margin:0}}body.blog #wrapper{margin:0 auto;max-width:var(--main-max-width);min-height:100vh;display:flex;flex-direction:column;justify-content:space-between}body.blog main{margin:45px 0}body.post #wrapper{display:flex;justify-content:space-between;font-size:var(--paragraph-font-size)}body.post #blank{order:1;position:sticky;width:calc((100% - var(--main-max-width))/2)}body.post main{order:2;width:100%;margin:0 auto;padding-top:45px;max-width:var(--main-max-width);min-height:100vh;display:flex;flex-direction:column;justify-content:space-between}body.post article{padding:0 15px 30px;font-size:var(--paragraph-font-size);line-height:var(--paragraph-line-height)}body.post article #post-info{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;margin-bottom:1em}body.post article #date{color:var(--text-pale-color);margin-bottom:1em}body.post article #date #publish,body.post article #date #updated{margin-right:20px}body.post article #tags{margin-bottom:1em;display:flex;gap:1em;flex-wrap:wrap}body.post article #tags a{color:var(--primary-color);text-decoration:none;line-height:1.25;border-bottom:1.5px solid rgba(0,0,0,0)}body.post article #tags a span{font-size:.95em;margin-right:2px}body.post article #tags a:hover{border-bottom-color:var(--primary-color)}body.post article #outdate_alert.hidden{display:none}body.post .mermaid{background:#fff}body.post .giscus{padding:0 15px}body.post aside{order:3;width:calc((100% - var(--main-max-width))/2);position:sticky;margin-top:175px;top:60px;height:min-content;font-size:var(--aside-font-size)}body.post aside nav{padding:5px 15px 5px 2em;min-width:60%;overflow-y:auto;max-height:calc(100vh - 45px - 6em);scrollbar-width:none}body.post aside nav::-webkit-scrollbar{width:0}body.post aside nav:hover::-webkit-scrollbar{width:4px}body.post aside ul{list-style-type:none;padding:0;line-height:2;margin:0}body.post aside a{text-decoration:none;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-pale-color);position:relative;padding:0 1em}body.post aside a.h3{padding-left:2.5em;font-size:.95em}body.post aside a::before{display:block;content:"";width:2px;position:absolute;top:.6em;bottom:.7em;left:0em;background:rgba(0,0,0,0)}body.post aside a:hover,body.post aside a.active{color:var(--primary-color)}body.post aside a:hover::before{background-color:var(--primary-color)}body.post aside #back-to-top{z-index:99;height:28px;padding:0;position:fixed;bottom:1.5em;margin-left:3em;color:var(--text-pale-color);background:rgba(0,0,0,0);border:none;cursor:pointer;transform:translateY(-5px) scale(0);transition:transform .2s}body.post aside #back-to-top svg{width:28px;height:28px}body.post aside #back-to-top.shown{transform:translateY(0px) scale(1)}body.post aside #back-to-top:hover{color:var(--primary-color)}@media screen and (max-width: 1024px){body.post aside{position:fixed;z-index:99;right:-100%;top:45px;margin-top:0;min-width:275px;height:100%;background-color:var(--bg-color);box-shadow:rgba(0,0,0,.08) -2px 8px 8px 0px}body.post aside.shown{right:0}body.post aside nav{padding:1em .75em;max-height:calc(100vh - 45px)}body.post aside #back-to-top{display:none}body.post #blank{display:none}body.post main{margin:0 auto}}body.tag-list #wrapper{margin:0 auto;max-width:var(--main-max-width);min-height:100vh;display:flex;flex-direction:column;justify-content:space-between}body.tag-list main{margin:85px auto 60px}body.tag-list .title{width:min-content;font-size:1.3em;margin:0 auto}body.tag-list .tags{margin-top:2em;display:flex;justify-content:center;align-items:center;flex-wrap:wrap;font-size:1.1em}body.tag-list .tags a{color:var(--primary-color);text-decoration:none;margin:1em;line-height:1.25;border-bottom:1.5px solid rgba(0,0,0,0)}body.tag-list .tags a:hover{border-bottom-color:var(--primary-color)}body.tag-single #wrapper{margin:0 auto;max-width:var(--main-max-width);min-height:100vh;display:flex;flex-direction:column;justify-content:space-between}body.tag-single main{width:100%;margin:85px auto 60px}body.tag-single .title{width:min-content;white-space:nowrap;color:var(--text-color);font-size:1.3em;margin:0 auto;margin-bottom:40px;padding:0 0 0 60px}body.tag-single .title a{margin-left:30px;font-size:.7em;color:var(--primary-color)}body.projects #wrapper{margin:0 auto;max-width:var(--main-max-width);min-height:100vh;display:flex;flex-direction:column;justify-content:space-between}body.projects main{width:100%;margin:75px auto 0px}body.projects .proj{margin:0px 15px 45px}body.projects .proj .content{display:flex;justify-content:space-between;gap:1em}body.projects .proj .content img{max-height:125px;margin-bottom:1em}@media screen and (max-width: 425px){body.projects .proj .content img{max-height:100px}}body.projects .proj .name{font-size:1.2em;margin:0 0 15px 0;color:var(--primary-color)}body.projects .proj .desc{line-height:1.5;margin:0 0 10px 0}body.projects .proj .desc a{border-bottom:1.5px solid var(--primary-color);color:var(--primary-color);text-decoration:none}body.projects .proj .desc p>code{font-family:var(--code-font);font-size:.8em;padding:1px 6px;color:var(--primary-color);background-color:var(--primary-pale-color);border-radius:4px}body.projects .proj .more{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:1em}body.projects .proj .more .tags{display:flex;gap:.5em 1em;flex-wrap:wrap}body.projects .proj .more .tags div{color:var(--text-pale-color)}body.projects .proj .more .tags div span{font-size:.9em;margin-right:1.5px}body.projects .proj .more .links{margin-left:auto;display:flex;justify-content:end;gap:.5em 1em}body.projects .proj .more .links a{text-decoration:none;border-bottom:1.5px solid var(--primary-color);padding:0 2px;cursor:pointer;color:inherit;line-height:1.5}body.projects .proj .more .links a:visited{color:inherit}body.projects .proj .more .links a:hover{color:var(--primary-color)}body.not-found{height:100vh;height:100dvh;display:flex;justify-content:center;align-items:center}body.not-found .wrapper{display:flex;flex-direction:column;align-items:center;gap:3em}body.not-found .error{display:flex;align-items:center;font-size:1.25em;color:var(--text-pale-color)}body.not-found .spacer{background:var(--text-pale-color);width:2px;height:.75em;margin:0 .75em}body.not-found a{color:var(--primary-color);text-decoration-color:var(--primary-pale-color)}body.not-found a:hover,body.not-found a:active{text-decoration-color:var(--primary-color)}html{line-height:1.15;-webkit-text-size-adjust:100%;text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:rgba(0,0,0,0)}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none} \ No newline at end of file diff --git a/projects/data.toml b/projects/data.toml new file mode 100644 index 0000000..c6babbc --- /dev/null +++ b/projects/data.toml @@ -0,0 +1,35 @@ +[[project]] +name = "CommandCenter" +desc = "Building a robust architecture and backend for the command center project, dealing with large amounts of data and complex computations while maintaining performance, scalability and high availabilty" +tags = ["Backend", "Systems design ", "DataScience", "DevOps"] +img = "" +links = [ + { name = "LHP Europe", url = "https://lhpeurope.com" } +] + +[[project]] +name = "CoreAPI" +desc = "Core is a high-performance lightweight framework for building API's in python with no extra dependencies based on the ASGI specification, allowing async endpoints to be handled in the main event loop as well as synchronous ones being handled in a thread pool." +tags = ["OpenSource"] +img = "" +links = [ + { name = "Github", url = "https://github.com/achaayb/CoreAPI" } +] + +[[project]] +name = "SecDojo" +desc = "Build the Engine behind sec-dojo.com, a Cyber-range platform based on Cloud and Infra-As-Code technologies to offer an integrated environment for cybersecurity training" +tags = ["Backend", "Cloud", "DevOps"] +img = "" +links = [ + { name = "Platform", url = "https://sec-dojo.com" } +] + +[[project]] +name = "FlowSiti" +desc = "As the lead developer on the FlowSiti project, I've been driving the development of an AI-powered Salesforce builder. This system takes a business overview as a prompt and automatically translates it into a comprehensive flow chart. Once saved, you can apply those changes directly to your Salesforce organization. " +tags = ["Backend", "Ai", "Salesforce"] +img = "" +links = [ + { name = "FlowSiti", url = "https://www.flowsiti.ai" } +] \ No newline at end of file diff --git a/projects/index.html b/projects/index.html new file mode 100644 index 0000000..aa53f3f --- /dev/null +++ b/projects/index.html @@ -0,0 +1,269 @@ + + + + + + + + + + + + My Projects + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + +
+
+
+ + + +
+
+ + +
+
+
+

CommandCenter

+

Building a robust architecture and backend for the command center project, dealing with large amounts of data and complex computations while maintaining performance, scalability and high availabilty

+
+
+ +
+
+
+ +
#Backend
+ +
#Systems design
+ +
#DataScience
+ +
#DevOps
+ +
+ +
+
+ +
+
+
+

CoreAPI

+

Core is a high-performance lightweight framework for building API's in python with no extra dependencies based on the ASGI specification, allowing async endpoints to be handled in the main event loop as well as synchronous ones being handled in a thread pool.

+
+
+ +
+
+
+ +
#OpenSource
+ +
+ +
+
+ +
+
+
+

SecDojo

+

Build the Engine behind sec-dojo.com, a Cyber-range platform based on Cloud and Infra-As-Code technologies to offer an integrated environment for cybersecurity training

+
+
+ +
+
+
+ +
#Backend
+ +
#Cloud
+ +
#DevOps
+ +
+ +
+
+ +
+
+
+

FlowSiti

+

As the lead developer on the FlowSiti project, I've been driving the development of an AI-powered Salesforce builder. This system takes a business overview as a prompt and automatically translates it into a comprehensive flow chart. Once saved, you can apply those changes directly to your Salesforce organization.

+
+
+ +
+
+
+ +
#Backend
+ +
#Ai
+ +
#Salesforce
+ +
+ +
+
+ +
+
+ + +
+ + + + + + diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..cf1a93d --- /dev/null +++ b/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Disallow: +Allow: / +Sitemap: https://cheri.dev/sitemap.xml diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..2cad888 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,21 @@ + + + + https://cheri.dev/ + + + https://cheri.dev/about/ + + + https://cheri.dev/blog/ + + + https://cheri.dev/categories/ + + + https://cheri.dev/projects/ + + + https://cheri.dev/tags/ + +