From 11e4e6188fb31aea21e09d202e85468cd940fa35 Mon Sep 17 00:00:00 2001 From: Muhammad Nauman Raza Date: Sun, 28 Jan 2024 20:03:50 +0000 Subject: [PATCH] chore: new license and therefore git history --- .gitmodules | 4 + LICENSE.md | 22 + config.toml | 87 + content/_index.md | 20 + content/blog/_index.md | 12 + content/blog/hoaxes-overview.md | 41 + content/blog/nfc-misconceptions.md | 69 + content/blog/selfhost-search-engine.md | 109 ++ content/blog/selfhost-tailscale.md | 98 ++ content/blog/setting-up-zola-nixos.md | 95 ++ content/projects/_index.md | 8 + content/projects/data.toml | 39 + highlight_themes/serene-dark.tmTheme | 287 ++++ highlight_themes/serene-light.tmTheme | 252 +++ public/404.html | 1 + public/blog/feed.xml | 350 ++++ public/blog/hoaxes-overview/index.html | 1 + public/blog/index.html | 1 + public/blog/nfc-misconceptions/index.html | 1 + public/blog/selfhost-search-engine/index.html | 36 + public/blog/selfhost-tailscale/index.html | 34 + public/blog/setting-up-zola-nixos/index.html | 30 + public/categories/cybersecurity/index.html | 0 public/categories/guides/index.html | 0 public/categories/index.html | 0 public/giscus_dark.css | 1 + public/giscus_light.css | 1 + public/hl-dark.css | 74 + public/hl-light.css | 64 + public/icon/alert.svg | 1 + public/icon/arrow-up.svg | 1 + public/icon/backlink.svg | 1 + public/icon/check.svg | 1 + public/icon/copy.svg | 1 + public/icon/email.svg | 1 + public/icon/fingerprint.svg | 1 + public/icon/github.svg | 1 + public/icon/important.svg | 1 + public/icon/moon.svg | 1 + public/icon/note.svg | 1 + public/icon/question.svg | 1 + public/icon/rss.svg | 1 + public/icon/sun.svg | 1 + public/icon/tip.svg | 1 + public/icon/toc.svg | 1 + public/icon/twitter.svg | 1 + public/icon/warning.svg | 1 + public/img/avatar.webp | Bin 0 -> 25616 bytes public/index.html | 1 + public/js/lightense.min.js | 2 + public/js/main.js | 166 ++ public/main.css | 1 + public/projects/data.toml | 39 + public/projects/index.html | 1 + public/robots.txt | 4 + public/sitemap.xml | 77 + public/tags/hacking/index.html | 3 + public/tags/headscale/index.html | 3 + public/tags/hoax/index.html | 3 + public/tags/index.html | 3 + public/tags/nfc/index.html | 3 + public/tags/nixos/index.html | 3 + public/tags/privacy/index.html | 3 + public/tags/searxng/index.html | 3 + public/tags/selfhosted/index.html | 3 + public/tags/social-engineering/index.html | 3 + public/tags/tailscale/index.html | 3 + public/tags/zola/index.html | 3 + static/hl-dark.css | 74 + static/hl-light.css | 64 + static/icon/alert.svg | 1 + static/icon/arrow-up.svg | 1 + static/icon/backlink.svg | 1 + static/icon/check.svg | 1 + static/icon/copy.svg | 1 + static/icon/email.svg | 1 + static/icon/fingerprint.svg | 1 + static/icon/github.svg | 1 + static/icon/important.svg | 1 + static/icon/moon.svg | 1 + static/icon/note.svg | 1 + static/icon/question.svg | 1 + static/icon/rss.svg | 1 + static/icon/sun.svg | 1 + static/icon/tip.svg | 1 + static/icon/toc.svg | 1 + static/icon/twitter.svg | 1 + static/icon/warning.svg | 1 + static/img/avatar.webp | Bin 0 -> 25616 bytes templates/_custom_css.html | 51 + themes/serene/.gitignore | 14 + themes/serene/CHANGELOG.md | 133 ++ themes/serene/LICENSE | 21 + themes/serene/README.md | 31 + themes/serene/USAGE-zh_CN.md | 379 +++++ themes/serene/USAGE.md | 378 +++++ themes/serene/config.example.toml | 90 ++ .../highlight_themes/serene-dark.tmTheme | 287 ++++ .../highlight_themes/serene-light.tmTheme | 252 +++ themes/serene/sass/giscus_dark.scss | 100 ++ themes/serene/sass/giscus_light.scss | 104 ++ themes/serene/sass/main.scss | 1410 +++++++++++++++++ themes/serene/screenshot.png | Bin 0 -> 365996 bytes themes/serene/static/icon/alert.svg | 1 + themes/serene/static/icon/arrow-up.svg | 1 + themes/serene/static/icon/backlink.svg | 1 + themes/serene/static/icon/check.svg | 1 + themes/serene/static/icon/copy.svg | 1 + themes/serene/static/icon/email.svg | 1 + themes/serene/static/icon/fingerprint.svg | 1 + themes/serene/static/icon/github.svg | 1 + themes/serene/static/icon/important.svg | 1 + themes/serene/static/icon/moon.svg | 1 + themes/serene/static/icon/note.svg | 1 + themes/serene/static/icon/question.svg | 1 + themes/serene/static/icon/rss.svg | 1 + themes/serene/static/icon/sun.svg | 1 + themes/serene/static/icon/tip.svg | 1 + themes/serene/static/icon/toc.svg | 1 + themes/serene/static/icon/twitter.svg | 1 + themes/serene/static/icon/warning.svg | 1 + themes/serene/static/js/lightense.min.js | 2 + themes/serene/static/js/main.js | 166 ++ themes/serene/templates/404.html | 16 + themes/serene/templates/_base.html | 28 + themes/serene/templates/_custom_css.html | 51 + themes/serene/templates/_custom_font.html | 3 + themes/serene/templates/_footer.html | 13 + themes/serene/templates/_giscus_script.html | 0 themes/serene/templates/_head_extend.html | 0 themes/serene/templates/_header.html | 66 + themes/serene/templates/anchor-link.html | 1 + themes/serene/templates/blog.html | 40 + themes/serene/templates/categories/list.html | 0 .../serene/templates/categories/single.html | 0 themes/serene/templates/feed.xml | 32 + themes/serene/templates/home.html | 116 ++ themes/serene/templates/post.html | 154 ++ themes/serene/templates/projects.html | 36 + themes/serene/templates/prose.html | 72 + themes/serene/templates/shortcodes/alert.html | 12 + .../templates/shortcodes/codeblock.html | 4 + .../serene/templates/shortcodes/figure.html | 8 + .../templates/shortcodes/important.html | 12 + .../serene/templates/shortcodes/mermaid.html | 3 + themes/serene/templates/shortcodes/note.html | 12 + .../serene/templates/shortcodes/question.html | 12 + themes/serene/templates/shortcodes/tip.html | 12 + .../serene/templates/shortcodes/warning.html | 12 + themes/serene/templates/tags/list.html | 25 + themes/serene/templates/tags/single.html | 31 + themes/serene/theme.toml | 12 + 152 files changed, 6457 insertions(+) create mode 100644 .gitmodules create mode 100644 LICENSE.md create mode 100644 config.toml create mode 100644 content/_index.md create mode 100644 content/blog/_index.md create mode 100644 content/blog/hoaxes-overview.md create mode 100644 content/blog/nfc-misconceptions.md create mode 100644 content/blog/selfhost-search-engine.md create mode 100644 content/blog/selfhost-tailscale.md create mode 100644 content/blog/setting-up-zola-nixos.md create mode 100644 content/projects/_index.md create mode 100644 content/projects/data.toml create mode 100644 highlight_themes/serene-dark.tmTheme create mode 100644 highlight_themes/serene-light.tmTheme create mode 100644 public/404.html create mode 100644 public/blog/feed.xml create mode 100644 public/blog/hoaxes-overview/index.html create mode 100644 public/blog/index.html create mode 100644 public/blog/nfc-misconceptions/index.html create mode 100644 public/blog/selfhost-search-engine/index.html create mode 100644 public/blog/selfhost-tailscale/index.html create mode 100644 public/blog/setting-up-zola-nixos/index.html create mode 100644 public/categories/cybersecurity/index.html create mode 100644 public/categories/guides/index.html create mode 100644 public/categories/index.html create mode 100644 public/giscus_dark.css create mode 100644 public/giscus_light.css create mode 100644 public/hl-dark.css create mode 100644 public/hl-light.css create mode 100644 public/icon/alert.svg create mode 100644 public/icon/arrow-up.svg create mode 100644 public/icon/backlink.svg create mode 100644 public/icon/check.svg create mode 100644 public/icon/copy.svg create mode 100644 public/icon/email.svg create mode 100644 public/icon/fingerprint.svg create mode 100644 public/icon/github.svg create mode 100644 public/icon/important.svg create mode 100644 public/icon/moon.svg create mode 100644 public/icon/note.svg create mode 100644 public/icon/question.svg create mode 100644 public/icon/rss.svg create mode 100644 public/icon/sun.svg create mode 100644 public/icon/tip.svg create mode 100644 public/icon/toc.svg create mode 100644 public/icon/twitter.svg create mode 100644 public/icon/warning.svg create mode 100644 public/img/avatar.webp create mode 100644 public/index.html create mode 100644 public/js/lightense.min.js create mode 100644 public/js/main.js create mode 100644 public/main.css create mode 100644 public/projects/data.toml create mode 100644 public/projects/index.html create mode 100644 public/robots.txt create mode 100644 public/sitemap.xml create mode 100644 public/tags/hacking/index.html create mode 100644 public/tags/headscale/index.html create mode 100644 public/tags/hoax/index.html create mode 100644 public/tags/index.html create mode 100644 public/tags/nfc/index.html create mode 100644 public/tags/nixos/index.html create mode 100644 public/tags/privacy/index.html create mode 100644 public/tags/searxng/index.html create mode 100644 public/tags/selfhosted/index.html create mode 100644 public/tags/social-engineering/index.html create mode 100644 public/tags/tailscale/index.html create mode 100644 public/tags/zola/index.html create mode 100644 static/hl-dark.css create mode 100644 static/hl-light.css create mode 100644 static/icon/alert.svg create mode 100644 static/icon/arrow-up.svg create mode 100644 static/icon/backlink.svg create mode 100644 static/icon/check.svg create mode 100644 static/icon/copy.svg create mode 100644 static/icon/email.svg create mode 100644 static/icon/fingerprint.svg create mode 100644 static/icon/github.svg create mode 100644 static/icon/important.svg create mode 100644 static/icon/moon.svg create mode 100644 static/icon/note.svg create mode 100644 static/icon/question.svg create mode 100644 static/icon/rss.svg create mode 100644 static/icon/sun.svg create mode 100644 static/icon/tip.svg create mode 100644 static/icon/toc.svg create mode 100644 static/icon/twitter.svg create mode 100644 static/icon/warning.svg create mode 100644 static/img/avatar.webp create mode 100644 templates/_custom_css.html create mode 100644 themes/serene/.gitignore create mode 100644 themes/serene/CHANGELOG.md create mode 100644 themes/serene/LICENSE create mode 100644 themes/serene/README.md create mode 100644 themes/serene/USAGE-zh_CN.md create mode 100644 themes/serene/USAGE.md create mode 100644 themes/serene/config.example.toml create mode 100644 themes/serene/highlight_themes/serene-dark.tmTheme create mode 100644 themes/serene/highlight_themes/serene-light.tmTheme create mode 100644 themes/serene/sass/giscus_dark.scss create mode 100644 themes/serene/sass/giscus_light.scss create mode 100644 themes/serene/sass/main.scss create mode 100644 themes/serene/screenshot.png create mode 100644 themes/serene/static/icon/alert.svg create mode 100644 themes/serene/static/icon/arrow-up.svg create mode 100644 themes/serene/static/icon/backlink.svg create mode 100644 themes/serene/static/icon/check.svg create mode 100644 themes/serene/static/icon/copy.svg create mode 100644 themes/serene/static/icon/email.svg create mode 100644 themes/serene/static/icon/fingerprint.svg create mode 100644 themes/serene/static/icon/github.svg create mode 100644 themes/serene/static/icon/important.svg create mode 100644 themes/serene/static/icon/moon.svg create mode 100644 themes/serene/static/icon/note.svg create mode 100644 themes/serene/static/icon/question.svg create mode 100644 themes/serene/static/icon/rss.svg create mode 100644 themes/serene/static/icon/sun.svg create mode 100644 themes/serene/static/icon/tip.svg create mode 100644 themes/serene/static/icon/toc.svg create mode 100644 themes/serene/static/icon/twitter.svg create mode 100644 themes/serene/static/icon/warning.svg create mode 100644 themes/serene/static/js/lightense.min.js create mode 100644 themes/serene/static/js/main.js create mode 100644 themes/serene/templates/404.html create mode 100644 themes/serene/templates/_base.html create mode 100644 themes/serene/templates/_custom_css.html create mode 100644 themes/serene/templates/_custom_font.html create mode 100644 themes/serene/templates/_footer.html create mode 100644 themes/serene/templates/_giscus_script.html create mode 100644 themes/serene/templates/_head_extend.html create mode 100644 themes/serene/templates/_header.html create mode 100644 themes/serene/templates/anchor-link.html create mode 100644 themes/serene/templates/blog.html create mode 100644 themes/serene/templates/categories/list.html create mode 100644 themes/serene/templates/categories/single.html create mode 100644 themes/serene/templates/feed.xml create mode 100644 themes/serene/templates/home.html create mode 100644 themes/serene/templates/post.html create mode 100644 themes/serene/templates/projects.html create mode 100644 themes/serene/templates/prose.html create mode 100644 themes/serene/templates/shortcodes/alert.html create mode 100644 themes/serene/templates/shortcodes/codeblock.html create mode 100644 themes/serene/templates/shortcodes/figure.html create mode 100644 themes/serene/templates/shortcodes/important.html create mode 100644 themes/serene/templates/shortcodes/mermaid.html create mode 100644 themes/serene/templates/shortcodes/note.html create mode 100644 themes/serene/templates/shortcodes/question.html create mode 100644 themes/serene/templates/shortcodes/tip.html create mode 100644 themes/serene/templates/shortcodes/warning.html create mode 100644 themes/serene/templates/tags/list.html create mode 100644 themes/serene/templates/tags/single.html create mode 100644 themes/serene/theme.toml diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..338feb1 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "themes/serene"] + path = themes/serene + url = https://github.com/isunjn/serene.git + branch = latest diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..1808178 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,22 @@ +The zlib/libpng License +======================= + +Copyright (c) 2023-2024 Muhammad Nauman Raza + +This software is provided 'as-is', without any express or implied warranty. In +no event will the authors be held liable for any damages arising from the use of +this software. + +Permission is granted to anyone to use this software for any purpose, including +commercial applications, and to alter it and redistribute it freely, subject to +the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim + that you wrote the original software. If you use this software in a product, + an acknowledgment in the product documentation would be appreciated but is + not required. + +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..accb721 --- /dev/null +++ b/config.toml @@ -0,0 +1,87 @@ +# serene v2.1.2 +# +# - docs: https://github.com/isunjn/serene/blob/latest/USAGE.md +# - check for updates: https://github.com/isunjn/serene/releases +# +#========================================================================================= + +base_url = "https://devraza.duckdns.org" # Domain name of your website +title = "Devraza" +description = "Someone who does programming, cybersecurity and some other stuff" +default_language = "en" +theme = "serene" +output_dir = "public" +compile_sass = true +minify_html = true +build_search_index = false # Keep this false, search is temporarily unsupported +generate_feed = false # Whether to generate a feed file in root, read docs for more info about rss feed +feed_filename = "feed.xml" # The file name of feed, "feed.xml" / "atom.xml" / "rss.xml", read docs for more info +taxonomies = [{ name = "tags" }, { name = "categories" }] + +[markdown] +highlight_code = true +highlight_theme = "boron" +extra_syntaxes_and_themes = ["highlight_themes"] +highlight_themes_css = [ + { theme = "serene-light", filename = "hl-light.css"}, + { theme = "serene-dark", filename = "hl-dark.css"}, +] +render_emoji = true +external_links_target_blank = false +external_links_no_follow = true +external_links_no_referrer = true +smart_punctuation = false + +[slugify] +paths = "on" +taxonomies = "on" +anchors = "on" + +#========================================================================================= + +[extra] + +name = "Muhammad Nauman Raza" +id = "devraza" +bio = "Programming and cybersecurity" +avatar = "img/avatar.webp" # Your avatar +links = [ # Your links + { name = "GitHub", icon = "github", url = "https://github.com/devraza" }, + { name = "Email", icon = "email", url = "mailto:devraza@outlook.com" }, +] + +homepage_layout = "about" # "about" | "list" + +sections = [ + { name = "blog", path = "/blog", is_external = false }, + { name = "projects", path = "/projects", is_external = false }, +] +blog_section_path = "/blog" + +nav_separator = "::" +nav_wrapper_left = "{" +nav_wrapper_right = "} ;" +nav_wrapper_separator = "," + +display_id = true # Whether to display your id on homepage +blog_categorized = true # Whether to categorize blog posts +blur_effect = true # Whether to turn on blur effect on navigation bar +back_to_top = true # Whether to show back-to-top button on post pages + +toc = true # Whether to show Table-Of-Contents by default +copy = true # Whether to add a copy button on code blocks by default +comment = false # Whether to show giscus comment section by default, see https://giscus.app for more info +display_tags = true # Whether to display tags on post pages by default +truncate_summary = false # Whether to truncate the summary of a post by default + +outdate_alert = false # Whether to show outdate alert by default +outdate_alert_days = 120 # How many days will a post be outdated by default +outdate_alert_text_before = "This article was last updated " +outdate_alert_text_after = " days ago and may be out of date." + +footer_copyright = "© 2024 Muhammad Nauman Raza" +footer_credits = true # Whether to show "powered by zola and serene" in footer + +not_found_title = "404" +not_found_error_text = "Not Found" +not_found_recover_text = "« back to home »" diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..0d4854e --- /dev/null +++ b/content/_index.md @@ -0,0 +1,20 @@ ++++ +template = 'home.html' + +[extra] +lang = 'en' ++++ + +I'm a moderately skilled programmer, beginner in the field of cybersecurity and aspiring graphic designer. +[NixOS](https://nixos.org) is my operating system of choice, and [quark.nvim](https://git.devraza.duckdns.org/devraza/quark.nvim) (my bespoke distribution of [neovim](https://neovim.io)) is my text editor. + +I also happen to be a devoted rustacean and a devout follower of the self-hosted way of life. + +My skills in programming and scripting languages I've used so far are as follows: +- Advanced: `Python`, `Go` +- Intermediate: `Rust`, `Nix`, `Bash`, `E-Lisp` +- Beginner: `Julia`, `Lua` + +However, I consider myself able to work to a reasonable degree with any modern programming language. + +Other *tools* that I can work with include `git`, `linux`, `inkscape`, and `GIMP`. diff --git a/content/blog/_index.md b/content/blog/_index.md new file mode 100644 index 0000000..05818ea --- /dev/null +++ b/content/blog/_index.md @@ -0,0 +1,12 @@ ++++ +title = "Blog Posts" +description = "All of the posts for my blog" +sort_by = "date" +template = "blog.html" +page_template = "post.html" +insert_anchor_links = "right" +generate_feed = true + +[extra] +lang = 'en' ++++ diff --git a/content/blog/hoaxes-overview.md b/content/blog/hoaxes-overview.md new file mode 100644 index 0000000..1f99bf9 --- /dev/null +++ b/content/blog/hoaxes-overview.md @@ -0,0 +1,41 @@ ++++ +title = "An overview on hoaxes" +date = 2024-01-04 +draft = false + +[taxonomies] +categories = ["Cybersecurity"] +tags = ["hoax", "social engineering"] + +[extra] +lang = "en" +toc = true +comment = true +copy = true +math = false +mermaid = false ++++ + +# Introduction + +In recent times, hoaxes have become increasingly prevalent as the internet continues to expand and as more people use social media. +Misinformation is on a rise - though this is information which isn't really new, the current state of things is horrible, and things really shouldn't be the way they are. + +I aim for this to be a brief blog post detailing the effect of hoaxes on society, focusing on why they're so harmful. + +# What exactly is a hoax? +Put simply, a hoax is made-up information, be it a story or something else. Hoaxes are created with the intent of spreading false information - for a immense variety of reasons, from jokes and causing embarrassment to provoking politic or social change[1](https://en.wikipedia.org/wiki/Hoax). I won't discuss the causes of hoaxes further in this blog post. + +# The effect of hoaxes +Hoaxes can cause significant damage to their targets if formulated cleverly. For example: + +> The stock price of Apple Inc. fell significantly in October 2008 after a hoax story was submitted to CNN's user-generated news site iReport.com claiming that company CEO Steve Jobs had suffered a major heart attack. The source of the story was traced back to 4chan. +> - Excerpt from [the Wikipedia 4chan page](https://en.wikipedia.org/wiki/4chan) + +With the incredible presence of social media in our lives, spreading harmful misinformation like that above can be as simple as making a few posts - they don't even need to be very convincing! +What makes matters worse is how gullible the general population is, even those educated in this sort of thing - this shows *just* how much influence the internet and it's contents have on us. + +I would like to clarify that I'm not suggesting that people should avoid using the internet to gather information - while its reliability is incredibly questionable, the accessibility and openness it provides far beats traditional methods of gathering information (books and such). My suggestion is that people should be much more careful with how they interpret information on the internet, +and perform their due diligence in their research into whatever they're aiming to learn; **people should make sure that what they're reading is accurate before absorbing any information** (here's your tl;dr). + +That's about it for this blog post, as it was meant to be a brief way of expressing my thoughts on the matter. Thanks for reading! diff --git a/content/blog/nfc-misconceptions.md b/content/blog/nfc-misconceptions.md new file mode 100644 index 0000000..7085c7c --- /dev/null +++ b/content/blog/nfc-misconceptions.md @@ -0,0 +1,69 @@ ++++ +title = "Misconceptions about NFC" +date = 2024-01-19 +draft = false + +[taxonomies] +categories = ["Cybersecurity"] +tags = ["nfc", "social engineering", "hacking"] + +[extra] +lang = "en" +toc = true +comment = true +copy = true +math = false +mermaid = false ++++ + +{% alert(header="Alert") %} +I made a mistake while writing this blog post - somehow forgetting that security isn't unambiguous. You can actually skim NFC chips from a certain distance +(having a limited distance is still an important factor though!), and though I think some of what I said below still applies you're better off ignoring it all. + +There are, of course, a whole range of problems with skimming NFC chips from a distance so my point - don't be so worried - would still stand. + +Either way, I recommend you take this with a grain of salt. +{% end %} + +# Introduction + +NFC (short for Near-Field Communication) is the set of communication protocols which allow for *near-field communication* between two electronic devices. +One of the most prominent uses of this technology are contactless transactions - this includes services like Google and Apple Pay as well as all of your contactless-enabled cards. + +It's been a while since my last blog past, but this one will be brief too - I'm writing here for the sake of clearing up some misconceptions people have about NFC. + +# The Misconceptions + +## Inspiration + +While talking with a friend on a WhatsApp group chat a few days ago about a program I found on my jailbroken iOS device - [Aemulo](https://github.com/Aemulo) - I was +informed of 'subway skimmers'; devices that could *supposedly* read data from contactless-enabled devices (via NFC) and would be able to emulate them. + +The idea behind the above example was that someone with malicious intent could place such a device in a public location and take their contactless devices for their malicious purposes. +When I heard of this, my first thought was: [hoax](https://devraza.duckdns.org/blog/hoaxes-overview/), and I think that it was rightfully so. + +## What exactly is wrong with this? + +Several things. I'm no expert in cybersecurity - everyone's a student in some way, but I was sure that NFC was, as it's name implies, for **near-field communication**. +I'm repeating myself here, but that's kind of the point. Various reliable resources, including Wikipedia, show that NFC has a maximum range of only a few centimetres - which makes sense, no? + +And yet, whatever source my friend had for 'subway skimmers' gave the impression, or otherwise stated, that it would work within a radius of a few feet, which is just impossible. +Upon voicing my doubts, I was then told that 'with a powerful enough antenna, it's possible'. Hoaxes sure are convincing, aren't they? Unfortunately, I am not able to find the source of my friend's misinformation. + +See, NFC only works within a few centimetres anyways. Even if it could *magically* work within a radius of a few feet, you've got to take in the electromagnetic interference +that the clothes and wallets people have would bring to any malicious device. The point of electromagnetic interference is especially true over a *huge* area of a few feet (relatively), where you've got several NFC-enabled devices. + +## Where it's actually an issue + +Of course, that isn't to say there aren't any issues with NFC and malicious readers - I'm just saying that the word getting around is horribly unrealistic. +For example, a *realistic* example of a malicious NFC reader would be one placed on the card slots in cash machines - you get: + +- [X] The short range (< ~20 cm) +- [X] Only one device +- [X] Lots of devices to read! + +And so, you've got someone so much more realistic that poses an actual threat! + +# Conclusion + +The information above, which I deem accurate, is there. What I suggest be taken away from this is pretty much the same as what is was for [my blog post on hoaxes](https://devraza.duckdns.org/blog/hoaxes-overview/) - **do some fact-checking!** diff --git a/content/blog/selfhost-search-engine.md b/content/blog/selfhost-search-engine.md new file mode 100644 index 0000000..39ae3d5 --- /dev/null +++ b/content/blog/selfhost-search-engine.md @@ -0,0 +1,109 @@ ++++ +title = "Host your own private search engine with SearXNG" +date = 2023-12-31 +draft = false + +[taxonomies] +categories = ["Guides"] +tags = ["searxng", "privacy", "selfhosted", "nixos"] + +[extra] +lang = "en" +toc = true +comment = true +copy = true +math = false +mermaid = false ++++ + +# Introduction +[SearXNG](https://docs.searxng.org/), put in its own words, is a 'free internet metasearch engine'. +Note that it describes itself as a *metasearch* engine specifically - unlike your traditional search engine like Google or Bing, SearXNG does things a little bit differently: +It aggregrates the results produced by search services like those aforementioned, and feeds them back to you. + +Because of this key detail and a great deal of effort by those who've helped shape it, SearXNG protects your privacy, and does so very well: +- Private data from requests going to the search services it aggregrates results from is removed +- It does **not** forward *anything* to any third parties through search services +- Private data is *also* removed from requests going to the results pages + +Furthermore, SearXNG can be configured to use [Tor](https://torproject.org). + +However, the aspect of privacy isn't the only great selling feature of the engine; from my use of the engine so far, it's also great at...searching (is that a surprise?). The fact that it's a metasearch engine plays a key role in this, +as it provides SearXNG the ability to pull content more efficiently and gives *you* the ability to further tailor your experience. + +# Setting up SearXNG +## Installing the service +As you may have expected if you've used NixOS for a while, searxng is packaged *and* has a service on NixOS. This makes setting it up just that much easier. + +To get started, place somewhere in your *system* config the following: +```nix +{ + # ... + services.searx = { + enable = true; + settings = { + server = { + port = 8888; + bind_address = "127.0.0.1"; + secret_key = "@SEARX_SECRET_KEY@"; + base_url = "https://search.devraza.duckdns.org/"; # replace with wherever you want to host yours + }; + }; + }; + # ... +} +``` + +The snippet above starts the `searx` systemd service for listening on port `8888`, and assumes a `base_url` of `https://search.devraza.duckdns.org`. + +Now that we've got the actual `searx` instance running, we can now set up a reverse proxy allowing the service to be accessed remotely (whether this is within your local network or across the internet is up to you). + +## Setting up a reverse proxy +### What is a reverse proxy? +Before I get started with the technical details of setting this up, I'd like to briefly clarify what a reverse proxy exactly is (to my understanding). + +Let's get the wikipedia definition of reverse proxy out of the way first: + +> [...] a reverse proxy is an application that sits in front of back-end applications and forwards client requests to those applications. [...] + +However, you might be confused as to what this actually means; I'll give an example of the usage of reverse proxies to better explain this: + +- Suppose you've got a few services running on a server (for demonstration purposes, let's name these `x`, `y` and `z`), each running on their own unique port. +- Assuming you had a domain, and wanted to access all of these services from their own unique sub-domains (e.g. `x.yourdomain.com`, `y.yourdomain.com` and `z.yourdomain.com`), you would have to use a reverse proxy. +- This reverse proxy would take in requests from clients going to sub-domains, and forward these requests to the appropriate port on your machine for the service being requested. + +The concept should be clear now, if it wasn't already. + +### Using NGINX to set up the reverse proxy +NGINX is a popular web server that supports the creation of virtual hosts and the usage of reverse proxies. To accomodate our `searx` instance, we append the following to our NixOS server configuration: + +```nix,hl_lines=12,linenos +{ + # ... + services.nginx = { + enable = true; + # any extra configuration here + virtualHosts = { + "search" = { # this can be anything, being an arbitrary identifier + forceSSL = true; + serverName = "search.yourdomain.com"; # replace this with whatever you're serving from + # SearX proxy + locations."/" = { + proxyPass = "http://${toString config.services.searx.settings.server.bind_address}:${toString config.services.searx.settings.server.port}"; + proxyWebsockets = true; + recommendedProxySettings = true; + }; + }; + }; + }; + # ... +} +``` + +{% note(header="Note") %} +The expression highlighted above is used to dynamically adjust the location NGINX will forward requests to, depending on your `searx` config +{% end %} + +After saving your changes and rebuilding your server's system configuration (as usual), you should have a working *private* instance of SearXNG that you can access using the `serverName` you've given it. + +Set your browser to use this as your search engine using the relevant documentation (with Firefox this is as easy as right-clicking on the URL after opening up the page and clicking a button). Enjoy! diff --git a/content/blog/selfhost-tailscale.md b/content/blog/selfhost-tailscale.md new file mode 100644 index 0000000..3f1d570 --- /dev/null +++ b/content/blog/selfhost-tailscale.md @@ -0,0 +1,98 @@ ++++ +title = "Take control of tailscale with headscale" +date = 2024-01-10 +draft = false + +[taxonomies] +categories = ["Guides"] +tags = ["tailscale", "headscale", "selfhosted", "privacy"] + +[extra] +lang = "en" +toc = true +comment = true +copy = true +math = false +mermaid = false ++++ + +# Tailscale +[Tailscale](https://tailscale.com/) is a modern tunnel VPN service based on [WireGuard®](https://www.wireguard.com/) which provides a 'free' and secure means of communication between +devices within a [tailnet](https://tailscale.com/kb/1136/tailnet) - a private network which Tailscale provides its users. + +Essentially, it provides a private and secure way of accessing any of your devices, no matter where you are in the world - a personal WAN encompassing the entire world. + +And on top of this, Tailscale is completely free and open-source! At least, on the surface... + +## Not FOSS? What do you mean? +There's a quite popular saying within the free and open-source software community, which goes along the lines of: + +> If you aren't paying for the product, then you are the product. + +Which makes perfect sense. It's the *modern* era so anything significant is powered by some form of *modern* technology, data is the new oil, and so on. +In exchange for offering you 'free' services, companies collect and use your data; +while there supposedly are laws in place preventing the inconcensual collection of data in most countries around the world, *your* personal data may *still* be traded unethically and inconsensually. + +I personally am of the opinion that these laws are worth absolutely nothing if people aren't educated in how their data is being used, and what specifically is being collected. +But I digress, and that's a blog post for another time. + +I also think it's quite unfortunate that users of paid services *still* have their personal data collected in the unethical manner outlined above, despite the fact that they are *paying* for the service... + +In the context of Tailscale: while their clients are all open-source, their control server - the thing that's managing and rerouting *everything* going through what they advertise as *your* 'secure' VPN, isn't. +You've got no idea what this thing is doing with the traffic it recieves. + +# Headscale +For every problem, there's probably a solution somewhere. And luckily for this one (which may or may not actually be a problem for you), we've got [Headscale](https://headscale.net/) as our solution. +Headscale's a self-hostable, open-source alternative to the Tailscale control server, and aims to 'provide self-hosters and hobbyists with an open-source server they can use for their projects and labs'. + +## Installing on NixOS +Moving on to installing and setting up Headscale on NixOS. + +```nix +# ... +{ + # ... + services.headscale = { + enable = true; + address = "0.0.0.0"; + port = 7070; + settings = { + logtail.enabled = false; + server_url = "https://headscale.devraza.duckdns.org"; + dns_config.base_domain = "devraza.duckdns.org"; + }; + }; + # ... +} +``` + +This starts up the `headscale` systemd service on our host machine at port `7070`. After that, we make Headscale available over the clearnet with an NGINX reverse proxy, per the usual: + +```nix +{ + services.nginx = { + enable = true; + virtualHosts = { + "headscale" = { + addSSL = true; + serverName = "headscale.devraza.duckdns.org"; + sslCertificate = ./services/nginx/certs/subdomains/fullchain.pem; + sslCertificateKey = ./services/nginx/certs/subdomains/privkey.pem; + # Headscale proxy + locations."/" = { + proxyPass = "http://127.0.0.1:${toString config.services.headscale.port}"; + proxyWebsockets = true; + }; + }; + }; + }; +} +``` + +And that's it. A self-hosted, *truly* open-source Wireguard®-based VPN is now at your fingertips. Enjoy! Oh, but please read the conclusion before doing that: + +# Conclusion +For those of you who wish to have access to something like Tailscale but value your privacy above all, you would genuinely be greatful for Headscale. +However, I've found that some are fine with what Tailscale *does* provide in regards to FOSS, and are satisfied by the raw convenience and simplicity of a non-selfhosted Tailscale control server - exactly what it hopes to provide, as shown by their self-description on their website: 'a zero-config, no-fuss VPN [provider]'. + +Or you could just settle with bare Wireguard®. diff --git a/content/blog/setting-up-zola-nixos.md b/content/blog/setting-up-zola-nixos.md new file mode 100644 index 0000000..e112579 --- /dev/null +++ b/content/blog/setting-up-zola-nixos.md @@ -0,0 +1,95 @@ ++++ +title = "Setting up Zola on NixOS" +date = 2023-12-29 +draft = false + +[taxonomies] +categories = ["Guides"] +tags = ["zola", "nixos"] + +[extra] +lang = "en" +toc = true +comment = true +copy = true +math = false +mermaid = false ++++ + +# Introduction +[Zola](https://getzola.org) is a static site generator (similarly to the infamous [Hugo](https://gohugo.io), which you may have already heard of) and is written in Rust. +It also happens to be the framework that this site is built on! + +This blog post is a guide on setting up the site engine on NixOS specifically. + +# Installation +## Installing the package +`zola` is packaged in the nix package repository, so you just declaratively add the package to your configuration as usual: +For the purposes of this guide, zola can be installed either as a system or user package. + +- As a system package: +```nix +{ pkgs, ... }: { + # ... + environment.systemPackages = with pkgs; [ + zola # Append the package name to the list + ]; + # ... +} +``` + +- As a user package (with home-manager): +```nix +{ pkgs, ... }: { + # ... + home.packages = with pkgs; [ + zola # Append the package name to the list + ]; + # ... +} +``` + +Now that `zola` itself is installed, we can move on setting up the pages it serves - continue reading... + +## Setting up a theme +Zola actually has a section of its website showcasing several community-made themes which you can choose from to be the theme for your static site [here](https://getzola.org/themes/). + +Simply choose a theme that you like (demos are usually available for each theme listed) and follow its appropriate documentation to set it up - this site uses a version of the [serene theme](https://www.getzola.org/themes/serene/) with my custom colours. + +{% note(header="Custom themes") %} +You can also make your own theme if that better suits you (I recommend giving the [documentation](https://getzola.org/documentation) a read if so). +{% end %} + +## Setting up NGINX +After selecting a theme (or making your own) you should now have a directory somewhere on your server containing your static site. +For the following snippet, we'll assume this is at `/var/lib/blog`. + +[NGINX](https://nginx.com) is a popular webserver which we're going to use for the purposes of hosting and serving our site. To do so, append the following somewhere in your configuration: + +```nix +# ... +{ + # ... + services.nginx = { + enable = true; + virtualHosts = { + "blog" = { + forceSSL = true; + serverName = "blog.devraza.duckdns.org"; # replace this with wherever your site will be + root = "/var/lib/blog/public"; # the path to the `public` folder in our site directory + }; + }; + }; + # ... +} +``` + +# Finishing up +You should now have your own static site built with Zola! You can use this for a bunch of things, like: +- Your personal blog (as I've done) +- A way to showcase your projects ([as I've also done](https://blog.devraza.duckdns.org/projects)) +- Hosting documentation (check out [this Zola theme](https://www.getzola.org/themes/adidoks/), for example) + +{% question(header="Help, my changes aren't sticking!") %} +When you make new markdown files (or any other changes to the structure of your site), remember to run `zola build` in your site directory (`/var/lib/blog`) for the changes to *build* into the actual site. +{% end %} diff --git a/content/projects/_index.md b/content/projects/_index.md new file mode 100644 index 0000000..7fe704c --- /dev/null +++ b/content/projects/_index.md @@ -0,0 +1,8 @@ ++++ +title = "Projects" +description = "All of my (public) projects." +template = "projects.html" + +[extra] +lang = 'en' ++++ diff --git a/content/projects/data.toml b/content/projects/data.toml new file mode 100644 index 0000000..73bac3a --- /dev/null +++ b/content/projects/data.toml @@ -0,0 +1,39 @@ +[[project]] +name = "DianciEmacs" +desc = "A minimal and elegant Emacs configuration framework." +tags = ["emacs", "config", "diancie"] +links = [ + { name = "git", url = "https://git.devraza.duckdns.org/devraza/dianciemacs" }, +] + +[[project]] +name = "Kagayaki for Emacs" +desc = "A gorgeously soft colorscheme for Emacs." +tags = ["emacs", "colorscheme", "theme", "dark"] +links = [ + { name = "git", url = "https://git.devraza.duckdns.org/devraza/kagayaki-emacs" }, +] + +[[project]] +name = "Ambition" +desc = "A textual fast-paced 2D MMORPG written in Rust." +tags = ["rust", "bevy", "mmorpg"] +links = [ + { name = "git", url = "https://git.devraza.duckdns.org/devraza/ambition" }, +] + +[[project]] +name = "quark.nvim" +desc = "A fast and minimal Neovim configuration framework. `[Deprecated]`" +tags = ["neovim"] +links = [ + { name = "git", url = "https://git.devraza.duckdns.org/devraza/quark.nvim" }, +] + +[[project]] +name = "particle.nvim" +desc = "A gorgeously soft colorscheme for Neovim. `[Deprecated]`" +tags = ["neovim", "colorscheme"] +links = [ + { name = "git", url = "https://git.devraza.duckdns.org/devraza/particle.nvim" }, +] diff --git a/highlight_themes/serene-dark.tmTheme b/highlight_themes/serene-dark.tmTheme new file mode 100644 index 0000000..f321ef3 --- /dev/null +++ b/highlight_themes/serene-dark.tmTheme @@ -0,0 +1,287 @@ + + + + + + + + + comment + http://chriskempson.com + name + Tomorrow Night + settings + + + settings + + caret + #AEAFAD + foreground + #fefefa + invisibles + #4B4E55 + lineHighlight + #282A2E + selection + #373B41 + + + + name + Comment + scope + comment, string.quoted.double.block.python + settings + + foreground + #999999 + + + + name + Foreground + scope + keyword.operator.class, constant.other, source.php.embedded.line + settings + + fontStyle + + foreground + #CED1CF + + + + name + Variable, String Link, Regular Expression, Tag Name + scope + variable, support.other.variable, string.other.link, string.regexp, entity.name.tag, entity.other.attribute-name, meta.tag, declaration.tag + settings + + foreground + #A67878 + + + + name + Number, Constant, Function Argument, Tag Attribute, Embedded + scope + constant.numeric, constant.language, support.constant, constant.character, variable.parameter, punctuation.section.embedded, keyword.other.unit + settings + + fontStyle + + foreground + #E08355 + + + + name + Class, Support + scope + type, +entity.name.class, entity.name.type.class, support.type, support.class + settings + + fontStyle + + foreground + #6A8F8A + + + + name + String, Symbols, Inherited Class, Markup Heading + scope + string, constant.other.symbol, entity.other.inherited-class, markup.heading + settings + + fontStyle + + foreground + #85AD74 + + + + name + Operator, Misc + scope + keyword.operator, constant.other.color + settings + + foreground + #6A8F8A + + + + name + Function, Special Method, Block Level + scope + entity.name.function, meta.function-call, support.function, keyword.other.special-method, meta.block-level + settings + + fontStyle + + foreground + #81A2BE + + + + name + Keyword, Storage + scope + keyword, storage, storage.type, entity.name.tag.css + settings + + fontStyle + + foreground + #B294BB + + + + name + Invalid + scope + invalid + settings + + background + #DF5F5F + fontStyle + + foreground + #CED2CF + + + + name + Separator + scope + meta.separator + settings + + background + #82A3BF + foreground + #CED2CF + + + + name + Deprecated + scope + invalid.deprecated + settings + + background + #B798BF + fontStyle + + foreground + #CED2CF + + + + name + Diff foreground + scope + markup.inserted.diff, markup.deleted.diff, meta.diff.header.to-file, meta.diff.header.from-file + settings + + foreground + #FFFFFF + + + + name + Diff insertion + scope + markup.inserted.diff, meta.diff.header.to-file + settings + + foreground + #5FE375 + background + #00000000 + + + + name + Diff deletion + scope + markup.deleted.diff, meta.diff.header.from-file + settings + + foreground + #D46565 + + + + name + Diff header + scope + meta.diff.header.from-file, meta.diff.header.to-file + settings + + foreground + #FFFFFF + background + #4271ae + + + + name + Diff range + scope + meta.diff.range + settings + + fontStyle + italic + foreground + #3e999f + + + + name + diff.deleted + scope + markup.deleted + settings + + foreground + #F92672 + + + + name + diff.inserted + scope + markup.inserted + settings + + foreground + #A6E22E + + + + name + diff.changed + scope + markup.changed + settings + + foreground + #967EFB + + + + uuid + F96223EB-1A60-4617-92F3-D24D4F13DB09 + colorSpaceName + sRGB + semanticClass + theme.dark.tomorrow_night + + diff --git a/highlight_themes/serene-light.tmTheme b/highlight_themes/serene-light.tmTheme new file mode 100644 index 0000000..24ba5cc --- /dev/null +++ b/highlight_themes/serene-light.tmTheme @@ -0,0 +1,252 @@ + + + + + + + + + comment + http://chriskempson.com + name + Tomorrow + settings + + + settings + + caret + #AEAFAD + foreground + #4D4D4C + invisibles + #D1D1D1 + lineHighlight + #EFEFEF + selection + #D6D6D6 + + + + name + Comment + scope + comment, string.quoted.double.block.python + settings + + foreground + #999999 + + + + name + Foreground + scope + keyword.operator.class, constant.other, source.php.embedded.line + settings + + fontStyle + + foreground + #666969 + + + + name + Variable, String Link, Regular Expression, Tag Name + scope + variable, support.other.variable, string.other.link, string.regexp, entity.name.tag, entity.other.attribute-name, meta.tag, declaration.tag + settings + + foreground + #A67878 + + + + name + Number, Constant, Function Argument, Tag Attribute, Embedded + scope + constant.numeric, constant.language, support.constant, constant.character, variable.parameter, punctuation.section.embedded, keyword.other.unit + settings + + fontStyle + + foreground + #E08355 + + + + name + Type, Class, Support + scope + type, +entity.name.class, entity.name.type.class, support.type, support.class + settings + + fontStyle + + foreground + #568A8F + + + + name + String, Symbols, Inherited Class, Markup Heading + scope + string, constant.other.symbol, entity.other.inherited-class, markup.heading + settings + + fontStyle + + foreground + #85AD74 + + + + name + Operator, Misc + scope + keyword.operator, constant.other.color + settings + + foreground + #568A8F + + + + name + Function, Special Method, Block Level + scope + entity.name.function, meta.function-call, support.function, keyword.other.special-method, meta.block-level + settings + + fontStyle + + foreground + #4271AE + + + + name + Keyword, Storage + scope + keyword, storage, storage.type + settings + + fontStyle + + foreground + #8959A8 + + + + name + Invalid + scope + invalid + settings + + background + #DF5F5F + fontStyle + + foreground + #FFFFFF + + + + name + Separator + scope + meta.separator + settings + + background + #4271AE + foreground + #FFFFFF + + + + name + Deprecated + scope + invalid.deprecated + settings + + background + #8959A8 + fontStyle + + foreground + #FFFFFF + + + + name + Diff foreground + scope + markup.inserted.diff, markup.deleted.diff, meta.diff.header.to-file, meta.diff.header.from-file + settings + + foreground + #FFFFFF + + + + name + Diff insertion + scope + markup.inserted.diff, meta.diff.header.to-file + settings + + background + #65C23A66 + + + + name + Diff deletion + scope + markup.deleted.diff, meta.diff.header.from-file + settings + + background + #C8282966 + + + + name + Diff header + scope + meta.diff.header.from-file, meta.diff.header.to-file + settings + + foreground + #FFFFFF + background + #4271ae + + + + name + Diff range + scope + meta.diff.range + settings + + fontStyle + italic + foreground + #3e999f + + + + uuid + 82CCD69C-F1B1-4529-B39E-780F91F07604 + colorSpaceName + sRGB + semanticClass + theme.light.tomorrow + + \ No newline at end of file diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..fd44b9b --- /dev/null +++ b/public/404.html @@ -0,0 +1 @@ +404
404
Not Found
« back to home »
\ No newline at end of file diff --git a/public/blog/feed.xml b/public/blog/feed.xml new file mode 100644 index 0000000..56ebad3 --- /dev/null +++ b/public/blog/feed.xml @@ -0,0 +1,350 @@ + + + Blog Posts + All of the posts for my blog + + + 2024-01-19T00:00:00+00:00 + https://devraza.duckdns.org/blog/feed.xml + + Misconceptions about NFC + 2024-01-19T00:00:00+00:00 + 2024-01-19T00:00:00+00:00 + + https://devraza.duckdns.org/blog/nfc-misconceptions/ + <blockquote class="callout alert"> + + <div class="icon"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20"><path d="M4.00098 20V14C4.00098 9.58172 7.5827 6 12.001 6C16.4193 6 20.001 9.58172 20.001 14V20H21.001V22H3.00098V20H4.00098ZM6.00098 20H18.001V14C18.001 10.6863 15.3147 8 12.001 8C8.68727 8 6.00098 10.6863 6.00098 14V20ZM11.001 2H13.001V5H11.001V2ZM19.7792 4.80761L21.1934 6.22183L19.0721 8.34315L17.6578 6.92893L19.7792 4.80761ZM2.80859 6.22183L4.22281 4.80761L6.34413 6.92893L4.92991 8.34315L2.80859 6.22183ZM7.00098 14C7.00098 11.2386 9.23956 9 12.001 9V11C10.3441 11 9.00098 12.3431 9.00098 14H7.00098Z" fill="currentColor"></path></svg> + </div> + <div class="content"> + + <p><strong>Alert</strong></p> + + <p>I made a mistake while writing this blog post - somehow forgetting that security isn't unambiguous. You can actually skim NFC chips from a certain distance +(having a limited distance is still an important factor though!), and though I think some of what I said below still applies you're better off ignoring it all.</p> +<p>There are, of course, a whole range of problems with skimming NFC chips from a distance so my point - don't be so worried - would still stand.</p> +<p>Either way, I recommend you take this with a grain of salt.</p> + + </div> +</blockquote><h1 id="introduction">Introduction<a class="zola-anchor" href="#introduction" aria-label="Anchor link for: introduction">#</a></h1> +<p>NFC (short for Near-Field Communication) is the set of communication protocols which allow for <em>near-field communication</em> between two electronic devices. +One of the most prominent uses of this technology are contactless transactions - this includes services like Google and Apple Pay as well as all of your contactless-enabled cards.</p> +<p>It's been a while since my last blog past, but this one will be brief too - I'm writing here for the sake of clearing up some misconceptions people have about NFC.</p> +<h1 id="the-misconceptions">The Misconceptions<a class="zola-anchor" href="#the-misconceptions" aria-label="Anchor link for: the-misconceptions">#</a></h1> +<h2 id="inspiration">Inspiration<a class="zola-anchor" href="#inspiration" aria-label="Anchor link for: inspiration">#</a></h2> +<p>While talking with a friend on a WhatsApp group chat a few days ago about a program I found on my jailbroken iOS device - <a rel="nofollow noreferrer" href="https://github.com/Aemulo">Aemulo</a> - I was +informed of 'subway skimmers'; devices that could <em>supposedly</em> read data from contactless-enabled devices (via NFC) and would be able to emulate them.</p> +<p>The idea behind the above example was that someone with malicious intent could place such a device in a public location and take their contactless devices for their malicious purposes. +When I heard of this, my first thought was: <a rel="nofollow noreferrer" href="https://devraza.duckdns.org/blog/hoaxes-overview/">hoax</a>, and I think that it was rightfully so.</p> +<h2 id="what-exactly-is-wrong-with-this">What exactly is wrong with this?<a class="zola-anchor" href="#what-exactly-is-wrong-with-this" aria-label="Anchor link for: what-exactly-is-wrong-with-this">#</a></h2> +<p>Several things. I'm no expert in cybersecurity - everyone's a student in some way, but I was sure that NFC was, as it's name implies, for <strong>near-field communication</strong>. +I'm repeating myself here, but that's kind of the point. Various reliable resources, including Wikipedia, show that NFC has a maximum range of only a few centimetres - which makes sense, no?</p> +<p>And yet, whatever source my friend had for 'subway skimmers' gave the impression, or otherwise stated, that it would work within a radius of a few feet, which is just impossible. +Upon voicing my doubts, I was then told that 'with a powerful enough antenna, it's possible'. Hoaxes sure are convincing, aren't they? Unfortunately, I am not able to find the source of my friend's misinformation.</p> +<p>See, NFC only works within a few centimetres anyways. Even if it could <em>magically</em> work within a radius of a few feet, you've got to take in the electromagnetic interference +that the clothes and wallets people have would bring to any malicious device. The point of electromagnetic interference is especially true over a <em>huge</em> area of a few feet (relatively), where you've got several NFC-enabled devices.</p> +<h2 id="where-it-s-actually-an-issue">Where it's actually an issue<a class="zola-anchor" href="#where-it-s-actually-an-issue" aria-label="Anchor link for: where-it-s-actually-an-issue">#</a></h2> +<p>Of course, that isn't to say there aren't any issues with NFC and malicious readers - I'm just saying that the word getting around is horribly unrealistic. +For example, a <em>realistic</em> example of a malicious NFC reader would be one placed on the card slots in cash machines - you get:</p> +<ul> +<li><input disabled="" type="checkbox" checked=""/> +The short range (&lt; ~20 cm)</li> +<li><input disabled="" type="checkbox" checked=""/> +Only one device</li> +<li><input disabled="" type="checkbox" checked=""/> +Lots of devices to read!</li> +</ul> +<p>And so, you've got someone so much more realistic that poses an actual threat!</p> +<h1 id="conclusion">Conclusion<a class="zola-anchor" href="#conclusion" aria-label="Anchor link for: conclusion">#</a></h1> +<p>The information above, which I deem accurate, is there. What I suggest be taken away from this is pretty much the same as what is was for <a rel="nofollow noreferrer" href="https://devraza.duckdns.org/blog/hoaxes-overview/">my blog post on hoaxes</a> - <strong>do some fact-checking!</strong></p> + + + + Take control of tailscale with headscale + 2024-01-10T00:00:00+00:00 + 2024-01-10T00:00:00+00:00 + + https://devraza.duckdns.org/blog/selfhost-tailscale/ + <h1 id="tailscale">Tailscale<a class="zola-anchor" href="#tailscale" aria-label="Anchor link for: tailscale">#</a></h1> +<p><a rel="nofollow noreferrer" href="https://tailscale.com/">Tailscale</a> is a modern tunnel VPN service based on <a rel="nofollow noreferrer" href="https://www.wireguard.com/">WireGuard®</a> which provides a 'free' and secure means of communication between +devices within a <a rel="nofollow noreferrer" href="https://tailscale.com/kb/1136/tailnet">tailnet</a> - a private network which Tailscale provides its users.</p> +<p>Essentially, it provides a private and secure way of accessing any of your devices, no matter where you are in the world - a personal WAN encompassing the entire world.</p> +<p>And on top of this, Tailscale is completely free and open-source! At least, on the surface...</p> +<h2 id="not-foss-what-do-you-mean">Not FOSS? What do you mean?<a class="zola-anchor" href="#not-foss-what-do-you-mean" aria-label="Anchor link for: not-foss-what-do-you-mean">#</a></h2> +<p>There's a quite popular saying within the free and open-source software community, which goes along the lines of:</p> +<blockquote> +<p>If you aren't paying for the product, then you are the product.</p> +</blockquote> +<p>Which makes perfect sense. It's the <em>modern</em> era so anything significant is powered by some form of <em>modern</em> technology, data is the new oil, and so on. +In exchange for offering you 'free' services, companies collect and use your data; +while there supposedly are laws in place preventing the inconcensual collection of data in most countries around the world, <em>your</em> personal data may <em>still</em> be traded unethically and inconsensually.</p> +<p>I personally am of the opinion that these laws are worth absolutely nothing if people aren't educated in how their data is being used, and what specifically is being collected. +But I digress, and that's a blog post for another time.</p> +<p>I also think it's quite unfortunate that users of paid services <em>still</em> have their personal data collected in the unethical manner outlined above, despite the fact that they are <em>paying</em> for the service...</p> +<p>In the context of Tailscale: while their clients are all open-source, their control server - the thing that's managing and rerouting <em>everything</em> going through what they advertise as <em>your</em> 'secure' VPN, isn't. +You've got no idea what this thing is doing with the traffic it recieves.</p> +<h1 id="headscale">Headscale<a class="zola-anchor" href="#headscale" aria-label="Anchor link for: headscale">#</a></h1> +<p>For every problem, there's probably a solution somewhere. And luckily for this one (which may or may not actually be a problem for you), we've got <a rel="nofollow noreferrer" href="https://headscale.net/">Headscale</a> as our solution. +Headscale's a self-hostable, open-source alternative to the Tailscale control server, and aims to 'provide self-hosters and hobbyists with an open-source server they can use for their projects and labs'.</p> +<h2 id="installing-on-nixos">Installing on NixOS<a class="zola-anchor" href="#installing-on-nixos" aria-label="Anchor link for: installing-on-nixos">#</a></h2> +<p>Moving on to installing and setting up Headscale on NixOS.</p> +<pre data-lang="nix" style="background-color:#151515;color:#e8e8d3;" class="language-nix "><code class="language-nix" data-lang="nix"><span style="color:#888888;"># ... +</span><span>{ +</span><span> </span><span style="color:#888888;"># ... +</span><span> </span><span style="color:#ffb964;">services</span><span>.</span><span style="color:#ffb964;">headscale </span><span>= { +</span><span> </span><span style="color:#ffb964;">enable </span><span>= true; +</span><span> </span><span style="color:#ffb964;">address </span><span>= </span><span style="color:#99ad6a;">&quot;0.0.0.0&quot;</span><span>; +</span><span> </span><span style="color:#ffb964;">port </span><span>= </span><span style="color:#cf6a4c;">7070</span><span>; +</span><span> </span><span style="color:#ffb964;">settings </span><span>= { +</span><span> </span><span style="color:#ffb964;">logtail</span><span>.</span><span style="color:#ffb964;">enabled </span><span>= false; +</span><span> </span><span style="color:#ffb964;">server_url </span><span>= </span><span style="color:#99ad6a;">&quot;https://headscale.devraza.duckdns.org&quot;</span><span>; +</span><span> </span><span style="color:#ffb964;">dns_config</span><span>.</span><span style="color:#ffb964;">base_domain </span><span>= </span><span style="color:#99ad6a;">&quot;devraza.duckdns.org&quot;</span><span>; +</span><span> }; +</span><span> }; +</span><span> </span><span style="color:#888888;"># ... +</span><span>} +</span></code></pre> +<p>This starts up the <code>headscale</code> systemd service on our host machine at port <code>7070</code>. After that, we make Headscale available over the clearnet with an NGINX reverse proxy, per the usual:</p> +<pre data-lang="nix" style="background-color:#151515;color:#e8e8d3;" class="language-nix "><code class="language-nix" data-lang="nix"><span>{ +</span><span> </span><span style="color:#ffb964;">services</span><span>.</span><span style="color:#ffb964;">nginx </span><span>= { +</span><span> </span><span style="color:#ffb964;">enable </span><span>= true; +</span><span> </span><span style="color:#ffb964;">virtualHosts </span><span>= { +</span><span> </span><span style="color:#99ad6a;">&quot;headscale&quot; </span><span>= { +</span><span> </span><span style="color:#ffb964;">addSSL </span><span>= true; +</span><span> </span><span style="color:#ffb964;">serverName </span><span>= </span><span style="color:#99ad6a;">&quot;headscale.devraza.duckdns.org&quot;</span><span>; +</span><span> </span><span style="color:#ffb964;">sslCertificate </span><span>= </span><span style="color:#99ad6a;">./services/nginx/certs/subdomains/fullchain.pem</span><span>; +</span><span> </span><span style="color:#ffb964;">sslCertificateKey </span><span>= </span><span style="color:#99ad6a;">./services/nginx/certs/subdomains/privkey.pem</span><span>; +</span><span> </span><span style="color:#888888;"># Headscale proxy +</span><span> </span><span style="color:#ffb964;">locations</span><span>.</span><span style="color:#99ad6a;">&quot;/&quot; </span><span>= { +</span><span> </span><span style="color:#ffb964;">proxyPass </span><span>= </span><span style="color:#99ad6a;">&quot;http://127.0.0.1:${toString </span><span style="color:#ffb964;">config</span><span style="color:#99ad6a;">.</span><span style="color:#ffb964;">services</span><span style="color:#99ad6a;">.</span><span style="color:#ffb964;">headscale</span><span style="color:#99ad6a;">.</span><span style="color:#ffb964;">port</span><span style="color:#99ad6a;">}&quot;</span><span>; +</span><span> </span><span style="color:#ffb964;">proxyWebsockets </span><span>= true; +</span><span> }; +</span><span> }; +</span><span> }; +</span><span> }; +</span><span>} +</span></code></pre> +<p>And that's it. A self-hosted, <em>truly</em> open-source Wireguard®-based VPN is now at your fingertips. Enjoy! Oh, but please read the conclusion before doing that:</p> +<h1 id="conclusion">Conclusion<a class="zola-anchor" href="#conclusion" aria-label="Anchor link for: conclusion">#</a></h1> +<p>For those of you who wish to have access to something like Tailscale but value your privacy above all, you would genuinely be greatful for Headscale. +However, I've found that some are fine with what Tailscale <em>does</em> provide in regards to FOSS, and are satisfied by the raw convenience and simplicity of a non-selfhosted Tailscale control server - exactly what it hopes to provide, as shown by their self-description on their website: 'a zero-config, no-fuss VPN [provider]'.</p> +<p>Or you could just settle with bare Wireguard®.</p> + + + + An overview on hoaxes + 2024-01-04T00:00:00+00:00 + 2024-01-04T00:00:00+00:00 + + https://devraza.duckdns.org/blog/hoaxes-overview/ + <h1 id="introduction">Introduction<a class="zola-anchor" href="#introduction" aria-label="Anchor link for: introduction">#</a></h1> +<p>In recent times, hoaxes have become increasingly prevalent as the internet continues to expand and as more people use social media. +Misinformation is on a rise - though this is information which isn't really new, the current state of things is horrible, and things really shouldn't be the way they are.</p> +<p>I aim for this to be a brief blog post detailing the effect of hoaxes on society, focusing on why they're so harmful.</p> +<h1 id="what-exactly-is-a-hoax">What exactly is a hoax?<a class="zola-anchor" href="#what-exactly-is-a-hoax" aria-label="Anchor link for: what-exactly-is-a-hoax">#</a></h1> +<p>Put simply, a hoax is made-up information, be it a story or something else. Hoaxes are created with the intent of spreading false information - for a immense variety of reasons, from jokes and causing embarrassment to provoking politic or social change<sup><a rel="nofollow noreferrer" href="https://en.wikipedia.org/wiki/Hoax">1</a></sup>. I won't discuss the causes of hoaxes further in this blog post.</p> +<h1 id="the-effect-of-hoaxes">The effect of hoaxes<a class="zola-anchor" href="#the-effect-of-hoaxes" aria-label="Anchor link for: the-effect-of-hoaxes">#</a></h1> +<p>Hoaxes can cause significant damage to their targets if formulated cleverly. For example:</p> +<blockquote> +<p>The stock price of Apple Inc. fell significantly in October 2008 after a hoax story was submitted to CNN's user-generated news site iReport.com claiming that company CEO Steve Jobs had suffered a major heart attack. The source of the story was traced back to 4chan.</p> +<ul> +<li>Excerpt from <a rel="nofollow noreferrer" href="https://en.wikipedia.org/wiki/4chan">the Wikipedia 4chan page</a></li> +</ul> +</blockquote> +<p>With the incredible presence of social media in our lives, spreading harmful misinformation like that above can be as simple as making a few posts - they don't even need to be very convincing! +What makes matters worse is how gullible the general population is, even those educated in this sort of thing - this shows <em>just</em> how much influence the internet and it's contents have on us.</p> +<p>I would like to clarify that I'm not suggesting that people should avoid using the internet to gather information - while its reliability is incredibly questionable, the accessibility and openness it provides far beats traditional methods of gathering information (books and such). My suggestion is that people should be much more careful with how they interpret information on the internet, +and perform their due diligence in their research into whatever they're aiming to learn; <strong>people should make sure that what they're reading is accurate before absorbing any information</strong> (here's your tl;dr).</p> +<p>That's about it for this blog post, as it was meant to be a brief way of expressing my thoughts on the matter. Thanks for reading!</p> + + + + Host your own private search engine with SearXNG + 2023-12-31T00:00:00+00:00 + 2023-12-31T00:00:00+00:00 + + https://devraza.duckdns.org/blog/selfhost-search-engine/ + <h1 id="introduction">Introduction<a class="zola-anchor" href="#introduction" aria-label="Anchor link for: introduction">#</a></h1> +<p><a rel="nofollow noreferrer" href="https://docs.searxng.org/">SearXNG</a>, put in its own words, is a 'free internet metasearch engine'. +Note that it describes itself as a <em>metasearch</em> engine specifically - unlike your traditional search engine like Google or Bing, SearXNG does things a little bit differently: +It aggregrates the results produced by search services like those aforementioned, and feeds them back to you.</p> +<p>Because of this key detail and a great deal of effort by those who've helped shape it, SearXNG protects your privacy, and does so very well:</p> +<ul> +<li>Private data from requests going to the search services it aggregrates results from is removed</li> +<li>It does <strong>not</strong> forward <em>anything</em> to any third parties through search services</li> +<li>Private data is <em>also</em> removed from requests going to the results pages</li> +</ul> +<p>Furthermore, SearXNG can be configured to use <a rel="nofollow noreferrer" href="https://torproject.org">Tor</a>.</p> +<p>However, the aspect of privacy isn't the only great selling feature of the engine; from my use of the engine so far, it's also great at...searching (is that a surprise?). The fact that it's a metasearch engine plays a key role in this, +as it provides SearXNG the ability to pull content more efficiently and gives <em>you</em> the ability to further tailor your experience.</p> +<h1 id="setting-up-searxng">Setting up SearXNG<a class="zola-anchor" href="#setting-up-searxng" aria-label="Anchor link for: setting-up-searxng">#</a></h1> +<h2 id="installing-the-service">Installing the service<a class="zola-anchor" href="#installing-the-service" aria-label="Anchor link for: installing-the-service">#</a></h2> +<p>As you may have expected if you've used NixOS for a while, searxng is packaged <em>and</em> has a service on NixOS. This makes setting it up just that much easier.</p> +<p>To get started, place somewhere in your <em>system</em> config the following:</p> +<pre data-lang="nix" style="background-color:#151515;color:#e8e8d3;" class="language-nix "><code class="language-nix" data-lang="nix"><span>{ +</span><span> </span><span style="color:#888888;"># ... +</span><span> </span><span style="color:#ffb964;">services</span><span>.</span><span style="color:#ffb964;">searx </span><span>= { +</span><span> </span><span style="color:#ffb964;">enable </span><span>= true; +</span><span> </span><span style="color:#ffb964;">settings </span><span>= { +</span><span> </span><span style="color:#ffb964;">server </span><span>= { +</span><span> </span><span style="color:#ffb964;">port </span><span>= </span><span style="color:#cf6a4c;">8888</span><span>; +</span><span> </span><span style="color:#ffb964;">bind_address </span><span>= </span><span style="color:#99ad6a;">&quot;127.0.0.1&quot;</span><span>; +</span><span> </span><span style="color:#ffb964;">secret_key </span><span>= </span><span style="color:#99ad6a;">&quot;@SEARX_SECRET_KEY@&quot;</span><span>; +</span><span> </span><span style="color:#ffb964;">base_url </span><span>= </span><span style="color:#99ad6a;">&quot;https://search.devraza.duckdns.org/&quot;</span><span>; </span><span style="color:#888888;"># replace with wherever you want to host yours +</span><span> }; +</span><span> }; +</span><span> }; +</span><span> </span><span style="color:#888888;"># ... +</span><span>} +</span></code></pre> +<p>The snippet above starts the <code>searx</code> systemd service for listening on port <code>8888</code>, and assumes a <code>base_url</code> of <code>https://search.devraza.duckdns.org</code>.</p> +<p>Now that we've got the actual <code>searx</code> instance running, we can now set up a reverse proxy allowing the service to be accessed remotely (whether this is within your local network or across the internet is up to you).</p> +<h2 id="setting-up-a-reverse-proxy">Setting up a reverse proxy<a class="zola-anchor" href="#setting-up-a-reverse-proxy" aria-label="Anchor link for: setting-up-a-reverse-proxy">#</a></h2> +<h3 id="what-is-a-reverse-proxy">What is a reverse proxy?<a class="zola-anchor" href="#what-is-a-reverse-proxy" aria-label="Anchor link for: what-is-a-reverse-proxy">#</a></h3> +<p>Before I get started with the technical details of setting this up, I'd like to briefly clarify what a reverse proxy exactly is (to my understanding).</p> +<p>Let's get the wikipedia definition of reverse proxy out of the way first:</p> +<blockquote> +<p>[...] a reverse proxy is an application that sits in front of back-end applications and forwards client requests to those applications. [...]</p> +</blockquote> +<p>However, you might be confused as to what this actually means; I'll give an example of the usage of reverse proxies to better explain this:</p> +<ul> +<li>Suppose you've got a few services running on a server (for demonstration purposes, let's name these <code>x</code>, <code>y</code> and <code>z</code>), each running on their own unique port.</li> +<li>Assuming you had a domain, and wanted to access all of these services from their own unique sub-domains (e.g. <code>x.yourdomain.com</code>, <code>y.yourdomain.com</code> and <code>z.yourdomain.com</code>), you would have to use a reverse proxy.</li> +<li>This reverse proxy would take in requests from clients going to sub-domains, and forward these requests to the appropriate port on your machine for the service being requested.</li> +</ul> +<p>The concept should be clear now, if it wasn't already.</p> +<h3 id="using-nginx-to-set-up-the-reverse-proxy">Using NGINX to set up the reverse proxy<a class="zola-anchor" href="#using-nginx-to-set-up-the-reverse-proxy" aria-label="Anchor link for: using-nginx-to-set-up-the-reverse-proxy">#</a></h3> +<p>NGINX is a popular web server that supports the creation of virtual hosts and the usage of reverse proxies. To accomodate our <code>searx</code> instance, we append the following to our NixOS server configuration:</p> +<pre data-linenos data-lang="nix" style="background-color:#151515;color:#e8e8d3;" class="language-nix "><code class="language-nix" data-lang="nix"><table><tbody><tr><td>1</td><td><span>{ +</span></td></tr><tr><td>2</td><td><span> </span><span style="color:#888888;"># ... +</span></td></tr><tr><td>3</td><td><span> </span><span style="color:#ffb964;">services</span><span>.</span><span style="color:#ffb964;">nginx </span><span>= { +</span></td></tr><tr><td>4</td><td><span> </span><span style="color:#ffb964;">enable </span><span>= true; +</span></td></tr><tr><td>5</td><td><span> </span><span style="color:#888888;"># any extra configuration here +</span></td></tr><tr><td>6</td><td><span> </span><span style="color:#ffb964;">virtualHosts </span><span>= { +</span></td></tr><tr><td>7</td><td><span> </span><span style="color:#99ad6a;">&quot;search&quot; </span><span>= { </span><span style="color:#888888;"># this can be anything, being an arbitrary identifier +</span></td></tr><tr><td>8</td><td><span> </span><span style="color:#ffb964;">forceSSL </span><span>= true; +</span></td></tr><tr><td>9</td><td><span> </span><span style="color:#ffb964;">serverName </span><span>= </span><span style="color:#99ad6a;">&quot;search.yourdomain.com&quot;</span><span>; </span><span style="color:#888888;"># replace this with whatever you&#39;re serving from +</span></td></tr><tr><td>10</td><td><span> </span><span style="color:#888888;"># SearX proxy +</span></td></tr><tr><td>11</td><td><span> </span><span style="color:#ffb964;">locations</span><span>.</span><span style="color:#99ad6a;">&quot;/&quot; </span><span>= { +</span></td></tr><tr><td><mark style="background-color:#010101;">12</mark></td><td><mark style="background-color:#010101;"><span> </span><span style="color:#ffb964;">proxyPass </span><span>= </span><span style="color:#99ad6a;">&quot;http://${toString </span><span style="color:#ffb964;">config</span><span style="color:#99ad6a;">.</span><span style="color:#ffb964;">services</span><span style="color:#99ad6a;">.</span><span style="color:#ffb964;">searx</span><span style="color:#99ad6a;">.</span><span style="color:#ffb964;">settings</span><span style="color:#99ad6a;">.</span><span style="color:#ffb964;">server</span><span style="color:#99ad6a;">.</span><span style="color:#ffb964;">bind_address</span><span style="color:#99ad6a;">}:${toString </span><span style="color:#ffb964;">config</span><span style="color:#99ad6a;">.</span><span style="color:#ffb964;">services</span><span style="color:#99ad6a;">.</span><span style="color:#ffb964;">searx</span><span style="color:#99ad6a;">.</span><span style="color:#ffb964;">settings</span><span style="color:#99ad6a;">.</span><span style="color:#ffb964;">server</span><span style="color:#99ad6a;">.</span><span style="color:#ffb964;">port</span><span style="color:#99ad6a;">}&quot;</span><span>; +</span></mark></td></tr><tr><td>13</td><td><span> </span><span style="color:#ffb964;">proxyWebsockets </span><span>= true; +</span></td></tr><tr><td>14</td><td><span> </span><span style="color:#ffb964;">recommendedProxySettings </span><span>= true; +</span></td></tr><tr><td>15</td><td><span> }; +</span></td></tr><tr><td>16</td><td><span> }; +</span></td></tr><tr><td>17</td><td><span> }; +</span></td></tr><tr><td>18</td><td><span> }; +</span></td></tr><tr><td>19</td><td><span> </span><span style="color:#888888;"># ... +</span></td></tr><tr><td>20</td><td><span>} +</span></td></tr></tbody></table></code></pre> +<blockquote class="callout note"> + + <div class="icon"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20"><path d="M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20ZM11 7H13V9H11V7ZM11 11H13V17H11V11Z" fill="currentColor"></path></svg> + </div> + <div class="content"> + + <p><strong>Note</strong></p> + + <p>The expression highlighted above is used to dynamically adjust the location NGINX will forward requests to, depending on your <code>searx</code> config</p> + + </div> +</blockquote> +<p>After saving your changes and rebuilding your server's system configuration (as usual), you should have a working <em>private</em> instance of SearXNG that you can access using the <code>serverName</code> you've given it.</p> +<p>Set your browser to use this as your search engine using the relevant documentation (with Firefox this is as easy as right-clicking on the URL after opening up the page and clicking a button). Enjoy!</p> + + + + Setting up Zola on NixOS + 2023-12-29T00:00:00+00:00 + 2023-12-29T00:00:00+00:00 + + https://devraza.duckdns.org/blog/setting-up-zola-nixos/ + <h1 id="introduction">Introduction<a class="zola-anchor" href="#introduction" aria-label="Anchor link for: introduction">#</a></h1> +<p><a rel="nofollow noreferrer" href="https://getzola.org">Zola</a> is a static site generator (similarly to the infamous <a rel="nofollow noreferrer" href="https://gohugo.io">Hugo</a>, which you may have already heard of) and is written in Rust. +It also happens to be the framework that this site is built on!</p> +<p>This blog post is a guide on setting up the site engine on NixOS specifically.</p> +<h1 id="installation">Installation<a class="zola-anchor" href="#installation" aria-label="Anchor link for: installation">#</a></h1> +<h2 id="installing-the-package">Installing the package<a class="zola-anchor" href="#installing-the-package" aria-label="Anchor link for: installing-the-package">#</a></h2> +<p><code>zola</code> is packaged in the nix package repository, so you just declaratively add the package to your configuration as usual: +For the purposes of this guide, zola can be installed either as a system or user package.</p> +<ul> +<li>As a system package:</li> +</ul> +<pre data-lang="nix" style="background-color:#151515;color:#e8e8d3;" class="language-nix "><code class="language-nix" data-lang="nix"><span>{ </span><span style="color:#ffb964;">pkgs</span><span>, ... }: { +</span><span> </span><span style="color:#888888;"># ... +</span><span> </span><span style="color:#ffb964;">environment</span><span>.</span><span style="color:#ffb964;">systemPackages </span><span>= with </span><span style="color:#ffb964;">pkgs</span><span>; [ +</span><span> </span><span style="color:#ffb964;">zola </span><span style="color:#888888;"># Append the package name to the list +</span><span> ]; +</span><span> </span><span style="color:#888888;"># ... +</span><span>} +</span></code></pre> +<ul> +<li>As a user package (with home-manager):</li> +</ul> +<pre data-lang="nix" style="background-color:#151515;color:#e8e8d3;" class="language-nix "><code class="language-nix" data-lang="nix"><span>{ </span><span style="color:#ffb964;">pkgs</span><span>, ... }: { +</span><span> </span><span style="color:#888888;"># ... +</span><span> </span><span style="color:#ffb964;">home</span><span>.</span><span style="color:#ffb964;">packages </span><span>= with </span><span style="color:#ffb964;">pkgs</span><span>; [ +</span><span> </span><span style="color:#ffb964;">zola </span><span style="color:#888888;"># Append the package name to the list +</span><span> ]; +</span><span> </span><span style="color:#888888;"># ... +</span><span>} +</span></code></pre> +<p>Now that <code>zola</code> itself is installed, we can move on setting up the pages it serves - continue reading...</p> +<h2 id="setting-up-a-theme">Setting up a theme<a class="zola-anchor" href="#setting-up-a-theme" aria-label="Anchor link for: setting-up-a-theme">#</a></h2> +<p>Zola actually has a section of its website showcasing several community-made themes which you can choose from to be the theme for your static site <a rel="nofollow noreferrer" href="https://getzola.org/themes/">here</a>.</p> +<p>Simply choose a theme that you like (demos are usually available for each theme listed) and follow its appropriate documentation to set it up - this site uses a version of the <a rel="nofollow noreferrer" href="https://www.getzola.org/themes/serene/">serene theme</a> with my custom colours.</p> +<blockquote class="callout note"> + + <div class="icon"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20"><path d="M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20ZM11 7H13V9H11V7ZM11 11H13V17H11V11Z" fill="currentColor"></path></svg> + </div> + <div class="content"> + + <p><strong>Custom themes</strong></p> + + <p>You can also make your own theme if that better suits you (I recommend giving the <a rel="nofollow noreferrer" href="https://getzola.org/documentation">documentation</a> a read if so).</p> + + </div> +</blockquote><h2 id="setting-up-nginx">Setting up NGINX<a class="zola-anchor" href="#setting-up-nginx" aria-label="Anchor link for: setting-up-nginx">#</a></h2> +<p>After selecting a theme (or making your own) you should now have a directory somewhere on your server containing your static site. +For the following snippet, we'll assume this is at <code>/var/lib/blog</code>.</p> +<p><a rel="nofollow noreferrer" href="https://nginx.com">NGINX</a> is a popular webserver which we're going to use for the purposes of hosting and serving our site. To do so, append the following somewhere in your configuration:</p> +<pre data-lang="nix" style="background-color:#151515;color:#e8e8d3;" class="language-nix "><code class="language-nix" data-lang="nix"><span style="color:#888888;"># ... +</span><span>{ +</span><span> </span><span style="color:#888888;"># ... +</span><span> </span><span style="color:#ffb964;">services</span><span>.</span><span style="color:#ffb964;">nginx </span><span>= { +</span><span> </span><span style="color:#ffb964;">enable </span><span>= true; +</span><span> </span><span style="color:#ffb964;">virtualHosts </span><span>= { +</span><span> </span><span style="color:#99ad6a;">&quot;blog&quot; </span><span>= { +</span><span> </span><span style="color:#ffb964;">forceSSL </span><span>= true; +</span><span> </span><span style="color:#ffb964;">serverName </span><span>= </span><span style="color:#99ad6a;">&quot;blog.devraza.duckdns.org&quot;</span><span>; </span><span style="color:#888888;"># replace this with wherever your site will be +</span><span> </span><span style="color:#ffb964;">root </span><span>= </span><span style="color:#99ad6a;">&quot;/var/lib/blog/public&quot;</span><span>; </span><span style="color:#888888;"># the path to the `public` folder in our site directory +</span><span> }; +</span><span> }; +</span><span> }; +</span><span> </span><span style="color:#888888;"># ... +</span><span>} +</span></code></pre> +<h1 id="finishing-up">Finishing up<a class="zola-anchor" href="#finishing-up" aria-label="Anchor link for: finishing-up">#</a></h1> +<p>You should now have your own static site built with Zola! You can use this for a bunch of things, like:</p> +<ul> +<li>Your personal blog (as I've done)</li> +<li>A way to showcase your projects (<a rel="nofollow noreferrer" href="https://blog.devraza.duckdns.org/projects">as I've also done</a>)</li> +<li>Hosting documentation (check out <a rel="nofollow noreferrer" href="https://www.getzola.org/themes/adidoks/">this Zola theme</a>, for example)</li> +</ul> +<blockquote class="callout question"> + + <div class="icon"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20"><path d="M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20ZM11 15H13V17H11V15ZM13 13.3551V14H11V12.5C11 11.9477 11.4477 11.5 12 11.5C12.8284 11.5 13.5 10.8284 13.5 10C13.5 9.17157 12.8284 8.5 12 8.5C11.2723 8.5 10.6656 9.01823 10.5288 9.70577L8.56731 9.31346C8.88637 7.70919 10.302 6.5 12 6.5C13.933 6.5 15.5 8.067 15.5 10C15.5 11.5855 14.4457 12.9248 13 13.3551Z" fill="currentColor"></path></svg> + </div> + <div class="content"> + + <p><strong>Help, my changes aren&#x27;t sticking!</strong></p> + + <p>When you make new markdown files (or any other changes to the structure of your site), remember to run <code>zola build</code> in your site directory (<code>/var/lib/blog</code>) for the changes to <em>build</em> into the actual site.</p> + + </div> +</blockquote> + + \ No newline at end of file diff --git a/public/blog/hoaxes-overview/index.html b/public/blog/hoaxes-overview/index.html new file mode 100644 index 0000000..ff4e576 --- /dev/null +++ b/public/blog/hoaxes-overview/index.html @@ -0,0 +1 @@ +An overview on hoaxes

