From f11882fcd98ab75d025788512d10bbdd08b1f0d4 Mon Sep 17 00:00:00 2001 From: npmrun Date: Mon, 15 May 2023 15:41:54 +0800 Subject: [PATCH] add page --- public/js/common/flush.js | 19 ++ public/js/common/main.js | 23 --- public/static/css/index.css | 251 +++++++++++++++++++++++++ public/static/css/prism.css | 128 +++++++++++++ public/static/images/balloon.png | Bin 0 -> 131851 bytes public/static/images/logo.png | Bin 0 -> 12944 bytes public/static/js/prism.js | 7 + public/static/js/textarr.js | 366 ++++++++++++++++++++++++++++++++++++ public/static/js/write.js | 62 ++++++ public/style/common/animate.min.css | 7 + public/style/common/style.css | 5 + public/style/views/color.css | 95 ++++++++++ route.txt | 4 +- source/auth/index.ts | 3 +- source/db/data.db | Bin 24576 -> 24576 bytes source/models/Color.ts | 80 +++++++- source/models/user.ts | 37 +++- source/models/user_info.ts | 84 --------- source/route/views/index.ts | 97 ++++++++++ source/route/views/index/index.ts | 102 ---------- source/route/views/register.ts | 8 +- source/route/views/user.ts | 10 +- source/run.ts | 18 +- template/helper/flush.pug | 18 +- template/helper/helper.pug | 3 - template/htmx/path/user.pug | 10 +- template/layout/layout.pug | 5 +- template/views/color.pug | 51 +++++ template/views/resume.pug | 75 ++++++++ types/global.d.ts | 4 +- 30 files changed, 1310 insertions(+), 262 deletions(-) create mode 100644 public/js/common/flush.js create mode 100644 public/static/css/index.css create mode 100644 public/static/css/prism.css create mode 100644 public/static/images/balloon.png create mode 100644 public/static/images/logo.png create mode 100644 public/static/js/prism.js create mode 100644 public/static/js/textarr.js create mode 100644 public/static/js/write.js create mode 100644 public/style/common/animate.min.css create mode 100644 public/style/views/color.css delete mode 100644 source/models/user_info.ts create mode 100644 source/route/views/index.ts delete mode 100644 source/route/views/index/index.ts create mode 100644 template/views/color.pug create mode 100644 template/views/resume.pug diff --git a/public/js/common/flush.js b/public/js/common/flush.js new file mode 100644 index 0000000..bb1863a --- /dev/null +++ b/public/js/common/flush.js @@ -0,0 +1,19 @@ +var $messages = Array.prototype.slice.call(document.querySelectorAll(".message-container .message button.delete"), 0) +$messages.forEach((el, index) => { + let timeID + function click() { + // Get the target from the "data-target" attribute + const target = el.dataset.target + const $target = document.getElementById(target) + el.removeEventListener("click", click) + $target.remove() + clearTimeout(timeID) + } + timeID = setTimeout(() => { + const target = el.dataset.target + const $target = document.getElementById(target) + el.removeEventListener("click", click) + $target && $target.remove() + }, (index + 1) * 6000) + el.addEventListener("click", click) +}) diff --git a/public/js/common/main.js b/public/js/common/main.js index 2bc823e..2c3d31f 100644 --- a/public/js/common/main.js +++ b/public/js/common/main.js @@ -14,27 +14,4 @@ document.addEventListener("DOMContentLoaded", () => { $target.classList.toggle("is-active") }) }) - - const $messages = Array.prototype.slice.call( - document.querySelectorAll(".message-container .message button.delete"), - 0, - ) - $messages.forEach((el, index) => { - let timeID - function click() { - // Get the target from the "data-target" attribute - const target = el.dataset.target - const $target = document.getElementById(target) - el.removeEventListener("click", click) - $target.remove() - clearTimeout(timeID) - } - timeID = setTimeout(() => { - const target = el.dataset.target - const $target = document.getElementById(target) - el.removeEventListener("click", click) - $target.remove() - }, (index + 1) * 6000) - el.addEventListener("click", click) - }) }) diff --git a/public/static/css/index.css b/public/static/css/index.css new file mode 100644 index 0000000..08e9767 --- /dev/null +++ b/public/static/css/index.css @@ -0,0 +1,251 @@ + +/* +*项目名: 个人简历 +*创建者: Edit +*创建时间:2020.2.15 20:40:41 +*联系方式:15622749328(微信同号) +*描述: 酷炫个人简历 +*/ + +*{margin:0;padding: 0;box-sizing: border-box;} +body{ + height: 100vh; +} +li{list-style: none;} +html{font-family: 宋体;} +#codeEdit{ + width: 48%; + height: 97vh; + margin: auto 0; +} +#resume{ + width: 48%; + min-width: 700px; + margin: auto 0; + position: relative; + height: 97vh; + overflow-y: scroll; + display: flex; +} +.ul-list li::before{ + content: '♦'; + color: #78B1E8; + padding-right: 15px; + font-size: 20px; + font-family: '-webkit-pictograph'; +} +.ul-list + .ul-list{ + margin-top: 10px; +} +.tag{ + color: #ff4614; +} +.footer-height{ + height: 200px; +} +.mr{ + margin-right: 40px; +} +body{ + display: flex; + justify-content: space-around; +} +.balloon-wrap{ + position: absolute; + width: 100%; + height: 100%; + overflow: hidden; + z-index: 1; + pointer-events: none; + animation: balloon-ani .8s; +} +@keyframes balloon-ani{ + 0%{ + left: -100vw; + } + 20%{ + opacity: 0; + } + 100%{ + opacity: 1; + left: 0; + } +} +img[id*="bg-balloon-"]{ + position: absolute; +} +img#bg-balloon-large{ + transform: translateY(-17%); + right: -55px; +} +img#bg-balloon-small{ + width: 135px; + right: 45px; + transform: translateY(-10%); +} +img#bg-balloon-logo{ + height: 120px; + right: 0; +} +.line-wrap{ + top: 0; + padding-left: 20px; + display: flex; + height: 100%; + animation: line-wrap-ani .8s; +} +@keyframes line-wrap-ani{ + 0%{ + transform: translateX(100vw); + } + 20%{ + height: 0; + } + 100%{ + transform: translateX(0); + height: 100%; + } +} +.line-wrap > div{ + width: 8px; + height: 100%; +} +.line-left{ + background-color: #FFDF7F; + margin-right: 12px; +} +.line-right{ + display: flex; + flex-direction: column; +} +.line-defColor{ + background-color: #F3D383; +} +.line-midColor{ + background-color: #F3C583; +} +.line-darkColor{ + background-color: #EDAF45; +} +.line-item1{ + height: 20%; +} +.line-item2{ + height: 20px; + flex-shrink: 0; +} +.line-item3{ + height: 30px; + flex-shrink: 0; +} +.line-item4{ + height: 20%; + flex-shrink: 0; +} +.line-item5{ + height: 25px; + margin-top: 10px; + margin-bottom: 15px; + flex-shrink: 0; +} +.line-item6{ + height: 10%; + flex-shrink: 0; +} +.line-item7{ + height: 8%; + flex-shrink: 0; +} +.line-item8{ + height: 8%; + flex-shrink: 0; +} +.text-wrap{ + margin-left: 30px; + padding: 40px 50px 40px 0; + font-size: 15px; + line-height: 1.5em; +} +.inten{ + color: #EF8C06; +} +.text-title{ + margin-top: 15px; + color: #548DD4; + margin-bottom: 5px; +} +.base-info{ + display: flex; +} +.base-info>div:first-child{ + margin-right: 100px; +} +.project-title{ + font-weight: 700; +} + +@media (min-width: 500px){ + /* 滚动条美化 */ + *::-webkit-scrollbar-track-piece { + background-color:#f8f8f8; + } + *::-webkit-scrollbar { + width: 5px; + height: 5px; + } + *::-webkit-scrollbar-thumb { + background-color: rgba(150, 150, 150, .2); + background-clip:padding-box; + min-height:28px; + border-radius: 5px; + } + *::-webkit-scrollbar-thumb:hover { + background-color:#bbb; + } + .sbShow::-webkit-scrollbar-thumb { + background-color: #ccc; + background-clip:padding-box; + min-height: 28px; + border-radius: 5px; + } +} +@media (max-width: 500px){ + body{ + flex-direction: column; + } + #resume, + #codeEdit{ + height: 50vh!important; + width: 100vw!important; + min-width: 100vw!important; + } + .line-wrap{ + padding-left: 5px; + } + .line-left{ + padding-left: 8px; + } + .text-wrap{ + margin-left: 15px; + padding: 60px 30px 40px 0; + } + img#bg-balloon-small { + width: 85px; + right: 32px; + transform: translateY(-10%); + } + img#bg-balloon-large { + transform: translateY(-17%); + right: -40px; + width: 105px; + } + img#bg-balloon-logo { + height: 62px; + } + .base-info{ + display: block; + } + .school span{ + display: block; + } +} \ No newline at end of file diff --git a/public/static/css/prism.css b/public/static/css/prism.css new file mode 100644 index 0000000..e7220fe --- /dev/null +++ b/public/static/css/prism.css @@ -0,0 +1,128 @@ +/* PrismJS 1.10.0 +http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ + + +/* +*项目名: 个人简历 +*创建者: Edit +*创建时间:2020.2.15 20:40:41 +*联系方式:15622749328(微信同号) +*描述: 酷炫个人简历 +*/ + +code[class*="language-"], +pre[class*="language-"] { + background: none; + /* text-shadow: 0 1px white; */ + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + /* background: #f5f2f0; */ +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.punctuation { + color: #fff; +} + +.namespace { + opacity: .7; +} + +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #a67f59; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + + + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + diff --git a/public/static/images/balloon.png b/public/static/images/balloon.png new file mode 100644 index 0000000000000000000000000000000000000000..fc052eae3dba66aa24a2525d964c417e95bc64ee GIT binary patch literal 131851 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 N<@SyDZ}`IZ{ttS>Y=Hm( literal 0 HcmV?d00001 diff --git a/public/static/images/logo.png b/public/static/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5c70c804ef946d29caf55469c72a552d39c556c6 GIT binary patch literal 12944 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 S{Gb1b=sbR+Q4O+x^}hfFi8)*V literal 0 HcmV?d00001 diff --git a/public/static/js/prism.js b/public/static/js/prism.js new file mode 100644 index 0000000..35a6da9 --- /dev/null +++ b/public/static/js/prism.js @@ -0,0 +1,7 @@ +/* PrismJS 1.10.0 +http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-(\w+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,disableWorkerMessageHandler:_self.Prism&&_self.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof r?new r(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(!(w instanceof s)){h.lastIndex=0;var _=h.exec(w),P=1;if(!_&&m&&b!=t.length-1){if(h.lastIndex=k,_=h.exec(e),!_)break;for(var A=_.index+(d?_[1].length:0),j=_.index+_[0].length,x=b,O=k,N=t.length;N>x&&(j>O||!t[x].type&&!t[x-1].greedy);++x)O+=t[x].length,A>=O&&(++b,k=O);if(t[b]instanceof s||t[x-1].greedy)continue;P=x-b,w=e.slice(k,O),_.index-=k}if(_){d&&(p=_[1].length);var A=_.index+p,_=_[0].slice(p),j=A+_.length,S=w.slice(0,A),C=w.slice(j),M=[b,P];S&&(++b,k+=S.length,M.push(S));var E=new s(g,f?n.tokenize(_,f):_,y,_,m);if(M.push(E),C&&M.push(C),Array.prototype.splice.apply(t,M),1!=P&&n.matchGrammar(e,t,r,b,k,!0,g),i)break}else if(i)break}}}}},tokenize:function(e,t){var r=[e],a=t.rest;if(a){for(var l in a)t[l]=a[l];delete t.rest}return n.matchGrammar(e,r,t,0,0,!1),r},hooks:{all:{},add:function(e,t){var r=n.hooks.all;r[e]=r[e]||[],r[e].push(t)},run:function(e,t){var r=n.hooks.all[e];if(r&&r.length)for(var a,l=0;a=r[l++];)a(t)}}},r=n.Token=function(e,t,n,r,a){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length,this.greedy=!!a};if(r.stringify=function(e,t,a){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return r.stringify(n,t,e)}).join("");var l={type:e.type,content:r.stringify(e.content,t,a),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:a};if(e.alias){var i="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run("wrap",l);var o=Object.keys(l.attributes).map(function(e){return e+'="'+(l.attributes[e]||"").replace(/"/g,""")+'"'}).join(" ");return"<"+l.tag+' class="'+l.classes.join(" ")+'"'+(o?" "+o:"")+">"+l.content+""},!_self.document)return _self.addEventListener?(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),r=t.language,a=t.code,l=t.immediateClose;_self.postMessage(n.highlight(a,n.languages[r],r)),l&&_self.close()},!1),_self.Prism):_self.Prism;var a=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return a&&(n.filename=a.src,n.manual||a.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,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},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup; +Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\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:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/()[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css",greedy:!0}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag)); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|\d*\.?\d+(?:[Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\()/i,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^\/])\/(?!\/)(\[[^\]\r\n]+]|\\.|[^\/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=\s*(?:function\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i,alias:"function"}}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/()[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript",greedy:!0}}),Prism.languages.js=Prism.languages.javascript; diff --git a/public/static/js/textarr.js b/public/static/js/textarr.js new file mode 100644 index 0000000..10cf1ca --- /dev/null +++ b/public/static/js/textarr.js @@ -0,0 +1,366 @@ + +let textArr = [ + { + name: 'h2', + class: 'inten', + text: '求职意向:前端开发工程师' + }, { + name: 'h4', + class: 'text-title', + text: '基本信息' + }, { + name: 'div', + class: 'base-info', + children: [{ + name: 'div', + children: [{ + name: 'div', + text: '姓名:xieyaxin' + },{ + name: 'div', + text: '年龄:23' + }] + }, { + name: 'div', + children: [{ + name: 'div', + text: '毕业院校:中山大学南方学院' + },{ + name: 'div', + text: '联系电话:15622749328' + }] + }] + }, { + name: 'h4', + class: 'text-title', + text: '教育背景' + }, { + name: 'div', + class: 'school', + children: [{ + name: 'span', + class: 'mr', + text: '学校:中山大学南方学院' + }, { + name: 'span', + text: '专业:计算机科学与技术' + }, { + name: 'div', + text: '主修课程:HTML、CSS、JavaScript、Vue、JavaEE、MySQL', + }] + }, { + name: 'h4', + class: 'text-title', + text: '专业技能' + }, { + name: 'ul', + class: 'ul-list', + children: [{ + name: 'li', + text:'熟练掌握', + children: [{ + name: 'span', + class: 'tag', + text: 'H5、CSS3、ES6' + }] + }, { + name: 'li', + text:'能熟练运用不同主流UI框架ElementUI及多个移动端UI框架' + }, { + name: 'li', + text:'掌握前端主流', + children: [{ + name: 'span', + class: 'tag', + text: 'Vue框架' + }] + }, { + name: 'li', + text:'熟练掌握', + children: [{ + name: 'span', + class: 'tag', + text: 'H5混合APP开发' + }, { + name: 'span', + text: ',跨多端技术uni-app、apicloud' + }] + }, { + name: 'li', + text:'了解微信小程序开发' + }, { + name: 'li', + text:'熟悉后端语言Java、node.js' + }, { + name: 'li', + text: '熟悉', + children: [{ + name: 'span', + class: 'tag', + text: 'css预处理器' + }, { + name: 'span', + text: 'sass、stylus以及前端构建工具webpack和npm包管理库' + }] + }] + }, { + name: 'h4', + class: 'text-title', + text: '工作经历' + }, { + name: 'div', + class: 'work', + children:[{ + name: 'span', + class: 'mr', + text: '2018.08 — 2019.06' + }, { + name: 'span', + text: 'web前端开发' + }] + }, { + name: 'ul', + class: 'ul-list', + children: [{ + name: 'li', + text:'担任公司前端技术部主管,负责', + children: [{ + name: 'span', + class: 'tag', + text: '带领新人、项目安排、BUG解决、产品优化、定期开展技术交流会议' + }] + }, { + name: 'li', + text: '负责公司项目开发(web hybridApp、微信公众号H5),其他公司基础项目开发,如PC端商城,企业响应式网站,APP开发!' + }] + }, { + name: 'h4', + class: 'text-title', + text: '项目经验' + }, { + name: 'div', + class: 'item-lv', + children: [{ + name: 'ul', + class: 'ul-list', + children: [{ + name: 'li', + class: 'project-title', + text: '项目一:宠物商城(混合APP开发)' + }, { + name: 'li', + text: '使用技术栈:YDUI框架、', + children: [{ + name: 'span', + class: 'tag', + text: 'Vue全家桶、ApiCloud跨多端打包' + }] + }, { + name: 'li', + text: '项目描述:基于vue-cli搭建的web应用,多用户商城。功能主要包括商家入驻平台上传个人身份信息、发布宠物信息、会员商家一对一聊天、商城买卖、城市筛选。其中包含收货地址、搜索记录、宠物和商家店铺收藏的CRUD操作' + }] + }, { + name: 'ul', + class: 'ul-list', + children: [{ + name: 'li', + class: 'project-title', + text: '项目二:智慧校园类(混合APP开发)' + }, { + name: 'li', + text: '使用技术栈:', + children: [{ + name: 'span', + class: 'tag', + text: 'Vue全家桶、' + }, { + name: 'span', + text: '滴滴官方' + }, { + name: 'span', + class: 'tag', + text: 'cube-ui' + }, { + name: 'span', + text: '框架、' + }, { + name: 'span', + class: 'tag', + text: 'ApiCloud跨多端打包' + }] + }, { + name: 'li', + text: '项目描述:老师发布作业、考勤点到、发布校园动态...家长接收信息,与老师端进行交互' + }] + }, { + name: 'ul', + class: 'ul-list', + children: [{ + name: 'li', + class: 'project-title', + text: '项目三:微信公众号,亲子游商城' + }, { + name: 'li', + text: '使用技术栈:', + children: [{ + name: 'span', + class: 'tag', + text: 'Vue、Vue-Router、Axios、Stylus' + }, { + name: 'span', + text: '、YDUI、Vue-awesome-swiper' + }] + }, { + name: 'li', + text: '项目描述:1. Vue-cli脚手架搭建项目' + }, { + name: 'li', + text: '2. 使用Vue-Router做应用页面跳转,路由导航守卫权限控制,params、query传参' + }, { + name: 'li', + text: '3. Axios用做Ajax数据交互,dev环境下配置代理解决跨域,使用createAPI配置baseURL。' + }, { + name: 'li', + text: '4. 使用CSS预处理器stylus简化CSS代码编写,浏览器兼容前缀,rem函数封装。' + }, { + name: 'li', + text: '5. 使用UI框架YDUI,减少不必要的造轮子,提高代码编写效率,用户体验。' + }, { + name: 'li', + text: '6. 使用vue-awesome-swiper轮播图插件。' + }] + }, { + name: 'ul', + class: 'ul-list', + children: [{ + name: 'li', + class: 'project-title', + text: '项目四:企业官网(响应式)、商城(PC)兼容IE8以及多端浏览器' + }, { + name: 'li', + text: '使用技术栈:', + children: [{ + name: 'span', + class: 'tag', + text: 'jQuery' + }] + }, { + name: 'li', + text: 'PC使用兼容写法兼容Ie8、使用渐进增强逐渐增添些许特效,mediaQuery实现网页自适应,移动端样式权重高于PC,完成移动端页面布局。' + }] + }] + }, { + name: 'h4', + class: 'text-title', + text: '自我评价' + }, { + name: 'ul', + class: 'ul-list', + children: [{ + name: 'li', + text:'具有', + children: [{ + name: 'span', + class: 'tag', + text: '团队管理经验' + }, { + name: 'span', + text: ',拥有良好的' + }, { + name: 'span', + class: 'tag', + text: '团队协调能力' + }, { + name: 'span', + text: ',工作当中和同事融洽相处' + }] + }, { + name: 'li', + text:'常混迹于', + children: [{ + name: 'span', + class: 'tag', + text: '前端主流社区' + }, { + name: 'span', + text: '(github、掘金、知乎、简书),翻阅前端' + }, { + name: 'span', + class: 'tag', + text: '大咖' + }, { + name: 'span', + text: '博客(张鑫旭、阮一峰、黄轶)' + }] + }, { + name: 'li', + text:'热爱前端、思维活跃、学习能力强,抗压能力强。' + }, { + name: 'li', + text:'性格随和、诚恳稳重、身体素质较好、能够很快地适应新环境。' + }] + } +] +let style = ` + /* + * 面试官你好,我是Edit,广东惠州人 + * 为您精心准备一份不一样的简历来介绍自己 + * 首先准备一些样式 + */ + *{ + transition: all .8s; + } + /* 稍等,在容器上添加点样式 */ + #codeEdit{ + color: #fff; + background: #1E1E1E; + } + #resume{ + box-shadow: -1px 4px 9px 3px rgba(0, 0, 0, .15); + } + /* 我需要一点代码高亮 */ + pre#codeEdit{ + color: #CE9e78; + } + .token.selector{ + color: rgb(230, 155, 43); + } + .token.comment{ + color: #6A9955; + font-size: 14px; + } + .token.property{ + color: #60C8FE; + } + .token.function { + color: #DD4A68; + } + /* 接下来请欣赏我的个人简历吧 */ +` +let balloon = ` +
+ + + +
+
` +let line = ` +
+
+
+

+

+

+

+

+

+

+

+
+
+
` +let text = ` +
+` + + diff --git a/public/static/js/write.js b/public/static/js/write.js new file mode 100644 index 0000000..2b9b64e --- /dev/null +++ b/public/static/js/write.js @@ -0,0 +1,62 @@ + +// Array[Object], ance: 当前children列表. +let parentList = [] +let List = [] // Array[Object], ance: 当前children列表. current: 当前子元素遍历下标. 遍历方式从深处开始遍历,"树"的数据结构 +function writeText(item, childArr=[], childIndex, parent=document.querySelector('.text-wrap')) { + let data = {} + if(childArr.length > 0){ + data = childArr[childIndex] + }else { + data = item + } + let num = 0; + let text = data.text ? data.text : '' + let dom = document.createElement(data.name) + dom.setAttribute('class', data.class || '') + parent.appendChild(dom) + let timer = setInterval(() => { + if(num <= text.length){ + dom.innerHTML = text.substr(0, num) + resume.scrollTop = 100000 + num++ + }else{ + clearInterval(timer) + if (data.children) { + List.push({ + ance: data.children, + current: 0, + length: data.children.length + }) + parentList.push(dom) + writeText('', data.children, 0, dom) + }else if (childArr.length > 0) { + if(childArr.length-1 > childIndex){ + writeText('', childArr, ++childIndex, parentList[parentList.length-1]) + List[List.length-1].current = List[List.length-1].current + 1 + }else { + parentList.pop() + filterLength() + } + }else if (textArr.length-1 > currentIndex_) { // + writeText(textArr[++currentIndex_]) + parentList = [] + } + } + }, 20); +} +function filterLength () { + for (let i = List.length-1; i >=0; i--) { + if(List[i].length-1 == List[i].current){ + List.pop() + }else{ + List[List.length-1].current = List[List.length-1].current + 1 + break; + } + } + if(List.length>0){ + writeText('', List[List.length-1].ance, List[List.length-1].current,parentList[parentList.length-1]) + }else if(textArr.length-1 > currentIndex_){ + writeText(textArr[++currentIndex_]) + parentList = [] + } +} \ No newline at end of file diff --git a/public/style/common/animate.min.css b/public/style/common/animate.min.css new file mode 100644 index 0000000..76d2fe1 --- /dev/null +++ b/public/style/common/animate.min.css @@ -0,0 +1,7 @@ +@charset "UTF-8";/*! + * animate.css - https://animate.style/ + * Version - 4.1.1 + * Licensed under the MIT license - http://opensource.org/licenses/MIT + * + * Copyright (c) 2020 Animate.css + */:root{--animate-duration:1s;--animate-delay:1s;--animate-repeat:1}.animate__animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-duration:var(--animate-duration);animation-duration:var(--animate-duration);-webkit-animation-fill-mode:both;animation-fill-mode:both}.animate__animated.animate__infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animate__animated.animate__repeat-1{-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-iteration-count:var(--animate-repeat);animation-iteration-count:var(--animate-repeat)}.animate__animated.animate__repeat-2{-webkit-animation-iteration-count:2;animation-iteration-count:2;-webkit-animation-iteration-count:calc(var(--animate-repeat)*2);animation-iteration-count:calc(var(--animate-repeat)*2)}.animate__animated.animate__repeat-3{-webkit-animation-iteration-count:3;animation-iteration-count:3;-webkit-animation-iteration-count:calc(var(--animate-repeat)*3);animation-iteration-count:calc(var(--animate-repeat)*3)}.animate__animated.animate__delay-1s{-webkit-animation-delay:1s;animation-delay:1s;-webkit-animation-delay:var(--animate-delay);animation-delay:var(--animate-delay)}.animate__animated.animate__delay-2s{-webkit-animation-delay:2s;animation-delay:2s;-webkit-animation-delay:calc(var(--animate-delay)*2);animation-delay:calc(var(--animate-delay)*2)}.animate__animated.animate__delay-3s{-webkit-animation-delay:3s;animation-delay:3s;-webkit-animation-delay:calc(var(--animate-delay)*3);animation-delay:calc(var(--animate-delay)*3)}.animate__animated.animate__delay-4s{-webkit-animation-delay:4s;animation-delay:4s;-webkit-animation-delay:calc(var(--animate-delay)*4);animation-delay:calc(var(--animate-delay)*4)}.animate__animated.animate__delay-5s{-webkit-animation-delay:5s;animation-delay:5s;-webkit-animation-delay:calc(var(--animate-delay)*5);animation-delay:calc(var(--animate-delay)*5)}.animate__animated.animate__faster{-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-duration:calc(var(--animate-duration)/2);animation-duration:calc(var(--animate-duration)/2)}.animate__animated.animate__fast{-webkit-animation-duration:.8s;animation-duration:.8s;-webkit-animation-duration:calc(var(--animate-duration)*0.8);animation-duration:calc(var(--animate-duration)*0.8)}.animate__animated.animate__slow{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-duration:calc(var(--animate-duration)*2);animation-duration:calc(var(--animate-duration)*2)}.animate__animated.animate__slower{-webkit-animation-duration:3s;animation-duration:3s;-webkit-animation-duration:calc(var(--animate-duration)*3);animation-duration:calc(var(--animate-duration)*3)}@media (prefers-reduced-motion:reduce),print{.animate__animated{-webkit-animation-duration:1ms!important;animation-duration:1ms!important;-webkit-transition-duration:1ms!important;transition-duration:1ms!important;-webkit-animation-iteration-count:1!important;animation-iteration-count:1!important}.animate__animated[class*=Out]{opacity:0}}@-webkit-keyframes bounce{0%,20%,53%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translateZ(0);transform:translateZ(0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-30px,0) scaleY(1.1);transform:translate3d(0,-30px,0) scaleY(1.1)}70%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-15px,0) scaleY(1.05);transform:translate3d(0,-15px,0) scaleY(1.05)}80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translateZ(0) scaleY(.95);transform:translateZ(0) scaleY(.95)}90%{-webkit-transform:translate3d(0,-4px,0) scaleY(1.02);transform:translate3d(0,-4px,0) scaleY(1.02)}}@keyframes bounce{0%,20%,53%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translateZ(0);transform:translateZ(0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-30px,0) scaleY(1.1);transform:translate3d(0,-30px,0) scaleY(1.1)}70%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-15px,0) scaleY(1.05);transform:translate3d(0,-15px,0) scaleY(1.05)}80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translateZ(0) scaleY(.95);transform:translateZ(0) scaleY(.95)}90%{-webkit-transform:translate3d(0,-4px,0) scaleY(1.02);transform:translate3d(0,-4px,0) scaleY(1.02)}}.animate__bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}.animate__flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes pulse{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.animate__pulse{-webkit-animation-name:pulse;animation-name:pulse;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}@-webkit-keyframes rubberBand{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes rubberBand{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.animate__rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shakeX{0%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shakeX{0%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.animate__shakeX{-webkit-animation-name:shakeX;animation-name:shakeX}@-webkit-keyframes shakeY{0%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}20%,40%,60%,80%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}}@keyframes shakeY{0%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}20%,40%,60%,80%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}}.animate__shakeY{-webkit-animation-name:shakeY;animation-name:shakeY}@-webkit-keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}.animate__headShake{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-name:headShake;animation-name:headShake}@-webkit-keyframes swing{20%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}40%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}60%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}80%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes swing{20%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}40%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}60%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}80%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}.animate__swing{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate(-3deg);transform:scale3d(.9,.9,.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(3deg);transform:scale3d(1.1,1.1,1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(-3deg);transform:scale3d(1.1,1.1,1.1) rotate(-3deg)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes tada{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate(-3deg);transform:scale3d(.9,.9,.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(3deg);transform:scale3d(1.1,1.1,1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(-3deg);transform:scale3d(1.1,1.1,1.1) rotate(-3deg)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.animate__tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}15%{-webkit-transform:translate3d(-25%,0,0) rotate(-5deg);transform:translate3d(-25%,0,0) rotate(-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate(3deg);transform:translate3d(20%,0,0) rotate(3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate(-3deg);transform:translate3d(-15%,0,0) rotate(-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate(2deg);transform:translate3d(10%,0,0) rotate(2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate(-1deg);transform:translate3d(-5%,0,0) rotate(-1deg)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes wobble{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}15%{-webkit-transform:translate3d(-25%,0,0) rotate(-5deg);transform:translate3d(-25%,0,0) rotate(-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate(3deg);transform:translate3d(20%,0,0) rotate(3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate(-3deg);transform:translate3d(-15%,0,0) rotate(-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate(2deg);transform:translate3d(10%,0,0) rotate(2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate(-1deg);transform:translate3d(-5%,0,0) rotate(-1deg)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes jello{0%,11.1%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(.390625deg) skewY(.390625deg);transform:skewX(.390625deg) skewY(.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}@keyframes jello{0%,11.1%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(.390625deg) skewY(.390625deg);transform:skewX(.390625deg) skewY(.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}.animate__jello{-webkit-animation-name:jello;animation-name:jello;-webkit-transform-origin:center;transform-origin:center}@-webkit-keyframes heartBeat{0%{-webkit-transform:scale(1);transform:scale(1)}14%{-webkit-transform:scale(1.3);transform:scale(1.3)}28%{-webkit-transform:scale(1);transform:scale(1)}42%{-webkit-transform:scale(1.3);transform:scale(1.3)}70%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes heartBeat{0%{-webkit-transform:scale(1);transform:scale(1)}14%{-webkit-transform:scale(1.3);transform:scale(1.3)}28%{-webkit-transform:scale(1);transform:scale(1)}42%{-webkit-transform:scale(1.3);transform:scale(1.3)}70%{-webkit-transform:scale(1);transform:scale(1)}}.animate__heartBeat{-webkit-animation-name:heartBeat;animation-name:heartBeat;-webkit-animation-duration:1.3s;animation-duration:1.3s;-webkit-animation-duration:calc(var(--animate-duration)*1.3);animation-duration:calc(var(--animate-duration)*1.3);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}@-webkit-keyframes backInDown{0%{-webkit-transform:translateY(-1200px) scale(.7);transform:translateY(-1200px) scale(.7);opacity:.7}80%{-webkit-transform:translateY(0) scale(.7);transform:translateY(0) scale(.7);opacity:.7}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes backInDown{0%{-webkit-transform:translateY(-1200px) scale(.7);transform:translateY(-1200px) scale(.7);opacity:.7}80%{-webkit-transform:translateY(0) scale(.7);transform:translateY(0) scale(.7);opacity:.7}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.animate__backInDown{-webkit-animation-name:backInDown;animation-name:backInDown}@-webkit-keyframes backInLeft{0%{-webkit-transform:translateX(-2000px) scale(.7);transform:translateX(-2000px) scale(.7);opacity:.7}80%{-webkit-transform:translateX(0) scale(.7);transform:translateX(0) scale(.7);opacity:.7}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes backInLeft{0%{-webkit-transform:translateX(-2000px) scale(.7);transform:translateX(-2000px) scale(.7);opacity:.7}80%{-webkit-transform:translateX(0) scale(.7);transform:translateX(0) scale(.7);opacity:.7}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.animate__backInLeft{-webkit-animation-name:backInLeft;animation-name:backInLeft}@-webkit-keyframes backInRight{0%{-webkit-transform:translateX(2000px) scale(.7);transform:translateX(2000px) scale(.7);opacity:.7}80%{-webkit-transform:translateX(0) scale(.7);transform:translateX(0) scale(.7);opacity:.7}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes backInRight{0%{-webkit-transform:translateX(2000px) scale(.7);transform:translateX(2000px) scale(.7);opacity:.7}80%{-webkit-transform:translateX(0) scale(.7);transform:translateX(0) scale(.7);opacity:.7}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.animate__backInRight{-webkit-animation-name:backInRight;animation-name:backInRight}@-webkit-keyframes backInUp{0%{-webkit-transform:translateY(1200px) scale(.7);transform:translateY(1200px) scale(.7);opacity:.7}80%{-webkit-transform:translateY(0) scale(.7);transform:translateY(0) scale(.7);opacity:.7}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes backInUp{0%{-webkit-transform:translateY(1200px) scale(.7);transform:translateY(1200px) scale(.7);opacity:.7}80%{-webkit-transform:translateY(0) scale(.7);transform:translateY(0) scale(.7);opacity:.7}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.animate__backInUp{-webkit-animation-name:backInUp;animation-name:backInUp}@-webkit-keyframes backOutDown{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}20%{-webkit-transform:translateY(0) scale(.7);transform:translateY(0) scale(.7);opacity:.7}to{-webkit-transform:translateY(700px) scale(.7);transform:translateY(700px) scale(.7);opacity:.7}}@keyframes backOutDown{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}20%{-webkit-transform:translateY(0) scale(.7);transform:translateY(0) scale(.7);opacity:.7}to{-webkit-transform:translateY(700px) scale(.7);transform:translateY(700px) scale(.7);opacity:.7}}.animate__backOutDown{-webkit-animation-name:backOutDown;animation-name:backOutDown}@-webkit-keyframes backOutLeft{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}20%{-webkit-transform:translateX(0) scale(.7);transform:translateX(0) scale(.7);opacity:.7}to{-webkit-transform:translateX(-2000px) scale(.7);transform:translateX(-2000px) scale(.7);opacity:.7}}@keyframes backOutLeft{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}20%{-webkit-transform:translateX(0) scale(.7);transform:translateX(0) scale(.7);opacity:.7}to{-webkit-transform:translateX(-2000px) scale(.7);transform:translateX(-2000px) scale(.7);opacity:.7}}.animate__backOutLeft{-webkit-animation-name:backOutLeft;animation-name:backOutLeft}@-webkit-keyframes backOutRight{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}20%{-webkit-transform:translateX(0) scale(.7);transform:translateX(0) scale(.7);opacity:.7}to{-webkit-transform:translateX(2000px) scale(.7);transform:translateX(2000px) scale(.7);opacity:.7}}@keyframes backOutRight{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}20%{-webkit-transform:translateX(0) scale(.7);transform:translateX(0) scale(.7);opacity:.7}to{-webkit-transform:translateX(2000px) scale(.7);transform:translateX(2000px) scale(.7);opacity:.7}}.animate__backOutRight{-webkit-animation-name:backOutRight;animation-name:backOutRight}@-webkit-keyframes backOutUp{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}20%{-webkit-transform:translateY(0) scale(.7);transform:translateY(0) scale(.7);opacity:.7}to{-webkit-transform:translateY(-700px) scale(.7);transform:translateY(-700px) scale(.7);opacity:.7}}@keyframes backOutUp{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}20%{-webkit-transform:translateY(0) scale(.7);transform:translateY(0) scale(.7);opacity:.7}to{-webkit-transform:translateY(-700px) scale(.7);transform:translateY(-700px) scale(.7);opacity:.7}}.animate__backOutUp{-webkit-animation-name:backOutUp;animation-name:backOutUp}@-webkit-keyframes bounceIn{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes bounceIn{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}.animate__bounceIn{-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-animation-duration:calc(var(--animate-duration)*0.75);animation-duration:calc(var(--animate-duration)*0.75);-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0) scaleY(3);transform:translate3d(0,-3000px,0) scaleY(3)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0) scaleY(.9);transform:translate3d(0,25px,0) scaleY(.9)}75%{-webkit-transform:translate3d(0,-10px,0) scaleY(.95);transform:translate3d(0,-10px,0) scaleY(.95)}90%{-webkit-transform:translate3d(0,5px,0) scaleY(.985);transform:translate3d(0,5px,0) scaleY(.985)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0) scaleY(3);transform:translate3d(0,-3000px,0) scaleY(3)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0) scaleY(.9);transform:translate3d(0,25px,0) scaleY(.9)}75%{-webkit-transform:translate3d(0,-10px,0) scaleY(.95);transform:translate3d(0,-10px,0) scaleY(.95)}90%{-webkit-transform:translate3d(0,5px,0) scaleY(.985);transform:translate3d(0,5px,0) scaleY(.985)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0) scaleX(3);transform:translate3d(-3000px,0,0) scaleX(3)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0) scaleX(1);transform:translate3d(25px,0,0) scaleX(1)}75%{-webkit-transform:translate3d(-10px,0,0) scaleX(.98);transform:translate3d(-10px,0,0) scaleX(.98)}90%{-webkit-transform:translate3d(5px,0,0) scaleX(.995);transform:translate3d(5px,0,0) scaleX(.995)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0) scaleX(3);transform:translate3d(-3000px,0,0) scaleX(3)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0) scaleX(1);transform:translate3d(25px,0,0) scaleX(1)}75%{-webkit-transform:translate3d(-10px,0,0) scaleX(.98);transform:translate3d(-10px,0,0) scaleX(.98)}90%{-webkit-transform:translate3d(5px,0,0) scaleX(.995);transform:translate3d(5px,0,0) scaleX(.995)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0) scaleX(3);transform:translate3d(3000px,0,0) scaleX(3)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0) scaleX(1);transform:translate3d(-25px,0,0) scaleX(1)}75%{-webkit-transform:translate3d(10px,0,0) scaleX(.98);transform:translate3d(10px,0,0) scaleX(.98)}90%{-webkit-transform:translate3d(-5px,0,0) scaleX(.995);transform:translate3d(-5px,0,0) scaleX(.995)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0) scaleX(3);transform:translate3d(3000px,0,0) scaleX(3)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0) scaleX(1);transform:translate3d(-25px,0,0) scaleX(1)}75%{-webkit-transform:translate3d(10px,0,0) scaleX(.98);transform:translate3d(10px,0,0) scaleX(.98)}90%{-webkit-transform:translate3d(-5px,0,0) scaleX(.995);transform:translate3d(-5px,0,0) scaleX(.995)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0) scaleY(5);transform:translate3d(0,3000px,0) scaleY(5)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0) scaleY(.9);transform:translate3d(0,-20px,0) scaleY(.9)}75%{-webkit-transform:translate3d(0,10px,0) scaleY(.95);transform:translate3d(0,10px,0) scaleY(.95)}90%{-webkit-transform:translate3d(0,-5px,0) scaleY(.985);transform:translate3d(0,-5px,0) scaleY(.985)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0) scaleY(5);transform:translate3d(0,3000px,0) scaleY(5)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0) scaleY(.9);transform:translate3d(0,-20px,0) scaleY(.9)}75%{-webkit-transform:translate3d(0,10px,0) scaleY(.95);transform:translate3d(0,10px,0) scaleY(.95)}90%{-webkit-transform:translate3d(0,-5px,0) scaleY(.985);transform:translate3d(0,-5px,0) scaleY(.985)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.animate__bounceOut{-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-animation-duration:calc(var(--animate-duration)*0.75);animation-duration:calc(var(--animate-duration)*0.75);-webkit-animation-name:bounceOut;animation-name:bounceOut}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0) scaleY(.985);transform:translate3d(0,10px,0) scaleY(.985)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0) scaleY(.9);transform:translate3d(0,-20px,0) scaleY(.9)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0) scaleY(3);transform:translate3d(0,2000px,0) scaleY(3)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0) scaleY(.985);transform:translate3d(0,10px,0) scaleY(.985)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0) scaleY(.9);transform:translate3d(0,-20px,0) scaleY(.9)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0) scaleY(3);transform:translate3d(0,2000px,0) scaleY(3)}}.animate__bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0) scaleX(.9);transform:translate3d(20px,0,0) scaleX(.9)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0) scaleX(2);transform:translate3d(-2000px,0,0) scaleX(2)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0) scaleX(.9);transform:translate3d(20px,0,0) scaleX(.9)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0) scaleX(2);transform:translate3d(-2000px,0,0) scaleX(2)}}.animate__bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0) scaleX(.9);transform:translate3d(-20px,0,0) scaleX(.9)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0) scaleX(2);transform:translate3d(2000px,0,0) scaleX(2)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0) scaleX(.9);transform:translate3d(-20px,0,0) scaleX(.9)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0) scaleX(2);transform:translate3d(2000px,0,0) scaleX(2)}}.animate__bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0) scaleY(.985);transform:translate3d(0,-10px,0) scaleY(.985)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0) scaleY(.9);transform:translate3d(0,20px,0) scaleY(.9)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0) scaleY(3);transform:translate3d(0,-2000px,0) scaleY(3)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0) scaleY(.985);transform:translate3d(0,-10px,0) scaleY(.985)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0) scaleY(.9);transform:translate3d(0,20px,0) scaleY(.9)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0) scaleY(3);transform:translate3d(0,-2000px,0) scaleY(3)}}.animate__bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.animate__fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeInTopLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,-100%,0);transform:translate3d(-100%,-100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInTopLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,-100%,0);transform:translate3d(-100%,-100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__fadeInTopLeft{-webkit-animation-name:fadeInTopLeft;animation-name:fadeInTopLeft}@-webkit-keyframes fadeInTopRight{0%{opacity:0;-webkit-transform:translate3d(100%,-100%,0);transform:translate3d(100%,-100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInTopRight{0%{opacity:0;-webkit-transform:translate3d(100%,-100%,0);transform:translate3d(100%,-100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__fadeInTopRight{-webkit-animation-name:fadeInTopRight;animation-name:fadeInTopRight}@-webkit-keyframes fadeInBottomLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,100%,0);transform:translate3d(-100%,100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInBottomLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,100%,0);transform:translate3d(-100%,100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__fadeInBottomLeft{-webkit-animation-name:fadeInBottomLeft;animation-name:fadeInBottomLeft}@-webkit-keyframes fadeInBottomRight{0%{opacity:0;-webkit-transform:translate3d(100%,100%,0);transform:translate3d(100%,100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInBottomRight{0%{opacity:0;-webkit-transform:translate3d(100%,100%,0);transform:translate3d(100%,100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__fadeInBottomRight{-webkit-animation-name:fadeInBottomRight;animation-name:fadeInBottomRight}@-webkit-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.animate__fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.animate__fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.animate__fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.animate__fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.animate__fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.animate__fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.animate__fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.animate__fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.animate__fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes fadeOutTopLeft{0%{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}to{opacity:0;-webkit-transform:translate3d(-100%,-100%,0);transform:translate3d(-100%,-100%,0)}}@keyframes fadeOutTopLeft{0%{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}to{opacity:0;-webkit-transform:translate3d(-100%,-100%,0);transform:translate3d(-100%,-100%,0)}}.animate__fadeOutTopLeft{-webkit-animation-name:fadeOutTopLeft;animation-name:fadeOutTopLeft}@-webkit-keyframes fadeOutTopRight{0%{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}to{opacity:0;-webkit-transform:translate3d(100%,-100%,0);transform:translate3d(100%,-100%,0)}}@keyframes fadeOutTopRight{0%{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}to{opacity:0;-webkit-transform:translate3d(100%,-100%,0);transform:translate3d(100%,-100%,0)}}.animate__fadeOutTopRight{-webkit-animation-name:fadeOutTopRight;animation-name:fadeOutTopRight}@-webkit-keyframes fadeOutBottomRight{0%{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}to{opacity:0;-webkit-transform:translate3d(100%,100%,0);transform:translate3d(100%,100%,0)}}@keyframes fadeOutBottomRight{0%{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}to{opacity:0;-webkit-transform:translate3d(100%,100%,0);transform:translate3d(100%,100%,0)}}.animate__fadeOutBottomRight{-webkit-animation-name:fadeOutBottomRight;animation-name:fadeOutBottomRight}@-webkit-keyframes fadeOutBottomLeft{0%{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}to{opacity:0;-webkit-transform:translate3d(-100%,100%,0);transform:translate3d(-100%,100%,0)}}@keyframes fadeOutBottomLeft{0%{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}to{opacity:0;-webkit-transform:translate3d(-100%,100%,0);transform:translate3d(-100%,100%,0)}}.animate__fadeOutBottomLeft{-webkit-animation-name:fadeOutBottomLeft;animation-name:fadeOutBottomLeft}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) scaleX(1) translateZ(0) rotateY(-1turn);transform:perspective(400px) scaleX(1) translateZ(0) rotateY(-1turn);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-190deg);transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-170deg);transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95) translateZ(0) rotateY(0deg);transform:perspective(400px) scale3d(.95,.95,.95) translateZ(0) rotateY(0deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}to{-webkit-transform:perspective(400px) scaleX(1) translateZ(0) rotateY(0deg);transform:perspective(400px) scaleX(1) translateZ(0) rotateY(0deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) scaleX(1) translateZ(0) rotateY(-1turn);transform:perspective(400px) scaleX(1) translateZ(0) rotateY(-1turn);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-190deg);transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-170deg);transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95) translateZ(0) rotateY(0deg);transform:perspective(400px) scale3d(.95,.95,.95) translateZ(0) rotateY(0deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}to{-webkit-transform:perspective(400px) scaleX(1) translateZ(0) rotateY(0deg);transform:perspective(400px) scaleX(1) translateZ(0) rotateY(0deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animate__animated.animate__flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}.animate__flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateY(-20deg);transform:perspective(400px) rotateY(-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateY(10deg);transform:perspective(400px) rotateY(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateY(-5deg);transform:perspective(400px) rotateY(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateY(-20deg);transform:perspective(400px) rotateY(-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateY(10deg);transform:perspective(400px) rotateY(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateY(-5deg);transform:perspective(400px) rotateY(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}.animate__flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);opacity:1}to{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);opacity:1}to{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}}.animate__flipOutX{-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-animation-duration:calc(var(--animate-duration)*0.75);animation-duration:calc(var(--animate-duration)*0.75);-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateY(-15deg);transform:perspective(400px) rotateY(-15deg);opacity:1}to{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateY(-15deg);transform:perspective(400px) rotateY(-15deg);opacity:1}to{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}}.animate__flipOutY{-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-animation-duration:calc(var(--animate-duration)*0.75);animation-duration:calc(var(--animate-duration)*0.75);-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY}@-webkit-keyframes lightSpeedInRight{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes lightSpeedInRight{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__lightSpeedInRight{-webkit-animation-name:lightSpeedInRight;animation-name:lightSpeedInRight;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedInLeft{0%{-webkit-transform:translate3d(-100%,0,0) skewX(30deg);transform:translate3d(-100%,0,0) skewX(30deg);opacity:0}60%{-webkit-transform:skewX(-20deg);transform:skewX(-20deg);opacity:1}80%{-webkit-transform:skewX(5deg);transform:skewX(5deg)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes lightSpeedInLeft{0%{-webkit-transform:translate3d(-100%,0,0) skewX(30deg);transform:translate3d(-100%,0,0) skewX(30deg);opacity:0}60%{-webkit-transform:skewX(-20deg);transform:skewX(-20deg);opacity:1}80%{-webkit-transform:skewX(5deg);transform:skewX(5deg)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__lightSpeedInLeft{-webkit-animation-name:lightSpeedInLeft;animation-name:lightSpeedInLeft;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOutRight{0%{opacity:1}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOutRight{0%{opacity:1}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.animate__lightSpeedOutRight{-webkit-animation-name:lightSpeedOutRight;animation-name:lightSpeedOutRight;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes lightSpeedOutLeft{0%{opacity:1}to{-webkit-transform:translate3d(-100%,0,0) skewX(-30deg);transform:translate3d(-100%,0,0) skewX(-30deg);opacity:0}}@keyframes lightSpeedOutLeft{0%{opacity:1}to{-webkit-transform:translate3d(-100%,0,0) skewX(-30deg);transform:translate3d(-100%,0,0) skewX(-30deg);opacity:0}}.animate__lightSpeedOutLeft{-webkit-animation-name:lightSpeedOutLeft;animation-name:lightSpeedOutLeft;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform:rotate(-200deg);transform:rotate(-200deg);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes rotateIn{0%{-webkit-transform:rotate(-200deg);transform:rotate(-200deg);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}.animate__rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn;-webkit-transform-origin:center;transform-origin:center}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}.animate__rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft;-webkit-transform-origin:left bottom;transform-origin:left bottom}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}.animate__rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight;-webkit-transform-origin:right bottom;transform-origin:right bottom}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}.animate__rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft;-webkit-transform-origin:left bottom;transform-origin:left bottom}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}.animate__rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight;-webkit-transform-origin:right bottom;transform-origin:right bottom}@-webkit-keyframes rotateOut{0%{opacity:1}to{-webkit-transform:rotate(200deg);transform:rotate(200deg);opacity:0}}@keyframes rotateOut{0%{opacity:1}to{-webkit-transform:rotate(200deg);transform:rotate(200deg);opacity:0}}.animate__rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut;-webkit-transform-origin:center;transform-origin:center}@-webkit-keyframes rotateOutDownLeft{0%{opacity:1}to{-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{opacity:1}to{-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}}.animate__rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft;-webkit-transform-origin:left bottom;transform-origin:left bottom}@-webkit-keyframes rotateOutDownRight{0%{opacity:1}to{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}}@keyframes rotateOutDownRight{0%{opacity:1}to{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}}.animate__rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight;-webkit-transform-origin:right bottom;transform-origin:right bottom}@-webkit-keyframes rotateOutUpLeft{0%{opacity:1}to{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{opacity:1}to{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}}.animate__rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft;-webkit-transform-origin:left bottom;transform-origin:left bottom}@-webkit-keyframes rotateOutUpRight{0%{opacity:1}to{-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}@keyframes rotateOutUpRight{0%{opacity:1}to{-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}.animate__rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight;-webkit-transform-origin:right bottom;transform-origin:right bottom}@-webkit-keyframes hinge{0%{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate(80deg);transform:rotate(80deg);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate(60deg);transform:rotate(60deg);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}to{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate(80deg);transform:rotate(80deg);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate(60deg);transform:rotate(60deg);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}to{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.animate__hinge{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-duration:calc(var(--animate-duration)*2);animation-duration:calc(var(--animate-duration)*2);-webkit-animation-name:hinge;animation-name:hinge;-webkit-transform-origin:top left;transform-origin:top left}@-webkit-keyframes jackInTheBox{0%{opacity:0;-webkit-transform:scale(.1) rotate(30deg);transform:scale(.1) rotate(30deg);-webkit-transform-origin:center bottom;transform-origin:center bottom}50%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}70%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes jackInTheBox{0%{opacity:0;-webkit-transform:scale(.1) rotate(30deg);transform:scale(.1) rotate(30deg);-webkit-transform-origin:center bottom;transform-origin:center bottom}50%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}70%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.animate__jackInTheBox{-webkit-animation-name:jackInTheBox;animation-name:jackInTheBox}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate(-120deg);transform:translate3d(-100%,0,0) rotate(-120deg)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate(-120deg);transform:translate3d(-100%,0,0) rotate(-120deg)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate(120deg);transform:translate3d(100%,0,0) rotate(120deg)}}@keyframes rollOut{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate(120deg);transform:translate3d(100%,0,0) rotate(120deg)}}.animate__rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.animate__zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.animate__zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.animate__zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.animate__zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.animate__zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}.animate__zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.animate__zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown;-webkit-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0)}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0)}}.animate__zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft;-webkit-transform-origin:left center;transform-origin:left center}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0)}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0)}}.animate__zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight;-webkit-transform-origin:right center;transform-origin:right center}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.animate__zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp;-webkit-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes slideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.animate__slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.animate__slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.animate__slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.animate__slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.animate__slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp} \ No newline at end of file diff --git a/public/style/common/style.css b/public/style/common/style.css index 9b3430c..e3091b2 100644 --- a/public/style/common/style.css +++ b/public/style/common/style.css @@ -23,3 +23,8 @@ html { .navbar-dropdown{ min-width: auto; } + +:root { + --animate-duration: 400ms; + --animate-delay: 0.2s; +} \ No newline at end of file diff --git a/public/style/views/color.css b/public/style/views/color.css new file mode 100644 index 0000000..69cb119 --- /dev/null +++ b/public/style/views/color.css @@ -0,0 +1,95 @@ +.page { + min-height: 100%; + padding-top: 20px; + position: relative; + } + + .color_list { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + } + + .color_list .color_item { + position: relative; + display: inline-block; + border-radius: 5px; + overflow: hidden; + padding: 5px 10px; + cursor: pointer; + width: 100px; + height: 125px; + } + + .color_list .color_item:hover .color_add { + -webkit-transform: translate(-50%, -50%) scale(1.3); + transform: translate(-50%, -50%) scale(1.3); + } + + .color_list .color_item .color_add { + width: 50px; + height: 50px; + position: absolute; + top: 50%; + left: 50%; + -webkit-transition: -webkit-transform .3s linear; + transition: -webkit-transform .3s linear; + transition: transform .3s linear; + transition: transform .3s linear, -webkit-transform .3s linear; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + } + + .color_list .color_item:hover { + background-color: rgba(0, 0, 0, 0.041); + } + + .color_list .color_item:hover .color_toggle_list { + max-height: 99px; + } + + .color_list .color_item .color_toggle_list { + overflow: hidden; + position: absolute; + bottom: 0; + left: 0; + right: 0; + width: 100%; + max-height: 0; + -webkit-transition: max-height .5s linear; + transition: max-height .5s linear; + background-color: rgba(180, 180, 180, 0.274); + } + + .color_list .color_item .color_toggle_list .color_toggle_item { + display: inline-block; + padding: 2px 6px; + } + + .color_list .color_item .color_toggle_list .color_toggle_item:hover { + background-color: rgba(0, 0, 0, 0.185); + } + + .color_list .color_item .color_item_bg { + height: 50px; + background-color: red; + position: relative; + } + + .color_list .color_item .color_item_content .color_item_title { + font-size: 1.2em; + font-weight: bold; + } + + .color_list .color_item .color_item_content .color_item_desc { + color: #a7a6a6; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + } + /*# sourceMappingURL=color.css.map */ \ No newline at end of file diff --git a/route.txt b/route.txt index 9d5ff58..31b9f77 100644 --- a/route.txt +++ b/route.txt @@ -1,6 +1,6 @@ -/home/topuser/Code/@project/hapi-demo/source/route/htmx对应路径: +D:\1XYX\pro\hapi-demo\source\route\htmx对应路径: 不需权限 : GET /htmx/path/{path*} -/home/topuser/Code/@project/hapi-demo/source/route/views对应路径: +D:\1XYX\pro\hapi-demo\source\route\views对应路径: 不需权限(提供无需验证): GET /404 不需权限(提供无需验证): GET / 不需权限(提供无需验证): GET /about diff --git a/source/auth/index.ts b/source/auth/index.ts index 5bcd30f..a8bc49d 100644 --- a/source/auth/index.ts +++ b/source/auth/index.ts @@ -22,8 +22,9 @@ export async function validateSession(request: Req, session) { loggerSite.debug(`${"cooike中存储的用户不存在"}`) return { isValid: false } } + const user = result.toJSON() loggerSite.debug(`${"当前登录ID:" + session.id}`) - return { isValid: true, credentials: result } + return { isValid: true, credentials: user } } else { loggerSite.debug(`${"用户未登录兵器cooike中不存在信息"}`) return { isValid: false } diff --git a/source/db/data.db b/source/db/data.db index 1d2d798bd668a8745aac9551d005e95f9d04c302..a4f5276032cedbff75bb393f5a33796e43631f25 100644 GIT binary patch delta 382 zcmZoTz}Rqrae}m<6axbT8xX?)*F+s-aVZA9w3ocRr z#nlwV!7eT?&e+O4xsiABF-lS~G*HQ_@V1P| z4)ruM^!4`7NbwEJkBST`)pxAS&rNpssj3WjGEXrq$ajsfbj}IPHA)ExE;Dw9m|$dJ zWUOmos%vPfU|?uvYGGw+sb^_usGx0NU}a!{B#TX&7woGP2L4U_DL}_Y@bmaEaWODJ QojAE5-i?uA^7eR70R1>xBLDyZ delta 355 zcmZoTz}Rqrae}mDBy`T2ub8f6&SH>dK?5#Z*3 z&cMWfhk^eN{|BG}7x+au8JWcyON&#BikW~`aB_l}n?LA_2yig*U0~oZ=eqz@cZ83n zQH6XTXl8vmMo(zd#pkkDyVrZZep6*}a=xFShmzZyC ztRH3MWm#C2mm1+{Xgtv0?^lxQQxKS&lNgcVZe(C&tZQJZYiOci zXl7+#Vr62aXJTdmwF)6S`As~xC|n#AEKK~#4E&q;lY#CG=jZih;$mQw1PTLP#WcAf M-i?uS^7eR70Ph!6^Z)<= diff --git a/source/models/Color.ts b/source/models/Color.ts index b8e6ec0..f55a051 100644 --- a/source/models/Color.ts +++ b/source/models/Color.ts @@ -1,24 +1,84 @@ -module.exports = function (sequelize, DataTypes) { - const Color = sequelize.define( - "Color", +import { Sequelize, DataTypes, Optional, Model } from "sequelize" + +interface ColorAttributes { + id: number + /** + * 颜色名 + */ + name: string + /** + * 颜色值 + */ + value: string + /** + * 颜色描述 + */ + desctibe: string + /** + * 示例链接 + */ + example_link: string + + createdAt?: Date + updatedAt?: Date + deletedAt?: Date +} + +export interface ColorInput extends Optional {} +export interface ColorOutput extends Required {} +export type TColorModel = ReturnType + +type DT = typeof DataTypes +export default function ColorModel(sequelize: Sequelize, DataTypes: DT) { + class Color extends Model implements ColorAttributes { + public id!: number + public name!: string + public value!: string + public desctibe: string + public example_link: string + + // timestamps! + public readonly createdAt!: Date + public readonly updatedAt!: Date + public readonly deletedAt!: Date + } + Color.init( { - // 图片地址 - color: { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + name: { + type: DataTypes.STRING, + allowNull: false, + }, + value: { type: DataTypes.STRING, + allowNull: false, }, - title: { + desctibe: { type: DataTypes.STRING, - allowNull: true, }, - describe: { + example_link: { type: DataTypes.STRING, - allowNull: true, }, }, { + modelName: "color", + sequelize, underscored: true, - timestamps: false, + deletedAt: true, + timestamps: true, + paranoid: true, // 对模型施加了一个软删除 }, ) + // 覆盖Color的toJSON方法 + Color.prototype.toJSON = function () { + const values = Object.assign({}, this.get()) as ColorAttributes + delete values.deletedAt + return values + } + Color.associate = function (models) {} return Color } diff --git a/source/models/user.ts b/source/models/user.ts index d34ccf5..d72ec87 100644 --- a/source/models/user.ts +++ b/source/models/user.ts @@ -4,10 +4,14 @@ interface UserAttributes { id: number username: string password: string + nickname: string + email: string + avatar: string + tel: string - created_at?: Date - updated_at?: Date - deleted_at?: Date + createdAt?: Date + updatedAt?: Date + deletedAt?: Date } export interface UserInput extends Optional { } @@ -20,11 +24,15 @@ export default function UserModel(sequelize: Sequelize, DataTypes: DT) { public id!: number public username!: string public password!: string + public nickname: string + public email: string + public avatar: string + public tel: string // timestamps! - public readonly created_at!: Date - public readonly updated_at!: Date - public readonly deleted_at!: Date + public readonly createdAt!: Date + public readonly updatedAt!: Date + public readonly deletedAt!: Date } User.init( { @@ -41,6 +49,19 @@ export default function UserModel(sequelize: Sequelize, DataTypes: DT) { type: DataTypes.STRING, allowNull: false, }, + nickname: { + type: DataTypes.STRING, + allowNull: false, + }, + email: { + type: DataTypes.STRING, + }, + avatar: { + type: DataTypes.STRING, + }, + tel: { + type: DataTypes.STRING, + }, }, { modelName: "user", @@ -55,11 +76,11 @@ export default function UserModel(sequelize: Sequelize, DataTypes: DT) { User.prototype.toJSON = function () { const values = Object.assign({}, this.get()) as UserAttributes delete values.password - delete values.deleted_at + delete values.deletedAt return values } User.associate = function (models) { - User.hasOne(models["user_info"]) + } return User } \ No newline at end of file diff --git a/source/models/user_info.ts b/source/models/user_info.ts deleted file mode 100644 index 753945d..0000000 --- a/source/models/user_info.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { Sequelize, DataTypes, Optional, Model } from "sequelize" - -interface UserInfoAttributes { - id: number - user_id: number - nickname: string - email: string - avatar: string - tel: string - - created_at?: Date - updated_at?: Date - deleted_at?: Date -} - -export interface UserInfoInput extends Optional { } -export interface UserInfoOuput extends Required { } -export type TUserInfoModel = ReturnType - -type DT = typeof DataTypes -export default function UserInfoModel(sequelize: Sequelize, DataTypes: DT) { - class UserInfo extends Model implements UserInfoAttributes { - public id: number - public user_id: number - public nickname: string - public email: string - public avatar: string - public tel: string - - // timestamps! - public readonly created_at!: Date - public readonly updated_at!: Date - public readonly deleted_at!: Date - } - UserInfo.init( - { - id: { - type: DataTypes.INTEGER, - autoIncrement: true, - primaryKey: true, - }, - user_id: { - type: DataTypes.INTEGER, - allowNull: false, - references: { - model: "user", - key: 'id', - }, - }, - nickname: { - type: DataTypes.STRING, - allowNull: false, - }, - email: { - type: DataTypes.STRING, - }, - avatar: { - type: DataTypes.STRING, - }, - tel: { - type: DataTypes.STRING, - }, - }, - { - modelName: "user_info", - sequelize, - underscored: true, - deletedAt: true, - timestamps: true, - paranoid: true, // 对模型施加了一个软删除 - }, - ) - // 覆盖User的toJSON方法 - UserInfo.prototype.toJSON = function () { - const values = Object.assign({}, this.get()) as UserInfoOuput - delete values.deleted_at - return values - } - UserInfo.associate = function (models) { - // User删除时对应的UserInfo同步删除 - models["user_info"].belongsTo(models["user"], { foreignKey: "user_id", onDelete: "CASCADE", hooks: true }) - } - return UserInfo -} diff --git a/source/route/views/index.ts b/source/route/views/index.ts new file mode 100644 index 0000000..e08ae05 --- /dev/null +++ b/source/route/views/index.ts @@ -0,0 +1,97 @@ +import { auth, config, method, route, swagger, validate } from "@noderun/hapi-router" +import { Req, Res, ReturnValue } from "#/global" +import path from "path" +import fs from "fs-extra" +import { baseDir, gFail } from "@/util" +import MarkdownIt from "markdown-it" + +export default class Index { + @auth("try") + async index(request: Req, h: Res): ReturnValue { + if (request.auth.isAuthenticated) { + // 登录了 + } else { + // 未登录 + } + return h.view("views/index.pug", { isLogin: request.auth.isAuthenticated }) + } + + @route("/about") + @auth("try") + async about(request: Req, h: Res) { + const isRenderHtmx = Reflect.has(request.query, "htmx") + if (!request.auth.isAuthenticated) { + if (isRenderHtmx) { + // https://github.com/hapijs/hapi/issues/4443 + // https://github.com/hapijs/hapi/issues/4212 + return h.response().header("HX-Redirect", `/login?next=${encodeURIComponent(request.path)}`) + } + return h.redirect(`/login?next=${encodeURIComponent(request.path)}`).takeover() + } + const md = new MarkdownIt() + var result = md.render("# markdown-it rulezz!") + const data = { + md: result + } + if (isRenderHtmx) { + return h.view("htmx/path/about.pug", data) + } + return h.view("views/about.pug", data) + } + + @route("/docs/{path*}") + @auth() + async docs(req: Req, h: Res): ReturnValue { + // const {id} = req.auth.credentials + // try { + // req.cookieAuth.ttl(720 * 24 * 60 * 60 * 1000) + // req.cookieAuth.set({ id: id }); + // } catch (error) { + // console.log(error); + + // } + if (req.params && req.params.path.endsWith(".md")) { + // console.log(path.resolve(baseDir, "docs/"+"*.md")); + // console.log(await glob("docs/"+"*.md")); + const mdPath = path.resolve(baseDir, "docs/" + req.params.path) + if (fs.existsSync(mdPath)) { + const str = fs.readFileSync(mdPath, "utf8") + console.log("---->", mdPath) + + return h.view("views/css.pug", { + content: str.toString(), + }) + } + // 解析文档 + return h.view("views/css.pug") + } + // 404页面 + return h.redirect("/404") + } + @route("/{path*}") + async any(req: Req, h: Res): ReturnValue { + if (req.path) { + const filePath = path.resolve(baseDir, "template/views", "."+req.path+".pug") + if(fs.existsSync(filePath)){ + return h.view(`views${req.path}.pug`) + } + } + console.log("404: ", req.raw.req.url) + return h.redirect("/404?r=" + encodeURIComponent(req.raw.req.url)) + } + @route("/404") + @auth("try") + async 404(request: Req, h: Res): ReturnValue { + if (request.auth.isAuthenticated) { + // 登录了 + } else { + // 未登录 + } + if (request.query?.r) { + // 可重定向返回 + } + return h.view("404.pug", { + rollback: request.query?.r, + }) + } +} diff --git a/source/route/views/index/index.ts b/source/route/views/index/index.ts deleted file mode 100644 index 560f0b9..0000000 --- a/source/route/views/index/index.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { auth, config, method, route, swagger, validate } from "@noderun/hapi-router" -import { Req, Res, ReturnValue } from "#/global" -import path from "path" -import fs from "fs-extra" -import { baseDir, gFail } from "@/util" -import MarkdownIt from "markdown-it" - -export default class Index { - @auth("try") - async index(request: Req, h: Res): ReturnValue { - if (request.auth.isAuthenticated) { - // 登录了 - } else { - // 未登录 - } - return h.view("views/index.pug", { isLogin: request.auth.isAuthenticated }) - } - - @route("/about") - @auth("try") - async about(request: Req, h: Res) { - const isRenderHtmx = Reflect.has(request.query, "htmx") - if (!request.auth.isAuthenticated) { - if (isRenderHtmx) { - // https://github.com/hapijs/hapi/issues/4443 - // https://github.com/hapijs/hapi/issues/4212 - return h.response().header("HX-Redirect", `/login?next=${encodeURIComponent(request.path)}`) - } - return h.redirect(`/login?next=${encodeURIComponent(request.path)}`).takeover() - } - const { id } = request.auth.credentials - - const UserInfoModel = request.getModel("user_info") - let res = await UserInfoModel.findOne({ where: { user_id: id } }) - if (res == null) { - request.yar.flash("warning", "不存在此用户信息") - return h.redirect(`/`).takeover() - } - const userinfo = res.toJSON() - - const md = new MarkdownIt() - var result = md.render("# markdown-it rulezz!") - const data = { - md: result, - user: userinfo, - } - if (isRenderHtmx) { - return h.view("htmx/path/about.pug", data) - } - return h.view("views/about.pug", data) - } - - @route("/docs/{path*}") - @auth() - async docs(req: Req, h: Res): ReturnValue { - // const {id} = req.auth.credentials - // try { - // req.cookieAuth.ttl(720 * 24 * 60 * 60 * 1000) - // req.cookieAuth.set({ id: id }); - // } catch (error) { - // console.log(error); - - // } - if (req.params && req.params.path.endsWith(".md")) { - // console.log(path.resolve(baseDir, "docs/"+"*.md")); - // console.log(await glob("docs/"+"*.md")); - const mdPath = path.resolve(baseDir, "docs/" + req.params.path) - if (fs.existsSync(mdPath)) { - const str = fs.readFileSync(mdPath, "utf8") - console.log("---->", mdPath) - - return h.view("views/css.pug", { - content: str.toString(), - }) - } - // 解析文档 - return h.view("views/css.pug") - } - // 404页面 - return h.redirect("/404") - } - @route("/{path*}") - async any(req: Req, h: Res): ReturnValue { - console.log("404: ", req.raw.req.url) - return h.redirect("/404?r=" + encodeURIComponent(req.raw.req.url)) - } - @route("/404") - @auth("try") - async 404(request: Req, h: Res): ReturnValue { - if (request.auth.isAuthenticated) { - // 登录了 - } else { - // 未登录 - } - if (request.query?.r) { - // 可重定向返回 - } - return h.view("404.pug", { - rollback: request.query?.r, - }) - } -} diff --git a/source/route/views/register.ts b/source/route/views/register.ts index 9f12c4a..30247e1 100644 --- a/source/route/views/register.ts +++ b/source/route/views/register.ts @@ -33,7 +33,6 @@ export default class { async register_POST(request: Req, h: Res): ReturnValue { let { username, password } = request.payload as any const User = request.getModel("user") - const UserInfoModel = request.getModel("user_info") logger.trace("当前注册用户:" + username) try { const result = await User.findOne({ where: { username: username } }) @@ -43,12 +42,7 @@ export default class { } let salt = bcrypt.genSaltSync(10) let pwdLock = bcrypt.hashSync(password, salt) - // 使用事务插入 - await sequelize.transaction(async t => { - const user = await User.create({ username, password: pwdLock }, { transaction: t }) - await UserInfoModel.create({ nickname: username, user_id: user.id }, { transaction: t }) - return user - }) + await User.create({ username, password: pwdLock, nickname: username }) request.yar.flash("success", "用户注册成功") return h.redirect("/login") } catch (e) { diff --git a/source/route/views/user.ts b/source/route/views/user.ts index 464c03e..a314f0f 100644 --- a/source/route/views/user.ts +++ b/source/route/views/user.ts @@ -13,16 +13,10 @@ export default class { async index(request: Req, h: Res): ReturnValue { const isRenderHtmx = Reflect.has(request.query, "htmx") const { id } = request.auth.credentials - const UserInfoModel = request.getModel("user_info") - let result = await UserInfoModel.findOne({ where: { user_id: id } }) - if (result == null) { - return gFail(null, "不存在该用户") - } - const userinfo = result.toJSON() if (isRenderHtmx) { - return h.view("htmx/path/user.pug", { userinfo }) + return h.view("htmx/path/user.pug") } - return h.view("views/user.pug", { userinfo }) + return h.view("views/user.pug") } @method("GET") diff --git a/source/run.ts b/source/run.ts index 1e884c6..8f6bcf7 100644 --- a/source/run.ts +++ b/source/run.ts @@ -1,7 +1,7 @@ "use strict" import plugins from "@/plugins" import path from "path" -import { baseDir, isDev, templateDir } from "@/util" +import { baseDir, isDev, sourceDir, templateDir } from "@/util" import { validateJwt, validateSession } from "./auth" import Hapi, { Server } from "@hapi/hapi" import { Sequelize } from "sequelize" @@ -21,13 +21,27 @@ const run = async (): Promise => { request: ['error'] } : false }) + server.events.on('request', (request, event, tags) => { + if (tags.error) { + loggerSite.error(event); + } else { + loggerSite.info(event); + } + }); + server.events.on('log', (event, tags) => { + if (tags.error) { + loggerSite.error(event); + } else { + loggerSite.info(event); + } + }); await server.register([ { plugin: require('hapi-sequelizejs'), options: [ { name: "data", // identifier - models: [__dirname + "/models/**/*.ts"], // paths/globs to model files + models: ["source/models/**/*.ts"], // paths/globs to model files // ignoredModels: [__dirname + "/server/models/**/*.js"], // OPTIONAL: paths/globs to ignore files sequelize: sequelize, // sequelize instance sync: true, // sync models - default false diff --git a/template/helper/flush.pug b/template/helper/flush.pug index b2a51f3..888b14d 100644 --- a/template/helper/flush.pug +++ b/template/helper/flush.pug @@ -1,41 +1,42 @@ //- 服务器反馈UI +include @/helper/helper.pug if flash .message-container - index = 0 if flash.error each item in flash.error - index++ - .message.is-danger(id="message"+index) + .message.is-danger.animate__animated.animate__slideInRight(id="message"+index) .message-header p 错误 - button.delete(aria-label='delete' data-target="message"+index) + button.delete.messagec(aria-label='delete' data-target="message"+index) .message-body | #{item} if flash.success each item in flash.success - index++ - .message.is-success(id="message"+index) + .message.is-success.animate__animated.animate__slideInRight(id="message"+index) .message-header p 成功 - button.delete(aria-label='delete' data-target="message"+index) + button.delete.messagec(aria-label='delete' data-target="message"+index) .message-body | #{item} if flash.info each item in flash.info - index++ - .message.is-info(id="message"+index) + .message.is-info.animate__animated.animate__slideInRight(id="message"+index) .message-header p 信息 - button.delete(aria-label='delete' data-target="message"+index) + button.delete.messagec(aria-label='delete' data-target="message"+index) .message-body | #{item} if flash.warning each item in flash.warning - index++ - .message.is-warning(id="message"+index) + .message.is-warning.animate__animated.animate__slideInRight(id="message"+index) .message-header p 警告 - button.delete(aria-label='delete' data-target="message"+index) + button.delete.messagec(aria-label='delete' data-target="message"+index) .message-body | #{item} //- .toast-container.top-0.end-0.p-3 @@ -60,3 +61,4 @@ if flash //- ul //- each item in flash.error //- li #{item} + +script("js/common/flush.js") diff --git a/template/helper/helper.pug b/template/helper/helper.pug index 173788e..e25c111 100644 --- a/template/helper/helper.pug +++ b/template/helper/helper.pug @@ -5,6 +5,3 @@ mixin script(src) mixin security include ./form_security.pug - -mixin security - include ./form_security.pug diff --git a/template/htmx/path/user.pug b/template/htmx/path/user.pug index 3540890..a2b3dd9 100644 --- a/template/htmx/path/user.pug +++ b/template/htmx/path/user.pug @@ -4,4 +4,12 @@ block var -title=user.nickname || "Welcome" // 网页标题 title #{user.nickname || "Welcome"} -div user \ No newline at end of file +div user +section.section + .container + if user + div nickname: #{user.nickname || "None"} + div email: #{user.email || "None"} + div username: #{user.username || "None"} + div id: #{user.id || "None"} + \ No newline at end of file diff --git a/template/layout/layout.pug b/template/layout/layout.pug index 63bc20a..66b84c4 100644 --- a/template/layout/layout.pug +++ b/template/layout/layout.pug @@ -10,11 +10,14 @@ html(lang="zh-cn" class=hideHeader?"":"has-navbar-fixed-top") meta(name="viewport", content="width=device-width, initial-scale=1.0") title #{title || 'WEB'} //- link(rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css") + +css("style/common/animate.min.css") +css("style/common/bulma.min.css") +css("style/common/style.css") block head + script!= "window.STATIC_USER = "+JSON.stringify(user) + //- window.STATIC_DATA = #{JSON.stringify(user)} body - include @/helper/flush.pug + //- include @/helper/flush.pug if !hideHeader include @/ui/header.pug block content diff --git a/template/views/color.pug b/template/views/color.pug new file mode 100644 index 0000000..377b300 --- /dev/null +++ b/template/views/color.pug @@ -0,0 +1,51 @@ +extends /layout/layout + +block var + -title="颜色表" // 网页标题 + +block head + link(rel="stylesheet", href="/public/style/views/color.css") + +block content + div(class="container page") + div(class="color_list") + - + var list=[ + { color:"#999999",title: "辅助色",describe:"灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色"}, + { color:"#999999",title: "辅助色",describe:"灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色"}, + { color:"#999999",title: "辅助色",describe:"灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色"}, + { color:"#000000",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + { color:"#999999",title: "辅助色",describe:""}, + ] + each item in list + div(class="color_item") + div(class="color_item_bg" style=`background: ${item.color}`) + div(class="color_toggle_list") + div(class="color_toggle_item") hex + div(class="color_toggle_item") rgba + div(class="color_item_name") #{item.color} + div(class="color_item_content") + div(class="color_item_title") #{item.title} + div(class="color_item_desc") #{item.describe || "暂无描述"} + div(class="color_item") + img(src="/public/image/add.png", alt="添加" title="添加" class="color_add") + div + form(action="POST" method="post") + div(class=".wrapper_input"): input(type="text" tabindex="1" value="sadsa" name="a") + div(class=".wrapper_input"): input(type="text" tabindex="3" value="sadsa" name="b") + button(type="submit" tabindex="2") 提交 diff --git a/template/views/resume.pug b/template/views/resume.pug new file mode 100644 index 0000000..b4f567e --- /dev/null +++ b/template/views/resume.pug @@ -0,0 +1,75 @@ +doctype html +html(lang='zh') + head + meta(charset='UTF-8') + meta(name='viewport', content='maximum-scale=1,minimum-scale=1,user-scalable=0,width=device-width,initial-scale=1') + meta(http-equiv='X-UA-Compatible', content='ie=edge') + title Edit-个人简历 + link(rel='stylesheet', href='/public/static/css/prism.css') + link(rel='stylesheet', href='/public/static/css/index.css') + style#styleContent + body + pre#codeEdit.language-css(onscroll='toggleScrollBar(event)') + #resume(onscroll='toggleScrollBar(event)') + script(src='/public/static/js/textarr.js') + script(src='/public/static/js/write.js') + script. + + let currentIndex_ = 0 + function writeIntro (intro='', time, callback) { + let connect = document.querySelectorAll('.connect') + if(connect.length < 1){ + resume.innerHTML = intro + }else{ + connect[connect.length-1].innerHTML = intro + } + setTimeout(() => { + callback() + }, time); + } + function startResume () { + writeIntro(balloon, 700, ()=>{ + writeIntro(line, 200, ()=>{ + writeIntro(text, 0, ()=>{ + writeText(textArr[currentIndex_]) + }) + }) + }) + } + + let num = 0 + let t = setInterval(() => { + if(num <= style.length){ + codeEdit.innerHTML = Prism.highlight(style.substr(0, num), Prism.languages.css); + codeEdit.scrollTop = 100000 + styleContent.innerHTML = style.substr(0, num) + num++ + }else{ + clearInterval(t) + } + }, 70) + setTimeout(() => { + if(document.body.clientWidth < 500){ + setTimeout(() => { + resume.style.cssText = 'height:70vh!important' + }, 5000); + } + startResume() + }, 10000); + + script(src='/public/static/js/prism.js') + script. + + let sbTimer = null + function toggleScrollBar (self) { + self = self.target + clearTimeout(sbTimer) + + if(self.getAttribute('class') != 'sbShow') + self.classList.add('sbShow') + + sbTimer = setTimeout(() => { + self.classList.remove('sbShow') + }, 800); + } + \ No newline at end of file diff --git a/types/global.d.ts b/types/global.d.ts index 787c5e2..3dda974 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -2,8 +2,8 @@ import { Logger } from "log4js" import { Server } from "@hapi/hapi" import { Request, ResponseToolkit, Lifecycle } from "@hapi/hapi" import { TUserModel } from "@/models/user" +import { TColorModel } from "@/models/color" import yar from "@hapi/yar" -import { TUserInfoModel } from "@/models/user_info" declare global { var server: Server @@ -14,7 +14,7 @@ declare global { interface Models { user: TUserModel - user_info: TUserInfoModel + color: TColorModel } declare module "sequelize" {