From c7219f89432b4998439ea62994e10cb2162c1511 Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Wed, 13 Mar 2019 12:25:43 +0300 Subject: [PATCH] Some design updates (#70) * Auth page styles improved * styles updated * upd bundles --- public/dist/editor.bundle.js | 2 +- public/dist/main.bundle.js | 2 +- public/dist/main.css | 2 +- src/frontend/js/classes/editor.js | 2 +- src/frontend/js/modules/page.js | 2 +- src/frontend/styles/components/aside.pcss | 24 +++- src/frontend/styles/components/auth.pcss | 33 +++++ src/frontend/styles/components/page.pcss | 131 ++++++++++++++++++-- src/frontend/styles/components/writing.pcss | 24 +++- src/frontend/styles/main.pcss | 1 + src/frontend/styles/vars.pcss | 24 ++-- src/models/page.js | 11 +- src/routes/auth.js | 1 - src/routes/middlewares/token.js | 1 + src/utils/twig.js | 12 ++ src/utils/urlify.js | 33 +++++ src/views/auth.twig | 11 +- src/views/pages/blocks/code.twig | 4 +- src/views/pages/blocks/header.twig | 8 +- src/views/pages/form.twig | 8 +- 20 files changed, 288 insertions(+), 48 deletions(-) create mode 100644 src/frontend/styles/components/auth.pcss create mode 100644 src/utils/urlify.js diff --git a/public/dist/editor.bundle.js b/public/dist/editor.bundle.js index d30057d..ccf8f49 100644 --- a/public/dist/editor.bundle.js +++ b/public/dist/editor.bundle.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{104:function(t,e,n){"use strict";n.r(e),n.d(e,"default",function(){return w});n(12),n(69);var r=n(73),o=n.n(r),i=n(74),a=n.n(i),s=n(75),c=n.n(s),u=n(76),l=n.n(u),f=n(77),d=n.n(f),p=n(78),h=n.n(p),v=n(79),g=n.n(v),y=n(80),m=n.n(y),b=n(81),k=n.n(b);function x(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t);var r={tools:{header:{class:a.a,inlineToolbar:["link","marker","inlineCode"],config:{placeholder:n.headerPlaceholder||""}},image:{class:c.a,inlineToolbar:!0,config:{types:"image/*, video/mp4",endpoints:{byFile:"/api/transport/image",byUrl:"/api/transport/fetch"},additionalRequestData:{map:JSON.stringify({path:"file:url",size:"file:size",mimetype:"file:mime"})}}},code:{class:l.a,shortcut:"CMD+SHIFT+D"},list:{class:d.a,inlineToolbar:!0},delimiter:h.a,table:{class:g.a,inlineToolbar:!0},inlineCode:{class:m.a,shortcut:"CMD+SHIFT+C"},marker:{class:k.a,shortcut:"CMD+SHIFT+M"}},data:{blocks:[{type:"header",data:{text:"",level:2}}]}};this.editor=new o.a(Object.assign(r,e))}var e,n,r;return e=t,(n=[{key:"save",value:function(){return this.editor.saver.save()}}])&&x(e.prototype,n),r&&x(e,r),t}()},59:function(t,e,n){var r=n(60),o=n(17);t.exports=function(t){return r(o(t))}},60:function(t,e,n){var r=n(11);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},61:function(t,e,n){var r=n(31)("keys"),o=n(20);t.exports=function(t){return r[t]||(r[t]=o(t))}},62:function(t,e,n){var r=n(17);t.exports=function(t){return Object(r(t))}},63:function(t,e,n){var r=n(65),o=n(64);t.exports=Object.keys||function(t){return r(t,o)}},64:function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},65:function(t,e,n){var r=n(18),o=n(59),i=n(66)(!1),a=n(61)("IE_PROTO");t.exports=function(t,e){var n,s=o(t),c=0,u=[];for(n in s)n!=a&&r(s,n)&&u.push(n);for(;e.length>c;)r(s,n=e[c++])&&(~i(u,n)||u.push(n));return u}},66:function(t,e,n){var r=n(59),o=n(16),i=n(67);t.exports=function(t){return function(e,n,a){var s,c=r(e),u=o(c.length),l=i(a,u);if(t&&n!=n){for(;u>l;)if((s=c[l++])!=s)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}}},67:function(t,e,n){var r=n(21),o=Math.max,i=Math.min;t.exports=function(t,e){return(t=r(t))<0?o(t+e,0):i(t,e)}},69:function(t,e,n){var r=n(9);r(r.S+r.F,"Object",{assign:n(70)})},70:function(t,e,n){"use strict";var r=n(63),o=n(71),i=n(72),a=n(62),s=n(60),c=Object.assign;t.exports=!c||n(13)(function(){var t={},e={},n=Symbol(),r="abcdefghijklmnopqrst";return t[n]=7,r.split("").forEach(function(t){e[t]=t}),7!=c({},t)[n]||Object.keys(c({},e)).join("")!=r})?function(t,e){for(var n=a(t),c=arguments.length,u=1,l=o.f,f=i.f;c>u;)for(var d,p=s(arguments[u++]),h=l?r(p).concat(l(p)):r(p),v=h.length,g=0;v>g;)f.call(p,d=h[g++])&&(n[d]=p[d]);return n}:c},71:function(t,e){e.f=Object.getOwnPropertySymbols},72:function(t,e){e.f={}.propertyIsEnumerable},73:function(t,e,n){ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{104:function(t,e,n){"use strict";n.r(e),n.d(e,"default",function(){return w});n(12),n(69);var r=n(73),o=n.n(r),i=n(74),a=n.n(i),s=n(75),c=n.n(s),u=n(76),l=n.n(u),f=n(77),d=n.n(f),p=n(78),h=n.n(p),v=n(79),g=n.n(v),y=n(80),m=n.n(y),b=n(81),k=n.n(b);function x(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t);var r={tools:{header:{class:a.a,inlineToolbar:["marker","inlineCode"],config:{placeholder:n.headerPlaceholder||""}},image:{class:c.a,inlineToolbar:!0,config:{types:"image/*, video/mp4",endpoints:{byFile:"/api/transport/image",byUrl:"/api/transport/fetch"},additionalRequestData:{map:JSON.stringify({path:"file:url",size:"file:size",mimetype:"file:mime"})}}},code:{class:l.a,shortcut:"CMD+SHIFT+D"},list:{class:d.a,inlineToolbar:!0},delimiter:h.a,table:{class:g.a,inlineToolbar:!0},inlineCode:{class:m.a,shortcut:"CMD+SHIFT+C"},marker:{class:k.a,shortcut:"CMD+SHIFT+M"}},data:{blocks:[{type:"header",data:{text:"",level:2}}]}};this.editor=new o.a(Object.assign(r,e))}var e,n,r;return e=t,(n=[{key:"save",value:function(){return this.editor.saver.save()}}])&&x(e.prototype,n),r&&x(e,r),t}()},59:function(t,e,n){var r=n(60),o=n(17);t.exports=function(t){return r(o(t))}},60:function(t,e,n){var r=n(11);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},61:function(t,e,n){var r=n(31)("keys"),o=n(20);t.exports=function(t){return r[t]||(r[t]=o(t))}},62:function(t,e,n){var r=n(17);t.exports=function(t){return Object(r(t))}},63:function(t,e,n){var r=n(65),o=n(64);t.exports=Object.keys||function(t){return r(t,o)}},64:function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},65:function(t,e,n){var r=n(18),o=n(59),i=n(66)(!1),a=n(61)("IE_PROTO");t.exports=function(t,e){var n,s=o(t),c=0,u=[];for(n in s)n!=a&&r(s,n)&&u.push(n);for(;e.length>c;)r(s,n=e[c++])&&(~i(u,n)||u.push(n));return u}},66:function(t,e,n){var r=n(59),o=n(16),i=n(67);t.exports=function(t){return function(e,n,a){var s,c=r(e),u=o(c.length),l=i(a,u);if(t&&n!=n){for(;u>l;)if((s=c[l++])!=s)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}}},67:function(t,e,n){var r=n(21),o=Math.max,i=Math.min;t.exports=function(t,e){return(t=r(t))<0?o(t+e,0):i(t,e)}},69:function(t,e,n){var r=n(9);r(r.S+r.F,"Object",{assign:n(70)})},70:function(t,e,n){"use strict";var r=n(63),o=n(71),i=n(72),a=n(62),s=n(60),c=Object.assign;t.exports=!c||n(13)(function(){var t={},e={},n=Symbol(),r="abcdefghijklmnopqrst";return t[n]=7,r.split("").forEach(function(t){e[t]=t}),7!=c({},t)[n]||Object.keys(c({},e)).join("")!=r})?function(t,e){for(var n=a(t),c=arguments.length,u=1,l=o.f,f=i.f;c>u;)for(var d,p=s(arguments[u++]),h=l?r(p).concat(l(p)):r(p),v=h.length,g=0;v>g;)f.call(p,d=h[g++])&&(n[d]=p[d]);return n}:c},71:function(t,e){e.f=Object.getOwnPropertySymbols},72:function(t,e){e.f={}.propertyIsEnumerable},73:function(t,e,n){ /*! * Editor.js * diff --git a/public/dist/main.bundle.js b/public/dist/main.bundle.js index ae8b523..2ad8435 100644 --- a/public/dist/main.bundle.js +++ b/public/dist/main.bundle.js @@ -7,4 +7,4 @@ var Docs=function(t){function e(e){for(var n,r,i=e[0],a=e[1],u=0,c=[];u0&&void 0!==arguments[0]?arguments[0]:{};o(this,t),this.Library=e.Library||window,this.modules=this.findModules(document),this.initModules()}return i(t,[{key:"findModules",value:function(t){for(var e=[],n=t.querySelectorAll("[data-module]"),o=n.length-1;o>=0;o--)e.push.apply(e,r(this.extractModulesData(n[o])));return e}},{key:"extractModulesData",value:function(t){var e=this,n=[],r=t.dataset.module;return(r=r.replace(/\s+/," ")).split(" ").forEach(function(r,o){var i=new a({name:r,element:t,settings:e.getModuleSettings(t,o,r),moduleClass:e.Library[r]});n.push(i)}),n}},{key:"getModuleSettings",value:function(t,e,n){var r=t.querySelector('textarea[name="module-settings"]'),o=void 0;if(!r)return null;try{o=r.value.trim(),o=JSON.parse(o)}catch(t){return console.warn("Can not parse Module «"+n+"» settings because of: "+t),console.groupCollapsed(n+" settings"),console.log(o),console.groupEnd(),null}return Array.isArray(o)?o[e]?o[e]:null:0===e?o:(console.warn("Wrong settings format. For several Modules use an array instead of object."),null)}},{key:"initModules",value:function(){console.groupCollapsed("ModuleDispatcher"),this.modules.forEach(function(t){t.init()}),console.groupEnd()}}]),t}();e.default=u}]).default},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r=n(5),o=n(0),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(23)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e,n){var r=n(6).f,o=n(18),i=n(1)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){var r=n(2);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(e){var i=t.return;throw void 0!==i&&r(i.call(t)),e}}},function(t,e,n){var r=n(19),o=n(1)("iterator"),i=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||i[o]===t)}},function(t,e,n){var r=n(15),o=n(1)("iterator"),i=n(19);t.exports=n(5).getIteratorMethod=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){var r=n(0).document;t.exports=r&&r.documentElement},function(t,e,n){var r=n(1)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},t(i)}catch(t){}return n}},function(t,e,n){var r=n(21),o=n(17);t.exports=function(t){return function(e,n){var i,a,u=String(o(e)),c=r(n),s=u.length;return c<0||c>=s?t?"":void 0:(i=u.charCodeAt(c))<55296||i>56319||c+1===s||(a=u.charCodeAt(c+1))<56320||a>57343?t?u.charAt(c):i:t?u.slice(c,c+2):a-56320+(i-55296<<10)+65536}}},function(t,e,n){t.exports=!n(4)&&!n(13)(function(){return 7!=Object.defineProperty(n(22)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(3);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){},function(t,e){t.exports=function(t,e,n,r){if(!(t instanceof e)||void 0!==r&&r in t)throw TypeError(n+": incorrect invocation!");return t}},function(t,e,n){var r=n(7),o=n(33),i=n(34),a=n(2),u=n(16),c=n(35),s={},l={};(e=t.exports=function(t,e,n,f,h){var p,d,v,y,g=h?function(){return t}:c(t),m=r(n,f,e?2:1),x=0;if("function"!=typeof g)throw TypeError(t+" is not iterable!");if(i(g)){for(p=u(t.length);p>x;x++)if((y=e?m(a(d=t[x])[0],d[1]):m(t[x]))===s||y===l)return y}else for(v=g.call(t);!(d=v.next()).done;)if((y=o(v,m,d.value,e))===s||y===l)return y}).BREAK=s,e.RETURN=l},function(t,e,n){var r=n(2),o=n(8),i=n(1)("species");t.exports=function(t,e){var n,a=r(t).constructor;return void 0===a||null==(n=r(a)[i])?e:o(n)}},function(t,e){t.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},function(t,e,n){var r=n(0),o=n(25).set,i=r.MutationObserver||r.WebKitMutationObserver,a=r.process,u=r.Promise,c="process"==n(11)(a);t.exports=function(){var t,e,n,s=function(){var r,o;for(c&&(r=a.domain)&&r.exit();t;){o=t.fn,t=t.next;try{o()}catch(r){throw t?n():e=void 0,r}}e=void 0,r&&r.enter()};if(c)n=function(){a.nextTick(s)};else if(!i||r.navigator&&r.navigator.standalone)if(u&&u.resolve){var l=u.resolve(void 0);n=function(){l.then(s)}}else n=function(){o.call(r,s)};else{var f=!0,h=document.createTextNode("");new i(s).observe(h,{characterData:!0}),n=function(){h.data=f=!f}}return function(r){var o={fn:r,next:void 0};e&&(e.next=o),t||(t=o,n()),e=o}}},function(t,e){t.exports=function(t){try{return{e:!1,v:t()}}catch(t){return{e:!0,v:t}}}},function(t,e,n){var r=n(0).navigator;t.exports=r&&r.userAgent||""},function(t,e,n){var r=n(2),o=n(3),i=n(26);t.exports=function(t,e){if(r(t),o(e)&&e.constructor===t)return e;var n=i.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){var r=n(14);t.exports=function(t,e,n){for(var o in e)r(t,o,e[o],n);return t}},function(t,e,n){"use strict";var r=n(0),o=n(6),i=n(4),a=n(1)("species");t.exports=function(t){var e=r[t];i&&e&&!e[a]&&o.f(e,a,{configurable:!0,get:function(){return this}})}},function(t,e,n){"use strict";var r=n(2),o=n(16),i=n(53),a=n(54);n(55)("match",1,function(t,e,n,u){return[function(n){var r=t(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,r):new RegExp(n)[e](String(r))},function(t){var e=u(n,t,this);if(e.done)return e.value;var c=r(t),s=String(this);if(!c.global)return a(c,s);var l=c.unicode;c.lastIndex=0;for(var f,h=[],p=0;null!==(f=a(c,s));){var d=String(f[0]);h[p]=d,""===d&&(c.lastIndex=i(s,o(c.lastIndex),l)),p++}return 0===p?null:h}]})},function(t,e,n){"use strict";var r=n(38)(!0);t.exports=function(t,e,n){return e+(n?r(t,e).length:1)}},function(t,e,n){"use strict";var r=n(15),o=RegExp.prototype.exec;t.exports=function(t,e){var n=t.exec;if("function"==typeof n){var i=n.call(t,e);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw new TypeError("RegExp#exec called on incompatible receiver");return o.call(t,e)}},function(t,e,n){"use strict";n(56);var r=n(14),o=n(10),i=n(13),a=n(17),u=n(1),c=n(27),s=u("species"),l=!i(function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")}),f=function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();t.exports=function(t,e,n){var h=u(t),p=!i(function(){var e={};return e[h]=function(){return 7},7!=""[t](e)}),d=p?!i(function(){var e=!1,n=/a/;return n.exec=function(){return e=!0,null},"split"===t&&(n.constructor={},n.constructor[s]=function(){return n}),n[h](""),!e}):void 0;if(!p||!d||"replace"===t&&!l||"split"===t&&!f){var v=/./[h],y=n(a,h,""[t],function(t,e,n,r,o){return e.exec===c?p&&!o?{done:!0,value:v.call(e,n,r)}:{done:!0,value:t.call(n,e,r)}:{done:!1}}),g=y[0],m=y[1];r(String.prototype,t,g),o(RegExp.prototype,h,2==e?function(t,e){return m.call(t,this,e)}:function(t){return m.call(t,this)})}}},function(t,e,n){"use strict";var r=n(27);n(9)({target:"RegExp",proto:!0,forced:r!==/./.exec},{exec:r})},function(t,e,n){"use strict";var r=n(2);t.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},function(t,e,n){"use strict";n.r(e);n(12),n(41);var r=n(29),o=n.n(r);n(24),n(52),n(28);function i(t,e,n,r,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void n(t)}u.done?e(c):Promise.resolve(c).then(r,o)}function a(t){return function(){var e=this,n=arguments;return new Promise(function(r,o){var a=t.apply(e,n);function u(t){i(a,r,o,u,c,"next",t)}function c(t){i(a,r,o,u,c,"throw",t)}u(void 0)})}}function u(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;this.nodes.editorWrapper=document.getElementById("codex-editor"),e.page&&(this.page=e.page),this.loadEditor().then(function(e){t.editor=e}),this.nodes.saveButton=n.querySelector('[name="js-submit-save"]'),this.nodes.saveButton.addEventListener("click",function(){t.saveButtonClicked()}),this.nodes.removeButton=n.querySelector('[name="js-submit-remove"]'),this.nodes.removeButton&&this.nodes.removeButton.addEventListener("click",function(){window.confirm("Are you sure?")&&t.removeButtonClicked()}),this.nodes.parentIdSelector=n.querySelector('[name="parent"]'),this.nodes.putAboveIdSelector=n.querySelector('[name="above"]'),this.nodes.uriInput=n.querySelector('[name="uri-input"]')}},{key:"loadEditor",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,r,o;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,n.e(1).then(n.bind(null,104));case 2:return e=t.sent,r=e.default,o=this.page?{data:this.page.body}:{},t.abrupt("return",new r(o,{headerPlaceholder:"Enter a title"}));case 6:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()},{key:"getData",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,n,r,o,i;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.editor.save();case 2:if(e=t.sent,n=e.blocks.length?e.blocks[0]:null,r=n&&"header"===n.type?n.data.text:null,o="",!this.nodes.uriInput||!this.nodes.uriInput.value){t.next=12;break}if(!this.nodes.uriInput.value.match(/^[a-z0-9'-]+$/i)){t.next=11;break}o=this.nodes.uriInput.value,t.next=12;break;case 11:throw new Error("Uri has unexpected characters");case 12:if(r){t.next=14;break}throw new Error("Entry should start with Header");case 14:return i=null,this.nodes.putAboveIdSelector&&(i=this.nodes.putAboveIdSelector.value),t.abrupt("return",{parent:this.nodes.parentIdSelector.value,putAbovePageId:i,uri:o,body:e});case 17:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()},{key:"saveButtonClicked",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,n,r;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.getData();case 3:return e=t.sent,n=this.page?"/api/page/"+this.page._id:"/api/page",t.prev=5,t.next=8,fetch(n,{method:this.page?"POST":"PUT",headers:{"Content-Type":"application/json; charset=utf-8"},body:JSON.stringify(e)});case 8:return r=t.sent,t.next=11,r.json();case 11:(r=t.sent).success?window.location.pathname=r.result.uri?r.result.uri:"/page/"+r.result._id:(alert(r.error),console.log("Validation failed:",r.error)),t.next=18;break;case 15:t.prev=15,t.t0=t.catch(5),console.log("Saving request failed:",t.t0);case 18:t.next=24;break;case 20:t.prev=20,t.t1=t.catch(0),alert(t.t1),console.log("Saving error: ",t.t1);case 24:case"end":return t.stop()}},t,this,[[0,20],[5,15]])}));return function(){return t.apply(this,arguments)}}()},{key:"removeButtonClicked",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,n;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,e=this.page?"/api/page/"+this.page._id:"",t.next=4,fetch(e,{method:"DELETE"});case 4:return n=t.sent,t.next=7,n.json();case 7:(n=t.sent).success?n.result&&n.result._id?document.location="/page/"+n.result._id:document.location="/":(alert(n.error),console.log("Server fetch failed:",n.error)),t.next=14;break;case 11:t.prev=11,t.t0=t.catch(0),console.log("Server fetch failed due to the:",t.t0);case 14:case"end":return t.stop()}},t,this,[[0,11]])}));return function(){return t.apply(this,arguments)}}()}])&&u(e.prototype,r),o&&u(e,o),t}();function s(t,e,n,r,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void n(t)}u.done?e(c):Promise.resolve(c).then(r,o)}function l(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0],arguments.length>1&&arguments[1];this.codeStyler=this.createCodeStyling()}},{key:"createCodeStyling",value:function(){var t,e=(t=regeneratorRuntime.mark(function t(){var e,r;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,n.e(0).then(n.bind(null,105));case 2:return e=t.sent,r=e.default,t.abrupt("return",new r({selector:".block-code"}));case 5:case"end":return t.stop()}},t,this)}),function(){var e=this,n=arguments;return new Promise(function(r,o){var i=t.apply(e,n);function a(t){s(i,r,o,a,u,"next",t)}function u(t){s(i,r,o,a,u,"throw",t)}a(void 0)})});return function(){return e.apply(this,arguments)}}()}])&&l(e.prototype,r),o&&l(e,o),t}();function h(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};o(this,t),this.Library=e.Library||window,this.modules=this.findModules(document),this.initModules()}return i(t,[{key:"findModules",value:function(t){for(var e=[],n=t.querySelectorAll("[data-module]"),o=n.length-1;o>=0;o--)e.push.apply(e,r(this.extractModulesData(n[o])));return e}},{key:"extractModulesData",value:function(t){var e=this,n=[],r=t.dataset.module;return(r=r.replace(/\s+/," ")).split(" ").forEach(function(r,o){var i=new a({name:r,element:t,settings:e.getModuleSettings(t,o,r),moduleClass:e.Library[r]});n.push(i)}),n}},{key:"getModuleSettings",value:function(t,e,n){var r=t.querySelector('textarea[name="module-settings"]'),o=void 0;if(!r)return null;try{o=r.value.trim(),o=JSON.parse(o)}catch(t){return console.warn("Can not parse Module «"+n+"» settings because of: "+t),console.groupCollapsed(n+" settings"),console.log(o),console.groupEnd(),null}return Array.isArray(o)?o[e]?o[e]:null:0===e?o:(console.warn("Wrong settings format. For several Modules use an array instead of object."),null)}},{key:"initModules",value:function(){console.groupCollapsed("ModuleDispatcher"),this.modules.forEach(function(t){t.init()}),console.groupEnd()}}]),t}();e.default=u}]).default},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r=n(5),o=n(0),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(23)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e,n){var r=n(6).f,o=n(18),i=n(1)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){var r=n(2);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(e){var i=t.return;throw void 0!==i&&r(i.call(t)),e}}},function(t,e,n){var r=n(19),o=n(1)("iterator"),i=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||i[o]===t)}},function(t,e,n){var r=n(15),o=n(1)("iterator"),i=n(19);t.exports=n(5).getIteratorMethod=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){var r=n(0).document;t.exports=r&&r.documentElement},function(t,e,n){var r=n(1)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},t(i)}catch(t){}return n}},function(t,e,n){var r=n(21),o=n(17);t.exports=function(t){return function(e,n){var i,a,u=String(o(e)),c=r(n),s=u.length;return c<0||c>=s?t?"":void 0:(i=u.charCodeAt(c))<55296||i>56319||c+1===s||(a=u.charCodeAt(c+1))<56320||a>57343?t?u.charAt(c):i:t?u.slice(c,c+2):a-56320+(i-55296<<10)+65536}}},function(t,e,n){t.exports=!n(4)&&!n(13)(function(){return 7!=Object.defineProperty(n(22)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(3);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){},function(t,e){t.exports=function(t,e,n,r){if(!(t instanceof e)||void 0!==r&&r in t)throw TypeError(n+": incorrect invocation!");return t}},function(t,e,n){var r=n(7),o=n(33),i=n(34),a=n(2),u=n(16),c=n(35),s={},l={};(e=t.exports=function(t,e,n,f,h){var p,d,v,y,g=h?function(){return t}:c(t),m=r(n,f,e?2:1),x=0;if("function"!=typeof g)throw TypeError(t+" is not iterable!");if(i(g)){for(p=u(t.length);p>x;x++)if((y=e?m(a(d=t[x])[0],d[1]):m(t[x]))===s||y===l)return y}else for(v=g.call(t);!(d=v.next()).done;)if((y=o(v,m,d.value,e))===s||y===l)return y}).BREAK=s,e.RETURN=l},function(t,e,n){var r=n(2),o=n(8),i=n(1)("species");t.exports=function(t,e){var n,a=r(t).constructor;return void 0===a||null==(n=r(a)[i])?e:o(n)}},function(t,e){t.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},function(t,e,n){var r=n(0),o=n(25).set,i=r.MutationObserver||r.WebKitMutationObserver,a=r.process,u=r.Promise,c="process"==n(11)(a);t.exports=function(){var t,e,n,s=function(){var r,o;for(c&&(r=a.domain)&&r.exit();t;){o=t.fn,t=t.next;try{o()}catch(r){throw t?n():e=void 0,r}}e=void 0,r&&r.enter()};if(c)n=function(){a.nextTick(s)};else if(!i||r.navigator&&r.navigator.standalone)if(u&&u.resolve){var l=u.resolve(void 0);n=function(){l.then(s)}}else n=function(){o.call(r,s)};else{var f=!0,h=document.createTextNode("");new i(s).observe(h,{characterData:!0}),n=function(){h.data=f=!f}}return function(r){var o={fn:r,next:void 0};e&&(e.next=o),t||(t=o,n()),e=o}}},function(t,e){t.exports=function(t){try{return{e:!1,v:t()}}catch(t){return{e:!0,v:t}}}},function(t,e,n){var r=n(0).navigator;t.exports=r&&r.userAgent||""},function(t,e,n){var r=n(2),o=n(3),i=n(26);t.exports=function(t,e){if(r(t),o(e)&&e.constructor===t)return e;var n=i.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){var r=n(14);t.exports=function(t,e,n){for(var o in e)r(t,o,e[o],n);return t}},function(t,e,n){"use strict";var r=n(0),o=n(6),i=n(4),a=n(1)("species");t.exports=function(t){var e=r[t];i&&e&&!e[a]&&o.f(e,a,{configurable:!0,get:function(){return this}})}},function(t,e,n){"use strict";var r=n(2),o=n(16),i=n(53),a=n(54);n(55)("match",1,function(t,e,n,u){return[function(n){var r=t(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,r):new RegExp(n)[e](String(r))},function(t){var e=u(n,t,this);if(e.done)return e.value;var c=r(t),s=String(this);if(!c.global)return a(c,s);var l=c.unicode;c.lastIndex=0;for(var f,h=[],p=0;null!==(f=a(c,s));){var d=String(f[0]);h[p]=d,""===d&&(c.lastIndex=i(s,o(c.lastIndex),l)),p++}return 0===p?null:h}]})},function(t,e,n){"use strict";var r=n(38)(!0);t.exports=function(t,e,n){return e+(n?r(t,e).length:1)}},function(t,e,n){"use strict";var r=n(15),o=RegExp.prototype.exec;t.exports=function(t,e){var n=t.exec;if("function"==typeof n){var i=n.call(t,e);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw new TypeError("RegExp#exec called on incompatible receiver");return o.call(t,e)}},function(t,e,n){"use strict";n(56);var r=n(14),o=n(10),i=n(13),a=n(17),u=n(1),c=n(27),s=u("species"),l=!i(function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")}),f=function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();t.exports=function(t,e,n){var h=u(t),p=!i(function(){var e={};return e[h]=function(){return 7},7!=""[t](e)}),d=p?!i(function(){var e=!1,n=/a/;return n.exec=function(){return e=!0,null},"split"===t&&(n.constructor={},n.constructor[s]=function(){return n}),n[h](""),!e}):void 0;if(!p||!d||"replace"===t&&!l||"split"===t&&!f){var v=/./[h],y=n(a,h,""[t],function(t,e,n,r,o){return e.exec===c?p&&!o?{done:!0,value:v.call(e,n,r)}:{done:!0,value:t.call(n,e,r)}:{done:!1}}),g=y[0],m=y[1];r(String.prototype,t,g),o(RegExp.prototype,h,2==e?function(t,e){return m.call(t,this,e)}:function(t){return m.call(t,this)})}}},function(t,e,n){"use strict";var r=n(27);n(9)({target:"RegExp",proto:!0,forced:r!==/./.exec},{exec:r})},function(t,e,n){"use strict";var r=n(2);t.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},function(t,e,n){"use strict";n.r(e);n(12),n(41);var r=n(29),o=n.n(r);n(24),n(52),n(28);function i(t,e,n,r,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void n(t)}u.done?e(c):Promise.resolve(c).then(r,o)}function a(t){return function(){var e=this,n=arguments;return new Promise(function(r,o){var a=t.apply(e,n);function u(t){i(a,r,o,u,c,"next",t)}function c(t){i(a,r,o,u,c,"throw",t)}u(void 0)})}}function u(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;this.nodes.editorWrapper=document.getElementById("codex-editor"),e.page&&(this.page=e.page),this.loadEditor().then(function(e){t.editor=e}),this.nodes.saveButton=n.querySelector('[name="js-submit-save"]'),this.nodes.saveButton.addEventListener("click",function(){t.saveButtonClicked()}),this.nodes.removeButton=n.querySelector('[name="js-submit-remove"]'),this.nodes.removeButton&&this.nodes.removeButton.addEventListener("click",function(){window.confirm("Are you sure?")&&t.removeButtonClicked()}),this.nodes.parentIdSelector=n.querySelector('[name="parent"]'),this.nodes.putAboveIdSelector=n.querySelector('[name="above"]'),this.nodes.uriInput=n.querySelector('[name="uri-input"]')}},{key:"loadEditor",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,r,o;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,n.e(1).then(n.bind(null,104));case 2:return e=t.sent,r=e.default,o=this.page?{data:this.page.body}:{},t.abrupt("return",new r(o,{headerPlaceholder:"Enter a title"}));case 6:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()},{key:"getData",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,n,r,o,i;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.editor.save();case 2:if(e=t.sent,n=e.blocks.length?e.blocks[0]:null,r=n&&"header"===n.type?n.data.text:null,o="",!this.nodes.uriInput||!this.nodes.uriInput.value){t.next=12;break}if(!this.nodes.uriInput.value.match(/^[a-z0-9'-]+$/i)){t.next=11;break}o=this.nodes.uriInput.value,t.next=12;break;case 11:throw new Error("Uri has unexpected characters");case 12:if(r){t.next=14;break}throw new Error("Entry should start with Header");case 14:return i=null,this.nodes.putAboveIdSelector&&(i=this.nodes.putAboveIdSelector.value),t.abrupt("return",{parent:this.nodes.parentIdSelector.value,putAbovePageId:i,uri:o,body:e});case 17:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()},{key:"saveButtonClicked",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,n,r;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.getData();case 3:return e=t.sent,n=this.page?"/api/page/"+this.page._id:"/api/page",t.prev=5,t.next=8,fetch(n,{method:this.page?"POST":"PUT",headers:{"Content-Type":"application/json; charset=utf-8"},body:JSON.stringify(e)});case 8:return r=t.sent,t.next=11,r.json();case 11:(r=t.sent).success?window.location.pathname=r.result.uri?r.result.uri:"/page/"+r.result._id:(alert(r.error),console.log("Validation failed:",r.error)),t.next=18;break;case 15:t.prev=15,t.t0=t.catch(5),console.log("Saving request failed:",t.t0);case 18:t.next=24;break;case 20:t.prev=20,t.t1=t.catch(0),alert(t.t1),console.log("Saving error: ",t.t1);case 24:case"end":return t.stop()}},t,this,[[0,20],[5,15]])}));return function(){return t.apply(this,arguments)}}()},{key:"removeButtonClicked",value:function(){var t=a(regeneratorRuntime.mark(function t(){var e,n;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,e=this.page?"/api/page/"+this.page._id:"",t.next=4,fetch(e,{method:"DELETE"});case 4:return n=t.sent,t.next=7,n.json();case 7:(n=t.sent).success?n.result&&n.result._id?document.location="/page/"+n.result._id:document.location="/":(alert(n.error),console.log("Server fetch failed:",n.error)),t.next=14;break;case 11:t.prev=11,t.t0=t.catch(0),console.log("Server fetch failed due to the:",t.t0);case 14:case"end":return t.stop()}},t,this,[[0,11]])}));return function(){return t.apply(this,arguments)}}()}])&&u(e.prototype,r),o&&u(e,o),t}();function s(t,e,n,r,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void n(t)}u.done?e(c):Promise.resolve(c).then(r,o)}function l(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0],arguments.length>1&&arguments[1];this.codeStyler=this.createCodeStyling()}},{key:"createCodeStyling",value:function(){var t,e=(t=regeneratorRuntime.mark(function t(){var e,r;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,n.e(0).then(n.bind(null,105));case 2:return e=t.sent,r=e.default,t.abrupt("return",new r({selector:".block-code__content"}));case 5:case"end":return t.stop()}},t,this)}),function(){var e=this,n=arguments;return new Promise(function(r,o){var i=t.apply(e,n);function a(t){s(i,r,o,a,u,"next",t)}function u(t){s(i,r,o,a,u,"throw",t)}a(void 0)})});return function(){return e.apply(this,arguments)}}()}])&&l(e.prototype,r),o&&l(e,o),t}();function h(t,e){for(var n=0;nsvg{width:80px;height:80px}.landing-frame{width:100%;height:100%;opacity:0;-webkit-transition:opacity .5s ease;transition:opacity .5s ease;will-change:opacity}body{font-family:system-ui,-apple-system,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,Helvetica,Arial,Verdana;color:#1d202b;color:var(--color-text-main);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}svg{fill:currentColor} +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}:root{--color-text-main:#313649;--color-text-second:#5d6068;--color-line-gray:#e8e8eb;--color-link-active:#2071cc;--color-button-danger:#ff5159;--color-bg-light:#f8f7fa;--layout-padding-horisontal:30px;--layout-padding-vertical:30px;--layout-width-aside:300px;--layout-width-main-col:650px}@media (max-width:980px){:root{--layout-padding-horisontal:15px;--layout-padding-vertical:15px}}:root{--font-mono:Menlo,Monaco,Consolas,Courier New,monospace}.docs{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 30px;padding:0 var(--layout-padding-horisontal)}@media (max-width:980px){.docs{-ms-flex-wrap:wrap;flex-wrap:wrap}}.docs__aside{width:300px;width:var(--layout-width-aside)}@media (max-width:980px){.docs__aside{width:100%;-ms-flex-preferred-size:100%;flex-basis:100%;padding:20px 30px!important;padding:20px var(--layout-padding-horisontal)!important;margin:0 -30px;margin:0 calc(-1*var(--layout-padding-horisontal));border-bottom:1px solid #e8e8eb;border-bottom:1px solid var(--color-line-gray)}}.docs__content{-webkit-box-flex:2;-ms-flex-positive:2;flex-grow:2;word-wrap:break-word}@media (max-width:980px){.docs__content{width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}.docs__content-inner{max-width:650px;max-width:var(--layout-width-main-col);margin:0 auto}.docs__aside,.docs__content{padding:30px 0;padding:var(--layout-padding-vertical) 0}@media (max-width:980px){.docs__aside,.docs__content{padding:20px 0}}.docs-header{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;padding:0 30px;padding:0 var(--layout-padding-horisontal);border-bottom:1px solid #e8e8eb;border-bottom:1px solid var(--color-line-gray);font-size:15.8px;line-height:50px;-ms-flex-wrap:wrap;flex-wrap:wrap;position:relative}@media (max-width:980px){.docs-header{line-height:40px}}.docs-header a{display:inline-block;text-decoration:none}.docs-header__logo{font-weight:700;color:inherit}.docs-header__menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin:0 0 0 auto;padding-left:0}@media (max-width:980px){.docs-header__menu{-ms-flex-preferred-size:100%;flex-basis:100%;font-size:12px}}.docs-header__menu li{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;list-style:none;margin-left:20px}@media (max-width:980px){.docs-header__menu li{margin-left:0;margin-right:15px}}@media (max-width:980px){.docs-header__menu-add{position:absolute;right:15px;top:15px;line-height:1em;margin:0!important}}@media (max-width:980px){.docs-header__menu-add a{font-size:0;padding:8px;margin-right:0}}.docs-header__menu a:not(.docs-header__button){color:inherit}.docs-header__menu a:not(.docs-header__button):hover{color:#2071cc;color:var(--color-link-active)}.docs-header__button{display:inline-block;padding:9px 15px;border-radius:3px;color:#6c6375;background:#fcfcff;-webkit-box-shadow:inset 0 0 0 1px rgba(184,189,206,.2);box-shadow:inset 0 0 0 1px rgba(184,189,206,.2);font-size:14px;line-height:1em;text-decoration:none;cursor:pointer;white-space:nowrap;-webkit-appearance:none;border:0;background:#2071cc;background:var(--color-link-active);color:#fff;-webkit-box-shadow:none;box-shadow:none}.docs-header__button svg{margin:0 .3em 0 -.05em}.docs-header__button:hover{background:#2065b3}.docs-header__button{margin:auto 30px auto auto}.docs-aside{position:-webkit-sticky;position:sticky;top:30px;top:var(--layout-padding-vertical);font-size:14px;letter-spacing:.01em;overflow-y:scroll;max-height:100vh;//padding-right:50px}@media (max-width:980px){.docs-aside{position:static;overflow:visible;max-height:none;font-size:13px;display:none;margin-top:20px}}.docs-aside--toggled{display:block!important}.docs-aside a{color:inherit;text-decoration:none}.docs-aside a:hover{color:#2071cc;color:var(--color-link-active)}.docs-aside__section{margin-bottom:30px}@media (max-width:980px){.docs-aside__section{margin-bottom:20px}}.docs-aside__section:last-of-type{margin-bottom:0}.docs-aside__section-title{display:inline-block;margin-bottom:10px;font-size:1.18em;font-weight:600}@media (max-width:980px){.docs-aside__section-title{margin-bottom:10px}}.docs-aside__section-list{padding-left:0;margin:0;list-style:none}.docs-aside__section-list a{display:inline-block;color:inherit;padding:8px 0}.docs-aside-toggler{display:none;font-size:13px;cursor:pointer;color:#5d6068;color:var(--color-text-second)}@media (max-width:980px){.docs-aside-toggler{display:block}}.docs-aside-toggler svg{margin-right:10px}.writing-header{display:-webkit-box;display:-ms-flexbox;display:flex;position:-webkit-sticky;position:sticky;top:0;padding:15px 0;margin-top:-30px;margin-top:calc(-1*var(--layout-padding-vertical));background:#fff;-webkit-box-shadow:0 3px 10px #fff;box-shadow:0 3px 10px #fff;z-index:2;font-size:14px}.writing-header__save{display:inline-block;padding:9px 15px;border-radius:3px;color:#6c6375;background:#fcfcff;-webkit-box-shadow:inset 0 0 0 1px rgba(184,189,206,.2);box-shadow:inset 0 0 0 1px rgba(184,189,206,.2);font-size:14px;line-height:1em;text-decoration:none;cursor:pointer;white-space:nowrap;-webkit-appearance:none;border:0;background:#2071cc;background:var(--color-link-active);color:#fff;-webkit-box-shadow:none;box-shadow:none}.writing-header__save svg{margin:0 .3em 0 -.05em}.writing-header__save:hover{background:#2065b3}.writing-header__save{margin:auto}.writing-header__left{margin:auto 0;color:#5d6068;color:var(--color-text-second)}.writing-header__left span{margin-right:10px}.writing-header select{max-width:100px;vertical-align:bottom}.writing-buttons__remove{display:inline-block;padding:9px 15px;border-radius:3px;color:#6c6375;background:#fcfcff;-webkit-box-shadow:inset 0 0 0 1px rgba(184,189,206,.2);box-shadow:inset 0 0 0 1px rgba(184,189,206,.2);font-size:14px;line-height:1em;text-decoration:none;cursor:pointer;white-space:nowrap;-webkit-appearance:none;border:0;background:#ff5159;background:var(--color-button-danger);color:#fff;-webkit-box-shadow:none;box-shadow:none}.writing-buttons__remove svg{margin:0 .3em 0 -.05em}.writing-buttons__remove:hover{background:#e65158}.uri-input{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;padding:10px 12px;border-radius:3px;border:1px solid rgba(201,201,204,.48);-webkit-box-shadow:inset 0 1px 2px 0 rgba(35,44,72,.06);box-shadow:inset 0 1px 2px 0 rgba(35,44,72,.06);outline:none}.writing-editor{font-size:15px;line-height:1.6;letter-spacing:.005em}@media (min-width:1050px){.writing-editor{margin:0 -100px}}.writing-editor .ce-code__textarea{color:#41314e;line-height:1.6em;font-size:12px;background:#f8f7fa;background:var(--color-bg-light);border:1px solid #f1f1f4;-webkit-box-shadow:none;box-shadow:none}.writing-editor .ce-paragraph a{color:inherit}.writing-editor .ce-header{font-family:Lucida Grande,Lucida Sans Unicode,Lucida Sans,Geneva,Arial,sans-serif;letter-spacing:-.03em}.codex-editor__redactor .ce-block:first-of-type .ce-header{font-size:32px}.page{font-size:15px;line-height:1.6;letter-spacing:.005em}.page__header{display:-webkit-box;display:-ms-flexbox;display:flex;color:#5d6068;color:var(--color-text-second)}@media (max-width:980px){.page__header{font-size:13px}}.page__header-nav{color:inherit;text-decoration:none}@media (max-width:980px){.page__header-nav{display:none}}.page__header-nav:hover{color:#2071cc;color:var(--color-link-active)}.page__header-nav:not(:last-of-type):after{content:"\BB";margin:0 .7em 0 .45em}.page__header-time{margin-left:auto}@media (max-width:980px){.page__header-time{margin-left:0}}.page__header-button{display:inline-block;padding:9px 15px;border-radius:3px;color:#6c6375;background:#fcfcff;-webkit-box-shadow:inset 0 0 0 1px rgba(184,189,206,.2);box-shadow:inset 0 0 0 1px rgba(184,189,206,.2);font-size:14px;line-height:1em;text-decoration:none;cursor:pointer;white-space:nowrap;-webkit-appearance:none;border:0;background:#2071cc;background:var(--color-link-active);color:#fff;-webkit-box-shadow:none;box-shadow:none}.page__header-button svg{margin:0 .3em 0 -.05em}.page__header-button:hover{background:#2065b3}.page__header-button{padding:5px 10px;font-size:13px;margin-left:10px}.page__title{font-family:Lucida Grande,Lucida Sans Unicode,Lucida Sans,Geneva,Arial,sans-serif;letter-spacing:-.03em;font-size:35px;font-weight:900;letter-spacing:-.04em;margin-bottom:-.1em}.page .cdx-marker{background:rgba(245,235,111,.33);padding:3px 0}.page .inline-code{display:inline-block;background:rgba(251,241,241,.78);color:#c44545;padding:.1em .5em;border-radius:2px;margin:0 2px;font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-size:.84em;line-height:1.4em}.page__content a{text-decoration:none;border-bottom:1px solid #000;padding-bottom:1px;color:inherit}.page__content a:hover{color:#2071cc;color:var(--color-link-active);border-bottom-color:#2071cc;border-bottom-color:var(--color-link-active)}.block-paragraph .inline-code{-webkit-font-smoothing:initial;-moz-osx-font-smoothing:initial}.block-header{font-family:Lucida Grande,Lucida Sans Unicode,Lucida Sans,Geneva,Arial,sans-serif;letter-spacing:-.03em;margin:2.1em 0 .5em}.block-header--2{font-size:22px;font-weight:600}.block-header--3{font-size:18px;font-weight:600}.block-header+p{margin-top:.5em}.block-header a{text-decoration:none!important;border:0;color:inherit!important}.block-header--anchor{cursor:pointer}.block-header--anchor:before{position:absolute;content:"";margin-left:-30px;width:14px;height:19px;margin-top:.35em;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='14' height='19' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%237B7E89'%3E%3Cpath d='M8.58 11.997L2.283 5.701a1.762 1.762 0 0 1 0-2.49l.933-.935a1.762 1.762 0 0 1 2.49 0l6.298 6.297a3.508 3.508 0 0 0-.901-3.39L6.952 1.031a3.522 3.522 0 0 0-4.982 0l-.933.933a3.522 3.522 0 0 0 0 4.982l4.151 4.151c.92.92 2.218 1.208 3.392.9z'/%3E%3Cpath d='M12.958 11.628l-4.151-4.15a3.507 3.507 0 0 0-3.391-.899l6.296 6.296a1.76 1.76 0 0 1 0 2.49l-.933.936a1.764 1.764 0 0 1-2.49 0l-6.296-6.298a3.507 3.507 0 0 0 .899 3.39l4.151 4.15a3.522 3.522 0 0 0 4.982 0l.933-.935a3.52 3.52 0 0 0 0-4.98z'/%3E%3C/g%3E%3C/svg%3E");opacity:0;-webkit-transform:translateX(5px);transform:translateX(5px);will-change:opacity,transform;-webkit-transition:all .1s ease;transition:all .1s ease}@media (max-width:980px){.block-header--anchor:before{display:none!important}}.block-header--anchor:hover{color:#4c4c58}.block-header--anchor:hover:before{opacity:1;-webkit-transform:none;transform:none}.block-code{background:#f8f7fa;background:var(--color-bg-light);border:1px solid #f1f1f4;border-radius:5px;font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--font-mono);line-height:1.7em;font-size:13px}.block-code__content{white-space:pre;word-wrap:normal;overflow-x:auto;background:transparent!important;padding:15px!important;color:#41314e!important}.block-code .hljs-name,.block-code .hljs-section{color:#359f3f}.block-code .hljs-tag{color:#718c77}.block-code .hljs-attr,.block-code .hljs-selector-attr,.block-code .hljs-selector-class,.block-code .hljs-selector-id,.block-code .hljs-selector-pseudo,.block-code .hljs-title{color:#904eb3}.block-code .hljs-emphasis,.block-code .hljs-quote,.block-code .hljs-string,.block-code .hljs-strong,.block-code .hljs-template-variable,.block-code .hljs-variable{color:#c21f04}.block-list{margin:20px 0}.block-list li{margin:10px 0}.block-image{margin:40px auto;text-align:center}.block-image__content img,.block-image__content video{vertical-align:bottom;max-width:100%}.block-image__content--stretched{max-width:none!important;width:calc(100% + 120px)!important;margin-left:-60px}.block-image__content--stretched img,.block-image__content--stretched video{width:100%}.block-image__content--bordered img,.block-image__content--bordered video{border:3px solid #e8e8eb;border:3px solid var(--color-line-gray);-webkit-box-sizing:border-box;box-sizing:border-box}.block-image__content--with-background{padding:15px;background:#f8f7fa;background:var(--color-bg-light)}.block-image__content--with-background img,.block-image__content--with-background video{max-width:60%;margin:0 auto}.block-image__caption{margin:1em auto;color:#5d6068;color:var(--color-text-second)}.block-delimiter{line-height:1.6em;width:100%;text-align:center}.block-delimiter:before{display:inline-block;content:"***";font-size:30px;line-height:65px;height:30px;letter-spacing:.2em}.block-table{margin:20px 0;table-layout:fixed;width:100%;border-radius:3px;border-collapse:collapse}.block-table,.block-table td{border:1px solid #e8e8eb;border:1px solid var(--color-line-gray)}.block-table td{padding:8px 10px}.landing-body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;height:100%}.landing-loader{position:absolute;left:50%;top:50%;z-index:-1;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.landing-loader>svg{width:80px;height:80px}.landing-frame{width:100%;height:100%;opacity:0;-webkit-transition:opacity .5s ease;transition:opacity .5s ease;will-change:opacity}.auth-form{font-size:15px;text-align:center;margin-top:30vh}@media (max-width:980px){.auth-form h1{font-size:20px}}.auth-form p{margin:40px 0 20px}.auth-form input[type=password]{padding:9px;font-size:15px;outline:none;border-radius:3px;-webkit-appearance:none;border:1px solid #e8e8eb;border:1px solid var(--color-line-gray)}.auth-form input[type=submit]{display:inline-block;padding:9px 15px;border-radius:3px;color:#6c6375;background:#fcfcff;-webkit-box-shadow:inset 0 0 0 1px rgba(184,189,206,.2);box-shadow:inset 0 0 0 1px rgba(184,189,206,.2);font-size:14px;line-height:1em;text-decoration:none;cursor:pointer;white-space:nowrap;-webkit-appearance:none;border:0;background:#2071cc;background:var(--color-link-active);color:#fff;-webkit-box-shadow:none;box-shadow:none}.auth-form input[type=submit] svg{margin:0 .3em 0 -.05em}.auth-form input[type=submit]:hover{background:#2065b3}.auth-form input[type=submit]{font-size:15px;padding:10px 20px;line-height:inherit;vertical-align:top}body{font-family:system-ui,-apple-system,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,Helvetica,Arial,Verdana;color:#313649;color:var(--color-text-main);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}svg{fill:currentColor} diff --git a/src/frontend/js/classes/editor.js b/src/frontend/js/classes/editor.js index 8d66609..ee0989e 100644 --- a/src/frontend/js/classes/editor.js +++ b/src/frontend/js/classes/editor.js @@ -32,7 +32,7 @@ export default class Editor { tools: { header: { class: Header, - inlineToolbar: ['link', 'marker', 'inlineCode'], + inlineToolbar: ['marker', 'inlineCode'], config: { placeholder: options.headerPlaceholder || '' } diff --git a/src/frontend/js/modules/page.js b/src/frontend/js/modules/page.js index 589e498..fb55d37 100644 --- a/src/frontend/js/modules/page.js +++ b/src/frontend/js/modules/page.js @@ -30,7 +30,7 @@ export default class Writing { const { default: CodeStyler } = await import(/* webpackChunkName: "code-styling" */ './../classes/codeStyler'); return new CodeStyler({ - selector: '.block-code' + selector: '.block-code__content' }); }; } diff --git a/src/frontend/styles/components/aside.pcss b/src/frontend/styles/components/aside.pcss index 3ae8083..3dc448c 100644 --- a/src/frontend/styles/components/aside.pcss +++ b/src/frontend/styles/components/aside.pcss @@ -1,8 +1,16 @@ .docs-aside { - font-size: 15px; - color: var(--color-text-second); + position: sticky; + top: var(--layout-padding-vertical); + font-size: 14px; + letter-spacing: 0.01em; + overflow-y: scroll; + max-height: 100vh; + //padding-right: 50px; @media (--mobile) { + position: static; + overflow: visible; + max-height: none; font-size: 13px; display: none; margin-top: 20px; @@ -13,7 +21,12 @@ } a { + color: inherit; text-decoration: none; + + &:hover { + color: var(--color-link-active); + } } &__section { @@ -28,8 +41,10 @@ } &-title { - margin-bottom: 15px; - color: var(--color-link-active); + display: inline-block; + margin-bottom: 10px; + font-size: 1.18em; + font-weight: 600; @media (--mobile) { margin-bottom: 10px; @@ -38,6 +53,7 @@ &-list { padding-left: 0; + margin: 0; list-style: none; a { diff --git a/src/frontend/styles/components/auth.pcss b/src/frontend/styles/components/auth.pcss new file mode 100644 index 0000000..f880116 --- /dev/null +++ b/src/frontend/styles/components/auth.pcss @@ -0,0 +1,33 @@ +.auth-form { + font-size: 15px; + text-align: center; + margin-top: 30vh; + + h1 { + @media (--mobile){ + font-size: 20px; + } + } + + p { + margin: 40px 0 20px; + } + + input[type="password"] { + padding: 9px; + font-size: 15px; + outline: none; + border-radius: 3px; + -webkit-appearance: none; + border: 1px solid var(--color-line-gray); + } + + input[type="submit"]{ + @apply --button; + @apply --button-primary; + font-size: 15px; + padding: 10px 20px; + line-height: inherit; + vertical-align: top; + } +} diff --git a/src/frontend/styles/components/page.pcss b/src/frontend/styles/components/page.pcss index 2e00662..53ffb12 100644 --- a/src/frontend/styles/components/page.pcss +++ b/src/frontend/styles/components/page.pcss @@ -1,6 +1,7 @@ .page { - font-size: 16px; + font-size: 15px; line-height: 1.6; + letter-spacing: 0.005em; &__header { display: flex; @@ -48,10 +49,11 @@ } &__title { - font-size: 26px; - font-weight: 700; - letter-spacing: -0.04px; - margin-bottom: -0.2em; + @apply --font-serif; + font-size: 35px; + font-weight: 900; + letter-spacing: -0.04em; + margin-bottom: -0.1em; } .cdx-marker { @@ -59,6 +61,18 @@ padding: 3px 0; } + .inline-code { + display: inline-block; + background: rgba(251,241,241,0.78); + color: #C44545; + padding: 0.1em 0.5em; + border-radius: 2px; + margin: 0 2px; + font-family: Menlo, Monaco, Consolas, Courier New, monospace; + font-size: 0.84em; + line-height: 1.4em; + } + &__content { a { text-decoration: none; @@ -75,21 +89,74 @@ } +/** + * Paragraph + * ================== + */ +.block-paragraph { + .inline-code { + -webkit-font-smoothing: initial; + -moz-osx-font-smoothing: initial; + } +} + /** * Header * ================== */ .block-header { - margin: 1.5em 0 0.5em; + @apply --font-serif; + margin: 2.1em 0 0.5em; &--2 { font-size: 22px; - font-weight: 500; + font-weight: 600; } &--3 { font-size: 18px; - font-weight: 500; + font-weight: 600; + } + + & + p { + margin-top: 0.5em; + } + + a { + text-decoration: none !important; + border: 0; + color: inherit !important; + } + + &--anchor { + cursor: pointer; + + &::before { + position: absolute; + content: ''; + margin-left: -30px; + width: 14px; + height: 19px; + margin-top: 0.35em; + background-image: url("data:image/svg+xml,%3Csvg width='14' height='19' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%237B7E89' fill-rule='nonzero'%3E%3Cpath d='M8.58 11.997L2.283 5.701a1.762 1.762 0 0 1 0-2.49l.933-.935a1.762 1.762 0 0 1 2.49 0l6.298 6.297a3.508 3.508 0 0 0-.901-3.39L6.952 1.031a3.522 3.522 0 0 0-4.982 0l-.933.933a3.522 3.522 0 0 0 0 4.982l4.151 4.151c.92.92 2.218 1.208 3.392.9z'/%3E%3Cpath d='M12.958 11.628l-4.151-4.15a3.507 3.507 0 0 0-3.391-.899l6.296 6.296a1.76 1.76 0 0 1 0 2.49l-.933.936a1.764 1.764 0 0 1-2.49 0l-6.296-6.298a3.507 3.507 0 0 0 .899 3.39l4.151 4.15a3.522 3.522 0 0 0 4.982 0l.933-.935a3.52 3.52 0 0 0 0-4.98z'/%3E%3C/g%3E%3C/svg%3E"); + opacity: 0; + transform: translateX(5px); + will-change: opacity, transform; + transition: all 100ms ease; + + @media (--mobile){ + display: none !important; + } + } + + &:hover { + color: #4c4c58; + } + + &:hover::before{ + opacity: 1; + transform: none; + } } } @@ -98,12 +165,48 @@ * ================== */ .block-code { - padding: 20px !important; + background: var(--color-bg-light); + border: 1px solid #f1f1f4; border-radius: 5px; - font-size: 13px; - //border: 1px solid var(--color-line-gray); - font-family: Menlo,Monaco,Consolas,Courier New,monospace; + font-family: var(--font-mono); line-height: 1.7em; + font-size: 13px; + + &__content { + white-space: pre; + word-wrap: normal; + overflow-x: auto; + background: transparent !important; + padding: 15px !important; + color: #41314e !important; + } + + .hljs-name, + .hljs-section{ + color: #359f3f; + } + + .hljs-tag { + color: #718c77; + } + + .hljs-attr, + .hljs-selector-attr, + .hljs-selector-class, + .hljs-selector-id, + .hljs-selector-pseudo, + .hljs-title { + color: #904eb3; + } + + .hljs-emphasis, + .hljs-quote, + .hljs-string, + .hljs-strong, + .hljs-template-variable, + .hljs-variable { + color: #c21f04; + } } /** @@ -111,6 +214,8 @@ * ================== */ .block-list { + margin: 20px 0; + li { margin: 10px 0; } @@ -149,7 +254,7 @@ &--with-background { padding: 15px; - background: var(--color-line-gray); + background: var(--color-bg-light); img, video { max-width: 60%; diff --git a/src/frontend/styles/components/writing.pcss b/src/frontend/styles/components/writing.pcss index b6bd4a2..0a4686a 100644 --- a/src/frontend/styles/components/writing.pcss +++ b/src/frontend/styles/components/writing.pcss @@ -25,7 +25,8 @@ } select { - max-width: 100px + max-width: 100px; + vertical-align: bottom; } } @@ -47,9 +48,30 @@ } .writing-editor { + font-size: 15px; + line-height: 1.6; + letter-spacing: 0.005em; + @media (--desktop) { margin: 0 -100px; } + + .ce-code__textarea { + color: #41314e; + line-height: 1.6em; + font-size: 12px; + background: var(--color-bg-light); + border: 1px solid #f1f1f4; + box-shadow: none; + } + + .ce-paragraph a { + color: inherit; + } + + .ce-header { + @apply --font-serif; + } } .codex-editor__redactor .ce-block:first-of-type .ce-header { diff --git a/src/frontend/styles/main.pcss b/src/frontend/styles/main.pcss index 2e3e46e..22e8f9d 100644 --- a/src/frontend/styles/main.pcss +++ b/src/frontend/styles/main.pcss @@ -6,6 +6,7 @@ @import './components/writing.pcss'; @import './components/page.pcss'; @import './components/landing.pcss'; +@import './components/auth.pcss'; body { font-family: system-ui, Helvetica, Arial, Verdana; diff --git a/src/frontend/styles/vars.pcss b/src/frontend/styles/vars.pcss index 9519073..3b0cb88 100644 --- a/src/frontend/styles/vars.pcss +++ b/src/frontend/styles/vars.pcss @@ -1,16 +1,17 @@ :root { - --color-text-main: #1D202B; - --color-text-second: #7B7E89; + --color-text-main: #313649; + --color-text-second: #5d6068; --color-line-gray: #E8E8EB; - --color-link-active: #388AE5; - --color-button-danger: #ff1629; + --color-link-active: #2071cc; + --color-button-danger: #ff5159; + --color-bg-light: #f8f7fa; /** * Site layout sizes */ - --layout-padding-horisontal: 40px; - --layout-padding-vertical: 40px; - --layout-width-aside: 200px; + --layout-padding-horisontal: 30px; + --layout-padding-vertical: 30px; + --layout-width-aside: 300px; --layout-width-main-col: 650px; @media (--mobile) { @@ -18,6 +19,13 @@ --layout-padding-vertical: 15px; } + --font-mono: Menlo,Monaco,Consolas,Courier New,monospace; + + --font-serif { + font-family: "Lucida Grande","Lucida Sans Unicode","Lucida Sans", Geneva, Arial, sans-serif; + letter-spacing: -0.03em; + } + --button { display: inline-block; padding: 9px 15px; @@ -30,6 +38,8 @@ text-decoration: none; cursor: pointer; white-space: nowrap; + -webkit-appearance: none; + border: 0; svg { margin: 0 0.3em 0 -0.05em; diff --git a/src/models/page.js b/src/models/page.js index fce3fb3..25c401d 100644 --- a/src/models/page.js +++ b/src/models/page.js @@ -1,5 +1,5 @@ +const urlify = require('../utils/urlify'); const { pages: pagesDb } = require('../utils/database/index'); -const translateString = require('../utils/translation'); /** * @typedef {Object} PageData @@ -116,14 +116,7 @@ class Page { * @return {string} */ transformTitleToUri() { - return translateString(this.title - .replace(/ /g, ' ') - .replace(/[^a-zA-Z0-9А-Яа-яЁё ]/g, ' ') - .replace(/ +/g, ' ') - .trim() - .toLowerCase() - .split(' ') - .join('-')); + return urlify(this.title); } /** diff --git a/src/routes/auth.js b/src/routes/auth.js index c62238f..18bad87 100644 --- a/src/routes/auth.js +++ b/src/routes/auth.js @@ -16,7 +16,6 @@ const parseForm = express.urlencoded({ extended: false }); router.get('/auth', csrfProtection, function (req, res) { res.render('auth', { title: 'Login page', - header: 'Enter password', csrfToken: req.csrfToken() }); }); diff --git a/src/routes/middlewares/token.js b/src/routes/middlewares/token.js index 220a972..9b7af2d 100644 --- a/src/routes/middlewares/token.js +++ b/src/routes/middlewares/token.js @@ -16,6 +16,7 @@ module.exports = async function verifyToken(req, res, next) { if (!userDoc) { res.locals.isAuthorized = false; next(); + return; } jwt.verify(token, userDoc.passHash + config.secret, (err, decodedToken) => { diff --git a/src/utils/twig.js b/src/utils/twig.js index 0a77bca..0a5ceb7 100644 --- a/src/utils/twig.js +++ b/src/utils/twig.js @@ -3,6 +3,7 @@ */ const twig = require('twig'); const fs = require('fs'); +const urlify = require('./urlify'); module.exports = (function () { 'use strict'; @@ -17,4 +18,15 @@ module.exports = (function () { twig.extendFunction('svg', function (filename) { return fs.readFileSync(`${__dirname}/../frontend/svg/${filename}.svg`, 'utf-8'); }); + + /** + * Convert text to URL-like string + * Example: "What is clean data" -> "what-is-clean-data" + * + * @param {string} string - source string with HTML + * @returns {string} alias-like string + */ + twig.extendFilter('urlify', function (string) { + return urlify(string); + }); }()); diff --git a/src/utils/urlify.js b/src/utils/urlify.js new file mode 100644 index 0000000..bb08e20 --- /dev/null +++ b/src/utils/urlify.js @@ -0,0 +1,33 @@ +const translateString = require('./translation'); + +/** + * Convert text to URL-like string + * Example: "What is clean data" -> "what-is-clean-data" + * + * @param {string} string - source string with HTML + * @returns {string} alias-like string + */ +module.exports = function urlify(string) { + // strip tags + string = string.replace(/(<([^>]+)>)/ig, ''); + + // remove nbsp + string = string.replace(/ /g, ' '); + + // remove all symbols except chars + string = string.replace(/[^a-zA-Z0-9А-Яа-яЁё ]/g, ' '); + + // remove whitespaces + string = string.replace(/ +/g, ' ').trim(); + + // lowercase + string = string.toLowerCase(); + + // join words with hyphens + string = string.split(' ').join('-'); + + // translate + string = translateString(string); + + return string; +}; diff --git a/src/views/auth.twig b/src/views/auth.twig index 251d17f..801281a 100644 --- a/src/views/auth.twig +++ b/src/views/auth.twig @@ -1,11 +1,16 @@ {% extends 'layout.twig' %} {% block body %} -

{{header}}

-
+ +

+ ┬┴┬┴┤ ͜ʖ ͡°) ├┬┴┬┴ +

+

+ Enter a password to access pages editing +

- +
{% endblock %} diff --git a/src/views/pages/blocks/code.twig b/src/views/pages/blocks/code.twig index 726abfb..663ff49 100644 --- a/src/views/pages/blocks/code.twig +++ b/src/views/pages/blocks/code.twig @@ -1,2 +1,4 @@ -
{{ code|escape }}
+
+
{{ code|escape }}
+
diff --git a/src/views/pages/blocks/header.twig b/src/views/pages/blocks/header.twig index 4578161..fa8d093 100644 --- a/src/views/pages/blocks/header.twig +++ b/src/views/pages/blocks/header.twig @@ -1,3 +1,7 @@ - - {{ text }} +
+ + + {{ text }} + + diff --git a/src/views/pages/form.twig b/src/views/pages/form.twig index 41e40b4..f1fdf26 100644 --- a/src/views/pages/form.twig +++ b/src/views/pages/form.twig @@ -25,8 +25,12 @@ {% for _page in pagesAvailable %} {% if _page._id != currentPageId %} + {% if _page._parent != "0" %} +   +   + {% endif %} + {{ _page.title }} + {% endif %} {% endfor %}