An overview on hoaxes

2024-01-04

Introduction#

In recent times, hoaxes have become increasingly prevalent as the internet continues to expand and as more people use social media. Misinformation is on a rise - though this is information which isn't really new, the current state of things is horrible, and things really shouldn't be the way they are.

I aim for this to be a brief blog post detailing the effect of hoaxes on society, focusing on why they're so harmful.

What exactly is a hoax?#

Put simply, a hoax is made-up information, be it a story or something else. Hoaxes are created with the intent of spreading false information - for a immense variety of reasons, from jokes and causing embarrassment to provoking politic or social change1. I won't discuss the causes of hoaxes further in this blog post.

The effect of hoaxes#

Hoaxes can cause significant damage to their targets if formulated cleverly. For example:

The stock price of Apple Inc. fell significantly in October 2008 after a hoax story was submitted to CNN's user-generated news site iReport.com claiming that company CEO Steve Jobs had suffered a major heart attack. The source of the story was traced back to 4chan.

With the incredible presence of social media in our lives, spreading harmful misinformation like that above can be as simple as making a few posts - they don't even need to be very convincing! What makes matters worse is how gullible the general population is, even those educated in this sort of thing - this shows just how much influence the internet and it's contents have on us.

I would like to clarify that I'm not suggesting that people should avoid using the internet to gather information - while its reliability is incredibly questionable, the accessibility and openness it provides far beats traditional methods of gathering information (books and such). My suggestion is that people should be much more careful with how they interpret information on the internet, and perform their due diligence in their research into whatever they're aiming to learn; people should make sure that what they're reading is accurate before absorbing any information (here's your tl;dr).

