This commit is contained in:
Oliver
2025-05-02 06:48:19 -03:00
commit 4afcf970b3
307 changed files with 66607 additions and 0 deletions

17
ODOO4projects/themes/editor-hugo/.gitignore vendored Executable file
View File

@@ -0,0 +1,17 @@
Thumbs.db
.DS_Store
.dist
.tmp
.lock
.sass-cache
npm-debug.log
node_modules
builds
package-lock.json
public
resources
.hugo_build.lock
jsconfig.json
hugo_stats.json
go.sum
yarn.lock

View File

@@ -0,0 +1,5 @@
{
"MD033": false,
"MD034": false,
"MD013": false
}

View File

@@ -0,0 +1,12 @@
{
"overrides": [
{
"files": ["*.html"],
"options": {
"parser": "go-template",
"goTemplateBracketSpacing": true,
"bracketSameLine": true
}
}
]
}

View File

@@ -0,0 +1,7 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
# description
description: "This is meta description"
---

View File

@@ -0,0 +1,90 @@
(function ($) {
'use strict';
// prelaoder
$('.preloader').delay(100).fadeOut(10);
// sidenav-menu
function sidenav() {
$('[data-toggle="sidenav-menu"]').on('click', function () {
$('.sidenav-menu, .sidenav-overlay').toggleClass('show');
});
}
sidenav();
// search-popup
function searchPopup() {
$('[data-toggle="search"]').on('click', function () {
$('.search-block').fadeIn(200);
setTimeout(function () {
$('.search-block').addClass('is-visible');
var value = $('#search-field').val();
$('#search-field').focus().val('').val(value);
}, 250);
});
$('[data-toggle="search-close"]').on('click', function () {
$('.search-block').fadeOut(200).removeClass('is-visible');
});
}
searchPopup();
// menuHumBurger icon toggle Init
function menuHumBurgerIcon() {
$('.navbar-toggler').on('click', function () {
$('i').toggleClass('d-inline d-none');
});
}
menuHumBurgerIcon();
// tab
$('.tab-content').find('.tab-pane').each(function (idx, item) {
var navTabs = $(this).closest('.code-tabs').find('.nav-tabs'),
title = $(this).attr('title');
navTabs.append('<li class="nav-item"><a class="nav-link" href="#">' + title + '</a></li>');
});
$('.code-tabs ul.nav-tabs').each(function () {
$(this).find("li:first").addClass('active');
})
$('.code-tabs .tab-content').each(function () {
$(this).find("div:first").addClass('active');
});
$('.nav-tabs a').click(function (e) {
e.preventDefault();
var tab = $(this).parent(),
tabIndex = tab.index(),
tabPanel = $(this).closest('.code-tabs'),
tabPane = tabPanel.find('.tab-pane').eq(tabIndex);
tabPanel.find('.active').removeClass('active');
tab.addClass('active');
tabPane.addClass('active');
});
// Accordions
$('.collapse').on('shown.bs.collapse', function () {
$(this).parent().find('.fas fa-plus').removeClass('fas fa-plus').addClass('fas fa-minus');
}).on('hidden.bs.collapse', function () {
$(this).parent().find('.fas fa-minus').removeClass('fas fa-minus').addClass('fas fa-plus');
});
//post slider
$('.post-slider').slick({
slidesToShow: 1,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 1500,
fade: true,
cssEase: 'linear',
dots: false,
arrows: true,
prevArrow: '<button type=\'button\' class=\'prevArrow\'><i class=\'fas fa-angle-left\'></i></button>',
nextArrow: '<button type=\'button\' class=\'nextArrow\'><i class=\'fas fa-angle-right\'></i></button>'
});
})(jQuery);

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

View File

