Merge branch 'develop'
This commit is contained in:
@@ -9,14 +9,17 @@
|
||||
"js": "2.lazyload.1168fc21175de558d316.min.js"
|
||||
},
|
||||
"main": {
|
||||
"css": "main.056eb67e3d086eb33a6f.min.css",
|
||||
"js": "main.48637aff6f96e597ae05.min.js"
|
||||
"css": "main.b8f5fbcfbcd649f85b5e.min.css",
|
||||
"js": "main.5f08acb7138457c0f12a.min.js"
|
||||
},
|
||||
"toc": {
|
||||
"js": "4.toc.cadd3d10b2475406483a.min.js"
|
||||
},
|
||||
"vendors~app": {
|
||||
"js": "4.vendors~app.7827f3b332495242afbd.min.js"
|
||||
"js": "5.vendors~app.c54336286ff97590d35b.min.js"
|
||||
},
|
||||
"vendors~bootstrap": {
|
||||
"js": "5.vendors~bootstrap.ebc6358ec2d8424a6fb0.min.js"
|
||||
"js": "6.vendors~bootstrap.f09f391b73c48906a4a7.min.js"
|
||||
},
|
||||
"": {
|
||||
"ttf": [
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||
{{ partial "head.html" . }}
|
||||
{{ partial "schema.html" . }}
|
||||
{{ partial "matomo.html" }}
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@@ -15,10 +15,17 @@
|
||||
|
||||
<div class="row row-cols-1 row-cols-lg-3">
|
||||
{{ range .Pages }}
|
||||
<div class="col mb-3">
|
||||
{{ .Render "card" }}
|
||||
</div>
|
||||
<div class="col mb-3">
|
||||
{{ .Render "card" }}
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
<div class="row">
|
||||
{{ $paginator := .Paginate (where .Pages "Type" "post") }}
|
||||
{{ range $paginator.Pages }}
|
||||
{{.}}
|
||||
{{ end }}
|
||||
{{ template "_internal/pagination.html" . }}
|
||||
</div>
|
||||
</main>
|
||||
{{ end }}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
</ul>
|
||||
</div>
|
||||
<ul>
|
||||
{{ range .Site.Taxonomies.tags }}
|
||||
{{ range .Site.Taxonomies.series }}
|
||||
<li><a href="{{ .Page.Permalink }}">{{ .Page.Title }}</a> {{ .Count }}</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
|
||||
@@ -1,60 +1,83 @@
|
||||
{{ define "main" }}
|
||||
<img src="/images/front-wallpaper.svg" class="front-background">
|
||||
<main class="homepage container py-6">
|
||||
<main class="homepage py-6">
|
||||
<div class="container">
|
||||
<div class="hero row pt-3 pt-md-6">
|
||||
<div class="col-12 col-md-6 d-flex flex-column justify-content-center text-center text-md-left">
|
||||
<div>
|
||||
<h1 class="display-4">{{ .Site.Title }}</h1>
|
||||
{{- with .Site.Params.description -}}
|
||||
</div>
|
||||
{{- with .Site.Params.homepageImage -}}
|
||||
<div class="homepage-image d-xs-block d-md-none pb-4">
|
||||
<img data-src="{{ . | relURL }}" class="img-fluid" data-aos="zoom-in">
|
||||
</div>
|
||||
{{- end -}}
|
||||
<div>
|
||||
{{- with .Site.Params.description -}}
|
||||
<h3 class="font-weight-normal">{{ . | safeHTML }}</h3>
|
||||
{{- end -}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-0 col-md-6 d-flex">
|
||||
<div class="col-12 col-md-6 d-flex">
|
||||
{{- with .Site.Params.homepageImage -}}
|
||||
{{/* <div class="homepage-image" data-aos="zoom-in"> */}}
|
||||
<div class="homepage-image d-none d-sm-block">
|
||||
<img data-src="{{ . | relURL }}" class="img-fluid">
|
||||
<img data-src="{{ . | relURL }}" class="img-fluid" data-aos="zoom-in">
|
||||
</div>
|
||||
{{- end -}}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
|
||||
<!-- Latest article -->
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="row d-none d-md-block">
|
||||
{{- range first 1 (where .Site.RegularPages "Type" "in" .Site.Params.mainSections) -}}
|
||||
{{ $page := . }}
|
||||
<div class="latest row py-lg-5">
|
||||
<div class="col-lg-6 mb-3">
|
||||
{{- with .Resources.Match "images/banner.svg" -}}
|
||||
{{ range . }}
|
||||
{{- $image := . -}}
|
||||
<a href="{{ $page.RelPermalink }}" class="d-block">
|
||||
<img data-src="{{ $image.RelPermalink }}" class="img-fluid rounded" alt="{{ $page.Title }}" data-aos="zoom-in">
|
||||
</a>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
</div>
|
||||
<div class="col-lg-6 mb-3">
|
||||
<h5 class="created text-muted text-uppercase font-weight-bold">{{ $page.Date.Format "January 2, 2006" }}</h5>
|
||||
<h2><a href="{{ $page.RelPermalink }}">{{ $page.Title }}</a></h2>
|
||||
|
||||
<div class="content">
|
||||
{{ $page.Summary }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="latest d-flex py-lg-5 justify-content-center">
|
||||
{{ .Render "card-large" }}
|
||||
</div>
|
||||
{{- end -}}
|
||||
|
||||
<!-- Articles -->
|
||||
<div class="articles row row-cols-1 row-cols-lg-3">
|
||||
{{ range after 1 (where .Site.RegularPages "Type" "in" .Site.Params.mainSections) }}
|
||||
<div class="col mb-3" data-aos="zoom-in">
|
||||
{{ .Render "card" }}
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
<div class="row d-block d-md-none">
|
||||
{{- range first 1 (where .Site.RegularPages "Type" "in" .Site.Params.mainSections) -}}
|
||||
<div class="latest d-flex justify-content-center py-lg-5">
|
||||
{{ .Render "card" }}
|
||||
</div>
|
||||
{{- end -}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="row d-flex justify-content-center justify-content-md-between align-content-between">
|
||||
{{ range first 3 (after 1 (where .Site.RegularPages "Type" "in" .Site.Params.mainSections)) }}
|
||||
{{ .Render "card" }}
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="row d-none d-md-block">
|
||||
{{- range first 1 (after 4 (where .Site.RegularPages "Type" "in" .Site.Params.mainSections)) -}}
|
||||
<div class="latest d-flex py-lg-5">
|
||||
{{ .Render "card-large" }}
|
||||
</div>
|
||||
{{- end -}}
|
||||
</div>
|
||||
<div class="row d-block d-md-none">
|
||||
{{- range first 1 (after 4 (where .Site.RegularPages "Type" "in" .Site.Params.mainSections)) -}}
|
||||
<div class="latest d-flex justify-content-center py-lg-5">
|
||||
{{ .Render "card" }}
|
||||
</div>
|
||||
{{- end -}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="row d-flex justify-content-center justify-content-md-between align-content-between">
|
||||
{{ range first 3 (after 5 (where .Site.RegularPages "Type" "in" .Site.Params.mainSections)) }}
|
||||
{{ .Render "card" }}
|
||||
{{ end }}
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col d-flex justify-content-center text-center pt-5">
|
||||
<a href="/post/">
|
||||
<button type="button" class="btn btn-lg btn-outline-primary">See all posts</button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
{{ $current := . }}
|
||||
<nav class="navbar navbar-expand-md navbar-light bg-light fixed-top" id="navbar-main-menu">
|
||||
<div class="container">
|
||||
|
||||
<a class="navbar-brand" href="{{ .Site.BaseURL }}"><img src="/images/icons/Gods.png" width="50" height="50" class="mr-3 rotate-a-20" id="navbar-brand-image" />{{ .Site.Title }}</a>
|
||||
<a class="navbar-brand" href="{{ .Site.BaseURL }}"><img src="/images/icons/pillar.png" height="15" class="mr-2 rotate-a-20" id="navbar-brand-image" />{{ .Site.Title }}</a>
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#main-menu" aria-controls="main-menu" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
@@ -17,16 +16,13 @@
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
<li class="nav-item" id="nav-search">
|
||||
<form id="search-form" method="get" action="/search" method="POST" class="form-inline">
|
||||
<form id="search-form" method="get" action="/search/" method="POST" class="form-inline">
|
||||
<input type="text" name="q" id="search" class="form-control form-control-sm" placeholder="Search">
|
||||
<div class="input-group">
|
||||
<div class="input-group ">
|
||||
<div class="input-group-append">
|
||||
<!-- <div> -->
|
||||
<button type="submit" id="search-button" class="btn btn-primary"> <i class="fa fa-search fa-sm"></i></button>
|
||||
<!-- <button type="submit" id="search-button" class="btn btn-primary form-control form-control-sm"> <i class="fa fa-search"></i></button> -->
|
||||
</div>
|
||||
</form>
|
||||
<!-- <i class="fas fa-search" data-fa-transform="down-5"></i> -->
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
15
layouts/partials/matomo.html
Normal file
15
layouts/partials/matomo.html
Normal file
@@ -0,0 +1,15 @@
|
||||
<!-- Matomo -->
|
||||
<script type="text/javascript">
|
||||
var _paq = window._paq || [];
|
||||
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
|
||||
_paq.push(['trackPageView']);
|
||||
_paq.push(['enableLinkTracking']);
|
||||
(function() {
|
||||
var u="//matomo.panaetius.co.uk/";
|
||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||
_paq.push(['setSiteId', '2']);
|
||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
|
||||
})();
|
||||
</script>
|
||||
<!-- End Matomo Code -->
|
||||
@@ -1,10 +1,8 @@
|
||||
{{- $related := .Site.RegularPages.Related . | first 3 -}}
|
||||
{{- with $related -}}
|
||||
<div class="related-content row mt-5 row-cols-1 row-cols-lg-5">
|
||||
{{- range . -}}
|
||||
<div class="col mb-3">
|
||||
{{ .Render "card" }}
|
||||
</div>
|
||||
{{- end -}}
|
||||
</div>
|
||||
<div class="related-content row d-flex justify-content-around">
|
||||
{{- range . -}}
|
||||
{{ .Render "card" }}
|
||||
{{- end -}}
|
||||
</div>
|
||||
{{- end -}}
|
||||
|
||||
38
layouts/post/card-large.html
Normal file
38
layouts/post/card-large.html
Normal file
@@ -0,0 +1,38 @@
|
||||
<div class="d-flex justify-content-center align-items-center py-md-4 card-large">
|
||||
{{ $page:= . }}
|
||||
{{- with .Resources.Match "images/banner.svg" -}}
|
||||
{{ range . }}
|
||||
{{- $image := . -}}
|
||||
<div class="col-md-6 card-large-image" style="background-image: url('{{ $image.RelPermalink }}');">
|
||||
<!-- <a href="{{ $page.RelPermalink }}" class="d-block">
|
||||
<img data-src="{{ $image.RelPermalink }}" class="" alt="{{ $page.Title }}" data-aos="zoom-in" style="">
|
||||
</a> -->
|
||||
<div style="background-image: url('{{ $image.RelPermalink }}')"></div>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<h5 class="created text-muted text-uppercase font-weight-bold">{{ $page.Date.Format "January 2, 2006" }}</h5>
|
||||
<p class="text-muted">{{ $page.ReadingTime }} min read</p>
|
||||
</div>
|
||||
<h2><a class="card-title-gray" href="{{ $page.RelPermalink }}">{{ $page.Title }}</a></h2>
|
||||
|
||||
<div class="content">
|
||||
{{ $page.Summary | truncate 200 }}
|
||||
</div>
|
||||
<div>
|
||||
{{- with $page.Params.tags -}}
|
||||
<div class="d-flex justify-content-start">
|
||||
<div class="tags">
|
||||
{{- range . -}}
|
||||
<a class="badge badge-dark mr-2" href="{{ "/tags/" | relLangURL }}{{ . | urlize }}/">
|
||||
<i class="fas fa-tag mr-2"></i>{{ . }}
|
||||
</a>
|
||||
{{- end -}}
|
||||
</div>
|
||||
</div>
|
||||
{{- end -}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
17
layouts/post/card-start.html
Normal file
17
layouts/post/card-start.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<div class="d-flex flex-column card-regular col-md-3 my-2 my-md-5 px-0" style="height: 500px; overflow: hidden;">
|
||||
{{ $page := . }}
|
||||
{{- with .Resources.Match "images/banner.svg" -}}
|
||||
{{ range . }}
|
||||
{{- $image := . -}}
|
||||
<div style="height: 60%; overflow: hidden;">
|
||||
<div class="ma-0 pa-0" style="background-image: url('{{ $image.RelPermalink }}'); background-position: center; background-size: cover; height: 250%;">
|
||||
</div>
|
||||
</div>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
<div class="mx-3 my-3">
|
||||
<h5 class="created text-muted text-uppercase font-weight-bold">{{ $page.Date.Format "January 2, 2006" }}</h5>
|
||||
<p class="text-muted">{{ $page.ReadingTime }} min read</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,18 +1,31 @@
|
||||
<div class="card h-100" data-aos="zoom-in">
|
||||
<div class="d-flex flex-column card-regular card-regular-width my-2 my-md-5 px-0 align-items-stretch">
|
||||
{{ $page := . }}
|
||||
<a href="{{ $page.RelPermalink }}" class="d-block">
|
||||
{{- with .Resources.Match "images/banner.svg" -}}
|
||||
{{ range . }}
|
||||
{{- $image := . -}}
|
||||
<img data-src="{{ $image.RelPermalink }}" class="card-img-top mx-auto d-block pt-2" alt="{{ $page.Title }}">
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
<div class="card-body">
|
||||
<h4 class="card-title">{{ $page.Title }}</h4>
|
||||
<p class="card-text text-muted text-uppercase">{{ $page.Date.Format "January 2, 2006" }}</p>
|
||||
<div class="card-text">
|
||||
{{ $page.Summary | plainify }}
|
||||
</div>
|
||||
{{- with .Resources.Match "images/banner.svg" -}}
|
||||
{{ range . }}
|
||||
{{- $image := . -}}
|
||||
<div class="card-regular-image-parent">
|
||||
<div class="ma-0 pa-0 card-regular-image" style="background-image: url('{{ $image.RelPermalink }}');">
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
<div class="mx-3 my-3">
|
||||
<h5 class="created text-muted text-uppercase font-weight-bold mb-0">{{ $page.Date.Format "January 2, 2006" }}</h5>
|
||||
<p class="text-muted">{{ $page.ReadingTime }} min read</p>
|
||||
<h2><a class="card-title-gray" href="{{ $page.RelPermalink }}">{{ $page.Title }}</a></h2>
|
||||
<p>{{ $page.Summary | truncate 200 }}</p>
|
||||
<div>
|
||||
{{- with $page.Params.tags -}}
|
||||
<div class="d-flex justify-content-start align-items-stretch">
|
||||
<div class="tags">
|
||||
{{- range . -}}
|
||||
<a class="badge badge-dark mr-2" href="{{ "/tags/" | relLangURL }}{{ . | urlize }}/">
|
||||
<i class="fas fa-tag mr-2"></i>{{ . }}
|
||||
</a>
|
||||
{{- end -}}
|
||||
</div>
|
||||
</div>
|
||||
{{- end -}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
18
layouts/post/list.html
Normal file
18
layouts/post/list.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{{ define "main" }}
|
||||
<main class="list container pt-7 pb-5>">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-8">
|
||||
<h1>All Posts</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row d-flex justify-content-center justify-content-md-around">
|
||||
{{ $paginator := .Paginate (where .Pages "Type" "post") }}
|
||||
{{ range $paginator.Pages }}
|
||||
{{ .Render "card" }}
|
||||
{{ end }}
|
||||
</div>
|
||||
<div class="d-flex justify-content-center pt-5">
|
||||
{{ template "_internal/pagination.html" . }}
|
||||
</div>
|
||||
</main>
|
||||
{{ end }}
|
||||
@@ -3,13 +3,13 @@
|
||||
</div>
|
||||
<main class="content-page container-fluid pt-7 pb-5">
|
||||
{{ $page := . }}
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-12 col-lg-7 order-1 order-lg-0 shadow-lg">
|
||||
{{- with .Resources.Match "images/banner.svg" -}}
|
||||
{{ range . }}
|
||||
<div class="row justify-content-center mb-3">
|
||||
<div class="col-lg-10">
|
||||
<img data-src="{{ .RelPermalink }}" class="img-fluid rounded mx-auto d-block" alt="{{ $page.Title }}" data-aos="zoom-in">
|
||||
<img data-src="{{ .RelPermalink }}" class="img-fluid rounded mx-auto d-block mt-3" alt="{{ $page.Title }}" data-aos="zoom-in">
|
||||
</div>
|
||||
</div>
|
||||
{{- end -}}
|
||||
@@ -17,20 +17,21 @@
|
||||
<article>
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-9">
|
||||
<h1 class="display-3">{{ $page.Title }}</h1>
|
||||
|
||||
<div class="d-flex justify-content-between align-items-stretch post-info">
|
||||
<div>{{ partial "authors.html" $page }}</div>
|
||||
<div class="meta text-muted mb-3 d-flex flex-column justify-content-start">
|
||||
<div>
|
||||
<p class="text-muted">Posted on:</p>
|
||||
<h1 class="card-title-gray pt-4">{{ $page.Title }}</h1>
|
||||
<div class="row">
|
||||
{{/* <div class="d-flex justify-content-end align-items-stretch post-info"> */}}
|
||||
<div class="col-6">{{ partial "authors.html" $page }}</div>
|
||||
<div class="text-muted mb-3 d-flex flex-column justify-content-start col-6">
|
||||
<div>
|
||||
<p class="text-muted">Posted on</p>
|
||||
</div>
|
||||
<div>
|
||||
<p class="created text-muted text-uppercase font-weight-bold mb-1">{{ $page.Date.Format "January 2, 2006" }}</p>
|
||||
<span class="mr-2"><i class="fas fa-book-open mr-2"></i>{{ $page.WordCount }} words</span>
|
||||
<span><i class="fas fa-clock mr-2"></i>{{ $page.ReadingTime }} min read</span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<p class="created text-muted text-uppercase font-weight-bold mb-1">{{ $page.Date.Format "January 2, 2006" }}</p>
|
||||
<span class="mr-2"><i class="fas fa-book-open mr-2"></i>{{ $page.WordCount }} words</span>
|
||||
<span><i class="fas fa-clock mr-2"></i>{{ $page.ReadingTime }} min read</span>
|
||||
</div>
|
||||
</div>
|
||||
{{/* </div> */}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -41,7 +42,7 @@
|
||||
<div class="col-lg-9">
|
||||
<div class="tags my-3">
|
||||
{{- range . -}}
|
||||
<a class="badge badge-dark mr-2" href="{{ "/tags/" | relLangURL }}{{ . | urlize }}">
|
||||
<a class="badge badge-dark mr-2" href="{{ "/tags/" | relLangURL }}{{ . | urlize }}/">
|
||||
<i class="fas fa-tag mr-2"></i>{{ . }}
|
||||
</a>
|
||||
{{- end -}}
|
||||
@@ -67,21 +68,21 @@
|
||||
</div>
|
||||
</div>
|
||||
{{- end -}}
|
||||
|
||||
</article>
|
||||
</div>
|
||||
<div id="" class="col-lg-2 toc-sidebar d-none d-md-block">
|
||||
<aside>
|
||||
<h5 class="text-center text-uppercase">Table of contents</h5>
|
||||
<div class="toc-contents">
|
||||
<div class="col-12 col-lg-2 order-0 ml-lg-2 d-none d-lg-block">
|
||||
<div class="sticky-top shadow-sm toc-container">
|
||||
<p class="text-uppercase text-center text-muted pt-4">On this page</p>
|
||||
<div class="toc-contents toc pb-3">
|
||||
{{ .TableOfContents }}
|
||||
</div>
|
||||
</aside>
|
||||
<div class="d-flex justify-content-center">
|
||||
<img src="/images/icons/Wizard.png" style="width: 50%;" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-lg-9 order-2">
|
||||
{{ partial "related.html" $page }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{ partial "related.html" $page }}
|
||||
</main>
|
||||
{{ end }}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="d-flex justify-content-center">
|
||||
<form id="search-form" method="get" action="/search" method="POST" class="form-inline form-single">
|
||||
<form id="search-form" method="get" action="/search/" method="POST" class="form-inline form-single">
|
||||
<input type="text" name="q" id="search" class="form-control form-control-sm" placeholder="Search">
|
||||
<div class="input-group">
|
||||
<div class="input-group-append">
|
||||
@@ -19,30 +19,24 @@
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="search-input-wrap">
|
||||
<form id="search-form" method="get" action="">
|
||||
<input id="search" name="q" type="text" />
|
||||
<br>
|
||||
<button id="search-button" type="submit" class="button">Search</button>
|
||||
<a id="search-clear" href="/search/">Clear</a>
|
||||
</form>
|
||||
</div> -->
|
||||
<br>
|
||||
<div id="app-search" class="row listrecent"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div id="app-search" class="row listrecent"></div>
|
||||
|
||||
<div class="">
|
||||
<div id="app-search" class="row d-flex justify-content-center justify-content-md-between align-content-between">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
{{ $p := slice }}
|
||||
{{ range (where .Site.RegularPages "Section" "==" "post") }}
|
||||
{{ $.Scratch.Set "image" .RelPermalink }}
|
||||
{{ $.Scratch.Add "image" (index .Params.images 0) }}
|
||||
{{ $post := dict "link" .RelPermalink "author" (index .Params.authors 0) "tags" .Params.tags "title" .Title "date" (.Params.date.Format "January 2, 2006") "image" ($.Scratch.Get "image") "content" (substr .Plain 0 200) -}}
|
||||
{{ $post := dict "link" .RelPermalink "author" (index .Params.authors 0) "tags" .Params.tags "title" .Title "date" (.Params.date.Format "January 2, 2006") "image" ($.Scratch.Get "image") "content" (substr .Plain 0 200) "readingtime" .ReadingTime -}}
|
||||
{{ $p = $p | append $post -}}
|
||||
{{ end }}
|
||||
{{ $p | jsonify }}
|
||||
</div>
|
||||
<script src="{{ print "dist/" "lunr.b93de9e9609074d666f5123e866e25ed.min.js" | relURL }}"></script>
|
||||
<script>
|
||||
@@ -74,32 +68,29 @@
|
||||
console.log(matchPosts[0].tags)
|
||||
try {
|
||||
$target.innerHTML = matchPosts.map(p => {
|
||||
return `<br><div class="col-lg-4 col-md-6 mb-30px card-group">
|
||||
<div class="card h-100">
|
||||
<div class="maxthumb">
|
||||
<a href="${p.link}">
|
||||
<img class="img-fluid" src="${p.image}" alt="An thumbnail image.">
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h2 class="card-title"><a class="text-dark" href="${p.link}">${p.title}</a></h2>
|
||||
<h5 class="card-text">${p.content}...</h5>
|
||||
</div>
|
||||
<div style="padding-right: 10px; padding-left: 10px;" class=>
|
||||
${
|
||||
p.tags.map(function (tag) {
|
||||
return "<span style='white-space: nowrap;'>" + '<i class="fas fa-tag mr-2" style="margin-right: 4px !important; font-size: 0.8em !important;"></i>' + tag + " </span>"}).join('')
|
||||
}
|
||||
</div>
|
||||
<div class="wrapfooter">
|
||||
<span class="author-meta">
|
||||
<span class="post-name"><a href="/author/${p.authorurlized}">${p.author}</a></span><br/>
|
||||
<span class="post-date">${p.date}</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
return `
|
||||
<div class="d-flex flex-column card-regular card-regular-width my-2 my-md-5 mx-0 px-0 align-items-stretch">
|
||||
<div class="card-regular-image-parent">
|
||||
<div class="ma-0 pa-0 card-regular-image" style="background-image: url('${p.image}');"></div>
|
||||
</div>
|
||||
<div class="mx-3 my-3">
|
||||
<h5 class="created text-muted text-uppercase font-weight-bold mb-0">${p.date}</h5>
|
||||
<p class="text-muted">${p.readingtime} min read</p>
|
||||
<h2><a class="card-title-gray" href="${p.link}">${p.title}</a></h2>
|
||||
<p>${p.content}...</p>
|
||||
<div>
|
||||
<div class="d-flex justify-content-start align-items-stretch">
|
||||
<div class="tags">
|
||||
${
|
||||
p.tags.map(function (tag) {
|
||||
return "<a class='badge badge-dark mr-2' href='/tags/" + tag.toLowerCase() +"/'>" + "<i class='fas fa-tag mr-2'></i>" + tag + "</a>"
|
||||
}).join('')
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
}).join('');
|
||||
} catch (TypeError) {
|
||||
$target.innerHTML = `<div>No search results found.</div>`;
|
||||
|
||||
25
layouts/series/list.html
Normal file
25
layouts/series/list.html
Normal file
@@ -0,0 +1,25 @@
|
||||
{{ define "main" }}
|
||||
<main class="list container py-6">
|
||||
{{- if or .Title .Content -}}
|
||||
<div class="row py-3">
|
||||
<div class="col">
|
||||
{{ with .Title }}<h1>{{ . }}</h1>{{ end }}
|
||||
{{- with .Content -}}
|
||||
<div class="content">
|
||||
{{ . }}
|
||||
</div>
|
||||
{{- end -}}
|
||||
</div>
|
||||
</div>
|
||||
{{- end -}}
|
||||
<div class="row d-flex justify-content-around">
|
||||
{{ $paginator := .Paginate (where .Pages "Type" "post") }}
|
||||
{{ range $paginator.Pages.ByDate }}
|
||||
{{ .Render "card" }}
|
||||
{{ end }}
|
||||
</div>
|
||||
<div class="row d-flex justify-content-center">
|
||||
{{ template "_internal/pagination.html" . }}
|
||||
</div>
|
||||
</main>
|
||||
{{ end }}
|
||||
43
layouts/series/terms.html
Normal file
43
layouts/series/terms.html
Normal file
@@ -0,0 +1,43 @@
|
||||
{{ define "main" }}
|
||||
<main class="list container py-6">
|
||||
{{- if or .Title .Content -}}
|
||||
<div class="row py-3">
|
||||
<div class="col">
|
||||
{{ with .Title }}<h1>{{ . }}</h1>{{ end }}
|
||||
{{- with .Content -}}
|
||||
<div class="content">
|
||||
{{ . }}
|
||||
</div>
|
||||
{{- end -}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<p>Groups of articles that form a series.</p>
|
||||
</div>
|
||||
</div>
|
||||
{{- end -}}
|
||||
<div class="row row-cols-1 row-cols-lg-3">
|
||||
{{ range $name, $taxonomy := .Site.Taxonomies.series }}
|
||||
<div>
|
||||
<a href="{{ $.Site.BaseURL }}series/{{ $name }}/" style="text-decoration: none;">
|
||||
<div class="h-100 card-series">
|
||||
{{ with $.Site.GetPage (printf "/%s" $name) }}
|
||||
<div class="card-body d-flex flex-column">
|
||||
<h5 class="lead" style="margin-bottom: 0px; ">{{ .Params.Title }}</h5>
|
||||
<p class="text-muted">
|
||||
{{ len $taxonomy }} articles
|
||||
</p>
|
||||
<p class="mb-0">
|
||||
{{ .Params.Description }}
|
||||
</p>
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
</main>
|
||||
{{ end }}
|
||||
@@ -1,5 +1,5 @@
|
||||
{{ $img := $.Page.Resources.GetMatch (.Get 0)}}
|
||||
<figure>
|
||||
<figure class="d-flex justify-content-center">
|
||||
<img data-src="{{ $img.RelPermalink }}" alt="(.Get 1)" />
|
||||
<figcaption>{{.Get 1}}</figcaption>
|
||||
</figure>
|
||||
|
||||
26
layouts/tags/list.html
Normal file
26
layouts/tags/list.html
Normal file
@@ -0,0 +1,26 @@
|
||||
{{ define "main" }}
|
||||
<main class="list container py-6">
|
||||
{{- if or .Title .Content -}}
|
||||
<div class="row py-3">
|
||||
<div class="col">
|
||||
{{ with .Title }}<h1>{{ . }}</h1>{{ end }}
|
||||
{{- with .Content -}}
|
||||
<div class="content">
|
||||
{{ . }}
|
||||
</div>
|
||||
{{- end -}}
|
||||
</div>
|
||||
</div>
|
||||
{{- end -}}
|
||||
|
||||
<div class="row d-flex justify-content-around">
|
||||
{{ $paginator := .Paginate (where .Data.Pages "Type" "post") }}
|
||||
{{ range $paginator.Pages }}
|
||||
{{ .Render "card" }}
|
||||
{{ end }}
|
||||
</div>
|
||||
<div class="d-flex justify-content-center">
|
||||
{{ template "_internal/pagination.html" . }}
|
||||
</div>
|
||||
</main>
|
||||
{{ end }}
|
||||
@@ -14,11 +14,11 @@
|
||||
{{- end -}}
|
||||
<div class="row row-cols-1 row-cols-lg-3">
|
||||
{{ range $name, $taxonomy := .Site.Taxonomies.tags }}
|
||||
<div class="col">
|
||||
<a href="{{ $.Site.BaseURL }}tags/{{ $name }}" style="text-decoration: none;">
|
||||
<div class="card h-100" data-aos="zoom-in">
|
||||
<div class="card-body" data-aos="zoom-in">
|
||||
<h5 class="lead" style="margin-bottom: 0px; "><i class="fas fa-tag"></i>[{{ len $taxonomy }}] {{ $name }}</h4>
|
||||
<div class="col my-1">
|
||||
<a href="{{ $.Site.BaseURL }}tags/{{ $name }}/" style="text-decoration: none;">
|
||||
<div class="card-regular h-100" >
|
||||
<div class="card-body" >
|
||||
<h5 class="lead" style="margin-bottom: 0px; "><i class="fas fa-tag" style="font-size: 0.8em;"></i> {{ $name }}</h4> {{ len $taxonomy }} articles
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
122
src/js/toc.js
Normal file
122
src/js/toc.js
Normal file
@@ -0,0 +1,122 @@
|
||||
export function animatedToc() {
|
||||
var toc = document.querySelector(".toc");
|
||||
var tocPath = document.querySelector(".toc-marker path");
|
||||
var tocItems;
|
||||
|
||||
// Factor of screen size that the element must cross
|
||||
// before it's considered visible
|
||||
var TOP_MARGIN = 0.1,
|
||||
BOTTOM_MARGIN = 0.2;
|
||||
|
||||
var pathLength;
|
||||
|
||||
var lastPathStart, lastPathEnd;
|
||||
|
||||
window.addEventListener("resize", drawPath, false);
|
||||
window.addEventListener("scroll", sync, false);
|
||||
|
||||
drawPath();
|
||||
|
||||
function drawPath() {
|
||||
tocItems = [].slice.call(toc.querySelectorAll("li"));
|
||||
|
||||
// Cache element references and measurements
|
||||
tocItems = tocItems.map(function (item) {
|
||||
var anchor = item.querySelector("a");
|
||||
var target = document.getElementById(
|
||||
anchor.getAttribute("href").slice(1)
|
||||
);
|
||||
|
||||
return {
|
||||
listItem: item,
|
||||
anchor: anchor,
|
||||
target: target,
|
||||
};
|
||||
});
|
||||
|
||||
// Remove missing targets
|
||||
tocItems = tocItems.filter(function (item) {
|
||||
return !!item.target;
|
||||
});
|
||||
|
||||
var path = [];
|
||||
var pathIndent;
|
||||
|
||||
tocItems.forEach(function (item, i) {
|
||||
var x = item.anchor.offsetLeft - 5,
|
||||
y = item.anchor.offsetTop,
|
||||
height = item.anchor.offsetHeight;
|
||||
|
||||
if (i === 0) {
|
||||
path.push("M", x, y, "L", x, y + height);
|
||||
item.pathStart = 0;
|
||||
} else {
|
||||
// Draw an additional line when there's a change in
|
||||
// indent levels
|
||||
if (pathIndent !== x) path.push("L", pathIndent, y);
|
||||
|
||||
path.push("L", x, y);
|
||||
|
||||
// Set the current path so that we can measure it
|
||||
tocPath.setAttribute("d", path.join(" "));
|
||||
item.pathStart = tocPath.getTotalLength() || 0;
|
||||
|
||||
path.push("L", x, y + height);
|
||||
}
|
||||
|
||||
pathIndent = x;
|
||||
|
||||
tocPath.setAttribute("d", path.join(" "));
|
||||
item.pathEnd = tocPath.getTotalLength();
|
||||
});
|
||||
|
||||
pathLength = tocPath.getTotalLength();
|
||||
|
||||
sync();
|
||||
}
|
||||
|
||||
function sync() {
|
||||
var windowHeight = window.innerHeight;
|
||||
|
||||
var pathStart = pathLength,
|
||||
pathEnd = 0;
|
||||
|
||||
var visibleItems = 0;
|
||||
|
||||
tocItems.forEach(function (item) {
|
||||
var targetBounds = item.target.getBoundingClientRect();
|
||||
|
||||
if (
|
||||
targetBounds.bottom > windowHeight * TOP_MARGIN &&
|
||||
targetBounds.top < windowHeight * (1 - BOTTOM_MARGIN)
|
||||
) {
|
||||
pathStart = Math.min(item.pathStart, pathStart);
|
||||
pathEnd = Math.max(item.pathEnd, pathEnd);
|
||||
|
||||
visibleItems += 1;
|
||||
|
||||
item.listItem.classList.add("visible");
|
||||
} else {
|
||||
item.listItem.classList.remove("visible");
|
||||
}
|
||||
});
|
||||
|
||||
// Specify the visible path or hide the path altogether
|
||||
// if there are no visible items
|
||||
if (visibleItems > 0 && pathStart < pathEnd) {
|
||||
if (pathStart !== lastPathStart || pathEnd !== lastPathEnd) {
|
||||
tocPath.setAttribute("stroke-dashoffset", "1");
|
||||
tocPath.setAttribute(
|
||||
"stroke-dasharray",
|
||||
"1, " + pathStart + ", " + (pathEnd - pathStart) + ", " + pathLength
|
||||
);
|
||||
tocPath.setAttribute("opacity", 1);
|
||||
}
|
||||
} else {
|
||||
tocPath.setAttribute("opacity", 0);
|
||||
}
|
||||
|
||||
lastPathStart = pathStart;
|
||||
lastPathEnd = pathEnd;
|
||||
}
|
||||
}
|
||||
@@ -5,10 +5,12 @@ window.addEventListener("DOMContentLoaded", async (event) => {
|
||||
const { default: App } = await import(
|
||||
/* webpackChunkName: "app" */ "./js/App"
|
||||
);
|
||||
const animatedToc = await import(/* webpackChunkName: "toc" */ "./js/toc");
|
||||
App.bootstrapify();
|
||||
App.lazyload();
|
||||
App.loadFontAwesome();
|
||||
// App.navbarFade();
|
||||
App.aos();
|
||||
App.scrollBar();
|
||||
animatedToc.animatedToc();
|
||||
});
|
||||
|
||||
@@ -13,7 +13,8 @@ $gray-900: #082333;
|
||||
|
||||
$text-gray: #343a40;
|
||||
|
||||
$primary: #a02f2f;
|
||||
// $primary: #a02f2f;
|
||||
$primary: #1563ff;
|
||||
$secondary: #773A6B;
|
||||
|
||||
$table-dark-color: $white;
|
||||
@@ -24,7 +25,8 @@ $table-dark-bg: $primary;
|
||||
$text-muted: $gray-400;
|
||||
$body-color: $text-gray;
|
||||
$light: $white;
|
||||
$dark: $gray-900;
|
||||
// $dark: $gray-900;
|
||||
$dark: #0c3484;
|
||||
$headings-color: $text-gray;
|
||||
$headings-font-family: "Rotunda",
|
||||
sans-serif;
|
||||
|
||||
98
src/scss/cards.scss
Normal file
98
src/scss/cards.scss
Normal file
@@ -0,0 +1,98 @@
|
||||
@mixin image-zoom {
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@mixin card-border {
|
||||
background-color: white;
|
||||
z-index: 1;
|
||||
// border: 1px solid rgb(204, 18, 18);
|
||||
// border-top-color: rgba(80, 42, 184, 0.2);
|
||||
// border-top-style: solid;
|
||||
// border-top-width: 1px;
|
||||
// border-right-color: rgba(62.7%, 18.4%, 18.4%, 0.2);
|
||||
// border-right-style: solid;
|
||||
// border-right-width: 1px;
|
||||
// border-bottom-color: rgba(62.7%, 18.4%, 18.4%, 0.2);
|
||||
// border-bottom-style: solid;
|
||||
// border-bottom-width: 1px;
|
||||
// border-left-color: rgba(62.7%, 18.4%, 18.4%, 0.2);
|
||||
// border-left-style: solid;
|
||||
// border-left-width: 1px;
|
||||
border-image-source: initial;
|
||||
border-image-slice: initial;
|
||||
border-image-width: initial;
|
||||
border-image-outset: initial;
|
||||
border-image-repeat: initial;
|
||||
border-radius: .45rem;
|
||||
border-top-left-radius: 0.45rem;
|
||||
border-top-right-radius: 0.45rem;
|
||||
border-bottom-right-radius: 0.45rem;
|
||||
border-bottom-left-radius: 0.45rem;
|
||||
-webkit-box-shadow: 4px 4px 36px -10px rgba(12, 45, 192, 0.15);
|
||||
-moz-box-shadow: 4px 4px 36px -10px rgba(12, 45, 192, 0.15);
|
||||
box-shadow: 4px 4px 36px -10px rgba(12, 45, 192, 0.15);
|
||||
transition-property: all;
|
||||
transition-duration: 1s;
|
||||
overflow: hidden;
|
||||
|
||||
&:hover {
|
||||
-webkit-box-shadow: none;
|
||||
-moz-box-shadow: none;
|
||||
box-shadow: none;
|
||||
-moz-transform: translate(-2px, -2px);
|
||||
-ms-transform: translate(-2px, -2px);
|
||||
-o-transform: translate(-2px, -2px);
|
||||
-webkit-transform: translate(-2px, -2px);
|
||||
transform: translate(-2px, -2px);
|
||||
}
|
||||
}
|
||||
|
||||
.card-title-gray {
|
||||
color: $text-gray !important;
|
||||
}
|
||||
|
||||
.card-large {
|
||||
@include card-border;
|
||||
|
||||
& .card-large-image {
|
||||
height: 150%;
|
||||
@include image-zoom;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
.card-regular {
|
||||
@include card-border;
|
||||
// min-height: 700px;
|
||||
|
||||
& .card-regular-image {
|
||||
@include image-zoom;
|
||||
height: 150%;
|
||||
background-size: initial;
|
||||
}
|
||||
|
||||
& .card-regular-image-parent {
|
||||
height: 200px;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
.card-series {
|
||||
@include card-border;
|
||||
color: $text-gray
|
||||
}
|
||||
|
||||
@media only screen and (min-width: map-get($grid-breakpoints, "md")) {
|
||||
.card-regular-width {
|
||||
width: 30%;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: map-get($grid-breakpoints, "md")) {
|
||||
.card-regular-width {
|
||||
width: 80%
|
||||
}
|
||||
}
|
||||
3
src/scss/code-block.scss
Normal file
3
src/scss/code-block.scss
Normal file
@@ -0,0 +1,3 @@
|
||||
div.highlight {
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
@@ -46,7 +46,6 @@ pre code {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.latest h2 a,
|
||||
.navbar a,
|
||||
.card>a,
|
||||
a.badge {
|
||||
@@ -83,7 +82,8 @@ footer a:not(.icons) {
|
||||
}
|
||||
|
||||
.navbar {
|
||||
border-bottom: 1px solid #a02f2f;
|
||||
// border-bottom: 1px solid #a02f2f;
|
||||
border-bottom: 1px solid #2f3ba0;
|
||||
}
|
||||
|
||||
.rotate-a-20 {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
.line-scroll {
|
||||
background-image: linear-gradient(90deg, rgba(238,136,5,1) 0%, rgba(191,48,48,1) 41%, rgba(209,28,28,1) 100%);
|
||||
height: 5px;
|
||||
background-image: linear-gradient(90deg, #1563ff 1.56%, #08368b);
|
||||
height: 3px;
|
||||
left: 0;
|
||||
top: 83px;
|
||||
top: 56px;
|
||||
position: fixed;
|
||||
width: 0;
|
||||
z-index: 10;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ form#search-form {
|
||||
margin-top: 2px;
|
||||
|
||||
& input {
|
||||
width: 80%;
|
||||
width: 79%;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
@@ -20,3 +20,7 @@ form#search-form {
|
||||
form.form-single {
|
||||
width: 80% !important;
|
||||
}
|
||||
|
||||
.input-group {
|
||||
width: 20% !important;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,10 @@
|
||||
@import "sticky-footer";
|
||||
@import "search";
|
||||
@import "search-bar";
|
||||
@import "toc";
|
||||
@import "scroll-bar";
|
||||
@import "admonition-icons";
|
||||
@import "cards";
|
||||
@import "fonts";
|
||||
@import "toc-marker";
|
||||
@import "code-block";
|
||||
@import "toc";
|
||||
|
||||
41
src/scss/toc-marker.scss
Normal file
41
src/scss/toc-marker.scss
Normal file
@@ -0,0 +1,41 @@
|
||||
@mixin toc-selected {
|
||||
color: $text-gray;
|
||||
transform: translate(5px);
|
||||
}
|
||||
|
||||
.toc {
|
||||
line-height: 2;
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
ul ul {
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
li a {
|
||||
display: inline-block;
|
||||
color: $text-muted;
|
||||
text-decoration: none;
|
||||
transition: all 0.3s cubic-bezier(0.230, 1.000, 0.320, 1.000);
|
||||
font-size: 0.9rem;
|
||||
|
||||
&:hover {
|
||||
@include toc-selected;
|
||||
}
|
||||
}
|
||||
|
||||
li.visible>a {
|
||||
@include toc-selected;
|
||||
}
|
||||
}
|
||||
|
||||
// Adds offset to the headers in the post content to ignore the navbar height (avoids underscroll).
|
||||
:target[id]:before {
|
||||
content: '';
|
||||
display: block;
|
||||
height: 58px;
|
||||
margin: -30px 0 0;
|
||||
}
|
||||
@@ -1,30 +1,12 @@
|
||||
div.toc-sidebar {
|
||||
position: fixed;
|
||||
right: 0;
|
||||
// background-color: rgb(245,245,245);
|
||||
background: repeating-linear-gradient(135deg, rgba(128, 50, 50, 0.05), rgba(160, 60, 60, 0.05) 5px, rgba(0,0,0,0) 5px, rgba(0,0,0,0) 10px);
|
||||
height: 100%;
|
||||
margin-top: -500%;
|
||||
padding-top: 500%;
|
||||
padding-bottom: 500%;
|
||||
margin-right: 5%;
|
||||
font-size: 0.9em;
|
||||
div {
|
||||
&.toc-container {
|
||||
top: 56px;
|
||||
background-color: white;
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
& li {
|
||||
list-style: none;
|
||||
padding-bottom: 10px;
|
||||
&.toc-contents {
|
||||
padding-left: 10px;
|
||||
// z-index: 1;
|
||||
}
|
||||
}
|
||||
|
||||
#TableOfContents > ul {
|
||||
margin-left: -40px;
|
||||
|
||||
& > li ul {
|
||||
margin-left: -15px;
|
||||
}
|
||||
}
|
||||
|
||||
div.toc-contents a {
|
||||
// color: $text-muted
|
||||
color: $gray-700
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user