That's about it for this blog post, as it was meant to be a brief way of expressing my thoughts on the matter. Thanks for reading!

powered by zola and serene
\ No newline at end of file diff --git a/public/blog/index.html b/public/blog/index.html new file mode 100644 index 0000000..7aa30fd --- /dev/null +++ b/public/blog/index.html @@ -0,0 +1 @@ +Blog Posts
Cybersecurity
Misconceptions about NFC 2024-01-19 An overview on hoaxes 2024-01-04
Guides
Take control of tailscale with headscale 2024-01-10 Host your own private search engine with SearXNG 2023-12-31 Setting up Zola on NixOS 2023-12-29
powered by zola and serene
\ No newline at end of file diff --git a/public/blog/nfc-misconceptions/index.html b/public/blog/nfc-misconceptions/index.html new file mode 100644 index 0000000..3dff515 --- /dev/null +++ b/public/blog/nfc-misconceptions/index.html @@ -0,0 +1 @@ +Misconceptions about NFC

Misconceptions about NFC

2024-01-19

Alert

I made a mistake while writing this blog post - somehow forgetting that security isn't unambiguous. You can actually skim NFC chips from a certain distance (having a limited distance is still an important factor though!), and though I think some of what I said below still applies you're better off ignoring it all.

There are, of course, a whole range of problems with skimming NFC chips from a distance so my point - don't be so worried - would still stand.

