diff --git a/assets/css/main.css b/assets/css/main.css
index b165a55..30d03b1 100644
--- a/assets/css/main.css
+++ b/assets/css/main.css
@@ -257,3 +257,13 @@ hr {
border: 1px solid var(--border-color);
max-width: 800px;
}
+
+blockquote.twitter-tweet {
+ background: hsl(206deg 62% 45% / 10%);
+ border: none;
+ padding: 30px;
+ color: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ border-radius: 8px;
+}
diff --git a/static/fonts/Inter-Bold.woff b/assets/fonts/Inter-Bold.woff
similarity index 100%
rename from static/fonts/Inter-Bold.woff
rename to assets/fonts/Inter-Bold.woff
diff --git a/static/fonts/Inter-Bold.woff2 b/assets/fonts/Inter-Bold.woff2
similarity index 100%
rename from static/fonts/Inter-Bold.woff2
rename to assets/fonts/Inter-Bold.woff2
diff --git a/static/fonts/Inter-BoldItalic.woff b/assets/fonts/Inter-BoldItalic.woff
similarity index 100%
rename from static/fonts/Inter-BoldItalic.woff
rename to assets/fonts/Inter-BoldItalic.woff
diff --git a/static/fonts/Inter-BoldItalic.woff2 b/assets/fonts/Inter-BoldItalic.woff2
similarity index 100%
rename from static/fonts/Inter-BoldItalic.woff2
rename to assets/fonts/Inter-BoldItalic.woff2
diff --git a/static/fonts/Inter-Italic.woff b/assets/fonts/Inter-Italic.woff
similarity index 100%
rename from static/fonts/Inter-Italic.woff
rename to assets/fonts/Inter-Italic.woff
diff --git a/static/fonts/Inter-Italic.woff2 b/assets/fonts/Inter-Italic.woff2
similarity index 100%
rename from static/fonts/Inter-Italic.woff2
rename to assets/fonts/Inter-Italic.woff2
diff --git a/static/fonts/Inter-Medium.woff b/assets/fonts/Inter-Medium.woff
similarity index 100%
rename from static/fonts/Inter-Medium.woff
rename to assets/fonts/Inter-Medium.woff
diff --git a/static/fonts/Inter-Medium.woff2 b/assets/fonts/Inter-Medium.woff2
similarity index 100%
rename from static/fonts/Inter-Medium.woff2
rename to assets/fonts/Inter-Medium.woff2
diff --git a/static/fonts/Inter-MediumItalic.woff b/assets/fonts/Inter-MediumItalic.woff
similarity index 100%
rename from static/fonts/Inter-MediumItalic.woff
rename to assets/fonts/Inter-MediumItalic.woff
diff --git a/static/fonts/Inter-MediumItalic.woff2 b/assets/fonts/Inter-MediumItalic.woff2
similarity index 100%
rename from static/fonts/Inter-MediumItalic.woff2
rename to assets/fonts/Inter-MediumItalic.woff2
diff --git a/static/fonts/Inter-Regular.woff b/assets/fonts/Inter-Regular.woff
similarity index 100%
rename from static/fonts/Inter-Regular.woff
rename to assets/fonts/Inter-Regular.woff
diff --git a/static/fonts/Inter-Regular.woff2 b/assets/fonts/Inter-Regular.woff2
similarity index 100%
rename from static/fonts/Inter-Regular.woff2
rename to assets/fonts/Inter-Regular.woff2
diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html
index 6178ecf..9534fad 100644
--- a/layouts/partials/footer.html
+++ b/layouts/partials/footer.html
@@ -12,12 +12,7 @@
-{{ $opts := dict "noComments" true "minified" true "compact" true }}
-{{ $menu := resources.Get "js/menu.js" | js.Build | babel $opts }}
-{{ $theme := resources.Get "js/theme.js" | js.Build | babel $opts }}
-{{ $prism := resources.Get "js/prism.js" | js.Build | babel $opts }}
-
-
-
+
+
{{- partial "extended_footer.html" . }}
diff --git a/layouts/partials/head.html b/layouts/partials/head.html
index c7d5f98..afc0596 100644
--- a/layouts/partials/head.html
+++ b/layouts/partials/head.html
@@ -9,11 +9,7 @@
{{- partial "prepended_head.html" . }}
-{{ $css := resources.Get "css/style.css" }}
-{{ $opts := dict "inlineImports" true }}
-{{ $style := $css | resources.PostCSS $opts | minify }}
-
-
+
diff --git a/package.json b/package.json
index 4932505..a39938c 100644
--- a/package.json
+++ b/package.json
@@ -3,5 +3,57 @@
"version": "2.0.0",
"main": "index.js",
"author": "Radosław Kozieł <@panr> ",
- "license": "MIT"
+ "license": "MIT",
+ "scripts": {
+ "dev": "webpack --mode=development --watch",
+ "build": "webpack --mode=production"
+ },
+ "browserslist": [
+ "last 2 versions",
+ ">1%",
+ "not dead"
+ ],
+ "devDependencies": {
+ "@babel/cli": "^7.2.3",
+ "@babel/core": "^7.2.2",
+ "@babel/plugin-transform-runtime": "^7.2.0",
+ "@babel/preset-env": "^7.3.1",
+ "@babel/preset-stage-2": "^7.0.0",
+ "babel-eslint": "^8.2.1",
+ "babel-loader": "^8.0.5",
+ "browserslist": "^4.0.1",
+ "clean-webpack-plugin": "^0.1.19",
+ "clipboard": "^2.0.4",
+ "css-loader": "^1.0.1",
+ "cssnano": "^4.1.8",
+ "eslint-config-airbnb": "^17.1.0",
+ "eslint-config-prettier": "^2.10.0",
+ "eslint-plugin-jsx-a11y": "^6.2.1",
+ "extract-text-webpack-plugin": "^4.0.0-beta.0",
+ "file-loader": "^1.1.11",
+ "html-webpack-plugin": "^3.2.0",
+ "husky": "^4.2.5",
+ "postcss": "^7.0.0",
+ "postcss-browser-reporter": "^0.5.0",
+ "postcss-cli": "^6.1.1",
+ "postcss-import": "^11.1.0",
+ "postcss-loader": "^2.1.6",
+ "postcss-mixins": "^6.2.1",
+ "postcss-nested": "^3.0.0",
+ "postcss-preset-env": "^5.3.0",
+ "postcss-reporter": "^5.0.0",
+ "postcss-url": "^7.3.2",
+ "prettier-eslint-cli": "^4.7.1",
+ "ramda": "^0.25.0",
+ "style-loader": "^0.21.0",
+ "uglifyjs-webpack-plugin": "^1.3.0",
+ "url-loader": "^1.1.2",
+ "webpack": "^4.29.3",
+ "webpack-cli": "^3.2.3"
+ },
+ "husky": {
+ "hooks": {
+ "pre-push": "yarn build && git add . && git commit --amend --no-edit"
+ }
+ }
}
diff --git a/static/assets/417907d2be56d39b2a9c0b52fc8a00e8.woff b/static/assets/417907d2be56d39b2a9c0b52fc8a00e8.woff
new file mode 100644
index 0000000..fb79e91
Binary files /dev/null and b/static/assets/417907d2be56d39b2a9c0b52fc8a00e8.woff differ
diff --git a/static/assets/4dd66a113d54a7f9a1ae913049610617.woff2 b/static/assets/4dd66a113d54a7f9a1ae913049610617.woff2
new file mode 100644
index 0000000..d5ffd2a
Binary files /dev/null and b/static/assets/4dd66a113d54a7f9a1ae913049610617.woff2 differ
diff --git a/static/assets/565a7104c497ccb1bf12832d8b341861.woff2 b/static/assets/565a7104c497ccb1bf12832d8b341861.woff2
new file mode 100644
index 0000000..d32c111
Binary files /dev/null and b/static/assets/565a7104c497ccb1bf12832d8b341861.woff2 differ
diff --git a/static/assets/79260e5b693fac2ee373b659f01a2bdf.woff b/static/assets/79260e5b693fac2ee373b659f01a2bdf.woff
new file mode 100644
index 0000000..61e1c25
Binary files /dev/null and b/static/assets/79260e5b693fac2ee373b659f01a2bdf.woff differ
diff --git a/static/assets/7a8cc7241f766a142e15b2948804e547.woff b/static/assets/7a8cc7241f766a142e15b2948804e547.woff
new file mode 100644
index 0000000..8c36a63
Binary files /dev/null and b/static/assets/7a8cc7241f766a142e15b2948804e547.woff differ
diff --git a/static/assets/7c539936c4c8c822b59a1bcc6c08a6ec.woff b/static/assets/7c539936c4c8c822b59a1bcc6c08a6ec.woff
new file mode 100644
index 0000000..7d587c4
Binary files /dev/null and b/static/assets/7c539936c4c8c822b59a1bcc6c08a6ec.woff differ
diff --git a/static/assets/8ef77a031c5b96e53f2eeeb009232181.woff2 b/static/assets/8ef77a031c5b96e53f2eeeb009232181.woff2
new file mode 100644
index 0000000..80efd48
Binary files /dev/null and b/static/assets/8ef77a031c5b96e53f2eeeb009232181.woff2 differ
diff --git a/static/assets/9528384cf7aebfa81a198626cb05f5e8.woff2 b/static/assets/9528384cf7aebfa81a198626cb05f5e8.woff2
new file mode 100644
index 0000000..8559dfd
Binary files /dev/null and b/static/assets/9528384cf7aebfa81a198626cb05f5e8.woff2 differ
diff --git a/static/assets/aed27700d84e327fda56b4a427b03061.woff2 b/static/assets/aed27700d84e327fda56b4a427b03061.woff2
new file mode 100644
index 0000000..6c401bb
Binary files /dev/null and b/static/assets/aed27700d84e327fda56b4a427b03061.woff2 differ
diff --git a/static/assets/e0879d64763e509f309940120e7d1f5a.woff b/static/assets/e0879d64763e509f309940120e7d1f5a.woff
new file mode 100644
index 0000000..2de403e
Binary files /dev/null and b/static/assets/e0879d64763e509f309940120e7d1f5a.woff differ
diff --git a/static/assets/e4ad3666e223c64e4df963cec740bf09.woff b/static/assets/e4ad3666e223c64e4df963cec740bf09.woff
new file mode 100644
index 0000000..e7da666
Binary files /dev/null and b/static/assets/e4ad3666e223c64e4df963cec740bf09.woff differ
diff --git a/static/assets/f6cf0a0bc5fce3307e2c426eb14eb752.woff2 b/static/assets/f6cf0a0bc5fce3307e2c426eb14eb752.woff2
new file mode 100644
index 0000000..3b31d33
Binary files /dev/null and b/static/assets/f6cf0a0bc5fce3307e2c426eb14eb752.woff2 differ
diff --git a/static/assets/main.js b/static/assets/main.js
new file mode 100644
index 0000000..8003cc3
--- /dev/null
+++ b/static/assets/main.js
@@ -0,0 +1 @@
+!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){n(1),e.exports=n(2)},function(e,t){var n=document.querySelector(".container"),o=document.querySelector(".menu"),r=document.querySelector(".menu-trigger"),i=(document.querySelector(".menu__inner--desktop"),document.querySelector(".menu__sub-inner-more-trigger")),c=document.querySelector(".menu__sub-inner-more"),d=getComputedStyle(document.body).getPropertyValue("--phoneWidth"),u=function(){return window.matchMedia(d).matches},l=function(){r&&r.classList.toggle("hidden",!u()),o&&o.classList.toggle("hidden",u()),c&&c.classList.toggle("hidden",!u())};o&&o.addEventListener("click",function(e){return e.stopPropagation()}),c&&c.addEventListener("click",function(e){return e.stopPropagation()}),l(),document.body.addEventListener("click",function(){u()||!c||c.classList.contains("hidden")?u()&&!o.classList.contains("hidden")&&o.classList.add("hidden"):c.classList.add("hidden")}),window.addEventListener("resize",l),r&&r.addEventListener("click",function(e){e.stopPropagation(),o&&o.classList.toggle("hidden")}),i&&i.addEventListener("click",function(e){e.stopPropagation(),c&&c.classList.toggle("hidden"),c&&c.getBoundingClientRect().right>n.getBoundingClientRect().right&&(c.style.left="auto",c.style.right=0)})},function(e,t){var n=window.localStorage&&window.localStorage.getItem("theme"),o=document.querySelector(".theme-toggle"),r="dark"===n;null!==n&&document.body.classList.toggle("dark-theme",r),o.addEventListener("click",function(){document.body.classList.toggle("dark-theme"),window.localStorage&&window.localStorage.setItem("theme",document.body.classList.contains("dark-theme")?"dark":"light")})}]);
\ No newline at end of file
diff --git a/static/assets/prism.js b/static/assets/prism.js
new file mode 100644
index 0000000..b9f0153
--- /dev/null
+++ b/static/assets/prism.js
@@ -0,0 +1,8 @@
+!function(e){var t={};function n(a){if(t[a])return t[a].exports;var i=t[a]={i:a,l:!1,exports:{}};return e[a].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(a,i,function(t){return e[t]}.bind(null,i));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}([,,,function(e,t,n){(function(t){var a="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},i=function(){var e=/\blang(?:uage)?-([\w-]+)\b/i,t=0,n=a.Prism={manual:a.Prism&&a.Prism.manual,disableWorkerMessageHandler:a.Prism&&a.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof i?new i(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(k instanceof l)){if(f&&v!=t.length-1){if(p.lastIndex=w,!(C=p.exec(e)))break;for(var S=C.index+(m?C[1].length:0),x=C.index+C[0].length,A=v,E=w,L=t.length;L>A&&(x>E||!t[A].type&&!t[A-1].greedy);++A)S>=(E+=t[A].length)&&(++v,w=E);if(t[v]instanceof l)continue;_=A-v,k=e.slice(w,E),C.index-=w}else{p.lastIndex=0;var C=p.exec(k),_=1}if(C){m&&(b=C[1]?C[1].length:0);x=(S=C.index+b)+(C=C[0].slice(b)).length;var T=k.slice(0,S),I=k.slice(x),R=[v,_];T&&(++v,w+=T.length,R.push(T));var P=new l(c,g?n.tokenize(C,g):C,h,C,f);if(R.push(P),I&&R.push(I),Array.prototype.splice.apply(t,R),1!=_&&n.matchGrammar(e,t,a,v,w,!0,c),o)break}else if(o)break}}}}},tokenize:function(e,t){var a=[e],i=t.rest;if(i){for(var r in i)t[r]=i[r];delete t.rest}return n.matchGrammar(e,a,t,0,0,!1),a},hooks:{all:{},add:function(e,t){var a=n.hooks.all;a[e]=a[e]||[],a[e].push(t)},run:function(e,t){var a=n.hooks.all[e];if(a&&a.length)for(var i,r=0;i=a[r++];)i(t)}}},i=n.Token=function(e,t,n,a,i){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length,this.greedy=!!i};if(i.stringify=function(e,t,a){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return i.stringify(n,t,e)}).join("");var r={type:e.type,content:i.stringify(e.content,t,a),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:a};if(e.alias){var o="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(r.classes,o)}n.hooks.run("wrap",r);var s=Object.keys(r.attributes).map(function(e){return e+'="'+(r.attributes[e]||"").replace(/"/g,""")+'"'}).join(" ");return"<"+r.tag+' class="'+r.classes.join(" ")+'"'+(s?" "+s:"")+">"+r.content+""+r.tag+">"},!a.document)return a.addEventListener?(n.disableWorkerMessageHandler||a.addEventListener("message",function(e){var t=JSON.parse(e.data),i=t.language,r=t.code,o=t.immediateClose;a.postMessage(n.highlight(r,n.languages[i],i)),o&&a.close()},!1),a.Prism):a.Prism;var r=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return r&&(n.filename=r.src,n.manual||r.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),a.Prism}();e.exports&&(e.exports=i),void 0!==t&&(t.Prism=i),i.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\])["']/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/?[\da-z]{1,8};/i},i.languages.markup.tag.inside["attr-value"].inside.entity=i.languages.markup.entity,i.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),i.languages.xml=i.languages.markup,i.languages.html=i.languages.markup,i.languages.mathml=i.languages.markup,i.languages.svg=i.languages.markup,i.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?[\s\S]*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},i.languages.css.atrule.inside.rest=i.languages.css,i.languages.markup&&(i.languages.insertBefore("markup","tag",{style:{pattern:/(