+
@@ -29,7 +29,7 @@
{{ i18n "latest_articles" }}
{{ range . }} -
+
{{ partial "widgets/article.html" . }}
diff --git a/layouts/partials/widgets/servicesidebar.html b/layouts/partials/widgets/servicesidebar.html
index 57f8ac4..ccadc1e 100644
--- a/layouts/partials/widgets/servicesidebar.html
+++ b/layouts/partials/widgets/servicesidebar.html
@@ -3,7 +3,7 @@
{{ with $projects }}
{{ i18n "related_projects" }}
{{ range . }} -
+
{{ partial "widgets/article.html" . }}
{{ end }}
diff --git a/layouts/service/single.html b/layouts/service/single.html
index ef242dc..8551a85 100644
--- a/layouts/service/single.html
+++ b/layouts/service/single.html
@@ -3,14 +3,14 @@
{{ partial "head.html" . }}
-
+
{{ partial "nav.html" . }}
-
+
@@ -25,12 +25,11 @@
{{ .Title }}
{{ .Params.shortDescription }}
-
-
+
+
{{ if (fileExists (printf "assets/%s" (index .Params.images 0))) -}}
{{ $mainimage := resources.Get (index .Params.images 0) }}
-
@@ -68,6 +68,7 @@
{{ partial "footer.html" . }}
+ {{ partial "scripts.html" }}
\ No newline at end of file
diff --git a/layouts/tagsspot/list.html b/layouts/tagsspot/list.html
index fda4156..40a9d68 100644
--- a/layouts/tagsspot/list.html
+++ b/layouts/tagsspot/list.html
@@ -3,7 +3,7 @@
{{ partial "head.html" . }}
-
+
{{ partial "nav.html" . }}
@@ -68,6 +68,7 @@
{{ partial "footer.html" . }}
+ {{ partial "scripts.html" }}
\ No newline at end of file
diff --git a/static/css/custom.css b/static/css/custom.css
index bedf1a8..e45a41b 100644
--- a/static/css/custom.css
+++ b/static/css/custom.css
@@ -51,6 +51,12 @@
--svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M10.616 16.077H7.077q-1.692 0-2.884-1.192T3 12t1.193-2.885t2.884-1.193h3.539v1H7.077q-1.27 0-2.173.904Q4 10.731 4 12t.904 2.173t2.173.904h3.539zM8.5 12.5v-1h7v1zm4.885 3.577v-1h3.538q1.27 0 2.173-.904Q20 13.269 20 12t-.904-2.173t-2.173-.904h-3.538v-1h3.538q1.692 0 2.885 1.192T21 12t-1.193 2.885t-2.884 1.193z'/%3E%3C/svg%3E");
}
+.icon-menu {
+ --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M4 17.27v-1h16v1zm0-4.77v-1h16v1zm0-4.77v-1h16v1z'/%3E%3C/svg%3E");
+ -webkit-mask-image: var(--svg);
+ mask-image: var(--svg);
+}
+
#home-introduction {
text-align: justify;
}
diff --git a/themes/lean/layouts/index.html b/themes/lean/layouts/index.html
index 9f0f075..ca2a4d1 100644
--- a/themes/lean/layouts/index.html
+++ b/themes/lean/layouts/index.html
@@ -1,7 +1,7 @@
{{ partial "head.html" . }}
-
+
{{ partial "nav.html" . }}
{{ partial "home-banner.html" . }}
@@ -20,6 +20,7 @@
{{ partial "home-bottom.html" . }}
{{ partial "footer.html" . }}
+ {{ partial "scripts.html" }}
\ No newline at end of file
diff --git a/themes/lean/layouts/partials/nav.html b/themes/lean/layouts/partials/nav.html
index 85afb79..336cc5f 100644
--- a/themes/lean/layouts/partials/nav.html
+++ b/themes/lean/layouts/partials/nav.html
@@ -5,7 +5,7 @@
+
@@ -39,7 +38,7 @@
-
+
{{ partial "footer.html" . }}
-
+ {{ partial "scripts.html" }}
\ No newline at end of file
diff --git a/layouts/tagsibis/list.html b/layouts/tagsibis/list.html
index ba35e04..9e5ceeb 100644
--- a/layouts/tagsibis/list.html
+++ b/layouts/tagsibis/list.html
@@ -3,7 +3,7 @@
{{ partial "head.html" . }}
-
+
{{ partial "nav.html" . }}
{{ partial "widgets/servicesidebar.html" . }}
@@ -55,6 +54,6 @@
-
+
-
{{ $current := . }}
{{ range .Site.Menus.main }}
diff --git a/themes/lean/layouts/partials/scripts.html b/themes/lean/layouts/partials/scripts.html
index e69de29..934e82d 100644
--- a/themes/lean/layouts/partials/scripts.html
+++ b/themes/lean/layouts/partials/scripts.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/themes/lean/static/css/main.css b/themes/lean/static/css/main.css
index 2096b3c..5805a85 100644
--- a/themes/lean/static/css/main.css
+++ b/themes/lean/static/css/main.css
@@ -115,7 +115,7 @@ a {
/* End reset */
body {
- padding-top: 60px;
+ padding-top: 100px;
font-family: "Arial";
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
@@ -331,36 +331,32 @@ body {
display: none;
margin: 0;
padding: 0;
- height: 45px;
- width: 100%;
- opacity: 0;
+ width: 32px;
+ height: 32px;
cursor: pointer
}
- #responsive-button + label {cursor: pointer;}
}
@media screen and (max-width: 992px) {
+ body {
+ padding-top: 60px;
+ };
+
#topmenu {
position:relative;
#responsive-button {
display: block;
}
- label:before {
- font-size: 1.6em;
- color: #FFFFFF;
- content: "\2261";
- margin-left: 20px;
- }
ul {
background:var(--dark-color);
position:absolute;
z-index:3;
height:auto;
display:none;
- top: 0;
- border-radius: 6px;
+ top: 45px;
+ right: -10px;
flex-direction: column;
- border: 1px solid #fff;
+ border-bottom-left-radius: 10px;
padding-left:0;
}
@@ -386,13 +382,14 @@ body {
color: #fff;
}
li {display:block;float:left;width:auto;}
- input, label {position:absolute;right:0;display:block}
- input {z-index:4}
- input:checked + label {color:#FFFFFF}
- input:checked + label:before {content:"\00d7"}
- input:checked ~ ul, input:checked ~ ul>li>ul.submenu {display: flex;visibility: visible; opacity: 1}
- input:checked ~ ul>li>ul.submenu>li {visibility: visible; display:block;}
+
+ :is(ul li:hover > ul, li:focus-within > ul, ul li ul:hover, ul li ul:focus) {
+ display: flex;
+ }
+
}
+ #topmenu.responsive ul {display: flex;visibility: visible; opacity: 1; margin-top:0}
+ #topmenu.responsive ul>li>ul.submenu>li {visibility: visible; display:block;}
}
#home-introduction {
@@ -692,9 +689,7 @@ footer {
}
}
-
-/* Max large */
-@media (max-width: 992px) {
+@media (max-width: 1140px) {
#page-content .container, footer .container {
padding-left: 20px;
padding-right: 20px;
diff --git a/themes/lean/static/js/htmx/ext/ajax-header.js b/themes/lean/static/js/htmx/ext/ajax-header.js
new file mode 100644
index 0000000..5c6221b
--- /dev/null
+++ b/themes/lean/static/js/htmx/ext/ajax-header.js
@@ -0,0 +1,7 @@
+htmx.defineExtension('ajax-header', {
+ onEvent: function (name, evt) {
+ if (name === "htmx:configRequest") {
+ evt.detail.headers['X-Requested-With'] = 'XMLHttpRequest';
+ }
+ }
+});
\ No newline at end of file
diff --git a/themes/lean/static/js/htmx/ext/alpine-morph.js b/themes/lean/static/js/htmx/ext/alpine-morph.js
new file mode 100644
index 0000000..1872dae
--- /dev/null
+++ b/themes/lean/static/js/htmx/ext/alpine-morph.js
@@ -0,0 +1,16 @@
+htmx.defineExtension('alpine-morph', {
+ isInlineSwap: function (swapStyle) {
+ return swapStyle === 'morph';
+ },
+ handleSwap: function (swapStyle, target, fragment) {
+ if (swapStyle === 'morph') {
+ if (fragment.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
+ Alpine.morph(target, fragment.firstElementChild);
+ return [target];
+ } else {
+ Alpine.morph(target, fragment.outerHTML);
+ return [target];
+ }
+ }
+ }
+});
\ No newline at end of file
diff --git a/themes/lean/static/js/htmx/ext/class-tools.js b/themes/lean/static/js/htmx/ext/class-tools.js
new file mode 100644
index 0000000..1cf4b42
--- /dev/null
+++ b/themes/lean/static/js/htmx/ext/class-tools.js
@@ -0,0 +1,92 @@
+(function () {
+
+ function splitOnWhitespace(trigger) {
+ return trigger.split(/\s+/);
+ }
+
+ function parseClassOperation(trimmedValue) {
+ var split = splitOnWhitespace(trimmedValue);
+ if (split.length > 1) {
+ var operation = split[0];
+ var classDef = split[1].trim();
+ var cssClass;
+ var delay;
+ if (classDef.indexOf(":") > 0) {
+ var splitCssClass = classDef.split(':');
+ cssClass = splitCssClass[0];
+ delay = htmx.parseInterval(splitCssClass[1]);
+ } else {
+ cssClass = classDef;
+ delay = 100;
+ }
+ return {
+ operation: operation,
+ cssClass: cssClass,
+ delay: delay
+ }
+ } else {
+ return null;
+ }
+ }
+
+ function performOperation(elt, classOperation, classList, currentRunTime) {
+ setTimeout(function () {
+ elt.classList[classOperation.operation].call(elt.classList, classOperation.cssClass);
+ }, currentRunTime)
+ }
+
+ function toggleOperation(elt, classOperation, classList, currentRunTime) {
+ setTimeout(function () {
+ setInterval(function () {
+ elt.classList[classOperation.operation].call(elt.classList, classOperation.cssClass);
+ }, classOperation.delay);
+ }, currentRunTime)
+ }
+
+ function processClassList(elt, classList) {
+ var runs = classList.split("&");
+ for (var i = 0; i < runs.length; i++) {
+ var run = runs[i];
+ var currentRunTime = 0;
+ var classOperations = run.split(",");
+ for (var j = 0; j < classOperations.length; j++) {
+ var value = classOperations[j];
+ var trimmedValue = value.trim();
+ var classOperation = parseClassOperation(trimmedValue);
+ if (classOperation) {
+ if (classOperation.operation === "toggle") {
+ toggleOperation(elt, classOperation, classList, currentRunTime);
+ currentRunTime = currentRunTime + classOperation.delay;
+ } else {
+ currentRunTime = currentRunTime + classOperation.delay;
+ performOperation(elt, classOperation, classList, currentRunTime);
+ }
+ }
+ }
+ }
+ }
+
+ function maybeProcessClasses(elt) {
+ if (elt.getAttribute) {
+ var classList = elt.getAttribute("classes") || elt.getAttribute("data-classes");
+ if (classList) {
+ processClassList(elt, classList);
+ }
+ }
+ }
+
+ htmx.defineExtension('class-tools', {
+ onEvent: function (name, evt) {
+ if (name === "htmx:afterProcessNode") {
+ var elt = evt.detail.elt;
+ maybeProcessClasses(elt);
+ if (elt.querySelectorAll) {
+ var children = elt.querySelectorAll("[classes], [data-classes]");
+ for (var i = 0; i < children.length; i++) {
+ maybeProcessClasses(children[i]);
+ }
+ }
+ }
+ }
+ });
+})();
\ No newline at end of file
diff --git a/themes/lean/static/js/htmx/ext/client-side-templates.js b/themes/lean/static/js/htmx/ext/client-side-templates.js
new file mode 100644
index 0000000..2bace41
--- /dev/null
+++ b/themes/lean/static/js/htmx/ext/client-side-templates.js
@@ -0,0 +1,96 @@
+htmx.defineExtension('client-side-templates', {
+ transformResponse : function(text, xhr, elt) {
+
+ var mustacheTemplate = htmx.closest(elt, "[mustache-template]");
+ if (mustacheTemplate) {
+ var data = JSON.parse(text);
+ var templateId = mustacheTemplate.getAttribute('mustache-template');
+ var template = htmx.find("#" + templateId);
+ if (template) {
+ return Mustache.render(template.innerHTML, data);
+ } else {
+ throw "Unknown mustache template: " + templateId;
+ }
+ }
+
+ var mustacheArrayTemplate = htmx.closest(elt, "[mustache-array-template]");
+ if (mustacheArrayTemplate) {
+ var data = JSON.parse(text);
+ var templateId = mustacheArrayTemplate.getAttribute('mustache-array-template');
+ var template = htmx.find("#" + templateId);
+ if (template) {
+ return Mustache.render(template.innerHTML, {"data": data });
+ } else {
+ throw "Unknown mustache template: " + templateId;
+ }
+ }
+
+ var handlebarsTemplate = htmx.closest(elt, "[handlebars-template]");
+ if (handlebarsTemplate) {
+ var data = JSON.parse(text);
+ var templateId = handlebarsTemplate.getAttribute('handlebars-template');
+ var templateElement = htmx.find('#' + templateId).innerHTML;
+ var renderTemplate = Handlebars.compile(templateElement);
+ if (renderTemplate) {
+ return renderTemplate(data);
+ } else {
+ throw "Unknown handlebars template: " + templateId;
+ }
+ }
+
+ var handlebarsArrayTemplate = htmx.closest(elt, "[handlebars-array-template]");
+ if (handlebarsArrayTemplate) {
+ var data = JSON.parse(text);
+ var templateId = handlebarsArrayTemplate.getAttribute('handlebars-array-template');
+ var templateElement = htmx.find('#' + templateId).innerHTML;
+ var renderTemplate = Handlebars.compile(templateElement);
+ if (renderTemplate) {
+ return renderTemplate(data);
+ } else {
+ throw "Unknown handlebars template: " + templateId;
+ }
+ }
+
+ var nunjucksTemplate = htmx.closest(elt, "[nunjucks-template]");
+ if (nunjucksTemplate) {
+ var data = JSON.parse(text);
+ var templateName = nunjucksTemplate.getAttribute('nunjucks-template');
+ var template = htmx.find('#' + templateName);
+ if (template) {
+ return nunjucks.renderString(template.innerHTML, data);
+ } else {
+ return nunjucks.render(templateName, data);
+ }
+ }
+
+ var xsltTemplate = htmx.closest(elt, "[xslt-template]");
+ if (xsltTemplate) {
+ var templateId = xsltTemplate.getAttribute('xslt-template');
+ var template = htmx.find("#" + templateId);
+ if (template) {
+ var content = template.innerHTML ? new DOMParser().parseFromString(template.innerHTML, 'application/xml')
+ : template.contentDocument;
+ var processor = new XSLTProcessor();
+ processor.importStylesheet(content);
+ var data = new DOMParser().parseFromString(text, "application/xml");
+ var frag = processor.transformToFragment(data, document);
+ return new XMLSerializer().serializeToString(frag);
+ } else {
+ throw "Unknown XSLT template: " + templateId;
+ }
+ }
+
+ var nunjucksArrayTemplate = htmx.closest(elt, "[nunjucks-array-template]");
+ if (nunjucksArrayTemplate) {
+ var data = JSON.parse(text);
+ var templateName = nunjucksArrayTemplate.getAttribute('nunjucks-array-template');
+ var template = htmx.find('#' + templateName);
+ if (template) {
+ return nunjucks.renderString(template.innerHTML, {"data": data});
+ } else {
+ return nunjucks.render(templateName, {"data": data});
+ }
+ }
+ return text;
+ }
+});
diff --git a/themes/lean/static/js/htmx/ext/debug.js b/themes/lean/static/js/htmx/ext/debug.js
new file mode 100644
index 0000000..861ee74
--- /dev/null
+++ b/themes/lean/static/js/htmx/ext/debug.js
@@ -0,0 +1,11 @@
+htmx.defineExtension('debug', {
+ onEvent: function (name, evt) {
+ if (console.debug) {
+ console.debug(name, evt);
+ } else if (console) {
+ console.log("DEBUG:", name, evt);
+ } else {
+ throw "NO CONSOLE SUPPORTED"
+ }
+ }
+});
diff --git a/themes/lean/static/js/htmx/ext/disable-element.js b/themes/lean/static/js/htmx/ext/disable-element.js
new file mode 100644
index 0000000..07bef62
--- /dev/null
+++ b/themes/lean/static/js/htmx/ext/disable-element.js
@@ -0,0 +1,18 @@
+"use strict";
+
+// Disable Submit Button
+htmx.defineExtension('disable-element', {
+ onEvent: function (name, evt) {
+ let elt = evt.detail.elt;
+ let target = elt.getAttribute("hx-disable-element");
+ let targetElements = (target == "self") ? [ elt ] : document.querySelectorAll(target);
+
+ for (var i = 0; i < targetElements.length; i++) {
+ if (name === "htmx:beforeRequest" && targetElements[i]) {
+ targetElements[i].disabled = true;
+ } else if (name == "htmx:afterRequest" && targetElements[i]) {
+ targetElements[i].disabled = false;
+ }
+ }
+ }
+});
\ No newline at end of file
diff --git a/themes/lean/static/js/htmx/ext/event-header.js b/themes/lean/static/js/htmx/ext/event-header.js
new file mode 100644
index 0000000..c7d2933
--- /dev/null
+++ b/themes/lean/static/js/htmx/ext/event-header.js
@@ -0,0 +1,37 @@
+(function(){
+ function stringifyEvent(event) {
+ var obj = {};
+ for (var key in event) {
+ obj[key] = event[key];
+ }
+ return JSON.stringify(obj, function(key, value){
+ if(value instanceof Node){
+ var nodeRep = value.tagName;
+ if (nodeRep) {
+ nodeRep = nodeRep.toLowerCase();
+ if(value.id){
+ nodeRep += "#" + value.id;
+ }
+ if(value.classList && value.classList.length){
+ nodeRep += "." + value.classList.toString().replace(" ", ".")
+ }
+ return nodeRep;
+ } else {
+ return "Node"
+ }
+ }
+ if (value instanceof Window) return 'Window';
+ return value;
+ });
+ }
+
+ htmx.defineExtension('event-header', {
+ onEvent: function (name, evt) {
+ if (name === "htmx:configRequest") {
+ if (evt.detail.triggeringEvent) {
+ evt.detail.headers['Triggering-Event'] = stringifyEvent(evt.detail.triggeringEvent);
+ }
+ }
+ }
+ });
+})();
diff --git a/themes/lean/static/js/htmx/ext/head-support.js b/themes/lean/static/js/htmx/ext/head-support.js
new file mode 100644
index 0000000..67cfc69
--- /dev/null
+++ b/themes/lean/static/js/htmx/ext/head-support.js
@@ -0,0 +1,141 @@
+//==========================================================
+// head-support.js
+//
+// An extension to htmx 1.0 to add head tag merging.
+//==========================================================
+(function(){
+
+ var api = null;
+
+ function log() {
+ //console.log(arguments);
+ }
+
+ function mergeHead(newContent, defaultMergeStrategy) {
+
+ if (newContent && newContent.indexOf(' -1) {
+ const htmlDoc = document.createElement("html");
+ // remove svgs to avoid conflicts
+ var contentWithSvgsRemoved = newContent.replace(/