Either way, I recommend you take this with a grain of salt.

Introduction#

NFC (short for Near-Field Communication) is the set of communication protocols which allow for near-field communication between two electronic devices. One of the most prominent uses of this technology are contactless transactions - this includes services like Google and Apple Pay as well as all of your contactless-enabled cards.

It's been a while since my last blog past, but this one will be brief too - I'm writing here for the sake of clearing up some misconceptions people have about NFC.

The Misconceptions#

Inspiration#

While talking with a friend on a WhatsApp group chat a few days ago about a program I found on my jailbroken iOS device - Aemulo - I was informed of 'subway skimmers'; devices that could supposedly read data from contactless-enabled devices (via NFC) and would be able to emulate them.

The idea behind the above example was that someone with malicious intent could place such a device in a public location and take their contactless devices for their malicious purposes. When I heard of this, my first thought was: hoax, and I think that it was rightfully so.

What exactly is wrong with this?#

Several things. I'm no expert in cybersecurity - everyone's a student in some way, but I was sure that NFC was, as it's name implies, for near-field communication. I'm repeating myself here, but that's kind of the point. Various reliable resources, including Wikipedia, show that NFC has a maximum range of only a few centimetres - which makes sense, no?

And yet, whatever source my friend had for 'subway skimmers' gave the impression, or otherwise stated, that it would work within a radius of a few feet, which is just impossible. Upon voicing my doubts, I was then told that 'with a powerful enough antenna, it's possible'. Hoaxes sure are convincing, aren't they? Unfortunately, I am not able to find the source of my friend's misinformation.

See, NFC only works within a few centimetres anyways. Even if it could magically work within a radius of a few feet, you've got to take in the electromagnetic interference that the clothes and wallets people have would bring to any malicious device. The point of electromagnetic interference is especially true over a huge area of a few feet (relatively), where you've got several NFC-enabled devices.

Where it's actually an issue#

Of course, that isn't to say there aren't any issues with NFC and malicious readers - I'm just saying that the word getting around is horribly unrealistic. For example, a realistic example of a malicious NFC reader would be one placed on the card slots in cash machines - you get:

  • The short range (< ~20 cm)
  • Only one device
  • Lots of devices to read!

And so, you've got someone so much more realistic that poses an actual threat!

Conclusion#

The information above, which I deem accurate, is there. What I suggest be taken away from this is pretty much the same as what is was for my blog post on hoaxes - do some fact-checking!

powered by zola and serene
\ No newline at end of file diff --git a/public/blog/selfhost-search-engine/index.html b/public/blog/selfhost-search-engine/index.html new file mode 100644 index 0000000..dc9fe37 --- /dev/null +++ b/public/blog/selfhost-search-engine/index.html @@ -0,0 +1,36 @@ +Host your own private search engine with SearXNG

Host your own private search engine with SearXNG

2023-12-31

Introduction#

SearXNG, put in its own words, is a 'free internet metasearch engine'. Note that it describes itself as a metasearch engine specifically - unlike your traditional search engine like Google or Bing, SearXNG does things a little bit differently: It aggregrates the results produced by search services like those aforementioned, and feeds them back to you.

Because of this key detail and a great deal of effort by those who've helped shape it, SearXNG protects your privacy, and does so very well:

  • Private data from requests going to the search services it aggregrates results from is removed
  • It does not forward anything to any third parties through search services
  • Private data is also removed from requests going to the results pages

Furthermore, SearXNG can be configured to use Tor.

However, the aspect of privacy isn't the only great selling feature of the engine; from my use of the engine so far, it's also great at...searching (is that a surprise?). The fact that it's a metasearch engine plays a key role in this, as it provides SearXNG the ability to pull content more efficiently and gives you the ability to further tailor your experience.

Setting up SearXNG#

Installing the service#

As you may have expected if you've used NixOS for a while, searxng is packaged and has a service on NixOS. This makes setting it up just that much easier.

To get started, place somewhere in your system config the following:

{
+    # ...
+    services.searx = {
+    enable = true;
+      settings = {
+        server = {
+          port = 8888;
+          bind_address = "127.0.0.1";
+          secret_key = "@SEARX_SECRET_KEY@";
+          base_url = "https://search.devraza.duckdns.org/"; # replace with wherever you want to host yours
+        };
+      };
+    };
+    # ...
+}
+

The snippet above starts the searx systemd service for listening on port 8888, and assumes a base_url of https://search.devraza.duckdns.org.

Now that we've got the actual searx instance running, we can now set up a reverse proxy allowing the service to be accessed remotely (whether this is within your local network or across the internet is up to you).

Setting up a reverse proxy#

What is a reverse proxy?#

Before I get started with the technical details of setting this up, I'd like to briefly clarify what a reverse proxy exactly is (to my understanding).

Let's get the wikipedia definition of reverse proxy out of the way first:

[...] a reverse proxy is an application that sits in front of back-end applications and forwards client requests to those applications. [...]

However, you might be confused as to what this actually means; I'll give an example of the usage of reverse proxies to better explain this:

  • Suppose you've got a few services running on a server (for demonstration purposes, let's name these x, y and z), each running on their own unique port.
  • Assuming you had a domain, and wanted to access all of these services from their own unique sub-domains (e.g. x.yourdomain.com, y.yourdomain.com and z.yourdomain.com), you would have to use a reverse proxy.
  • This reverse proxy would take in requests from clients going to sub-domains, and forward these requests to the appropriate port on your machine for the service being requested.

The concept should be clear now, if it wasn't already.

Using NGINX to set up the reverse proxy#

NGINX is a popular web server that supports the creation of virtual hosts and the usage of reverse proxies. To accomodate our searx instance, we append the following to our NixOS server configuration:

1{ +
2 # ... +
3 services.nginx = { +
4 enable = true; +
5 # any extra configuration here +
6 virtualHosts = { +
7 "search" = { # this can be anything, being an arbitrary identifier +
8 forceSSL = true; +
9 serverName = "search.yourdomain.com"; # replace this with whatever you're serving from +
10 # SearX proxy +
11 locations."/" = { +
12 proxyPass = "http://${toString config.services.searx.settings.server.bind_address}:${toString config.services.searx.settings.server.port}"; +
13 proxyWebsockets = true; +
14 recommendedProxySettings = true; +
15 }; +
16 }; +
17 }; +
18 }; +
19 # ... +
20} +

Note

The expression highlighted above is used to dynamically adjust the location NGINX will forward requests to, depending on your searx config

After saving your changes and rebuilding your server's system configuration (as usual), you should have a working private instance of SearXNG that you can access using the serverName you've given it.

Set your browser to use this as your search engine using the relevant documentation (with Firefox this is as easy as right-clicking on the URL after opening up the page and clicking a button). Enjoy!

powered by zola and serene
\ No newline at end of file diff --git a/public/blog/selfhost-tailscale/index.html b/public/blog/selfhost-tailscale/index.html new file mode 100644 index 0000000..d8980fa --- /dev/null +++ b/public/blog/selfhost-tailscale/index.html @@ -0,0 +1,34 @@ +Take control of tailscale with headscale

Take control of tailscale with headscale

2024-01-10

Tailscale#

Tailscale is a modern tunnel VPN service based on WireGuard® which provides a 'free' and secure means of communication between devices within a tailnet - a private network which Tailscale provides its users.

Essentially, it provides a private and secure way of accessing any of your devices, no matter where you are in the world - a personal WAN encompassing the entire world.

And on top of this, Tailscale is completely free and open-source! At least, on the surface...

Not FOSS? What do you mean?#

There's a quite popular saying within the free and open-source software community, which goes along the lines of:

If you aren't paying for the product, then you are the product.

Which makes perfect sense. It's the modern era so anything significant is powered by some form of modern technology, data is the new oil, and so on. In exchange for offering you 'free' services, companies collect and use your data; while there supposedly are laws in place preventing the inconcensual collection of data in most countries around the world, your personal data may still be traded unethically and inconsensually.

I personally am of the opinion that these laws are worth absolutely nothing if people aren't educated in how their data is being used, and what specifically is being collected. But I digress, and that's a blog post for another time.

I also think it's quite unfortunate that users of paid services still have their personal data collected in the unethical manner outlined above, despite the fact that they are paying for the service...

In the context of Tailscale: while their clients are all open-source, their control server - the thing that's managing and rerouting everything going through what they advertise as your 'secure' VPN, isn't. You've got no idea what this thing is doing with the traffic it recieves.

Headscale#

For every problem, there's probably a solution somewhere. And luckily for this one (which may or may not actually be a problem for you), we've got Headscale as our solution. Headscale's a self-hostable, open-source alternative to the Tailscale control server, and aims to 'provide self-hosters and hobbyists with an open-source server they can use for their projects and labs'.

Installing on NixOS#

Moving on to installing and setting up Headscale on NixOS.

# ...
+{
+  # ...
+  services.headscale = {
+    enable = true;
+    address = "0.0.0.0";
+    port = 7070;
+    settings = {
+      logtail.enabled = false;
+      server_url = "https://headscale.devraza.duckdns.org";
+      dns_config.base_domain = "devraza.duckdns.org"; 
+    };
+  };
+  # ...
+}
+

This starts up the headscale systemd service on our host machine at port 7070. After that, we make Headscale available over the clearnet with an NGINX reverse proxy, per the usual:

{
+  services.nginx = {
+    enable = true;
+    virtualHosts = {
+      "headscale" = {
+        addSSL = true;
+        serverName = "headscale.devraza.duckdns.org";
+        sslCertificate = ./services/nginx/certs/subdomains/fullchain.pem;
+        sslCertificateKey = ./services/nginx/certs/subdomains/privkey.pem;
+        # Headscale proxy
+        locations."/" = {
+          proxyPass = "http://127.0.0.1:${toString config.services.headscale.port}";
+          proxyWebsockets = true;
+        };
+      };
+    };
+  };
+}
+

And that's it. A self-hosted, truly open-source Wireguard®-based VPN is now at your fingertips. Enjoy! Oh, but please read the conclusion before doing that:

Conclusion#

For those of you who wish to have access to something like Tailscale but value your privacy above all, you would genuinely be greatful for Headscale. However, I've found that some are fine with what Tailscale does provide in regards to FOSS, and are satisfied by the raw convenience and simplicity of a non-selfhosted Tailscale control server - exactly what it hopes to provide, as shown by their self-description on their website: 'a zero-config, no-fuss VPN [provider]'.

Or you could just settle with bare Wireguard®.

powered by zola and serene
\ No newline at end of file diff --git a/public/blog/setting-up-zola-nixos/index.html b/public/blog/setting-up-zola-nixos/index.html new file mode 100644 index 0000000..a6dbacd --- /dev/null +++ b/public/blog/setting-up-zola-nixos/index.html @@ -0,0 +1,30 @@ +Setting up Zola on NixOS

Setting up Zola on NixOS

2023-12-29

Introduction#

Zola is a static site generator (similarly to the infamous Hugo, which you may have already heard of) and is written in Rust. It also happens to be the framework that this site is built on!

This blog post is a guide on setting up the site engine on NixOS specifically.

Installation#

Installing the package#

zola is packaged in the nix package repository, so you just declaratively add the package to your configuration as usual: For the purposes of this guide, zola can be installed either as a system or user package.

  • As a system package:
{ pkgs, ... }: {
+    # ...
+    environment.systemPackages = with pkgs; [
+        zola # Append the package name to the list
+    ];
+    # ...
+}
+
  • As a user package (with home-manager):
{ pkgs, ... }: {
+    # ...
+    home.packages = with pkgs; [
+        zola # Append the package name to the list
+    ];
+    # ...
+}
+

Now that zola itself is installed, we can move on setting up the pages it serves - continue reading...

Setting up a theme#

Zola actually has a section of its website showcasing several community-made themes which you can choose from to be the theme for your static site here.

Simply choose a theme that you like (demos are usually available for each theme listed) and follow its appropriate documentation to set it up - this site uses a version of the serene theme with my custom colours.

Custom themes

You can also make your own theme if that better suits you (I recommend giving the documentation a read if so).

Setting up NGINX#

After selecting a theme (or making your own) you should now have a directory somewhere on your server containing your static site. For the following snippet, we'll assume this is at /var/lib/blog.

NGINX is a popular webserver which we're going to use for the purposes of hosting and serving our site. To do so, append the following somewhere in your configuration:

# ...
+{
+    # ...
+    services.nginx = {
+        enable = true;
+        virtualHosts = {
+            "blog" = {
+                forceSSL = true;
+                serverName = "blog.devraza.duckdns.org"; # replace this with wherever your site will be
+                root = "/var/lib/blog/public"; # the path to the `public` folder in our site directory
+            };
+        };
+    };
+    # ...
+}
+

Finishing up#

You should now have your own static site built with Zola! You can use this for a bunch of things, like:

Help, my changes aren't sticking!

When you make new markdown files (or any other changes to the structure of your site), remember to run zola build in your site directory (/var/lib/blog) for the changes to build into the actual site.

powered by zola and serene
\ No newline at end of file diff --git a/public/categories/cybersecurity/index.html b/public/categories/cybersecurity/index.html new file mode 100644 index 0000000..e69de29 diff --git a/public/categories/guides/index.html b/public/categories/guides/index.html new file mode 100644 index 0000000..e69de29 diff --git a/public/categories/index.html b/public/categories/index.html new file mode 100644 index 0000000..e69de29 diff --git a/public/giscus_dark.css b/public/giscus_dark.css new file mode 100644 index 0000000..bba962f --- /dev/null +++ b/public/giscus_dark.css @@ -0,0 +1 @@ +main{--primary-default: 109, 155, 255;--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/public/giscus_light.css b/public/giscus_light.css new file mode 100644 index 0000000..660fa5c --- /dev/null +++ b/public/giscus_light.css @@ -0,0 +1 @@ +main{--primary-default: 109, 155, 255;--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/public/hl-dark.css b/public/hl-dark.css new file mode 100644 index 0000000..d6c9651 --- /dev/null +++ b/public/hl-dark.css @@ -0,0 +1,74 @@ +/* + * theme "Tomorrow Night" generated by syntect + */ + +.z-code { + color: #c5c8c6; +} + +.z-comment, .z-string.z-quoted.z-double.z-block.z-python { + color: #999999; +} +.z-keyword.z-operator.z-class, .z-constant.z-other, .z-source.z-php.z-embedded.z-line { + color: #ced1cf; +} +.z-variable, .z-support.z-other.z-variable, .z-string.z-other.z-link, .z-string.z-regexp, .z-entity.z-name.z-tag, .z-entity.z-other.z-attribute-name, .z-meta.z-tag, .z-declaration.z-tag { + color: #a67878; +} +.z-constant.z-numeric, .z-constant.z-language, .z-support.z-constant, .z-constant.z-character, .z-variable.z-parameter, .z-punctuation.z-section.z-embedded, .z-keyword.z-other.z-unit { + color: #e08355; +} +.z-type, .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class, .z-support.z-type, .z-support.z-class { + color: #6a8f8a; +} +.z-string, .z-constant.z-other.z-symbol, .z-entity.z-other.z-inherited-class, .z-markup.z-heading { + color: #85ad74; +} +.z-keyword.z-operator, .z-constant.z-other.z-color { + color: #6a8f8a; +} +.z-entity.z-name.z-function, .z-meta.z-function-call, .z-support.z-function, .z-keyword.z-other.z-special-method, .z-meta.z-block-level { + color: #81a2be; +} +.z-keyword, .z-storage, .z-storage.z-type, .z-entity.z-name.z-tag.z-css { + color: #b294bb; +} +.z-invalid { + color: #ced2cf; + background-color: #df5f5f; +} +.z-meta.z-separator { + color: #ced2cf; + background-color: #82a3bf; +} +.z-invalid.z-deprecated { + color: #ced2cf; + background-color: #b798bf; +} +.z-markup.z-inserted.z-diff, .z-markup.z-deleted.z-diff, .z-meta.z-diff.z-header.z-to-file, .z-meta.z-diff.z-header.z-from-file { + color: #ffffff; +} +.z-markup.z-inserted.z-diff, .z-meta.z-diff.z-header.z-to-file { + color: #5fe375; + background-color: #000000; +} +.z-markup.z-deleted.z-diff, .z-meta.z-diff.z-header.z-from-file { + color: #d46565; +} +.z-meta.z-diff.z-header.z-from-file, .z-meta.z-diff.z-header.z-to-file { + color: #ffffff; + background-color: #4271ae; +} +.z-meta.z-diff.z-range { + color: #3e999f; +font-style: italic; +} +.z-markup.z-deleted { + color: #f92672; +} +.z-markup.z-inserted { + color: #a6e22e; +} +.z-markup.z-changed { + color: #967efb; +} diff --git a/public/hl-light.css b/public/hl-light.css new file mode 100644 index 0000000..bded504 --- /dev/null +++ b/public/hl-light.css @@ -0,0 +1,64 @@ +/* + * theme "Tomorrow" generated by syntect + */ + +.z-code { + color: #4d4d4c; +} + +.z-comment, .z-string.z-quoted.z-double.z-block.z-python { + color: #999999; +} +.z-keyword.z-operator.z-class, .z-constant.z-other, .z-source.z-php.z-embedded.z-line { + color: #666969; +} +.z-variable, .z-support.z-other.z-variable, .z-string.z-other.z-link, .z-string.z-regexp, .z-entity.z-name.z-tag, .z-entity.z-other.z-attribute-name, .z-meta.z-tag, .z-declaration.z-tag { + color: #a67878; +} +.z-constant.z-numeric, .z-constant.z-language, .z-support.z-constant, .z-constant.z-character, .z-variable.z-parameter, .z-punctuation.z-section.z-embedded, .z-keyword.z-other.z-unit { + color: #e08355; +} +.z-type, .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class, .z-support.z-type, .z-support.z-class { + color: #568a8f; +} +.z-string, .z-constant.z-other.z-symbol, .z-entity.z-other.z-inherited-class, .z-markup.z-heading { + color: #85ad74; +} +.z-keyword.z-operator, .z-constant.z-other.z-color { + color: #568a8f; +} +.z-entity.z-name.z-function, .z-meta.z-function-call, .z-support.z-function, .z-keyword.z-other.z-special-method, .z-meta.z-block-level { + color: #4271ae; +} +.z-keyword, .z-storage, .z-storage.z-type { + color: #8959a8; +} +.z-invalid { + color: #ffffff; + background-color: #df5f5f; +} +.z-meta.z-separator { + color: #ffffff; + background-color: #4271ae; +} +.z-invalid.z-deprecated { + color: #ffffff; + background-color: #8959a8; +} +.z-markup.z-inserted.z-diff, .z-markup.z-deleted.z-diff, .z-meta.z-diff.z-header.z-to-file, .z-meta.z-diff.z-header.z-from-file { + color: #ffffff; +} +.z-markup.z-inserted.z-diff, .z-meta.z-diff.z-header.z-to-file { + background-color: #65c23a; +} +.z-markup.z-deleted.z-diff, .z-meta.z-diff.z-header.z-from-file { + background-color: #c82829; +} +.z-meta.z-diff.z-header.z-from-file, .z-meta.z-diff.z-header.z-to-file { + color: #ffffff; + background-color: #4271ae; +} +.z-meta.z-diff.z-range { + color: #3e999f; +font-style: italic; +} diff --git a/public/icon/alert.svg b/public/icon/alert.svg new file mode 100644 index 0000000..0ab867b --- /dev/null +++ b/public/icon/alert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/arrow-up.svg b/public/icon/arrow-up.svg new file mode 100644 index 0000000..f210d57 --- /dev/null +++ b/public/icon/arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/backlink.svg b/public/icon/backlink.svg new file mode 100644 index 0000000..1fa5351 --- /dev/null +++ b/public/icon/backlink.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/check.svg b/public/icon/check.svg new file mode 100644 index 0000000..dfbcaa3 --- /dev/null +++ b/public/icon/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/copy.svg b/public/icon/copy.svg new file mode 100644 index 0000000..21b1c15 --- /dev/null +++ b/public/icon/copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/email.svg b/public/icon/email.svg new file mode 100644 index 0000000..c481715 --- /dev/null +++ b/public/icon/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/fingerprint.svg b/public/icon/fingerprint.svg new file mode 100644 index 0000000..84b985c --- /dev/null +++ b/public/icon/fingerprint.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/github.svg b/public/icon/github.svg new file mode 100644 index 0000000..d7f6dff --- /dev/null +++ b/public/icon/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/important.svg b/public/icon/important.svg new file mode 100644 index 0000000..d4356a4 --- /dev/null +++ b/public/icon/important.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/moon.svg b/public/icon/moon.svg new file mode 100644 index 0000000..19f378e --- /dev/null +++ b/public/icon/moon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/note.svg b/public/icon/note.svg new file mode 100644 index 0000000..7e6118c --- /dev/null +++ b/public/icon/note.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/question.svg b/public/icon/question.svg new file mode 100644 index 0000000..9611d3a --- /dev/null +++ b/public/icon/question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/rss.svg b/public/icon/rss.svg new file mode 100644 index 0000000..481a430 --- /dev/null +++ b/public/icon/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/sun.svg b/public/icon/sun.svg new file mode 100644 index 0000000..c7cc2eb --- /dev/null +++ b/public/icon/sun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/tip.svg b/public/icon/tip.svg new file mode 100644 index 0000000..36f7a57 --- /dev/null +++ b/public/icon/tip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/toc.svg b/public/icon/toc.svg new file mode 100644 index 0000000..91bd824 --- /dev/null +++ b/public/icon/toc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/twitter.svg b/public/icon/twitter.svg new file mode 100644 index 0000000..457a783 --- /dev/null +++ b/public/icon/twitter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icon/warning.svg b/public/icon/warning.svg new file mode 100644 index 0000000..6b90b3e --- /dev/null +++ b/public/icon/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/avatar.webp b/public/img/avatar.webp new file mode 100644 index 0000000000000000000000000000000000000000..a6dfac1e293908d7501c941ae6fdb821c0b8b78f GIT binary patch literal 25616 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 E04#kRA^-pY literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..1e82c3f --- /dev/null +++ b/public/index.html @@ -0,0 +1 @@ +Devraza
avatar
Muhammad Nauman Raza@devraza
Programming and cybersecurity

I'm a moderately skilled programmer, beginner in the field of cybersecurity and aspiring graphic designer. NixOS is my operating system of choice, and quark.nvim (my bespoke distribution of neovim) is my text editor.

I also happen to be a devoted rustacean and a devout follower of the self-hosted way of life.

My skills in programming and scripting languages I've used so far are as follows:

  • Advanced: Python, Go
  • Intermediate: Rust, Nix, Bash, E-Lisp
  • Beginner: Julia, Lua

However, I consider myself able to work to a reasonable degree with any modern programming language.

Other tools that I can work with include git, linux, inkscape, and GIMP.

\ No newline at end of file diff --git a/public/js/lightense.min.js b/public/js/lightense.min.js new file mode 100644 index 0000000..1f979a6 --- /dev/null +++ b/public/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/public/js/main.js b/public/js/main.js new file mode 100644 index 0000000..3589fc0 --- /dev/null +++ b/public/js/main.js @@ -0,0 +1,166 @@ +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; + localStorage.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() { + toggleGiscusTheme(localStorage.getItem("theme") || (preferDark.matches ? "dark" : "light")); + window.removeEventListener('message', initGiscusTheme); + } + window.addEventListener('message', initGiscusTheme); + themeToggle.addEventListener('click', () => toggleTheme(localStorage.getItem("theme") == "dark" ? "light" : "dark")); + preferDark.addEventListener("change", e => toggleTheme(e.matches ? "dark" : "light")); + if (!localStorage.getItem("theme") && preferDark.matches) toggleTheme("dark"); + if (localStorage.getItem("theme") == "dark") toggleTheme("dark"); +} + +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 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 aside = document.querySelector('aside'); + tocToggle.addEventListener('click', () => { + tocToggle.classList.toggle('active'); + aside.classList.toggle('shown'); + }); +} + +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 actived = null; + const observer = new IntersectionObserver((entries) => entries.forEach(entry => { + if (entry.isIntersecting) { + const target = tocMap.get(entry.target); + if (target == actived) return; + if (actived) actived.classList.remove('active'); + target.classList.add('active'); + actived = target; + } + }), { rootMargin: '-9% 0px -90% 0px' }); + headers.forEach(header => observer.observe(header)); +} + +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); + }, 2000); + }); + }; + 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(); +enableNavFold(); +if (document.body.classList.contains('post')) { + enableOutdateAlert(); + enableTocToggle(); + enableTocIndicate(); + addBackToTopBtn(); +} +if (document.querySelector('.prose')) { + addCopyBtns(); + addFootnoteBacklink(); + enableImgLightense(); +} diff --git a/public/main.css b/public/main.css new file mode 100644 index 0000000..b38c108 --- /dev/null +++ b/public/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)}@media screen and (min-width: 425px){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:65px;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: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}.prose p{font-size:1em;line-height:inherit;word-wrap:break-word}.prose a{color:var(--primary-color);text-decoration-color:var(--primary-pale-color);text-decoration-thickness:1.5px}.prose a:hover{text-decoration-color:var(--primary-color)}@media (max-width: 425px){.prose a{text-decoration-color:unset;text-decoration-thickness:auto}}.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:3px var(--primary-pale-color) solid;padding-left:16px;margin:0 0 24px 0;color:var(--text-pale-color)}.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:.8em;padding:1px 6px;margin:0 2px;color:var(--primary-color);background-color:var(--primary-pale-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);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{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{color:var(--primary-color)}.prose .codeblock .copy svg{width:20px;height:20px}.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)}.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:45px;margin:0 auto;max-width:var(--main-max-width);display:flex;flex-direction:column;justify-content:space-between}body.prose-page article{padding:45px 15px 30px;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.3em;margin:2em 15px 1em}.layout-list .post-list{margin-top:25px}.layout-list .post{display:flex;justify-content:space-between;align-items:flex-end;gap:5px;padding:6px 15px;margin:1px 0;border-radius:2px;font-size:1.1em;text-decoration:none;color:var(--primary-color);-webkit-tap-highlight-color:rgba(0,0,0,0)}.layout-list .post:hover{background-color:var(--primary-pale-color)}@media (max-width: 768px){.layout-list .post{font-size:1em;margin:2.5px 5px;padding:5px 10px}}.layout-list .post .date{white-space:nowrap}body.homepage #wrapper{width:100%;min-height:100vh;display:flex;justify-content:center;align-items:center}body.homepage main{width:100%;max-width:var(--homepage-max-width);padding:3em 0 6em}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{font-size:1.25em;display:flex;flex-direction:column;justify-content:space-around}body.homepage #info #id{margin-left:.5em;color:var(--primary-color)}body.homepage #info #bio{font-size:.85em}body.homepage #links{padding:0 15px;margin:1.25em 0 1.75em;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:.5em 1em;font-size:1.25em}body.homepage #links a,body.homepage #links button{text-decoration:none;color:var(--text-color)}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:24px}body.homepage #links #right{display:flex;gap:.5em;margin-left:auto}body.homepage #links #right a,body.homepage #links #right button{width:24px;height:24px}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;font-size:1.15em;line-height:1.5}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(8px);backdrop-filter:blur(8px)}}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.4em;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:24px;height:24px;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)}}footer{font-size:.95rem;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:60px 0}body.post #wrapper{display:flex;justify-content:space-between;font-size:18px}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}body.post article #tags a span{font-size:.95em;margin-right:2px}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:195px;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 - 50px - 5em);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;right:-100%;top:45px;margin-top:0;min-width:260px;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 0}body.post aside ul{padding-left:10px}body.post aside #back-to-top{display:none}@supports (-webkit-backdrop-filter: none) or (backdrop-filter: none){body.post aside.blur{background-color:fade(var(--bg-color), 75%);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}}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:40px;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:2em}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:.5em;color:var(--primary-color)}body.tag-single .post{display:flex;justify-content:space-between;align-items:flex-end;gap:5px;padding:6px 15px;margin:1px 0;border-radius:2px;font-size:1.1em;text-decoration:none;color:var(--primary-color);-webkit-tap-highlight-color:rgba(0,0,0,0)}body.tag-single .post:hover{background-color:var(--primary-pale-color)}body.tag-single .post .date{white-space:nowrap}@media screen and (max-width: 768px){body.tag-single .post{font-size:1em;margin:2.5px 5px;padding:5px 10px}}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:90px auto 40px}body.projects .proj{margin:0px 15px 45px}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{color:var(--primary-color);text-decoration:underline var(--primary-pale-color) 2px}body.projects .proj .desc a:hover{text-decoration-color:var(--primary-color)}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{font-size:.9em;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}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:2em;color:var(--text-pale-color)}body.not-found .spacer{background:var(--text-pale-color);width:2px;height:.75em;margin:0 .5em}body.not-found .text{font-size:.85em}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/public/projects/data.toml b/public/projects/data.toml new file mode 100644 index 0000000..73bac3a --- /dev/null +++ b/public/projects/data.toml @@ -0,0 +1,39 @@ +[[project]] +name = "DianciEmacs" +desc = "A minimal and elegant Emacs configuration framework." +tags = ["emacs", "config", "diancie"] +links = [ + { name = "git", url = "https://git.devraza.duckdns.org/devraza/dianciemacs" }, +] + +[[project]] +name = "Kagayaki for Emacs" +desc = "A gorgeously soft colorscheme for Emacs." +tags = ["emacs", "colorscheme", "theme", "dark"] +links = [ + { name = "git", url = "https://git.devraza.duckdns.org/devraza/kagayaki-emacs" }, +] + +[[project]] +name = "Ambition" +desc = "A textual fast-paced 2D MMORPG written in Rust." +tags = ["rust", "bevy", "mmorpg"] +links = [ + { name = "git", url = "https://git.devraza.duckdns.org/devraza/ambition" }, +] + +[[project]] +name = "quark.nvim" +desc = "A fast and minimal Neovim configuration framework. `[Deprecated]`" +tags = ["neovim"] +links = [ + { name = "git", url = "https://git.devraza.duckdns.org/devraza/quark.nvim" }, +] + +[[project]] +name = "particle.nvim" +desc = "A gorgeously soft colorscheme for Neovim. `[Deprecated]`" +tags = ["neovim", "colorscheme"] +links = [ + { name = "git", url = "https://git.devraza.duckdns.org/devraza/particle.nvim" }, +] diff --git a/public/projects/index.html b/public/projects/index.html new file mode 100644 index 0000000..8ebdaa0 --- /dev/null +++ b/public/projects/index.html @@ -0,0 +1 @@ +Projects

