feat: Init
This commit is contained in:
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "themes/PaperMod"]
|
||||||
|
path = themes/PaperMod
|
||||||
|
url = https://github.com/adityatelange/hugo-PaperMod.git
|
||||||
0
.hugo_build.lock
Normal file
0
.hugo_build.lock
Normal file
141
assets/css/extended/custom.css
Normal file
141
assets/css/extended/custom.css
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
/* Global link styles */
|
||||||
|
|
||||||
|
@import url("https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&family=Space+Grotesk:wght@300..700&display=swap");
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--gap: 24px;
|
||||||
|
--content-gap: 20px;
|
||||||
|
--nav-width: 1024px;
|
||||||
|
--main-width: 720px;
|
||||||
|
--header-height: 60px;
|
||||||
|
--footer-height: 60px;
|
||||||
|
--radius: 8px;
|
||||||
|
--theme: rgb(255, 255, 255);
|
||||||
|
--entry: rgb(255, 255, 255);
|
||||||
|
--primary: #282828;
|
||||||
|
--secondary: #3c3836;
|
||||||
|
--tertiary: rgb(214, 214, 214);
|
||||||
|
--content: rgb(31, 31, 31);
|
||||||
|
--code-block-bg: rgb(28, 29, 33);
|
||||||
|
--code-bg: rgb(245, 245, 245);
|
||||||
|
--border: rgb(238, 238, 238);
|
||||||
|
color-scheme: light;
|
||||||
|
|
||||||
|
--red: #cc241d;
|
||||||
|
--redl: #fb4934;
|
||||||
|
|
||||||
|
--green: #98971a;
|
||||||
|
--greenl: #b8bb26;
|
||||||
|
|
||||||
|
--yellow: #d79921;
|
||||||
|
--yellowl: #fabd2f;
|
||||||
|
|
||||||
|
--blue: #458588;
|
||||||
|
--bluel: #83a598;
|
||||||
|
|
||||||
|
--purple: #b16286;
|
||||||
|
--purplel: #d3869b;
|
||||||
|
|
||||||
|
--aqua: #689d6a;
|
||||||
|
--aqual: #8ec07c;
|
||||||
|
|
||||||
|
--gray: #928374;
|
||||||
|
--grayl: #a89984;
|
||||||
|
|
||||||
|
--orange: #d65d0e;
|
||||||
|
--orangel: #fe8019;
|
||||||
|
|
||||||
|
--post-entry-bg: white; /* soft gruvbox light */
|
||||||
|
--post-entry-fg: #282828;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root[data-theme="dark"] {
|
||||||
|
--theme: #181818;
|
||||||
|
--entry: rgb(46, 46, 51);
|
||||||
|
--primary: #fbf1c7;
|
||||||
|
--secondary: #ebdbb2;
|
||||||
|
--tertiary: rgb(65, 66, 68);
|
||||||
|
--content: rgb(196, 196, 197);
|
||||||
|
--code-block-bg: rgb(46, 46, 51);
|
||||||
|
--code-bg: rgb(55, 56, 62);
|
||||||
|
--border: rgb(151, 51, 51);
|
||||||
|
color-scheme: dark;
|
||||||
|
|
||||||
|
--post-entry-bg: #181818; /* bg1 */
|
||||||
|
--post-entry-fg: #ebdbb2;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: "Space Grotesk", sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav #menu span {
|
||||||
|
padding: 0px 2px;
|
||||||
|
|
||||||
|
text-decoration: underline;
|
||||||
|
text-decoration-thickness: 2px;
|
||||||
|
text-decoration-color: var(--green);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* *
|
||||||
|
* NAV SECTION
|
||||||
|
* */
|
||||||
|
|
||||||
|
nav #menu span:hover {
|
||||||
|
background-color: var(--green);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav #menu .active {
|
||||||
|
border: 0px;
|
||||||
|
color: var(--green);
|
||||||
|
|
||||||
|
text-decoration: underline;
|
||||||
|
text-decoration-thickness: 2px;
|
||||||
|
text-decoration-color: var(--green);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* *
|
||||||
|
* MAIN SECTION
|
||||||
|
* */
|
||||||
|
main a {
|
||||||
|
text-decoration: underline;
|
||||||
|
text-decoration-thickness: 2px;
|
||||||
|
text-decoration-color: var(--green);
|
||||||
|
}
|
||||||
|
|
||||||
|
main a:hover:not(.entry-link) {
|
||||||
|
background-color: var(--green);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
main h1 {
|
||||||
|
color: var(--green);
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-buttons,
|
||||||
|
.toc,
|
||||||
|
.post-tags a {
|
||||||
|
border: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.anchor {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* main h1::before { */
|
||||||
|
/* content: "#"; */
|
||||||
|
/* color: var(--red); */
|
||||||
|
/* color: var(--green); */
|
||||||
|
/* margin-right: 0.5em; */
|
||||||
|
/* font-weight: bold; */
|
||||||
|
/* font-weight: bold; */
|
||||||
|
/* font-style: italic; */
|
||||||
|
/* } */
|
||||||
|
|
||||||
|
main .post-entry {
|
||||||
|
border: 0px;
|
||||||
|
background-color: var(--post-entry-bg);
|
||||||
|
color: var(--post-entry-fg);
|
||||||
|
border: 2px solid #383838;
|
||||||
|
}
|
||||||
19
content/posts/demo.md
Normal file
19
content/posts/demo.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
author: ["Saurav Dhakal"]
|
||||||
|
title: "Understanding Separation of Concerns (SoC) in NestJS"
|
||||||
|
date: "2025-08-19"
|
||||||
|
summary: "A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers."
|
||||||
|
tags: ["nestjs", "typescript", "architecture"]
|
||||||
|
categories: ["Backend Development", "NestJS"]
|
||||||
|
series: ["NestJS"]
|
||||||
|
ShowToc: true
|
||||||
|
TocOpen: false
|
||||||
|
---
|
||||||
|
|
||||||
|
When building applications, one of the most important design principles to keep in mind is **Separation of Concerns (SoC)**. NestJS, with its modular architecture, makes applying SoC almost effortless — but understanding _why_ it matters and _how_ to use it properly will help you write cleaner, testable, and future-proof code.
|
||||||
|
|
||||||
|
## What is Separation of Concerns and Why it Matters?
|
||||||
|
|
||||||
|
The basic idea is:
|
||||||
|
|
||||||
|
> A program should be divided into distinct sections, where each section addresses a single responsibility.
|
||||||
8
content/search.md
Normal file
8
content/search.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
title: "Search" # in any language you want
|
||||||
|
layout: "search" # necessary for search
|
||||||
|
# url: "/archive"
|
||||||
|
# description: "Description for Search"
|
||||||
|
summary: "search"
|
||||||
|
placeholder: "placeholder text in search input box"
|
||||||
|
---
|
||||||
140
hugo.yaml
140
hugo.yaml
@@ -1,3 +1,141 @@
|
|||||||
baseURL: https://example.org/
|
baseURL: https://example.org/
|
||||||
languageCode: en-us
|
languageCode: en-us
|
||||||
title: My New Hugo Site
|
title: Saurav Dhakal
|
||||||
|
theme: ["PaperMod"]
|
||||||
|
paginate.paperSize: 1
|
||||||
|
|
||||||
|
enableRobotsTXT: true
|
||||||
|
buildDrafts: false
|
||||||
|
buildFuture: false
|
||||||
|
buildExpired: false
|
||||||
|
|
||||||
|
minify:
|
||||||
|
disableXML: true
|
||||||
|
minifyOutput: true
|
||||||
|
|
||||||
|
Copyright: SauravDhakal
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
home:
|
||||||
|
- HTML
|
||||||
|
- RSS
|
||||||
|
- JSON # necessary for search
|
||||||
|
|
||||||
|
params:
|
||||||
|
env: production # to enable google analytics, opengraph, twitter-cards and schema.
|
||||||
|
title: Saurav Dhakal
|
||||||
|
description: "A personal blog"
|
||||||
|
keywords: [Blog, Portfolio, SauravDhakal, Saurav, Dhakal, Backend]
|
||||||
|
author: saurav
|
||||||
|
# images: ["link or path of image for opengraph, twitter-cards>"]
|
||||||
|
DateFormat: "January 2, 2006"
|
||||||
|
defaultTheme: dark # dark, light
|
||||||
|
disableThemeToggle: true
|
||||||
|
|
||||||
|
ShowReadingTime: true
|
||||||
|
ShowShareButtons: true
|
||||||
|
ShowPostNavLinks: false
|
||||||
|
ShowBreadCrumbs: true
|
||||||
|
ShowCodeCopyButtons: true
|
||||||
|
ShowWordCount: true
|
||||||
|
ShowRssButtonInSectionTermList: true
|
||||||
|
UseHugoToc: true
|
||||||
|
disableSpecial1stPost: false
|
||||||
|
disableScrollToTop: false
|
||||||
|
comments: false
|
||||||
|
hidemeta: false
|
||||||
|
hideSummary: false
|
||||||
|
showtoc: true
|
||||||
|
tocopen: false
|
||||||
|
assets:
|
||||||
|
# disableHLJS: true # to disable highlight.js
|
||||||
|
# disableFingerprinting: true
|
||||||
|
favicon: "<link / abs url>"
|
||||||
|
favicon16x16: "<link / abs url>"
|
||||||
|
favicon32x32: "<link / abs url>"
|
||||||
|
apple_touch_icon: "<link / abs url>"
|
||||||
|
safari_pinned_tab: "<link / abs url>"
|
||||||
|
|
||||||
|
label:
|
||||||
|
text: "SauravDhakal"
|
||||||
|
|
||||||
|
# profile-mode
|
||||||
|
profileMode:
|
||||||
|
enabled: false # needs to be explicitly set
|
||||||
|
title: ExampleSite
|
||||||
|
subtitle: "This is subtitle"
|
||||||
|
imageUrl: "<img location>"
|
||||||
|
imageWidth: 120
|
||||||
|
imageHeight: 120
|
||||||
|
imageTitle: my image
|
||||||
|
buttons:
|
||||||
|
- name: Posts
|
||||||
|
url: posts
|
||||||
|
- name: Tags
|
||||||
|
url: tags
|
||||||
|
|
||||||
|
# home-info mode
|
||||||
|
homeInfoParams:
|
||||||
|
Title: "Hi there \U0001F44B, I'm Saurav!"
|
||||||
|
Content: >
|
||||||
|
I’m a software engineer who enjoys building thoughtful systems and learning how things really work.
|
||||||
|
<br />
|
||||||
|
This is my digital garden - notes, projects, and lessons along the way.
|
||||||
|
|
||||||
|
- <br />
|
||||||
|
|
||||||
|
Checkout my [CV](files/CV.pdf) for my works and projects.
|
||||||
|
|
||||||
|
socialIcons:
|
||||||
|
- name: github
|
||||||
|
url: "https://github.com/sauravdhakal12"
|
||||||
|
- name: linkedin
|
||||||
|
url: "https://www.linkedin.com/in/saurav-dhakal-9a8b27220/"
|
||||||
|
- name: x
|
||||||
|
url: "https://x.com/s0x1495"
|
||||||
|
|
||||||
|
analytics:
|
||||||
|
google:
|
||||||
|
SiteVerificationTag: "G-V0CXG8ZEG2"
|
||||||
|
|
||||||
|
cover:
|
||||||
|
hidden: true # hide everywhere but not in structured data
|
||||||
|
hiddenInList: true # hide on list pages and home
|
||||||
|
hiddenInSingle: true # hide on single page
|
||||||
|
|
||||||
|
# editPost:
|
||||||
|
# URL: "https://github.com/<path_to_repo>/content"
|
||||||
|
# Text: "Suggest Changes" # edit text
|
||||||
|
# appendFilePath: true # to append file path to Edit link
|
||||||
|
|
||||||
|
# for search
|
||||||
|
# https://fusejs.io/api/options.html
|
||||||
|
fuseOpts:
|
||||||
|
isCaseSensitive: false
|
||||||
|
shouldSort: true
|
||||||
|
location: 0
|
||||||
|
distance: 1000
|
||||||
|
threshold: 0.4
|
||||||
|
minMatchCharLength: 0
|
||||||
|
limit: 10 # refer: https://www.fusejs.io/api/methods.html#search
|
||||||
|
keys: ["title", "permalink", "summary", "content"]
|
||||||
|
menu:
|
||||||
|
main:
|
||||||
|
- identifier: posts
|
||||||
|
name: posts
|
||||||
|
url: /posts/
|
||||||
|
weight: 10
|
||||||
|
- identifier: tags
|
||||||
|
name: tags
|
||||||
|
url: /tags/
|
||||||
|
weight: 20
|
||||||
|
# Read: https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#using-hugos-syntax-highlighter-chroma
|
||||||
|
pygmentsUseClasses: true
|
||||||
|
markup:
|
||||||
|
highlight:
|
||||||
|
noClasses: false
|
||||||
|
# anchorLineNos: true
|
||||||
|
# codeFences: true
|
||||||
|
# guessSyntax: true
|
||||||
|
# lineNos: true
|
||||||
|
# style: monokai
|
||||||
|
|||||||
139
layouts/partials/footer.html
Normal file
139
layouts/partials/footer.html
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
|
||||||
|
{{- if not (.Param "hideFooter") }}
|
||||||
|
<footer class="footer">
|
||||||
|
{{- if not site.Params.footer.hideCopyright }}
|
||||||
|
{{- if site.Copyright }}
|
||||||
|
<span>Copyright © {{ now.Year }} {{ site.Copyright | markdownify }}</span>
|
||||||
|
{{- else }}
|
||||||
|
<span>© {{ now.Year }} <a href="{{ "" | absLangURL }}">{{ site.Title }}</a></span>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
</footer>
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if (not site.Params.disableScrollToTop) }}
|
||||||
|
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||||
|
<path d="M12 6H0l6-6z" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- partial "extend_footer.html" . }}
|
||||||
|
|
||||||
|
<script>
|
||||||
|
let menu = document.getElementById('menu');
|
||||||
|
if (menu) {
|
||||||
|
// Set the scroll position
|
||||||
|
const scrollPosition = localStorage.getItem("menu-scroll-position");
|
||||||
|
if (scrollPosition) {
|
||||||
|
menu.scrollLeft = parseInt(scrollPosition, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.onscroll = function () {
|
||||||
|
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||||
|
anchor.addEventListener("click", function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var id = this.getAttribute("href").substr(1);
|
||||||
|
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||||
|
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||||
|
behavior: "smooth"
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||||
|
}
|
||||||
|
if (id === "top") {
|
||||||
|
history.replaceState(null, null, " ");
|
||||||
|
} else {
|
||||||
|
history.pushState(null, null, `#${id}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{{- if (not site.Params.disableScrollToTop) }}
|
||||||
|
<script>
|
||||||
|
var mybutton = document.getElementById("top-link");
|
||||||
|
window.onscroll = function () {
|
||||||
|
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||||
|
mybutton.style.visibility = "visible";
|
||||||
|
mybutton.style.opacity = "1";
|
||||||
|
} else {
|
||||||
|
mybutton.style.visibility = "hidden";
|
||||||
|
mybutton.style.opacity = "0";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
</script>
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if (not site.Params.disableThemeToggle) }}
|
||||||
|
<script>
|
||||||
|
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||||
|
const html = document.querySelector("html");
|
||||||
|
if (html.dataset.theme === "dark") {
|
||||||
|
html.dataset.theme = 'light';
|
||||||
|
localStorage.setItem("pref-theme", 'light');
|
||||||
|
} else {
|
||||||
|
html.dataset.theme = 'dark';
|
||||||
|
localStorage.setItem("pref-theme", 'dark');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if (and (eq .Kind "page") (ne .Layout "archives") (ne .Layout "search") (.Param "ShowCodeCopyButtons")) }}
|
||||||
|
<script>
|
||||||
|
document.querySelectorAll('pre > code').forEach((codeblock) => {
|
||||||
|
const container = codeblock.parentNode.parentNode;
|
||||||
|
|
||||||
|
const copybutton = document.createElement('button');
|
||||||
|
copybutton.classList.add('copy-code');
|
||||||
|
copybutton.innerHTML = '{{- i18n "code_copy" | default "copy" }}';
|
||||||
|
|
||||||
|
function copyingDone() {
|
||||||
|
copybutton.innerHTML = '{{- i18n "code_copied" | default "copied!" }}';
|
||||||
|
setTimeout(() => {
|
||||||
|
copybutton.innerHTML = '{{- i18n "code_copy" | default "copy" }}';
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
copybutton.addEventListener('click', (cb) => {
|
||||||
|
if ('clipboard' in navigator) {
|
||||||
|
navigator.clipboard.writeText(codeblock.textContent);
|
||||||
|
copyingDone();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const range = document.createRange();
|
||||||
|
range.selectNodeContents(codeblock);
|
||||||
|
const selection = window.getSelection();
|
||||||
|
selection.removeAllRanges();
|
||||||
|
selection.addRange(range);
|
||||||
|
try {
|
||||||
|
document.execCommand('copy');
|
||||||
|
copyingDone();
|
||||||
|
} catch (e) { };
|
||||||
|
selection.removeRange(range);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (container.classList.contains("highlight")) {
|
||||||
|
container.appendChild(copybutton);
|
||||||
|
} else if (container.parentNode.firstChild == container) {
|
||||||
|
// td containing LineNos
|
||||||
|
} else if (codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName == "TABLE") {
|
||||||
|
// table containing LineNos and code
|
||||||
|
codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(copybutton);
|
||||||
|
} else {
|
||||||
|
// code blocks not having highlight as parent class
|
||||||
|
codeblock.parentNode.appendChild(copybutton);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{{- end }}
|
||||||
2
public/404.html
Normal file
2
public/404.html
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<!doctype html><html lang=en dir=auto data-theme=dark><head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=robots content="index, follow"><title>404 Page not found | Saurav Dhakal</title><meta name=keywords content><meta name=description content="A personal blog"><meta name=author content="saurav"><link rel=canonical href=http://localhost:1313/404.html><meta name=google-site-verification content="G-V0CXG8ZEG2"><link crossorigin=anonymous href=/assets/css/stylesheet.1819d1b52fd9f2af4d88316fde3f9b918c48d08dac9a2e1ef0a7ca49d1f18ddb.css integrity="sha256-GBnRtS/Z8q9NiDFv3j+bkYxI0I2smi4e8KfKSdHxjds=" rel="preload stylesheet" as=style><link rel=icon href=http://localhost:1313/%3Clink%20/%20abs%20url%3E><link rel=icon type=image/png sizes=16x16 href=http://localhost:1313/%3Clink%20/%20abs%20url%3E><link rel=icon type=image/png sizes=32x32 href=http://localhost:1313/%3Clink%20/%20abs%20url%3E><link rel=apple-touch-icon href=http://localhost:1313/%3Clink%20/%20abs%20url%3E><link rel=mask-icon href=http://localhost:1313/%3Clink%20/%20abs%20url%3E><meta name=theme-color content="#2e2e33"><meta name=msapplication-TileColor content="#2e2e33"><link rel=alternate hreflang=en href=http://localhost:1313/404.html><noscript><style>#theme-toggle,.top-link{display:none}</style></noscript><meta property="og:url" content="http://localhost:1313/404.html"><meta property="og:site_name" content="Saurav Dhakal"><meta property="og:title" content="404 Page not found"><meta property="og:description" content="A personal blog"><meta property="og:locale" content="en-us"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="404 Page not found"><meta name=twitter:description content="A personal blog"></head><body class=list id=top><header class=header><nav class=nav><div class=logo><a href=http://localhost:1313/ accesskey=h title="SauravDhakal (Alt + H)">SauravDhakal</a><div class=logo-switches></div></div><ul id=menu><li><a href=http://localhost:1313/posts/ title=posts><span>posts</span></a></li><li><a href=http://localhost:1313/tags/ title=tags><span>tags</span></a></li></ul></nav></header><main class=main><div class=not-found>404</div></main><footer class=footer><span>Copyright © 2025 SauravDhakal</span></footer><a href=#top aria-label="go to top" title="Go to Top (Alt + G)" class=top-link id=top-link accesskey=g><svg viewBox="0 0 12 6" fill="currentColor"><path d="M12 6H0l6-6z"/></svg>
|
||||||
|
</a><script>let menu=document.getElementById("menu");if(menu){const e=localStorage.getItem("menu-scroll-position");e&&(menu.scrollLeft=parseInt(e,10)),menu.onscroll=function(){localStorage.setItem("menu-scroll-position",menu.scrollLeft)}}document.querySelectorAll('a[href^="#"]').forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();var t=this.getAttribute("href").substr(1);window.matchMedia("(prefers-reduced-motion: reduce)").matches?document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView():document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView({behavior:"smooth"}),t==="top"?history.replaceState(null,null," "):history.pushState(null,null,`#${t}`)})})</script><script>var mybutton=document.getElementById("top-link");window.onscroll=function(){document.body.scrollTop>800||document.documentElement.scrollTop>800?(mybutton.style.visibility="visible",mybutton.style.opacity="1"):(mybutton.style.visibility="hidden",mybutton.style.opacity="0")}</script></body></html>
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user