@@ -0,0 +1,101 @@
summaryInclude=60;
var fuseOptions = {
shouldSort: true,
includeMatches: true,
threshold: 0.0,
tokenize:true,
location: 0,
distance: 100,
maxPatternLength: 32,
minMatchCharLength: 1,
keys: [
{name:"title",weight:0.8},
{name:"contents",weight:0.5},
{name:"tags",weight:0.3},
{name:"categories",weight:0.3}
]
};
var searchQuery = param("s");
if(searchQuery){
$("#search-query").val(searchQuery);
executeSearch(searchQuery);
}
function executeSearch(searchQuery){
$.getJSON( indexURL, function( data ) {
var pages = data;
var fuse = new Fuse(pages, fuseOptions);
var result = fuse.search(searchQuery);
console.log({"matches":result});
if(result.length > 0){
populateResults(result);
}else{
$('#search-results').append("<div class=\"text-center mx-auto\"><img class=\"img-fluid mb-5\" src=\"https://user-images.githubusercontent.com/17677384/110205559-d77c9580-7ea2-11eb-82b4-f1334db99530.png\"><h3 class=\"mb-5\">No Search Found</h3></div>");
}
});
}
function populateResults(result){
$.each(result,function(key,value){
var contents= value.item.contents;
var snippet = "";
var snippetHighlights=[];
var tags =[];
if( fuseOptions.tokenize ){
snippetHighlights.push(searchQuery);
}else{
$.each(value.matches,function(matchKey,mvalue){
if(mvalue.key == "tags" || mvalue.key == "categories" ){
snippetHighlights.push(mvalue.value);
}else if(mvalue.key == "contents"){
start = mvalue.indices[0][0]-summaryInclude>0?mvalue.indices[0][0]-summaryInclude:0;
end = mvalue.indices[0][1]+summaryInclude<contents.length?mvalue.indices[0][1]+summaryInclude:contents.length;
snippet += contents.substring(start,end);
snippetHighlights.push(mvalue.value.substring(mvalue.indices[0][0],mvalue.indices[0][1]-mvalue.indices[0][0]+1));
}
});
}
if(snippet.length<1){
snippet += contents.substring(0,summaryInclude*2);
}
//pull template from hugo templarte definition
var templateDefinition = $('#search-result-template').html();
var output = render(templateDefinition,{key:key,title:value.item.title,image:value.item.image,date:value.item.date,month:value.item.month,link:value.item.permalink,tags:value.item.tags,categories:value.item.categories,snippet:snippet});
$('#search-results').append(output);
$.each(snippetHighlights,function(snipkey,snipvalue){
$("#summary-"+key).mark(snipvalue);
});
});
}
function param(name) {
return decodeURIComponent((location.search.split(name + '=')[1] || '').split('&')[0]).replace(/\+/g, ' ');
}
function render(templateString, data) {
var conditionalMatches,conditionalPattern,copy;
conditionalPattern = /\$\{\s*isset ([a-zA-Z]*) \s*\}(.*)\$\{\s*end\s*}/g;
//since loop below depends on re.lastInxdex, we use a copy to capture any manipulations whilst inside the loop
copy = templateString;
while ((conditionalMatches = conditionalPattern.exec(templateString)) !== null) {
if(data[conditionalMatches[1]]){
//valid key, remove conditionals, leave contents.
copy = copy.replace(conditionalMatches[0],conditionalMatches[2]);
}else{
//not valid, remove entire section
copy = copy.replace(conditionalMatches[0],'');
}
}
templateString = copy;
//now any conditionals removed we can do simple substitution
var key, find, re;
for (key in data) {
find = '\\$\\{\\s*' + key + '\\s*\\}';
re = new RegExp(find, 'g');
templateString = templateString.replace(re, data[key]);
}
return templateString;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by Fontastic.me</metadata>
<defs>
<font id="slick" horiz-adv-x="512">
<font-face font-family="slick" units-per-em="512" ascent="480" descent="-32"/>
<missing-glyph horiz-adv-x="512" />
<glyph unicode="&#8594;" d="M241 113l130 130c4 4 6 8 6 13 0 5-2 9-6 13l-130 130c-3 3-7 5-12 5-5 0-10-2-13-5l-29-30c-4-3-6-7-6-12 0-5 2-10 6-13l87-88-87-88c-4-3-6-8-6-13 0-5 2-9 6-12l29-30c3-3 8-5 13-5 5 0 9 2 12 5z m234 143c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/>
<glyph unicode="&#8592;" d="M296 113l29 30c4 3 6 7 6 12 0 5-2 10-6 13l-87 88 87 88c4 3 6 8 6 13 0 5-2 9-6 12l-29 30c-3 3-8 5-13 5-5 0-9-2-12-5l-130-130c-4-4-6-8-6-13 0-5 2-9 6-13l130-130c3-3 7-5 12-5 5 0 10 2 13 5z m179 143c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/>
<glyph unicode="&#8226;" d="M475 256c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/>
<glyph unicode="&#97;" d="M475 439l0-128c0-5-1-9-5-13-4-4-8-5-13-5l-128 0c-8 0-13 3-17 11-3 7-2 14 4 20l40 39c-28 26-62 39-100 39-20 0-39-4-57-11-18-8-33-18-46-32-14-13-24-28-32-46-7-18-11-37-11-57 0-20 4-39 11-57 8-18 18-33 32-46 13-14 28-24 46-32 18-7 37-11 57-11 23 0 44 5 64 15 20 9 38 23 51 42 2 1 4 3 7 3 3 0 5-1 7-3l39-39c2-2 3-3 3-6 0-2-1-4-2-6-21-25-46-45-76-59-29-14-60-20-93-20-30 0-58 5-85 17-27 12-51 27-70 47-20 19-35 43-47 70-12 27-17 55-17 85 0 30 5 58 17 85 12 27 27 51 47 70 19 20 43 35 70 47 27 12 55 17 85 17 28 0 55-5 81-15 26-11 50-26 70-45l37 37c6 6 12 7 20 4 8-4 11-9 11-17z"/>
</font></defs></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1 @@
.slick-list,.slick-slider,.slick-track{position:relative;display:block}.slick-loading .slick-slide,.slick-loading .slick-track{visibility:hidden}.slick-slider{box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-khtml-user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.slick-list{overflow:hidden;margin:0;padding:0}.slick-list:focus{outline:0}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-list,.slick-slider .slick-track{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slick-track{top:0;left:0;margin-left:auto;margin-right:auto}.slick-track:after,.slick-track:before{display:table;content:''}.slick-track:after{clear:both}.slick-slide{display:none;float:left;height:100%;min-height:1px}[dir=rtl] .slick-slide{float:right}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.slick-arrow.slick-hidden{display:none}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,63 @@
// button style
.btn {
font-size: 14px;
padding: 15px 24px;
color: $white;
border-radius: 0;
transition: .2s ease-out;
position: relative;
z-index: 1;
overflow: hidden;
border: 0;
&:active,
&:focus {
border: 0;
box-shadow: none !important;
}
&.btn-lg {
font-size: 16px;
padding: 12px 28px;
}
&:hover {
box-shadow: 0px 10px 25px rgba($black, 0.1);
}
&.btn-primary {
background-color: $primary-color !important;
&:hover,
&:active,
&:focus {
color: $white;
background-color: $dark !important;
}
}
&.btn-outline-primary {
color: $primary-color;
border: 1px solid $primary-color;
background-color: transparent !important;
&::after {
background-color: $primary-color !important;
}
&:hover,
&:active,
&:focus {
color: $white;
background-color: $primary-color !important;
}
}
}
.text-underline {
text-decoration: underline;
}
a.text-underline:hover {
color: $primary-color;
text-decoration: underline;
}

View File

@@ -0,0 +1,478 @@
body {
color: $gray;
background-color: $white;
font-family: $secondary-font;
font-weight: 400;
font-size: 16px;
line-height: 1.65;
&::-webkit-scrollbar {
width: 10px;
@extend .bg-primary-light;
}
&::-webkit-scrollbar-thumb {
background-color: rgba($primary-color, .5);
}
}
::selection {
color: $white;
background-color: darken($primary-color, 5);
text-shadow: none;
}
:focus {
outline: 0;
}
mark,
.mark {
padding: 0;
}
.page-header {
mark,
.mark {
padding: 3px 5px;
text-transform: lowercase;
}
.title {
font-weight: bold;
color: $dark;
position: relative;
padding-left: 20px;
margin-bottom: 0;
&::before {
position: absolute;
content: "";
height: 100%;
width: 7px;
border-radius: 50px;
background-color: $primary-color;
left: 0;
top: 0;
}
}
}
/*------------------------------------------------------------------
# default styles
-------------------------------------------------------------------*/
.section {
padding: 24px 0;
}
.section-title {
h1 {
font-size: $h1-lg;
text-transform: capitalize;
margin-bottom: 20px;
position: relative;
padding-top: 25px;
@include desktop-xl {
font-size: 42px;
}
@include tablet {
font-size: 34px;
}
}
}
// social-links
.social-links {
a {
font-size: 15px;
padding: 7px;
color: rgba($black, .8);
&:hover {
color: $primary-color;
}
}
&.is-circled {
a {
padding: 7px 9px;
color: $white;
&:hover {
opacity: .7;
}
}
}
&.is-circled {
a {
display: block;
text-align: center;
font-size: 12px;
text-transform: uppercase;
color: $dark;
.icon {
display: block;
height: 42px;
width: 42px;
padding: 13px;
border: 1px solid $dark;
border-radius: 50%;
margin-left: auto;
margin-right: auto;
margin-bottom: 8px;
font-size: 16px;
transition: .3s;
color: $dark;
}
&:hover svg {
border-color: $primary-color;
background-color: $primary-color;
color: $white;
}
}
}
}
// preloader
.preloader {
position: fixed;
top: 0;
left: 0;
height: 100%;
width: 100%;
background-color: $white;
z-index: 999889898;
img {
vertical-align: middle;
border: 0;
max-width: 100%;
height: auto;
}
}
// card style
.card.post-card {
border-radius: 0px;
border: 0;
text-align: center;
.card-body {
padding: 0;
padding-top: 20px;
}
.card-footer {
margin-bottom: 50px;
background-color: transparent;
padding: 0;
padding-top: 10px;
}
}
.post-title {
font-weight: 600;
color: $dark;
font-family: $primary-font;
display: inline-block;
line-height: 1.3;
}
a.post-title:hover,
.post-title:hover a {
color: $primary-color;
}
.card-meta-tag {
text-transform: uppercase;
.list-inline-item:not(:last-child) {
margin-right: .5rem;
}
a {
font-size: 14px;
font-weight: 500;
color: $primary-color;
&:hover {color: $dark}
}
}
.card-meta {
font-size: 12px;
.list-inline-item:not(:last-child) {
margin-right: 1.2rem;
}
.card-meta-author {
display: inline-block;
&:hover {
color: $primary-color;
}
}
.card-meta-author,
.card-meta-date {
color: #9598a2;
text-transform: uppercase;
}
}
// content
.content {
font-family: $secondary-font;
font-size: 17px;
p {
margin-bottom: 25px;
}
img {
margin-bottom: 30px;
}
h1, h2, h3, h4, h5, h6 {
font-family: $secondary-font;
color: $dark;
font-weight: 600;
margin-bottom: 20px;
margin-top: 30px;
}
ol, ul {
margin-bottom: 25px;
padding-left: 0;
li {
margin-bottom: 10px;
}
}
img {
margin-top: 10px;
margin-bottom: 35px;
}
blockquote {
padding: 20px 30px;
padding-left: 70px;
border: 1px solid rgba($primary-color, .2);
font-family: $primary-font;
color: $dark;
font-weight: 600;
font-size: 18px;
margin: 30px 0;
position: relative;
p {
margin-bottom: 15px;
}
&::before {
content: "\f10d";
font-weight: 900;
}
svg {
position: absolute;
font-size: 28px;
left: 20px;
top: 25px;
opacity: .5;
color: $primary-color;
}
cite {
opacity: .7;
font-style: normal;
text-transform: uppercase;
font-size: 13px;
position: relative;
&::before {
position: absolute;
content: "";
height: 1px;
width: 20px;
left: -30px;
top: 50%;
background-color: $dark;
opacity: .5;
}
}
}
table {
text-align: left;
width: 100%;
max-width: 100%;
margin-bottom: 1rem;
border: 1px solid #dee2e6;
th,
td {
padding: .75rem;
vertical-align: top;
border: 1px solid #dee2e6
}
thead {
background: darken(#f7f7f7, 2);
}
tbody {
background: #f7f7f7;
}
}
a.collapse-head {
border-bottom: 1px solid #dee2e6;
}
.notices {
margin: 2rem 0;
position: relative;
overflow: hidden;
}
.notices p {
padding: 10px;
margin-bottom: 0;
}
.notices.note p {
border-top: 30px solid #6ab0de;
background: #f7f7f7;
}
.notices.note p::after {
content: 'Note';
position: absolute;
top: 2px;
color: $white;
left: 2rem;
}
.notices.tip p {
border-top: 30px solid #78C578;
background: #f7f7f7;
}
.notices.tip p::after {
content: 'Tip';
position: absolute;
top: 2px;
color: $white;
left: 2rem;
}
.notices.info p {
border-top: 30px solid #F0B37E;
background: #f7f7f7;
}
.notices.info p::after {
content: 'Info';
position: absolute;
top: 2px;
color: $white;
left: 2rem;
}
.notices.warning p {
border-top: 30px solid #E06F6C;
background: $light;
}
.notices.warning p::after {
content: 'Warning';
position: absolute;
top: 2px;
color: #fff;
left: 2rem;
}
}
// code-tab
.code-tabs {
border: 1px solid #ddd;
overflow: hidden;
margin-bottom: 20px;
.nav-tabs {
margin-bottom: 0;
padding: 0;
.nav-item {
padding-left: 0;
border-right: 1px solid #ddd;
.nav-link {
text-decoration: none;
font-weight: 500;
border: 0;
text-transform: capitalize;
}
&::before {
display: none;
}
&.active {
background: $primary-color;
.nav-link {
color: $white;
}
}
}
}
.tab-content {
padding: 20px 15px;
}
}
// pagination
.pagination {
.page-link {
padding: 0;
margin-left: 0;
color: $dark;
border: 0;
height: 48px;
width: 48px;
line-height: 48px;
text-align: center;
font-weight: 600;
border-radius: 0 !important;
&.active,
&:focus,
&:hover {
box-shadow: none;
color: $white;
background-color: $primary-color;
}
}
}
// form-control
.form-control {
padding: 0;
border: 0;
border-bottom: 1px solid #999;
border-radius: 0 !important;
height: 56px;
font-size: 17px;
font-weight: 500;
transition: .3s ease;
&:focus {
box-shadow: none;
color: $dark;
border-bottom-color: $dark;
~ .input-group-append {
.input-group-text {
border-bottom-color: $dark;
}
}
}
}
.input-group-text {
background-color: transparent;
border: 0;
border-bottom: 1px solid #999;
border-radius: 0 !important;
transition: .3s ease;
padding-right: 0;
.icon {
font-size: 22px;
}
}
button.input-group-text {
&:hover {
color: $primary-color;
}
}
/*------------------------------------------------------------------
# helper classes
-------------------------------------------------------------------*/
.font-primary {font-family: $primary-font}
.font-secondary {font-family: $secondary-font}
.font-weight-500 {font-weight: 500}
.font-weight-600 {font-weight: 600}
.text-primary {color: $primary-color !important}
a.text-primary:hover {color: darken($primary-color, 10) !important}
.bg-primary {background-color: $primary-color !important}
.bg-primary-light {background-color: rgba($primary-color, .1)}
.text-dark {color: $dark}
.text-light {color: #a8aab2 !important}
a.text-dark:hover, a.text-light:hover {
color: $primary-color !important
}
.bg-light {background-color: $light !important}
.bg-dark {background-color: $dark !important}

View File

@@ -0,0 +1,34 @@
@mixin mobile-xs{
@media(max-width:400px){
@content;
}
}
@mixin mobile{
@media(max-width:575px){
@content;
}
}
@mixin tablet{
@media(max-width:767px){
@content;
}
}
@mixin desktop{
@media(max-width:991px){
@content;
}
}
@mixin desktop-lg{
@media(max-width:1200px){
@content;
}
}
@mixin desktop-xl {
@media(max-width:1466px) {
@content;
}
}
@mixin size($size){
width: $size; height: $size;
}

View File

@@ -0,0 +1,47 @@
h1, .h1 {
font-size: $h1;
@include desktop-xl {
font-size: $h1-lg;
}
@include desktop {
font-size: $h1-md;
}
}
h2, .h2 {
font-size: $h2;
@include desktop {
font-size: $h2-md;
}
}
h3, .h3 {
font-size: $h3;
@include desktop {
font-size: $h3-md;
}
}
h4, .h4 {
font-size: $h4;
}
h5, .h5 {
font-size: $h5;
}
h6, .h6 {
font-size: $h6;
}
a:focus,
button:focus {
outline: 0;
}
a {
color: $gray;
transition: all .3s;
&:hover {
text-decoration: none;
color: #222;
}
}
ul, li {
padding: 0;
margin: 0;
list-style-position: inside;
}

View File

@@ -0,0 +1,34 @@
// Color Variables
{{ with site.Params.variables }}
$primary-color: {{.primary_color}};
$secondary-color: {{.secondary_color}};
$white: {{.white}};
$black: {{.black}};
$dark: {{.dark}};
$gray: {{.gray}};
$light: {{.light}};
$h1: {{.h1}};
$h1_lg: {{.h1_lg}};
$h1_md: {{.h1_md}};
$h2: {{.h2}};
$h2_md: {{.h2_md}};
$h3: {{.h3}};
$h3_md: {{.h3_md}};
$h4: {{.h4}};
$h5: {{.h5}};
$h6: {{.h6}};
// Font Variables
$primary-font: '{{ replaceRE ":[ital,]*wght@[0-9,;]+" "" .primary_font }}', sans-serif;
$secondary-font: '{{ replaceRE ":[ital,]*wght@[0-9,;]+" "" .secondary_font }}', sans-serif;
$icon-font: '{{.icon_font}}';
{{ end }}
@import 'mixins';
@import 'typography';
@import 'buttons';
@import 'common';
@import 'templates/navigation.scss';
@import 'templates/main.scss';
@import 'custom.scss';

View File

@@ -0,0 +1,280 @@
// page-content
.page-content {
margin-left: 110px;
@include tablet {
margin-left: 0;
margin-top: 56px;
}
}
// author-banner
.author-banner {
padding: 30px 35px;
height: 100%;
position: fixed;
top: 0;
overflow-y: auto;
width: calc(25% - 60px);
max-width: 100%;
@include desktop-lg {
width: calc(33.333333% - 70px);
}
@include desktop {
position: static;
width: initial;
margin-top: 15px;
padding: 60px 35px;
height: auto;
}
@include tablet {
margin-top: 40px;
}
@media screen and (max-height: 470px) {
display: block !important;
}
&::-webkit-scrollbar {
width: 12px;
}
&::-webkit-scrollbar-thumb {
background-color: rgba($primary-color, .2);
}
}
// partner-logos
.partner-logos {
li {
background-color: $white;
padding: 15px 20px;
border: 1px solid #eee;
margin-top: 14px;
img {
max-height: 25px;
max-width: 130px;
}
}
}
// newsletter-block
.newsletter-block {
color: $dark;
padding: 80px 60px;
@include tablet {
padding: 80px 30px;
}
.input-group-text,
.form-control {
background-color: transparent;
color: $dark;
}
.form-control {
&:focus {
border-bottom-color: $dark;
~ .input-group-append {
.input-group-text {
border-bottom-color: $dark;
}
}
}
}
::-webkit-input-placeholder {
color: rgba($dark, .7);
}
:-ms-input-placeholder {
color: rgba($dark, .7);
}
::placeholder {
color: rgba($dark, .7);
}
button.input-group-text {
color: rgba($dark, .7);
&:hover {
color: $dark;
}
}
}
footer .newsletter-block{
padding: 15px;
.input-group {
max-width: 350px;
margin: auto;
}
}
// blog post
.single-post-meta,
.single-post-similer {
margin-top: 70px;
}
.single-post-author {
margin-top: 50px;
}
.post-meta-tags {
a {
display: inline-block;
background-color: #f7f8fa;
color: $dark;
padding: 6px 13px;
font-weight: 500;
font-size: 15px;
&:hover {
background-color: transparent;
color: $primary-color;
}
}
}
.widget {
margin-bottom: 45px;
.widget-title {
width: calc(100% - 8px);
height: calc(100% - 8px);
background: rgba(#f9f3ef, .5);
display: block;
margin: 4px;
line-height: 40px;
text-align: center;
font-weight: 600;
text-transform: uppercase;
font-size: 14px;
outline: 1px solid #f9f3ef;
border: 1px solid #f9f3ef;
outline-offset: 4px;
padding-top: 2px;
margin-bottom: 35px;
}
}
.sidebar-recent-post {
counter-reset: rc-counter;
.recent-post-item {
margin-top: 35px;
padding: 0 10px;
a {
display: inline-block;
&:hover {
color: $primary-color;
}
}
.recent-post-image {
height: 80px;
width: 80px;
position: relative;
z-index: 1;
img {
height: 100%;
object-fit: cover;
}
&::after {
counter-increment: rc-counter;
content: counter(rc-counter);
position: absolute;
background-color: $primary-color;
border: 2px solid $white;
top: -3px;
right: -3px;
z-index: 222;
height: 30px;
width: 30px;
text-align: center;
font-size: 12px;
font-weight: bold;
color: $white;
border-radius: 50px;
line-height: 26px;
}
}
}
}
.sidebar-post-categories li {
a {
border-top: 1px dotted #ddd;
padding: 8px 0;
display: block;
font-size: 15px;
span {
float: right;
background-color: #ddd;
font-size: 12px;
padding: 5px 8px;
line-height: 1;
border-radius: 50px;
color: black;
}
&:hover {
color: $primary-color;
span {
background-color: $primary-color;
color: $white;
}
}
}
&:last-child a {
border-bottom: 1px dotted #ddd;
}
}
.sidebar-post-tags li a {
border: 1px dotted #ddd;
padding: 4px 10px;
display: block;
font-size: 15px;
margin-bottom: 10px;
&:hover {
border-color: $primary-color;
color: $primary-color;
}
}
// slick slider style
.slick-slide {
outline: 0;
}
.post-slider {
overflow: hidden;
position: relative;
&:hover {
.prevArrow {
left: 20px;
}
.nextArrow {
right: 20px;
}
}
}
.slider-sm {
.slick-arrow {
height: 38px;
width: 38px;
line-height: 38px;
}
}
.slick-arrow {
position: absolute;
top: 50%;
transform: translateY(-50%);
z-index: 9;
height: 50px;
width: 50px;
line-height: 50px;
border-radius: 50%;
background: rgba($primary-color, .5);
color: $white;
border: 0;
transition: 0.3s;
@include mobile {
display: none;
}
&:focus {
outline: 0;
}
&:hover {
background: $primary-color;
}
}
.prevArrow {
left: -60px;
}
.nextArrow {
right: -60px;
}

View File

@@ -0,0 +1,245 @@
// start header style
header.sidenav {
position: fixed;
width: 110px;
height: 100%;
top: 0;
left: 0;
z-index: 1000;
background-color: $white;
transition: .25s ease;
padding-top: 15px;
padding-bottom: 40px;
text-align: center;
display: flex;
flex-direction: column;
justify-content: space-between;
@include tablet {
width: 100%;
height: 80px;
background-color: lighten(desaturate(adjust-hue($primary-color, 4), 2.87), 36.67);
padding: 0;
flex-direction: row;
.is-top {
display: flex;
justify-content: space-between;
width: 100%;
align-items: center;
padding-left: 25px;
> div {
order: 1;
display: flex;
align-items: center;
}
.navbar-brand {
order: 0;
}
}
}
.sidenav-toggler {
background-color: transparent;
border: 0;
margin-bottom: 55px;
&.logo-plain {
margin-bottom: 25px;
}
@include tablet {
margin-bottom: 0;
}
.toggler-icon {
cursor: pointer;
-webkit-tap-highlight-color: transparent;
transition: transform 400ms;
user-select: none;
.line {
fill:none;
transition: stroke-dasharray 400ms, stroke-dashoffset 400ms;
stroke: $dark;
stroke-width:3;
stroke-linecap:round;
}
.top {
stroke-dasharray: 40 139;
}
.bottom {
stroke-dasharray: 40 180;
}
&.active {
transform: rotate(45deg);
.top {
stroke-dashoffset: -98px;
}
.bottom {
stroke-dashoffset: -138px;
}
}
}
}
.navbar-brand {
transform: rotate(-90deg);
display: inline-flex;
padding: 0;
&.plain {
transform: rotate(0);
}
@include tablet {
transform: rotate(0);
}
}
}
.sidenav-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba($primary-color, 0.2);
z-index: 15;
-webkit-backdrop-filter: blur(2px);
backdrop-filter: blur(2px);
cursor: pointer;
opacity: 0;
visibility: hidden;
transition: .3s ease;
&.show {
opacity: 1;
visibility: visible;
}
}
// sidenav-menu
nav.sidenav-menu {
position: fixed;
top: 0;
left: 110px;
z-index: 99;
background: darken($white, 1);
height: 100%;
width: 280px;
display: flex;
overflow-y: auto;
padding: 15px 30px 44px 30px;
transform: translate3d(-100%, 0, 0);
transition: .2s ease;
&.show {
transform: translate3d(0, 0, 0);
transition: .3s ease;
}
@include tablet {
top: 0;
left: 0;
z-index: 99992;
}
.nav-item {
display: block;
&.active .nav-link {
color: $primary-color !important;
}
&:first-child {
margin-top: 8px;
}
&:last-child {
margin-bottom: 8px;
}
.nav-link {
font-weight: 500;
color: $dark;
position: relative;
padding: 10px;
&:hover {
color: $primary-color;
}
&[data-toggle="collapse"]::after {
content: "+";
float: right;
font-size: 24px;
line-height: 1;
}
&[aria-expanded="true"]::after {
content: "_";
line-height: 0.3;
font-size: 22px;
}
}
}
.nav-item ul li {
a {
font-size: 15px;
padding: 7px 18px;
display: inline-block;
font-weight: 500;
}
}
}
// search block style
.search-toggle {
background-color: transparent;
border: 0;
transition: .3s ease;
padding: 10px;
font-size: 22px;
&:hover {
color: $primary-color;
}
}
.search-block {
position: fixed;
top: 0;
left: 0;
height: 100vh;
width: 100vw;
background-color: $white;
z-index: 9999988999889;
padding: 0 50px;
display: none;
form {
position: relative;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
text-align: center;
}
input {
border: 0;
border-bottom: 1px solid #ddd;
font-size: 22px;
width: 500px;
max-width: 100%;
padding: 15px 0;
margin: auto;
letter-spacing: -1px;
transition: .3s ease;
}
&.is-visible {
input {
border-bottom-color: $primary-color;
}
}
[data-toggle="search-close"] {
cursor: pointer;
position: absolute;
top: 20px;
right: 40px;
}
}
// end header style

View File

@@ -0,0 +1,38 @@
{{ define "main" }}
<div class="col-lg-12 my-5">
<div class="row align-items-end mb-4 mb-lg-5">
{{ if .Params.image }}
<div class="col-xl-3 col-lg-4">
<div class="pr-3">
<img loading="lazy" class="img-fluid" style="max-width:250px" src="{{ .Params.image | absURL }}" alt="Author">
</div>
</div>
{{ else if .Params.email }}
<div class="col-xl-3 col-lg-4">
<img loading="lazy" class="img-fluid" style="max-width:250px" src="https://www.gravatar.com/avatar/{{ md5 .Params.email }}?s=250&pg&d=identicon">
</div>
{{ end }}
<div class="col-lg-7 mt-5 mt-lg-0">
<p class="h5 mb-3">{{ i18n `about_me` }}</p>
<h3 class="font-primary text-dark mb-0" style="line-height:1.5">{{ .Params.summary }}</h3>
</div>
</div>
<div class="content mb-5 pb-1">{{ .Content }}</div>
{{ if .Params.partners.enable }}
{{ with .Params.partners }}
<p class="h4 mb-3 text-dark">{{ .title | markdownify}}</p>
<ul class="list-inline partner-logos">
{{ range .partner_logos }}
<li class="list-inline-item"><img loading="lazy" src="{{. | absURL}}"></li>
{{ end }}
</ul>
{{ end }}
{{ end }}
</div>
{{ end }}

View File

@@ -0,0 +1,37 @@
<article class="card post-card">
{{ with .Params.images }}
<div class="post-slider slider-sm">
{{ range . }}
<div><img loading="lazy" class="w-100" src="{{ . | absURL }}" alt=""></div>
{{ end }}
</div>
{{ end }}
<div class="card-body mb-3">
{{ with .Params.tags }}
<ul class="card-meta-tag list-inline mb-1">
{{ range . }}
<li class="list-inline-item"><a href="{{site.BaseURL}}tags/{{.| urlize}}/">{{.}}</a></li>
{{ end }}
</ul>
{{ end }}
<h3 class="h4 mb-2">
<a class="post-title" href="{{ .Permalink }}" title="{{ .Title }}">{{ .Title }}</a>
</h3>
<p class="mb-0">{{ .Plain | truncate 70 }}</p>
</div>
<div class="card-footer">
<ul class="card-meta list-inline mb-0">
{{ with site.GetPage "/about" }}
<li class="list-inline-item">
<span class="text-light">by:</span>
<a href="{{ .Permalink }}" class="card-meta-author">{{ with .Params.name }}{{ index (split . " ") 0 }}{{ end }}</a>
</li>
{{ end }}
<li class="list-inline-item">
<span class="card-meta-date">{{.PublishDate.Format "Jan 02, 2006"}}</span>
</li>
</ul>
</div>
</article>

View File

@@ -0,0 +1,51 @@
<!--
PROJECT: Editor Hugo
VERSION: 1.0.0
AUTHOR: Gethugothemes
AUTHOR WEBSITE: https://gethugothemes.com
-->
<!DOCTYPE html>
<html lang="{{ site.LanguageCode | default `en-US` }}">
<head>
{{ partial "head.html" . }}
{{ partialCached "style.html" . }}
</head>
<body>
{{ partialCached "preloader.html" . }}
{{ partial "header.html" . }}
{{ if .IsHome }}
<section class="page-content">
<div class="container-fluid pl-3 pl-md-0 pr-3 pr-lg-4">
<div class="row no-gutters">
{{ block "main" . }}{{ end }}
</div>
</div>
</section>
{{ else }}
<section class="page-content section" style="border-left:1px solid #eee">
<div class="container px-3 px-lg-4">
<div class="row justify-content-center">
{{ block "main" . }}{{ end }}
</div>
</div>
<div class="container-fluid px-3 px-lg-4">
<div class="row justify-content-center">
<div class="col-12 mt-4 pt-2">
{{ partial "footer.html" . }}
</div>
</div>
</div>
</section>
{{ end }}
{{ partialCached "script.html" . }}
</body>
</html>

View File

@@ -0,0 +1,40 @@
{{ define "main" }}
{{ partial "page-header.html" . }}
<div class="col-12 mb-5">
<div class="row">
<div class="col-lg-4">
<div class="pr-0 pr-lg-4">
<div class="content mb-5">
{{.Content | markdownify}}
</div>
<h4 class="mb-3"><a class="text-underline text-primary" href="mailto:{{site.Params.email}}">{{site.Params.email}}</a></h4>
<p class="mb-2">{{site.Params.address}}</p>
<p class="mb-2"><a href="tel:{{site.Params.mobile}}">{{site.Params.mobile}}</a></p>
</div>
</div>
<div class="col-lg-6 mt-5 mt-lg-0">
<form method="POST" action="{{ site.Params.contact_form_action | safeURL}}" class="row">
<div class="col-md-6">
<input type="text" class="form-control mb-4" placeholder="Name" name="name" id="name">
</div>
<div class="col-md-6">
<input type="email" class="form-control mb-4" placeholder="Email" name="email" id="email">
</div>
<div class="col-12">
<input type="text" class="form-control mb-4" placeholder="Subject" name="subject" id="subject">
</div>
<div class="col-12 mt-3">
<textarea name="message" id="message" class="form-control mb-4" placeholder="Type You Message Here"
rows="5"></textarea>
</div>
<div class="col-12">
<button class="btn btn-primary" type="submit">{{ i18n `send_message` }}</button>
</div>
</form>
</div>
</div>
</div>
{{ end }}

View File

@@ -0,0 +1,14 @@
{{- $.Scratch.Add "index" slice -}}
{{- range where site.RegularPages "Type" "in" site.Params.mainSections -}}
{{ with .Params.images }}
{{ range first 1 . }}
{{ $.Scratch.Set "image" (. | absURL) }}
{{ end }}
{{ end }}
{{ $image:= $.Scratch.Get "image" }}
{{- $.Scratch.Add "index" (dict "title" .Title "tags" .Params.tags "image" $image "categories" .Params.categories "contents" .Plain "permalink" .Permalink) -}}
{{- end -}}
{{- $.Scratch.Get "index" | jsonify -}}

View File

@@ -0,0 +1,123 @@
{{ define "main" }}
<!-- checking blog -->
{{ if or (eq .Section "post") (eq .Section "posts") (eq .Section "blog") (eq .Section "blogs") (eq .Section "news") }}
{{ partial "page-header.html" . }}
<div class="col-12">
<div class="row">
{{ $paginator := .Paginate (where site.RegularPages "Type" "in" site.Params.mainSections) }}
{{ range $paginator.Pages }}
<div class="col-lg-4 col-md-4 col-sm-6">
{{ .Render "article" }}
</div>
{{ end }}
</div>
<div class="row mb-4">
<div class="col-12">
{{"<!-- pagination -->" | safeHTML }}
{{ $paginator := .Paginator }}
<!-- Number of links either side of the current page. -->
{{ $adjacent_links := 2 }}
<!-- $max_links = ($adjacent_links * 2) + 1 -->
{{ $max_links := (add (mul $adjacent_links 2) 1) }}
<!-- $lower_limit = $adjacent_links + 1 -->
{{ $lower_limit := (add $adjacent_links 1) }}
<!-- $upper_limit = $paginator.TotalPages - $adjacent_links -->
{{ $upper_limit := (sub $paginator.TotalPages $adjacent_links) }}
<!-- If there's more than one page. -->
{{ if gt $paginator.TotalPages 1 }}
<nav class="mb-3">
<ul class="pagination justify-content-center">
<!-- Previous page. -->
{{ if $paginator.HasPrev }}
<li class="page-item"><a class="page-link arrow" href="{{ $paginator.Prev.URL }}" aria-label="Pagination Arrow">
<i class="fas fa-angle-left"></i>
</a></li>
{{ end }}
<!-- Page numbers. -->
{{ range $paginator.Pagers }}
{{ $.Scratch.Set "page_number_flag" false }}
<!-- Advanced page numbers. -->
{{ if gt $paginator.TotalPages $max_links }}
<!-- Lower limit pages. -->
<!-- If the user is on a page which is in the lower limit. -->
{{ if le $paginator.PageNumber $lower_limit }}
<!-- If the current loop page is less than max_links. -->
{{ if le .PageNumber $max_links }}
{{ $.Scratch.Set "page_number_flag" true }}
{{ end }}
<!-- Upper limit pages. -->
<!-- If the user is on a page which is in the upper limit. -->
{{ else if ge $paginator.PageNumber $upper_limit }}
<!-- If the current loop page is greater than total pages minus $max_links -->
{{ if gt .PageNumber (sub $paginator.TotalPages $max_links) }}
{{ $.Scratch.Set "page_number_flag" true }}
{{ end }}
<!-- Middle pages. -->
{{ else }}
{{ if and ( ge .PageNumber (sub $paginator.PageNumber $adjacent_links) ) ( le .PageNumber (add $paginator.PageNumber $adjacent_links) ) }}
{{ $.Scratch.Set "page_number_flag" true }}
{{ end }}
{{ end }}
<!-- Simple page numbers. -->
{{ else }}
{{ $.Scratch.Set "page_number_flag" true }}
{{ end }}
<!-- Output page numbers. -->
{{ if eq ($.Scratch.Get "page_number_flag") true }}
<li class="page-item">
<a href="{{ .URL }}" class="page-link{{ if eq . $paginator }} active {{ end }}">
{{ .PageNumber }}
</a>
</li>
{{ end }}
{{ end }}
<!-- Next page. -->
{{ if $paginator.HasNext }}
<li class="page-item"><a class="page-link arrow" href="{{ $paginator.Next.URL }}" aria-label="Pagination Arrow">
<i class="fas fa-angle-right"></i>
</a></li>
{{ end }}
</ul>
</nav>
{{ end }}
</div>
</div>
</div>
<!-- taxonomie page -->
{{ else if or (eq .Section "categories") (eq .Section "tags")}}
{{ partial "page-header.html" . }}
<div class="col-12">
<div class="row">
{{ range .Data.Pages }}
<div class="col-lg-4 col-md-4 col-sm-6">
{{ .Render "article" }}
</div>
{{ end }}
</div>
</div>
<!-- regular page -->
{{ else }}
{{ partial "page-header.html" . }}
<section class="section">
<div class="container">
<div class="row">
<div class="col-lg-10 mx-auto">
<div class="content">
{{.Content}}
</div>
</div>
</div>
</div>
</section>
{{ end }}
<!-- /regular page -->
{{ end }}

View File

@@ -0,0 +1,51 @@
{{ define "main" }}
<div class="col-lg-12">
<section class="page-header">
<div class="my-4 py-5">
<h4 class="title">{{ i18n "search_result_for" }}
<span class="mark">
<script>
var keyword = (window.location.search).substr(3);
var result = keyword.replace("+", " ");
document.write(result);
</script>
</span>
</h4>
</div>
</section>
<div class="row" id="search-results"></div>
<script id="search-result-template" type="text/x-js-template">
<div class="col-lg-4 col-md-4 col-sm-6">
<article class="card post-card" id="summary-${key}">
<a href="${link}">
${ isset image }<img loading="lazy" class="w-100" src="${image}" alt="${title}">${end}
</a>
<div class="card-body mb-3">
<h3 class="h4 mb-2">
<a class="post-title" href="${link}" title="${title}">${title}</a>
</h3>
<p class="mb-0">${snippet}</p>
</div>
<div class="card-footer">
<ul class="card-meta list-inline mb-0">
<li class="list-inline-item">
<span class="card-meta-date">{{ i18n "category" }}: ${categories}</span>
</li>
<li class="list-inline-item">
<span class="card-meta-date">{{ i18n "tag" }}: ${tags}</span>
</li>
</ul>
</div>
</article>
</div>
</script>
</div>
{{ "<!-- Search index -->" | safeHTML }}
<script>
var indexURL = {{"index.json" | absLangURL}}
</script>
{{ end }}

View File

@@ -0,0 +1,84 @@
{{ define "main" }}
<!-- checking blog -->
{{ if or (eq .Section "post") (eq .Section "posts") (eq .Section "blog") (eq .Section "blogs") (eq .Section "news") (eq .Section "categories") (eq .Section "tags") }}
<div class="col-lg-8">
<div class="mb-4 mt-4 mt-md-0">
{{ with .Params.images }}
<div class="post-slider">
{{ range . }}
<div><img loading="lazy" class="w-100" src="{{ . | absURL }}" alt=""></div>
{{ end }}
</div>
{{ end }}
{{ with .Params.tags }}
<ul class="card-meta-tag list-inline mt-3">
{{ range . }}
<li class="list-inline-item"><a href="{{site.BaseURL}}tags/{{.| urlize}}/">{{.}}</a></li>
{{ end }}
</ul>
{{ end }}
<h2 class="h3 mt-2 mb-3 post-title">{{ .Title }}</h2>
<ul class="card-meta list-inline mb-0">
{{ with site.GetPage "/about" }}
<li class="list-inline-item">
<span class="text-light">by:</span>
<a href="{{ .Permalink }}" class="card-meta-author">{{ .Params.name }}</a>
</li>
{{ end }}
<li class="list-inline-item">
<span class="card-meta-date">{{.PublishDate.Format "Jan 02, 2006"}}</span>
</li>
</ul>
</div>
<div class="content">
{{ .Content }}
</div>
<!-- comments -->
{{ if site.Config.Services.Disqus.Shortname }}
<div class="border p-4 mt-5">
{{ template "_internal/disqus.html" . }}
</div>
{{ end }}
</div>
<div class="col-lg-4 mt-5 mt-lg-0">
<div class="pl-0 pl-lg-3">
{{ $widget:= site.Params.widgets.sidebar }}
{{- partial "widgets/widget-wrapper" ( dict "Widgets" $widget "Scope" . ) -}}
</div>
</div>
<div class="col-lg-12">
<div class="single-post-similer">
<div class="row">
<div class="col-12">
<h3 class="text-dark font-weight-bold mb-4 pb-2">{{i18n "you_may_also_like"}}</h3>
</div>
{{ $related := ( where site.RegularPages "Type" "in" site.Params.mainSections ) | intersect (where site.Pages ".Title" "!=" .Title) | union (site.RegularPages.RelatedIndices . "tags" ) }}
{{ range first 3 $related }}
<div class="col-lg-4 col-md-4 col-sm-6">
{{ .Render "article" }}
</div>
{{ end }}
</div>
</div>
</div>
<!-- regular page -->
{{ else }}
<div class="col-lg-12">
<div class="row">{{ partial "page-header.html" . }}</div>
<div class="content">
{{.Content}}
</div>
</div>
{{ end }}
<!-- /regular page -->
{{ end }}

View File

@@ -0,0 +1,2 @@
<!-- Redirect to homepage -->
<script>window.location.replace("{{ site.BaseURL | relLangURL }}");</script>

View File

@@ -0,0 +1,137 @@
{{ define "main" }}
<div class="col-lg-4 col-xl-3">
<div class="author-banner bg-primary-light text-center d-flex flex-column align-items-center justify-content-center">
{{ with site.GetPage "/about" }}
{{ if .Params.image }}
<img loading="lazy" class="mb-4 rounded-circle w-100" style="max-width:280px" src="{{ .Params.image | absURL }}" alt="Author">
{{ else if .Params.email }}
<img loading="lazy" class="mb-4 rounded-circle w-100" style="max-width:280px" src="https://www.gravatar.com/avatar/{{ md5 .Params.email }}?s=220&pg&d=identicon">
{{ end }}
<p class="text-uppercase small mb-2">{{ i18n `my_name_is` }}</p>
<h1 class="h3 text-primary font-primary mb-3">{{ .Params.name }}</h1>
<div class="mb-0 mx-auto" style="max-width:460px">{{ .Params.summary }} <a href="{{ .Permalink }}" aria-label="About me" class="text-underline d-inline-block">{{ i18n `read_more` }}</a></div>
{{ end }}
</div>
</div>
<div class="col-lg-8 col-xl-9">
<div class="section">
<div class="row">
{{ $paginator := .Paginate (where site.RegularPages "Type" "in" site.Params.mainSections) }}
{{ range $paginator.Pages }}
<div class="col-xl-4 col-sm-6">
{{ .Render "article" }}
</div>
{{ end }}
</div>
<div class="row">
<div class="col-12">
{{"<!-- pagination -->" | safeHTML }}
{{ $paginator := .Paginator }}
<!-- Number of links either side of the current page. -->
{{ $adjacent_links := 2 }}
<!-- $max_links = ($adjacent_links * 2) + 1 -->
{{ $max_links := (add (mul $adjacent_links 2) 1) }}
<!-- $lower_limit = $adjacent_links + 1 -->
{{ $lower_limit := (add $adjacent_links 1) }}
<!-- $upper_limit = $paginator.TotalPages - $adjacent_links -->
{{ $upper_limit := (sub $paginator.TotalPages $adjacent_links) }}
<!-- If there's more than one page. -->
{{ if gt $paginator.TotalPages 1 }}
<nav class="mb-3">
<ul class="pagination justify-content-center">
<!-- Previous page. -->
{{ if $paginator.HasPrev }}
<li class="page-item"><a class="page-link arrow" href="{{ $paginator.Prev.URL }}" aria-label="Pagination Arrow">
<i class="fas fa-angle-left"></i>
</a></li>
{{ end }}
<!-- Page numbers. -->
{{ range $paginator.Pagers }}
{{ $.Scratch.Set "page_number_flag" false }}
<!-- Advanced page numbers. -->
{{ if gt $paginator.TotalPages $max_links }}
<!-- Lower limit pages. -->
<!-- If the user is on a page which is in the lower limit. -->
{{ if le $paginator.PageNumber $lower_limit }}
<!-- If the current loop page is less than max_links. -->
{{ if le .PageNumber $max_links }}
{{ $.Scratch.Set "page_number_flag" true }}
{{ end }}
<!-- Upper limit pages. -->
<!-- If the user is on a page which is in the upper limit. -->
{{ else if ge $paginator.PageNumber $upper_limit }}
<!-- If the current loop page is greater than total pages minus $max_links -->
{{ if gt .PageNumber (sub $paginator.TotalPages $max_links) }}
{{ $.Scratch.Set "page_number_flag" true }}
{{ end }}
<!-- Middle pages. -->
{{ else }}
{{ if and ( ge .PageNumber (sub $paginator.PageNumber $adjacent_links) ) ( le .PageNumber (add $paginator.PageNumber $adjacent_links) ) }}
{{ $.Scratch.Set "page_number_flag" true }}
{{ end }}
{{ end }}
<!-- Simple page numbers. -->
{{ else }}
{{ $.Scratch.Set "page_number_flag" true }}
{{ end }}
<!-- Output page numbers. -->
{{ if eq ($.Scratch.Get "page_number_flag") true }}
<li class="page-item">
<a href="{{ .URL }}" class="page-link{{ if eq . $paginator }} active {{ end }}">
{{ .PageNumber }}
</a>
</li>
{{ end }}
{{ end }}
<!-- Next page. -->
{{ if $paginator.HasNext }}
<li class="page-item"><a class="page-link arrow" href="{{ $paginator.Next.URL }}" aria-label="Pagination Arrow">
<i class="fas fa-angle-right"></i>
</a></li>
{{ end }}
</ul>
</nav>
{{ end }}
</div>
</div>
{{ if site.Params.subscription.enable }}
{{ with site.Params.subscription }}
<div class="section pb-0">
<div class="row">
<div class="col-12">
<div class="newsletter-block bg-primary-light font-primary">
<div class="row align-items-center">
<div class="col-12">
<h3 class="mb-0">{{ i18n `subscribe_title` }}</h3>
</div>
<div class="col-12 mt-4">
<form action="{{ .mailchimp_form_action }}" name="{{ .mailchimp_form_name }}" method="post">
<div class="input-group">
<input type="text" class="form-control pl-3" placeholder="{{ i18n `enter_your_email`}}" aria-label="{{ i18n `enter_your_email`}}" required>
<div class="input-group-append">
<button type="submit" class="input-group-text pr-3" aria-label="News-letter"><i class="far fa-paper-plane"></i>
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
{{ end }}
{{ end }}
<div class="mt-4 pt-1">
{{ partial "footer.html" . }}
</div>
</div>
</div>
{{ end }}

View File

@@ -0,0 +1,43 @@
<footer class="bg-primary-light py-5">
<div class="container">
<div class="row">
{{ with site.Params.social }}
<div class="col-12 text-center mb-5">
<ul class="social-links is-circled list-unstyled list-inline font-weight-500">
{{ range . }}
<li class="list-inline-item"><a href="{{.link}}" title="{{.title}}">
<i class="icon {{.icon}}"></i> {{.title}}
</a></li>
{{ end }}
</ul>
</div>
{{ end }}
{{ if not .IsHome }}
{{ if site.Params.subscription.enable }}
{{ with site.Params.subscription }}
<!-- subscription form -->
<form class="newsletter-block mx-auto mb-5" action="{{ .mailchimp_form_action }}" method="post" name="mc-embedded-subscribe-form" target="_blank">
<h5 class="h4 mb-3 text-center font-primary">{{ i18n `subscribe_title` }}</h5>
<div class="input-group">
<input type="text" class="form-control bg-transparent pl-3" placeholder="{{ i18n `enter_your_email`}}" aria-label="{{ i18n `enter_your_email`}}" required>
<div class="input-group-append">
<button type="submit" class="input-group-text pr-3" aria-label="News-letter"><i class="far fa-paper-plane"></i>
</button>
</div>
</div>
<div style="position: absolute; left: -5000px;" aria-hidden="true">
<input type="text" name="{{ .mailchimp_form_name }}" tabindex="-1">
</div>
</form>
{{ end }}
{{ end }}
{{ end }}
<div class="col-12 text-center">
<p class="mb-0 font-weight-500">{{site.Params.copyright | markdownify}}</p>
</div>
</div>
</div>
</footer>

View File

@@ -0,0 +1,28 @@
<meta charset="utf-8">
<title>{{ .Title }}</title>
<!-- mobile responsive meta -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5">
<meta name="description" content="{{ with .Params.Description }}{{ . }}{{ else }}{{ with site.Params.description }}{{ . }}{{ end }}{{ end }}">
{{ with site.Params.author }}
<meta name="author" content="{{ . }}">{{ end }}
<meta name="theme-name" content="editor-hugo" />
<!--Favicon-->
<link rel="shortcut icon" href="{{ site.Params.favicon | absURL }}" type="image/x-icon">
<link rel="icon" href="{{ site.Params.favicon | absURL }}" type="image/x-icon">
<!-- multilingual SEO optimizations -->
{{ if .IsTranslated }}
{{ range .Page.AllTranslations }}
<link rel="alternate" title="{{.Title}}" hreflang="{{.Lang}}" href="{{.RelPermalink}}">
{{ end }}
{{ end }}
{{ with .Params.image }}
<meta property="og:image" content="{{ . | absURL }}" />
{{ end }}
{{ template "_internal/opengraph.html" . }}
{{ template "_internal/google_analytics.html" . }}
{{ site.Params.custom_script | safeHTML }}

View File

@@ -0,0 +1,139 @@
<header class="sidenav">
<div class="is-top">
<div>
<!-- Language List -->
{{ if .IsTranslated }}
<span class="d-inline-block d-md-none mr-1"><select style="cursor:pointer;background:transparent" class="m-2 border-0 text-uppercase" id="select-language" onchange="location = this.value;">
{{ $siteLanguages := site.Languages}}
{{ $pageLang := .Page.Lang}}
{{ range .Page.AllTranslations }}
{{ $translation := .}}
{{ range $siteLanguages }}
{{ if eq $translation.Lang .Lang }}
{{ $selected := false }}
{{ if eq $pageLang .Lang}}
<option id="{{ $translation.Language }}" value="{{ $translation.Permalink }}" selected>{{ .LanguageName }}
</option>
{{ else }}
<option id="{{ $translation.Language }}" value="{{ $translation.Permalink }}">{{ .LanguageName }}</option>
{{ end }}
{{ end }}
{{ end }}
{{ end }}
</select></span>
{{ end }}
{{ if site.Params.search }}
<button class="search-toggle d-inline-block d-md-none" data-toggle="search">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" viewBox="0 0 16 16"><path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z"/></svg>
</button>
{{ end }}
<button class="sidenav-toggler d-inline-block {{if eq site.Params.logo_rotate false}}logo-plain{{end}}" data-toggle="sidenav-menu">
<svg id="toggler-icon" class="toggler-icon" viewBox="0 0 100 100" width="60" onclick="this.classList.toggle('active')"><path class="line top" d="m 30,33 h 40 c 0,0 9.044436,-0.654587 9.044436,-8.508902 0,-7.854315 -8.024349,-11.958003 -14.89975,-10.85914 -6.875401,1.098863 -13.637059,4.171617 -13.637059,16.368042 v 40" /><path class="line middle" d="m 30,50 h 40" /><path class="line bottom" d="m 30,67 h 40 c 12.796276,0 15.357889,-11.717785 15.357889,-26.851538 0,-15.133752 -4.786586,-27.274118 -16.667516,-27.274118 -11.88093,0 -18.499247,6.994427 -18.435284,17.125656 l 0.252538,40" /></svg>
</button>
</div>
{{ if site.Params.logo_rotate }}
<a class="navbar-brand mr-0" href="{{ site.BaseURL | relLangURL }}">
{{ if site.Params.logo }}
<img height="{{site.Params.logo_height}}" src="{{ site.Params.logo | absURL}}"
alt="{{site.Params.logo_text}}">
{{ else }}
<span class="h3">{{site.Params.logo_text | markdownify}} <span class="text-primary">.</span></span>
{{ end }}
</a>
{{ else }}
<a class="navbar-brand plain mr-0" href="{{ site.BaseURL | relLangURL }}">
{{ if site.Params.logo }}
<img height="{{site.Params.logo_height}}" src="{{ site.Params.logo | absURL}}"
alt="{{site.Params.logo_text}}">
{{ else }}
<span class="h3">{{site.Params.logo_text | markdownify}} <span class="text-primary">.</span></span>
{{ end }}
</a>
{{ end }}
</div>
<div class="d-none d-md-block">
<ul class="social-links list-unstyled">
{{ if site.Params.search }}
<li class="mb-3">
<button class="search-toggle" data-toggle="search">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" viewBox="0 0 16 16"><path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z"/></svg>
</button>
</li>
{{ end }}
<li>
<a href="mailto:{{ site.Params.email }}">
<svg width="1.15em" height="1.15em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M0 4a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V4zm2-1a1 1 0 0 0-1 1v.217l7 4.2 7-4.2V4a1 1 0 0 0-1-1H2zm13 2.383l-4.758 2.855L15 11.114v-5.73zm-.034 6.878L9.271 8.82 8 9.583 6.728 8.82l-5.694 3.44A1 1 0 0 0 2 13h12a1 1 0 0 0 .966-.739zM1 11.114l4.758-2.876L1 5.383v5.73z"/></svg>
</a>
</li>
<!-- Language List -->
{{ if .IsTranslated }}
<li class="mt-3 pt-2"><select style="cursor:pointer" class="m-2 border-0 text-uppercase" id="select-language" onchange="location = this.value;">
{{ $siteLanguages := site.Languages}}
{{ $pageLang := .Page.Lang}}
{{ range .Page.AllTranslations }}
{{ $translation := .}}
{{ range $siteLanguages }}
{{ if eq $translation.Lang .Lang }}
{{ $selected := false }}
{{ if eq $pageLang .Lang}}
<option id="{{ $translation.Language }}" value="{{ $translation.Permalink }}" selected>{{ .LanguageName }}
</option>
{{ else }}
<option id="{{ $translation.Language }}" value="{{ $translation.Permalink }}">{{ .LanguageName }}</option>
{{ end }}
{{ end }}
{{ end }}
{{ end }}
</select></li>
{{ end }}
</ul>
</div>
</header>
<div class="sidenav-overlay" data-toggle="sidenav-menu" onclick="document.getElementById('toggler-icon').classList.remove('active')"></div>
<nav class="sidenav-menu flex-column justify-content-between">
<ul class="w-100 accordion" id="accordionMenu">
{{ range site.Menus.main }}
{{ if .HasChildren }}
<li class="nav-item">
<a class="nav-link" href="#" type="button" data-toggle="collapse" data-target="#dropdown-menu-02">{{ .Name }}</a>
<ul id="dropdown-menu-02" class="collapse list-unstyled" data-parent="#accordionMenu">
{{ range .Children }}
<li><a href="{{if .Pre}}{{if not $.IsHome}}{{site.BaseURL | relLangURL}}{{end}}{{.Pre}}{{ .URL }}{{else}}{{.URL | relLangURL}}{{end}}">{{ .Name }}</a></li>
{{ end }}
</ul>
</li>
{{ else }}
<li class="nav-item">
<a class="nav-link" href="{{if .Pre}}{{if not $.IsHome}}{{site.BaseURL | relLangURL}}{{end}}{{.Pre}}{{ .URL }}{{else}}{{.URL | relLangURL}}{{end}}">{{ .Name }}</a>
</li>
{{ end }}
{{ end }}
</ul>
{{ with site.Params.social }}
<ul class="social-links list-unstyled list-inline mt-5">
{{ range . }}
<li class="list-inline-item"><a href="{{.link}}" title="{{.title}}">
<i class="{{.icon}}"></i>
</a></li>
{{ end }}
</ul>
{{ end }}
</nav>
{{ if site.Params.search }}
<div class="search-block">
<div data-toggle="search-close">
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" fill="currentColor" class="text-primary" viewBox="0 0 16 16"><path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z"/></svg>
</div>
<form action="{{ `search`| relLangURL }}" method="GET">
<input id="search-field" name="s" type="search" placeholder="{{ i18n `search_placeholder`}}" class="text-center" aria-label="search-query">
</form>
</div>
{{ end }}

View File

@@ -0,0 +1,19 @@
<section class="col-12 page-header">
<div class="section my-4 py-5">
{{ if or (eq .Section "tags") (eq .Section "categories") }}
{{ if eq .Section "tags" }}
<h2 class="h4 title">{{ i18n "showing_posts_from" }} <mark>{{.Title | markdownify}}</mark> {{ i18n "tag" }}</h2>
{{ else if eq .Section "categories" }}
<h2 class="h4 title">{{ i18n "showing_posts_from" }} <mark>{{.Title | markdownify}}</mark> {{ i18n "category" }}</h2>
{{ end }}
{{ else }}
<h2 class="h4 title">{{.Title | markdownify}}</h2>
{{ end }}
</div>
</section>

View File

@@ -0,0 +1,7 @@
{{ if site.Params.preloader.enable }}
<div class="preloader">
{{ with site.Params.preloader.preloader }}
<img src="{{ . | absURL }}" alt="preloader">
{{ end }}
</div>
{{ end }}

View File

@@ -0,0 +1,72 @@
<!-- font family -->
<script src="https://cdn.jsdelivr.net/gh/theprojectsomething/webfontloader@feature/google-fonts-v2/webfontloader.js"></script>
{{$pf:= site.Params.variables.primary_font}}
{{$sf:= site.Params.variables.secondary_font}}
<script>
WebFont.load({
google: {
api: 'https://fonts.googleapis.com/css2',
families: ['{{$pf}}{{if not $sf}}&display=swap{{end}}'{{with $sf}},'{{.}}&display=swap'{{end}}],
version: 2
},
active: () => {
sessionStorage.fontsLoaded = true
}
});
</script>
<!-- JS Plugins + Main script -->
{{ $scripts := slice }}
{{ range site.Params.plugins.js}}
{{ if findRE "^http" .link }}
<script src="{{ .link | absURL }}" type="application/javascript" {{.attributes | safeHTMLAttr}}></script>
{{ else }}
{{ $scripts = $scripts | append (resources.Get .link) }}
{{ end }}
{{ end }}
{{ $scripts := $scripts | append (resources.Get "js/script.js" | minify) }}
{{ $scripts := $scripts | resources.Concat "/js/script.js" | minify | fingerprint "sha512" }}
<script crossorigin="anonymous" defer="defer" data-turbolinks-suppress-warning integrity="{{ $scripts.Data.Integrity }}" type="application/javascript">{{$scripts.Content | safeJS}}</script>
<!-- cookie -->
{{ if site.Params.cookies.enable }}
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-cookie/2.2.1/js.cookie.min.js"></script>
<div id="js-cookie-box" class="cookie-box cookie-box-hide">
This site uses cookies. By continuing to use this website, you agree to their use. <span id="js-cookie-button" class="btn btn-sm btn-outline-primary ml-2">I Accept</span>
</div>
<script>
(function ($) {
const cookieBox = document.getElementById('js-cookie-box');
const cookieButton = document.getElementById('js-cookie-button');
if (!Cookies.get('cookie-box')) {
cookieBox.classList.remove('cookie-box-hide');
cookieButton.onclick = function () {
Cookies.set('cookie-box', true, {
expires: {{ site.Params.cookies.expire_days }}
});
cookieBox.classList.add('cookie-box-hide');
};
}
})(jQuery);
</script>
<!-- cookie style -->
<style>
.cookie-box {
position: fixed;
left: 0;
right: 0;
bottom: 0;
text-align: center;
z-index: 9999;
padding: 1rem 2rem;
background: rgb(71, 71, 71);
transition: all .75s cubic-bezier(.19, 1, .22, 1);
color: #fdfdfd;
}
.cookie-box-hide {
display: none;
}
</style>
{{ end }}

View File

@@ -0,0 +1,53 @@
<!-- plugins + stylesheet -->
<link rel="preconnect" href="https://fonts.gstatic.com">
{{ $styles := slice }}
{{ range site.Params.plugins.css }}
{{ if findRE "^http" .link }}
<link crossorigin="anonymous" media="all" rel="stylesheet" href="{{ .link | absURL }}" {{.attributes | safeHTMLAttr}} >
{{ else }}
{{ $styles = $styles | append (resources.Get .link) }}
{{ end }}
{{ end }}
{{ $styles := $styles | append (resources.Get "scss/style.scss" | resources.ExecuteAsTemplate "style.scss" . | toCSS) }}
{{ $styles := $styles | resources.Concat "/css/style.css" | minify | fingerprint "sha512"}}
<style crossorigin="anonymous" media="all" type="text/css" integrity="{{ $styles.Data.Integrity }}">{{$styles.Content | safeCSS}}</style>
<style>
blockquote::before {
display: none;
font-family: "{{ with site.Params.variables }} {{.icon_font}} {{ end }}";
}
.content ul li:not(.nav-item) {
position: relative;
margin-bottom: 5px;
list-style-type: none;
}
.content ul li:not(.nav-item) svg {
margin-right: 6px;
transform: scale(0.8);
color: {{ with site.Params.variables }} {{.primary_color}} {{ end }};
}
.content ul li:not(.nav-item)::before {
font-size: 14px;
font-family: "{{ with site.Params.variables }} {{.icon_font}} {{ end }}";
font-weight: 900;
content: "\f069";
display: none;
}
.notices p::before {
position: absolute;
top: 2px;
font-family: "{{ with site.Params.variables }} {{.icon_font}} {{ end }}";
font-weight: 900;
content: "\f05a";
left: 10px;
display: none;
}
.notices p svg {
position: absolute;
top: 7px;
left: 10px;
color: {{ with site.Params.variables }} {{.white}} {{ end }};
}
</style>

View File

@@ -0,0 +1,15 @@
{{ "<!-- about me -->" | safeHTML }}
<div class="widget text-center">
{{ with site.GetPage "/about" }}
<span class="widget-title">{{ i18n `about_me` }}</span>
{{ if .Params.image }}
<img loading="lazy" class="mb-4 rounded-circle w-100" style="max-width:150px" src="{{ .Params.image | absURL }}" alt="Author">
{{ else if .Params.email }}
<img loading="lazy" class="mb-4 rounded-circle w-100" style="max-width:150px" src="https://www.gravatar.com/avatar/{{ md5 .Params.email }}?s=150&pg&d=identicon">
{{ end }}
<p class="text-uppercase small mb-2">{{ i18n `my_name_is` }}</p>
<h1 class="h4 text-primary font-primary mb-3">{{ .Params.name }}</h1>
<div class="mb-0 mx-auto" style="max-width:460px">{{ .Summary }} <a href="{{ .Permalink }}" aria-label="About me" class="text-underline d-inline-block">{{ i18n `read_more` }}</a></div>
{{ end }}
</div>

View File

@@ -0,0 +1,14 @@
{{ "<!-- categories -->" | safeHTML }}
<div class="widget">
<span class="widget-title">{{ i18n "categories" }}</span>
{{ if isset site.Taxonomies "categories" }}
{{ if not (eq (len site.Taxonomies.categories) 0) }}
<ul class="sidebar-post-categories list-unstyled">
{{ range $name, $items := site.Taxonomies.categories }}
<li><a href="{{ `categories/` | absLangURL }}{{ $name | urlize | lower }}/">{{ $name | humanize }} <span>{{ len $items }}</span></a></li>
{{ end }}
</ul>
{{ end }}
{{ end }}
</div>

View File

@@ -0,0 +1,25 @@
{{ "<!-- latest post -->" | safeHTML }}
<div class="widget">
<span class="widget-title">{{ i18n `recent_post` }}</span>
<ul class="sidebar-recent-post list-unstyled">
{{ $related := ( where site.RegularPages "Type" "in" site.Params.mainSections ) | intersect (where site.Pages ".Title" "!=" .Title) | union (site.RegularPages.Related . ) }}
{{ range first 3 $related }}
<li class="recent-post-item">
<div class="media">
<div class="media-body mr-2">
<h5><a href="{{ .Permalink }}">{{ .Title }}</a></h5>
<span class="card-meta">
<span class="card-meta-date">{{.PublishDate.Format "Jan 02, 2006"}}</span>
</span>
</div>
<a href="{{ .Permalink }}" class="recent-post-image">
{{ range first 1 .Params.Images }}
<img loading="lazy" class="img-fluid rounded-circle" src="{{ . | absURL }}">
{{ end }}
</a>
</div>
</li>
{{ end }}
</ul>
</div>

View File

@@ -0,0 +1,10 @@
{{ "<!-- Search -->" | safeHTML }}
{{ if site.Params.search }}
<div class="widget">
<h5 class="widget-title"><span>{{ i18n "search" }}</span></h5>
<form action="{{ `search`| relLangURL }}" class="widget-search">
<input id="search-query" name="s" type="search" placeholder="{{ i18n `search_placeholder`}}">
<button type="submit"><i class="ti-search"></i></button>
</form>
</div>
{{ end }}

View File

@@ -0,0 +1,13 @@
{{ "<!-- tags -->" | safeHTML }}
<div class="widget">
<span class="widget-title">{{ i18n "tags" }}</span>
{{ if isset site.Taxonomies "tags" }}
{{ if not (eq (len site.Taxonomies.tags) 0) }}
<ul class="sidebar-post-tags list-unstyled list-inline">
{{ range $name, $items := site.Taxonomies.tags }}
<li class="list-inline-item"><a href="{{ `tags/` | absLangURL }}{{ $name | urlize | lower }}/">{{ $name | humanize }}</a></li>
{{ end }}
</ul>
{{ end }}
{{ end }}
</div>

View File

@@ -0,0 +1,3 @@
{{- range .Widgets -}}
{{- partial ( print "widgets/" . ) $.Scope -}}
{{- end -}}

View File

@@ -0,0 +1,8 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<div class="border border-default collapse-wrapper">
<a class="d-flex p-2 collapse-head" data-toggle="collapse" href="#{{ .Get 0 | urlize }}" role="button">
{{ .Get 0 | markdownify }} <i class="fas fa-plus ml-auto pt-1 mt-1"></i>
</a>
<div class="collapse" id="{{ .Get 0 | urlize }}"><div class="p-2">{{ .Inner | markdownify }}</div></div>
</div>

View File

@@ -0,0 +1,3 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<div class="notices {{ .Get 0 }}" {{ if len .Params | eq 2 }} id="{{ .Get 1 }}" {{ end }}><p>{{ .Inner | markdownify }}</p></div>

View File

@@ -0,0 +1,11 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<div class="quote">
<i class="ti-quote-left"></i>
<div>
<p>{{ .Inner | markdownify }}</p>
{{ with .Get "by"}}
<span class="quote-by"> -{{ . }}</span>
{{ end }}
</div>
</div>

View File

@@ -0,0 +1,5 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<div class="tab-pane" title="{{ .Get 0 }}">
{{ .Inner }}
</div>

View File

@@ -0,0 +1,6 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<div class="code-tabs">
<ul class="nav nav-tabs"></ul>
<div class="tab-content">{{ .Inner }}</div>
</div>

View File

@@ -0,0 +1,8 @@
[build]
publish = "public"
command = "yarn project-setup && yarn build"
[build.environment]
HUGO_VERSION = "0.115.1"
GO_VERSION = "1.20.5"
HUGO_BASEURL = "/"

View File

@@ -0,0 +1,77 @@
const fs = require("fs");
const path = require("path");
const getFolderName = (rootfolder) => {
const configPath = path.join(
rootfolder,
"exampleSite/hugo.toml"
);
const getConfig = fs.readFileSync(configPath, "utf8");
const match = getConfig.match(/theme\s*=\s*\[?"([^"\]]+)"\]?/);
let selectedTheme = null;
if (match && match[1]) {
selectedTheme = match[1];
}
return selectedTheme;
};
const deleteFolder = (folderPath) => {
if (fs.existsSync(folderPath)) {
fs.rmSync(folderPath, { recursive: true, force: true });
}
};
const createNewfolder = (rootfolder, folderName) => {
const newFolder = path.join(rootfolder, folderName);
fs.mkdirSync(newFolder, { recursive: true });
return newFolder;
};
const iterateFilesAndFolders = (rootFolder, { destinationRoot }) => {
const directory = path.join(rootFolder);
const items = fs.readdirSync(directory, { withFileTypes: true });
items.forEach((item) => {
if (item.isDirectory()) {
createNewfolder(destinationRoot, item.name);
iterateFilesAndFolders(path.join(directory, item.name), {
currentFolder: item.name,
destinationRoot: path.join(destinationRoot, item.name),
});
} else {
const sourceFile = path.join(directory, item.name);
const destinationFile = path.join(destinationRoot, item.name);
fs.renameSync(sourceFile, destinationFile);
}
});
};
const setupProject = () => {
const rootfolder = path.join(__dirname, "../");
if (!fs.existsSync(path.join(rootfolder, "themes"))) {
const folderList = ["layouts", "assets", "static"];
const folderName = getFolderName(rootfolder);
const newfolderName = createNewfolder(
path.join(rootfolder, "themes"),
folderName
);
folderList.forEach((folder) => {
const source = path.join(rootfolder, folder);
const destination = path.join(newfolderName, folder);
if (fs.existsSync(source)) {
fs.mkdirSync(destination, { recursive: true });
iterateFilesAndFolders(source, {
currentFolder: folder,
destinationRoot: destination,
});
deleteFolder(source);
}
});
const exampleSite = path.join(rootfolder, "exampleSite");
iterateFilesAndFolders(exampleSite, { destinationRoot: rootfolder });
deleteFolder(exampleSite);
}
};
setupProject();

View File

@@ -0,0 +1,90 @@
const fs = require("fs");
const path = require("path");
const createNewfolder = (rootfolder, folderName) => {
const newFolder = path.join(rootfolder, folderName);
fs.mkdirSync(newFolder, { recursive: true });
return newFolder;
};
const deleteFolder = (folderPath) => {
if (fs.existsSync(folderPath)) {
fs.rmSync(folderPath, { recursive: true, force: true });
}
};
const getFolderName = (rootfolder) => {
const configPath = path.join(
rootfolder,
"exampleSite/hugo.toml"
);
const getConfig = fs.readFileSync(configPath, "utf8");
const match = getConfig.match(/theme\s*=\s*\[?"([^"\]]+)"\]?/);
let selectedTheme = null;
if (match && match[1]) {
selectedTheme = match[1];
}
return selectedTheme;
};
const iterateFilesAndFolders = (rootFolder, { destinationRoot }) => {
const directory = path.join(rootFolder);
const items = fs.readdirSync(directory, { withFileTypes: true });
items.forEach((item) => {
if (item.isDirectory()) {
createNewfolder(destinationRoot, item.name);
iterateFilesAndFolders(path.join(directory, item.name), {
currentFolder: item.name,
destinationRoot: path.join(destinationRoot, item.name),
});
} else {
const sourceFile = path.join(directory, item.name);
const destinationFile = path.join(destinationRoot, item.name);
fs.renameSync(sourceFile, destinationFile);
}
});
};
const setupTheme = () => {
const rootFolder = path.join(__dirname, "../");
if (!fs.existsSync(path.join(rootFolder, "exampleSite"))) {
const includesFiles = [
"hugo.toml",
"assets",
"config",
"data",
"content",
"i18n",
"static",
];
const folder = createNewfolder(rootFolder, "exampleSite");
fs.readdirSync(rootFolder, { withFileTypes: true }).forEach((file) => {
if (includesFiles.includes(file.name)) {
if (file.isDirectory()) {
const destination = path.join(rootFolder, "exampleSite", file.name);
fs.mkdirSync(destination, { recursive: true });
iterateFilesAndFolders(path.join(rootFolder, file.name), {
destinationRoot: destination,
});
deleteFolder(path.join(rootFolder, file.name));
} else {
fs.renameSync(
path.join(rootFolder, file.name),
path.join(folder, file.name)
);
}
}
});
const themes = path.join(rootFolder, "themes");
iterateFilesAndFolders(path.join(themes, getFolderName(rootFolder)), {
destinationRoot: rootFolder,
});
deleteFolder(themes);
}
};
setupTheme();

View File

@@ -0,0 +1,43 @@
#!/bin/bash
# default versions
NODE_VERSION='18.16.1';
GO_VERSION='1.20.5';
HUGO_VERSION='0.115.1';
# install Node.js
# echo "Installing Node.js $NODE_VERSION..."
# curl -sSOL https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}.tar.gz
# tar -xzf node-v${NODE_VERSION}.tar.gz
# export PATH=$PATH:/usr/local/bin
# rm -rf node-v${NODE_VERSION}.tar.gz
echo "USING NODE VERSION: $(node -v)"
# install Go
echo "Installing Go $GO_VERSION..."
curl -sSOL https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz
tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
rm -rf go${GO_VERSION}.linux-amd64.tar.gz
go version
# install Hugo
echo "Installing Hugo $HUGO_VERSION..."
curl -sSOL https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_Linux-64bit.tar.gz
tar -xzf hugo_extended_${HUGO_VERSION}_Linux-64bit.tar.gz
mv hugo /usr/local/bin/
rm -rf hugo_extended_${HUGO_VERSION}_Linux-64bit.tar.gz
hugo version
# project setup
echo "Project setting up..."
npm run project-setup
# install dependencies
echo "Installing project dependencies..."
npm install
# run the build command
echo "Running the build command..."
npm run build

View File

@@ -0,0 +1,11 @@
{
"builds": [
{
"src": "vercel-build.sh",
"use": "@vercel/static-build",
"config": {
"distDir": "public"
}
}
]
}