DianciEmacs

A minimal and elegant Emacs configuration framework.

#emacs
#config
#diancie

Kagayaki for Emacs

A gorgeously soft colorscheme for Emacs.

#emacs
#colorscheme
#theme
#dark

Ambition

A textual fast-paced 2D MMORPG written in Rust.

#rust
#bevy
#mmorpg

quark.nvim

A fast and minimal Neovim configuration framework. [Deprecated]

#neovim

particle.nvim

A gorgeously soft colorscheme for Neovim. [Deprecated]

#neovim
#colorscheme
powered by zola and serene
\ No newline at end of file diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..50673d6 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Disallow: +Allow: / +Sitemap: https://devraza.duckdns.org/sitemap.xml diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..35d45c9 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,77 @@ + + + + https://devraza.duckdns.org/ + + + https://devraza.duckdns.org/blog/ + + + https://devraza.duckdns.org/blog/hoaxes-overview/ + 2024-01-04 + + + https://devraza.duckdns.org/blog/nfc-misconceptions/ + 2024-01-19 + + + https://devraza.duckdns.org/blog/selfhost-search-engine/ + 2023-12-31 + + + https://devraza.duckdns.org/blog/selfhost-tailscale/ + 2024-01-10 + + + https://devraza.duckdns.org/blog/setting-up-zola-nixos/ + 2023-12-29 + + + https://devraza.duckdns.org/categories/ + + + https://devraza.duckdns.org/categories/cybersecurity/ + + + https://devraza.duckdns.org/categories/guides/ + + + https://devraza.duckdns.org/projects/ + + + https://devraza.duckdns.org/tags/ + + + https://devraza.duckdns.org/tags/hacking/ + + + https://devraza.duckdns.org/tags/headscale/ + + + https://devraza.duckdns.org/tags/hoax/ + + + https://devraza.duckdns.org/tags/nfc/ + + + https://devraza.duckdns.org/tags/nixos/ + + + https://devraza.duckdns.org/tags/privacy/ + + + https://devraza.duckdns.org/tags/searxng/ + + + https://devraza.duckdns.org/tags/selfhosted/ + + + https://devraza.duckdns.org/tags/social-engineering/ + + + https://devraza.duckdns.org/tags/tailscale/ + + + https://devraza.duckdns.org/tags/zola/ + + diff --git a/public/tags/hacking/index.html b/public/tags/hacking/index.html new file mode 100644 index 0000000..71d657d --- /dev/null +++ b/public/tags/hacking/index.html @@ -0,0 +1,3 @@ +Blog Posts
# hackingAll Tags
Misconceptions about NFC 2024-01-19
powered by zola and serene
\ No newline at end of file diff --git a/public/tags/headscale/index.html b/public/tags/headscale/index.html new file mode 100644 index 0000000..ad85f06 --- /dev/null +++ b/public/tags/headscale/index.html @@ -0,0 +1,3 @@ +Blog Posts
# headscaleAll Tags
Take control of tailscale with headscale 2024-01-10
powered by zola and serene
\ No newline at end of file diff --git a/public/tags/hoax/index.html b/public/tags/hoax/index.html new file mode 100644 index 0000000..a0f3070 --- /dev/null +++ b/public/tags/hoax/index.html @@ -0,0 +1,3 @@ +Blog Posts
# hoaxAll Tags
An overview on hoaxes 2024-01-04
powered by zola and serene
\ No newline at end of file diff --git a/public/tags/index.html b/public/tags/index.html new file mode 100644 index 0000000..cae1e51 --- /dev/null +++ b/public/tags/index.html @@ -0,0 +1,3 @@ +Tags
\ No newline at end of file diff --git a/public/tags/nfc/index.html b/public/tags/nfc/index.html new file mode 100644 index 0000000..193de86 --- /dev/null +++ b/public/tags/nfc/index.html @@ -0,0 +1,3 @@ +Blog Posts
Misconceptions about NFC 2024-01-19
powered by zola and serene
\ No newline at end of file diff --git a/public/tags/nixos/index.html b/public/tags/nixos/index.html new file mode 100644 index 0000000..7e605df --- /dev/null +++ b/public/tags/nixos/index.html @@ -0,0 +1,3 @@ +Blog Posts
\ No newline at end of file diff --git a/public/tags/privacy/index.html b/public/tags/privacy/index.html new file mode 100644 index 0000000..3204fa6 --- /dev/null +++ b/public/tags/privacy/index.html @@ -0,0 +1,3 @@ +Blog Posts
\ No newline at end of file diff --git a/public/tags/searxng/index.html b/public/tags/searxng/index.html new file mode 100644 index 0000000..34ee08e --- /dev/null +++ b/public/tags/searxng/index.html @@ -0,0 +1,3 @@ +Blog Posts
# searxngAll Tags
Host your own private search engine with SearXNG 2023-12-31
powered by zola and serene
\ No newline at end of file diff --git a/public/tags/selfhosted/index.html b/public/tags/selfhosted/index.html new file mode 100644 index 0000000..62ede9a --- /dev/null +++ b/public/tags/selfhosted/index.html @@ -0,0 +1,3 @@ +Blog Posts
\ No newline at end of file diff --git a/public/tags/social-engineering/index.html b/public/tags/social-engineering/index.html new file mode 100644 index 0000000..5b085e1 --- /dev/null +++ b/public/tags/social-engineering/index.html @@ -0,0 +1,3 @@ +Blog Posts
# social engineeringAll Tags
Misconceptions about NFC 2024-01-19 An overview on hoaxes 2024-01-04
powered by zola and serene
\ No newline at end of file diff --git a/public/tags/tailscale/index.html b/public/tags/tailscale/index.html new file mode 100644 index 0000000..d9e8b81 --- /dev/null +++ b/public/tags/tailscale/index.html @@ -0,0 +1,3 @@ +Blog Posts
# tailscaleAll Tags
Take control of tailscale with headscale 2024-01-10
powered by zola and serene
\ No newline at end of file diff --git a/public/tags/zola/index.html b/public/tags/zola/index.html new file mode 100644 index 0000000..0483f58 --- /dev/null +++ b/public/tags/zola/index.html @@ -0,0 +1,3 @@ +Blog Posts
# zolaAll Tags
Setting up Zola on NixOS 2023-12-29
powered by zola and serene
\ No newline at end of file diff --git a/static/hl-dark.css b/static/hl-dark.css new file mode 100644 index 0000000..d6c9651 --- /dev/null +++ b/static/hl-dark.css @@ -0,0 +1,74 @@ +/* + * theme "Tomorrow Night" generated by syntect + */ + +.z-code { + color: #c5c8c6; +} + +.z-comment, .z-string.z-quoted.z-double.z-block.z-python { + color: #999999; +} +.z-keyword.z-operator.z-class, .z-constant.z-other, .z-source.z-php.z-embedded.z-line { + color: #ced1cf; +} +.z-variable, .z-support.z-other.z-variable, .z-string.z-other.z-link, .z-string.z-regexp, .z-entity.z-name.z-tag, .z-entity.z-other.z-attribute-name, .z-meta.z-tag, .z-declaration.z-tag { + color: #a67878; +} +.z-constant.z-numeric, .z-constant.z-language, .z-support.z-constant, .z-constant.z-character, .z-variable.z-parameter, .z-punctuation.z-section.z-embedded, .z-keyword.z-other.z-unit { + color: #e08355; +} +.z-type, .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class, .z-support.z-type, .z-support.z-class { + color: #6a8f8a; +} +.z-string, .z-constant.z-other.z-symbol, .z-entity.z-other.z-inherited-class, .z-markup.z-heading { + color: #85ad74; +} +.z-keyword.z-operator, .z-constant.z-other.z-color { + color: #6a8f8a; +} +.z-entity.z-name.z-function, .z-meta.z-function-call, .z-support.z-function, .z-keyword.z-other.z-special-method, .z-meta.z-block-level { + color: #81a2be; +} +.z-keyword, .z-storage, .z-storage.z-type, .z-entity.z-name.z-tag.z-css { + color: #b294bb; +} +.z-invalid { + color: #ced2cf; + background-color: #df5f5f; +} +.z-meta.z-separator { + color: #ced2cf; + background-color: #82a3bf; +} +.z-invalid.z-deprecated { + color: #ced2cf; + background-color: #b798bf; +} +.z-markup.z-inserted.z-diff, .z-markup.z-deleted.z-diff, .z-meta.z-diff.z-header.z-to-file, .z-meta.z-diff.z-header.z-from-file { + color: #ffffff; +} +.z-markup.z-inserted.z-diff, .z-meta.z-diff.z-header.z-to-file { + color: #5fe375; + background-color: #000000; +} +.z-markup.z-deleted.z-diff, .z-meta.z-diff.z-header.z-from-file { + color: #d46565; +} +.z-meta.z-diff.z-header.z-from-file, .z-meta.z-diff.z-header.z-to-file { + color: #ffffff; + background-color: #4271ae; +} +.z-meta.z-diff.z-range { + color: #3e999f; +font-style: italic; +} +.z-markup.z-deleted { + color: #f92672; +} +.z-markup.z-inserted { + color: #a6e22e; +} +.z-markup.z-changed { + color: #967efb; +} diff --git a/static/hl-light.css b/static/hl-light.css new file mode 100644 index 0000000..bded504 --- /dev/null +++ b/static/hl-light.css @@ -0,0 +1,64 @@ +/* + * theme "Tomorrow" generated by syntect + */ + +.z-code { + color: #4d4d4c; +} + +.z-comment, .z-string.z-quoted.z-double.z-block.z-python { + color: #999999; +} +.z-keyword.z-operator.z-class, .z-constant.z-other, .z-source.z-php.z-embedded.z-line { + color: #666969; +} +.z-variable, .z-support.z-other.z-variable, .z-string.z-other.z-link, .z-string.z-regexp, .z-entity.z-name.z-tag, .z-entity.z-other.z-attribute-name, .z-meta.z-tag, .z-declaration.z-tag { + color: #a67878; +} +.z-constant.z-numeric, .z-constant.z-language, .z-support.z-constant, .z-constant.z-character, .z-variable.z-parameter, .z-punctuation.z-section.z-embedded, .z-keyword.z-other.z-unit { + color: #e08355; +} +.z-type, .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class, .z-support.z-type, .z-support.z-class { + color: #568a8f; +} +.z-string, .z-constant.z-other.z-symbol, .z-entity.z-other.z-inherited-class, .z-markup.z-heading { + color: #85ad74; +} +.z-keyword.z-operator, .z-constant.z-other.z-color { + color: #568a8f; +} +.z-entity.z-name.z-function, .z-meta.z-function-call, .z-support.z-function, .z-keyword.z-other.z-special-method, .z-meta.z-block-level { + color: #4271ae; +} +.z-keyword, .z-storage, .z-storage.z-type { + color: #8959a8; +} +.z-invalid { + color: #ffffff; + background-color: #df5f5f; +} +.z-meta.z-separator { + color: #ffffff; + background-color: #4271ae; +} +.z-invalid.z-deprecated { + color: #ffffff; + background-color: #8959a8; +} +.z-markup.z-inserted.z-diff, .z-markup.z-deleted.z-diff, .z-meta.z-diff.z-header.z-to-file, .z-meta.z-diff.z-header.z-from-file { + color: #ffffff; +} +.z-markup.z-inserted.z-diff, .z-meta.z-diff.z-header.z-to-file { + background-color: #65c23a; +} +.z-markup.z-deleted.z-diff, .z-meta.z-diff.z-header.z-from-file { + background-color: #c82829; +} +.z-meta.z-diff.z-header.z-from-file, .z-meta.z-diff.z-header.z-to-file { + color: #ffffff; + background-color: #4271ae; +} +.z-meta.z-diff.z-range { + color: #3e999f; +font-style: italic; +} diff --git a/static/icon/alert.svg b/static/icon/alert.svg new file mode 100644 index 0000000..0ab867b --- /dev/null +++ b/static/icon/alert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/arrow-up.svg b/static/icon/arrow-up.svg new file mode 100644 index 0000000..f210d57 --- /dev/null +++ b/static/icon/arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/backlink.svg b/static/icon/backlink.svg new file mode 100644 index 0000000..1fa5351 --- /dev/null +++ b/static/icon/backlink.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/check.svg b/static/icon/check.svg new file mode 100644 index 0000000..dfbcaa3 --- /dev/null +++ b/static/icon/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/copy.svg b/static/icon/copy.svg new file mode 100644 index 0000000..21b1c15 --- /dev/null +++ b/static/icon/copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/email.svg b/static/icon/email.svg new file mode 100644 index 0000000..c481715 --- /dev/null +++ b/static/icon/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/fingerprint.svg b/static/icon/fingerprint.svg new file mode 100644 index 0000000..84b985c --- /dev/null +++ b/static/icon/fingerprint.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/github.svg b/static/icon/github.svg new file mode 100644 index 0000000..d7f6dff --- /dev/null +++ b/static/icon/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/important.svg b/static/icon/important.svg new file mode 100644 index 0000000..d4356a4 --- /dev/null +++ b/static/icon/important.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/moon.svg b/static/icon/moon.svg new file mode 100644 index 0000000..19f378e --- /dev/null +++ b/static/icon/moon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/note.svg b/static/icon/note.svg new file mode 100644 index 0000000..7e6118c --- /dev/null +++ b/static/icon/note.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/question.svg b/static/icon/question.svg new file mode 100644 index 0000000..9611d3a --- /dev/null +++ b/static/icon/question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/rss.svg b/static/icon/rss.svg new file mode 100644 index 0000000..481a430 --- /dev/null +++ b/static/icon/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/sun.svg b/static/icon/sun.svg new file mode 100644 index 0000000..c7cc2eb --- /dev/null +++ b/static/icon/sun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/tip.svg b/static/icon/tip.svg new file mode 100644 index 0000000..36f7a57 --- /dev/null +++ b/static/icon/tip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/toc.svg b/static/icon/toc.svg new file mode 100644 index 0000000..91bd824 --- /dev/null +++ b/static/icon/toc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/twitter.svg b/static/icon/twitter.svg new file mode 100644 index 0000000..457a783 --- /dev/null +++ b/static/icon/twitter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icon/warning.svg b/static/icon/warning.svg new file mode 100644 index 0000000..6b90b3e --- /dev/null +++ b/static/icon/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/avatar.webp b/static/img/avatar.webp new file mode 100644 index 0000000000000000000000000000000000000000..a6dfac1e293908d7501c941ae6fdb821c0b8b78f GIT binary patch literal 25616 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 E04#kRA^-pY literal 0 HcmV?d00001 diff --git a/templates/_custom_css.html b/templates/_custom_css.html new file mode 100644 index 0000000..638874b --- /dev/null +++ b/templates/_custom_css.html @@ -0,0 +1,51 @@ + diff --git a/themes/serene/.gitignore b/themes/serene/.gitignore new file mode 100644 index 0000000..786a7ad --- /dev/null +++ b/themes/serene/.gitignore @@ -0,0 +1,14 @@ +public/ + +content/ + +!content/_index.md + +static/img/ + +config.toml + +.DS_Store + +static/hl-light.css +static/hl-dark.css diff --git a/themes/serene/CHANGELOG.md b/themes/serene/CHANGELOG.md new file mode 100644 index 0000000..c60121a --- /dev/null +++ b/themes/serene/CHANGELOG.md @@ -0,0 +1,133 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [2.1.2] - 2023-09-19 + +### Fix: + +- Outdate alert not 'hidden' ([#49](https://github.com/isunjn/serene/issues/49)) + +## [2.1.1] - 2023-09-16 + +### Add: + +- Custom 404 page + +## [2.0.1] - 2023-09-13 + +### Fix: + +- Min height of prose page & post page + +## [2.0.0] - 2023-09-01 + +> **Warning** +> This version contains several breaking changes. +> If you came from a previous version and want to upgrade, I suggest you start all over again. + +### UI: + +- Text selction now is styled +- Other minor tweaks +- Change defalut bg color of codeblock to transparent + +### Add: + +- Option `dispaly_tags` and `truncate_summary` [@woojiq](https://github.com/woojiq) ([#40](https://github.com/isunjn/serene/issues/40)) +- Support for footnote and backlink +- Active TOC indicator +- Generay `prose` section/page +- Config option `sections`, now you can rename `blog` to somthing else, e.g. `posts` +- Support for header nav fold/unfold +- Option for homepage layout, can be `about` or `list` +- A separate `_custom_css.html` for css customization + +### Fix: + +- Codeblock distance calculation +- Codeblock highlight style +- Add description tag only when it's available +- Post 3 column layout issue +- Inline code style in list item +- Link text-decoration style on mobile + + +## [1.2.0] - 2023-08-19 + +### UI: + +- Use noborder theme of giscus by default +- Post list item and callout styles changed +- Code block styles improved +- Default colors changed + +### Add: + +- Outline styles [@mrtnvgr](https://github.com/mrtnvgr) ([#26](https://github.com/isunjn/serene/pull/26)) +- Support self-host font ([#29](https://github.com/isunjn/serene/pull/29)) +- Copy button for code blocks ([#30](https://github.com/isunjn/serene/pull/30)) +- Support light/dark switch for code blocks ([#33](https://github.com/isunjn/serene/pull/33)) +- Support tags for project page +- Back-to-top button +- A shortcode for code block with file name: `codeblock` ([#39](https://github.com/isunjn/serene/pull/39)) + +### Fix: + +- Update theme toggle icon on page load [@mrtnvgr](https://github.com/mrtnvgr) ([#25](https://github.com/isunjn/serene/pull/25)) +- Layout shift problem on post page ([#27](https://github.com/isunjn/serene/pull/27)) + +## [1.1.1] - 2023-08-09 + +- Allow no tags in front matter [@mrtnvgr](https://github.com/mrtnvgr) +- Fix figcaption width issue + +## [1.1.0] - 2023-05-27 + +- Fix theme auto-toggle logic +- A few ui tweaks + +## [1.0.0] - 2023-05-24 + +> **Warning** +> The 1.0.0 version contains many breaking changes. +> If you came from a previous version and want to upgrade, I suggest you start all over again. + +### Breaking + +- `config.toml` restructured, config items are renamed +- All analytics configs removed, use `_head_extend.html` instead +- All comment-support configs removed, replace with [giscus](https://giscus.app) +- Icons now using svg files +- Callout renamed: `info -> note`, `caution -> warning`, `warning -> alert` +- Callout removed: `good`, `bad`, `happy`, `unhappy`, `check`, `wrong`, `flag`, `star` +- `cc_license` removed +- Reading-progress-bar removed +- Back-to-top button removed +- Many other tweaks + +## [0.2.0] - 2022-02-16 + +### Add: +- KaTeX support +- Mermaid support + +### Fix: +- Style issue of table-of-contents +- A few non-critical bugs + +## [0.1.0] - 2022-01-14 + +First release 🎉 + + +[2.1.2]: https://github.com/isunjn/serene/compare/v2.1.1...v2.1.2 +[2.1.1]: https://github.com/isunjn/serene/compare/v2.0.1...v2.1.1 +[2.0.1]: https://github.com/isunjn/serene/compare/v2.0.0...v2.0.1 +[2.0.0]: https://github.com/isunjn/serene/compare/v1.2.0...v2.0.0 +[1.2.0]: https://github.com/isunjn/serene/compare/v1.1.1...v1.2.0 +[1.1.1]: https://github.com/isunjn/serene/compare/v1.1.0...v1.1.1 +[1.1.0]: https://github.com/isunjn/serene/compare/v1.0.0...v1.1.0 +[1.0.0]: https://github.com/isunjn/serene/compare/v0.2.0...v1.0.0 +[0.2.0]: https://github.com/isunjn/serene/compare/v0.1.0...v0.2.0 +[0.1.0]: https://github.com/isunjn/serene/releases/tag/v0.1.0 \ No newline at end of file diff --git a/themes/serene/LICENSE b/themes/serene/LICENSE new file mode 100644 index 0000000..4fd12a3 --- /dev/null +++ b/themes/serene/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-2023 isunjn + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/themes/serene/README.md b/themes/serene/README.md new file mode 100644 index 0000000..3051af0 --- /dev/null +++ b/themes/serene/README.md @@ -0,0 +1,31 @@ +screenshot + +

+ +A blog theme for [zola](https://www.getzola.org), simple and clean + +## Demo + +- + +## Features + +- A spiffy design, well crafted +- Projects page +- Dark mode +- Image zooming +- Out-of-date alert +- Sticky table-of-contents +- Callouts (note, warning, alert, etc.) +- Comments using [Giscus](https://giscus.app) +- Mathematical notations using [KaTeX](https://katex.org) +- Diagrams and visualizations using [Mermaid](https://github.com/mermaid-js/mermaid) + +## Usage + +- Check the [USAGE.md](https://github.com/isunjn/serene/blob/latest/USAGE.md) of `latest` branch +- Also available in Simplified Chinese: [USAGE-zh_CN.md](https://github.com/isunjn/serene/blob/latest/USAGE-zh_CN.md) (简体中文) + +## Contributing + +- Before you make any non-trivial changes, you may want to open an issue so we can discuss diff --git a/themes/serene/USAGE-zh_CN.md b/themes/serene/USAGE-zh_CN.md new file mode 100644 index 0000000..1d6845b --- /dev/null +++ b/themes/serene/USAGE-zh_CN.md @@ -0,0 +1,379 @@ +如果你还没有创建 Zola 站点,使用以下命令创建新的 Zola 站点(假设你的网站名为 myblog): + +```sh +zola init myblog +``` + +进入 myblog 目录: + +```sh +cd myblog +``` + +添加 serene 主题: + +```sh +git submodule add -b latest https://github.com/isunjn/serene.git themes/serene +``` + +将 `myblog/themes/serene/config.example.toml` 的内容复制到 `myblog/config.toml`,参考文件中的注释和 Zola 的[文档](https://www.getzola.org/documentation/getting-started/overview/)进行相应的修改 + +## 区块和页面 + +`config.toml` 中有一个 `sections` 配置项,它列举了网站都有哪几部分, 你应该至少有一个“博客”部分。名称和路径可以更改,注意如果你更改了博客 section 的路径(例如从 `/blog` 到 `/posts`),那么你还应该同步更改 `blog_section_path` 配置项 + +myblog 目录此时像这样: + +``` +├── config.toml +├── content/ +├── sass/ +├── static/ +├── templates/ +└── themes/ + └── serene/ +``` + +创建 `myblog/content/_index.md` 和 `myblog/content/blog/_index.md`, 文件内容如下: + +`myblog/content/_index.md`: + +``` ++++ +template = 'home.html' + +[extra] +lang = 'en' ++++ + +Words about you +``` + +`myblog/content/blog/_index.md`: + +``` ++++ +title = "My Blog" +description = "My blog site." +sort_by = "date" +template = "blog.html" +page_template = "post.html" +insert_anchor_links = "right" +generate_feed = true + +[extra] +lang = 'en' ++++ +``` + +路径和目录应该匹配。如果你将博客 section 的 path 更改为 `/posts`,那么你创建的是 `myblog/content/posts/_index.md`,而不是 `myblog/content/blog/_index.md` 别的 section 也一样 + +如果你还想要 Projects 页面,创建 `myblog/content/projects/_index.md` + +`myblog/content/projects/_index.md`: + +``` ++++ +title = "My Projects" +description = "My projects page." +template = "projects.html" + +[extra] +lang = 'en' ++++ +``` + +`blog` 和 `projects` 是 serene 默认支持的两个 section,它们具有特定的结构和样式,在模板 `blog.html` 和 `projects.html` 中定义 + +Serene 还支持一个名为 `prose.html` 的特殊模板,它应用了与博客文章页面相同的样式,你可以将其用作自定义 section 页面的模板,例如,如果你想要一个单独的 `about` 页面,可以在 `sections` 配置项中添加一个 `{ name = "about", path = "/about", is_external = false }` 并创建一个 `myblog/content/about/_index.md` ,内容如下: + +``` ++++ +title = "About me" +description = "A about page of ..." +template = "prose.html" + +[extra] +lang = 'en' +math = false +mermaid = false +copy = false +comment = false ++++ + +Hi, My name is .... + +(more markdown content goes here) + +``` + +你还可以创建一个 `friends` 页面来列出你在互联网上的朋友,一个 `collections/bookmarks` 页面来列出你认为有价值的书签,一个 `cat` 页面来放几张你家可爱猫咪的照片...... 未来 serene 可能会添加更多特定的模板 + + +现在目录可能长这样: + +``` +├── config.toml +├── content/ +│ ├── blog/ +│ │ └── _index.md +│ ├── projects/ +│ │ └── _index.md +│ ├── about/ +│ │ └── _index.md +│ └── _index.md +├── sass/ +├── static/ +├── templates/ +└── themes/ + └── serene/ +``` + +## 配置 + +### Favicons + +在 `myblog/static` 下新建目录 `img` ,放置 favicon 相关图片,你可以使用类似 [favicon.io](https://favicon.io/favicon-converter/) 这样的工具在线生成 + +另外放入你的头像图片文件 `avatar.webp`, 推荐 webp 格式 + +``` +... +├── static/ +│ └── img/ +│ ├── favicon-16x16.png +│ ├── favicon-32x32.png +│ ├── apple-touch-icon.png +│ └── avatar.webp +... +``` + +### 图标 + +- 将 `myblog/themes/serene/static/icon` 复制到 `myblog/static/icon`,links 中的 icon 值为其中的 svg 文件的文件名,不包含 `.svg` 后缀 + +- 找到你想要的 icon 的 svg 文件,修改其宽高为 24,颜色为 currentColor: `... width="24" height="24" ... fill="currentColor" ...` + +- 默认图标来自 [Remix Icon](https://remixicon.com/) + +### 代码高亮 + +- 将 `myblog/themes/serene/highlight_themes` 目录复制到 `myblog/highlight_themes` + +- 如果你将 `config.toml` 中的 `highlight_theme` 设置为 zola 的 [内置高亮主题](https://www.getzola.org/documentation/getting-started/configuration/#syntax-highlighting) 之一,浅色和深色模式都将使用该主题 + +- 默认情况下,serene 对亮/暗模式使用不同的主题,由 `highlight_theme`、`extra_syntaxes_and_themes` 和 `highlight_themes_css` 配置。 默认高亮主题 `serene-light` `serene-dark` 是 [Tomorrow](https://github.com/ChrisKempson/Tomorrow-Theme) 主题的一个修改版本 + +- 如果你想要不同的主题,找到你的主题的 `.tmTheme` TextMate文件,将其放在 `myblog/static/highlight_themes` 中,然后将 `highlight_themes_css` 的 `theme` 值修改为该文件的名称,不带` .tmTheme` 扩展名。 这将在 `myblog/static/` 中生成 `hl-light.css` 和 `hl-dark.css` 文件,你需要在修改 `theme` 值之前先删除它们,以便 zola 可以重新生成 + +- 你可以在[这个网站](https://tmtheme-editor.glitch.me/)上找到一些 TextMate 主题 + +### RSS + +- 你可以为你的站点添加 RSS,Zola 默认的 feed 文件位于站点的根目录,在 `config.toml` 设置 `generate_feed = ture` ,`feed_filename` 可以设置为 `atom.xml` 或 `rss.xml` ,对应两种不同的 rss 文件标准, `myblog/content/blog/_index.md` 中设置 `generate_feed = false` + +- Serene 主题风格更像个人网站,文章在 `/blog` 目录下,你可能希望 feed 文件在 `/blog` 目录下而不是根目录下,这需要你在 `config.toml` 中设置 `generate_feed = false`、 `feed_filename = "feed.xml"` 并在 `myblog/content/blog/_index.md` 中设置 `generate_feed = true` + +- `feed.xml` 使用 `myblog/content/blog/_index.md` 中的 `title` 和 `description`,其他两个则是使用 `config.toml` 中的 + +### Projects 页面 + +- Serene 有一个 projects 页面,可以在其上展示你的项目、产品等信息 + +- 在 `config.toml` 中设置 `projects_page = ture` ,在 `myblog/content/projects/` 下新建一个 `data.toml` ,在其中添加项目信息,格式如下: + + ```toml + [[project]] + name = "" + desc = "" + tags = ["", ""] + links = [ + { name = "", url = "" }, + { name = "", url = "" }, + ] + + [[project]] + name = "" + desc = "" + tags = ["", ""] + links = [ + { name = "", url = "" }, + { name = "", url = "" }, + ] + ``` + +### 文章过时提示 + +- 如果你的某篇文章具有较强的时效性,可以设置若干天后在页面上显示一个过时提示 + +- `config.toml` 中的 `outdate_alert` 和 `outdate_alert_days` 设置默认的是否过时和多少天过时。是否显示过时提示以及过时天数可以在单独的一篇文章上配置,你可以将`config.toml`中的 `outdate_alert` 设置为 `false`,然后在有时效性的文章的 front matter 中单独开启 + +- `outdate_alert_text_before` 和 `outdate_alert_text_after` 是提示的具体内容,分别是在天数之前和之后 + +### 文章评论 + +- Serene 支持使用 [Giscus](https://giscus.app) 作为文章评论系统 + +- 开启此功能需要新建 `myblog/templates/_giscus_script.html` 并将在 Giscus 网站上配置好的 script 放入其中,然后将其中 `data-theme` 的值改为 `https:///giscus_light.css`, 将 `` 改为你自己的域名,和 `config.toml` 中的 `base_url` 一致 + +- `config.toml` 中的 `comment = true` 设置所有文章开启评论,可以在文章的 front matter 中 `[extra]` 下设置 `comment = false` 控制单篇文章是否显示评论 + +### Analytics + +- 如需放置 Analytics 工具(如 Google Anayltics、Umami 等)的脚本,可以新建 `myblog/templates/_head_extend.html` 并将相应内容放入其中,该文件的内容将被添加到每个页面的 html head 中 + +### 字体 + +- Serene 默认使用 [Google Fonts](https://fonts.google.com/) 的 Signika 字体,如需自定义字体,新建 `myblog/templates/_custom_font.html` 并将从 Google Fonts 复制的字体样式表 link 标签放入其中,然后修改 `myblog/sass/main.scss` 中的 `--main-font` 或者 `--code-font`. + +- 为了进一步提高网站速度, 你也可以选择自己托管字体文件(可选): + 1. 打开 [google-webfonts-helper](https://gwfh.mranftl.com) 并选择一个字体 + 2. 将步骤 3 中的 `Customize folder prefix` 改为 `/font/`, 然后复制该 css + 3. 将 `myblog/tempaltes/_custom_font.html` 替换为一个 `` 标签, 把你刚复制的 css 放在里面 + 4. 下载步骤 4 的字体文件, 放在 `myblog/static/font/` 目录 + + +### 自定义 CSS + +- 将 `myblog/themes/serene/templates/_custom_css.html` 复制到 `myblog/templates/_custom_css.html`, 该文件里的若干变量值用于控制样式,例如主题色 `--primary-color`,可以自行修改 + +- 如果你想修改更多的内容,你只需要将相应的 `themes/serene` 中 `templates`、`static`、`sass` 目录下的文件复制到 myblog 同名目录下,并进行修改。注意不要直接修改 serene 目录下的文件,因为如果更新主题,这些修改可能导致冲突 + +### 首页布局 + +- 主页默认显示 `myblog/content/_index.md` 的 markdown 内容 + +- 可以将 `config.toml` 中的 `homepage_layout` 从 `about` 更改为 `list`,这样博客文章列表将直接显示在首页中 + +## 写作 + +### front matter + +- 文章 Markdown 文件顶部两个 `+++` 内部的内容称为 front matter,支持的配置项如下: + + ```md + +++ + title = "" + date = 2022-01-01 + draft = true + + [taxonomies] + categories = ["one"] + tags = ["one", "two", "three"] + + [extra] + lang = "en" + toc = true + comment = true + copy = true + math = false + mermaid = false + outdate_alert = true + outdate_alert_days = 120 + display_tags = true + truncate_summary = false + +++ + + new post about somthing... + + + + more post content... + ``` + +- 你可以添加一行``, 在其前面的内容会成为文章的总结/描述, 可以设置 `truncate_summary = ture` 来让其在最终的文章网页上不显示 + +- 文章文件在 `myblog/content/blog` 下创建,写完后将 draft 改为 false 即可 + +### Shortcodes + +- Zola 支持 Shortcodes,可以在标准 Markdown 格式之外增加一些额外的样式或方便进行输入的模板 + +- Zola 支持一些[代码块注解](https://www.getzola.org/documentation/content/syntax-highlighting/#annotations), Serene 通过一个 `codeblock` shortcode 额外支持了显示代码块文件名, 用法如下: + + ```md + {% codeblock(name="path/to/file") %} + // a markdown code block ... + {% end %} + ``` + + +- 除了标准 Markdown 的 `![img](/path/to/img)` , Serene 还支持 figure shortcode,以便为图片添加一些说明性的文字,格式如下: + + ```md + {{ figure(src="/path/to/img", alt="alt text", caption="caption text") }} + ``` + + 这将在网页上显示为 HTML 中的 `
` ,而非 ``,caption 的内容将居中显示在图像下方。alt 属性是可选的,但推荐加上,有助于增强可访问性 + + 为图片添加出处信息是很常见的情况,你可以直接使用 `via` 属性,这将在图片下方显示一个名为 via 的链接: + + ```md + {{ figure(src="/path/to/img", alt="some alt text", via="https://example.com") }} + ``` + +### Callout + +- Serene 还使用 Shortcodes 实现了 Callout, 效果如示例站点的 [这个页面](https://serene-demo-site.vercel.app/blog/callouts) 所示,目前共有 6 种:`note` `important` `warning` `alert` `question` `tip`,格式如下,header 属性是可选的: + + ```md + {% note(header="Note") %} + note text + {% end %} + ``` + +- 如果读者通过 RSS 阅读你的文章,这些 Callouts 将会显示为普通的 `
` + +### KaTeX + +- 在文章 front matter 中设置 `math = true` 开启 [KaTeX](https://katex.org/) 支持 + +- 行内公式 `$...$`,块级公式 `$$...$$` + +### Mermaid + +- 在文章 front matter 中设置 `mermaid = true` 开启 [Mermaid](https://github.com/mermaid-js/mermaid) 支持,然后用如下格式插入图表: + + ```md + {% mermaid() %} + flowchart LR + A[Hard] -->|Text| B(Round) + B --> C{Decision} + C -->|One| D[Result 1] + C -->|Two| E[Result 2] + {% end %} + ``` + +## 构建部署 + +本地预览: + +```sh +zola serve +``` + +构建站点: + +```sh +zola build +``` + +部署静态站点请参考 Zola [关于部署的文档](https://www.getzola.org/documentation/deployment/overview/) + +## 更新 + +- 更新主题前请在 GitHub 上查看 [CHANGELOG.md](https://github.com/isunjn/serene/blob/main/CHANGELOG.md) 以确认是否有 breaking changes + +- 如果你从 `myblog/themes/serene` 复制了一些文件到 `myblog/` 进行自定义,例如 `_custom_css.html` 或 `main.scss`,那么你应该在更新之前记录下你修改的内容,在更新后重新复制这些文件, 然后重新修改这些文件. `config.toml` 也要重新复制 + +- 你可以在 GitHub 上 watch(`watch > custom >releases > apply`)此项目,在有新版本时会收到提醒 + +```sh +git submodule update --remote themes/serene +``` + +
+ +*Happy blogging :)* + +
diff --git a/themes/serene/USAGE.md b/themes/serene/USAGE.md new file mode 100644 index 0000000..3aa9274 --- /dev/null +++ b/themes/serene/USAGE.md @@ -0,0 +1,378 @@ +If you haven't created a zola site yet, create a new zola site with the following command (assuming your site is called `myblog`): + +```sh +zola init myblog +``` + +Enter the directory: + +```sh +cd myblog +``` + +Add the serene theme: + +```sh +git submodule add -b latest https://github.com/isunjn/serene.git themes/serene +``` + +Copy the content of `myblog/themes/serene/config.example.toml` to `myblog/config.toml`, refer to the comments in the file and Zola's [documentation](https://www.getzola.org/documentation/getting-started/overview/) to modify accordingly + +## Sections and pages + +There is a `sections` config item in your `config.toml`, which enumerates the sections your website has. You should have at least one `blog` section. The name and path can be changed, be noticed that if you changed the blog section path (e.g. from `/blog` to `/posts`), then you should also change `blog_section_path` config item. + +The myblog directory now looks like this: + +``` +├── config.toml +├── content/ +├── sass/ +├── static/ +├── templates/ +└── themes/ + └── serene/ +``` + +Create `myblog/content/_index.md` and `myblog/content/blog/_index.md` with the following content: + +`myblog/content/_index.md`: + +``` ++++ +template = 'home.html' + +[extra] +lang = 'en' ++++ + +Words about you +``` + +`myblog/content/blog/_index.md`: + +``` ++++ +title = "My Blog" +description = "My blog site." +sort_by = "date" +template = "blog.html" +page_template = "post.html" +insert_anchor_links = "right" +generate_feed = true + +[extra] +lang = 'en' ++++ +``` + +The path and the directory should match. If you changed the blog section path to `/posts`, then you create `myblog/content/posts/_index.md`, rather than `myblog/content/blog/_index.md`. The same goes for the others. + +If you want to display a projects page (as you see in the demo site), also create `myblog/content/projects/_index.md`: + +``` ++++ +title = "My Projects" +description = "My projects page." +template = "projects.html" + +[extra] +lang = 'en' ++++ +``` + +The `blog` and `projects` are two sections that serene supports by default, they have specific structures and styles, defined in template `blog.html` and `projects.html`. + +Serene also support a special template called `prose.html`, it applies the same styles of blog post page and you can use it as a section template for a custom section page, for example if you want a separate `about` page, you can add a `{ name = "about", path = "/about", is_external = false }` to the `sections` config item and create a `myblog/content/about/_index.md` with the following content: + +``` ++++ +title = "About me" +description = "A about page of ..." +template = "prose.html" + +[extra] +lang = 'en' +math = false +mermaid = false +copy = false +comment = false ++++ + +Hi, My name is .... + +(more markdown content goes here) + +``` + +You may also create a `friends` page to list all your friends on the internet, a `collections/bookmarks` page to list your considered valuable bookmarks, a `cat` page to post a few pics of your lovely cat... In the future, serene may add more specific templates. + + +Now the myblog directory may looks like this: + +``` +├── config.toml +├── content/ +│ ├── blog/ +│ │ └── _index.md +│ ├── projects/ +│ │ └── _index.md +│ ├── about/ +│ │ └── _index.md +│ └── _index.md +├── sass/ +├── static/ +├── templates/ +└── themes/ + └── serene/ +``` + +## Configuration + +### Favicons + +- Create a new directory `img` under `myblog/static`, put favicon related files here, you can use tools like [favicon.io](https://favicon.io/favicon-converter/) to generate those files + +- Also put your avatar picture file `avatar.webp` here, webp format is recommended + + ``` + ... + ├── static/ + │ └── img/ + │ ├── favicon-16x16.png + │ ├── favicon-32x32.png + │ ├── apple-touch-icon.png + │ └── avatar. webp + ... + ``` + +### Icon + +- Copy `myblog/themes/serene/static/icon` directory to `myblog/static/icon`, the icon value in `links` is the file name of the svg file in it, without the `.svg` suffix + +- Find the svg file of the icon you want, modify its width and height to 24, and the color to currentColor: + + `... width="24" height="24" ... fill="currentColor" ...` + +- The default icons came from [Remix Icon](https://remixicon.com/) + +### Code highlight + +- Copy `myblog/themes/serene/highlight_themes` directory to `myblog/highlight_themes`. + +- If you set `highlight_theme` in `config.toml` to one of zola's [built-in highlight themes](https://www.getzola.org/documentation/getting-started/configuration/#syntax-highlighting), you will get that theme used in both light and dark mode. + +- By default serene use different themes for light/dark modes, configured by `highlight_theme`, `extra_syntaxes_and_themes` and `highlight_themes_css`. The default highlight theme `serene-light` `serene-dark` is a modified version of [Tomorrow](https://github.com/ChrisKempson/Tomorrow-Theme) theme. + +- If you want a different theme, find the `.tmTheme` TextMate file of your theme, put it in `myblog/static/highlight_themes`, and then modify the `theme` value of `highlight_themes_css` to that file's name, without `.tmTheme` extension. This will generate a `hl-light.css` and a `hl-dark.css` file in `myblog/static/`, you may have to delete them first before you change the `theme` value, so zola can re-generate. + +- You can find some TextMate themes on [this website](https://tmtheme-editor.glitch.me/). + +### RSS + +- You can add rss to your site, Zola's default feed file is located in the root directory of the site, set `generate_feed = true` in `config.toml`, `feed_filename` can be set to `atom.xml` or `rss.xml ` , corresponding to two different rss file standards, you should also set `generate_feed = false` in `myblog/content/blog/_index.md` + +- The serene theme looks more like a personal website, the posts are in the `/blog` directory, you may want the feed file to be in the `/blog` directory instead of the root directory, this requires you to set `generate_feed = false ` `feed_filename = "feed.xml"` in `config.toml`, and set `generate_feed = true` in `myblog/content/blog/_index.md` + +- `feed.xml` uses `title` and `description` from `myblog/content/blog/_index.md`, the other two use `config.toml`'s + +### Projects page + +- Serene has a projects page where you can showcase your projects, products, etc. + +- Create a new `data.toml` under `myblog/content/projects/`, add projects information in it, the format is as follows: + + ```toml + [[project]] + name = "" + desc = "" + tags = ["", ""] + links = [ + { name = "", url = "" }, + { name = "", url = "" }, + ] + + [[project]] + name = "" + desc = "" + tags = ["", ""] + links = [ + { name = "", url = "" }, + { name = "", url = "" }, + ] + ``` + +### Outdated alert + +- If one of your posts has strong timeliness, you can set an outdated alert to be displayed on the page after certain days + +- `outdate_alert` and `outdate_alert_days` in `config.toml` set the default whether to be outdated and how many days to be outdated. These two can also be configured on a separate post, you can set `outdate_alert` in `config.toml` to `false`, and then enable it separately in the front matter of time-sensitive posts + +- `outdate_alert_text_before` and `outdate_alert_text_after` are the specific content of the alert, before and after the number of days respectively + +### Comments + +- Serene supports using [giscus](https://giscus.app) as the comment system + +- To enable it, you need to create `myblog/templates/_giscus_script.html` and put the script configured on the giscus website into it, then change the value of `data-theme` to `https:///giscus_light.css`, replace `` with you domain name, same as `base_url` in `config.toml` + +- `comment = true` in `config.toml` sets all posts to enable comments, you can set `comment = false` under `[extra]` in the front matter of the post to control whether a specific post displays comments + +### Analytics + +- To place scripts for analytics tools (such as Google Anayltics, Umami, etc.), you can create a new `myblog/templates/_head_extend.html` and put the corresponding content in it. The content of this file will be added to the html head of each page + +### Fonts + +- Serene uses the Signika font of [Google Fonts](https://fonts.google.com/) by default. If you want a different font, create a new `myblog/templates/_custom_font.html` and put the font link tags you copied from google fonts website into it, and then modify `--main-font` or `--code-font` in `myblog/sass/main.scss`. + +- For performance reason, you may want to self-host font files (optional): + 1. Open [google-webfonts-helper](https://gwfh.mranftl.com) and choose your font + 2. Modify `Customize folder prefix` of step 3 to `/font/` and then copy the css + 3. Replace the content of `myblog/templates/_custom_font.html` with a `` tag, with the css you just copied in it. + 4. Download step 4 font files and put them in `myblog/static/font/` folder + + +### Custom CSS + +- Copy `myblog/themes/serene/templates/_custom_css.html` to `myblog/templates/_custom_css.html`, variables in this file are used to control styles, such as the theme color `--primary-color`, you can modify them as you want + +- If you want to customize more, you only need to copy that file under the `templates`, `static`, `sass` directory in the corresponding `themes/serene` to the same name directory of `myblog`, and modify it. Be careful not to directly modify the files under the serene directory, because these modifications may cause conflicts if the theme is updated + +### Homepage layout + +- By default, homepage displays markdown content of your `myblog/content/_index.md` + +- You can change `homepage_layout` in `config.toml` from `about` to `list`, then the blog post list will be displayed directly in the homepage + +## Writing + +### front matter + +- The content inside the two `+++` at the top of the post markdown file is called front matter, and the supported configuration items are as follows: + + ```md + +++ + title = "" + date = 2022-01-01 + draft = true + + [taxonomies] + categories = ["one"] + tags = ["one", "two", "three"] + + [extra] + lang = "en" + toc = true + comment = true + copy = true + math = false + mermaid = false + outdate_alert = true + outdate_alert_days = 120 + display_tags = true + truncate_summary = false + +++ + + new post about somthing... + + + + more post content... + ``` + +- You can add a `` line, the content before it will become the summary/description of the post. You can set `truncate_summary = true` to remove the summary from the post webpage. + +- Post files are created under `myblog/content/blog`, after done writing, change `draft` to false + +### Shortcodes + +- Zola supports 'shortcodes', which can be used to add some extra styles or templates in addition to the standard markdown format + +- Zola support some [annotations for code blocks](https://www.getzola.org/documentation/content/syntax-highlighting/#annotations). Serene add another one to display the file name: `codeblock`, use it like this: + + ```md + {% codeblock(name="path/to/file") %} + // a markdown code block ... + {% end %} + ``` + +- In addition to `![img](/path/to/img)` of standard markdown, serene also supports a `figure` shortcode to add some explanatory text to the image: + + ```md + {{ figure(src="/path/to/img", alt="alt text", caption="caption text") }} + ``` + + This will be displayed as `
` in HTML on the web page instead of ``, and the content of the caption will be centered below the image. The alt attribute is optional but recommended to help enhance accessibility + + Adding attribution information to a image is very common, you can directly use the `via` attribute, which will display a link named via below the image: + + ```md + {{ figure(src="/path/to/img", alt="some alt text", via="https://example.com") }} + ``` + +### Callout + +- Serene also uses shortcodes to implement callouts, the effect is shown in [this page](https://serene-demo-site.vercel.app/blog/callouts) of the demo site, there are currently 6 types: `note` `important ` `warning` `alert` `question` `tip`, the format is as follows, the header attribute is optional: + + ```md + {% note(header="Note") %} + note text + {% end %} + ``` + +- If people read your posts via rss reader, these callouts will appear as normal `
` + +### KaTeX + +- Set `math = true` in the front matter to enable [KaTeX](https://katex.org/) support + +- Inline formula `$...$`, block-level formula `$$...$$` + +### Mermaid + +- Set `mermaid = true` in the front matter to enable [Mermaid](https://github.com/mermaid-js/mermaid) support, and then insert a chart in the following format: + + ```md + {% mermaid() %} + flowchart LR + A[Hard] -->|Text| B(Round) + B --> C{Decision} + C -->|One| D[Result 1] + C -->|Two| E[Result 2] + {% end %} + ``` + +## Build & Deploy + +Local preview: + +```sh +zola serve +``` + +Build the site: + +```sh +zola build +``` + +To deploy a static site, please refer to zola's [documentation about deployment](https://www.getzola.org/documentation/deployment/overview/) + +## Update + +- Please check the [CHANGELOG.md](https://github.com/isunjn/serene/blob/main/CHANGELOG.md) on github for breaking changes before updating the theme + +- If you copied some files from `myblog/themes/serene` to `myblog/` for customization, such as `_custom_css.html` or `main.scss`, then you should record what you have modified before you update, re-copy those files and re-apply your modification after updating. The `config.toml` should be re-copied too. + +- You can watch (`watch > custom > releases > apply`) this project on github to be reminded of a new release + +```sh +git submodule update --remote themes/serene +``` + +
+ +*Happy blogging :)* + +
diff --git a/themes/serene/config.example.toml b/themes/serene/config.example.toml new file mode 100644 index 0000000..213ce6b --- /dev/null +++ b/themes/serene/config.example.toml @@ -0,0 +1,90 @@ +# serene v2.1.2 +# +# - docs: https://github.com/isunjn/serene/blob/latest/USAGE.md +# - check for updates: https://github.com/isunjn/serene/releases +# +#========================================================================================= + +base_url = "https://example.com" # Domain name of your website +title = "xxxx" +description = "xxxx xxxx xxxx" +default_language = "en" +theme = "serene" +output_dir = "public" +compile_sass = true +minify_html = true +build_search_index = false # Keep this false, search is temporarily unsupported +generate_feed = false # Whether to generate a feed file in root, read docs for more info about rss feed +feed_filename = "feed.xml" # The file name of feed, "feed.xml" / "atom.xml" / "rss.xml", read docs for more info +taxonomies = [{ name = "tags" }, { name = "categories" }] + +[markdown] +highlight_code = true +highlight_theme = "css" +extra_syntaxes_and_themes = ["highlight_themes"] +highlight_themes_css = [ + { theme = "serene-light", filename = "hl-light.css"}, + { theme = "serene-dark", filename = "hl-dark.css"}, +] +render_emoji = false +external_links_target_blank = false +external_links_no_follow = true +external_links_no_referrer = true +smart_punctuation = false + +[slugify] +paths = "on" +taxonomies = "on" +anchors = "on" + +#========================================================================================= + +[extra] + +name = "xxxx" # Your name +id = "xxxx" # Your id / username / handle +bio = "xxxx" # Your bio +avatar = "img/avatar.webp" # Your avatar +links = [ # Your links + { name = "GitHub", icon = "github", url = "https://github.com/" }, + { name = "Twitter", icon = "twitter", url = "https://twitter.com/" }, + { name = "Email", icon = "email", url = "mailto:" }, +] + +homepage_layout = "about" # "about" | "list" + +sections = [ + { name = "blog", path = "/blog", is_external = false }, + { name = "projects", path = "/projects", is_external = false }, + # { name = "about", path = "/about", is_external = false }, + # { name = "github", path = "https://github.com/", is_external = true }, +] +blog_section_path = "/blog" + +nav_separator = "::" +nav_wrapper_left = "{" +nav_wrapper_right = "} ;" +nav_wrapper_separator = "," + +display_id = true # Whether to display your id on homepage +blog_categorized = true # Whether to categorize blog posts +blur_effect = true # Whether to turn on blur effect on navigation bar +back_to_top = true # Whether to show back-to-top button on post pages + +toc = true # Whether to show Table-Of-Contents by default +copy = true # Whether to add a copy button on code blocks by default +comment = false # Whether to show giscus comment section by default, see https://giscus.app for more info +display_tags = true # Whether to display tags on post pages by default +truncate_summary = false # Whether to truncate the summary of a post by default + +outdate_alert = false # Whether to show outdate alert by default +outdate_alert_days = 120 # How many days will a post be outdated by default +outdate_alert_text_before = "This article was last updated " +outdate_alert_text_after = " days ago and may be out of date." + +footer_copyright = "© 2023 " +footer_credits = true # Whether to show "powered by zola and serene" in footer + +not_found_title = "404" +not_found_error_text = "Not Found" +not_found_recover_text = "« back to home »" diff --git a/themes/serene/highlight_themes/serene-dark.tmTheme b/themes/serene/highlight_themes/serene-dark.tmTheme new file mode 100644 index 0000000..c181a82 --- /dev/null +++ b/themes/serene/highlight_themes/serene-dark.tmTheme @@ -0,0 +1,287 @@ + + + + + + + + + comment + http://chriskempson.com + name + Tomorrow Night + settings + + + settings + + caret + #AEAFAD + foreground + #C5C8C6 + invisibles + #4B4E55 + lineHighlight + #282A2E + selection + #373B41 + + + + name + Comment + scope + comment, string.quoted.double.block.python + settings + + foreground + #999999 + + + + name + Foreground + scope + keyword.operator.class, constant.other, source.php.embedded.line + settings + + fontStyle + + foreground + #CED1CF + + + + name + Variable, String Link, Regular Expression, Tag Name + scope + variable, support.other.variable, string.other.link, string.regexp, entity.name.tag, entity.other.attribute-name, meta.tag, declaration.tag + settings + + foreground + #A67878 + + + + name + Number, Constant, Function Argument, Tag Attribute, Embedded + scope + constant.numeric, constant.language, support.constant, constant.character, variable.parameter, punctuation.section.embedded, keyword.other.unit + settings + + fontStyle + + foreground + #E08355 + + + + name + Class, Support + scope + type, +entity.name.class, entity.name.type.class, support.type, support.class + settings + + fontStyle + + foreground + #6A8F8A + + + + name + String, Symbols, Inherited Class, Markup Heading + scope + string, constant.other.symbol, entity.other.inherited-class, markup.heading + settings + + fontStyle + + foreground + #85AD74 + + + + name + Operator, Misc + scope + keyword.operator, constant.other.color + settings + + foreground + #6A8F8A + + + + name + Function, Special Method, Block Level + scope + entity.name.function, meta.function-call, support.function, keyword.other.special-method, meta.block-level + settings + + fontStyle + + foreground + #81A2BE + + + + name + Keyword, Storage + scope + keyword, storage, storage.type, entity.name.tag.css + settings + + fontStyle + + foreground + #B294BB + + + + name + Invalid + scope + invalid + settings + + background + #DF5F5F + fontStyle + + foreground + #CED2CF + + + + name + Separator + scope + meta.separator + settings + + background + #82A3BF + foreground + #CED2CF + + + + name + Deprecated + scope + invalid.deprecated + settings + + background + #B798BF + fontStyle + + foreground + #CED2CF + + + + name + Diff foreground + scope + markup.inserted.diff, markup.deleted.diff, meta.diff.header.to-file, meta.diff.header.from-file + settings + + foreground + #FFFFFF + + + + name + Diff insertion + scope + markup.inserted.diff, meta.diff.header.to-file + settings + + foreground + #5FE375 + background + #00000000 + + + + name + Diff deletion + scope + markup.deleted.diff, meta.diff.header.from-file + settings + + foreground + #D46565 + + + + name + Diff header + scope + meta.diff.header.from-file, meta.diff.header.to-file + settings + + foreground + #FFFFFF + background + #4271ae + + + + name + Diff range + scope + meta.diff.range + settings + + fontStyle + italic + foreground + #3e999f + + + + name + diff.deleted + scope + markup.deleted + settings + + foreground + #F92672 + + + + name + diff.inserted + scope + markup.inserted + settings + + foreground + #A6E22E + + + + name + diff.changed + scope + markup.changed + settings + + foreground + #967EFB + + + + uuid + F96223EB-1A60-4617-92F3-D24D4F13DB09 + colorSpaceName + sRGB + semanticClass + theme.dark.tomorrow_night + + \ No newline at end of file diff --git a/themes/serene/highlight_themes/serene-light.tmTheme b/themes/serene/highlight_themes/serene-light.tmTheme new file mode 100644 index 0000000..24ba5cc --- /dev/null +++ b/themes/serene/highlight_themes/serene-light.tmTheme @@ -0,0 +1,252 @@ + + + + + + + + + comment + http://chriskempson.com + name + Tomorrow + settings + + + settings + + caret + #AEAFAD + foreground + #4D4D4C + invisibles + #D1D1D1 + lineHighlight + #EFEFEF + selection + #D6D6D6 + + + + name + Comment + scope + comment, string.quoted.double.block.python + settings + + foreground + #999999 + + + + name + Foreground + scope + keyword.operator.class, constant.other, source.php.embedded.line + settings + + fontStyle + + foreground + #666969 + + + + name + Variable, String Link, Regular Expression, Tag Name + scope + variable, support.other.variable, string.other.link, string.regexp, entity.name.tag, entity.other.attribute-name, meta.tag, declaration.tag + settings + + foreground + #A67878 + + + + name + Number, Constant, Function Argument, Tag Attribute, Embedded + scope + constant.numeric, constant.language, support.constant, constant.character, variable.parameter, punctuation.section.embedded, keyword.other.unit + settings + + fontStyle + + foreground + #E08355 + + + + name + Type, Class, Support + scope + type, +entity.name.class, entity.name.type.class, support.type, support.class + settings + + fontStyle + + foreground + #568A8F + + + + name + String, Symbols, Inherited Class, Markup Heading + scope + string, constant.other.symbol, entity.other.inherited-class, markup.heading + settings + + fontStyle + + foreground + #85AD74 + + + + name + Operator, Misc + scope + keyword.operator, constant.other.color + settings + + foreground + #568A8F + + + + name + Function, Special Method, Block Level + scope + entity.name.function, meta.function-call, support.function, keyword.other.special-method, meta.block-level + settings + + fontStyle + + foreground + #4271AE + + + + name + Keyword, Storage + scope + keyword, storage, storage.type + settings + + fontStyle + + foreground + #8959A8 + + + + name + Invalid + scope + invalid + settings + + background + #DF5F5F + fontStyle + + foreground + #FFFFFF + + + + name + Separator + scope + meta.separator + settings + + background + #4271AE + foreground + #FFFFFF + + + + name + Deprecated + scope + invalid.deprecated + settings + + background + #8959A8 + fontStyle + + foreground + #FFFFFF + + + + name + Diff foreground + scope + markup.inserted.diff, markup.deleted.diff, meta.diff.header.to-file, meta.diff.header.from-file + settings + + foreground + #FFFFFF + + + + name + Diff insertion + scope + markup.inserted.diff, meta.diff.header.to-file + settings + + background + #65C23A66 + + + + name + Diff deletion + scope + markup.deleted.diff, meta.diff.header.from-file + settings + + background + #C8282966 + + + + name + Diff header + scope + meta.diff.header.from-file, meta.diff.header.to-file + settings + + foreground + #FFFFFF + background + #4271ae + + + + name + Diff range + scope + meta.diff.range + settings + + fontStyle + italic + foreground + #3e999f + + + + uuid + 82CCD69C-F1B1-4529-B39E-780F91F07604 + colorSpaceName + sRGB + semanticClass + theme.light.tomorrow + + \ No newline at end of file diff --git a/themes/serene/sass/giscus_dark.scss b/themes/serene/sass/giscus_dark.scss new file mode 100644 index 0000000..a7b24c2 --- /dev/null +++ b/themes/serene/sass/giscus_dark.scss @@ -0,0 +1,100 @@ +main { + --primary-default: 109, 155, 255; + --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: 0.25rem !important; +} diff --git a/themes/serene/sass/giscus_light.scss b/themes/serene/sass/giscus_light.scss new file mode 100644 index 0000000..eea8d3d --- /dev/null +++ b/themes/serene/sass/giscus_light.scss @@ -0,0 +1,104 @@ +main { + --primary-default: 109, 155, 255; + --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: 0.25rem !important; +} diff --git a/themes/serene/sass/main.scss b/themes/serene/sass/main.scss new file mode 100644 index 0000000..e6cf8d6 --- /dev/null +++ b/themes/serene/sass/main.scss @@ -0,0 +1,1410 @@ +/* base + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +*, +*::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); +} + +@media screen and (min-width: 425px) { + body::-webkit-scrollbar { + width: 6px; + height: 6px; + } + + ::-webkit-scrollbar { + width: 4px; + height: 4px; + } + + ::-webkit-scrollbar-track { + background: #0000; + } + + ::-webkit-scrollbar-thumb { + background: #aeb7caa1; + border-radius: 0px; + } + + ::-webkit-scrollbar-thumb:hover { + background: #8a90a1a1; + } +} + +/* prose + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +.prose { + h1 { + font-size: 1.5em; + font-weight: bolder; + margin: 1em 0 0.5em 0; + } + + h2 { + font-size: 1.3em; + padding-top: 65px; + margin-top: -45px; + } + + h3 { + font-size: 1.1em; + padding-top: 65px; + margin-top: -45px; + } + + h4 { + font-size: 1.05em; + margin: 30px 0 15px 0; + } + + .zola-anchor { + visibility: hidden; + margin-left: 0.75em; + font-size: 0.85em; + } + + h1, h2, h3, h4, h5, h6 { + &:hover a.zola-anchor { + visibility: visible; + } + } + + p { + font-size: 1em; + line-height: inherit; + word-wrap: break-word; + } + + a { + color: var(--primary-color); + text-decoration-color: var(--primary-pale-color); + text-decoration-thickness: 1.5px; + + &:hover { + text-decoration-color: var(--primary-color); + } + + @media (max-width: 425px) { + text-decoration-color: unset; + text-decoration-thickness: auto; + } + } + + img { + max-width: 100%; + display: block; + margin: 0 auto; + border-radius: var(--img-border-radius); + } + + figure { + margin: 0 auto; + } + + figcaption { + width: 100%; + text-align: center; + margin: 5px auto; + } + + blockquote { + border-left: 3px var(--primary-pale-color) solid; + padding-left: 16px; + margin: 0 0 24px 0; + color: var(--text-pale-color); + } + + li::marker { + color: var(--primary-color); + } + + hr { + border: none; + background-color: var(--primary-pale-color); + height: 3px; + margin: 36px 0; + } + + table { + width: 100%; + border-spacing: 0; + border: 1px solid var(--primary-pale-color); + } + + thead { + background-color: var(--primary-pale-color); + } + + th, + td { + line-height: 2; + text-align: center; + border: 1px solid var(--primary-pale-color); + padding: 1px 10px; + } + + p>code, + li>code, + td>code, + th>code { + font-family: var(--code-font); + font-size: 0.8em; + padding: 1px 6px; + margin: 0 2px; + color: var(--primary-color); + background-color: var(--primary-pale-color); + border-radius: var(--inline-code-border-radius); + } + + pre { + font-size: 0.8em; + margin: 1.25em 0; + padding: 12px 48px 12px 16px; + line-height: 1.5; + border: 1.5px solid var(--primary-color); + overflow: auto; + + code { + font-family: var(--code-font); + } + + &[data-linenos] { + padding: 12px 48px 12px 8px; + } + + table { + width: 100%; + border-collapse: collapse; + border: none; + th, td { + line-height: 1.5; + } + } + + + table tr td:first-of-type { + color: var(--text-pale-color); + } + + table td { + padding: 0; + padding-right: 48px; + text-align: initial; + border: initial; + } + + table td:nth-of-type(1) { + text-align: right; + user-select: none; + padding-right: 1em; + mark::before { + left: -8px; + width: calc(100% + 1em + 8px); + } + } + + mark { + display: block; + color: inherit; + background-color: transparent; + position: relative; + overflow: visible; + + &::before { + pointer-events: none; + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: calc(100% + 48px + 48px); + background-color: var(--highlight-mark-color); + } + } + + &.mermaid { + border: none; + } + } + + pre > code > mark::before { + width: calc(100% + 48px + 16px); + left: -16px; + } + + .codeblock { + margin: 1em 0; + position: relative; + overflow: auto; + + pre { + margin: 0; + } + + .copy { + z-index: 9; + position: absolute; + right: 0.6em; + top: 0.6em; + width: 24px; + height: 24px; + padding: 2px; + cursor: pointer; + background: transparent; + border: none; + color: var(--text-pale-color); + + &.copied, &:hover { + color: var(--primary-color); + } + + svg { + width: 20px; + height: 20px; + } + } + } + + .codeblock-with-filename { + margin-top: calc(0px - 1.2em - 24px - 1em - 1.5px); + + .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); + } + + pre>code { + display: inline-block; + min-width: 100%; + margin-top: 3.2em; + } + } + + .footnote-definition { + display: flex; + + .footnote-definition-label { + position: static; + font-size: 1em; + line-height: inherit; + vertical-align: auto; + margin-right: 0.5em; + &::after { + content: "."; + } + } + + p { + margin: 0; + } + + button.backlink { + border: none; + background: none; + display: flex; + align-items: center; + margin-left: 0.5em; + color: var(--primary-color); + cursor: pointer; + } + } + + .callout { + line-height: inherit; + margin-bottom: 20px; + border: 1.5px solid var(--primary-color); + padding: 6px 12px; + display: flex; + gap: 12px; + + .icon { + height: 1.75em; + display: flex; + align-items: center; + } + + .content { + p { + margin: 0; + + +p { + margin: 0.2em 0 0.5em; + } + } + } + + &.note { + color: var(--callout-note-color); + border-color: var(--callout-note-color); + } + + &.important { + color: var(--callout-important-color); + border-color: var(--callout-important-color); + } + + &.warning { + color: var(--callout-warning-color); + border-color: var(--callout-warning-color); + } + + &.alert { + color: var(--callout-alert-color); + border-color: var(--callout-alert-color); + } + + &.question { + color: var(--callout-question-color); + border-color: var(--callout-question-color); + } + + &.tip { + color: var(--callout-tip-color); + border-color: var(--callout-tip-color); + } + } + + .mermaid { + background: #fff; + } +} + +/* prose pages + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +body.prose-page { + main { + font-size: var(--paragraph-font-size); + min-height: 100vh; + padding-top: 45px; + margin: 0 auto; + max-width: var(--main-max-width); + display: flex; + flex-direction: column; + justify-content: space-between; + } + + article { + padding: 45px 15px 30px; + font-size: var(--paragraph-font-size); + line-height: var(--paragraph-line-height); + } + + .giscus { + padding: 0 15px; + } +} + +/* layout blog list ( homepage / blogpage ) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +.layout-list { + .category { + font-size: 1.3em; + margin: 2em 15px 1em; + } + + .post-list { + margin-top: 25px; + } + + .post { + display: flex; + justify-content: space-between; + align-items: flex-end; + gap: 5px; + padding: 6px 15px; + margin: 1px 0; + border-radius: 2px; + font-size: 1.1em; + text-decoration: none; + color: var(--primary-color); + -webkit-tap-highlight-color: transparent; + + &:hover { + background-color: var(--primary-pale-color); + } + + @media (max-width: 768px) { + & { + font-size: 1em; + margin: 2.5px 5px; + padding: 5px 10px; + } + } + + .date { + white-space: nowrap; + } + } +} + +/* homepage + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +body.homepage { + #wrapper { + width: 100%; + min-height: 100vh; + display: flex; + justify-content: center; + align-items: center; + } + + main { + width: 100%; + max-width: var(--homepage-max-width); + padding: 3em 0 6em; + } + + #info { + padding: 0 15px; + display: flex; + gap: 1em; + + img { + height: var(--avatar-size); + width: var(--avatar-size); + border-radius: 50%; + } + + #text { + font-size: 1.25em; + display: flex; + flex-direction: column; + justify-content: space-around; + } + + #id { + margin-left: 0.5em; + color: var(--primary-color); + } + + #bio { + font-size: 0.85em; + } + } + + #links { + padding: 0 15px; + margin: 1.25em 0 1.75em; + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 0.5em 1em; + font-size: 1.25em; + + a, + button { + text-decoration: none; + color: var(--text-color); + + &:hover { + color: var(--primary-color); + } + } + + #left { + display: flex; + flex-wrap: wrap; + gap: 1em; + + a { + border-bottom: 1.5px solid var(--primary-color); + line-height: 24px; + } + } + + #right { + display: flex; + gap: 0.5em; + margin-left: auto; + + a, + button { + width: 24px; + height: 24px; + } + + button { + padding: 0; + border: none; + background-color: transparent; + cursor: pointer; + } + } + + @media (max-width: 425px) { + #left { + gap: 0.75em; + } + } + } + + #brief { + padding: 0 15px; + font-size: 1.15em; + line-height: 1.5; + } +} + +/* header + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +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) { + &.blur { + background-color: initial; + -webkit-backdrop-filter: blur(8px); + backdrop-filter: blur(8px); + } + } + + #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; + } + + nav { + font-size: 1.4em; + display: flex; + align-items: center; + + a { + color: var(--text-color); + text-decoration: none; + + &:hover { + color: var(--primary-color); + } + } + + .separator { + width: 24px; + text-align: center; + line-height: 1; + cursor: pointer; + border: none; + padding: 0; + background: transparent; + margin: 0 0.1em; + color: var(--text-color); + -webkit-tap-highlight-color: transparent; + } + .wrap { + &.left { + margin: 0 0.3em 0 -0.1em; + } + &.right { + margin: 0 0 0 0.3em; + } + } + .wrap-separator { + margin: 0 0.5em 0 0.1em; + } + + .fold { + display: none; + &.shown { + display: initial; + } + } + } + + #btns { + display: flex; + gap: 1em; + align-items: center; + padding-top: 1.5px; + + a, + button { + width: 24px; + height: 24px; + border: none; + background-color: transparent; + padding: 0; + text-decoration: none; + color: var(--text-color); + cursor: pointer; + + @media (hover: hover) { + &:hover { + color: var(--primary-color); + } + } + } + } + + #toc-toggle { + display: none; + + @media (max-width: 1024px) { + & { + display: inline-block; + + &.active { + color: var(--primary-color); + } + } + } + } +} + +/* footer + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +footer { + font-size: 0.95rem; + padding: 15px; + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; + gap: 15px; + color: var(--text-pale-color); + + .copyright { + margin-right: auto; + } + + .credits { + margin-left: auto; + } + + a { + color: var(--text-pale-color); + } + + @media (max-width: 374px) { + & { + flex-direction: column; + gap: 0; + + .copyright, + .credits { + margin: 0; + } + } + } +} + +/* blog page + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +body.blog { + #wrapper { + margin: 0 auto; + max-width: var(--main-max-width); + min-height: 100vh; + display: flex; + flex-direction: column; + justify-content: space-between; + } + + main { + margin: 60px 0; + } +} + +/* post page + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +body.post { + #wrapper { + display: flex; + justify-content: space-between; + font-size: 18px; + } + + #blank { + order: 1; + position: sticky; + width: calc((100% - var(--main-max-width)) / 2); + } + + 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; + } + + article { + padding: 0 15px 30px; + font-size: var(--paragraph-font-size); + line-height: var(--paragraph-line-height); + + #post-info { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + margin-bottom: 1em; + } + + #date { + color: var(--text-pale-color); + margin-bottom: 1em; + + #publish, + #updated { + margin-right: 20px; + } + } + + #tags { + margin-bottom: 1em; + display: flex; + gap: 1em; + flex-wrap: wrap; + + a { + color: var(--primary-color); + text-decoration: none; + span { + font-size: 0.95em; + margin-right: 2px; + } + } + } + + #outdate_alert.hidden { + display: none; + } + } + + .mermaid { + background: #fff; + } + + .giscus { + padding: 0 15px; + } + + aside { + order: 3; + width: calc((100% - var(--main-max-width)) / 2); + position: sticky; + margin-top: 195px; + top: 60px; + height: min-content; + font-size: var(--aside-font-size); + + nav { + padding: 5px 15px 5px 2em; + min-width: 60%; + overflow-y: auto; + max-height: calc(100vh - 50px - 5em); + scrollbar-width: none; + + &::-webkit-scrollbar { + width: 0; + } + + &:hover::-webkit-scrollbar { + width: 4px; + } + } + + ul { + list-style-type: none; + padding: 0; + line-height: 2; + margin: 0; + } + + a { + text-decoration: none; + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: var(--text-pale-color); + position: relative; + padding: 0 1em; + + &.h3 { + padding-left: 2.5em; + font-size: 0.95em; + } + + &::before { + display: block; + content: ""; + width: 2px; + position: absolute; + top: 0.6em; + bottom: 0.7em; + left: 0em; + background: transparent; + } + + &:hover, + &.active { + color: var(--primary-color); + } + + &:hover::before { + background-color: var(--primary-color); + } + } + + #back-to-top { + z-index: 99; + height: 28px; + padding: 0; + position: fixed; + bottom: 1.5em; + margin-left: 3em; + color: var(--text-pale-color); + background: transparent; + border: none; + cursor: pointer; + svg { + width: 28px; + height: 28px; + } + transform: translateY(-5px) scale(0); + transition: transform 0.2s; + + &.shown { + transform: translateY(0px) scale(1); + } + + &:hover { + color: var(--primary-color); + } + } + } + + @media screen and (max-width: 1024px) { + aside { + position: fixed; + right: -100%; + + &.shown { + right: 0; + } + + top: 45px; + margin-top: 0; + min-width: 260px; + height: 100%; + background-color: var(--bg-color); + box-shadow: rgba(0, 0, 0, 0.08) -2px 8px 8px 0px; + + nav { + padding: 1em 0; + } + + ul { + padding-left: 10px; + } + + #back-to-top { + display: none; + } + } + + @supports (-webkit-backdrop-filter: none) or (backdrop-filter: none) { + aside.blur { + background-color: fade(var(--bg-color), 75%); + -webkit-backdrop-filter: blur(8px); + backdrop-filter: blur(8px); + } + } + + #blank { + display: none; + } + + main { + margin: 0 auto; + } + } +} + +/* tag list page + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +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; + } + + main { + margin: 85px auto 60px; + } + + .title { + width: min-content; + font-size: 1.3em; + margin: 0 auto; + } + + .tags { + margin-top: 40px; + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; + font-size: 1.1em; + + a { + color: var(--primary-color); + text-decoration: none; + margin: 2em; + } + } + +} + +/* tag single page + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +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; + } + + main { + width: 100%; + margin: 85px auto 60px; + } + + + .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; + + a { + margin-left: 30px; + font-size: 0.5em; + color: var(--primary-color); + } + } + + .post { + display: flex; + justify-content: space-between; + align-items: flex-end; + gap: 5px; + padding: 6px 15px; + margin: 1px 0; + border-radius: 2px; + font-size: 1.1em; + text-decoration: none; + color: var(--primary-color); + -webkit-tap-highlight-color: transparent; + + &:hover { + background-color: var(--primary-pale-color); + } + + .date { + white-space: nowrap; + } + + @media screen and (max-width: 768px) { + & { + font-size: 1em; + margin: 2.5px 5px; + padding: 5px 10px; + } + } + } +} + +/* projects page + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +body.projects { + #wrapper { + margin: 0 auto; + max-width: var(--main-max-width); + min-height: 100vh; + display: flex; + flex-direction: column; + justify-content: space-between; + } + + main { + width: 100%; + margin: 90px auto 40px; + } + + .proj { + margin: 0px 15px 45px; + + .name { + font-size: 1.2em; + margin: 0 0 15px 0; + color: var(--primary-color); + } + + .desc { + line-height: 1.5; + margin: 0 0 10px 0; + + a { + color: var(--primary-color); + text-decoration: underline var(--primary-pale-color) 2px; + + &:hover { + text-decoration-color: var(--primary-color); + } + } + + p>code { + font-family: var(--code-font); + font-size: 0.8em; + padding: 1px 6px; + color: var(--primary-color); + background-color: var(--primary-pale-color); + border-radius: 4px; + } + } + + .more { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 1em; + + .tags { + font-size: 0.9em; + display: flex; + gap: 0.5em 1em; + flex-wrap: wrap; + + div { + color: var(--text-pale-color); + span { + font-size: 0.9em; + margin-right: 1.5px; + } + } + } + + .links { + margin-left: auto; + display: flex; + justify-content: end; + gap: 0.5em 1em; + + a { + text-decoration: none; + border-bottom: 1.5px solid var(--primary-color); + padding: 0 2px; + cursor: pointer; + color: inherit; + + &:visited { + color: inherit; + } + + &:hover { + color: var(--primary-color); + } + } + } + } + + } +} + +/* 404 page + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +body.not-found { + height: 100vh; + height: 100dvh; + display: flex; + justify-content: center; + align-items: center; + + .wrapper { + display: flex; + flex-direction: column; + align-items: center; + gap: 3em; + } + + .error { + display: flex; + align-items: center; + font-size: 2em; + color: var(--text-pale-color); + } + + .spacer { + background: var(--text-pale-color); + width: 2px; + height: 0.75em; + margin: 0 0.5em; + } + + .text { + font-size: 0.85em; + } + + a { + color: var(--primary-color); + text-decoration-color: var(--primary-pale-color); + + &:hover, &:active { + text-decoration-color: var(--primary-color); + } + } +} + + +/* normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +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: 0.67em 0; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +pre { + font-family: monospace, monospace; + font-size: 1em; +} + +a { + background-color: transparent; +} + +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: -0.25em; +} + +sup { + top: -0.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: 0.35em 0.75em 0.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; +} diff --git a/themes/serene/screenshot.png b/themes/serene/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..0c7e33d670502596f45002b6bacab12aae22f455 GIT binary patch literal 365996 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�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

2ip;D6&mVJ1bbk>p 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 gBXB2}-VzlAUlR;q4U7^l&QUK-(~ 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

BNg!D!ialM`}@P<@2mV?PTjmI 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 literal 0 HcmV?d00001 diff --git a/themes/serene/static/icon/alert.svg b/themes/serene/static/icon/alert.svg new file mode 100644 index 0000000..0ab867b --- /dev/null +++ b/themes/serene/static/icon/alert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/arrow-up.svg b/themes/serene/static/icon/arrow-up.svg new file mode 100644 index 0000000..f210d57 --- /dev/null +++ b/themes/serene/static/icon/arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/backlink.svg b/themes/serene/static/icon/backlink.svg new file mode 100644 index 0000000..1fa5351 --- /dev/null +++ b/themes/serene/static/icon/backlink.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/check.svg b/themes/serene/static/icon/check.svg new file mode 100644 index 0000000..dfbcaa3 --- /dev/null +++ b/themes/serene/static/icon/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/copy.svg b/themes/serene/static/icon/copy.svg new file mode 100644 index 0000000..21b1c15 --- /dev/null +++ b/themes/serene/static/icon/copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/email.svg b/themes/serene/static/icon/email.svg new file mode 100644 index 0000000..c481715 --- /dev/null +++ b/themes/serene/static/icon/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/fingerprint.svg b/themes/serene/static/icon/fingerprint.svg new file mode 100644 index 0000000..84b985c --- /dev/null +++ b/themes/serene/static/icon/fingerprint.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/github.svg b/themes/serene/static/icon/github.svg new file mode 100644 index 0000000..d7f6dff --- /dev/null +++ b/themes/serene/static/icon/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/important.svg b/themes/serene/static/icon/important.svg new file mode 100644 index 0000000..d4356a4 --- /dev/null +++ b/themes/serene/static/icon/important.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/moon.svg b/themes/serene/static/icon/moon.svg new file mode 100644 index 0000000..19f378e --- /dev/null +++ b/themes/serene/static/icon/moon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/note.svg b/themes/serene/static/icon/note.svg new file mode 100644 index 0000000..7e6118c --- /dev/null +++ b/themes/serene/static/icon/note.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/question.svg b/themes/serene/static/icon/question.svg new file mode 100644 index 0000000..9611d3a --- /dev/null +++ b/themes/serene/static/icon/question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/rss.svg b/themes/serene/static/icon/rss.svg new file mode 100644 index 0000000..481a430 --- /dev/null +++ b/themes/serene/static/icon/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/sun.svg b/themes/serene/static/icon/sun.svg new file mode 100644 index 0000000..c7cc2eb --- /dev/null +++ b/themes/serene/static/icon/sun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/tip.svg b/themes/serene/static/icon/tip.svg new file mode 100644 index 0000000..36f7a57 --- /dev/null +++ b/themes/serene/static/icon/tip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/toc.svg b/themes/serene/static/icon/toc.svg new file mode 100644 index 0000000..91bd824 --- /dev/null +++ b/themes/serene/static/icon/toc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/twitter.svg b/themes/serene/static/icon/twitter.svg new file mode 100644 index 0000000..457a783 --- /dev/null +++ b/themes/serene/static/icon/twitter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/icon/warning.svg b/themes/serene/static/icon/warning.svg new file mode 100644 index 0000000..6b90b3e --- /dev/null +++ b/themes/serene/static/icon/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/serene/static/js/lightense.min.js b/themes/serene/static/js/lightense.min.js new file mode 100644 index 0000000..1f979a6 --- /dev/null +++ b/themes/serene/static/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/themes/serene/static/js/main.js b/themes/serene/static/js/main.js new file mode 100644 index 0000000..3589fc0 --- /dev/null +++ b/themes/serene/static/js/main.js @@ -0,0 +1,166 @@ +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; + localStorage.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() { + toggleGiscusTheme(localStorage.getItem("theme") || (preferDark.matches ? "dark" : "light")); + window.removeEventListener('message', initGiscusTheme); + } + window.addEventListener('message', initGiscusTheme); + themeToggle.addEventListener('click', () => toggleTheme(localStorage.getItem("theme") == "dark" ? "light" : "dark")); + preferDark.addEventListener("change", e => toggleTheme(e.matches ? "dark" : "light")); + if (!localStorage.getItem("theme") && preferDark.matches) toggleTheme("dark"); + if (localStorage.getItem("theme") == "dark") toggleTheme("dark"); +} + +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 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 aside = document.querySelector('aside'); + tocToggle.addEventListener('click', () => { + tocToggle.classList.toggle('active'); + aside.classList.toggle('shown'); + }); +} + +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 actived = null; + const observer = new IntersectionObserver((entries) => entries.forEach(entry => { + if (entry.isIntersecting) { + const target = tocMap.get(entry.target); + if (target == actived) return; + if (actived) actived.classList.remove('active'); + target.classList.add('active'); + actived = target; + } + }), { rootMargin: '-9% 0px -90% 0px' }); + headers.forEach(header => observer.observe(header)); +} + +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); + }, 2000); + }); + }; + 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(); +enableNavFold(); +if (document.body.classList.contains('post')) { + enableOutdateAlert(); + enableTocToggle(); + enableTocIndicate(); + addBackToTopBtn(); +} +if (document.querySelector('.prose')) { + addCopyBtns(); + addFootnoteBacklink(); + enableImgLightense(); +} diff --git a/themes/serene/templates/404.html b/themes/serene/templates/404.html new file mode 100644 index 0000000..a20937a --- /dev/null +++ b/themes/serene/templates/404.html @@ -0,0 +1,16 @@ +{% extends "_base.html" %} + +{% block page %}not-found{% endblock page%} +{% block lang %}{{ config.default_language }}{% endblock lang %} +{% block title %}{{ config.extra.not_found_title }}{% endblock title %} + +{% block content %} +

