Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/rmaguiar/hugo-theme-color-your-world.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrmaguiar <rmaguiar@tuta.io>2020-07-15 19:28:17 +0300
committerrmaguiar <rmaguiar@tuta.io>2020-07-15 19:28:17 +0300
commit0546b85c70e72063328ef88327bb7a65217d0c23 (patch)
tree4db976597446526f7fa240f4164e40e804a9212f
parent46247845aec0a9ed067146f2ac1252588dafef20 (diff)
Add basic search functionality via Fuse.js and minor changes
-rw-r--r--README.md24
-rw-r--r--archetypes/search.md10
-rw-r--r--assets/bundle.svg7
-rw-r--r--assets/fuse.js@6.4.0/dist/fuse.basic.min.js9
-rw-r--r--assets/js/postpone.js161
-rw-r--r--assets/scss/colors/variables.scss4
-rw-r--r--assets/scss/main.scss159
-rw-r--r--exampleSite/config.toml20
-rw-r--r--exampleSite/content/search/index.md9
-rw-r--r--exampleSite/content/search/index.pt.md9
-rw-r--r--exampleSite/resources/_gen/assets/scss/scss/main.scss_694b6a5caed62875bf9278dff98b7f5e.content2
-rw-r--r--exampleSite/resources/_gen/assets/scss/scss/main.scss_694b6a5caed62875bf9278dff98b7f5e.json2
-rw-r--r--i18n/en.toml29
-rw-r--r--i18n/pt.toml29
-rw-r--r--layouts/_default/list.html11
-rw-r--r--layouts/_default/search.html19
-rw-r--r--layouts/_default/search.json.json82
-rw-r--r--layouts/partials/search-form.html18
-rw-r--r--theme.toml1
19 files changed, 572 insertions, 33 deletions
diff --git a/README.md b/README.md
index 4931617..28a63b8 100644
--- a/README.md
+++ b/README.md
@@ -20,6 +20,7 @@ I've been working on this theme for so long that there are features I don't even
* Contact form shortcode (via [Formspree](https://formspree.io));
* Open Graph, Twitter Cards and Structured Data (schema.org) meta tags;
* Responsive images via image processing;
+* Basic search functionality via [Fuse.js](https://github.com/krisk/Fuse);
* Image lazy loading (native + [lazysizes](https://github.com/aFarkas/lazysizes));
* **noscript** capable to an extent (except KaTeX).
@@ -213,7 +214,6 @@ Alternatively, you can have these params in the front matter of any page.
# It can also be disabled entirely (and it will turn into a text field)
subject = [ 'Just saying "hi"', "I know what you did last winter", "... Is that a sloth?", "お前はもう死んでいる。" ]
-
# Text placeholders. As usual, comment the lines if you don't want use them
# The "subject" below will only be used if the "subject" above doesn't exist (ie.: commented/deleted)
[params.contact.placeholder]
@@ -292,8 +292,27 @@ More possible params for your config file:
# matter or disable it entirely by commenting the line below
# ie.: | ❚ - – — • ⚫
titleSeparator = "|"
+
+ [params.search]
+
+ # Enable search form (at the post list)
+ # The default value is false
+ enable = true
+
+ # Limit search results
+ # The default value is 30
+ maxResults = 15
+
+ # Optional placeholder for search field
+ placeholder = "ie.: lorem ipsum"
+
+ # Stop word filter list
+ # Can also be set PER PAGE via front matter
+ # There's no default value
+ stopWords = [ "a", "an", "and", "in", "the", "to", "was", "were", "with" ]
[params.style]
+
# Use an icon or text for footnote return links
# The default is false
hasIconAsFootnoteReturnLink = true
@@ -318,7 +337,10 @@ More possible params for your config file:
* [Font Awesome](https://fontawesome.com/) and [Fork Awesome](https://forkaweso.me/) for the icons;
* [@nickpunt](https://gist.github.com/nickpunt) and [@regpaq](https://gist.github.com/regpaq) for the [dark/light mode switcher](https://gist.github.com/regpaq/04c67e8aceecbf0fd819945835412d1f) idea;
* Glenn McComb and [his great article](https://glennmccomb.com/articles/how-to-build-custom-hugo-pagination/) about custom pagination with Hugo;
+* JeffProd and [his interesting article](https://en.jeffprod.com/blog/2018/build-your-own-hugo-website-search-engine/) about building a custom search engine for Hugo;
+* Many people [on this forked gist](https://gist.github.com/eddiewebb/735feb48f50f0ddd65ae5606a1cb41ae) for their takes on Fuse.js with Hugo;
* Philip Walton and [his sticky footer solution](https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/) with Flexbox;
* [lazysizes](https://github.com/aFarkas/lazysizes);
+* [Fuse.js](https://github.com/krisk/Fuse);
* [KaTeX](https://katex.org/), "the _**fastest**_ math typesetting library for the web";
* Hugo and [its community](https://discourse.gohugo.io/).
diff --git a/archetypes/search.md b/archetypes/search.md
new file mode 100644
index 0000000..fee01c5
--- /dev/null
+++ b/archetypes/search.md
@@ -0,0 +1,10 @@
+---
+title: "{{ replace .TranslationBaseName "-" " " | title }}"
+description: ""
+layout: "search"
+stopWords: [ a, an, and, in, the, to, was, were, with ]
+sitemapExclude: true
+noindex: true
+disableTitleSeparator: false
+outputs: [ html, json ]
+---
diff --git a/assets/bundle.svg b/assets/bundle.svg
index d39e25d..d299238 100644
--- a/assets/bundle.svg
+++ b/assets/bundle.svg
@@ -1,6 +1,6 @@
<!--
From FontAwesome 5:
- adjust, angle-right, angle-double-right, caret-down and hashtag.
+ adjust, angle-right, angle-double-right, caret-down, hashtag and search.
-->
<!-- Reduce repetition... -->
@@ -28,6 +28,11 @@
<symbol viewBox="0 0 512 512" id="adjust">
<path d="M8 256c0 136.966 111.033 248 248 248s248-111.034 248-248S392.966 8 256 8 8 119.033 8 256zm248 184V72c101.705 0 184 82.311 184 184 0 101.705-82.311 184-184 184z"/>
</symbol>
+
+
+ <symbol viewBox="0 0 512 512" id="search">
+ <path d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/>
+ </symbol>
{{ if .Site.Params.Style.hasIconAsFootnoteReturnLink }}
diff --git a/assets/fuse.js@6.4.0/dist/fuse.basic.min.js b/assets/fuse.js@6.4.0/dist/fuse.basic.min.js
new file mode 100644
index 0000000..c8ee330
--- /dev/null
+++ b/assets/fuse.js@6.4.0/dist/fuse.basic.min.js
@@ -0,0 +1,9 @@
+/**
+ * Fuse.js v6.4.0 - Lightweight fuzzy-search (http://fusejs.io)
+ *
+ * Copyright (c) 2020 Kiro Risk (http://kiro.me)
+ * All Rights Reserved. Apache Software License 2.0
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+var e,t;e=this,t=function(){"use strict";function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function t(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function n(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function a(e){return function(e){if(Array.isArray(e))return c(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function s(e){return Array.isArray?Array.isArray(e):"[object Array]"===Object.prototype.toString.call(e)}function h(e){return"string"==typeof e}function u(e){return"number"==typeof e}function d(e){return null!=e}function l(e){return!e.trim().length}var f=function(e){return"Pattern length exceeds max of ".concat(e,".")},v=Object.prototype.hasOwnProperty,g=function(){function t(n){var r=this;e(this,t),this._keys=[],this._keyMap={};var i=0;n.forEach((function(e){var t=y(e);i+=t.weight,r._keys.push(t),r._keyMap[t.id]=t,i+=t.weight})),this._keys.forEach((function(e){e.weight/=i}))}return n(t,[{key:"get",value:function(e){return this._keyMap[e]}},{key:"keys",value:function(){return this._keys}},{key:"toJSON",value:function(){return JSON.stringify(this._keys)}}]),t}();function y(e){var t=null,n=null,r=null,i=1;if(h(e)||s(e))r=e,t=p(e),n=m(e);else{if(!v.call(e,"name"))throw new Error(function(e){return"Missing ".concat(e," property in key")}("name"));var o=e.name;if(r=o,v.call(e,"weight")&&(i=e.weight)<=0)throw new Error(function(e){return"Property 'weight' in key '".concat(e,"' must be a positive integer")}(o));t=p(o),n=m(o)}return{path:t,id:n,weight:i,src:r}}function p(e){return s(e)?e:e.split(".")}function m(e){return s(e)?e.join("."):e}var k=o({},{isCaseSensitive:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:function(e,t){return e.score===t.score?e.idx<t.idx?-1:1:e.score<t.score?-1:1}},{},{includeMatches:!1,findAllMatches:!1,minMatchCharLength:1},{},{location:0,threshold:.6,distance:100},{},{useExtendedSearch:!1,getFn:function(e,t){var n=[],r=!1;return function e(t,i,o){if(i[o]){var a=t[i[o]];if(!d(a))return;if(o===i.length-1&&(h(a)||u(a)))n.push(function(e){return null==e?"":function(e){if("string"==typeof e)return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}(e)}(a));else if(s(a)){r=!0;for(var c=0,l=a.length;c<l;c+=1)e(a[c],i,o+1)}else i.length&&e(a,i,o+1)}else n.push(t)}(e,h(t)?t.split("."):t,0),r?n:n[0]},ignoreLocation:!1,ignoreFieldNorm:!1}),M=/[^ ]+/g;function b(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:3,t=new Map;return{get:function(n){var r=n.match(M).length;if(t.has(r))return t.get(r);var i=parseFloat((1/Math.sqrt(r)).toFixed(e));return t.set(r,i),i},clear:function(){t.clear()}}}var x=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=n.getFn,i=void 0===r?k.getFn:r;e(this,t),this.norm=b(3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return n(t,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,h(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();h(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t<n;t+=1)this.records[t].i-=1}},{key:"getValueForItemAtKeyId",value:function(e,t){return e[this._keysMap[t]]}},{key:"size",value:function(){return this.records.length}},{key:"_addString",value:function(e,t){if(d(e)&&!l(e)){var n={v:e,i:t,n:this.norm.get(e)};this.records.push(n)}}},{key:"_addObject",value:function(e,t){var n=this,r={i:t,$:{}};this.keys.forEach((function(t,i){var o=n.getFn(e,t.path);if(d(o))if(s(o))!function(){for(var e=[],t=[{nestedArrIndex:-1,value:o}];t.length;){var a=t.pop(),c=a.nestedArrIndex,u=a.value;if(d(u))if(h(u)&&!l(u)){var f={v:u,i:c,n:n.norm.get(u)};e.push(f)}else s(u)&&u.forEach((function(e,n){t.push({nestedArrIndex:n,value:e})}))}r.$[i]=e}();else if(!l(o)){var a={v:o,n:n.norm.get(o)};r.$[i]=a}})),this.records.push(r)}},{key:"toJSON",value:function(){return{keys:this.keys,records:this.records}}}]),t}();function w(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?k.getFn:r,o=new x({getFn:i});return o.setKeys(e.map(y)),o.setSources(t),o.create(),o}function L(e,t){var n=e.matches;t.matches=[],d(n)&&n.forEach((function(e){if(d(e.indices)&&e.indices.length){var n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.src),e.idx>-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function _(e,t){t.score=e.score}function O(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,a=t.expectedLocation,c=void 0===a?0:a,s=t.distance,h=void 0===s?k.distance:s,u=t.ignoreLocation,d=void 0===u?k.ignoreLocation:u,l=r/e.length;if(d)return l;var f=Math.abs(c-o);return h?l+f/h:f?1:l}function S(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.minMatchCharLength,n=[],r=-1,i=-1,o=0,a=e.length;o<a;o+=1){var c=e[o];c&&-1===r?r=o:c||-1===r||((i=o-1)-r+1>=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}function A(e){for(var t={},n=0,r=e.length;n<r;n+=1){var i=e.charAt(n);t[i]=(t[i]||0)|1<<r-n-1}return t}var E=function(){function t(n){var r=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,a=void 0===o?k.location:o,c=i.threshold,s=void 0===c?k.threshold:c,h=i.distance,u=void 0===h?k.distance:h,d=i.includeMatches,l=void 0===d?k.includeMatches:d,f=i.findAllMatches,v=void 0===f?k.findAllMatches:f,g=i.minMatchCharLength,y=void 0===g?k.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?k.isCaseSensitive:p,M=i.ignoreLocation,b=void 0===M?k.ignoreLocation:M;if(e(this,t),this.options={location:a,threshold:s,distance:u,includeMatches:l,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:b},this.pattern=m?n:n.toLowerCase(),this.chunks=[],this.pattern.length){var x=function(e,t){r.chunks.push({pattern:e,alphabet:A(e),startIndex:t})},w=this.pattern.length;if(w>32){for(var L=0,_=w%32,O=w-_;L<O;)x(this.pattern.substr(L,32),L),L+=32;if(_){var S=w-32;x(this.pattern.substr(S),S)}}else x(this.pattern,0)}}return n(t,[{key:"searchIn",value:function(e){var t=this.options,n=t.isCaseSensitive,r=t.includeMatches;if(n||(e=e.toLowerCase()),this.pattern===e){var i={isMatch:!0,score:0};return r&&(i.indices=[[0,e.length-1]]),i}var o=this.options,c=o.location,s=o.distance,h=o.threshold,u=o.findAllMatches,d=o.minMatchCharLength,l=o.ignoreLocation,v=[],g=0,y=!1;this.chunks.forEach((function(t){var n=t.pattern,i=t.alphabet,o=t.startIndex,p=function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?k.location:i,a=r.distance,c=void 0===a?k.distance:a,s=r.threshold,h=void 0===s?k.threshold:s,u=r.findAllMatches,d=void 0===u?k.findAllMatches:u,l=r.minMatchCharLength,v=void 0===l?k.minMatchCharLength:l,g=r.includeMatches,y=void 0===g?k.includeMatches:g,p=r.ignoreLocation,m=void 0===p?k.ignoreLocation:p;if(t.length>32)throw new Error(f(32));for(var M,b=t.length,x=e.length,w=Math.max(0,Math.min(o,x)),L=h,_=w,A=v>1||y,E=A?Array(x):[];(M=e.indexOf(t,_))>-1;){var I=O(t,{currentLocation:M,expectedLocation:w,distance:c,ignoreLocation:m});if(L=Math.min(I,L),_=M+b,A)for(var j=0;j<b;)E[M+j]=1,j+=1}_=-1;for(var F=[],C=1,P=b+x,N=1<<b-1,$=0;$<b;$+=1){for(var D=0,K=P;D<K;){var z=O(t,{errors:$,currentLocation:w+K,expectedLocation:w,distance:c,ignoreLocation:m});z<=L?D=K:P=K,K=Math.floor((P-D)/2+D)}P=K;var J=Math.max(1,w-K+1),R=d?x:Math.min(w+K,x)+b,T=Array(R+2);T[R+1]=(1<<$)-1;for(var q=R;q>=J;q-=1){var U=q-1,V=n[e.charAt(U)];if(A&&(E[U]=+!!V),T[q]=(T[q+1]<<1|1)&V,$&&(T[q]|=(F[q+1]|F[q])<<1|1|F[q+1]),T[q]&N&&(C=O(t,{errors:$,currentLocation:U,expectedLocation:w,distance:c,ignoreLocation:m}))<=L){if(L=C,(_=U)<=w)break;J=Math.max(1,2*w-_)}}var B=O(t,{errors:$+1,currentLocation:w,expectedLocation:w,distance:c,ignoreLocation:m});if(B>L)break;F=T}var G={isMatch:_>=0,score:Math.max(.001,C)};if(A){var H=S(E,v);H.length?y&&(G.indices=H):G.isMatch=!1}return G}(e,n,i,{location:c+o,distance:s,threshold:h,findAllMatches:u,minMatchCharLength:d,includeMatches:r,ignoreLocation:l}),m=p.isMatch,M=p.score,b=p.indices;m&&(y=!0),g+=M,m&&b&&(v=[].concat(a(v),a(b)))}));var p={isMatch:y,score:y?g/this.chunks.length:1};return y&&r&&(p.indices=v),p}}]),t}(),I=[];function j(e,t){for(var n=0,r=I.length;n<r;n+=1){var i=I[n];if(i.condition(e,t))return new i(e,t)}return new E(e,t)}var F=function(){function t(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;if(e(this,t),this.options=o({},k,{},r),this.options.useExtendedSearch)throw new Error("Extended search is not available");this._keyStore=new g(this.options.keys),this.setCollection(n,i)}return n(t,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof x))throw new Error("Incorrect 'index' type");this._myIndex=t||w(this.options.keys,this._docs,{getFn:this.options.getFn})}},{key:"add",value:function(e){d(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n<r;n+=1){var i=this._docs[n];e(i,n)&&(this.removeAt(n),n-=1,t.push(i))}return t}},{key:"removeAt",value:function(e){this._docs.splice(e,1),this._myIndex.removeAt(e)}},{key:"getIndex",value:function(){return this._myIndex}},{key:"search",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=this.options,o=i.includeMatches,a=i.includeScore,c=i.shouldSort,s=i.sortFn,d=i.ignoreFieldNorm,l=h(e)?h(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return C(l,{ignoreFieldNorm:d}),c&&l.sort(s),u(r)&&r>-1&&(l=l.slice(0,r)),P(l,this._docs,{includeMatches:o,includeScore:a})}},{key:"_searchStringList",value:function(e){var t=j(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(d(n)){var a=t.searchIn(n),c=a.isMatch,s=a.score,h=a.indices;c&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:h}]})}})),r}},{key:"_searchLogical",value:function(e){throw new Error("Logical search is not available")}},{key:"_searchObjectList",value:function(e){var t=this,n=j(e,this.options),r=this._myIndex,i=r.keys,o=r.records,c=[];return o.forEach((function(e){var r=e.$,o=e.i;if(d(r)){var s=[];i.forEach((function(e,i){s.push.apply(s,a(t._findMatches({key:e,value:r[i],searcher:n})))})),s.length&&c.push({idx:o,item:r,matches:s})}})),c}},{key:"_findMatches",value:function(e){var t=e.key,n=e.value,r=e.searcher;if(!d(n))return[];var i=[];if(s(n))n.forEach((function(e){var n=e.v,o=e.i,a=e.n;if(d(n)){var c=r.searchIn(n),s=c.isMatch,h=c.score,u=c.indices;s&&i.push({score:h,key:t,value:n,idx:o,norm:a,indices:u})}}));else{var o=n.v,a=n.n,c=r.searchIn(o),h=c.isMatch,u=c.score,l=c.indices;h&&i.push({score:u,key:t,value:o,norm:a,indices:l})}return i}}]),t}();function C(e,t){var n=t.ignoreFieldNorm,r=void 0===n?k.ignoreFieldNorm:n;e.forEach((function(e){var t=1;e.matches.forEach((function(e){var n=e.key,i=e.norm,o=e.score,a=n?n.weight:null;t*=Math.pow(0===o&&a?Number.EPSILON:o,(a||1)*(r?1:i))})),e.score=t}))}function P(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?k.includeMatches:r,o=n.includeScore,a=void 0===o?k.includeScore:o,c=[];return i&&c.push(L),a&&c.push(_),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return c.length&&c.forEach((function(t){t(e,r)})),r}))}return F.version="6.4.0",F.createIndex=w,F.parseIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?k.getFn:n,i=e.keys,o=e.records,a=new x({getFn:r});return a.setKeys(i),a.setIndexRecords(o),a},F.config=k,F},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Fuse=t(); \ No newline at end of file
diff --git a/assets/js/postpone.js b/assets/js/postpone.js
index 1bbb7ab..dd461e6 100644
--- a/assets/js/postpone.js
+++ b/assets/js/postpone.js
@@ -19,4 +19,163 @@ PALETTE.onchange = function () {
};
updateAccent()
-}
+};
+
+/******************************
+/ Basic search via Fuse.js
+******************************/
+
+{{ $fuseJS := resources.Get "/fuse.js@6.4.0/dist/fuse.basic.min.js" }}
+
+{{ if eq .Layout "search" }}
+
+ // Get Fuse.js
+ {{ $fuseJS.Content | safeJS }}
+
+ const fuseOptions = {
+ shouldSort: true,
+ threshold: 0,
+ distance: -1,
+ maxPatternLength: 32,
+ minMatchCharLength: 3,
+ keys: [
+ { name: 'title', weight: .4 },
+ { name: 'tags', weight: .3 },
+ { name: 'description', weight: .2 },
+ { name: 'content', weight: .1 }
+ ]
+ };
+
+ // Sanitize
+ function param(name) {
+ return decodeURIComponent((location.search.split(name + '=')[1] || '').split('&')[0]).replace(/\+/g, ' ')
+ };
+
+ // Capture input
+ let searchQuery = param('q');
+
+ // Search info section
+ const info = document.getElementById('search-info');
+
+ if (searchQuery) {
+
+ // Transfer text to search field
+ document.querySelector('section.search-box input')
+ .value = searchQuery;
+
+ executeSearch(searchQuery);
+ } else {
+ info.innerHTML = '<p>{{ T "search_awaiting_search" }}</p>'
+ };
+
+
+ function getJSON(url, fn) {
+ const request = new XMLHttpRequest();
+ request.open('GET', url, true);
+ request.onload = function () {
+ if (request.status >= 200 && request.status < 400) {
+ const data = JSON.parse(request.responseText);
+ fn(data)
+ }
+ };
+ request.send()
+ };
+
+ function executeSearch(searchQuery) {
+
+ getJSON('index.json', function (data) {
+
+ // Limit results and throw an error if too many pages are found
+ const limit = {{ .Site.Params.Search.maxResults | default 30 }};
+
+ const pages = data;
+ const fuse = new Fuse(pages, fuseOptions);
+ const result = fuse.search(searchQuery);
+
+ // Reset info regarding the search
+ info.innerHTML = '';
+
+ info.innerHTML = '<p>{{ T "search_results_for" }}: ' + searchQuery + '</p>';
+
+ if (result.length > 0) {
+ if (result.length == 1) {
+ info.innerHTML += '<p>{{ T "search_one_page_found" }}.</p>'
+
+ } else if (1 < result.length && result.length < limit + 1) {
+
+ info.innerHTML += '<p>' + result.length + ' {{ T "search_pages_found" }}.</p>'
+
+ } else {
+
+ info.innerHTML += '<p class=error>{{ T "search_too_many" }}</p>'
+ }
+
+ } else {
+
+ info.innerHTML += '<p class=error>{{ T "search_no_page_found" }}</p>'
+ };
+
+ if (0 < result.length && result.length < limit + 1) {
+ populateResults(result)
+ }
+
+ })
+ };
+
+ // Populate results
+ function populateResults(result) {
+ result.forEach(function (value, key) {
+ const content = value.item.content;
+
+ // Date as it should be rendered if not null
+ const formatedDate = '<time datetime=' + value.item.date + '>' + value.item.date + '</time>';
+
+ // Pull template from hugo template definition
+ const templateDefinition = document.getElementById('search-result-template').innerHTML;
+
+ // Replace values
+ const output = render(templateDefinition, {
+ link : value.item.permalink,
+ date : value.item.date ? formatedDate : '',
+ title : value.item.title
+ });
+ document.getElementById('search-results').appendChild(htmlToElement(output))
+ })
+ };
+
+ function render(templateString, data) {
+ let 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 content.
+ 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
+ let key, find, re;
+ for (key in data) {
+ find = '\\$\\{\\s*' + key + '\\s*\\}';
+ re = new RegExp(find, 'g');
+ templateString = templateString.replace(re, data[key])
+ };
+ return templateString
+ };
+
+
+ function htmlToElement(html) {
+ const template = document.createElement('template');
+ html = html.trim(); // Never return a text node of whitespace as the result
+ template.innerHTML = html;
+ return template.content.firstChild
+ };
+
+{{ end }}
diff --git a/assets/scss/colors/variables.scss b/assets/scss/colors/variables.scss
index 52ffb10..98754cc 100644
--- a/assets/scss/colors/variables.scss
+++ b/assets/scss/colors/variables.scss
@@ -6,6 +6,7 @@ $light-alt-background: #d6d6d6;
$light-alt-foreground: #333;
$light-details: #fdfdfd;
+$light-error-color: #c70000;
$light-bg-modifier: rgba(0,0,0,.3);
@@ -24,6 +25,7 @@ $dark-alt-background: #1c1c1c;
$dark-alt-foreground: #ddd;
$dark-details: #1a1a1a;
+$dark-error-color: #ff3131;
$dark-bg-modifier: rgba(255,255,255,.3);
@@ -33,6 +35,7 @@ $dark-input-border: #262626;
$dark-letterpress: rgba(255,255,255,.2);
+
// Lazy way to deter images that can be too bright
$img-filter:
contrast(.85)
@@ -44,4 +47,3 @@ $img-filter:
$box-border: #222;
$error-color: red;
$selected-fg: #f0f0f0;
-
diff --git a/assets/scss/main.scss b/assets/scss/main.scss
index 6d915f4..c2130fd 100644
--- a/assets/scss/main.scss
+++ b/assets/scss/main.scss
@@ -11,8 +11,6 @@ $change-transition: {{ .Scratch.Get "changeTransition" }};
-
-
// Default size
:root {
font-size: $font-size;
@@ -31,7 +29,8 @@ html {
--alt-fg: #{$light-alt-foreground};
--dtl: #{$light-details};
-
+ --err: #{$light-error-color};
+
--bgmod: #{$light-bg-modifier};
--input-bg: #{$light-input-background};
@@ -62,6 +61,7 @@ html {
--alt-fg: #{$dark-alt-foreground};
--dtl: #{$dark-details};
+ --err: #{$dark-error-color};
--bgmod: #{$dark-bg-modifier};
@@ -228,9 +228,7 @@ body {
button {
margin: 0 7.5px;
outline: 2px dashed transparent;
-
- cursor: pointer;
-
+
transition:
outline .2s ease-in-out,
transform .2s ease-in-out;
@@ -441,6 +439,7 @@ a.anchor {
// Avoid accidental selection
+label,
span.lnt,
summary,
sup.footnote-ref {
@@ -449,17 +448,16 @@ sup.footnote-ref {
// Lists in general
-ol,
-ul {
+article ol,
+article ul,
+main.index ol,
+main.index ul {
li {
margin-bottom: .45rem;
}
}
-
-
-
ol {
counter-reset: a-counter;
@@ -786,7 +784,7 @@ ul.posts {
font-size: .85rem;
margin-left: 1.8rem;
- padding: 0 6px 2px;
+ padding: 0 9px 2px;
}
}
}
@@ -910,13 +908,11 @@ video {
-
-
-
-
-
-
-
+button,
+input[type=color],
+summary {
+ cursor: pointer;
+}
@@ -949,8 +945,6 @@ details.toc {
@include letterpress(var(--lpress));
- cursor: pointer;
-
transition:
color $change-transition,
opacity .2s ease,
@@ -1060,6 +1054,7 @@ article > ul {
// BUTTONS
a.btn,
a.footnote-backref,
+section.search-box button,
section.social a,
input[type=submit] {
background: var(--accent);
@@ -1322,7 +1317,7 @@ html {
p.error {
- color: $error-color;
+ color: var(--err);
}
{{ if .Site.Params.hasNoscriptNotice }}
@@ -1350,3 +1345,123 @@ p.error {
{{ else if (resources.Get "scss/custom.scss") }}
@import 'custom';
{{ end }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// SEARCH
+section.search-box {
+
+ form {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: stretch;
+ }
+
+ label {
+ color: var(--fg);
+ font-family: $heading-font;
+ font-weight: 700;
+ flex-basis: 100%;
+ text-align: left;
+
+ font-size: .9rem;
+ letter-spacing: .5px;
+ line-height: 2rem;
+ text-transform: uppercase;
+ }
+
+ input[name=q] {
+ background: var(--input-bg);
+ border: 1px solid var(--input-bd);
+ color: var(--input-fg);
+ font-family: $body-font;
+ font-size: .9rem;
+ line-height: 1.5rem;
+ padding: 6px 12px;
+ flex: 1;
+
+ transition:
+ background-color .2s ease-in-out,
+ border .2s ease-in-out,
+ outline .2s ease-in-out;
+
+ border-radius: $border-radius 0 0 $border-radius;
+
+ outline: 2px solid transparent;
+
+ &:focus {
+ outline-color: var(--accent);
+ }
+ }
+
+ button {
+ border-radius: 0 $border-radius $border-radius 0;
+ padding: 6px 30px;
+
+ outline: 2px dashed transparent;
+ outline-offset: 2px;
+
+ &:focus {
+ outline-color: var(--accent);
+ }
+
+ &:hover {
+ opacity: .75;
+ }
+
+ svg {
+ @include squared(15px);
+
+ fill: currentColor;
+ stroke: var(--lpress);
+ stroke-width: 9px;
+ }
+ }
+}
+
+#search-info {
+ margin: 1rem 0 2rem;
+
+ p:first-of-type {
+ font-family: $heading-font;
+ font-size: 1.5rem;
+ font-weight: 700;
+ }
+
+ + ul {
+ margin: 0 0 6rem;
+ }
+}
diff --git a/exampleSite/config.toml b/exampleSite/config.toml
index 1f7ff88..3ad8b06 100644
--- a/exampleSite/config.toml
+++ b/exampleSite/config.toml
@@ -79,7 +79,6 @@ paginate = 5
# It can also be disabled entirely (and it will turn into a text field)
subject = [ 'Just saying "hi"', "I know what you did last winter", "... Is that a sloth?", "お前はもう死んでいる。" ]
-
# Text placeholders. As usual, comment the lines if you don't want use them
# The "subject" below will only be used if the "subject" above doesn't exist (ie.: commented/deleted)
[params.contact.placeholder]
@@ -88,6 +87,21 @@ paginate = 5
subject = 'Just saying "hi"'
message = "Aenean lacinia bibendum nulla sed consectetur. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Donec ullamcorper nulla non metus auctor fringilla nullam quis risus."
+
+ [params.search]
+
+ # Enable search form (at the post list)
+ # The default value is false
+ enable = true
+
+ # Limit search results
+ # The default value is 30
+ maxResults = 15
+
+ # Optional placeholder for search field
+ placeholder = "ie.: lorem ipsum"
+
+
[params.style]
# Dark mode as default
@@ -259,6 +273,10 @@ paginate = 5
title = "Página não encontrada"
description = "Essa página não foi encontrada."
text = "Nada a se ver aqui, colega."
+
+ [languages.pt.params.search]
+ enable = true
+ placeholder = "exemplo: lorem ipsum"
[languages.pt.menu]
diff --git a/exampleSite/content/search/index.md b/exampleSite/content/search/index.md
new file mode 100644
index 0000000..39a6d9e
--- /dev/null
+++ b/exampleSite/content/search/index.md
@@ -0,0 +1,9 @@
+---
+title : "Search"
+description : "Search page."
+layout : "search"
+sitemapExclude : true
+noindex : true
+stopWords : [ a, an, and, in, the, to, was, were, with ]
+outputs : [ html, json ]
+---
diff --git a/exampleSite/content/search/index.pt.md b/exampleSite/content/search/index.pt.md
new file mode 100644
index 0000000..32f32c6
--- /dev/null
+++ b/exampleSite/content/search/index.pt.md
@@ -0,0 +1,9 @@
+---
+title : "Busca"
+description : "Página de busca."
+layout : "search"
+sitemapExclude : true
+noindex : true
+stopWords : [ as, com, de, e, foi, foram, os, para ]
+outputs : [ html, json ]
+---
diff --git a/exampleSite/resources/_gen/assets/scss/scss/main.scss_694b6a5caed62875bf9278dff98b7f5e.content b/exampleSite/resources/_gen/assets/scss/scss/main.scss_694b6a5caed62875bf9278dff98b7f5e.content
index eb2c54e..ce6e128 100644
--- a/exampleSite/resources/_gen/assets/scss/scss/main.scss_694b6a5caed62875bf9278dff98b7f5e.content
+++ b/exampleSite/resources/_gen/assets/scss/scss/main.scss_694b6a5caed62875bf9278dff98b7f5e.content
@@ -1 +1 @@
-@font-face{font-family:oswald;font-style:normal;font-weight:700;font-display:swap;src:local("Oswald"),url(../fonts/oswald-v29-latin-700.woff2)format("woff2"),url(../fonts/oswald-v29-latin-700.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:400;font-display:swap;src:local("Open Sans Regular"),local("OpenSans-Regular"),url(../fonts/open-sans-v17-latin-regular.woff2)format("woff2"),url(../fonts/open-sans-v17-latin-regular.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:700;font-display:swap;src:local("Open Sans Bold"),local("OpenSans-Bold"),url(../fonts/open-sans-v17-latin-700.woff2)format("woff2"),url(../fonts/open-sans-v17-latin-700.woff)format("woff")}@font-face{font-family:open sans;font-style:italic;font-weight:400;font-display:swap;src:local("Open Sans Italic"),local("OpenSans-Italic"),url(../fonts/open-sans-v17-latin-italic.woff2)format("woff2"),url(../fonts/open-sans-v17-latin-italic.woff)format("woff")}:root{font-size:18px}html{scroll-behavior:smooth}html[data-mode=light]{--bg: #ddd;--fg: #444;--alt-bg: #d6d6d6;--alt-fg: #333;--dtl: #fdfdfd;--bgmod: rgba(0, 0, 0, 0.3);--input-bg: #fefefe;--input-fg: #111;--input-bd: #ccc;--lpress: rgba(0, 0, 0, 0.2);--rlpress: rgba(255, 255, 255, 0.2)}html[data-mode=light] .chroma,html[data-mode=light] pre,html[data-mode=light] p code,html[data-mode=light] li code{color:#93a1a1;background-color:#002b36}html[data-mode=light] .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}html[data-mode=light] .chroma .lntable{border-spacing:0;margin:0;border:0;width:auto;display:block}html[data-mode=light] .chroma .hl{display:block;width:100%;background-color:rgba(0,0,0,.3)}html[data-mode=light] .chroma .nb{color:#b58900}html[data-mode=light] .chroma .ge{font-style:italic}html[data-mode=light] .chroma .gr{color:#e8625f;font-weight:700}html[data-mode=light] .chroma .gs{font-weight:700}html[data-mode=light] .chroma .x,html[data-mode=light] .chroma .kc,html[data-mode=light] .chroma .no,html[data-mode=light] .chroma .ni,html[data-mode=light] .chroma .ne,html[data-mode=light] .chroma .se,html[data-mode=light] .chroma .gh{color:#e9662f}html[data-mode=light] .chroma .lnt,html[data-mode=light] .chroma .ln{margin-right:.4em;padding:0 .4em;color:#848f8f}html[data-mode=light] .chroma .k,html[data-mode=light] .chroma .kn,html[data-mode=light] .chroma .kp,html[data-mode=light] .chroma .o,html[data-mode=light] .chroma .ow,html[data-mode=light] .chroma .cs,html[data-mode=light] .chroma .cp,html[data-mode=light] .chroma .cpf,html[data-mode=light] .chroma .gi{color:#859900}html[data-mode=light] .chroma .kd,html[data-mode=light] .chroma .kr,html[data-mode=light] .chroma .bp,html[data-mode=light] .chroma .nc,html[data-mode=light] .chroma .nd,html[data-mode=light] .chroma .nf,html[data-mode=light] .chroma .nt,html[data-mode=light] .chroma .nv,html[data-mode=light] .chroma .gu{color:#3294da}html[data-mode=light] .chroma .kt,html[data-mode=light] .chroma .sr,html[data-mode=light] .chroma .gd{color:#e8625f}html[data-mode=light] .chroma .s,html[data-mode=light] .chroma .sa,html[data-mode=light] .chroma .sc,html[data-mode=light] .chroma .dl,html[data-mode=light] .chroma .s2,html[data-mode=light] .chroma .si,html[data-mode=light] .chroma .sx,html[data-mode=light] .chroma .s1,html[data-mode=light] .chroma .ss,html[data-mode=light] .chroma .m,html[data-mode=light] .chroma .mb,html[data-mode=light] .chroma .mf,html[data-mode=light] .chroma .mh,html[data-mode=light] .chroma .mi,html[data-mode=light] .chroma .il,html[data-mode=light] .chroma .mo{color:#2aa198}html[data-mode=light] .chroma .sb,html[data-mode=light] .chroma .c,html[data-mode=light] .chroma .ch,html[data-mode=light] .chroma .cm,html[data-mode=light] .chroma .c1{color:#759299}html[data-mode=dark]{--bg: #1f1f1f;--fg: #bbb;--alt-bg: #1c1c1c;--alt-fg: #ddd;--dtl: #1a1a1a;--bgmod: rgba(255, 255, 255, 0.3);--input-bg: #222;--input-fg: #f0f0f0;--input-bd: #262626;--lpress: rgba(255, 255, 255, 0.2);--rlpress: rgba(0, 0, 0, 0.2)}html[data-mode=dark] img{filter:contrast(0.85)grayscale(0.3)}html[data-mode=dark] .chroma,html[data-mode=dark] pre,html[data-mode=dark] p code,html[data-mode=dark] li code{color:#f8f8f2;background:#272822}html[data-mode=dark] .chroma .err{color:#eb0083;background-color:#1e0010}html[data-mode=dark] .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}html[data-mode=dark] .chroma .lntable{border-spacing:0;margin:0;border:0;width:auto;display:block}html[data-mode=dark] .chroma .hl{display:block;width:100%;background-color:rgba(0,0,0,.3)}html[data-mode=dark] .chroma .ge{font-style:italic}html[data-mode=dark] .chroma .gs{font-weight:700}html[data-mode=dark] .chroma .lnt,html[data-mode=dark] .chroma .ln{margin-right:.4em;padding:0 .4em;color:#8e8e8e}html[data-mode=dark] .chroma .k,html[data-mode=dark] .chroma .kc,html[data-mode=dark] .chroma .kd,html[data-mode=dark] .chroma .kp,html[data-mode=dark] .chroma .kr,html[data-mode=dark] .chroma .kt,html[data-mode=dark] .chroma .no{color:#66d9ef}html[data-mode=dark] .chroma .kn,html[data-mode=dark] .chroma .nt,html[data-mode=dark] .chroma .o,html[data-mode=dark] .chroma .ow,html[data-mode=dark] .chroma .gd{color:#f94e8a}html[data-mode=dark] .chroma .na,html[data-mode=dark] .chroma .nc,html[data-mode=dark] .chroma .nd,html[data-mode=dark] .chroma .ne,html[data-mode=dark] .chroma .nf,html[data-mode=dark] .chroma .nx,html[data-mode=dark] .chroma .gi{color:#a6e22e}html[data-mode=dark] .chroma .l,html[data-mode=dark] .chroma .se,html[data-mode=dark] .chroma .m,html[data-mode=dark] .chroma .mb,html[data-mode=dark] .chroma .mf,html[data-mode=dark] .chroma .mh,html[data-mode=dark] .chroma .mi,html[data-mode=dark] .chroma .il,html[data-mode=dark] .chroma .mo{color:#ae81ff}html[data-mode=dark] .chroma .ld,html[data-mode=dark] .chroma .s,html[data-mode=dark] .chroma .sa,html[data-mode=dark] .chroma .sb,html[data-mode=dark] .chroma .sc,html[data-mode=dark] .chroma .dl,html[data-mode=dark] .chroma .sd,html[data-mode=dark] .chroma .s2,html[data-mode=dark] .chroma .sh,html[data-mode=dark] .chroma .si,html[data-mode=dark] .chroma .sx,html[data-mode=dark] .chroma .sr,html[data-mode=dark] .chroma .s1,html[data-mode=dark] .chroma .ss{color:#e6db74}html[data-mode=dark] .chroma .c,html[data-mode=dark] .chroma .ch,html[data-mode=dark] .chroma .cm,html[data-mode=dark] .chroma .c1,html[data-mode=dark] .chroma .cs,html[data-mode=dark] .chroma .cp,html[data-mode=dark] .chroma .cpf,html[data-mode=dark] .chroma .gu{color:#949076}body{margin:0;padding:0;font-family:open sans,sans-serif;background:var(--bg);color:var(--fg);display:flex;min-height:100vh;flex-direction:column}body a{color:var(--accent);outline:2px dashed transparent;outline-offset:2px;transition:opacity .2s ease-in-out,outline .2s ease-in-out,padding .2s ease-in-out;word-break:break-word}body a:focus{outline-color:var(--accent)}body a:hover{opacity:.75}body>header,body>footer{background:var(--alt-bg);color:var(--alt-fg);text-align:center}body>header{padding:0 2rem 1rem}body>header nav{margin:.5rem 0 0}body>header nav ul{margin:0;display:flex;flex-wrap:wrap;justify-content:center;padding:0}body>header nav ul a{display:block;word-break:keep-all;margin:0 7.5px 15px;padding:9px 21px 12px;font-size:.75rem;font-weight:700;text-transform:uppercase}body>footer{padding:18px 45px}body>footer p{line-height:1.8rem;margin:15px 0;white-space:pre-wrap}body>footer a{transition:opacity .2s ease-in-out,padding .2s ease-in-out,outline-color .3s ease}body>footer a:hover{opacity:.75}body>footer section{padding:6px 0 12px}body>footer section input{border:1px solid var(--fg);outline-offset:3px;padding:0}body>footer section input::-webkit-color-swatch{border:none}body>footer section input::-webkit-color-swatch-wrapper{padding:0}body>footer section button{background:0;border:0;padding:3px 3px 0}body>footer section button svg{fill:var(--fg);stroke:var(--fg);stroke-width:.6rem}body>footer section input,body>footer section button{margin:0 7.5px;outline:2px dashed transparent;cursor:pointer;transition:outline .2s ease-in-out,transform .2s ease-in-out}body>footer section input:focus,body>footer section button:focus{outline-color:var(--accent)}body>footer section input:hover,body>footer section button:hover{transform:scale(1.2)}body>footer section input::-moz-focus-inner,body>footer section button::-moz-focus-inner{border:0}body>footer section input,body>footer section button svg{width:42px;height:42px}ol,ul{list-style:none}h1{text-shadow:0 1px 0 var(--rlpress),1px 0 0 var(--rlpress)}hr{border:1px solid var(--lpress);margin:2.4rem 0 1.2rem}::selection{background:var(--accent);color:#f0f0f0;text-shadow:none}div.filler{flex:1;align-items:center;justify-content:center}article>header h1{line-height:3rem}article>header img{margin:1rem 0 0}article>header p{font-size:.9rem;font-style:italic}h6,h5,h4,h3,h2,h1{font-family:oswald,sans-serif;font-weight:700}h1{font-size:2.25rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}main p{line-height:1.65rem}code{font-family:monospace}body>header>a{font-family:oswald,sans-serif;font-size:2.1rem;font-weight:700;transition:color .3s ease,opacity .2s ease-in-out,outline-color .3s ease;text-shadow:0 1px 0 var(--rlpress),1px 0 0 var(--rlpress);display:inline-block;margin:1.5rem 0 .75rem}article>header{margin:0 0 2rem}article>header h1{margin:9px 0}article>header p{margin:0}article h2,article h3,main.index h2,main.index h3{margin:2rem 0 1rem}article p,main.index p{margin:1.5rem 0}h6+p,h5+p,h4+p,h3+p,h2+p,h1+p{margin-top:0}h6,h5,h4,h3,h2{padding-top:1rem}audio,img,video{margin:1.8rem auto}a.anchor{background-image:none}a.anchor svg{fill:var(--accent);vertical-align:middle;width:24px;height:24px}h2 a.anchor{margin:0 0 0 .65rem}h2 a.anchor svg{transform:scale(1.7)}h3 a.anchor{margin:0 0 0 .55rem}h3 a.anchor svg{transform:scale(1.525)}h4 a.anchor{margin:0 0 0 .45rem}h4 a.anchor svg{transform:scale(1.35)}h5 a.anchor{margin:0 0 0 .35rem}h5 a.anchor svg{transform:scale(1.175)}h6 a.anchor{margin:0 0 0 .25rem}h6 a.anchor svg{transform:scale(1)}span.lnt,summary,sup.footnote-ref{user-select:none}ol li,ul li{margin-bottom:.45rem}ol{counter-reset:a-counter}ol li{counter-increment:a-counter}ol li::before{content:counter(a-counter)"";font-size:.85rem;font-weight:700;text-shadow:0 1px 0 var(--lpress),1px 0 0 var(--lpress);background:var(--fg);border:1px solid var(--lpress);border-radius:2px;color:var(--bg);margin-right:12px;padding:2px 7.5px}section.footnotes{border-top:2px solid var(--fg);display:block;margin-top:2.4rem;padding:1rem 1rem 1.8rem}section.footnotes h2{margin:0 0 2rem}section.footnotes a{word-break:break-word}section.footnotes ol li p:first-of-type{display:inline;margin-left:-6px}section.footnotes a.footnote-backref{margin:0 0 0 9px;padding:0 9px;vertical-align:middle}section.footnotes a.footnote-backref svg{fill:var(--dtl);stroke:var(--lpress);stroke-width:.6rem;width:18px;height:18px}section.footnotes hr{display:none}sup{line-height:0}sup a.footnote-ref{text-decoration:none}sup a.footnote-ref::before{content:'['}sup a.footnote-ref::after{content:']'}code,.chroma,.chroma span{transition:background-color .3s ease,color .3s ease}article>pre,section.scroll,span.katex-display,div.highlight>pre,div.highlight>div{overflow-x:auto;transition:background-color .3s ease,color .3s ease,outline-color .3s ease;outline:3px solid transparent}article>pre:focus,section.scroll:focus,span.katex-display:focus,div.highlight>pre:focus,div.highlight>div:focus{outline-color:var(--accent)}section.scroll{border:1px solid var(--fg)}section.scroll>table{border-collapse:collapse;color:var(--fg);font-family:open sans,sans-serif;min-width:600px;width:100%}section.scroll>table td+td{border-left:1px solid var(--fg)}section.scroll>table tr+tr{border-top:1px solid var(--fg)}section.scroll>table tr:not(:first-child):last-of-type{border-bottom:1px solid var(--fg)}section.scroll>table td,section.scroll>table th{padding:9px}section.scroll>table th{background:var(--fg);color:var(--bg)}section.scroll>table tr{transition:background .2s ease-in-out,color .2s ease-in-out}section.scroll>table tr:nth-child(even){background:var(--alt-bg)}section.scroll>table tr:nth-child(odd){background:var(--bg)}section.scroll>table tr:hover{background:var(--accent);color:var(--dtl)}div.highlight>div table{padding:0 24px;max-height:75vh}div.chroma td:first-of-type{padding:0 18px 0 0}article>pre,span.katex-display,div.highlight>pre{padding:var(--hl-pad)}article>pre,span.katex-display,div.highlight>pre,div.highlight>div.chroma{border:1px solid #222;line-height:1.5rem;max-height:75vh}mark,p code,li code{border-radius:2px;padding:1px 3px;word-break:break-all}p code{word-break:break-word}li a{word-break:break-all}article>header section.tags{margin:.9rem 0 .6rem}article>header section.tags ul{padding:0}article>header section.tags li{display:inline}article>header section.tags a{display:inline-block;margin:0 7.5px 9px 0;padding:6px 15px 9px}ul.posts{padding:0}ul.posts li{margin:.5rem 0}ul.posts a{background:var(--accent);color:var(--dtl);display:flex;margin:15px auto;padding:15px 30px 18px;text-decoration:none;align-items:center;word-break:break-word}ul.posts a p{flex:1;margin:0}ul.posts a time{background-image:linear-gradient(0deg,var(--bgmod),100%,transparent);border-radius:2px;font-size:.85rem;margin-left:1.8rem;padding:0 6px 2px}@media(max-width:768px){ul.posts a{flex-direction:column-reverse;align-items:unset}ul.posts a time{margin:.3rem 0}}span.katex-display{border:1px dashed var(--alt-fg);overflow-x:auto;padding:15px 30px}span.katex-display:focus{border:1px solid #222}img{display:block;max-width:100%;max-height:75vh;outline:3px solid transparent;transition:border-color .3s ease,outline-color .3s ease,filter .3s ease}img.cover{border:1px solid var(--fg);object-fit:cover;width:100%}article p>img{display:block;margin:2rem auto;max-width:100%}figure{margin:1.8rem auto}figure img{display:block;margin:0 auto;max-width:90%}figure figcaption{font-size:.85rem;text-align:center;margin:.75rem;line-height:1.5rem}video{display:block;max-width:91%;max-height:75vh;outline:3px solid transparent;transition:border-color .3s ease,outline-color .3s ease}video:focus,video:hover{border-color:var(--accent);outline-color:var(--accent)}video.gifoid{margin:3rem auto;max-width:90%}audio{display:block;width:90%}img.border,video.border{border:1px solid var(--fg)}img.borderless,video.borderless{border:0}details.toc{background:var(--alt-bg);color:var(--dtl);transition:background-color .3s ease,border .3s ease,linear-gradient .3s ease}details.toc summary{background:var(--accent);border:1px solid rgba(0,0,0,.3);border-radius:2px;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -3px 0 rgba(0,0,0,.3);font-family:oswald,sans-serif;padding:15px 30px 18.5px;outline:2px dashed transparent;outline-offset:3px;text-shadow:0 1px 0 var(--lpress),1px 0 0 var(--lpress);cursor:pointer;transition:color .3s ease,opacity .2s ease,outline-color .2s ease,padding .2s ease}details.toc summary:hover{opacity:.75}details.toc summary:focus{outline-color:var(--accent)}details.toc[open] summary{border-radius:2px 2px 0 0;box-shadow:inset 0 1px 0 rgba(255,255,255,.2);padding:15px 30px}details.toc[open] summary~*{animation:smoothReveal .3s ease-in-out}details.toc nav#TableOfContents{border-style:solid;border-color:rgba(0,0,0,.3);border-width:0 1px 1px;border-radius:0 0 2px 2px;box-shadow:inset 0 -3px 0 rgba(0,0,0,.3);padding:6px 15px 15px 9px}details.toc nav#TableOfContents li:first-of-type{margin-top:.3rem}details.toc nav#TableOfContents ul li:not(:last-of-type),details.toc nav#TableOfContents ul li ul li:first-of-type,details.toc nav#TableOfContents ul li ol li:first-of-type,details.toc nav#TableOfContents ol li:not(:last-of-type),details.toc nav#TableOfContents ol li ul li:first-of-type,details.toc nav#TableOfContents ol li ol li:first-of-type{margin-bottom:.3rem}#TableOfContents,section.footnotes ol,article>ul,article>ol{line-height:1.5rem}#TableOfContents ul,section.footnotes ol{padding-left:24px}article>ul,article>ul ul,article>ol,article>ol ol{padding:0 24px}#TableOfContents ul li:before,article>ul li:before{content:'';margin-right:12px;background:var(--fg);border-radius:2px;width:18px;height:18px;display:inline-block;margin-bottom:-3px}@keyframes smoothReveal{0%{opacity:0}100%{opacity:1}}a.btn,a.footnote-backref,section.social a,input[type=submit]{background:var(--accent);border:1px solid rgba(0,0,0,.3);color:var(--dtl);transition:background-color .3s ease,color .3s ease,opacity .2s ease-in-out,outline-color .3s ease;border-radius:2px;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -3px 0 rgba(0,0,0,.3);text-decoration:none;text-shadow:0 1px 0 var(--lpress),1px 0 0 var(--lpress)}a.btn:hover,a.footnote-backref:hover,section.social a:hover,input[type=submit]:hover{opacity:.75}li.cats a{font-weight:700}ul.tags{display:flex;flex-wrap:wrap;padding:0}ul.tags a{display:flex;flex:1;align-items:center;margin:0 9px 9px 0;padding:7.5px 18px 10.5px;word-break:keep-all}ul.tags a span{background-image:linear-gradient(0deg,var(--bgmod),100%,transparent);margin-left:.45rem;padding:0 6px 1px;font-size:.85rem;border-radius:2px}ul.pagination{font-family:open sans,sans-serif;font-weight:700;text-align:center;margin:3rem auto 1rem;padding:0;display:flex;flex-wrap:wrap;justify-content:center}ul.pagination li{display:inline-block;transition:background .2s ease-in-out,border .2s ease-in-out}ul.pagination li a,ul.pagination li.current p{display:block;margin:0 9px 9px 0;padding:7.5px 12px 10.5px;width:21px}ul.pagination li a{color:var(--dtl)}ul.pagination li.current p{background:var(--alt-bg);border:1px solid rgba(0,0,0,.45);color:var(--alt-fg);line-height:inherit;user-select:none;border-radius:2px;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -3px 0 rgba(0,0,0,.3);text-shadow:0 1px 0 var(--lpress),1px 0 0 var(--lpress)}ul.pagination svg{fill:currentColor;width:18px;height:18px;display:inline-block;margin:auto auto -2px}mark{background:var(--accent);filter:contrast(1.2)invert(1)}abbr{text-decoration-style:solid}blockquote{background:var(--alt-bg);border-style:solid;border-width:1px 1px 1px 12px;color:var(--alt-fg);margin:var(--blk-mg);padding:0 30px}blockquote p{margin:1.2rem 0}kbd{background-color:#eee;border-radius:2px;border:1px solid #b4b4b4;box-shadow:0 1px 1px rgba(0,0,0,.2),0 2px 0 0 rgba(255,255,255,.7)inset;color:#333;display:inline-block;font-size:.85em;font-weight:700;line-height:1;padding:2px;white-space:nowrap}kbd>kbd{margin:0 2px}main{margin:90px auto;max-width:660px;padding:0 15px}article{margin:90px auto 120px}html{--blk-mg: 1.05rem .75rem;--il-pad: 0 12px;--hl-pad: 15.75px 18px}@media(min-width:769px){html{--blk-mg: 2.1rem 1.5rem;--il-pad: 6px 24px;--hl-pad: 21px 24px}}@media(min-width:769px){a.anchor:not(:focus){opacity:0}h6>a:focus+a.anchor,h6:hover>a.anchor,h5>a:focus+a.anchor,h5:hover>a.anchor,h4>a:focus+a.anchor,h4:hover>a.anchor,h3>a:focus+a.anchor,h3:hover>a.anchor,h2>a:focus+a.anchor,h2:hover>a.anchor{opacity:1}}p.error{color:red}p.noscript{font-weight:700}blockquote.twitter-tweet{border-color:#1da0f1;padding:0 30px 27px}div.__h_instagram{margin:2rem auto}div.__h_instagram a:nth-child(2){display:block;margin:.6rem 0;line-height:0}div.__h_instagram a:nth-child(2):hover{opacity:.75}div.__h_instagram img{border:1px solid var(--fg);max-width:100%;object-fit:cover}h2#vimeo-simple-shortcode{margin-bottom:1rem}div.s_video_simple{margin:0 auto;width:96%}div.s_video_simple a{border:1px solid var(--fg);display:block;margin:6px;line-height:0}div.s_video_simple a:hover{opacity:.75}section.youtube{border:1px solid var(--fg);margin:2rem 0;padding-bottom:56.25%;position:relative;overflow:hidden;height:0}section.info img{border:3px solid var(--fg);border-radius:9px} \ No newline at end of file
+@font-face{font-family:oswald;font-style:normal;font-weight:700;font-display:swap;src:local("Oswald"),url(../fonts/oswald-v29-latin-700.woff2)format("woff2"),url(../fonts/oswald-v29-latin-700.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:400;font-display:swap;src:local("Open Sans Regular"),local("OpenSans-Regular"),url(../fonts/open-sans-v17-latin-regular.woff2)format("woff2"),url(../fonts/open-sans-v17-latin-regular.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:700;font-display:swap;src:local("Open Sans Bold"),local("OpenSans-Bold"),url(../fonts/open-sans-v17-latin-700.woff2)format("woff2"),url(../fonts/open-sans-v17-latin-700.woff)format("woff")}@font-face{font-family:open sans;font-style:italic;font-weight:400;font-display:swap;src:local("Open Sans Italic"),local("OpenSans-Italic"),url(../fonts/open-sans-v17-latin-italic.woff2)format("woff2"),url(../fonts/open-sans-v17-latin-italic.woff)format("woff")}:root{font-size:18px}html{scroll-behavior:smooth}html[data-mode=light]{--bg: #ddd;--fg: #444;--alt-bg: #d6d6d6;--alt-fg: #333;--dtl: #fdfdfd;--err: #c70000;--bgmod: rgba(0, 0, 0, 0.3);--input-bg: #fefefe;--input-fg: #111;--input-bd: #ccc;--lpress: rgba(0, 0, 0, 0.2);--rlpress: rgba(255, 255, 255, 0.2)}html[data-mode=light] .chroma,html[data-mode=light] pre,html[data-mode=light] p code,html[data-mode=light] li code{color:#93a1a1;background-color:#002b36}html[data-mode=light] .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}html[data-mode=light] .chroma .lntable{border-spacing:0;margin:0;border:0;width:auto;display:block}html[data-mode=light] .chroma .hl{display:block;width:100%;background-color:rgba(0,0,0,.3)}html[data-mode=light] .chroma .nb{color:#b58900}html[data-mode=light] .chroma .ge{font-style:italic}html[data-mode=light] .chroma .gr{color:#e8625f;font-weight:700}html[data-mode=light] .chroma .gs{font-weight:700}html[data-mode=light] .chroma .x,html[data-mode=light] .chroma .kc,html[data-mode=light] .chroma .no,html[data-mode=light] .chroma .ni,html[data-mode=light] .chroma .ne,html[data-mode=light] .chroma .se,html[data-mode=light] .chroma .gh{color:#e9662f}html[data-mode=light] .chroma .lnt,html[data-mode=light] .chroma .ln{margin-right:.4em;padding:0 .4em;color:#848f8f}html[data-mode=light] .chroma .k,html[data-mode=light] .chroma .kn,html[data-mode=light] .chroma .kp,html[data-mode=light] .chroma .o,html[data-mode=light] .chroma .ow,html[data-mode=light] .chroma .cs,html[data-mode=light] .chroma .cp,html[data-mode=light] .chroma .cpf,html[data-mode=light] .chroma .gi{color:#859900}html[data-mode=light] .chroma .kd,html[data-mode=light] .chroma .kr,html[data-mode=light] .chroma .bp,html[data-mode=light] .chroma .nc,html[data-mode=light] .chroma .nd,html[data-mode=light] .chroma .nf,html[data-mode=light] .chroma .nt,html[data-mode=light] .chroma .nv,html[data-mode=light] .chroma .gu{color:#3294da}html[data-mode=light] .chroma .kt,html[data-mode=light] .chroma .sr,html[data-mode=light] .chroma .gd{color:#e8625f}html[data-mode=light] .chroma .s,html[data-mode=light] .chroma .sa,html[data-mode=light] .chroma .sc,html[data-mode=light] .chroma .dl,html[data-mode=light] .chroma .s2,html[data-mode=light] .chroma .si,html[data-mode=light] .chroma .sx,html[data-mode=light] .chroma .s1,html[data-mode=light] .chroma .ss,html[data-mode=light] .chroma .m,html[data-mode=light] .chroma .mb,html[data-mode=light] .chroma .mf,html[data-mode=light] .chroma .mh,html[data-mode=light] .chroma .mi,html[data-mode=light] .chroma .il,html[data-mode=light] .chroma .mo{color:#2aa198}html[data-mode=light] .chroma .sb,html[data-mode=light] .chroma .c,html[data-mode=light] .chroma .ch,html[data-mode=light] .chroma .cm,html[data-mode=light] .chroma .c1{color:#759299}html[data-mode=dark]{--bg: #1f1f1f;--fg: #bbb;--alt-bg: #1c1c1c;--alt-fg: #ddd;--dtl: #1a1a1a;--err: #ff3131;--bgmod: rgba(255, 255, 255, 0.3);--input-bg: #222;--input-fg: #f0f0f0;--input-bd: #262626;--lpress: rgba(255, 255, 255, 0.2);--rlpress: rgba(0, 0, 0, 0.2)}html[data-mode=dark] img{filter:contrast(0.85)grayscale(0.3)}html[data-mode=dark] .chroma,html[data-mode=dark] pre,html[data-mode=dark] p code,html[data-mode=dark] li code{color:#f8f8f2;background:#272822}html[data-mode=dark] .chroma .err{color:#eb0083;background-color:#1e0010}html[data-mode=dark] .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}html[data-mode=dark] .chroma .lntable{border-spacing:0;margin:0;border:0;width:auto;display:block}html[data-mode=dark] .chroma .hl{display:block;width:100%;background-color:rgba(0,0,0,.3)}html[data-mode=dark] .chroma .ge{font-style:italic}html[data-mode=dark] .chroma .gs{font-weight:700}html[data-mode=dark] .chroma .lnt,html[data-mode=dark] .chroma .ln{margin-right:.4em;padding:0 .4em;color:#8e8e8e}html[data-mode=dark] .chroma .k,html[data-mode=dark] .chroma .kc,html[data-mode=dark] .chroma .kd,html[data-mode=dark] .chroma .kp,html[data-mode=dark] .chroma .kr,html[data-mode=dark] .chroma .kt,html[data-mode=dark] .chroma .no{color:#66d9ef}html[data-mode=dark] .chroma .kn,html[data-mode=dark] .chroma .nt,html[data-mode=dark] .chroma .o,html[data-mode=dark] .chroma .ow,html[data-mode=dark] .chroma .gd{color:#f94e8a}html[data-mode=dark] .chroma .na,html[data-mode=dark] .chroma .nc,html[data-mode=dark] .chroma .nd,html[data-mode=dark] .chroma .ne,html[data-mode=dark] .chroma .nf,html[data-mode=dark] .chroma .nx,html[data-mode=dark] .chroma .gi{color:#a6e22e}html[data-mode=dark] .chroma .l,html[data-mode=dark] .chroma .se,html[data-mode=dark] .chroma .m,html[data-mode=dark] .chroma .mb,html[data-mode=dark] .chroma .mf,html[data-mode=dark] .chroma .mh,html[data-mode=dark] .chroma .mi,html[data-mode=dark] .chroma .il,html[data-mode=dark] .chroma .mo{color:#ae81ff}html[data-mode=dark] .chroma .ld,html[data-mode=dark] .chroma .s,html[data-mode=dark] .chroma .sa,html[data-mode=dark] .chroma .sb,html[data-mode=dark] .chroma .sc,html[data-mode=dark] .chroma .dl,html[data-mode=dark] .chroma .sd,html[data-mode=dark] .chroma .s2,html[data-mode=dark] .chroma .sh,html[data-mode=dark] .chroma .si,html[data-mode=dark] .chroma .sx,html[data-mode=dark] .chroma .sr,html[data-mode=dark] .chroma .s1,html[data-mode=dark] .chroma .ss{color:#e6db74}html[data-mode=dark] .chroma .c,html[data-mode=dark] .chroma .ch,html[data-mode=dark] .chroma .cm,html[data-mode=dark] .chroma .c1,html[data-mode=dark] .chroma .cs,html[data-mode=dark] .chroma .cp,html[data-mode=dark] .chroma .cpf,html[data-mode=dark] .chroma .gu{color:#949076}body{margin:0;padding:0;font-family:open sans,sans-serif;background:var(--bg);color:var(--fg);display:flex;min-height:100vh;flex-direction:column}body a{color:var(--accent);outline:2px dashed transparent;outline-offset:2px;transition:opacity .2s ease-in-out,outline .2s ease-in-out,padding .2s ease-in-out;word-break:break-word}body a:focus{outline-color:var(--accent)}body a:hover{opacity:.75}body>header,body>footer{background:var(--alt-bg);color:var(--alt-fg);text-align:center}body>header{padding:0 2rem 1rem}body>header nav{margin:.5rem 0 0}body>header nav ul{margin:0;display:flex;flex-wrap:wrap;justify-content:center;padding:0}body>header nav ul a{display:block;word-break:keep-all;margin:0 7.5px 15px;padding:9px 21px 12px;font-size:.75rem;font-weight:700;text-transform:uppercase}body>footer{padding:18px 45px}body>footer p{line-height:1.8rem;margin:15px 0;white-space:pre-wrap}body>footer a{transition:opacity .2s ease-in-out,padding .2s ease-in-out,outline-color .3s ease}body>footer a:hover{opacity:.75}body>footer section{padding:6px 0 12px}body>footer section input{border:1px solid var(--fg);outline-offset:3px;padding:0}body>footer section input::-webkit-color-swatch{border:none}body>footer section input::-webkit-color-swatch-wrapper{padding:0}body>footer section button{background:0;border:0;padding:3px 3px 0}body>footer section button svg{fill:var(--fg);stroke:var(--fg);stroke-width:.6rem}body>footer section input,body>footer section button{margin:0 7.5px;outline:2px dashed transparent;transition:outline .2s ease-in-out,transform .2s ease-in-out}body>footer section input:focus,body>footer section button:focus{outline-color:var(--accent)}body>footer section input:hover,body>footer section button:hover{transform:scale(1.2)}body>footer section input::-moz-focus-inner,body>footer section button::-moz-focus-inner{border:0}body>footer section input,body>footer section button svg{width:42px;height:42px}ol,ul{list-style:none}h1{text-shadow:0 1px 0 var(--rlpress),1px 0 0 var(--rlpress)}hr{border:1px solid var(--lpress);margin:2.4rem 0 1.2rem}::selection{background:var(--accent);color:#f0f0f0;text-shadow:none}div.filler{flex:1;align-items:center;justify-content:center}article>header h1{line-height:3rem}article>header img{margin:1rem 0 0}article>header p{font-size:.9rem;font-style:italic}h6,h5,h4,h3,h2,h1{font-family:oswald,sans-serif;font-weight:700}h1{font-size:2.25rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}main p{line-height:1.65rem}code{font-family:monospace}body>header>a{font-family:oswald,sans-serif;font-size:2.1rem;font-weight:700;transition:color .3s ease,opacity .2s ease-in-out,outline-color .3s ease;text-shadow:0 1px 0 var(--rlpress),1px 0 0 var(--rlpress);display:inline-block;margin:1.5rem 0 .75rem}article>header{margin:0 0 2rem}article>header h1{margin:9px 0}article>header p{margin:0}article h2,article h3,main.index h2,main.index h3{margin:2rem 0 1rem}article p,main.index p{margin:1.5rem 0}h6+p,h5+p,h4+p,h3+p,h2+p,h1+p{margin-top:0}h6,h5,h4,h3,h2{padding-top:1rem}audio,img,video{margin:1.8rem auto}a.anchor{background-image:none}a.anchor svg{fill:var(--accent);vertical-align:middle;width:24px;height:24px}h2 a.anchor{margin:0 0 0 .65rem}h2 a.anchor svg{transform:scale(1.7)}h3 a.anchor{margin:0 0 0 .55rem}h3 a.anchor svg{transform:scale(1.525)}h4 a.anchor{margin:0 0 0 .45rem}h4 a.anchor svg{transform:scale(1.35)}h5 a.anchor{margin:0 0 0 .35rem}h5 a.anchor svg{transform:scale(1.175)}h6 a.anchor{margin:0 0 0 .25rem}h6 a.anchor svg{transform:scale(1)}label,span.lnt,summary,sup.footnote-ref{user-select:none}article ol li,article ul li,main.index ol li,main.index ul li{margin-bottom:.45rem}ol{counter-reset:a-counter}ol li{counter-increment:a-counter}ol li::before{content:counter(a-counter)"";font-size:.85rem;font-weight:700;text-shadow:0 1px 0 var(--lpress),1px 0 0 var(--lpress);background:var(--fg);border:1px solid var(--lpress);border-radius:2px;color:var(--bg);margin-right:12px;padding:2px 7.5px}section.footnotes{border-top:2px solid var(--fg);display:block;margin-top:2.4rem;padding:1rem 1rem 1.8rem}section.footnotes h2{margin:0 0 2rem}section.footnotes a{word-break:break-word}section.footnotes ol li p:first-of-type{display:inline;margin-left:-6px}section.footnotes a.footnote-backref{margin:0 0 0 9px;padding:0 9px;vertical-align:middle}section.footnotes a.footnote-backref svg{fill:var(--dtl);stroke:var(--lpress);stroke-width:.6rem;width:18px;height:18px}section.footnotes hr{display:none}sup{line-height:0}sup a.footnote-ref{text-decoration:none}sup a.footnote-ref::before{content:'['}sup a.footnote-ref::after{content:']'}code,.chroma,.chroma span{transition:background-color .3s ease,color .3s ease}article>pre,section.scroll,span.katex-display,div.highlight>pre,div.highlight>div{overflow-x:auto;transition:background-color .3s ease,color .3s ease,outline-color .3s ease;outline:3px solid transparent}article>pre:focus,section.scroll:focus,span.katex-display:focus,div.highlight>pre:focus,div.highlight>div:focus{outline-color:var(--accent)}section.scroll{border:1px solid var(--fg)}section.scroll>table{border-collapse:collapse;color:var(--fg);font-family:open sans,sans-serif;min-width:600px;width:100%}section.scroll>table td+td{border-left:1px solid var(--fg)}section.scroll>table tr+tr{border-top:1px solid var(--fg)}section.scroll>table tr:not(:first-child):last-of-type{border-bottom:1px solid var(--fg)}section.scroll>table td,section.scroll>table th{padding:9px}section.scroll>table th{background:var(--fg);color:var(--bg)}section.scroll>table tr{transition:background .2s ease-in-out,color .2s ease-in-out}section.scroll>table tr:nth-child(even){background:var(--alt-bg)}section.scroll>table tr:nth-child(odd){background:var(--bg)}section.scroll>table tr:hover{background:var(--accent);color:var(--dtl)}div.highlight>div table{padding:0 24px;max-height:75vh}div.chroma td:first-of-type{padding:0 18px 0 0}article>pre,span.katex-display,div.highlight>pre{padding:var(--hl-pad)}article>pre,span.katex-display,div.highlight>pre,div.highlight>div.chroma{border:1px solid #222;line-height:1.5rem;max-height:75vh}mark,p code,li code{border-radius:2px;padding:1px 3px;word-break:break-all}p code{word-break:break-word}li a{word-break:break-all}article>header section.tags{margin:.9rem 0 .6rem}article>header section.tags ul{padding:0}article>header section.tags li{display:inline}article>header section.tags a{display:inline-block;margin:0 7.5px 9px 0;padding:6px 15px 9px}ul.posts{padding:0}ul.posts li{margin:.5rem 0}ul.posts a{background:var(--accent);color:var(--dtl);display:flex;margin:15px auto;padding:15px 30px 18px;text-decoration:none;align-items:center;word-break:break-word}ul.posts a p{flex:1;margin:0}ul.posts a time{background-image:linear-gradient(0deg,var(--bgmod),100%,transparent);border-radius:2px;font-size:.85rem;margin-left:1.8rem;padding:0 9px 2px}@media(max-width:768px){ul.posts a{flex-direction:column-reverse;align-items:unset}ul.posts a time{margin:.3rem 0}}span.katex-display{border:1px dashed var(--alt-fg);overflow-x:auto;padding:15px 30px}span.katex-display:focus{border:1px solid #222}img{display:block;max-width:100%;max-height:75vh;outline:3px solid transparent;transition:border-color .3s ease,outline-color .3s ease,filter .3s ease}img.cover{border:1px solid var(--fg);object-fit:cover;width:100%}article p>img{display:block;margin:2rem auto;max-width:100%}figure{margin:1.8rem auto}figure img{display:block;margin:0 auto;max-width:90%}figure figcaption{font-size:.85rem;text-align:center;margin:.75rem;line-height:1.5rem}video{display:block;max-width:91%;max-height:75vh;outline:3px solid transparent;transition:border-color .3s ease,outline-color .3s ease}video:focus,video:hover{border-color:var(--accent);outline-color:var(--accent)}video.gifoid{margin:3rem auto;max-width:90%}audio{display:block;width:90%}img.border,video.border{border:1px solid var(--fg)}img.borderless,video.borderless{border:0}button,input[type=color],summary{cursor:pointer}details.toc{background:var(--alt-bg);color:var(--dtl);transition:background-color .3s ease,border .3s ease,linear-gradient .3s ease}details.toc summary{background:var(--accent);border:1px solid rgba(0,0,0,.3);border-radius:2px;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -3px 0 rgba(0,0,0,.3);font-family:oswald,sans-serif;padding:15px 30px 18.5px;outline:2px dashed transparent;outline-offset:3px;text-shadow:0 1px 0 var(--lpress),1px 0 0 var(--lpress);transition:color .3s ease,opacity .2s ease,outline-color .2s ease,padding .2s ease}details.toc summary:hover{opacity:.75}details.toc summary:focus{outline-color:var(--accent)}details.toc[open] summary{border-radius:2px 2px 0 0;box-shadow:inset 0 1px 0 rgba(255,255,255,.2);padding:15px 30px}details.toc[open] summary~*{animation:smoothReveal .3s ease-in-out}details.toc nav#TableOfContents{border-style:solid;border-color:rgba(0,0,0,.3);border-width:0 1px 1px;border-radius:0 0 2px 2px;box-shadow:inset 0 -3px 0 rgba(0,0,0,.3);padding:6px 15px 15px 9px}details.toc nav#TableOfContents li:first-of-type{margin-top:.3rem}details.toc nav#TableOfContents ul li:not(:last-of-type),details.toc nav#TableOfContents ul li ul li:first-of-type,details.toc nav#TableOfContents ul li ol li:first-of-type,details.toc nav#TableOfContents ol li:not(:last-of-type),details.toc nav#TableOfContents ol li ul li:first-of-type,details.toc nav#TableOfContents ol li ol li:first-of-type{margin-bottom:.3rem}#TableOfContents,section.footnotes ol,article>ul,article>ol{line-height:1.5rem}#TableOfContents ul,section.footnotes ol{padding-left:24px}article>ul,article>ul ul,article>ol,article>ol ol{padding:0 24px}#TableOfContents ul li:before,article>ul li:before{content:'';margin-right:12px;background:var(--fg);border-radius:2px;width:18px;height:18px;display:inline-block;margin-bottom:-3px}@keyframes smoothReveal{0%{opacity:0}100%{opacity:1}}a.btn,a.footnote-backref,section.search-box button,section.social a,input[type=submit]{background:var(--accent);border:1px solid rgba(0,0,0,.3);color:var(--dtl);transition:background-color .3s ease,color .3s ease,opacity .2s ease-in-out,outline-color .3s ease;border-radius:2px;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -3px 0 rgba(0,0,0,.3);text-decoration:none;text-shadow:0 1px 0 var(--lpress),1px 0 0 var(--lpress)}a.btn:hover,a.footnote-backref:hover,section.search-box button:hover,section.social a:hover,input[type=submit]:hover{opacity:.75}li.cats a{font-weight:700}ul.tags{display:flex;flex-wrap:wrap;padding:0}ul.tags a{display:flex;flex:1;align-items:center;margin:0 9px 9px 0;padding:7.5px 18px 10.5px;word-break:keep-all}ul.tags a span{background-image:linear-gradient(0deg,var(--bgmod),100%,transparent);margin-left:.45rem;padding:0 6px 1px;font-size:.85rem;border-radius:2px}ul.pagination{font-family:open sans,sans-serif;font-weight:700;text-align:center;margin:3rem auto 1rem;padding:0;display:flex;flex-wrap:wrap;justify-content:center}ul.pagination li{display:inline-block;transition:background .2s ease-in-out,border .2s ease-in-out}ul.pagination li a,ul.pagination li.current p{display:block;margin:0 9px 9px 0;padding:7.5px 12px 10.5px;width:21px}ul.pagination li a{color:var(--dtl)}ul.pagination li.current p{background:var(--alt-bg);border:1px solid rgba(0,0,0,.45);color:var(--alt-fg);line-height:inherit;user-select:none;border-radius:2px;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -3px 0 rgba(0,0,0,.3);text-shadow:0 1px 0 var(--lpress),1px 0 0 var(--lpress)}ul.pagination svg{fill:currentColor;width:18px;height:18px;display:inline-block;margin:auto auto -2px}mark{background:var(--accent);filter:contrast(1.2)invert(1)}abbr{text-decoration-style:solid}blockquote{background:var(--alt-bg);border-style:solid;border-width:1px 1px 1px 12px;color:var(--alt-fg);margin:var(--blk-mg);padding:0 30px}blockquote p{margin:1.2rem 0}kbd{background-color:#eee;border-radius:2px;border:1px solid #b4b4b4;box-shadow:0 1px 1px rgba(0,0,0,.2),0 2px 0 0 rgba(255,255,255,.7)inset;color:#333;display:inline-block;font-size:.85em;font-weight:700;line-height:1;padding:2px;white-space:nowrap}kbd>kbd{margin:0 2px}main{margin:90px auto;max-width:660px;padding:0 15px}article{margin:90px auto 120px}html{--blk-mg: 1.05rem .75rem;--il-pad: 0 12px;--hl-pad: 15.75px 18px}@media(min-width:769px){html{--blk-mg: 2.1rem 1.5rem;--il-pad: 6px 24px;--hl-pad: 21px 24px}}@media(min-width:769px){a.anchor:not(:focus){opacity:0}h6>a:focus+a.anchor,h6:hover>a.anchor,h5>a:focus+a.anchor,h5:hover>a.anchor,h4>a:focus+a.anchor,h4:hover>a.anchor,h3>a:focus+a.anchor,h3:hover>a.anchor,h2>a:focus+a.anchor,h2:hover>a.anchor{opacity:1}}p.error{color:var(--err)}p.noscript{font-weight:700}blockquote.twitter-tweet{border-color:#1da0f1;padding:0 30px 27px}div.__h_instagram{margin:2rem auto}div.__h_instagram a:nth-child(2){display:block;margin:.6rem 0;line-height:0}div.__h_instagram a:nth-child(2):hover{opacity:.75}div.__h_instagram img{border:1px solid var(--fg);max-width:100%;object-fit:cover}h2#vimeo-simple-shortcode{margin-bottom:1rem}div.s_video_simple{margin:0 auto;width:96%}div.s_video_simple a{border:1px solid var(--fg);display:block;margin:6px;line-height:0}div.s_video_simple a:hover{opacity:.75}section.youtube{border:1px solid var(--fg);margin:2rem 0;padding-bottom:56.25%;position:relative;overflow:hidden;height:0}section.info img{border:3px solid var(--fg);border-radius:9px}section.search-box form{display:flex;flex-wrap:wrap;justify-content:center;align-items:stretch}section.search-box label{color:var(--fg);font-family:oswald,sans-serif;font-weight:700;flex-basis:100%;text-align:left;font-size:.9rem;letter-spacing:.5px;line-height:2rem;text-transform:uppercase}section.search-box input[name=q]{background:var(--input-bg);border:1px solid var(--input-bd);color:var(--input-fg);font-family:open sans,sans-serif;font-size:.9rem;line-height:1.5rem;padding:6px 12px;flex:1;transition:background-color .2s ease-in-out,border .2s ease-in-out,outline .2s ease-in-out;border-radius:2px 0 0 2px;outline:2px solid transparent}section.search-box input[name=q]:focus{outline-color:var(--accent)}section.search-box button{border-radius:0 2px 2px 0;padding:6px 30px;outline:2px dashed transparent;outline-offset:2px}section.search-box button:focus{outline-color:var(--accent)}section.search-box button:hover{opacity:.75}section.search-box button svg{width:15px;height:15px;fill:currentColor;stroke:var(--lpress);stroke-width:9px}#search-info{margin:1rem 0 2rem}#search-info p:first-of-type{font-family:oswald,sans-serif;font-size:1.5rem;font-weight:700}#search-info+ul{margin:0 0 6rem} \ No newline at end of file
diff --git a/exampleSite/resources/_gen/assets/scss/scss/main.scss_694b6a5caed62875bf9278dff98b7f5e.json b/exampleSite/resources/_gen/assets/scss/scss/main.scss_694b6a5caed62875bf9278dff98b7f5e.json
index 393f58f..cb61219 100644
--- a/exampleSite/resources/_gen/assets/scss/scss/main.scss_694b6a5caed62875bf9278dff98b7f5e.json
+++ b/exampleSite/resources/_gen/assets/scss/scss/main.scss_694b6a5caed62875bf9278dff98b7f5e.json
@@ -1 +1 @@
-{"Target":"css/main.min.cafcc85598ef2046565a0360c4ea9d413e97dfa006eed353f7f3a2b18549d44d6ad7c1154a2befb3b7c3dd7e68d198c9dc104c21b572965ba6914adf114d6db4.css","MediaType":"text/css","Data":{"Integrity":"sha512-yvzIVZjvIEZWWgNgxOqdQT6X36AG7tNT9/OisYVJ1E1q18EVSivvs7fD3X5o0ZjJ3BBMIbVyllumkUrfEU1ttA=="}} \ No newline at end of file
+{"Target":"css/main.min.27326a06f193f9d5f1f43e8c50026b38efc31183feaf66e27db8671cf79dd6a8ea7060ccc32504176245357393af34ec6a73b144fc444af4dab94ead121cd1a8.css","MediaType":"text/css","Data":{"Integrity":"sha512-JzJqBvGT+dXx9D6MUAJrOO/DEYP+r2bifbhnHPed1qjqcGDMwyUEF2JFNXOTrzTsanOxRPxESvTauU6tEhzRqA=="}} \ No newline at end of file
diff --git a/i18n/en.toml b/i18n/en.toml
index 8a069aa..32a571c 100644
--- a/i18n/en.toml
+++ b/i18n/en.toml
@@ -101,4 +101,31 @@ other = "Tag"
other = "Tags"
[categories]
-other = "Categories" \ No newline at end of file
+other = "Categories"
+
+[search_label]
+other = "Search"
+
+[search_no_page_found]
+other = "No pages found."
+
+[search_results_for]
+other = "Results for"
+
+[search_one_page_found]
+other = "One page found"
+
+[search_pages_found]
+other = "pages found"
+
+[search_awaiting_search]
+other = "Awaiting search."
+
+[search_too_many]
+other = "Too many pages found. Please try to repeat the search using another term."
+
+[search_button_aria_label]
+other = "Run search."
+
+[search_input_title]
+other = "Search field. Accepts from 3 to 32 characters." \ No newline at end of file
diff --git a/i18n/pt.toml b/i18n/pt.toml
index 5a62db5..20b6c48 100644
--- a/i18n/pt.toml
+++ b/i18n/pt.toml
@@ -101,4 +101,31 @@ other = "Marcador"
other = "Marcadores"
[categories]
-other = "Categorias" \ No newline at end of file
+other = "Categorias"
+
+[search_label]
+other = "Busca"
+
+[search_no_page_found]
+other = "Nenhuma página encontrada."
+
+[search_results_for]
+other = "Resultados para"
+
+[search_one_page_found]
+other = "Uma página encontrada"
+
+[search_pages_found]
+other = "páginas encontradas"
+
+[search_awaiting_search]
+other = "Aguardando pesquisa."
+
+[search_too_many]
+other = "Muitas páginas encontradas. Por favor, tente repetir a busca usando outro termo."
+
+[search_button_aria_label]
+other = "Executar busca."
+
+[search_input_title]
+other = "Campo de busca. Aceita de 3 até 32 caracteres." \ No newline at end of file
diff --git a/layouts/_default/list.html b/layouts/_default/list.html
index 3070079..492b335 100644
--- a/layouts/_default/list.html
+++ b/layouts/_default/list.html
@@ -2,8 +2,16 @@
{{ $currentTitle := .Scratch.Get "currentTitle" }}
- <main class="list">
+ <!-- Collect pages using the "search" layout -->
+ {{ $searchPages := where .Site.RegularPages "Layout" "eq" "search" }}
+ <main class="list">
+
+ <!-- Display search form before listing posts -->
+ {{ if and .Site.Params.Search.enable (gt (len $searchPages) 0) (eq .Kind "section") }}
+ {{ partial "search-form" . }}
+ {{ end }}
+
<h1>{{ $currentTitle }}</h1>
{{ if eq .Kind "taxonomyTerm" }}
@@ -15,7 +23,6 @@
{{ else }}
{{ $pages := where site.RegularPages "Type" "in" .Site.Params.mainSections }}
-
{{ $paginator := .Paginate .Pages }}
<ul class="posts">
diff --git a/layouts/_default/search.html b/layouts/_default/search.html
new file mode 100644
index 0000000..851f6bf
--- /dev/null
+++ b/layouts/_default/search.html
@@ -0,0 +1,19 @@
+{{ define "main" }}
+
+ <main class="list">
+
+ {{ partial "search-form" . }}
+
+ <section id="search-info">
+ <!-- Info -->
+ </section>
+
+ <ul id="search-results" class="posts">
+ <!-- x-js-template -->
+ </ul>
+
+ <script id=search-result-template type=text/x-js-template><li><a class=btn href='${link}'><p>${title}</p>${date}</a></li></script>
+
+ </main>
+
+{{ end }}
diff --git a/layouts/_default/search.json.json b/layouts/_default/search.json.json
new file mode 100644
index 0000000..279aeb2
--- /dev/null
+++ b/layouts/_default/search.json.json
@@ -0,0 +1,82 @@
+{{- $stopWords := or .Params.stopWords .Site.Params.Search.stopWords -}}
+
+{{- $pages := where .Site.RegularPages "Type" "in" .Site.Params.mainSections -}}
+
+{{- $lastIndex := (sub (len $pages) 1) -}}
+
+{{- $.Scratch.Add "index" slice -}}
+
+{{- range $index, $page := $pages -}}
+
+ {{- $.Scratch.Delete "date" -}}
+ {{- $.Scratch.Delete "description" -}}
+ {{- $.Scratch.Delete "tags" -}}
+
+ {{- if not .Date.IsZero -}}
+ {{- $.Scratch.Set "date" (.Date.Format "2006-01-02") -}}
+ {{- end -}}
+
+ {{- if .Description -}}
+ {{- $.Scratch.Set "description" (.Description | emojify) -}}
+ {{- end -}}
+
+ {{- if .Params.tags -}}
+ {{- $.Scratch.Set "tags" .Params.tags -}}
+ {{- end -}}
+
+ {{- $scratch := newScratch -}}
+
+ {{- $content := (.Content | replaceRE "(?s)<div class=\"highlight\".*?</div>" "" ) -}}
+ {{- $content := ($content | replaceRE "(?s)<p class=\"error\".*?</p>" "" ) -}}
+ {{- $content := ($content | replaceRE "<code.*?</code>" "" ) -}}
+ {{- $content := ($content | replaceRE "(http|https)\\S+" "" ) -}}
+ {{- $content := ($content | replaceRE "<!--(.|\n)+?-->" "" ) -}}
+ {{- $content := ($content | plainify | emojify | lower) -}}
+ {{- $content := (replaceRE "\"" "" $content) -}}
+ {{- $content := (replaceRE "&ldquo;" "" $content) -}}
+ {{- $content := (replaceRE "&rdquo;" "" $content) -}}
+ {{- $content := (replaceRE "\n+" " " $content) -}}
+ {{- $content := (replaceRE "\r+" " " $content) -}}
+ {{- $content := (replaceRE "\t+" " " $content) -}}
+ {{- $content := (replaceRE "&lt;" "" $content) -}}
+ {{- $content := (replaceRE "&gt;" "" $content) -}}
+ {{- $content := (replaceRE "&hellip;" "" $content) -}}
+ {{- $content := (replaceRE "\\(" "" $content) -}}
+ {{- $content := (replaceRE "\\)" "" $content) -}}
+ {{- $content := (replaceRE "\\. " " " $content) -}}
+ {{- $content := (replaceRE "\\," "" $content) -}}
+ {{- $content := (replaceRE "\\:" "" $content) -}}
+ {{- $content := (replaceRE "\\;" "" $content) -}}
+ {{- $content := (replaceRE "\\!" "" $content) -}}
+ {{- $content := (replaceRE "\\?" "" $content) -}}
+ {{- $content := (replaceRE "\\/" " " $content) -}}
+ {{- $content := (replaceRE " +" " " $content) -}}
+ {{- $content := (trim $content " ") -}}
+ {{- $words := (split $content " ") -}}
+
+
+ {{- range $words -}}
+ {{- $word := (.) -}}
+ {{- if and (not (in ($scratch.Get "seenWords") $word)) (ne (substr $word 0 1) $word) (not (in $stopWords $word)) -}}
+ {{- $.Scratch.Add "currentWords" (slice $word) -}}
+ {{- end -}}
+ {{- $scratch.Add "seenWords" (slice $word) -}}
+ {{- end -}}
+
+ {{- $scratch.Delete "seenWords" -}}
+
+
+ {{- $filtered := ($.Scratch.Get "currentWords") -}}
+
+ {{- if $filtered -}}
+ {{- $.Scratch.Set "uniqueContent" (delimit $filtered " ") -}}
+ {{- end -}}
+
+
+ {{- $.Scratch.Add "index" (dict "title" (.Title | emojify) "date" ($.Scratch.Get "date") "description" ($.Scratch.Get "description") "content" ($.Scratch.Get "uniqueContent") "permalink" .Permalink "tags" ($.Scratch.Get "tags")) -}}
+
+ {{- $.Scratch.Delete "currentWords" -}}
+
+{{- end -}}
+
+{{- $.Scratch.Get "index" | jsonify -}}
diff --git a/layouts/partials/search-form.html b/layouts/partials/search-form.html
new file mode 100644
index 0000000..cea29c8
--- /dev/null
+++ b/layouts/partials/search-form.html
@@ -0,0 +1,18 @@
+{{ $icons := (.Scratch.Get "svgBundle").RelPermalink }}
+
+<!--
+ Assume that the first page in a collection with pages
+ using the "search" layout is the main search page
+-->
+{{ $searchPage := index (where .Site.RegularPages "Layout" "eq" "search") 0 }}
+
+<section class="req-js search-box">
+ {{ if eq .Layout "search" }}
+ <form role="search">
+ {{ else }}
+ <form role="search" action="{{ $searchPage.RelPermalink }}">
+ {{ end }}
+ <label for="search">{{ T "search_label" }}</label><input type="search" id="search" title='{{ T "search_input_title" }}' name="q" {{ with .Site.Params.Search.placeholder }}placeholder="{{ . }}"{{ end }} minlength="3" maxlength="32" pattern="^[\S].*" required><button aria-label='{{ T "search_button_aria_label" }}' type="submit"><svg aria-hidden="true"><use xlink:href="{{ $icons }}#search"/></svg></button>
+ </form>
+ <hr>
+</section>
diff --git a/theme.toml b/theme.toml
index 8020558..1a9115f 100644
--- a/theme.toml
+++ b/theme.toml
@@ -17,6 +17,7 @@ tags = [
"minimalist",
"personal",
"responsive",
+ "search",
"technical"
]
features = [