+
+
404
+
+
{{ config.extra.not_found_error_text }}
+
+ {{ config.extra.not_found_recover_text }} +
+{% endblock %} diff --git a/themes/serene/templates/_base.html b/themes/serene/templates/_base.html new file mode 100644 index 0000000..78b479b --- /dev/null +++ b/themes/serene/templates/_base.html @@ -0,0 +1,28 @@ + + + + + + + + + {% block desc %}{% endblock desc %} + {% block title %}{% endblock title %} + + + + {% include "_custom_font.html" %} + {% include "_custom_css.html" %} + + {% block head %}{% endblock head %} + {% include "_head_extend.html" %} + + + + + {% block content %}{% endblock content %} + {% block script %}{% endblock script %} + + + + diff --git a/themes/serene/templates/_custom_css.html b/themes/serene/templates/_custom_css.html new file mode 100644 index 0000000..c011e13 --- /dev/null +++ b/themes/serene/templates/_custom_css.html @@ -0,0 +1,51 @@ + diff --git a/themes/serene/templates/_custom_font.html b/themes/serene/templates/_custom_font.html new file mode 100644 index 0000000..4c97de5 --- /dev/null +++ b/themes/serene/templates/_custom_font.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/themes/serene/templates/_footer.html b/themes/serene/templates/_footer.html new file mode 100644 index 0000000..7fffdbc --- /dev/null +++ b/themes/serene/templates/_footer.html @@ -0,0 +1,13 @@ +
+ + {% if config.extra.footer_credits %} +
+ powered by + zola + and + serene +
+ {% endif %} +
\ No newline at end of file diff --git a/themes/serene/templates/_giscus_script.html b/themes/serene/templates/_giscus_script.html new file mode 100644 index 0000000..e69de29 diff --git a/themes/serene/templates/_head_extend.html b/themes/serene/templates/_head_extend.html new file mode 100644 index 0000000..e69de29 diff --git a/themes/serene/templates/_header.html b/themes/serene/templates/_header.html new file mode 100644 index 0000000..e64e615 --- /dev/null +++ b/themes/serene/templates/_header.html @@ -0,0 +1,66 @@ +
+
+ +
+ {% if config.extra.blog_section_path is defined %} + {% set blog_section_path = config.extra.blog_section_path %} + {% endif %} + + {% if blog_section_path is defined and section.path is starting_with(blog_section_path) %} + {% set rss_icon = load_data(path="static/icon/rss.svg") %} + {% if section.generate_feed -%} + {{ rss_icon | safe }} + {% elif config.generate_feed -%} + {{ rss_icon | safe }} + {% endif %} + {% endif %} + + {% set moon_icon = load_data(path="static/icon/moon.svg") %} + {% set sun_icon = load_data(path="static/icon/sun.svg") %} + + + {% if blog_section_path is defined and section.path is starting_with(blog_section_path) %} + {% set toc_icon = load_data(path="static/icon/toc.svg") %} + {% if page.extra.toc is defined %}{% set show_toc = page.extra.toc %}{% else %}{% set show_toc = config.extra.toc %}{% endif %} + {% if show_toc and page %} + + {% endif %} + {% endif %} +
+
+
\ No newline at end of file diff --git a/themes/serene/templates/anchor-link.html b/themes/serene/templates/anchor-link.html new file mode 100644 index 0000000..b67c464 --- /dev/null +++ b/themes/serene/templates/anchor-link.html @@ -0,0 +1 @@ +# \ No newline at end of file diff --git a/themes/serene/templates/blog.html b/themes/serene/templates/blog.html new file mode 100644 index 0000000..6320586 --- /dev/null +++ b/themes/serene/templates/blog.html @@ -0,0 +1,40 @@ +{% extends "_base.html" %} + +{% block page %}blog{% endblock page%} +{% block lang %}{% if section.extra.lang %}{{ section.extra.lang }}{% else %}{{ section.lang }}{% endif %}{% endblock lang %} +{% block title %}{{ section.title }}{% endblock title %} +{% block desc %} + +{% endblock desc %} + +{% block content %} +{% include "_header.html" %} +
+
+ {% if config.extra.blog_categorized %} + {% for category,posts in section.pages | group_by(attribute="taxonomies.categories.0") -%} +
{{ category }}
+
+ {% for post in posts %} + + {{ post.title }} + {{ post.date | date}} + + {% endfor %} +
+ {% endfor %} + {% else %} +
+ {% for post in section.pages %} + + {{ post.title }} + + {{ post.date | date}} + + {% endfor %} +
+ {% endif %} +
+ {% include "_footer.html" %} +
+{% endblock content %} \ No newline at end of file diff --git a/themes/serene/templates/categories/list.html b/themes/serene/templates/categories/list.html new file mode 100644 index 0000000..e69de29 diff --git a/themes/serene/templates/categories/single.html b/themes/serene/templates/categories/single.html new file mode 100644 index 0000000..e69de29 diff --git a/themes/serene/templates/feed.xml b/themes/serene/templates/feed.xml new file mode 100644 index 0000000..fe1f139 --- /dev/null +++ b/themes/serene/templates/feed.xml @@ -0,0 +1,32 @@ + + + {% if section.title %}{{ section.title }}{% else %}{{ config.title }}{% endif %} + {%- if section.description %} + {{ section.description }} + {%- elif config.description %} + {{ config.description }} + {%- endif %} + + + {{ last_updated | date(format="%+") }} + {{ feed_url | safe }} + {%- for page in pages %} + + {{ page.title }} + {{ page.date | date(format="%+") }} + {{ page.updated | default(value=page.date) | date(format="%+") }} + {%- if page.summary %} + {{ page.summary }} + {%- endif %} + + {{ page.permalink | safe }} + {{ page.content }} + + {%- endfor %} + \ No newline at end of file diff --git a/themes/serene/templates/home.html b/themes/serene/templates/home.html new file mode 100644 index 0000000..15b9c83 --- /dev/null +++ b/themes/serene/templates/home.html @@ -0,0 +1,116 @@ +{% extends "_base.html" %} + +{% block page %}homepage{% endblock page%} +{% block lang %}{% if section.extra.lang %}{{ section.extra.lang }}{% else %}{{ section.lang }}{% endif %}{% endblock lang %} +{% block title %}{{ config.title }}{% endblock title %} +{% block desc %} + +{% endblock desc %} + +{% block head %} +{% if config.markdown.highlight_theme == "css" %} + +{% endif %} +{% if section.extra.math %} + + + + +{% endif %} +{% endblock head %} + +{% block content %} +
+
+
+ avatar +
+
+ {{ config.extra.name }} + {% if config.extra.display_id -%} + @{{ config.extra.id }} + {% endif -%} +
+
{{ config.extra.bio }}
+
+
+ + {% if config.extra.homepage_layout == 'about' %} +
+ {{ section.content | trim | safe }} +
+ {% elif config.extra.homepage_layout == 'list' %} + {% set blog_section_path = config.extra.blog_section_path | trim_start_matches(pat="/") %} + {% set section_md_path = blog_section_path ~ "/_index.md" %} + {% set blog_section = get_section(path=section_md_path) %} +
+ {% if config.extra.blog_categorized %} + {% for category,posts in blog_section.pages | group_by(attribute="taxonomies.categories.0") -%} +
{{ category }}
+
+ {% for post in posts %} + + {{ post.title }} + {{ post.date | date}} + + {% endfor %} +
+ {% endfor %} + {% else %} +
+ {% for post in blog_section.pages %} + + {{ post.title }} + + {{ post.date | date}} + + {% endfor %} +
+ {% endif %} +
+ {% endif %} +
+
+{% endblock content %} + +{% block script %} + +{% if section.extra.mermaid %} + +{% endif %} +{% endblock script %} \ No newline at end of file diff --git a/themes/serene/templates/post.html b/themes/serene/templates/post.html new file mode 100644 index 0000000..560865a --- /dev/null +++ b/themes/serene/templates/post.html @@ -0,0 +1,154 @@ +{% extends "_base.html" %} + +{% block page %}post{% endblock page %} +{% block lang -%} +{%- set blog_section_path = config.extra.blog_section_path | trim_start_matches(pat="/") -%} +{%- set section_md_path = blog_section_path ~ "/_index.md" -%} +{%- set section = get_section(path=section_md_path, metadata_only=true) -%} +{%- if page.extra.lang %}{{page.extra.lang}}{% elif section.extra.lang %}{{section.extra.lang}}{% else %}{{page.lang}}{% endif -%} +{%- endblock lang %} +{% block title %}{{ page.title }}{% endblock title %} +{% block desc %} + {% if page.summary %} + {% set desc = page.summary %} + {% elif page.description %} + {% set desc = page.description %} + {% endif %} + {% if desc %} + + {% endif %} +{% endblock desc %} + +{% block head %} +{% if config.markdown.highlight_theme == "css" %} + +{% endif %} +{% if page.extra.math %} + + + + +{% endif %} +{% endblock head %} + +{% block content %} +{% include "_header.html" %} +
+
+ +
+
+ {% if page.extra.copy is defined %}{% set allow_copy = page.extra.copy %}{% else %}{% set allow_copy = config.extra.copy %}{% endif %} + {% if allow_copy %} + {% set copy_icon = load_data(path="static/icon/copy.svg") %} + {% set check_icon = load_data(path="static/icon/check.svg") %} + + {% endif %} + {% set backlink_icon = load_data(path="static/icon/backlink.svg") %} +
+

{{ page.title }}

+
+
+ {{ page.date | date }} + {% if page.updated and page.updated != page.date -%} + Updated on {{ page.updated | date }} + {% endif -%} +
+ + {% if page.extra.display_tags is defined %}{% set display_tags = page.extra.display_tags %}{% elif config.extra.display_tags is defined %}{% set display_tags = config.extra.display_tags %}{% else %}{% set display_tags = true %}{% endif %} + + {% if page.taxonomies.tags is defined and display_tags == true %} +
+ {% for tag in page.taxonomies.tags -%} + {% set tag_slugify = tag | slugify -%} + #{{ tag }} + {%- endfor %} +
+ {% endif %} +
+ + {% if page.extra.outdate_alert is defined %}{% set show_outdate_alert = page.extra.outdate_alert %}{% else %}{% set show_outdate_alert = config.extra.outdate_alert %}{% endif %} + {% if page.extra.outdate_alert_days is defined %}{% set outdate_alert_days = page.extra.outdate_alert_days %}{% else %}{% set outdate_alert_days = config.extra.outdate_alert_days %}{% endif %} + + {% if show_outdate_alert -%} + + {% endif %} + + {% if page.extra.truncate_summary is defined %}{% set truncate_summary = page.extra.truncate_summary %}{% elif config.extra.truncate_summary is defined %}{% set truncate_summary = config.extra.truncate_summary %}{% else %}{% set truncate_summary = false %}{% endif %} + + {% if truncate_summary == true and page.summary %} + {{ page.content | trim_start_matches(pat=page.summary) | safe }} + {% else %} + {{ page.content | safe }} + {% endif %} +
+ + {% if page.extra.comment is defined %}{% set show_comment = page.extra.comment %}{% else %}{% set show_comment = config.extra.comment %}{% endif %} + {% if show_comment %} +
+ {% include "_giscus_script.html" %} + {% endif %} +
+ + {% include "_footer.html" %} +
+
+{% endblock content %} + +{% block script %} + +{% if page.extra.mermaid %} + +{% endif %} +{% endblock script %} \ No newline at end of file diff --git a/themes/serene/templates/projects.html b/themes/serene/templates/projects.html new file mode 100644 index 0000000..e85aad6 --- /dev/null +++ b/themes/serene/templates/projects.html @@ -0,0 +1,36 @@ +{% extends "_base.html" %} + +{% block page %}projects{% endblock page%} +{% block lang %}{% if section.extra.lang %}{{ section.extra.lang }}{% else %}{{ section.lang }}{% endif %}{% endblock lang %} +{% block title %}{{ section.title }}{% endblock title %} +{% block desc %} + +{% endblock desc %} + +{% block content %} +{% include "_header.html" %} +
+
+ {% set data = load_data(path="content/projects/data.toml", format="toml") %} + {% for proj in data.project %} +
+

{{ proj.name }}

+
{{ proj.desc | trim | markdown | safe }}
+
+
+ {% for tag in proj.tags %} +
#{{ tag }}
+ {% endfor %} +
+ +
+
+ {% endfor %} +
+ {% include "_footer.html" -%} +
+{% endblock content %} \ No newline at end of file diff --git a/themes/serene/templates/prose.html b/themes/serene/templates/prose.html new file mode 100644 index 0000000..feb38d1 --- /dev/null +++ b/themes/serene/templates/prose.html @@ -0,0 +1,72 @@ +{% extends "_base.html" %} + +{% block page %}prose-page{% endblock page %} +{% block lang -%} +{%- if section.extra.lang %}{{section.extra.lang}}{% else %}{{page.lang}}{% endif -%} +{%- endblock lang %} +{% block title %}{{ section.title }}{% endblock title %} +{% block desc %} + +{% endblock desc %} + +{% block head %} +{% if config.markdown.highlight_theme == "css" %} + +{% endif %} +{% if section.extra.math %} + + + + +{% endif %} +{% endblock head %} + +{% block content %} +{% include "_header.html" %} +
+
+
+ {% if section.extra.copy is defined %}{% set allow_copy = section.extra.copy %}{% else %}{% set allow_copy = config.extra.copy %}{% endif %} + {% if allow_copy %} + {% set copy_icon = load_data(path="static/icon/copy.svg") %} + {% set check_icon = load_data(path="static/icon/check.svg") %} + + {% endif %} + {% set backlink_icon = load_data(path="static/icon/backlink.svg") %} +
+ {{ section.content | safe }} +
+ + {% if section.extra.comment is defined %}{% set show_comment = section.extra.comment %}{% else %}{% set show_comment = config.extra.comment %}{% endif %} + {% if show_comment %} +
+ {% include "_giscus_script.html" %} + {% endif %} +
+ + {% include "_footer.html" %} +
+
+{% endblock content %} + +{% block script %} + +{% if section.extra.mermaid %} + +{% endif %} +{% endblock script %} \ No newline at end of file diff --git a/themes/serene/templates/shortcodes/alert.html b/themes/serene/templates/shortcodes/alert.html new file mode 100644 index 0000000..9302dca --- /dev/null +++ b/themes/serene/templates/shortcodes/alert.html @@ -0,0 +1,12 @@ +
+ {% set icon = load_data(path="static/icon/alert.svg") %} +
+ {{ icon | safe }} +
+
+ {% if header %} +

{{ header }}

+ {% endif %} + {{ body | markdown | safe }} +
+
\ No newline at end of file diff --git a/themes/serene/templates/shortcodes/codeblock.html b/themes/serene/templates/shortcodes/codeblock.html new file mode 100644 index 0000000..1052b49 --- /dev/null +++ b/themes/serene/templates/shortcodes/codeblock.html @@ -0,0 +1,4 @@ +
+
{{ name }}
+ {{ body | markdown | safe }} +
\ No newline at end of file diff --git a/themes/serene/templates/shortcodes/figure.html b/themes/serene/templates/shortcodes/figure.html new file mode 100644 index 0000000..8a4123f --- /dev/null +++ b/themes/serene/templates/shortcodes/figure.html @@ -0,0 +1,8 @@ +
+ + {% if via %} +
via
+ {% else %} +
{{ caption }}
+ {% endif %} +
\ No newline at end of file diff --git a/themes/serene/templates/shortcodes/important.html b/themes/serene/templates/shortcodes/important.html new file mode 100644 index 0000000..1b6a2e2 --- /dev/null +++ b/themes/serene/templates/shortcodes/important.html @@ -0,0 +1,12 @@ +
+ {% set icon = load_data(path="static/icon/important.svg") %} +
+ {{ icon | safe }} +
+
+ {% if header %} +

{{ header }}

+ {% endif %} + {{ body | markdown | safe }} +
+
\ No newline at end of file diff --git a/themes/serene/templates/shortcodes/mermaid.html b/themes/serene/templates/shortcodes/mermaid.html new file mode 100644 index 0000000..3d3725d --- /dev/null +++ b/themes/serene/templates/shortcodes/mermaid.html @@ -0,0 +1,3 @@ +
+  {{ body }}
+
\ No newline at end of file diff --git a/themes/serene/templates/shortcodes/note.html b/themes/serene/templates/shortcodes/note.html new file mode 100644 index 0000000..b6109a0 --- /dev/null +++ b/themes/serene/templates/shortcodes/note.html @@ -0,0 +1,12 @@ +
+ {% set icon = load_data(path="static/icon/note.svg") %} +
+ {{ icon | safe }} +
+
+ {% if header %} +

{{ header }}

+ {% endif %} + {{ body | markdown | safe }} +
+
\ No newline at end of file diff --git a/themes/serene/templates/shortcodes/question.html b/themes/serene/templates/shortcodes/question.html new file mode 100644 index 0000000..e91eba5 --- /dev/null +++ b/themes/serene/templates/shortcodes/question.html @@ -0,0 +1,12 @@ +
+ {% set icon = load_data(path="static/icon/question.svg") %} +
+ {{ icon | safe }} +
+
+ {% if header %} +

{{ header }}

+ {% endif %} + {{ body | markdown | safe }} +
+
\ No newline at end of file diff --git a/themes/serene/templates/shortcodes/tip.html b/themes/serene/templates/shortcodes/tip.html new file mode 100644 index 0000000..8fdca97 --- /dev/null +++ b/themes/serene/templates/shortcodes/tip.html @@ -0,0 +1,12 @@ +
+ {% set icon = load_data(path="static/icon/tip.svg") %} +
+ {{ icon | safe }} +
+
+ {% if header %} +

{{ header }}

+ {% endif %} + {{ body | markdown | safe }} +
+
\ No newline at end of file diff --git a/themes/serene/templates/shortcodes/warning.html b/themes/serene/templates/shortcodes/warning.html new file mode 100644 index 0000000..c140839 --- /dev/null +++ b/themes/serene/templates/shortcodes/warning.html @@ -0,0 +1,12 @@ +
+ {% set icon = load_data(path="static/icon/warning.svg") %} +
+ {{ icon | safe }} +
+
+ {% if header %} +

{{ header }}

+ {% endif %} + {{ body | markdown | safe }} +
+
\ No newline at end of file diff --git a/themes/serene/templates/tags/list.html b/themes/serene/templates/tags/list.html new file mode 100644 index 0000000..407d4bc --- /dev/null +++ b/themes/serene/templates/tags/list.html @@ -0,0 +1,25 @@ +{% extends "_base.html" %} + +{% block page %}tag-list{% endblock page%} +{% block lang -%} +{% set blog_section_path = config.extra.blog_section_path | trim_start_matches(pat="/") %} +{% set section_md_path = blog_section_path ~ "/_index.md"%} +{% set section = get_section(path=section_md_path, metadata_only=true) %} +{%- if section.extra.lang %}{{ section.extra.lang }}{% else %}{{ lang }}{% endif -%} +{%- endblock lang %} +{% block title %}Tags{% endblock title %} + +{% block content %} +{% include "_header.html" %} +
+
+
Tags
+
+ {% for tag in terms -%} + # {{ tag.name | lower }} + {%- endfor %} +
+
+ {% include "_footer.html" %} +
+{% endblock content %} \ No newline at end of file diff --git a/themes/serene/templates/tags/single.html b/themes/serene/templates/tags/single.html new file mode 100644 index 0000000..798074d --- /dev/null +++ b/themes/serene/templates/tags/single.html @@ -0,0 +1,31 @@ +{% extends "_base.html" %} + +{% block page %}tag-single{% endblock page %} +{% block lang -%} +{% set blog_section_path = config.extra.blog_section_path | trim_start_matches(pat="/") %} +{% set section_md_path = blog_section_path ~ "/_index.md"%} +{% set section = get_section(path=section_md_path, metadata_only=true) %} +{%- if section.extra.lang %}{{ section.extra.lang }}{% else %}{{ lang }}{% endif -%} +{%- endblock lang %} +{% block title %}{{section.title}}{% endblock title %} + +{% block content %} +{% include "_header.html" %} +
+
+
+ # {{ term.name }} + All Tags +
+
+ {% for post in term.pages %} + + {{ post.title }} + {{ post.date | date }} + + {% endfor %} +
+
+ {% include "_footer.html" %} +
+{% endblock content %} \ No newline at end of file diff --git a/themes/serene/theme.toml b/themes/serene/theme.toml new file mode 100644 index 0000000..251db2d --- /dev/null +++ b/themes/serene/theme.toml @@ -0,0 +1,12 @@ +name = "serene" +description = "A blog theme for zola, simple and clean" +license = "MIT" +homepage = "https://github.com/isunjn/serene" +min_version = "0.9.0" +demo = "https://serene-demo-site.vercel.app" + +[author] +name = "isunjn" +homepage = "https://github.com/isunjn" + +[extra]