diff --git a/404.html b/404.html index cb040f72a..911ac1be5 100644 --- a/404.html +++ b/404.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/asset-manifest.json b/asset-manifest.json index ec6ad6d58..1a8311e8f 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,7 +1,7 @@ { "files": { - "main.js": "/static/js/main.4d6aa943.chunk.js", - "main.js.map": "/static/js/main.4d6aa943.chunk.js.map", + "main.js": "/static/js/main.f92c850d.chunk.js", + "main.js.map": "/static/js/main.f92c850d.chunk.js.map", "runtime-main.js": "/static/js/runtime-main.be1c4acc.js", "runtime-main.js.map": "/static/js/runtime-main.be1c4acc.js.map", "static/css/2.b40bc0a3.chunk.css": "/static/css/2.b40bc0a3.chunk.css", @@ -16,7 +16,7 @@ "static/js/6.bb991c43.chunk.js": "/static/js/6.bb991c43.chunk.js", "static/js/6.bb991c43.chunk.js.map": "/static/js/6.bb991c43.chunk.js.map", "index.html": "/index.html", - "precache-manifest.a58da76c38155cfdcd09eb0108d7ad6a.js": "/precache-manifest.a58da76c38155cfdcd09eb0108d7ad6a.js", + "precache-manifest.b3ea4840ca7d1312ddba9e9dbb49a140.js": "/precache-manifest.b3ea4840ca7d1312ddba9e9dbb49a140.js", "service-worker.js": "/service-worker.js", "static/css/2.b40bc0a3.chunk.css.map": "/static/css/2.b40bc0a3.chunk.css.map", "static/js/2.36973ed5.chunk.js.LICENSE.txt": "/static/js/2.36973ed5.chunk.js.LICENSE.txt", @@ -29,6 +29,6 @@ "static/js/runtime-main.be1c4acc.js", "static/css/2.b40bc0a3.chunk.css", "static/js/2.36973ed5.chunk.js", - "static/js/main.4d6aa943.chunk.js" + "static/js/main.f92c850d.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index cb040f72a..911ac1be5 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/precache-manifest.a58da76c38155cfdcd09eb0108d7ad6a.js b/precache-manifest.b3ea4840ca7d1312ddba9e9dbb49a140.js similarity index 90% rename from precache-manifest.a58da76c38155cfdcd09eb0108d7ad6a.js rename to precache-manifest.b3ea4840ca7d1312ddba9e9dbb49a140.js index 27be01ba7..96c8d463b 100644 --- a/precache-manifest.a58da76c38155cfdcd09eb0108d7ad6a.js +++ b/precache-manifest.b3ea4840ca7d1312ddba9e9dbb49a140.js @@ -1,6 +1,6 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ { - "revision": "ba3d2490b7d8726470568c316f05ea47", + "revision": "f96a74b1e529140de5c203e37d0a4eef", "url": "/index.html" }, { @@ -32,8 +32,8 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "/static/js/6.bb991c43.chunk.js" }, { - "revision": "123617db2419f1ee5b2e", - "url": "/static/js/main.4d6aa943.chunk.js" + "revision": "1b6d618107cf12d74aa1", + "url": "/static/js/main.f92c850d.chunk.js" }, { "revision": "df3aaab765ffbdb9fe1e", diff --git a/service-worker.js b/service-worker.js index 8c28a3af2..dc3ff0dcf 100644 --- a/service-worker.js +++ b/service-worker.js @@ -14,7 +14,7 @@ importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); importScripts( - "/precache-manifest.a58da76c38155cfdcd09eb0108d7ad6a.js" + "/precache-manifest.b3ea4840ca7d1312ddba9e9dbb49a140.js" ); self.addEventListener('message', (event) => { diff --git a/static/js/main.4d6aa943.chunk.js b/static/js/main.f92c850d.chunk.js similarity index 68% rename from static/js/main.4d6aa943.chunk.js rename to static/js/main.f92c850d.chunk.js index 0200c77da..7c3345a5e 100644 --- a/static/js/main.4d6aa943.chunk.js +++ b/static/js/main.f92c850d.chunk.js @@ -1,2 +1,2 @@ -(this["webpackJsonpdeveloper-portfolio-app"]=this["webpackJsonpdeveloper-portfolio-app"]||[]).push([[0],{163:function(e,t,a){var n={"./certificates.md":[167,3],"./education.md":[168,4],"./projects.md":[169,5],"./skills.md":[170,6]};function o(e){if(!a.o(n,e))return Promise.resolve().then((function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}));var t=n[e],o=t[0];return a.e(t[1]).then((function(){return a.t(o,7)}))}o.keys=function(){return Object.keys(n)},o.id=163,e.exports=o},165:function(e,t,a){"use strict";a.r(t);var n=a(0),o=a.n(n),r=a(46),i=a.n(r),l=(a(64),a(14)),s=a(47),c=a(5);l.b.add(s.a,c.g,c.f,c.a,c.c,c.j,c.n,c.b,c.m,c.k,c.l,c.e,c.i,c.d,c.h);var u,p,m,g=a(11),d=a(3),h=a(10),f=a(2),b=a(16),w=a(13),S=a(8),v="45rem",y=50,x=200,E=40,N=22,k="'Ubuntu', sans-serif",j={root:{'& a[aria-current="page"] span':{display:"inline-block !important"}},navText:Object(d.a)({marginLeft:"8px"},"@media screen and (max-width: ".concat(v,")"),{display:"none"}),currentTab:{"& .closeButton":(u={color:"#abb2bf",marginLeft:"8px",paddingLeft:"8px"},Object(d.a)(u,"@media screen and (max-width: ".concat(v,")"),{paddingLeft:"8px"}),Object(d.a)(u,"&:hover",{color:"#f3f3f3"}),u)},otherTab:{"& .closeButton":{display:"none"}}},z=["name","url","mdFileName"],O=Object(f.a)(j),D=function(e){var t=e.name,a=e.url,n=(e.mdFileName,Object(w.a)(e,z)),r=O();return o.a.createElement("span",{className:r.root},o.a.createElement(g.a,{to:a,getProps:function(e){return{className:e.isCurrent?r.currentTab:r.otherTab}}},o.a.createElement(S.a,Object.assign({},n,{size:n.size||"lg"})),o.a.createElement("span",{className:r.navText},t),o.a.createElement(S.a,{onClick:function(e){e.preventDefault(),e.stopPropagation(),Object(g.d)("/")},className:"closeButton",icon:"times",size:"1x",title:"Close"})))},C=a(4),I=a.n(C),M={root:{fontFamily:k,height:E},list:{color:"#abb2bf",listStyle:"none",margin:"0",padding:"0"},listItem:{display:"inline-block","& a":(p={borderRight:"1px solid ".concat(I()("#282c34").darken(.05).string()),borderTop:"4px solid ".concat("#21252b"),cursor:"pointer",display:"inline-block",fontSize:"1.2rem",letterSpacing:"0.5px",padding:"10px 15px",textTransform:"lowercase",transition:"background, border-color 250ms ease"},Object(d.a)(p,"@media screen and (max-width: ".concat(v,")"),{letterSpacing:"0",padding:"10px"}),Object(d.a)(p,'&:hover, &[aria-current="page"]',{borderTopColor:"#21252b",background:I()("#21252b").lighten(.02).string(),color:"#f3f3f3"}),Object(d.a)(p,'&[aria-current="page"]',{background:"#282c34",borderTopColor:I()("#21252b").lighten(.05).string()}),p)}},T=Object(f.a)(M),H=function(e){var t=e.tabs,a=T();return o.a.createElement("nav",{className:a.root},o.a.createElement("ul",{className:a.list},t.map((function(e){return o.a.createElement("li",{className:a.listItem,key:e.name},o.a.createElement(D,e))}))))},A={root:{background:"#21252b",position:"sticky",top:0,left:0,width:"100%",height:E}},B=Object(f.a)(A),F=function(e){var t=e.tabs,a=B();return o.a.createElement("header",{className:a.root},o.a.createElement(H,{tabs:t}))},P={link:{color:"#9599a0",cursor:"pointer",marginBottom:"10px",transition:"color 100ms ease","&:hover":{color:I()("#9599a0").lighten(.2).string()},"&:last-of-type":{marginBottom:"20px"}},iconWrapper:{position:"relative",display:"inline-block"},icon:{padding:"10px"},badge:{position:"absolute",right:"4px",top:"4px",fontSize:"0.8em",backgroundColor:"#98c379",borderRadius:"4px",color:"#111",padding:"1px 2px",opacity:"0.9"}},W=Object(f.a)(P),L=function(e){var t=e.name,a=e.url,n=e.icon,r=e.isInternal,i=e.badge,l=W(),s=o.a.createElement("span",{className:l.iconWrapper},o.a.createElement(S.a,{className:l.icon,icon:n,size:"lg"}),i&&o.a.createElement("span",{className:l.badge},i));return r?o.a.createElement(g.a,{to:a,key:"left-bar-".concat(t),className:l.link,"aria-label":t,title:t},s):o.a.createElement("a",{href:a,key:"left-bar-".concat(t),className:l.link,"aria-label":"Find me on ".concat(t),title:"Find me on ".concat(t),target:"_blank",rel:"noopener noreferrer"},s)},J=a(50),G=a.n(J),R={root:{background:"#21252b",borderRadius:"4px",color:"#abb2bf",display:"flex",margin:"8px",transition:"color 500ms ease","&:hover":{background:I()("#21252b").darken(.1).string()},"&:hover .icon":{color:"#42a5f5"}},contents:{alignItems:"center",display:"flex",minHeight:"24px",padding:"6px 10px"},text:{fontSize:"1.2rem",fontWeight:400,marginLeft:"6px"},count:{fontSize:"1.2rem",background:I()("#21252b").lighten(.5).string(),borderRadius:"50%",marginLeft:"10px",padding:"4px 8px"}},U=Object(f.a)(R),_=function(e){var t=e.href,a=e.title,n=e.icon,r=e.size,i=e.text,l=e.showCount,s=e.count,c=U();return o.a.createElement("a",{className:c.root,href:t,"aria-label":a,title:a,target:"_blank",rel:"noopener noreferrer"},o.a.createElement("span",{className:c.contents},o.a.createElement(S.a,{className:"icon",icon:n,size:r||"lg"}),o.a.createElement("span",{className:c.text},i),!!l&&o.a.createElement("span",{className:c.count},s)))},K=a(18),V=a.n(K),q=a(24),Y=a(27),Z=a.n(Y),X=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"DD/MM/YYYY";return Z()(e).format(t)},Q=function(e,t){var a=e.reduce((function(e,t){return e+t}),0);return parseFloat((a/e.length).toFixed(t))},$=function(e){var t=e.progress,a=t.completed,n=t.total;return parseFloat((a/n*100).toFixed(0))},ee=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=e.sections,n=a.map($);return Q(n,t)},te=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=e.courses.filter((function(e){return!e.isOptional})),n=a.map(ee);return Q(n,t)},ae=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=e.semesters,n=a.map(te);return Q(n,t)},ne=a(35),oe=function(e){return{data:e,lastChecked:Date.now()}},re=function(e,t){return void 0!==e.data&&!function(e,t){return Date.now()>e.lastChecked+60*t*1e3}(e,t)},ie=["resource","timeout"],le=function(e){var t=e.resource,a=t.attr,r=t.endpoint,i=e.timeout,l=void 0===i?10:i,s=Object(w.a)(e,ie),c=Object(n.useState)(!1),u=Object(h.a)(c,2),p=u[0],m=u[1],g=function(e,t){var a=Object(n.useState)((function(){var a,n=oe(t);try{a=JSON.parse(window.localStorage.getItem(e)||JSON.stringify(n))}catch(o){a=n}return a})),o=Object(h.a)(a,2),r=o[0],i=o[1];return Object(n.useEffect)((function(){window.localStorage.setItem(e,JSON.stringify(r))}),[r,e]),[r,i]}(a,void 0),d=Object(h.a)(g,2),f=d[0],b=d[1];return Object(n.useEffect)((function(){var e=function(){var e=Object(q.a)(V.a.mark((function e(){var t,n;return V.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(r);case 2:return t=e.sent,e.next=5,t.json();case 5:(n=e.sent)[a]>=0&&b(oe(n[a])),m(!1);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();re(f,l)||e()})),o.a.createElement(_,Object.assign({},s,{showCount:!p&&void 0!==f,count:f.data}))},se=Object(f.a)({root:{display:"flex",flexDirection:"column",marginTop:"50px","& div":{display:"flex",alignItems:"center",justifyContent:"center"}}}),ce=function(e){var t=e.contactData,a=e.repoUrl,n=se(),r=function(e){var t=new URL(e).pathname.split("/");return{repo:t.pop()||"",username:t.pop()||""}}(a),i=r.repo,l=r.username,s=[{resource:{endpoint:"https://api.github.com/users/".concat(l),attr:"followers"},href:"https://github.com/".concat(l),title:"Follow @".concat(l," on GitHub"),icon:["fab","github"],size:"lg",text:"Follow @".concat(l)},{resource:{endpoint:"https://api.github.com/repos/".concat(l,"/").concat(i),attr:"stargazers_count"},href:a,title:"Star ".concat(l,"/").concat(i," on GitHub"),icon:"star",size:"sm",text:"Star"}],c=t.find((function(e){return e.isMain}));return o.a.createElement("div",{className:n.root},o.a.createElement("div",null,s.map((function(e){return o.a.createElement(le,Object.assign({key:"gh-btn-".concat(e.resource.attr)},e))}))),o.a.createElement("div",null,o.a.createElement(_,{href:c.url,title:"Find me on ".concat(c.name),icon:c.icon,size:"lg",text:"Contact Me"})))},ue=a(51),pe=a(6),me=function(e){var t=e.title,a=e.description,n=e.lang,r=void 0===n?"en":n,i=e.meta,l=void 0===i?[]:i,s=a||pe.description;return o.a.createElement(ue.a,{htmlAttributes:{lang:r},title:t,titleTemplate:"%s \u2022 ".concat(pe.title),meta:[{name:"description",content:s},{name:"keywords",content:pe.keywords},{name:"canonical",content:pe.homepage},{name:"theme-color",content:pe.themeColor},{property:"og:title",content:pe.title},{property:"og:description",content:pe.description},{property:"og:type",content:"website"},{property:"og:url",content:pe.homepage},{property:"og:image",content:pe.image},{property:"og:image:width",content:"320"},{property:"og:image:height",content:"320"},{name:"twitter:card",content:"summary"},{name:"twitter:site",content:pe.homepage},{name:"twitter:title",content:pe.title},{name:"twitter:description",content:pe.description},{name:"twitter:image",content:pe.image},{name:"google-site-verification",content:pe.verification.google}].concat(l)})},ge={root:{alignItems:"center",display:"flex",flexDirection:"column",width:"100%",height:"calc(100vh - ".concat(E+N,"px)"),justifyContent:"center",fontFamily:k},heading:Object(d.a)({color:"#c2c2c2",fontWeight:400,fontSize:"3.2rem",letterSpacing:"2px",margin:"10px 20px",padding:"0",textShadow:"5px 5px ".concat("#21252b"),userSelect:"none"},"@media screen and (max-width: ".concat(v,")"),{fontSize:"2.4rem"}),typedWrap:Object(d.a)({color:"#909295",fontSize:"2.4rem",fontWeight:400,margin:"5px",padding:"0",userSelect:"none","& a":{textDecoration:"none",borderBottom:"1px dashed ".concat("#909295")},"& strong":{fontWeight:"500"}},"@media screen and (max-width: ".concat(v,")"),{fontSize:"2.0rem"}),".typed-cursor":{color:"#42a5f5"}},de=Object(f.a)(ge),he=function(e){var t=e.staticData,a=e.contactData,r=e.repoUrl,i=de();Object(n.useEffect)((function(){var e={strings:t.typed,typeSpeed:70,backSpeed:50,loop:!0,smartBackspace:!0},a=new G.a("#typed-insert-point",e);return function(){a.destroy()}}),[t]);var l=function(){var e=Math.floor(Math.random()*ne.length);return"".concat(ne[e].hello,"!")}();return o.a.createElement(o.a.Fragment,null,o.a.createElement(me,{title:l}),o.a.createElement("section",{className:i.root},o.a.createElement("h1",{className:i.heading},t.mainLine),o.a.createElement("div",{className:i.typedWrap},o.a.createElement("span",{id:"typed-insert-point",style:{whiteSpace:"pre"}})),o.a.createElement(ce,{contactData:a,repoUrl:r})))},fe=a(54),be={root:Object(d.a)({maxWidth:"960px",padding:"0 20px",marginBottom:"200px","& a:hover":{color:"#c2c2c2"},"& li":{listStyle:"square"}},"@media screen and (max-width: ".concat(v,")"),{marginLeft:0}),content:{color:"#abb2bf",fontSize:"1.6rem","& h3":{color:"#42a5f5"},"& ul":Object(d.a)({"& li":{paddingBottom:"4px"}},"@media screen and (max-width: ".concat(v,")"),{paddingLeft:"20px"})}},we=Object(f.a)(be),Se=function(e){var t=e.seo,a=e.children,n=we();return o.a.createElement(o.a.Fragment,null,!!t&&o.a.createElement(me,t),o.a.createElement("div",{className:n.root},o.a.createElement("div",{className:n.content},a)))},ve=function(e){var t=e.value,a=e.color,n=void 0===a?"#98c379":a,r=e.bgColor,i=void 0===r?I()("#282c34").lighten(.125).string():r,l=e.width,s=void 0===l?500:l,c=e.height,u={width:s,height:void 0===c?3:c,backgroundColor:i,marginTop:"3px"},p={height:"100%",width:"".concat(t,"%"),backgroundColor:n,transition:"width 500ms ease"};return o.a.createElement("div",{style:u},o.a.createElement("div",{style:p}))},ye=a(55),xe=(a(83),{toolTip:{boxShadow:"0 0 32px black",padding:0,"& img":{maxHeight:"180px"}},bookItem:{display:"flex",alignItems:"center",marginTop:"6px",marginBottom:"6px"},progress:{marginRight:"8px",width:"20px","@global":{".CircularProgressbar-path":{stroke:"#98c379",strokeLinecap:"butt"},".CircularProgressbar-trail":{stroke:"#333842"},".CircularProgressbar-text":{},".CircularProgressbar-background":{}}}}),Ee=Object(f.a)(xe),Ne=function(e){var t=e.section,a=Ee(),n=t.title,r=t.url,i=$(t),l="".concat(i,"% done");return o.a.createElement("li",{className:a.bookItem},o.a.createElement("span",{"data-tip":l},o.a.createElement(ye.a,{value:i,className:a.progress,strokeWidth:24})),o.a.createElement("a",{href:r,"aria-label":n,"data-class":a.toolTip,"data-place":"right",target:"_blank",rel:"noopener noreferrer"},n))},ke=Object(f.a)({courseDetails:{marginLeft:"20px",marginTop:"10px"},optional:{opacity:.7},bookPanel:{marginLeft:"20px",marginTop:"6px",paddingBottom:"10px"}}),je=function(e){var t=e.courseData,a=e.showDetails,n=void 0!==a&&a,r=ke(),i=t.courseName,l=t.sections,s=t.isOptional,c=ee(t),u="".concat(c,"% done");return s&&(u="Optional Content: ".concat(u)),o.a.createElement("details",{open:n,className:Object(b.a)(r.courseDetails,Object(d.a)({},r.optional,s))},o.a.createElement("summary",null,o.a.createElement("span",{"data-tip":u},i),o.a.createElement(ve,{value:c})),o.a.createElement("div",{className:r.bookPanel},l.map((function(e){return o.a.createElement(Ne,{key:e.title,section:e})}))))},ze={root:{marginBottom:"10px"},overDue:{marginLeft:"10px",padding:"2px 4px",fontSize:"1.2rem",fontWeight:"700",textTransform:"uppercase",backgroundColor:"#d19a66",color:"#21252b",borderRadius:"8px"}},Oe=Object(f.a)(ze),De=function(e){var t=e.semesterData,a=e.showDetails,n=void 0===a||a,r=e.showOptionalCourses,i=void 0!==r&&r,l=Oe(),s=t.name,c=t.courses,u=t.dates,p=u.start,m=u.end,g=p&&m?"".concat(X(p)," - ").concat(X(m)):"Dates not set",d=function(e,t){var a=Z()(),n=Z()(e);return a.isAfter(n)&&100!==t}(m,te(t));return o.a.createElement("details",{open:n,className:l.root},o.a.createElement("summary",null,o.a.createElement("span",{"data-tip":g},s,d&&o.a.createElement("span",{className:l.overDue},"overdue"))),c.filter((function(e){return i||!e.isOptional})).map((function(e){return o.a.createElement(je,{key:e.courseName,courseData:e})})))},Ce=Object(f.a)({title:{display:"inline-block",cursor:"help","&>h2":{display:"inline-block",marginBottom:"0"},"&>svg":{marginLeft:"8px"},"&>p":{fontSize:"1.8rem",marginTop:"0.3em"}},tip:{maxWidth:"360px",fontSize:"1.5rem !important",lineHeight:"2rem"},contents:{"&>details":{"& summary":{border:"none",outline:"none","& span":{cursor:"pointer"}},padding:"10px 0","&:last-child":{paddingBottom:"200px"}}}}),Ie=function(e){var t=e.diplomaData,a=Ce(),n=t.semesters,r=t.metadata,i=r.title,l=r.subtitle,s=r.info;return o.a.createElement(Se,{seo:{title:l?"".concat(i,", ").concat(l):i}},o.a.createElement("div",{"data-tip":s||i,"data-class":a.tip,className:a.title},o.a.createElement("h2",null,i),o.a.createElement(S.a,{icon:"question-circle"}),l&&o.a.createElement("p",null,l)),o.a.createElement("div",{className:a.contents},n.map((function(e){return o.a.createElement(De,{semesterData:e,key:e.name})}))),o.a.createElement(fe.a,null))},Me=a(56),Te=a(25),He=a(36),Ae=a(37),Be=a(26),Fe=[{name:"Home",url:"/",icon:"home",isInternal:!0,comp:function(){return o.a.createElement(he,{staticData:Me,contactData:Te,repoUrl:Be.repository.url})}},{name:"Software Engineering",url:"/swe",icon:"graduation-cap",isInternal:!0,badge:"".concat(ae(He,0),"%"),comp:function(){return o.a.createElement(Ie,{diplomaData:He})}},{name:"Business Administration",url:"/ba",icon:"graduation-cap",isInternal:!0,badge:"".concat(ae(Ae,0),"%"),comp:function(){return o.a.createElement(Ie,{diplomaData:Ae})}}],Pe=[{name:"skills.js",url:"/skills",icon:["fab","js"],color:"#ffca28",mdFileName:"skills"},{name:".educationrc",url:"/education",icon:"university",color:"#42a5f5",mdFileName:"education"},{name:"projects.config",url:"/projects",icon:"sliders-h",color:"#98c379",mdFileName:"projects"},{name:"certificates.sass",url:"/certificates",icon:["fab","sass"],color:"#e13e76",mdFileName:"certificates"}],We={root:(m={alignItems:"center",background:"#333842",display:"flex",flexDirection:"column",justifyContent:"space-between",height:"100vh",position:"fixed",left:"0",top:"0",width:"".concat(y,"px")},Object(d.a)(m,"@media screen and (max-width: ".concat(v,")"),{display:"none"}),Object(d.a)(m,"& div",{display:"flex",alignItems:"center",flexDirection:"column",padding:"10px 0"}),m),divider:{height:"1px",background:I()("#333842").lighten(.35).string(),width:"95%",marginTop:"4px",marginBottom:"12px"}},Le=Object(f.a)(We),Je=function(e){var t=e.contactData,a=Le(),n=Fe.map((function(e){return{name:e.name,url:e.url,icon:e.icon,isInternal:e.isInternal,badge:e.badge}})),r=function(e){return e.map((function(e){return o.a.createElement(L,Object.assign({key:e.name},e))}))};return o.a.createElement("div",{className:a.root},o.a.createElement("div",null,r(n),o.a.createElement("span",{className:a.divider}),r(t)),o.a.createElement("div",null,r([{name:"Useless button!",url:"",icon:"cog",isInternal:!0}])))},Ge={root:{background:"#21252b",height:"100vh",position:"fixed",top:"0",left:y,width:x,"& li":{listStyle:"none",padding:"6px 12px"}},closed:{display:"none"}},Re=Object(f.a)(Ge),Ue=function(e){var t=e.tabs,a=e.open,n=Re();return o.a.createElement("div",{className:Object(b.a)(n.root,Object(d.a)({},n.closed,!a))},t.map((function(e){return o.a.createElement("li",{key:e.name},e.mdFileName)})))},_e={root:{bottom:"0",background:"#21252b",display:"flex",justifyContent:"space-between",alignItems:"center",fontFamily:k,fontWeight:400,left:"0",position:"fixed",width:"100vw",height:N,"& span, & a":{display:"inline-block",padding:"2px 8px","&:hover":{background:"#282c34",cursor:"pointer"}}},icon:{color:"#abb2bf"},text:{color:"#abb2bf",fontSize:"1.2rem",padding:"0 4px"}},Ke=Object(f.a)(_e),Ve=function(){var e=Ke();return o.a.createElement("footer",{className:e.root},o.a.createElement("a",{href:Be.repository.url,rel:"noopener noreferrer",target:"_blank"},o.a.createElement(S.a,{className:e.icon,icon:"code-branch",size:"xs",inverse:!0}),o.a.createElement("span",{className:e.text},"master")),o.a.createElement("span",null,o.a.createElement(S.a,{className:e.icon,icon:"smile",size:"sm",inverse:!0})))},qe={"@global":{html:{fontSize:"62.5%"},body:{fontFamily:"'Ubuntu Mono', monospace",fontSize:"1.6rem",background:"#282c34",boxSizing:"border-box"},button:{cursor:"pointer","&:disabled":{cursor:"default"}},a:{color:"#abb2bf",textDecoration:"none",transition:"color 500ms ease","&:visited":{color:I()("#abb2bf").darken(.1).string()}},".color-transform":{transform:"color 500ms ease"}},root:{position:"absolute",height:"100vh",width:"calc(100% - ".concat(y,"px)"),padding:0,margin:0},content:Object(d.a)({position:"relative",top:0,left:"".concat(y,"px"),right:0,width:"100%"},"@media screen and (max-width: ".concat(v,")"),{left:"0"}),explorerOpen:{left:"".concat(y+x,"px")}},Ye=Object(f.a)(qe),Ze=function(e){var t=e.children,a=e.tabs,r=e.contactData,i=Object(n.useState)(!1),l=Object(h.a)(i,2),s=l[0],c=(l[1],Ye());return o.a.createElement("div",{className:c.root},o.a.createElement(Je,{contactData:r}),o.a.createElement(Ue,{tabs:a,open:s}),o.a.createElement("main",{className:Object(b.a)(c.content,Object(d.a)({},c.explorerOpen,s))},o.a.createElement(F,{tabs:a}),t),o.a.createElement(Ve,null))},Xe=a(57),Qe=a.n(Xe),$e=Object(f.a)({mdpage:{paddingBottom:"10rem"}}),et=function(e){var t=e.fileName,r=Object(n.useState)(""),i=Object(h.a)(r,2),l=i[0],s=i[1],c=$e();return Object(n.useEffect)((function(){(function(){var e=Object(q.a)(V.a.mark((function e(){var n,o,r;return V.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,a(163)("./".concat(t,".md"));case 2:return n=e.sent,e.next=5,fetch(n.default);case 5:return o=e.sent,e.next=8,o.text();case 8:r=e.sent,s(r);case 10:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}})()()}),[t]),o.a.createElement(Se,{seo:{title:t}},o.a.createElement(Qe.a,{className:c.mdpage,source:l}))},tt=["comp"],at=["name","url","comp"],nt=function(e){var t=e.comp,a=Object(w.a)(e,tt);return o.a.createElement(t,a)},ot=function(e){var t=e.fileName;return o.a.createElement(et,{fileName:t})},rt=[Fe.map((function(e){var t=e.name,a=e.url,n=e.comp,r=Object(w.a)(e,at);return o.a.createElement(nt,Object.assign({path:a,key:t,comp:n},r))})),Pe.map((function(e){var t=e.name,a=e.url,n=e.mdFileName;return o.a.createElement(ot,{path:a,key:t,fileName:n})})),o.a.createElement(g.b,{key:"notfound",from:"*",to:"/",default:!0,noThrow:!0})],it=function(){return o.a.createElement(Ze,{tabs:Pe,contactData:Te},o.a.createElement(g.c,null,rt))};Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));var lt=a(58);a.n(lt).a.config(),i.a.render(o.a.createElement(o.a.StrictMode,null,o.a.createElement(it,null)),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()})).catch((function(e){console.error(e.message)}))},25:function(e){e.exports=JSON.parse('[{"name":"Telegram","url":"https://t.me/caglarturali","icon":["fab","telegram-plane"],"isMain":true},{"name":"GitHub","url":"https://github.com/caglarturali","icon":["fab","github"],"isMain":false},{"name":"GitLab","url":"https://gitlab.com/caglarturali","icon":["fab","gitlab"],"isMain":false},{"name":"LinkedIn","url":"https://linkedin.com/in/caglarturali","icon":["fab","linkedin"],"isMain":false},{"name":"goodreads","url":"https://www.goodreads.com/caglarturali","icon":["fab","goodreads"],"isMain":false}]')},26:function(e){e.exports=JSON.parse('{"name":"developer-portfolio-app","version":"2.0.0","description":"VS Code/Atom One Dark inspired developer portfolio app.","private":true,"repository":{"type":"git","url":"https://github.com/caglarturali/caglarturali.github.io"},"homepage":"https://turali.js.org","license":"GNU GPLv3","scripts":{"start":"react-scripts start","build":"react-scripts build","test:base":"react-scripts test --passWithNoTests","test":"npm run test:base -- --watchAll=false","test:watch":"npm run test:base -- --watchAll","test:update":"npm run test:base -- --updateSnapshot --forceExit","eject":"react-scripts eject","lint":"eslint \\"*/**/*.{js,ts,tsx}\\"","lint:ci":"npm run lint -- --quiet","lint:fix":"npm run lint -- --fix","progress":"ts-node -O \'{\\"module\\":\\"commonjs\\"}\' scripts/updateProgress.ts"},"husky":{"hooks":{"pre-commit":"lint-staged","pre-push":"npm test"}},"lint-staged":{"*.{js,ts,tsx}":"eslint --fix"},"dependencies":{"@fortawesome/fontawesome-svg-core":"^1.2.36","@fortawesome/free-brands-svg-icons":"^5.15.4","@fortawesome/free-solid-svg-icons":"^5.15.4","@fortawesome/react-fontawesome":"^0.1.16","@reach/router":"^1.3.4","clsx":"^1.1.1","color":"^3.2.1","dayjs":"^1.10.7","dotenv":"^8.6.0","isomorphic-unfetch":"^3.1.0","normalize.css":"^8.0.1","react":"^16.14.0","react-circular-progressbar":"^2.0.4","react-dom":"^16.14.0","react-helmet":"^6.1.0","react-jss":"^10.8.2","react-markdown":"^4.3.1","react-scripts":"3.4.1","react-tooltip":"^4.2.21","typed.js":"^2.0.12"},"devDependencies":{"@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^10.4.9","@testing-library/user-event":"^12.8.3","@types/color":"^3.0.2","@types/jest":"^25.2.3","@types/node":"^14.17.32","@types/reach__router":"^1.3.9","@types/react":"^16.14.20","@types/react-dom":"^16.9.14","@types/react-helmet":"^5.0.19","@typescript-eslint/eslint-plugin":"^2.34.0","@typescript-eslint/parser":"^2.34.0","eslint":"6.8.0","eslint-config-prettier":"^6.15.0","eslint-plugin-prettier":"^3.4.1","eslint-plugin-react":"^7.26.1","husky":"^4.3.8","lint-staged":"^10.5.4","prettier":"^2.4.1","ts-node":"^9.1.1","ts-node-dev":"^1.1.8","typescript":"^3.9.10"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]}}')},35:function(e){e.exports=JSON.parse('[{"language":"Afrikaans","hello":"hallo"},{"language":"Albanian","hello":"P\xebrsh\xebndetje"},{"language":"Amharic","hello":"\u1230\u120b\u121d"},{"language":"Arabic","hello":"\u0645\u0631\u062d\u0628\u0627"},{"language":"Armenian","hello":"\u0532\u0561\u0580\u0565\u0582"},{"language":"Azerbaijani","hello":"Salam"},{"language":"Basque","hello":"Kaixo"},{"language":"Belarusian","hello":"\u0434\u043e\u0431\u0440\u044b \u0434\u0437\u0435\u043d\u044c"},{"language":"Bengali","hello":"\u09b9\u09cd\u09af\u09be\u09b2\u09cb"},{"language":"Bosnian","hello":"zdravo"},{"language":"Bulgarian","hello":"\u0417\u0434\u0440\u0430\u0432\u0435\u0439\u0442\u0435"},{"language":"Catalan","hello":"Hola"},{"language":"Cebuano","hello":"Hello"},{"language":"Chichewa","hello":"Moni"},{"language":"Chinese (Simplified)","hello":"\u60a8\u597d"},{"language":"Chinese (Traditional)","hello":"\u60a8\u597d"},{"language":"Corsican","hello":"Bonghjornu"},{"language":"Croatian","hello":"zdravo"},{"language":"Czech","hello":"Ahoj"},{"language":"Danish","hello":"Hej"},{"language":"Dutch","hello":"Hallo"},{"language":"English","hello":"Hello"},{"language":"Esperanto","hello":"Saluton"},{"language":"Estonian","hello":"Tere"},{"language":"Filipino","hello":"Hello"},{"language":"Finnish","hello":"Hei"},{"language":"French","hello":"Bonjour"},{"language":"Frisian","hello":"Hello"},{"language":"Galician","hello":"Ola"},{"language":"Georgian","hello":"\u10d2\u10d0\u10db\u10d0\u10e0\u10ef\u10dd\u10d1\u10d0"},{"language":"German","hello":"Hallo"},{"language":"Greek","hello":"\u0393\u03b5\u03b9\u03b1 \u03c3\u03b1\u03c2"},{"language":"Gujarati","hello":"\u0ab9\u0ac7\u0ab2\u0acb"},{"language":"Haitian Creole","hello":"Bonjou"},{"language":"Hausa","hello":"Sannu"},{"language":"Hawaiian","hello":"Aloha\u02bboe"},{"language":"Hebrew","hello":"\u05e9\u05dc\u05d5\u05dd"},{"language":"Hindi","hello":"\u0928\u092e\u0938\u094d\u0924\u0947"},{"language":"Hmong","hello":"Nyob zoo"},{"language":"Hungarian","hello":"Hell\xf3"},{"language":"Icelandic","hello":"Hall\xf3"},{"language":"Igbo","hello":"Ndewo"},{"language":"Indonesian","hello":"Halo"},{"language":"Irish","hello":"Dia duit"},{"language":"Italian","hello":"Ciao"},{"language":"Japanese","hello":"\u3053\u3093\u306b\u3061\u306f"},{"language":"Javanese","hello":"Hello"},{"language":"Kannada","hello":"\u0cb9\u0cb2\u0ccb"},{"language":"Kazakh","hello":"\u0421\u04d9\u043b\u0435\u043c"},{"language":"Khmer","hello":"\u1787\u17c6\u179a\u17b6\u1794\u179f\u17bd\u179a"},{"language":"Korean","hello":"\uc548\ub155\ud558\uc138\uc694."},{"language":"Kurdish (Kurmanji)","hello":"Hello"},{"language":"Kyrgyz","hello":"\u0441\u0430\u043b\u0430\u043c"},{"language":"Lao","hello":"\u0eaa\u0eb0\u0e9a\u0eb2\u0e8d\u0e94\u0eb5"},{"language":"Latin","hello":"salve"},{"language":"Latvian","hello":"Labdien!"},{"language":"Lithuanian","hello":"Sveiki"},{"language":"Luxembourgish","hello":"Moien"},{"language":"Macedonian","hello":"\u0417\u0434\u0440\u0430\u0432\u043e"},{"language":"Malagasy","hello":"Hello"},{"language":"Malay","hello":"Hello"},{"language":"Malayalam","hello":"\u0d39\u0d32\u0d4b"},{"language":"Maltese","hello":"Hello"},{"language":"Maori","hello":"Hiha"},{"language":"Marathi","hello":"\u0939\u0945\u0932\u094b"},{"language":"Mongolian","hello":"\u0421\u0430\u0439\u043d \u0431\u0430\u0439\u043d\u0430 \u0443\u0443"},{"language":"Myanmar (Burmese)","hello":"\u1019\u1004\u103a\u1039\u1002\u101c\u102c\u1015\u102b"},{"language":"Nepali","hello":"\u0928\u092e\u0938\u094d\u0924\u0947"},{"language":"Norwegian","hello":"Hallo"},{"language":"Pashto","hello":"\u0633\u0644\u0627\u0645"},{"language":"Persian","hello":"\u0633\u0644\u0627\u0645"},{"language":"Polish","hello":"Cze\u015b\u0107"},{"language":"Portuguese","hello":"Ol\xe1"},{"language":"Punjabi","hello":"\u0a39\u0a48\u0a32\u0a4b"},{"language":"Romanian","hello":"Alo"},{"language":"Russian","hello":"\u043f\u0440\u0438\u0432\u0435\u0442"},{"language":"Samoan","hello":"Talofa"},{"language":"Scots Gaelic","hello":"Hello"},{"language":"Serbian","hello":"\u0417\u0434\u0440\u0430\u0432\u043e"},{"language":"Sesotho","hello":"Hello"},{"language":"Shona","hello":"Hello"},{"language":"Sindhi","hello":"\u0647\u064a\u0644\u0648"},{"language":"Sinhala","hello":"\u0dc4\u0dd9\u0dbd\u0ddd"},{"language":"Slovak","hello":"ahoj"},{"language":"Slovenian","hello":"Pozdravljeni"},{"language":"Somali","hello":"Hello"},{"language":"Spanish","hello":"Hola"},{"language":"Sundanese","hello":"halo"},{"language":"Swahili","hello":"Sawa"},{"language":"Swedish","hello":"Hall\xe5"},{"language":"Tajik","hello":"\u0421\u0430\u043b\u043e\u043c"},{"language":"Tamil","hello":"\u0bb9\u0bb2\u0bc7\u0bbe"},{"language":"Telugu","hello":"\u0c39\u0c32\u0c4b"},{"language":"Thai","hello":"\u0e2a\u0e27\u0e31\u0e2a\u0e14\u0e35"},{"language":"Turkish","hello":"Merhaba"},{"language":"Ukranian","hello":"\u0417\u0434\u0440\u0430\u0441\u0442\u0443\u0439\u0442\u0435"},{"language":"Urdu","hello":"\u06c1\u06cc\u0644\u0648"},{"language":"Uzbek","hello":"Salom"},{"language":"Vietnamese","hello":"Xin ch\xe0o"},{"language":"Welsh","hello":"Helo"},{"language":"Xhosa","hello":"Sawubona"},{"language":"Yiddish","hello":"\u05d4\u05e2\u05dc\u05d0"},{"language":"Yoruba","hello":"Kaabo"},{"language":"Zulu","hello":"Sawubona"}]')},36:function(e){e.exports=JSON.parse('{"metadata":{"title":"Apprenticeship in Software Engineering","subtitle":"Specialization in Data Science","info":"Long story short, I\'ve been thinking about pursuing a postgraduate degree in software engineering for a while now but, eventually, I\'ve decided to go my way. So, here it is, my self-curated apprenticeship program in software engineering! I will be attending courses listed below and will be doing practical assignments throughout my studies but it won\'t necessarily be my priority to pursue any form of \'certificate of completion\'. We\'ll all see how it goes. :)"},"semesters":[{"name":"1. Semester","dates":{"start":"2022-01-01","end":"2022-06-30"},"courses":[{"courseName":"SWE 510 Introduction to Computer Science","sections":[{"title":"Introduction to Computer Science and Programming Specialization","url":"https://www.coursera.org/specializations/introduction-computer-science-programming","progress":{"completed":0,"total":3}},{"title":"Computer Science Algorithms","url":"https://brilliant.org/paths/computer-science-algorithms/","progress":{"completed":1,"total":3}}]},{"courseName":"SWE 513 Introduction to Object Oriented Programming","sections":[{"title":"Object Oriented Programming in Java Specialization","url":"https://www.coursera.org/specializations/object-oriented-programming","progress":{"completed":4,"total":4}}]},{"courseName":"SWE 515 Database Systems","sections":[{"title":"Database Systems Specialization","url":"https://www.coursera.org/specializations/database-systems","progress":{"completed":0,"total":4}}]},{"courseName":"SWE 517 Principles of Software Engineering","sections":[{"title":"Java Programming and Software Engineering Fundamentals Specialization","url":"https://www.coursera.org/specializations/java-programming","progress":{"completed":0,"total":5}}]},{"courseName":"MAT 510 Mathematics I","sections":[{"title":"Math Foundations","url":"https://brilliant.org/paths/math-foundations/","progress":{"completed":3,"total":7}},{"title":"Logic Foundations","url":"https://brilliant.org/paths/logic-foundations/","progress":{"completed":2,"total":4}}]}]},{"name":"2. Semester","dates":{"start":"2022-07-01","end":"2022-12-31"},"courses":[{"courseName":"SWE 520 Python Programming","sections":[{"title":"Python 3 Programming Specialization","url":"https://www.coursera.org/specializations/python-3-programming","progress":{"completed":5,"total":5}}]},{"courseName":"SWE 523 Software Requirements Engineering","sections":[{"title":"Requirements Engineering: Secure Software Specifications Specialization","url":"https://www.coursera.org/specializations/requirements-engineering-secure-software","progress":{"completed":0,"total":5}}]},{"courseName":"SWE 525 Software Development Lifecycle","sections":[{"title":"Software Development Lifecycle Specialization","url":"https://www.coursera.org/specializations/software-development-lifecycle","progress":{"completed":0,"total":4}}]},{"courseName":"SWE 527 Software Design and Architecture","sections":[{"title":"Software Design and Architecture Specialization","url":"https://www.coursera.org/specializations/software-design-architecture","progress":{"completed":0,"total":4}}]},{"courseName":"MAT 520 Mathematics II","sections":[{"title":"Intermediate Math","url":"https://brilliant.org/paths/intermediate-math/","progress":{"completed":0,"total":8}}]}]},{"name":"3. Semester","dates":{"start":"2023-01-01","end":"2023-06-30"},"courses":[{"courseName":"SWE 530 Introduction to Operating Systems","sections":[{"title":"Introduction to Operating Systems Specialization","url":"https://www.coursera.org/specializations/codio-introduction-operating-systems","progress":{"completed":0,"total":4}}]},{"courseName":"SWE 533 Secure Software Development","sections":[{"title":"Secure Coding Practices Specialization","url":"https://www.coursera.org/specializations/secure-coding-practices","progress":{"completed":2,"total":4}}]},{"courseName":"SWE 535 Managing Software Development","sections":[{"title":"Software Product Management Specialization","url":"https://www.coursera.org/specializations/product-management","progress":{"completed":0,"total":6}}]},{"courseName":"SWE 537 Software Verification and Validation","sections":[{"title":"Software Testing and Automation Specialization","url":"https://www.coursera.org/specializations/software-testing-automation","progress":{"completed":0,"total":4}}]},{"courseName":"MAT 530 Mathematics III","sections":[{"title":"Road to Calculus + Advanced Math","url":"https://brilliant.org/paths/calculus-advanced-math/","progress":{"completed":0,"total":9}}]}]},{"name":"4. Semester","dates":{"start":"2023-07-01","end":"2023-12-31"},"courses":[{"courseName":"SWE 540 Computer Systems Security","sections":[{"title":"Introduction to Cyber Security Specialization","url":"https://www.coursera.org/specializations/intro-cyber-security","progress":{"completed":0,"total":4}}]},{"courseName":"SWE 543 Data Structures and Algorithms","sections":[{"title":"Data Structures and Algorithms Specialization","url":"https://www.coursera.org/specializations/data-structures-algorithms","progress":{"completed":0,"total":6}}]},{"courseName":"SWE 545 Human-Computer Interaction","sections":[{"title":"Interaction Design Specialization","url":"https://www.coursera.org/specializations/interaction-design","progress":{"completed":0,"total":8}}]},{"courseName":"SWE 547 Computer Networking","sections":[{"title":"Computer Communications Specialization","url":"https://www.coursera.org/specializations/computer-communications","progress":{"completed":0,"total":4}}]},{"courseName":"MAT 540 Mathematics IV","sections":[{"title":"College Mathematics","url":"https://brilliant.org/paths/college-mathematics/","progress":{"completed":0,"total":6}},{"title":"Infinity & Number Theory","url":"https://brilliant.org/paths/infinity-number-theory/","progress":{"completed":0,"total":3}}]}]},{"name":"5. Semester","dates":{"start":"2024-01-01","end":"2024-06-30"},"courses":[{"courseName":"SWE 550 Cloud Computing","sections":[{"title":"Cloud Computing Specialization","url":"https://www.coursera.org/specializations/cloud-computing","progress":{"completed":0,"total":6}}]},{"courseName":"SWE 553 Blockchain Technology","sections":[{"title":"Blockchain Specialization","url":"https://www.coursera.org/specializations/blockchain","progress":{"completed":0,"total":4}}]},{"courseName":"DSC 550 Introduction to Statistics and Probability","sections":[{"title":"Probability & Statistics","url":"https://brilliant.org/paths/probability-statistics/","progress":{"completed":0,"total":4}}]},{"courseName":"DSC 553 Introduction to Data Science","sections":[{"title":"Data Science Specialization","url":"https://www.coursera.org/specializations/jhu-data-science","progress":{"completed":0,"total":10}}]},{"courseName":"MAT 550 Discrete Mathematics","sections":[{"title":"Introduction to Discrete Mathematics for Computer Science Specialization","url":"https://www.coursera.org/specializations/discrete-mathematics","progress":{"completed":0,"total":5}}]}]},{"name":"6. Semester","dates":{"start":"2024-07-01","end":"2024-12-31"},"courses":[{"courseName":"DSC 560 Machine Learning","sections":[{"title":"Machine Learning Specialization","url":"https://www.coursera.org/specializations/machine-learning","progress":{"completed":0,"total":4}}]},{"courseName":"DSC 563 Applied Data Science","sections":[{"title":"Applied Data Science with Python Specialization","url":"https://www.coursera.org/specializations/data-science-python","progress":{"completed":0,"total":5}}]},{"courseName":"DSC 565 Computer Vision","sections":[{"title":"First Principles of Computer Vision Specialization","url":"https://www.coursera.org/specializations/firstprinciplesofcomputervision","progress":{"completed":0,"total":5}}]},{"courseName":"DSC 567 Autonomous Systems Engineering","sections":[{"title":"Self-Driving Cars Specialization","url":"https://www.coursera.org/specializations/self-driving-cars","progress":{"completed":0,"total":4}}]},{"courseName":"MAT 560 Mathematics for Machine Learning","sections":[{"title":"Mathematics for Machine Learning Specialization","url":"https://www.coursera.org/specializations/mathematics-machine-learning","progress":{"completed":0,"total":3}}]}]}]}')},37:function(e){e.exports=JSON.parse('{"metadata":{"title":"Apprenticeship in Business Administration","subtitle":"Specialization in Innovation and Entrepreneurship","info":""},"semesters":[{"name":"1. Semester","dates":{"start":"","end":""},"courses":[{"courseName":"BIZ 510 Business Foundations","sections":[{"title":"Business Foundations Specialization","url":"https://www.coursera.org/specializations/wharton-business-foundations","progress":{"completed":0,"total":1}}]},{"courseName":"BIZ 512 Entrepreneurship","sections":[{"title":"Entrepreneurship Specialization","url":"https://www.coursera.org/specializations/wharton-entrepreneurship","progress":{"completed":0,"total":1}}]},{"courseName":"BIZ 514 Financial Technology","sections":[{"title":"Fintech: Foundations & Applications of Financial Technology Specialization","url":"https://www.coursera.org/specializations/wharton-fintech","progress":{"completed":0,"total":1}}]}]},{"name":"2. Semester","dates":{"start":"","end":""},"courses":[{"courseName":"BIZ 520 Innovation and Entrepreneurship","sections":[{"title":"Innovation and Entrepreneurship Professional Certificate","url":"https://www.edx.org/professional-certificate/usmx-innovation-and-entrepreneurship","progress":{"completed":0,"total":1}}]},{"courseName":"BIZ 524 Social Entrepreneurship","sections":[{"title":"Social Entrepreneurship Specialization","url":"https://www.coursera.org/specializations/social-entrepreneurship-cbs","progress":{"completed":0,"total":1}}]},{"courseName":"BIZ 529 Tech Entrepreneurship","sections":[{"title":"How to Build a Startup","url":"https://www.udacity.com/course/how-to-build-a-startup--ep245","progress":{"completed":0,"total":1}},{"title":"Product Design","url":"https://www.udacity.com/course/product-design--ud509","progress":{"completed":0,"total":1}},{"title":"Rapid Prototyping","url":"https://www.udacity.com/course/rapid-prototyping--ud723","progress":{"completed":0,"total":1}},{"title":"App Monetization","url":"https://www.udacity.com/course/app-monetization--ud518","progress":{"completed":0,"total":1}},{"title":"App Marketing","url":"https://www.udacity.com/course/app-marketing--ud719","progress":{"completed":0,"total":1}},{"title":"Get Your Startup Started","url":"https://www.udacity.com/course/get-your-startup-started--ud806","progress":{"completed":0,"total":1}}]}]}]}')},56:function(e){e.exports=JSON.parse('{"mainLine":"Hi! I\'m \xc7a\u011flar.","typed":["I\'m a Developer.","I\'m a Software Engineering Apprentice. :)","I\'m an INTJ-T through and through."]}')},59:function(e,t,a){e.exports=a(165)},6:function(e){e.exports=JSON.parse('{"title":"\xc7a\u011flar Tural\u0131 | Software Engineering Apprentice","description":"\xc7a\u011flar Tural\u0131\'s personal portfolio website","keywords":"\xc7a\u011flar Tural\u0131, Caglar Turali, JavaScript, TypeScript, React, Fullstack JavaScript, Node, Flutter, Dart, Vue, MongoDB, MEAN stack, MERN stack, GatsbyJS, NextJS, Bilen Adam, Astroloci","homepage":"https://turali.js.org","themeColor":"#21252b","image":"https://turali.js.org/images/logo512.png","verification":{"google":"yoA6kTc96mzuKG5z93MpyxJbTBmCeHRsP64QEEGuI28"}}')}},[[59,1,2]]]); -//# sourceMappingURL=main.4d6aa943.chunk.js.map \ No newline at end of file +(this["webpackJsonpdeveloper-portfolio-app"]=this["webpackJsonpdeveloper-portfolio-app"]||[]).push([[0],{163:function(e,t,a){var o={"./certificates.md":[167,3],"./education.md":[168,4],"./projects.md":[169,5],"./skills.md":[170,6]};function n(e){if(!a.o(o,e))return Promise.resolve().then((function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}));var t=o[e],n=t[0];return a.e(t[1]).then((function(){return a.t(n,7)}))}n.keys=function(){return Object.keys(o)},n.id=163,e.exports=n},165:function(e,t,a){"use strict";a.r(t);var o=a(0),n=a.n(o),r=a(46),i=a.n(r),l=(a(64),a(14)),s=a(47),c=a(5);l.b.add(s.a,c.g,c.f,c.a,c.c,c.j,c.n,c.b,c.m,c.k,c.l,c.e,c.i,c.d,c.h);var u,p,m,g=a(11),d=a(3),h=a(10),f=a(2),b=a(16),w=a(13),S=a(8),v="45rem",y=50,x=200,E=40,N=22,z="'Ubuntu', sans-serif",k={root:{'& a[aria-current="page"] span':{display:"inline-block !important"}},navText:Object(d.a)({marginLeft:"8px"},"@media screen and (max-width: ".concat(v,")"),{display:"none"}),currentTab:{"& .closeButton":(u={color:"#abb2bf",marginLeft:"8px",paddingLeft:"8px"},Object(d.a)(u,"@media screen and (max-width: ".concat(v,")"),{paddingLeft:"8px"}),Object(d.a)(u,"&:hover",{color:"#f3f3f3"}),u)},otherTab:{"& .closeButton":{display:"none"}}},j=["name","url","mdFileName"],O=Object(f.a)(k),D=function(e){var t=e.name,a=e.url,o=(e.mdFileName,Object(w.a)(e,j)),r=O();return n.a.createElement("span",{className:r.root},n.a.createElement(g.a,{to:a,getProps:function(e){return{className:e.isCurrent?r.currentTab:r.otherTab}}},n.a.createElement(S.a,Object.assign({},o,{size:o.size||"lg"})),n.a.createElement("span",{className:r.navText},t),n.a.createElement(S.a,{onClick:function(e){e.preventDefault(),e.stopPropagation(),Object(g.d)("/")},className:"closeButton",icon:"times",size:"1x",title:"Close"})))},C=a(4),I=a.n(C),M={root:{fontFamily:z,height:E},list:{color:"#abb2bf",listStyle:"none",margin:"0",padding:"0"},listItem:{display:"inline-block","& a":(p={borderRight:"1px solid ".concat(I()("#282c34").darken(.05).string()),borderTop:"4px solid ".concat("#21252b"),cursor:"pointer",display:"inline-block",fontSize:"1.2rem",letterSpacing:"0.5px",padding:"10px 15px",textTransform:"lowercase",transition:"background, border-color 250ms ease"},Object(d.a)(p,"@media screen and (max-width: ".concat(v,")"),{letterSpacing:"0",padding:"10px"}),Object(d.a)(p,'&:hover, &[aria-current="page"]',{borderTopColor:"#21252b",background:I()("#21252b").lighten(.02).string(),color:"#f3f3f3"}),Object(d.a)(p,'&[aria-current="page"]',{background:"#282c34",borderTopColor:I()("#21252b").lighten(.05).string()}),p)}},T=Object(f.a)(M),A=function(e){var t=e.tabs,a=T();return n.a.createElement("nav",{className:a.root},n.a.createElement("ul",{className:a.list},t.map((function(e){return n.a.createElement("li",{className:a.listItem,key:e.name},n.a.createElement(D,e))}))))},B={root:{background:"#21252b",position:"sticky",top:0,left:0,width:"100%",height:E}},H=Object(f.a)(B),F=function(e){var t=e.tabs,a=H();return n.a.createElement("header",{className:a.root},n.a.createElement(A,{tabs:t}))},P={link:{color:"#9599a0",cursor:"pointer",marginBottom:"10px",transition:"color 100ms ease","&:hover":{color:I()("#9599a0").lighten(.2).string()},"&:last-of-type":{marginBottom:"20px"}},iconWrapper:{position:"relative",display:"inline-block"},icon:{padding:"10px"},badge:{position:"absolute",right:"4px",top:"4px",fontSize:"0.8em",backgroundColor:"#98c379",borderRadius:"4px",color:"#111",padding:"1px 2px",opacity:"0.9"}},W=Object(f.a)(P),L=function(e){var t=e.name,a=e.url,o=e.icon,r=e.isInternal,i=e.badge,l=W(),s=n.a.createElement("span",{className:l.iconWrapper},n.a.createElement(S.a,{className:l.icon,icon:o,size:"lg"}),i&&n.a.createElement("span",{className:l.badge},i));return r?n.a.createElement(g.a,{to:a,key:"left-bar-".concat(t),className:l.link,"aria-label":t,title:t},s):n.a.createElement("a",{href:a,key:"left-bar-".concat(t),className:l.link,"aria-label":"Find me on ".concat(t),title:"Find me on ".concat(t),target:"_blank",rel:"noopener noreferrer"},s)},J=a(50),G=a.n(J),R={root:{background:"#21252b",borderRadius:"4px",color:"#abb2bf",display:"flex",margin:"8px",transition:"color 500ms ease","&:hover":{background:I()("#21252b").darken(.1).string()},"&:hover .icon":{color:"#42a5f5"}},contents:{alignItems:"center",display:"flex",minHeight:"24px",padding:"6px 10px"},text:{fontSize:"1.2rem",fontWeight:400,marginLeft:"6px"},count:{fontSize:"1.2rem",background:I()("#21252b").lighten(.5).string(),borderRadius:"50%",marginLeft:"10px",padding:"4px 8px"}},U=Object(f.a)(R),_=function(e){var t=e.href,a=e.title,o=e.icon,r=e.size,i=e.text,l=e.showCount,s=e.count,c=U();return n.a.createElement("a",{className:c.root,href:t,"aria-label":a,title:a,target:"_blank",rel:"noopener noreferrer"},n.a.createElement("span",{className:c.contents},n.a.createElement(S.a,{className:"icon",icon:o,size:r||"lg"}),n.a.createElement("span",{className:c.text},i),!!l&&n.a.createElement("span",{className:c.count},s)))},K=a(18),V=a.n(K),Y=a(24),q=a(27),X=a.n(q),Q=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"DD/MM/YYYY";return X()(e).format(t)},Z=function(e,t){var a=e.reduce((function(e,t){return e+t}),0);return parseFloat((a/e.length).toFixed(t))},$=function(e){var t=e.progress,a=t.completed,o=t.total;return parseFloat((a/o*100).toFixed(0))},ee=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=e.sections,o=a.map($);return Z(o,t)},te=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=e.courses.filter((function(e){return!e.isOptional})),o=a.map(ee);return Z(o,t)},ae=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=e.semesters,o=a.map(te);return Z(o,t)},oe=a(35),ne=function(e){return{data:e,lastChecked:Date.now()}},re=function(e,t){return void 0!==e.data&&!function(e,t){return Date.now()>e.lastChecked+60*t*1e3}(e,t)},ie=["resource","timeout"],le=function(e){var t=e.resource,a=t.attr,r=t.endpoint,i=e.timeout,l=void 0===i?10:i,s=Object(w.a)(e,ie),c=Object(o.useState)(!1),u=Object(h.a)(c,2),p=u[0],m=u[1],g=function(e,t){var a=Object(o.useState)((function(){var a,o=ne(t);try{a=JSON.parse(window.localStorage.getItem(e)||JSON.stringify(o))}catch(n){a=o}return a})),n=Object(h.a)(a,2),r=n[0],i=n[1];return Object(o.useEffect)((function(){window.localStorage.setItem(e,JSON.stringify(r))}),[r,e]),[r,i]}(a,void 0),d=Object(h.a)(g,2),f=d[0],b=d[1];return Object(o.useEffect)((function(){var e=function(){var e=Object(Y.a)(V.a.mark((function e(){var t,o;return V.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(r);case 2:return t=e.sent,e.next=5,t.json();case 5:(o=e.sent)[a]>=0&&b(ne(o[a])),m(!1);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();re(f,l)||e()})),n.a.createElement(_,Object.assign({},s,{showCount:!p&&void 0!==f,count:f.data}))},se=Object(f.a)({root:{display:"flex",flexDirection:"column",marginTop:"50px","& div":{display:"flex",alignItems:"center",justifyContent:"center"}}}),ce=function(e){var t=e.contactData,a=e.repoUrl,o=se(),r=function(e){var t=new URL(e).pathname.split("/");return{repo:t.pop()||"",username:t.pop()||""}}(a),i=r.repo,l=r.username,s=[{resource:{endpoint:"https://api.github.com/users/".concat(l),attr:"followers"},href:"https://github.com/".concat(l),title:"Follow @".concat(l," on GitHub"),icon:["fab","github"],size:"lg",text:"Follow @".concat(l)},{resource:{endpoint:"https://api.github.com/repos/".concat(l,"/").concat(i),attr:"stargazers_count"},href:a,title:"Star ".concat(l,"/").concat(i," on GitHub"),icon:"star",size:"sm",text:"Star"}],c=t.find((function(e){return e.isMain}));return n.a.createElement("div",{className:o.root},n.a.createElement("div",null,s.map((function(e){return n.a.createElement(le,Object.assign({key:"gh-btn-".concat(e.resource.attr)},e))}))),n.a.createElement("div",null,n.a.createElement(_,{href:c.url,title:"Find me on ".concat(c.name),icon:c.icon,size:"lg",text:"Contact Me"})))},ue=a(51),pe=a(6),me=function(e){var t=e.title,a=e.description,o=e.lang,r=void 0===o?"en":o,i=e.meta,l=void 0===i?[]:i,s=a||pe.description;return n.a.createElement(ue.a,{htmlAttributes:{lang:r},title:t,titleTemplate:"%s \u2022 ".concat(pe.title),meta:[{name:"description",content:s},{name:"keywords",content:pe.keywords},{name:"canonical",content:pe.homepage},{name:"theme-color",content:pe.themeColor},{property:"og:title",content:pe.title},{property:"og:description",content:pe.description},{property:"og:type",content:"website"},{property:"og:url",content:pe.homepage},{property:"og:image",content:pe.image},{property:"og:image:width",content:"320"},{property:"og:image:height",content:"320"},{name:"twitter:card",content:"summary"},{name:"twitter:site",content:pe.homepage},{name:"twitter:title",content:pe.title},{name:"twitter:description",content:pe.description},{name:"twitter:image",content:pe.image},{name:"google-site-verification",content:pe.verification.google}].concat(l)})},ge={root:{alignItems:"center",display:"flex",flexDirection:"column",width:"100%",height:"calc(100vh - ".concat(E+N,"px)"),justifyContent:"center",fontFamily:z},heading:Object(d.a)({color:"#c2c2c2",fontWeight:400,fontSize:"3.2rem",letterSpacing:"2px",margin:"10px 20px",padding:"0",textShadow:"5px 5px ".concat("#21252b"),userSelect:"none"},"@media screen and (max-width: ".concat(v,")"),{fontSize:"2.4rem"}),typedWrap:Object(d.a)({color:"#909295",fontSize:"2.4rem",fontWeight:400,margin:"5px",padding:"0",userSelect:"none","& a":{textDecoration:"none",borderBottom:"1px dashed ".concat("#909295")},"& strong":{fontWeight:"500"}},"@media screen and (max-width: ".concat(v,")"),{fontSize:"2.0rem"}),".typed-cursor":{color:"#42a5f5"}},de=Object(f.a)(ge),he=function(e){var t=e.staticData,a=e.contactData,r=e.repoUrl,i=de();Object(o.useEffect)((function(){var e={strings:t.typed,typeSpeed:70,backSpeed:50,loop:!0,smartBackspace:!0},a=new G.a("#typed-insert-point",e);return function(){a.destroy()}}),[t]);var l=function(){var e=Math.floor(Math.random()*oe.length);return"".concat(oe[e].hello,"!")}();return n.a.createElement(n.a.Fragment,null,n.a.createElement(me,{title:l}),n.a.createElement("section",{className:i.root},n.a.createElement("h1",{className:i.heading},t.mainLine),n.a.createElement("div",{className:i.typedWrap},n.a.createElement("span",{id:"typed-insert-point",style:{whiteSpace:"pre"}})),n.a.createElement(ce,{contactData:a,repoUrl:r})))},fe=a(54),be={root:Object(d.a)({maxWidth:"960px",padding:"0 20px",marginBottom:"200px","& a:hover":{color:"#c2c2c2"},"& li":{listStyle:"square"}},"@media screen and (max-width: ".concat(v,")"),{marginLeft:0}),content:{color:"#abb2bf",fontSize:"1.6rem","& h3":{color:"#42a5f5"},"& ul":Object(d.a)({"& li":{paddingBottom:"4px"}},"@media screen and (max-width: ".concat(v,")"),{paddingLeft:"20px"})}},we=Object(f.a)(be),Se=function(e){var t=e.seo,a=e.children,o=we();return n.a.createElement(n.a.Fragment,null,!!t&&n.a.createElement(me,t),n.a.createElement("div",{className:o.root},n.a.createElement("div",{className:o.content},a)))},ve=function(e){var t=e.value,a=e.color,o=void 0===a?"#98c379":a,r=e.bgColor,i=void 0===r?I()("#282c34").lighten(.125).string():r,l=e.width,s=void 0===l?500:l,c=e.height,u={width:s,height:void 0===c?3:c,backgroundColor:i,marginTop:"3px"},p={height:"100%",width:"".concat(t,"%"),backgroundColor:o,transition:"width 500ms ease"};return n.a.createElement("div",{style:u},n.a.createElement("div",{style:p}))},ye=a(55),xe=(a(83),{toolTip:{boxShadow:"0 0 32px black",padding:0,"& img":{maxHeight:"180px"}},bookItem:{display:"flex",alignItems:"center",marginTop:"6px",marginBottom:"6px"},progress:{marginRight:"8px",width:"20px","@global":{".CircularProgressbar-path":{stroke:"#98c379",strokeLinecap:"butt"},".CircularProgressbar-trail":{stroke:"#333842"},".CircularProgressbar-text":{},".CircularProgressbar-background":{}}}}),Ee=Object(f.a)(xe),Ne=function(e){var t=e.section,a=Ee(),o=t.title,r=t.url,i=$(t),l="".concat(i,"% done");return n.a.createElement("li",{className:a.bookItem},n.a.createElement("span",{"data-tip":l},n.a.createElement(ye.a,{value:i,className:a.progress,strokeWidth:24})),n.a.createElement("a",{href:r,"aria-label":o,"data-class":a.toolTip,"data-place":"right",target:"_blank",rel:"noopener noreferrer"},o))},ze=Object(f.a)({courseDetails:{marginLeft:"20px",marginTop:"10px"},optional:{opacity:.7},bookPanel:{marginLeft:"20px",marginTop:"6px",paddingBottom:"10px"}}),ke=function(e){var t=e.courseData,a=e.showDetails,o=void 0!==a&&a,r=ze(),i=t.courseName,l=t.sections,s=t.isOptional,c=ee(t),u="".concat(c,"% done");return s&&(u="Optional Content: ".concat(u)),n.a.createElement("details",{open:o,className:Object(b.a)(r.courseDetails,Object(d.a)({},r.optional,s))},n.a.createElement("summary",null,n.a.createElement("span",{"data-tip":u},i),n.a.createElement(ve,{value:c})),n.a.createElement("div",{className:r.bookPanel},l.map((function(e){return n.a.createElement(Ne,{key:e.title,section:e})}))))},je={root:{marginBottom:"10px"},overDue:{marginLeft:"10px",padding:"2px 4px",fontSize:"1.2rem",fontWeight:"700",textTransform:"uppercase",backgroundColor:"#d19a66",color:"#21252b",borderRadius:"8px"}},Oe=Object(f.a)(je),De=function(e){var t=e.semesterData,a=e.showDetails,o=void 0===a||a,r=e.showOptionalCourses,i=void 0!==r&&r,l=Oe(),s=t.name,c=t.courses,u=t.dates,p=u.start,m=u.end,g=p&&m?"".concat(Q(p)," - ").concat(Q(m)):"Dates not set",d=function(e,t){var a=X()(),o=X()(e);return a.isAfter(o)&&100!==t}(m,te(t));return n.a.createElement("details",{open:o,className:l.root},n.a.createElement("summary",null,n.a.createElement("span",{"data-tip":g},s,d&&n.a.createElement("span",{className:l.overDue},"overdue"))),c.filter((function(e){return i||!e.isOptional})).map((function(e){return n.a.createElement(ke,{key:e.courseName,courseData:e})})))},Ce=Object(f.a)({title:{display:"inline-block",cursor:"help","&>h2":{display:"inline-block",marginBottom:"0"},"&>svg":{marginLeft:"8px"},"&>p":{fontSize:"1.8rem",marginTop:"0.3em"}},tip:{maxWidth:"360px",fontSize:"1.5rem !important",lineHeight:"2rem"},contents:{"&>details":{"& summary":{border:"none",outline:"none","& span":{cursor:"pointer"}},padding:"10px 0","&:last-child":{paddingBottom:"200px"}}}}),Ie=function(e){var t=e.diplomaData,a=Ce(),o=t.semesters,r=t.metadata,i=r.title,l=r.subtitle,s=r.info;return n.a.createElement(Se,{seo:{title:l?"".concat(i,", ").concat(l):i}},n.a.createElement("div",{"data-tip":s||i,"data-class":a.tip,className:a.title},n.a.createElement("h2",null,i),n.a.createElement(S.a,{icon:"question-circle"}),l&&n.a.createElement("p",null,l)),n.a.createElement("div",{className:a.contents},o.map((function(e){return n.a.createElement(De,{semesterData:e,key:e.name})}))),n.a.createElement(fe.a,null))},Me=a(56),Te=a(25),Ae=a(36),Be=a(37),He=a(26),Fe=[{name:"Home",url:"/",icon:"home",isInternal:!0,comp:function(){return n.a.createElement(he,{staticData:Me,contactData:Te,repoUrl:He.repository.url})}},{name:"Software Engineering",url:"/swe",icon:"graduation-cap",isInternal:!0,badge:"".concat(ae(Ae,0),"%"),comp:function(){return n.a.createElement(Ie,{diplomaData:Ae})}},{name:"Business Administration",url:"/ba",icon:"graduation-cap",isInternal:!0,badge:"".concat(ae(Be,0),"%"),comp:function(){return n.a.createElement(Ie,{diplomaData:Be})}}],Pe=[{name:"skills.js",url:"/skills",icon:["fab","js"],color:"#ffca28",mdFileName:"skills"},{name:".educationrc",url:"/education",icon:"university",color:"#42a5f5",mdFileName:"education"},{name:"projects.config",url:"/projects",icon:"sliders-h",color:"#98c379",mdFileName:"projects"},{name:"certificates.sass",url:"/certificates",icon:["fab","sass"],color:"#e13e76",mdFileName:"certificates"}],We={root:(m={alignItems:"center",background:"#333842",display:"flex",flexDirection:"column",justifyContent:"space-between",height:"100vh",position:"fixed",left:"0",top:"0",width:"".concat(y,"px")},Object(d.a)(m,"@media screen and (max-width: ".concat(v,")"),{display:"none"}),Object(d.a)(m,"& div",{display:"flex",alignItems:"center",flexDirection:"column",padding:"10px 0"}),m),divider:{height:"1px",background:I()("#333842").lighten(.35).string(),width:"95%",marginTop:"4px",marginBottom:"12px"}},Le=Object(f.a)(We),Je=function(e){var t=e.contactData,a=Le(),o=Fe.map((function(e){return{name:e.name,url:e.url,icon:e.icon,isInternal:e.isInternal,badge:e.badge}})),r=function(e){return e.map((function(e){return n.a.createElement(L,Object.assign({key:e.name},e))}))};return n.a.createElement("div",{className:a.root},n.a.createElement("div",null,r(o),n.a.createElement("span",{className:a.divider}),r(t)),n.a.createElement("div",null,r([{name:"Useless button!",url:"",icon:"cog",isInternal:!0}])))},Ge={root:{background:"#21252b",height:"100vh",position:"fixed",top:"0",left:y,width:x,"& li":{listStyle:"none",padding:"6px 12px"}},closed:{display:"none"}},Re=Object(f.a)(Ge),Ue=function(e){var t=e.tabs,a=e.open,o=Re();return n.a.createElement("div",{className:Object(b.a)(o.root,Object(d.a)({},o.closed,!a))},t.map((function(e){return n.a.createElement("li",{key:e.name},e.mdFileName)})))},_e={root:{bottom:"0",background:"#21252b",display:"flex",justifyContent:"space-between",alignItems:"center",fontFamily:z,fontWeight:400,left:"0",position:"fixed",width:"100vw",height:N,"& span, & a":{display:"inline-block",padding:"2px 8px","&:hover":{background:"#282c34",cursor:"pointer"}}},icon:{color:"#abb2bf"},text:{color:"#abb2bf",fontSize:"1.2rem",padding:"0 4px"}},Ke=Object(f.a)(_e),Ve=function(){var e=Ke();return n.a.createElement("footer",{className:e.root},n.a.createElement("a",{href:He.repository.url,rel:"noopener noreferrer",target:"_blank"},n.a.createElement(S.a,{className:e.icon,icon:"code-branch",size:"xs",inverse:!0}),n.a.createElement("span",{className:e.text},"master")),n.a.createElement("span",null,n.a.createElement(S.a,{className:e.icon,icon:"smile",size:"sm",inverse:!0})))},Ye={"@global":{html:{fontSize:"62.5%"},body:{fontFamily:"'Ubuntu Mono', monospace",fontSize:"1.6rem",background:"#282c34",boxSizing:"border-box"},button:{cursor:"pointer","&:disabled":{cursor:"default"}},a:{color:"#abb2bf",textDecoration:"none",transition:"color 500ms ease","&:visited":{color:I()("#abb2bf").darken(.1).string()}},".color-transform":{transform:"color 500ms ease"}},root:{position:"absolute",height:"100vh",width:"calc(100% - ".concat(y,"px)"),padding:0,margin:0},content:Object(d.a)({position:"relative",top:0,left:"".concat(y,"px"),right:0,width:"100%"},"@media screen and (max-width: ".concat(v,")"),{left:"0"}),explorerOpen:{left:"".concat(y+x,"px")}},qe=Object(f.a)(Ye),Xe=function(e){var t=e.children,a=e.tabs,r=e.contactData,i=Object(o.useState)(!1),l=Object(h.a)(i,2),s=l[0],c=(l[1],qe());return n.a.createElement("div",{className:c.root},n.a.createElement(Je,{contactData:r}),n.a.createElement(Ue,{tabs:a,open:s}),n.a.createElement("main",{className:Object(b.a)(c.content,Object(d.a)({},c.explorerOpen,s))},n.a.createElement(F,{tabs:a}),t),n.a.createElement(Ve,null))},Qe=a(57),Ze=a.n(Qe),$e=Object(f.a)({mdpage:{paddingBottom:"10rem"}}),et=function(e){var t=e.fileName,r=Object(o.useState)(""),i=Object(h.a)(r,2),l=i[0],s=i[1],c=$e();return Object(o.useEffect)((function(){(function(){var e=Object(Y.a)(V.a.mark((function e(){var o,n,r;return V.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,a(163)("./".concat(t,".md"));case 2:return o=e.sent,e.next=5,fetch(o.default);case 5:return n=e.sent,e.next=8,n.text();case 8:r=e.sent,s(r);case 10:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}})()()}),[t]),n.a.createElement(Se,{seo:{title:t}},n.a.createElement(Ze.a,{className:c.mdpage,source:l}))},tt=["comp"],at=["name","url","comp"],ot=function(e){var t=e.comp,a=Object(w.a)(e,tt);return n.a.createElement(t,a)},nt=function(e){var t=e.fileName;return n.a.createElement(et,{fileName:t})},rt=[Fe.map((function(e){var t=e.name,a=e.url,o=e.comp,r=Object(w.a)(e,at);return n.a.createElement(ot,Object.assign({path:a,key:t,comp:o},r))})),Pe.map((function(e){var t=e.name,a=e.url,o=e.mdFileName;return n.a.createElement(nt,{path:a,key:t,fileName:o})})),n.a.createElement(g.b,{key:"notfound",from:"*",to:"/",default:!0,noThrow:!0})],it=function(){return n.a.createElement(Xe,{tabs:Pe,contactData:Te},n.a.createElement(g.c,null,rt))};Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));var lt=a(58);a.n(lt).a.config(),i.a.render(n.a.createElement(n.a.StrictMode,null,n.a.createElement(it,null)),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()})).catch((function(e){console.error(e.message)}))},25:function(e){e.exports=JSON.parse('[{"name":"Telegram","url":"https://t.me/caglarturali","icon":["fab","telegram-plane"],"isMain":true},{"name":"GitHub","url":"https://github.com/caglarturali","icon":["fab","github"],"isMain":false},{"name":"GitLab","url":"https://gitlab.com/caglarturali","icon":["fab","gitlab"],"isMain":false},{"name":"LinkedIn","url":"https://linkedin.com/in/caglarturali","icon":["fab","linkedin"],"isMain":false},{"name":"goodreads","url":"https://www.goodreads.com/caglarturali","icon":["fab","goodreads"],"isMain":false}]')},26:function(e){e.exports=JSON.parse('{"name":"developer-portfolio-app","version":"2.0.0","description":"VS Code/Atom One Dark inspired developer portfolio app.","private":true,"repository":{"type":"git","url":"https://github.com/caglarturali/caglarturali.github.io"},"homepage":"https://turali.js.org","license":"GNU GPLv3","scripts":{"start":"react-scripts start","build":"react-scripts build","test:base":"react-scripts test --passWithNoTests","test":"npm run test:base -- --watchAll=false","test:watch":"npm run test:base -- --watchAll","test:update":"npm run test:base -- --updateSnapshot --forceExit","eject":"react-scripts eject","lint":"eslint \\"*/**/*.{js,ts,tsx}\\"","lint:ci":"npm run lint -- --quiet","lint:fix":"npm run lint -- --fix","progress":"ts-node -O \'{\\"module\\":\\"commonjs\\"}\' scripts/updateProgress.ts"},"husky":{"hooks":{"pre-commit":"lint-staged","pre-push":"npm test"}},"lint-staged":{"*.{js,ts,tsx}":"eslint --fix"},"dependencies":{"@fortawesome/fontawesome-svg-core":"^1.2.36","@fortawesome/free-brands-svg-icons":"^5.15.4","@fortawesome/free-solid-svg-icons":"^5.15.4","@fortawesome/react-fontawesome":"^0.1.16","@reach/router":"^1.3.4","clsx":"^1.1.1","color":"^3.2.1","dayjs":"^1.10.7","dotenv":"^8.6.0","isomorphic-unfetch":"^3.1.0","normalize.css":"^8.0.1","react":"^16.14.0","react-circular-progressbar":"^2.0.4","react-dom":"^16.14.0","react-helmet":"^6.1.0","react-jss":"^10.8.2","react-markdown":"^4.3.1","react-scripts":"3.4.1","react-tooltip":"^4.2.21","typed.js":"^2.0.12"},"devDependencies":{"@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^10.4.9","@testing-library/user-event":"^12.8.3","@types/color":"^3.0.2","@types/jest":"^25.2.3","@types/node":"^14.17.32","@types/reach__router":"^1.3.9","@types/react":"^16.14.20","@types/react-dom":"^16.9.14","@types/react-helmet":"^5.0.19","@typescript-eslint/eslint-plugin":"^2.34.0","@typescript-eslint/parser":"^2.34.0","eslint":"6.8.0","eslint-config-prettier":"^6.15.0","eslint-plugin-prettier":"^3.4.1","eslint-plugin-react":"^7.26.1","husky":"^4.3.8","lint-staged":"^10.5.4","prettier":"^2.4.1","ts-node":"^9.1.1","ts-node-dev":"^1.1.8","typescript":"^3.9.10"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]}}')},35:function(e){e.exports=JSON.parse('[{"language":"Afrikaans","hello":"hallo"},{"language":"Albanian","hello":"P\xebrsh\xebndetje"},{"language":"Amharic","hello":"\u1230\u120b\u121d"},{"language":"Arabic","hello":"\u0645\u0631\u062d\u0628\u0627"},{"language":"Armenian","hello":"\u0532\u0561\u0580\u0565\u0582"},{"language":"Azerbaijani","hello":"Salam"},{"language":"Basque","hello":"Kaixo"},{"language":"Belarusian","hello":"\u0434\u043e\u0431\u0440\u044b \u0434\u0437\u0435\u043d\u044c"},{"language":"Bengali","hello":"\u09b9\u09cd\u09af\u09be\u09b2\u09cb"},{"language":"Bosnian","hello":"zdravo"},{"language":"Bulgarian","hello":"\u0417\u0434\u0440\u0430\u0432\u0435\u0439\u0442\u0435"},{"language":"Catalan","hello":"Hola"},{"language":"Cebuano","hello":"Hello"},{"language":"Chichewa","hello":"Moni"},{"language":"Chinese (Simplified)","hello":"\u60a8\u597d"},{"language":"Chinese (Traditional)","hello":"\u60a8\u597d"},{"language":"Corsican","hello":"Bonghjornu"},{"language":"Croatian","hello":"zdravo"},{"language":"Czech","hello":"Ahoj"},{"language":"Danish","hello":"Hej"},{"language":"Dutch","hello":"Hallo"},{"language":"English","hello":"Hello"},{"language":"Esperanto","hello":"Saluton"},{"language":"Estonian","hello":"Tere"},{"language":"Filipino","hello":"Hello"},{"language":"Finnish","hello":"Hei"},{"language":"French","hello":"Bonjour"},{"language":"Frisian","hello":"Hello"},{"language":"Galician","hello":"Ola"},{"language":"Georgian","hello":"\u10d2\u10d0\u10db\u10d0\u10e0\u10ef\u10dd\u10d1\u10d0"},{"language":"German","hello":"Hallo"},{"language":"Greek","hello":"\u0393\u03b5\u03b9\u03b1 \u03c3\u03b1\u03c2"},{"language":"Gujarati","hello":"\u0ab9\u0ac7\u0ab2\u0acb"},{"language":"Haitian Creole","hello":"Bonjou"},{"language":"Hausa","hello":"Sannu"},{"language":"Hawaiian","hello":"Aloha\u02bboe"},{"language":"Hebrew","hello":"\u05e9\u05dc\u05d5\u05dd"},{"language":"Hindi","hello":"\u0928\u092e\u0938\u094d\u0924\u0947"},{"language":"Hmong","hello":"Nyob zoo"},{"language":"Hungarian","hello":"Hell\xf3"},{"language":"Icelandic","hello":"Hall\xf3"},{"language":"Igbo","hello":"Ndewo"},{"language":"Indonesian","hello":"Halo"},{"language":"Irish","hello":"Dia duit"},{"language":"Italian","hello":"Ciao"},{"language":"Japanese","hello":"\u3053\u3093\u306b\u3061\u306f"},{"language":"Javanese","hello":"Hello"},{"language":"Kannada","hello":"\u0cb9\u0cb2\u0ccb"},{"language":"Kazakh","hello":"\u0421\u04d9\u043b\u0435\u043c"},{"language":"Khmer","hello":"\u1787\u17c6\u179a\u17b6\u1794\u179f\u17bd\u179a"},{"language":"Korean","hello":"\uc548\ub155\ud558\uc138\uc694."},{"language":"Kurdish (Kurmanji)","hello":"Hello"},{"language":"Kyrgyz","hello":"\u0441\u0430\u043b\u0430\u043c"},{"language":"Lao","hello":"\u0eaa\u0eb0\u0e9a\u0eb2\u0e8d\u0e94\u0eb5"},{"language":"Latin","hello":"salve"},{"language":"Latvian","hello":"Labdien!"},{"language":"Lithuanian","hello":"Sveiki"},{"language":"Luxembourgish","hello":"Moien"},{"language":"Macedonian","hello":"\u0417\u0434\u0440\u0430\u0432\u043e"},{"language":"Malagasy","hello":"Hello"},{"language":"Malay","hello":"Hello"},{"language":"Malayalam","hello":"\u0d39\u0d32\u0d4b"},{"language":"Maltese","hello":"Hello"},{"language":"Maori","hello":"Hiha"},{"language":"Marathi","hello":"\u0939\u0945\u0932\u094b"},{"language":"Mongolian","hello":"\u0421\u0430\u0439\u043d \u0431\u0430\u0439\u043d\u0430 \u0443\u0443"},{"language":"Myanmar (Burmese)","hello":"\u1019\u1004\u103a\u1039\u1002\u101c\u102c\u1015\u102b"},{"language":"Nepali","hello":"\u0928\u092e\u0938\u094d\u0924\u0947"},{"language":"Norwegian","hello":"Hallo"},{"language":"Pashto","hello":"\u0633\u0644\u0627\u0645"},{"language":"Persian","hello":"\u0633\u0644\u0627\u0645"},{"language":"Polish","hello":"Cze\u015b\u0107"},{"language":"Portuguese","hello":"Ol\xe1"},{"language":"Punjabi","hello":"\u0a39\u0a48\u0a32\u0a4b"},{"language":"Romanian","hello":"Alo"},{"language":"Russian","hello":"\u043f\u0440\u0438\u0432\u0435\u0442"},{"language":"Samoan","hello":"Talofa"},{"language":"Scots Gaelic","hello":"Hello"},{"language":"Serbian","hello":"\u0417\u0434\u0440\u0430\u0432\u043e"},{"language":"Sesotho","hello":"Hello"},{"language":"Shona","hello":"Hello"},{"language":"Sindhi","hello":"\u0647\u064a\u0644\u0648"},{"language":"Sinhala","hello":"\u0dc4\u0dd9\u0dbd\u0ddd"},{"language":"Slovak","hello":"ahoj"},{"language":"Slovenian","hello":"Pozdravljeni"},{"language":"Somali","hello":"Hello"},{"language":"Spanish","hello":"Hola"},{"language":"Sundanese","hello":"halo"},{"language":"Swahili","hello":"Sawa"},{"language":"Swedish","hello":"Hall\xe5"},{"language":"Tajik","hello":"\u0421\u0430\u043b\u043e\u043c"},{"language":"Tamil","hello":"\u0bb9\u0bb2\u0bc7\u0bbe"},{"language":"Telugu","hello":"\u0c39\u0c32\u0c4b"},{"language":"Thai","hello":"\u0e2a\u0e27\u0e31\u0e2a\u0e14\u0e35"},{"language":"Turkish","hello":"Merhaba"},{"language":"Ukranian","hello":"\u0417\u0434\u0440\u0430\u0441\u0442\u0443\u0439\u0442\u0435"},{"language":"Urdu","hello":"\u06c1\u06cc\u0644\u0648"},{"language":"Uzbek","hello":"Salom"},{"language":"Vietnamese","hello":"Xin ch\xe0o"},{"language":"Welsh","hello":"Helo"},{"language":"Xhosa","hello":"Sawubona"},{"language":"Yiddish","hello":"\u05d4\u05e2\u05dc\u05d0"},{"language":"Yoruba","hello":"Kaabo"},{"language":"Zulu","hello":"Sawubona"}]')},36:function(e){e.exports=JSON.parse('{"metadata":{"title":"Apprenticeship in Software Engineering","subtitle":"Specialization in Data Science","info":"Long story short, I\'ve been thinking about pursuing a postgraduate degree in software engineering for a while now but, eventually, I\'ve decided to go my way. So, here it is, my self-curated apprenticeship program in software engineering! I will be attending courses listed below and will be doing practical assignments throughout my studies but it won\'t necessarily be my priority to pursue any form of \'certificate of completion\'. We\'ll all see how it goes. :)"},"semesters":[{"name":"1. Semester","dates":{"start":"2022-01-01","end":"2022-06-30"},"courses":[{"courseName":"SWE 510 Introduction to Computer Science","sections":[{"title":"Introduction to Computer Science and Programming Specialization","url":"https://www.coursera.org/specializations/introduction-computer-science-programming","progress":{"completed":0,"total":3}},{"title":"Computer Science Algorithms","url":"https://brilliant.org/paths/computer-science-algorithms/","progress":{"completed":1,"total":3}}]},{"courseName":"SWE 513 Introduction to Object Oriented Programming","sections":[{"title":"Object Oriented Programming in Java Specialization","url":"https://www.coursera.org/specializations/object-oriented-programming","progress":{"completed":4,"total":4}}]},{"courseName":"SWE 515 Database Systems","sections":[{"title":"Database Systems Specialization","url":"https://www.coursera.org/specializations/database-systems","progress":{"completed":0,"total":4}}]},{"courseName":"SWE 517 Principles of Software Engineering","sections":[{"title":"Java Programming and Software Engineering Fundamentals Specialization","url":"https://www.coursera.org/specializations/java-programming","progress":{"completed":0,"total":5}}]},{"courseName":"MAT 510 Mathematics I","sections":[{"title":"Math Foundations","url":"https://brilliant.org/paths/math-foundations/","progress":{"completed":3,"total":7}},{"title":"Logic Foundations","url":"https://brilliant.org/paths/logic-foundations/","progress":{"completed":2,"total":4}}]}]},{"name":"2. Semester","dates":{"start":"2022-07-01","end":"2022-12-31"},"courses":[{"courseName":"SWE 520 Python Programming","sections":[{"title":"Python 3 Programming Specialization","url":"https://www.coursera.org/specializations/python-3-programming","progress":{"completed":5,"total":5}}]},{"courseName":"SWE 523 Software Requirements Engineering","sections":[{"title":"Requirements Engineering: Secure Software Specifications Specialization","url":"https://www.coursera.org/specializations/requirements-engineering-secure-software","progress":{"completed":0,"total":5}}]},{"courseName":"SWE 525 Software Development Lifecycle","sections":[{"title":"Software Development Lifecycle Specialization","url":"https://www.coursera.org/specializations/software-development-lifecycle","progress":{"completed":0,"total":4}}]},{"courseName":"SWE 527 Software Design and Architecture","sections":[{"title":"Software Design and Architecture Specialization","url":"https://www.coursera.org/specializations/software-design-architecture","progress":{"completed":0,"total":4}}]},{"courseName":"MAT 520 Mathematics II","sections":[{"title":"Intermediate Math","url":"https://brilliant.org/paths/intermediate-math/","progress":{"completed":0,"total":8}}]}]},{"name":"3. Semester","dates":{"start":"2023-01-01","end":"2023-06-30"},"courses":[{"courseName":"SWE 530 Introduction to Operating Systems","sections":[{"title":"Introduction to Operating Systems Specialization","url":"https://www.coursera.org/specializations/codio-introduction-operating-systems","progress":{"completed":0,"total":4}}]},{"courseName":"SWE 533 Secure Software Development","sections":[{"title":"Secure Coding Practices Specialization","url":"https://www.coursera.org/specializations/secure-coding-practices","progress":{"completed":2,"total":4}}]},{"courseName":"SWE 535 Managing Software Development","sections":[{"title":"Software Product Management Specialization","url":"https://www.coursera.org/specializations/product-management","progress":{"completed":0,"total":6}}]},{"courseName":"SWE 537 Software Verification and Validation","sections":[{"title":"Software Testing and Automation Specialization","url":"https://www.coursera.org/specializations/software-testing-automation","progress":{"completed":0,"total":4}}]},{"courseName":"MAT 530 Mathematics III","sections":[{"title":"Road to Calculus + Advanced Math","url":"https://brilliant.org/paths/calculus-advanced-math/","progress":{"completed":0,"total":9}}]}]},{"name":"4. Semester","dates":{"start":"2023-07-01","end":"2023-12-31"},"courses":[{"courseName":"SWE 540 Computer Systems Security","sections":[{"title":"Introduction to Cyber Security Specialization","url":"https://www.coursera.org/specializations/intro-cyber-security","progress":{"completed":0,"total":4}}]},{"courseName":"SWE 543 Data Structures and Algorithms","sections":[{"title":"Data Structures and Algorithms Specialization","url":"https://www.coursera.org/specializations/data-structures-algorithms","progress":{"completed":0,"total":6}}]},{"courseName":"SWE 545 Human-Computer Interaction","sections":[{"title":"Interaction Design Specialization","url":"https://www.coursera.org/specializations/interaction-design","progress":{"completed":0,"total":8}}]},{"courseName":"SWE 547 Computer Networking","sections":[{"title":"Computer Communications Specialization","url":"https://www.coursera.org/specializations/computer-communications","progress":{"completed":0,"total":4}}]},{"courseName":"MAT 540 Mathematics IV","sections":[{"title":"College Mathematics","url":"https://brilliant.org/paths/college-mathematics/","progress":{"completed":0,"total":6}},{"title":"Infinity & Number Theory","url":"https://brilliant.org/paths/infinity-number-theory/","progress":{"completed":0,"total":3}}]}]},{"name":"5. Semester","dates":{"start":"2024-01-01","end":"2024-06-30"},"courses":[{"courseName":"SWE 550 Cloud Computing","sections":[{"title":"Cloud Computing Specialization","url":"https://www.coursera.org/specializations/cloud-computing","progress":{"completed":0,"total":6}}]},{"courseName":"SWE 553 Blockchain Technology","sections":[{"title":"Blockchain Specialization","url":"https://www.coursera.org/specializations/blockchain","progress":{"completed":0,"total":4}}]},{"courseName":"DSC 550 Introduction to Statistics and Probability","sections":[{"title":"Probability & Statistics","url":"https://brilliant.org/paths/probability-statistics/","progress":{"completed":0,"total":4}}]},{"courseName":"DSC 553 Introduction to Data Science","sections":[{"title":"Data Science Specialization","url":"https://www.coursera.org/specializations/jhu-data-science","progress":{"completed":0,"total":10}}]},{"courseName":"MAT 550 Discrete Mathematics","sections":[{"title":"Introduction to Discrete Mathematics for Computer Science Specialization","url":"https://www.coursera.org/specializations/discrete-mathematics","progress":{"completed":0,"total":5}}]}]},{"name":"6. Semester","dates":{"start":"2024-07-01","end":"2024-12-31"},"courses":[{"courseName":"DSC 560 Machine Learning","sections":[{"title":"Machine Learning Specialization","url":"https://www.coursera.org/specializations/machine-learning","progress":{"completed":0,"total":4}}]},{"courseName":"DSC 563 Applied Data Science","sections":[{"title":"Applied Data Science with Python Specialization","url":"https://www.coursera.org/specializations/data-science-python","progress":{"completed":0,"total":5}}]},{"courseName":"DSC 565 Computer Vision","sections":[{"title":"First Principles of Computer Vision Specialization","url":"https://www.coursera.org/specializations/firstprinciplesofcomputervision","progress":{"completed":0,"total":5}}]},{"courseName":"DSC 567 Autonomous Systems Engineering","sections":[{"title":"Self-Driving Cars Specialization","url":"https://www.coursera.org/specializations/self-driving-cars","progress":{"completed":0,"total":4}}]},{"courseName":"MAT 560 Mathematics for Machine Learning","sections":[{"title":"Mathematics for Machine Learning Specialization","url":"https://www.coursera.org/specializations/mathematics-machine-learning","progress":{"completed":0,"total":3}}]}]}]}')},37:function(e){e.exports=JSON.parse('{"metadata":{"title":"Apprenticeship in Business Administration","subtitle":"Specialization in Innovation and Entrepreneurship","info":""},"semesters":[{"name":"1. Semester","dates":{"start":"2022-01-01","end":"2022-12-31"},"courses":[{"courseName":"BA 510 Business Foundations","sections":[{"title":"Business Foundations Specialization","url":"https://www.coursera.org/specializations/wharton-business-foundations","progress":{"completed":0,"total":6}}]},{"courseName":"BA 513 Entrepreneurship","sections":[{"title":"Entrepreneurship Specialization","url":"https://www.coursera.org/specializations/wharton-entrepreneurship","progress":{"completed":0,"total":5}}]},{"courseName":"BA 515 Financial Technology","sections":[{"title":"Fintech: Foundations & Applications of Financial Technology Specialization","url":"https://www.coursera.org/specializations/wharton-fintech","progress":{"completed":0,"total":4}}]}]},{"name":"2. Semester","dates":{"start":"2023-01-01","end":"2023-12-31"},"courses":[{"courseName":"BA 520 Innovation and Entrepreneurship","sections":[{"title":"Innovation and Entrepreneurship Specialization","url":"https://www.coursera.org/specializations/innovation-entrepreneurship","progress":{"completed":0,"total":4}}]},{"courseName":"BA 523 Social Entrepreneurship","sections":[{"title":"Social Entrepreneurship Specialization","url":"https://www.coursera.org/specializations/social-entrepreneurship-cbs","progress":{"completed":0,"total":3}}]},{"courseName":"BA 525 Startup Entrepreneurship","sections":[{"title":"Startup Entrepreneurship Specialization","url":"https://www.coursera.org/specializations/startup-entrepreneurship","progress":{"completed":0,"total":4}}]}]},{"name":"3. Semester","dates":{"start":"2024-01-01","end":"2024-12-31"},"courses":[{"courseName":"BA 530 Practical Applications","sections":[{"title":"How to Start Your Own Business Specialization","url":"https://www.coursera.org/specializations/start-your-own-business","progress":{"completed":0,"total":6}}]},{"courseName":"BA 533 Tech Entrepreneurship","sections":[{"title":"How to Build a Startup","url":"https://www.udacity.com/course/how-to-build-a-startup--ep245","progress":{"completed":0,"total":1}},{"title":"Product Design","url":"https://www.udacity.com/course/product-design--ud509","progress":{"completed":0,"total":1}},{"title":"Rapid Prototyping","url":"https://www.udacity.com/course/rapid-prototyping--ud723","progress":{"completed":0,"total":1}},{"title":"App Monetization","url":"https://www.udacity.com/course/app-monetization--ud518","progress":{"completed":0,"total":1}},{"title":"App Marketing","url":"https://www.udacity.com/course/app-marketing--ud719","progress":{"completed":0,"total":1}},{"title":"Get Your Startup Started","url":"https://www.udacity.com/course/get-your-startup-started--ud806","progress":{"completed":0,"total":1}}]}]}]}')},56:function(e){e.exports=JSON.parse('{"mainLine":"Hi! I\'m \xc7a\u011flar.","typed":["I\'m a Developer.","I\'m a Software Engineering Apprentice. :)","I\'m an INTJ-T through and through."]}')},59:function(e,t,a){e.exports=a(165)},6:function(e){e.exports=JSON.parse('{"title":"\xc7a\u011flar Tural\u0131 | Software Engineering Apprentice","description":"\xc7a\u011flar Tural\u0131\'s personal portfolio website","keywords":"\xc7a\u011flar Tural\u0131, Caglar Turali, JavaScript, TypeScript, React, Fullstack JavaScript, Node, Flutter, Dart, Vue, MongoDB, MEAN stack, MERN stack, GatsbyJS, NextJS, Bilen Adam, Astroloci","homepage":"https://turali.js.org","themeColor":"#21252b","image":"https://turali.js.org/images/logo512.png","verification":{"google":"yoA6kTc96mzuKG5z93MpyxJbTBmCeHRsP64QEEGuI28"}}')}},[[59,1,2]]]); +//# sourceMappingURL=main.f92c850d.chunk.js.map \ No newline at end of file diff --git a/static/js/main.4d6aa943.chunk.js.map b/static/js/main.f92c850d.chunk.js.map similarity index 99% rename from static/js/main.4d6aa943.chunk.js.map rename to static/js/main.f92c850d.chunk.js.map index 5df8ebab8..ad9fee77e 100644 --- a/static/js/main.4d6aa943.chunk.js.map +++ b/static/js/main.f92c850d.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["data/tabs lazy /^/.//.*/.md$/ groupOptions: {} namespace object","theme/icons.ts","theme/dimens.ts","theme/fonts.ts","layouts/Main/components/Header/NavBar/NavItem/styles.ts","theme/colors.ts","layouts/Main/components/Header/NavBar/NavItem/index.tsx","layouts/Main/components/Header/NavBar/styles.ts","layouts/Main/components/Header/NavBar/index.tsx","layouts/Main/components/Header/styles.ts","layouts/Main/components/Header/index.tsx","components/IconLink/styles.ts","components/IconLink/index.tsx","components/ButtonLink/styles.ts","components/ButtonLink/index.tsx","utils/datetime.ts","utils/diploma.ts","utils/localStorage.ts","components/GHButton/index.tsx","hooks/useLocalStorageState.ts","views/Greeter/components/MainButtons/index.tsx","views/Greeter/components/MainButtons/styles.ts","utils/paths.ts","components/SEO/index.tsx","views/Greeter/styles.ts","views/Greeter/index.tsx","utils/helpers.ts","components/Container/styles.ts","components/Container/index.tsx","components/ProgressBar/index.tsx","views/Diploma/components/Semester/Course/Section/styles.ts","views/Diploma/components/Semester/Course/Section/index.tsx","views/Diploma/components/Semester/Course/index.tsx","views/Diploma/components/Semester/Course/styles.ts","views/Diploma/components/Semester/styles.ts","views/Diploma/components/Semester/index.tsx","views/Diploma/index.tsx","views/Diploma/styles.ts","data/index.tsx","layouts/Main/components/LeftBar/styles.ts","layouts/Main/components/LeftBar/index.tsx","layouts/Main/components/Explorer/styles.ts","layouts/Main/components/Explorer/index.tsx","layouts/Main/components/StatusBar/styles.ts","layouts/Main/components/StatusBar/index.tsx","layouts/Main/styles.ts","layouts/Main/index.tsx","components/MDTab/index.tsx","components/MDTab/styles.ts","routes.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["map","webpackAsyncContext","req","__webpack_require__","o","Promise","resolve","then","e","Error","code","ids","id","t","keys","Object","module","exports","library","add","fab","faHome","faGraduationCap","faCheckSquare","faCoffee","faSlidersH","faUniversity","faCodeBranch","faTimes","faSmile","faStar","faCopy","faSearch","faCog","faQuestionCircle","breakpoints","widths","heights","sansFont","root","display","navText","marginLeft","currentTab","color","paddingLeft","otherTab","useStyles","createUseStyles","styles","NavItem","name","url","iconProps","mdFileName","classes","className","to","getProps","isCurrent","size","onClick","preventDefault","stopPropagation","navigate","icon","title","fontFamily","height","list","listStyle","margin","padding","listItem","borderRight","Color","darken","string","borderTop","cursor","fontSize","letterSpacing","textTransform","transition","borderTopColor","background","lighten","Navbar","tabs","tab","key","position","top","left","width","Header","NavBar","link","marginBottom","iconWrapper","badge","right","backgroundColor","borderRadius","opacity","IconLink","isInternal","iconComp","aria-label","href","target","rel","contents","alignItems","minHeight","text","fontWeight","count","ButtonLink","showCount","formatDate","isoDate","formatStr","dayjs","format","progressAverage","nums","precision","total","reduce","prev","current","parseFloat","length","toFixed","calculateSectionProgress","section","progress","completed","calculateCourseProgress","course","sections","progresses","calculateSemesterProgress","semester","courses","filter","c","isOptional","calculateDiplomaProgress","diploma","semesters","buildRecordObject","data","lastChecked","Date","now","isRecordUsable","record","timeout","undefined","isRecordExpired","GHButton","resource","attr","endpoint","btnProps","useState","loading","setLoading","defaultValue","value","defaultObj","JSON","parse","window","localStorage","getItem","stringify","state","setState","useEffect","setItem","useLocalStorageState","attrCountRecord","setAttrCountRecord","fetchApi","a","fetch","response","json","flexDirection","marginTop","justifyContent","MainButtons","contactData","repoUrl","parts","URL","pathname","split","repo","pop","username","getGHCredentials","ghButtons","mainContact","find","isMain","btn","SEO","description","lang","meta","metaDescription","metadata","Helmet","htmlAttributes","titleTemplate","content","keywords","homepage","themeColor","property","image","verification","google","concat","heading","textShadow","userSelect","typedWrap","textDecoration","borderBottom","Greeter","staticData","options","strings","typed","typeSpeed","backSpeed","loop","smartBackspace","Typed","destroy","hello","randomInt","Math","floor","random","randomHello","mainLine","style","whiteSpace","maxWidth","paddingBottom","Container","seo","children","ProgressBar","bgColor","containerStyles","fillerStyles","toolTip","boxShadow","maxHeight","bookItem","marginRight","stroke","strokeLinecap","Section","progressText","data-tip","strokeWidth","data-class","data-place","courseDetails","optional","bookPanel","Course","courseData","showDetails","courseName","courseProgress","courseProgressText","open","clsx","overDue","Semester","semesterData","showOptionalCourses","dates","start","end","semDuration","endDate","isAfter","isOverDue","tip","lineHeight","border","outline","Diploma","diplomaData","subtitle","info","s","pages","comp","pkg","repository","sweData","baData","divider","LeftBar","internals","renderData","contactItem","closed","Explorer","bottom","StatusBar","inverse","html","body","boxSizing","button","transform","explorerOpen","MainLayout","mdpage","MDTab","fileName","setContents","file","default","loadFile","source","View","Comp","rest","Tab","path","from","noThrow","App","Main","routes","Boolean","location","hostname","match","dotenv","config","ReactDOM","render","StrictMode","document","getElementById","navigator","serviceWorker","ready","registration","unregister","catch","error","console","message"],"mappings":"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","file":"static/js/main.4d6aa943.chunk.js","sourcesContent":["var map = {\n\t\"./certificates.md\": [\n\t\t167,\n\t\t3\n\t],\n\t\"./education.md\": [\n\t\t168,\n\t\t4\n\t],\n\t\"./projects.md\": [\n\t\t169,\n\t\t5\n\t],\n\t\"./skills.md\": [\n\t\t170,\n\t\t6\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__.t(id, 7);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 163;\nmodule.exports = webpackAsyncContext;","import { library } from '@fortawesome/fontawesome-svg-core';\nimport { fab } from '@fortawesome/free-brands-svg-icons';\nimport {\n faHome,\n faGraduationCap,\n faCheckSquare,\n faCoffee,\n faSlidersH,\n faUniversity,\n faCodeBranch,\n faTimes,\n faSmile,\n faStar,\n faCopy,\n faSearch,\n faCog,\n faQuestionCircle,\n} from '@fortawesome/free-solid-svg-icons';\n\nlibrary.add(\n fab,\n faHome,\n faGraduationCap,\n faCheckSquare,\n faCoffee,\n faSlidersH,\n faUniversity,\n faCodeBranch,\n faTimes,\n faSmile,\n faStar,\n faCopy,\n faSearch,\n faCog,\n faQuestionCircle,\n);\n","/**\n * Dimensions.\n */\nexport const sSize = '1.2rem';\nexport const msSize = '1.4rem';\nexport const mSize = '1.6rem';\nexport const mlSize = '2.0rem';\nexport const mllSize = '2.4rem';\nexport const lSize = '3.2rem';\nexport const xlSize = '4.8rem';\n\nexport const breakpoints = {\n desktop: '45rem',\n};\n\nexport const widths = {\n leftBar: 50,\n explorer: 200,\n};\n\nexport const heights = {\n navBar: 40,\n statusBar: 22,\n};\n","/**\n * App fonts.\n */\nexport const sansFont = \"'Ubuntu', sans-serif\";\nexport const monoFont = \"'Ubuntu Mono', monospace\";\n","/**\n * NavItem component styles.\n */\nimport { Styles } from 'react-jss';\nimport { breakpoints, textLightBlue, textWhite } from '../../../../../../theme';\n\nexport default {\n root: {\n '& a[aria-current=\"page\"] span': {\n display: 'inline-block !important',\n },\n },\n navText: {\n marginLeft: '8px',\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n display: 'none',\n },\n },\n currentTab: {\n '& .closeButton': {\n color: textLightBlue,\n marginLeft: '8px',\n paddingLeft: '8px',\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n paddingLeft: '8px',\n },\n '&:hover': {\n color: textWhite,\n },\n },\n },\n otherTab: {\n '& .closeButton': {\n display: 'none',\n },\n },\n} as Styles;\n","/**\n * App colors.\n */\nexport const bgDarkBlue = '#21252b';\nexport const bgMidBlue = '#282c34';\nexport const bgLightBlue = '#333842';\nexport const lbIconColor = '#9599a0';\n\nexport const textWhite = '#f3f3f3';\nexport const textMid = '#c2c2c2';\nexport const textDark = '#909295';\nexport const textBlue = '#636d83';\nexport const textLightBlue = '#abb2bf';\n\nexport const green = '#98c379';\nexport const red = '#e06c75';\nexport const cyan = '#56b6c2';\nexport const midBlue = '#42a5f5';\nexport const orange = '#d19a66';\nexport const jsOrange = '#ffca28';\nexport const darkOrange = '#e44d26';\nexport const lightBrown = '#6e6352';\nexport const pink = '#e13e76';\nexport const purple = '#c678dd';\n","/**\n * NavItem component.\n */\nimport React from 'react';\nimport { Link, navigate } from '@reach/router';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { createUseStyles } from 'react-jss';\nimport { TabSpec, TabLink } from '../../../../../../models';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nconst NavItem: React.FC = ({\n name,\n url,\n mdFileName, // eslint-disable-line @typescript-eslint/no-unused-vars\n ...iconProps\n}) => {\n const classes = useStyles();\n\n const onCloseClicked = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n navigate('/');\n };\n\n return (\n \n {\n return {\n className: isCurrent ? classes.currentTab : classes.otherTab,\n };\n }}\n >\n \n {name}\n \n \n \n );\n};\n\nexport default NavItem;\n","/**\n * NavBar component styles.\n */\nimport { Styles } from 'react-jss';\nimport Color from 'color';\nimport {\n bgMidBlue,\n bgDarkBlue,\n textWhite,\n textLightBlue,\n sSize,\n breakpoints,\n sansFont,\n heights,\n} from '../../../../../theme';\n\nexport default {\n root: {\n fontFamily: sansFont,\n height: heights.navBar,\n },\n list: {\n color: textLightBlue,\n listStyle: 'none',\n margin: '0',\n padding: '0',\n },\n listItem: {\n display: 'inline-block',\n '& a': {\n borderRight: `1px solid ${Color(bgMidBlue).darken(0.05).string()}`,\n borderTop: `4px solid ${bgDarkBlue}`,\n cursor: 'pointer',\n display: 'inline-block',\n fontSize: sSize,\n letterSpacing: '0.5px',\n padding: '10px 15px',\n textTransform: 'lowercase',\n transition: 'background, border-color 250ms ease',\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n letterSpacing: '0',\n padding: '10px',\n },\n '&:hover, &[aria-current=\"page\"]': {\n borderTopColor: bgDarkBlue,\n background: Color(bgDarkBlue).lighten(0.02).string(),\n color: textWhite,\n },\n '&[aria-current=\"page\"]': {\n background: bgMidBlue,\n borderTopColor: Color(bgDarkBlue).lighten(0.05).string(),\n },\n },\n },\n} as Styles;\n","/**\n * NavBar component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport NavItem from './NavItem';\nimport { TabProps } from '../../..';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nconst Navbar: React.FC = ({ tabs }) => {\n const classes = useStyles();\n\n return (\n \n );\n};\n\nexport default Navbar;\n","/**\n * Header component styles.\n */\nimport { Styles } from 'react-jss';\nimport { bgDarkBlue, heights } from '../../../../theme';\n\nexport default {\n root: {\n background: bgDarkBlue,\n position: 'sticky',\n top: 0,\n left: 0,\n width: '100%',\n height: heights.navBar,\n },\n} as Styles;\n","/**\n * Header component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport NavBar from './NavBar';\nimport { TabProps } from '../..';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nconst Header: React.FC = ({ tabs }) => {\n const classes = useStyles();\n\n return (\n
\n \n
\n );\n};\n\nexport default Header;\n","/**\n * IconLink component styles.\n */\nimport { Styles } from 'react-jss';\nimport Color from 'color';\nimport { lbIconColor, green } from '../../theme';\n\nexport default {\n link: {\n color: lbIconColor,\n cursor: 'pointer',\n marginBottom: '10px',\n transition: 'color 100ms ease',\n '&:hover': {\n color: Color(lbIconColor).lighten(0.2).string(),\n },\n '&:last-of-type': {\n marginBottom: '20px',\n },\n },\n iconWrapper: {\n position: 'relative',\n display: 'inline-block',\n },\n icon: {\n padding: '10px',\n },\n badge: {\n position: 'absolute',\n right: '4px',\n top: '4px',\n fontSize: '0.8em',\n backgroundColor: green,\n borderRadius: '4px',\n color: '#111',\n padding: '1px 2px',\n opacity: '0.9',\n },\n} as Styles;\n","/**\n * IconLink component.\n */\nimport React from 'react';\nimport { Link } from '@reach/router';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\nimport { createUseStyles } from 'react-jss';\nimport { ContactItem } from '../../models';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nconst IconLink: React.FC = ({\n name,\n url,\n icon,\n isInternal,\n badge,\n}) => {\n const classes = useStyles();\n\n const iconComp = (\n \n \n {badge && {badge}}\n \n );\n\n if (isInternal) {\n return (\n \n {iconComp}\n \n );\n }\n\n return (\n \n {iconComp}\n \n );\n};\n\nexport default IconLink;\n","/**\n * ButtonLink component styles.\n */\nimport { Styles } from 'react-jss';\nimport Color from 'color';\nimport { bgDarkBlue, textLightBlue, midBlue, sSize } from '../../theme';\n\nexport default {\n root: {\n background: bgDarkBlue,\n borderRadius: '4px',\n color: textLightBlue,\n display: 'flex',\n margin: '8px',\n transition: 'color 500ms ease',\n '&:hover': {\n background: Color(bgDarkBlue).darken(0.1).string(),\n },\n '&:hover .icon': {\n color: midBlue,\n },\n },\n contents: {\n alignItems: 'center',\n display: 'flex',\n minHeight: '24px',\n padding: '6px 10px',\n },\n text: {\n fontSize: sSize,\n fontWeight: 400,\n marginLeft: '6px',\n },\n count: {\n fontSize: sSize,\n background: Color(bgDarkBlue).lighten(0.5).string(),\n borderRadius: '50%',\n marginLeft: '10px',\n padding: '4px 8px',\n },\n} as Styles;\n","/**\n * ButtonLink component.\n */\nimport React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconProp, SizeProp } from '@fortawesome/fontawesome-svg-core';\nimport { createUseStyles } from 'react-jss';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface ButtonLinkProps {\n href: string;\n title: string;\n text: string;\n icon: IconProp;\n size: SizeProp;\n showCount?: boolean;\n count?: number;\n}\n\nconst ButtonLink: React.FC = ({\n href,\n title,\n icon,\n size,\n text,\n showCount,\n count,\n}) => {\n const classes = useStyles();\n\n return (\n \n \n \n {text}\n {!!showCount && {count}}\n \n \n );\n};\n\nexport default ButtonLink;\n","import dayjs from 'dayjs';\n\n/**\n * Formats date string.\n * @param isoDate Date in ISO8601 format\n * @param formatStr Format string. Defaults to DD/MM/YYYY.\n * @returns Formatted date\n */\nexport const formatDate = (isoDate: string, formatStr = 'DD/MM/YYYY') => {\n return dayjs(isoDate).format(formatStr);\n};\n\n/**\n * Determines if the due date for the semester is passed or not.\n * @param endDate End date for the semester.\n * @param progress Progress percentage. Use whole number.\n */\nexport const isOverDue = (endDate: string, progress: number): boolean => {\n const now = dayjs();\n const end = dayjs(endDate);\n return now.isAfter(end) && progress !== 100;\n};\n","import { DiplomaTypes } from '../models';\n\nconst progressAverage = (nums: number[], precision: number) => {\n const total = nums.reduce((prev, current) => prev + current, 0);\n return parseFloat((total / nums.length).toFixed(precision));\n};\n\nexport const calculateSectionProgress = (\n section: DiplomaTypes.Section,\n): number => {\n const {\n progress: { completed, total },\n } = section;\n return parseFloat(((completed / total) * 100).toFixed(0));\n};\n\nexport const calculateCourseProgress = (\n course: DiplomaTypes.Course,\n precision = 0,\n): number => {\n const { sections } = course;\n const progresses = sections.map(calculateSectionProgress);\n return progressAverage(progresses, precision);\n};\n\nexport const calculateSemesterProgress = (\n semester: DiplomaTypes.Semester,\n precision = 0,\n): number => {\n // Consider core content only.\n const courses = semester.courses.filter((c) => !c.isOptional);\n const progresses = courses.map(calculateCourseProgress);\n return progressAverage(progresses, precision);\n};\n\nexport const calculateDiplomaProgress = (\n diploma: DiplomaTypes.Curriculum,\n precision = 0,\n): number => {\n const { semesters } = diploma;\n const progresses = semesters.map(calculateSemesterProgress);\n return progressAverage(progresses, precision);\n};\n","import { LocalCache } from '../models';\n\n/**\n * Builds a record object by attaching necessary field(s)\n * @param data Data to store\n */\nexport const buildRecordObject = (data: T) => {\n return {\n data,\n lastChecked: Date.now(),\n } as LocalCache.Record;\n};\n\n/**\n * Returns true if the record has expired\n * otherwise returns false\n * @param record Local storage record\n * @param timeout Timeout in minutes\n */\nexport const isRecordExpired = (\n record: LocalCache.Record,\n timeout: number,\n) => {\n return Date.now() > record.lastChecked + timeout * 60 * 1000;\n};\n\n/**\n * Returns true if the record is \"usable\"\n * otherwise returns false\n * @param record Local storage record\n * @param timeout Timeout in minutes\n */\nexport const isRecordUsable = (\n record: LocalCache.Record,\n timeout: number,\n) => {\n return record.data !== undefined && !isRecordExpired(record, timeout);\n};\n","/**\n * Generic GHButton component.\n */\nimport React, { useState, useEffect } from 'react';\nimport { useLocalStorageState } from '../../hooks';\nimport ButtonLink, { ButtonLinkProps } from '../ButtonLink';\nimport { LocalCache } from '../../models';\nimport { buildRecordObject, isRecordUsable } from '../../utils';\n\nexport interface GHButtonProps extends ButtonLinkProps {\n resource: {\n endpoint: string;\n attr: string;\n };\n}\n\nconst GHButton: React.FC = ({\n resource: { attr, endpoint },\n timeout = 10, // 10 mins\n ...btnProps\n}) => {\n const [loading, setLoading] = useState(false);\n const [attrCountRecord, setAttrCountRecord] = useLocalStorageState<\n number | undefined\n >(attr, undefined);\n\n useEffect(() => {\n const fetchApi = async (): Promise => {\n const response = await fetch(endpoint);\n const json = await response.json();\n\n if (json[attr] >= 0) {\n setAttrCountRecord(buildRecordObject(json[attr]));\n }\n\n setLoading(false);\n };\n\n if (!isRecordUsable(attrCountRecord, timeout)) {\n fetchApi();\n }\n });\n\n return (\n \n );\n};\n\nexport default GHButton;\n","import { useState, useEffect } from 'react';\nimport { LocalCache } from '../models';\nimport { buildRecordObject } from '../utils';\n\n/**\n * Custom hook that uses local storage\n * @param key Key\n * @param defaultValue Default value\n */\nexport const useLocalStorageState = (\n key: string,\n defaultValue: T,\n): [\n LocalCache.Record,\n React.Dispatch>>,\n] => {\n const [state, setState] = useState>(() => {\n const defaultObj = buildRecordObject(defaultValue);\n let value;\n\n try {\n value = JSON.parse(\n window.localStorage.getItem(key) || JSON.stringify(defaultObj),\n ) as LocalCache.Record;\n } catch (e) {\n value = defaultObj;\n }\n return value;\n });\n\n useEffect(() => {\n window.localStorage.setItem(key, JSON.stringify(state));\n }, [state, key]);\n\n return [state, setState];\n};\n","/**\n * MainButtons component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\nimport ButtonLink from '../../../../components/ButtonLink';\nimport GHButton, { GHButtonProps } from '../../../../components/GHButton';\nimport { ContactItem } from '../../../../models';\nimport { getGHCredentials } from '../../../../utils';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface MainButtonsProps {\n contactData: ContactItem[];\n repoUrl: string;\n}\n\nconst MainButtons: React.FC = ({ contactData, repoUrl }) => {\n const classes = useStyles();\n\n const { repo, username } = getGHCredentials(repoUrl);\n\n const ghButtons: GHButtonProps[] = [\n // Follow button\n {\n resource: {\n endpoint: `https://api.github.com/users/${username}`,\n attr: 'followers',\n },\n href: `https://github.com/${username}`,\n title: `Follow @${username} on GitHub`,\n icon: ['fab', 'github'],\n size: 'lg',\n text: `Follow @${username}`,\n },\n // Stargazers button\n {\n resource: {\n endpoint: `https://api.github.com/repos/${username}/${repo}`,\n attr: 'stargazers_count',\n },\n href: repoUrl,\n title: `Star ${username}/${repo} on GitHub`,\n icon: 'star',\n size: 'sm',\n text: 'Star',\n },\n ];\n\n const mainContact = contactData.find((c) => c.isMain) as ContactItem;\n\n return (\n
\n
\n {ghButtons.map((btn) => (\n \n ))}\n
\n
\n \n
\n
\n );\n};\n\nexport default MainButtons;\n","/**\n * MainButtons component styles.\n */\nimport { Styles } from 'react-jss';\n\nexport default {\n root: {\n display: 'flex',\n flexDirection: 'column',\n marginTop: '50px',\n '& div': {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n },\n} as Styles;\n","/**\n * Extracts username and repo name from given url.\n * @param repoUrl GitHub url\n */\nexport const getGHCredentials = (\n repoUrl: string,\n): { username: string; repo: string } => {\n const parts = new URL(repoUrl).pathname.split('/');\n const repo = parts.pop() || '';\n const username = parts.pop() || '';\n return { repo, username };\n};\n","import React from 'react';\nimport { Helmet } from 'react-helmet';\nimport metadata from '../../data/json/metadata.json';\n\nexport interface SEOProps {\n title: string;\n description?: string;\n lang?: string;\n meta?: HTMLMetaElement[];\n}\n\nconst SEO: React.FC = ({\n title,\n description,\n lang = 'en',\n meta = [],\n}) => {\n const metaDescription = description || metadata.description;\n\n return (\n \n );\n};\n\nexport default SEO;\n","/**\n * Greeter component styles.\n */\nimport { Styles } from 'react-jss';\n\nimport {\n bgDarkBlue,\n textMid,\n textDark,\n midBlue,\n mllSize,\n lSize,\n breakpoints,\n mlSize,\n sansFont,\n heights,\n} from '../../theme';\n\nexport default {\n root: {\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: `calc(100vh - ${heights.navBar + heights.statusBar}px)`,\n justifyContent: 'center',\n fontFamily: sansFont,\n },\n heading: {\n color: textMid,\n fontWeight: 400,\n fontSize: lSize,\n letterSpacing: '2px',\n margin: '10px 20px',\n padding: '0',\n textShadow: `5px 5px ${bgDarkBlue}`,\n userSelect: 'none',\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n fontSize: mllSize,\n },\n },\n typedWrap: {\n color: textDark,\n fontSize: mllSize,\n fontWeight: 400,\n margin: '5px',\n padding: '0',\n userSelect: 'none',\n '& a': {\n textDecoration: 'none',\n borderBottom: `1px dashed ${textDark}`,\n },\n '& strong': {\n fontWeight: '500',\n },\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n fontSize: mlSize,\n },\n },\n '.typed-cursor': {\n color: midBlue,\n },\n} as Styles;\n","/**\n * Greeter component.\n */\nimport React, { useEffect } from 'react';\nimport Typed from 'typed.js';\nimport { createUseStyles } from 'react-jss';\nimport MainButtons, { MainButtonsProps } from './components/MainButtons';\nimport SEO from '../../components/SEO';\nimport { Static } from '../../models';\nimport { randomHello } from '../../utils';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface GreeterProps extends MainButtonsProps {\n staticData: Static;\n}\n\nconst Greeter: React.FC = ({\n staticData,\n contactData,\n repoUrl,\n}) => {\n const classes = useStyles();\n\n useEffect(() => {\n const options = {\n strings: staticData.typed,\n typeSpeed: 70,\n backSpeed: 50,\n loop: true,\n smartBackspace: true,\n };\n\n const typed = new Typed('#typed-insert-point', options);\n\n return () => {\n // Make sure to destroy Typed instance on unmounting\n // to prevent memory leaks\n typed.destroy();\n };\n }, [staticData]);\n\n const hello = randomHello();\n\n return (\n <>\n \n
\n

{staticData.mainLine}

\n
\n \n
\n \n
\n \n );\n};\n\nexport default Greeter;\n","import hello from '../data/json/hello.json';\n\n/**\n * Says Hello in a random language.\n */\nexport const randomHello = (): string => {\n const randomInt = Math.floor(Math.random() * hello.length);\n return `${hello[randomInt].hello}!`;\n};\n","/**\n * Container component styles.\n */\nimport { Styles } from 'react-jss';\nimport {\n breakpoints,\n midBlue,\n textLightBlue,\n textMid,\n mSize,\n} from '../../theme';\n\nexport default {\n root: {\n maxWidth: '960px',\n padding: '0 20px',\n marginBottom: '200px',\n '& a:hover': {\n color: textMid,\n },\n '& li': {\n listStyle: 'square',\n },\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n marginLeft: 0,\n },\n },\n content: {\n color: textLightBlue,\n fontSize: mSize,\n '& h3': {\n color: midBlue,\n },\n '& ul': {\n '& li': {\n paddingBottom: '4px',\n },\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n paddingLeft: '20px',\n },\n },\n },\n} as Styles;\n","/**\n * Container components used in tabs.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport SEO, { SEOProps } from '../SEO';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface ContainerProps {\n seo?: SEOProps;\n}\n\nconst Container: React.FC = ({ seo, children }) => {\n const classes = useStyles();\n\n return (\n <>\n {!!seo && }\n
\n
{children}
\n
\n \n );\n};\n\nexport default Container;\n","/**\n * ProgressBar component.\n */\nimport React from 'react';\nimport Color from 'color';\nimport { bgMidBlue, green } from '../../theme';\n\nexport interface ProgressBarProps {\n value: number;\n color?: string;\n bgColor?: string;\n width?: number;\n height?: number;\n}\n\nconst ProgressBar: React.FC = ({\n value,\n color = green,\n bgColor = Color(bgMidBlue).lighten(0.125).string(),\n width = 500,\n height = 3,\n}) => {\n const containerStyles = {\n width,\n height,\n backgroundColor: bgColor,\n marginTop: '3px',\n };\n\n const fillerStyles = {\n height: '100%',\n width: `${value}%`,\n backgroundColor: color,\n transition: 'width 500ms ease',\n };\n\n return (\n
\n
\n
\n );\n};\n\nexport default ProgressBar;\n","/**\n * Book component styles.\n */\nimport { Styles } from 'react-jss';\nimport { bgLightBlue, green } from '../../../../../../theme';\n\nexport default {\n toolTip: {\n boxShadow: '0 0 32px black',\n padding: 0,\n '& img': {\n maxHeight: '180px',\n },\n },\n bookItem: {\n display: 'flex',\n alignItems: 'center',\n marginTop: '6px',\n marginBottom: '6px',\n },\n progress: {\n marginRight: '8px',\n width: '20px',\n '@global': {\n '.CircularProgressbar-path': {\n stroke: green,\n strokeLinecap: 'butt',\n },\n '.CircularProgressbar-trail': {\n stroke: bgLightBlue,\n },\n '.CircularProgressbar-text': {\n // fill: 'yellow',\n },\n '.CircularProgressbar-background': {\n // fill: 'green',\n },\n },\n },\n} as Styles;\n","/**\n * Section component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport { CircularProgressbar } from 'react-circular-progressbar';\nimport 'react-circular-progressbar/dist/styles.css';\nimport { DiplomaTypes } from '../../../../../../models';\nimport { calculateSectionProgress } from '../../../../../../utils';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface SectionProps {\n section: DiplomaTypes.Section;\n}\n\nconst Section: React.FC = ({ section }) => {\n const classes = useStyles();\n const { title, url } = section;\n\n // eslint-disable-next-line\n const thumbnailToolTip = `\n
\n \n
\n `;\n\n const progress = calculateSectionProgress(section);\n const progressText = `${progress}% done`;\n\n return (\n
  • \n \n \n \n\n \n {title}\n \n
  • \n );\n};\n\nexport default Section;\n","/**\n * Course component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport clsx from 'clsx';\nimport ProgressBar from '../../../../../components/ProgressBar';\nimport { DetailsPanel, DiplomaTypes } from '../../../../../models';\nimport { calculateCourseProgress } from '../../../../../utils';\nimport Section from './Section';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface CourseProps extends DetailsPanel {\n courseData: DiplomaTypes.Course;\n}\n\nconst Course: React.FC = ({ courseData, showDetails = false }) => {\n const classes = useStyles();\n const { courseName, sections, isOptional } = courseData;\n\n const courseProgress = calculateCourseProgress(courseData);\n let courseProgressText = `${courseProgress}% done`;\n isOptional &&\n (courseProgressText = `Optional Content: ${courseProgressText}`);\n\n return (\n \n \n {courseName}\n \n \n
    \n {sections.map((section) => (\n
    \n ))}\n
    \n \n );\n};\n\nexport default Course;\n","/**\n * Course component styles.\n */\nimport { Styles } from 'react-jss';\n\nexport default {\n courseDetails: {\n marginLeft: '20px',\n marginTop: '10px',\n },\n optional: {\n opacity: 0.7,\n },\n bookPanel: {\n marginLeft: '20px',\n marginTop: '6px',\n paddingBottom: '10px',\n },\n} as Styles;\n","/**\n * Semester component styles.\n */\nimport { Styles } from 'react-jss';\nimport { orange, bgDarkBlue, sSize } from '../../../../theme';\n\nexport default {\n root: {\n // marginTop: '10px',\n marginBottom: '10px',\n },\n overDue: {\n marginLeft: '10px',\n padding: '2px 4px',\n fontSize: sSize,\n fontWeight: '700',\n textTransform: 'uppercase',\n backgroundColor: orange,\n color: bgDarkBlue,\n borderRadius: '8px',\n },\n} as Styles;\n","/**\n * Semester component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport { DetailsPanel, DiplomaTypes } from '../../../../models';\nimport {\n calculateSemesterProgress,\n formatDate,\n isOverDue,\n} from '../../../../utils';\nimport Course from './Course';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface SemesterProps extends DetailsPanel {\n semesterData: DiplomaTypes.Semester;\n showOptionalCourses?: boolean;\n}\n\nconst Semester: React.FC = ({\n semesterData,\n showDetails = true,\n showOptionalCourses = false,\n}) => {\n const classes = useStyles();\n const {\n name,\n courses,\n dates: { start, end },\n } = semesterData;\n\n const semDuration =\n start && end\n ? `${formatDate(start)} - ${formatDate(end)}`\n : 'Dates not set';\n const semProgress = calculateSemesterProgress(semesterData);\n const overDue = isOverDue(end, semProgress);\n\n return (\n
    \n \n \n {name}\n {overDue && overdue}\n \n \n {courses\n .filter((course) => showOptionalCourses || !course.isOptional)\n .map((course) => (\n \n ))}\n
    \n );\n};\n\nexport default Semester;\n","/**\n * Diploma component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport ReactTooltip from 'react-tooltip';\nimport Container from '../../components/Container';\nimport Semester from './components/Semester';\nimport { DiplomaTypes } from '../../models';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface DiplomaProps {\n diplomaData: DiplomaTypes.Curriculum;\n}\n\nconst Diploma: React.FC = ({ diplomaData }) => {\n const classes = useStyles();\n const {\n semesters,\n metadata: { title, subtitle, info },\n } = diplomaData;\n\n return (\n \n \n

    {title}

    \n \n {subtitle &&

    {subtitle}

    }\n \n
    \n {semesters.map((s) => (\n \n ))}\n
    \n \n
    \n );\n};\n\nexport default Diploma;\n","/**\n * Diploma component styles.\n */\nimport { Styles } from 'react-jss';\n\nexport default {\n title: {\n display: 'inline-block',\n cursor: 'help',\n '&>h2': {\n display: 'inline-block',\n marginBottom: '0',\n },\n '&>svg': {\n marginLeft: '8px',\n },\n '&>p': {\n fontSize: '1.8rem',\n marginTop: '0.3em',\n },\n },\n tip: {\n maxWidth: '360px',\n fontSize: '1.5rem !important',\n lineHeight: '2rem',\n },\n contents: {\n '&>details': {\n '& summary': {\n border: 'none',\n outline: 'none',\n '& span': {\n cursor: 'pointer',\n },\n },\n padding: '10px 0',\n\n '&:last-child': {\n paddingBottom: '200px',\n },\n },\n },\n} as Styles;\n","import React from 'react';\nimport Greeter from '../views/Greeter';\nimport Diploma from '../views/Diploma';\nimport { PageLink, TabLink } from '../models';\nimport { jsOrange, midBlue, green, pink } from '../theme/colors';\n\nimport staticData from './json/static.json';\nimport contactData from './json/contact.json';\nimport sweData from './json/swe.json';\nimport baData from './json/ba.json';\nimport pkg from '../../package.json';\n\nimport { calculateDiplomaProgress } from '../utils';\n\nexport const pages: PageLink[] = [\n {\n name: 'Home',\n url: '/',\n icon: 'home',\n isInternal: true,\n comp: () => (\n \n ),\n },\n {\n name: 'Software Engineering',\n url: '/swe',\n icon: 'graduation-cap',\n isInternal: true,\n badge: `${calculateDiplomaProgress(sweData, 0)}%`,\n comp: () => ,\n },\n {\n name: 'Business Administration',\n url: '/ba',\n icon: 'graduation-cap',\n isInternal: true,\n badge: `${calculateDiplomaProgress(baData, 0)}%`,\n comp: () => ,\n },\n];\n\nexport const tabs: TabLink[] = [\n {\n name: 'skills.js',\n url: '/skills',\n icon: ['fab', 'js'],\n color: jsOrange,\n mdFileName: 'skills',\n },\n {\n name: '.educationrc',\n url: '/education',\n icon: 'university',\n color: midBlue,\n mdFileName: 'education',\n },\n {\n name: 'projects.config',\n url: '/projects',\n icon: 'sliders-h',\n color: green,\n mdFileName: 'projects',\n },\n {\n name: 'certificates.sass',\n url: '/certificates',\n icon: ['fab', 'sass'],\n color: pink,\n mdFileName: 'certificates',\n },\n];\n","/**\n * LeftBar component styles.\n */\nimport { Styles } from 'react-jss';\nimport Color from 'color';\nimport { bgLightBlue, breakpoints, widths } from '../../../../theme';\n\nexport default {\n root: {\n alignItems: 'center',\n background: bgLightBlue,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n height: '100vh',\n position: 'fixed',\n left: '0',\n top: '0',\n width: `${widths.leftBar}px`,\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n display: 'none',\n },\n '& div': {\n display: 'flex',\n alignItems: 'center',\n flexDirection: 'column',\n padding: '10px 0',\n },\n },\n divider: {\n height: '1px',\n background: Color(bgLightBlue).lighten(0.35).string(),\n width: '95%',\n marginTop: '4px',\n marginBottom: '12px',\n },\n} as Styles;\n","/**\n * LeftBar component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport IconLink from '../../../../components/IconLink';\nimport { ContactItem } from '../../../../models';\nimport { pages } from './../../../../data';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface LeftBarProps {\n contactData: ContactItem[];\n}\n\nconst LeftBar: React.FC = ({ contactData }) => {\n const classes = useStyles();\n\n // Internal links.\n const internals = pages.map(({ name, url, icon, isInternal, badge }) => ({\n name,\n url,\n icon,\n isInternal,\n badge,\n }));\n\n const bottom: ContactItem[] = [\n {\n name: 'Useless button!',\n url: '',\n icon: 'cog',\n isInternal: true,\n },\n ];\n\n const renderData = (data: ContactItem[]) => {\n return data.map((contactItem) => (\n \n ));\n };\n\n const renderDivider = () => ;\n\n return (\n
    \n
    \n {renderData(internals)}\n {renderDivider()}\n {renderData(contactData)}\n
    \n
    {renderData(bottom)}
    \n
    \n );\n};\n\nexport default LeftBar;\n","/**\n * Explorer component styles.\n */\nimport { Styles } from 'react-jss';\nimport { widths, bgDarkBlue } from '../../../../theme';\n\nexport default {\n root: {\n background: bgDarkBlue,\n height: '100vh',\n position: 'fixed',\n top: '0',\n left: widths.leftBar,\n width: widths.explorer,\n '& li': {\n listStyle: 'none',\n padding: '6px 12px',\n },\n },\n closed: {\n display: 'none',\n },\n} as Styles;\n","/**\n * Explorer component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport clsx from 'clsx';\nimport { TabProps } from '../..';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface ExplorerProps {\n open: boolean;\n}\n\nconst Explorer: React.FC = ({ tabs, open }) => {\n const classes = useStyles();\n\n return (\n
    \n {tabs.map((t) => (\n
  • {t.mdFileName}
  • \n ))}\n
    \n );\n};\n\nexport default Explorer;\n","/**\n * StatusBar component styles.\n */\nimport { Styles } from 'react-jss';\nimport {\n bgDarkBlue,\n bgMidBlue,\n textLightBlue,\n sSize,\n sansFont,\n heights,\n} from '../../../../theme';\n\nexport default {\n root: {\n bottom: '0',\n background: bgDarkBlue,\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n fontFamily: sansFont,\n fontWeight: 400,\n left: '0',\n position: 'fixed',\n width: '100vw',\n height: heights.statusBar,\n '& span, & a': {\n display: 'inline-block',\n padding: '2px 8px',\n '&:hover': {\n background: bgMidBlue,\n cursor: 'pointer',\n },\n },\n },\n icon: {\n color: textLightBlue,\n },\n text: {\n color: textLightBlue,\n fontSize: sSize,\n padding: '0 4px',\n },\n} as Styles;\n","/**\n * StatusBar component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport styles from './styles';\nimport pkg from '../../../../../package.json';\n\nconst useStyles = createUseStyles(styles);\n\nconst StatusBar: React.FC = () => {\n const classes = useStyles();\n\n return (\n \n );\n};\n\nexport default StatusBar;\n","/**\n * Main layout styles.\n */\nimport Color from 'color';\nimport { Styles } from 'react-jss';\nimport {\n bgMidBlue,\n textLightBlue,\n mSize,\n monoFont,\n breakpoints,\n widths,\n} from '../../theme';\n\n// Notice that it's an object containing\n// global \"base\" values for the rest of the app.\nexport default {\n '@global': {\n html: {\n fontSize: '62.5%',\n },\n body: {\n fontFamily: monoFont,\n fontSize: mSize,\n background: bgMidBlue,\n boxSizing: 'border-box',\n },\n button: {\n cursor: 'pointer',\n '&:disabled': {\n cursor: 'default',\n },\n },\n a: {\n color: textLightBlue,\n textDecoration: 'none',\n transition: 'color 500ms ease',\n '&:visited': {\n color: Color(textLightBlue).darken(0.1).string(),\n },\n },\n '.color-transform': {\n transform: 'color 500ms ease',\n },\n },\n root: {\n position: 'absolute',\n height: '100vh',\n width: `calc(100% - ${widths.leftBar}px)`,\n padding: 0,\n margin: 0,\n },\n content: {\n position: 'relative',\n top: 0,\n left: `${widths.leftBar}px`,\n right: 0,\n width: '100%',\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n left: '0',\n },\n },\n explorerOpen: {\n left: `${widths.leftBar + widths.explorer}px`,\n },\n} as Styles;\n","/**\n * Main layout.\n */\nimport React, { useState } from 'react';\nimport { createUseStyles } from 'react-jss';\nimport clsx from 'clsx';\nimport Header from './components/Header';\nimport LeftBar from './components/LeftBar';\nimport Explorer from './components/Explorer';\nimport StatusBar from './components/StatusBar';\nimport { ContactItem, TabLink } from '../../models';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface TabProps {\n tabs: TabLink[];\n}\n\nexport interface ContactProps {\n contactData: ContactItem[];\n}\n\nexport type MainLayoutProps = TabProps & ContactProps;\n\nconst MainLayout: React.FC = ({\n children,\n tabs,\n contactData,\n}) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [explorerOpen, setExplorerOpen] = useState(false);\n\n const classes = useStyles();\n\n return (\n
    \n \n \n \n
    \n {children}\n \n \n
    \n );\n};\n\nexport default MainLayout;\n","/**\n * MDTab component.\n */\nimport React, { useEffect, useState } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport Container from '../Container';\nimport { createUseStyles } from 'react-jss';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface MDTabProps {\n fileName: string;\n}\n\nconst MDTab: React.FC = ({ fileName }) => {\n const [contents, setContents] = useState('');\n\n const classes = useStyles();\n\n useEffect(() => {\n const loadFile = async () => {\n const file = await import(`../../data/tabs/${fileName}.md`);\n const response = await fetch(file.default);\n const text = await response.text();\n setContents(text);\n };\n loadFile();\n }, [fileName]);\n\n return (\n \n \n \n );\n};\n\nexport default MDTab;\n","/**\n * MDTab component styles.\n */\nimport { Styles } from 'react-jss';\n\nexport default {\n mdpage: {\n paddingBottom: '10rem',\n },\n} as Styles;\n","import React from 'react';\nimport { RouteComponentProps, Redirect } from '@reach/router';\nimport MDTab, { MDTabProps } from './components/MDTab';\nimport { PageProps } from './models';\n\nimport { pages, tabs } from './data/';\n\ntype ViewProps = RouteComponentProps & PageProps;\nconst View: React.FC = ({ comp: Comp, ...rest }) => {\n return ;\n};\n\ntype TabProps = RouteComponentProps & MDTabProps;\nconst Tab: React.FC = ({ fileName }) => {\n return ;\n};\n\nexport default [\n pages.map(({ name, url, comp, ...rest }) => (\n \n )),\n tabs.map(({ name, url, mdFileName }) => (\n \n )),\n ,\n];\n","import React from 'react';\nimport { Router } from '@reach/router';\nimport MainLayout from './layouts/Main';\nimport routes from './routes';\n\nimport { tabs } from './data';\nimport contactData from './data/json/contact.json';\n\nconst App: React.FC = () => (\n \n {routes}\n \n);\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\n/* eslint-disable */\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/,\n ),\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA',\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.',\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.',\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n\n/* eslint-enable */\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport 'normalize.css';\nimport './theme/icons';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\nimport dotenv from 'dotenv';\ndotenv.config();\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root'),\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["data/tabs lazy /^/.//.*/.md$/ groupOptions: {} namespace object","theme/icons.ts","theme/dimens.ts","theme/fonts.ts","layouts/Main/components/Header/NavBar/NavItem/styles.ts","theme/colors.ts","layouts/Main/components/Header/NavBar/NavItem/index.tsx","layouts/Main/components/Header/NavBar/styles.ts","layouts/Main/components/Header/NavBar/index.tsx","layouts/Main/components/Header/styles.ts","layouts/Main/components/Header/index.tsx","components/IconLink/styles.ts","components/IconLink/index.tsx","components/ButtonLink/styles.ts","components/ButtonLink/index.tsx","utils/datetime.ts","utils/diploma.ts","utils/localStorage.ts","components/GHButton/index.tsx","hooks/useLocalStorageState.ts","views/Greeter/components/MainButtons/index.tsx","views/Greeter/components/MainButtons/styles.ts","utils/paths.ts","components/SEO/index.tsx","views/Greeter/styles.ts","views/Greeter/index.tsx","utils/helpers.ts","components/Container/styles.ts","components/Container/index.tsx","components/ProgressBar/index.tsx","views/Diploma/components/Semester/Course/Section/styles.ts","views/Diploma/components/Semester/Course/Section/index.tsx","views/Diploma/components/Semester/Course/index.tsx","views/Diploma/components/Semester/Course/styles.ts","views/Diploma/components/Semester/styles.ts","views/Diploma/components/Semester/index.tsx","views/Diploma/index.tsx","views/Diploma/styles.ts","data/index.tsx","layouts/Main/components/LeftBar/styles.ts","layouts/Main/components/LeftBar/index.tsx","layouts/Main/components/Explorer/styles.ts","layouts/Main/components/Explorer/index.tsx","layouts/Main/components/StatusBar/styles.ts","layouts/Main/components/StatusBar/index.tsx","layouts/Main/styles.ts","layouts/Main/index.tsx","components/MDTab/index.tsx","components/MDTab/styles.ts","routes.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["map","webpackAsyncContext","req","__webpack_require__","o","Promise","resolve","then","e","Error","code","ids","id","t","keys","Object","module","exports","library","add","fab","faHome","faGraduationCap","faCheckSquare","faCoffee","faSlidersH","faUniversity","faCodeBranch","faTimes","faSmile","faStar","faCopy","faSearch","faCog","faQuestionCircle","breakpoints","widths","heights","sansFont","root","display","navText","marginLeft","currentTab","color","paddingLeft","otherTab","useStyles","createUseStyles","styles","NavItem","name","url","iconProps","mdFileName","classes","className","to","getProps","isCurrent","size","onClick","preventDefault","stopPropagation","navigate","icon","title","fontFamily","height","list","listStyle","margin","padding","listItem","borderRight","Color","darken","string","borderTop","cursor","fontSize","letterSpacing","textTransform","transition","borderTopColor","background","lighten","Navbar","tabs","tab","key","position","top","left","width","Header","NavBar","link","marginBottom","iconWrapper","badge","right","backgroundColor","borderRadius","opacity","IconLink","isInternal","iconComp","aria-label","href","target","rel","contents","alignItems","minHeight","text","fontWeight","count","ButtonLink","showCount","formatDate","isoDate","formatStr","dayjs","format","progressAverage","nums","precision","total","reduce","prev","current","parseFloat","length","toFixed","calculateSectionProgress","section","progress","completed","calculateCourseProgress","course","sections","progresses","calculateSemesterProgress","semester","courses","filter","c","isOptional","calculateDiplomaProgress","diploma","semesters","buildRecordObject","data","lastChecked","Date","now","isRecordUsable","record","timeout","undefined","isRecordExpired","GHButton","resource","attr","endpoint","btnProps","useState","loading","setLoading","defaultValue","value","defaultObj","JSON","parse","window","localStorage","getItem","stringify","state","setState","useEffect","setItem","useLocalStorageState","attrCountRecord","setAttrCountRecord","fetchApi","a","fetch","response","json","flexDirection","marginTop","justifyContent","MainButtons","contactData","repoUrl","parts","URL","pathname","split","repo","pop","username","getGHCredentials","ghButtons","mainContact","find","isMain","btn","SEO","description","lang","meta","metaDescription","metadata","Helmet","htmlAttributes","titleTemplate","content","keywords","homepage","themeColor","property","image","verification","google","concat","heading","textShadow","userSelect","typedWrap","textDecoration","borderBottom","Greeter","staticData","options","strings","typed","typeSpeed","backSpeed","loop","smartBackspace","Typed","destroy","hello","randomInt","Math","floor","random","randomHello","mainLine","style","whiteSpace","maxWidth","paddingBottom","Container","seo","children","ProgressBar","bgColor","containerStyles","fillerStyles","toolTip","boxShadow","maxHeight","bookItem","marginRight","stroke","strokeLinecap","Section","progressText","data-tip","strokeWidth","data-class","data-place","courseDetails","optional","bookPanel","Course","courseData","showDetails","courseName","courseProgress","courseProgressText","open","clsx","overDue","Semester","semesterData","showOptionalCourses","dates","start","end","semDuration","endDate","isAfter","isOverDue","tip","lineHeight","border","outline","Diploma","diplomaData","subtitle","info","s","pages","comp","pkg","repository","sweData","baData","divider","LeftBar","internals","renderData","contactItem","closed","Explorer","bottom","StatusBar","inverse","html","body","boxSizing","button","transform","explorerOpen","MainLayout","mdpage","MDTab","fileName","setContents","file","default","loadFile","source","View","Comp","rest","Tab","path","from","noThrow","App","Main","routes","Boolean","location","hostname","match","dotenv","config","ReactDOM","render","StrictMode","document","getElementById","navigator","serviceWorker","ready","registration","unregister","catch","error","console","message"],"mappings":"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","file":"static/js/main.f92c850d.chunk.js","sourcesContent":["var map = {\n\t\"./certificates.md\": [\n\t\t167,\n\t\t3\n\t],\n\t\"./education.md\": [\n\t\t168,\n\t\t4\n\t],\n\t\"./projects.md\": [\n\t\t169,\n\t\t5\n\t],\n\t\"./skills.md\": [\n\t\t170,\n\t\t6\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__.t(id, 7);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 163;\nmodule.exports = webpackAsyncContext;","import { library } from '@fortawesome/fontawesome-svg-core';\nimport { fab } from '@fortawesome/free-brands-svg-icons';\nimport {\n faHome,\n faGraduationCap,\n faCheckSquare,\n faCoffee,\n faSlidersH,\n faUniversity,\n faCodeBranch,\n faTimes,\n faSmile,\n faStar,\n faCopy,\n faSearch,\n faCog,\n faQuestionCircle,\n} from '@fortawesome/free-solid-svg-icons';\n\nlibrary.add(\n fab,\n faHome,\n faGraduationCap,\n faCheckSquare,\n faCoffee,\n faSlidersH,\n faUniversity,\n faCodeBranch,\n faTimes,\n faSmile,\n faStar,\n faCopy,\n faSearch,\n faCog,\n faQuestionCircle,\n);\n","/**\n * Dimensions.\n */\nexport const sSize = '1.2rem';\nexport const msSize = '1.4rem';\nexport const mSize = '1.6rem';\nexport const mlSize = '2.0rem';\nexport const mllSize = '2.4rem';\nexport const lSize = '3.2rem';\nexport const xlSize = '4.8rem';\n\nexport const breakpoints = {\n desktop: '45rem',\n};\n\nexport const widths = {\n leftBar: 50,\n explorer: 200,\n};\n\nexport const heights = {\n navBar: 40,\n statusBar: 22,\n};\n","/**\n * App fonts.\n */\nexport const sansFont = \"'Ubuntu', sans-serif\";\nexport const monoFont = \"'Ubuntu Mono', monospace\";\n","/**\n * NavItem component styles.\n */\nimport { Styles } from 'react-jss';\nimport { breakpoints, textLightBlue, textWhite } from '../../../../../../theme';\n\nexport default {\n root: {\n '& a[aria-current=\"page\"] span': {\n display: 'inline-block !important',\n },\n },\n navText: {\n marginLeft: '8px',\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n display: 'none',\n },\n },\n currentTab: {\n '& .closeButton': {\n color: textLightBlue,\n marginLeft: '8px',\n paddingLeft: '8px',\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n paddingLeft: '8px',\n },\n '&:hover': {\n color: textWhite,\n },\n },\n },\n otherTab: {\n '& .closeButton': {\n display: 'none',\n },\n },\n} as Styles;\n","/**\n * App colors.\n */\nexport const bgDarkBlue = '#21252b';\nexport const bgMidBlue = '#282c34';\nexport const bgLightBlue = '#333842';\nexport const lbIconColor = '#9599a0';\n\nexport const textWhite = '#f3f3f3';\nexport const textMid = '#c2c2c2';\nexport const textDark = '#909295';\nexport const textBlue = '#636d83';\nexport const textLightBlue = '#abb2bf';\n\nexport const green = '#98c379';\nexport const red = '#e06c75';\nexport const cyan = '#56b6c2';\nexport const midBlue = '#42a5f5';\nexport const orange = '#d19a66';\nexport const jsOrange = '#ffca28';\nexport const darkOrange = '#e44d26';\nexport const lightBrown = '#6e6352';\nexport const pink = '#e13e76';\nexport const purple = '#c678dd';\n","/**\n * NavItem component.\n */\nimport React from 'react';\nimport { Link, navigate } from '@reach/router';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { createUseStyles } from 'react-jss';\nimport { TabSpec, TabLink } from '../../../../../../models';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nconst NavItem: React.FC = ({\n name,\n url,\n mdFileName, // eslint-disable-line @typescript-eslint/no-unused-vars\n ...iconProps\n}) => {\n const classes = useStyles();\n\n const onCloseClicked = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n navigate('/');\n };\n\n return (\n \n {\n return {\n className: isCurrent ? classes.currentTab : classes.otherTab,\n };\n }}\n >\n \n {name}\n \n \n \n );\n};\n\nexport default NavItem;\n","/**\n * NavBar component styles.\n */\nimport { Styles } from 'react-jss';\nimport Color from 'color';\nimport {\n bgMidBlue,\n bgDarkBlue,\n textWhite,\n textLightBlue,\n sSize,\n breakpoints,\n sansFont,\n heights,\n} from '../../../../../theme';\n\nexport default {\n root: {\n fontFamily: sansFont,\n height: heights.navBar,\n },\n list: {\n color: textLightBlue,\n listStyle: 'none',\n margin: '0',\n padding: '0',\n },\n listItem: {\n display: 'inline-block',\n '& a': {\n borderRight: `1px solid ${Color(bgMidBlue).darken(0.05).string()}`,\n borderTop: `4px solid ${bgDarkBlue}`,\n cursor: 'pointer',\n display: 'inline-block',\n fontSize: sSize,\n letterSpacing: '0.5px',\n padding: '10px 15px',\n textTransform: 'lowercase',\n transition: 'background, border-color 250ms ease',\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n letterSpacing: '0',\n padding: '10px',\n },\n '&:hover, &[aria-current=\"page\"]': {\n borderTopColor: bgDarkBlue,\n background: Color(bgDarkBlue).lighten(0.02).string(),\n color: textWhite,\n },\n '&[aria-current=\"page\"]': {\n background: bgMidBlue,\n borderTopColor: Color(bgDarkBlue).lighten(0.05).string(),\n },\n },\n },\n} as Styles;\n","/**\n * NavBar component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport NavItem from './NavItem';\nimport { TabProps } from '../../..';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nconst Navbar: React.FC = ({ tabs }) => {\n const classes = useStyles();\n\n return (\n \n );\n};\n\nexport default Navbar;\n","/**\n * Header component styles.\n */\nimport { Styles } from 'react-jss';\nimport { bgDarkBlue, heights } from '../../../../theme';\n\nexport default {\n root: {\n background: bgDarkBlue,\n position: 'sticky',\n top: 0,\n left: 0,\n width: '100%',\n height: heights.navBar,\n },\n} as Styles;\n","/**\n * Header component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport NavBar from './NavBar';\nimport { TabProps } from '../..';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nconst Header: React.FC = ({ tabs }) => {\n const classes = useStyles();\n\n return (\n
    \n \n
    \n );\n};\n\nexport default Header;\n","/**\n * IconLink component styles.\n */\nimport { Styles } from 'react-jss';\nimport Color from 'color';\nimport { lbIconColor, green } from '../../theme';\n\nexport default {\n link: {\n color: lbIconColor,\n cursor: 'pointer',\n marginBottom: '10px',\n transition: 'color 100ms ease',\n '&:hover': {\n color: Color(lbIconColor).lighten(0.2).string(),\n },\n '&:last-of-type': {\n marginBottom: '20px',\n },\n },\n iconWrapper: {\n position: 'relative',\n display: 'inline-block',\n },\n icon: {\n padding: '10px',\n },\n badge: {\n position: 'absolute',\n right: '4px',\n top: '4px',\n fontSize: '0.8em',\n backgroundColor: green,\n borderRadius: '4px',\n color: '#111',\n padding: '1px 2px',\n opacity: '0.9',\n },\n} as Styles;\n","/**\n * IconLink component.\n */\nimport React from 'react';\nimport { Link } from '@reach/router';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\nimport { createUseStyles } from 'react-jss';\nimport { ContactItem } from '../../models';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nconst IconLink: React.FC = ({\n name,\n url,\n icon,\n isInternal,\n badge,\n}) => {\n const classes = useStyles();\n\n const iconComp = (\n \n \n {badge && {badge}}\n \n );\n\n if (isInternal) {\n return (\n \n {iconComp}\n \n );\n }\n\n return (\n \n {iconComp}\n \n );\n};\n\nexport default IconLink;\n","/**\n * ButtonLink component styles.\n */\nimport { Styles } from 'react-jss';\nimport Color from 'color';\nimport { bgDarkBlue, textLightBlue, midBlue, sSize } from '../../theme';\n\nexport default {\n root: {\n background: bgDarkBlue,\n borderRadius: '4px',\n color: textLightBlue,\n display: 'flex',\n margin: '8px',\n transition: 'color 500ms ease',\n '&:hover': {\n background: Color(bgDarkBlue).darken(0.1).string(),\n },\n '&:hover .icon': {\n color: midBlue,\n },\n },\n contents: {\n alignItems: 'center',\n display: 'flex',\n minHeight: '24px',\n padding: '6px 10px',\n },\n text: {\n fontSize: sSize,\n fontWeight: 400,\n marginLeft: '6px',\n },\n count: {\n fontSize: sSize,\n background: Color(bgDarkBlue).lighten(0.5).string(),\n borderRadius: '50%',\n marginLeft: '10px',\n padding: '4px 8px',\n },\n} as Styles;\n","/**\n * ButtonLink component.\n */\nimport React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconProp, SizeProp } from '@fortawesome/fontawesome-svg-core';\nimport { createUseStyles } from 'react-jss';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface ButtonLinkProps {\n href: string;\n title: string;\n text: string;\n icon: IconProp;\n size: SizeProp;\n showCount?: boolean;\n count?: number;\n}\n\nconst ButtonLink: React.FC = ({\n href,\n title,\n icon,\n size,\n text,\n showCount,\n count,\n}) => {\n const classes = useStyles();\n\n return (\n \n \n \n {text}\n {!!showCount && {count}}\n \n \n );\n};\n\nexport default ButtonLink;\n","import dayjs from 'dayjs';\n\n/**\n * Formats date string.\n * @param isoDate Date in ISO8601 format\n * @param formatStr Format string. Defaults to DD/MM/YYYY.\n * @returns Formatted date\n */\nexport const formatDate = (isoDate: string, formatStr = 'DD/MM/YYYY') => {\n return dayjs(isoDate).format(formatStr);\n};\n\n/**\n * Determines if the due date for the semester is passed or not.\n * @param endDate End date for the semester.\n * @param progress Progress percentage. Use whole number.\n */\nexport const isOverDue = (endDate: string, progress: number): boolean => {\n const now = dayjs();\n const end = dayjs(endDate);\n return now.isAfter(end) && progress !== 100;\n};\n","import { DiplomaTypes } from '../models';\n\nconst progressAverage = (nums: number[], precision: number) => {\n const total = nums.reduce((prev, current) => prev + current, 0);\n return parseFloat((total / nums.length).toFixed(precision));\n};\n\nexport const calculateSectionProgress = (\n section: DiplomaTypes.Section,\n): number => {\n const {\n progress: { completed, total },\n } = section;\n return parseFloat(((completed / total) * 100).toFixed(0));\n};\n\nexport const calculateCourseProgress = (\n course: DiplomaTypes.Course,\n precision = 0,\n): number => {\n const { sections } = course;\n const progresses = sections.map(calculateSectionProgress);\n return progressAverage(progresses, precision);\n};\n\nexport const calculateSemesterProgress = (\n semester: DiplomaTypes.Semester,\n precision = 0,\n): number => {\n // Consider core content only.\n const courses = semester.courses.filter((c) => !c.isOptional);\n const progresses = courses.map(calculateCourseProgress);\n return progressAverage(progresses, precision);\n};\n\nexport const calculateDiplomaProgress = (\n diploma: DiplomaTypes.Curriculum,\n precision = 0,\n): number => {\n const { semesters } = diploma;\n const progresses = semesters.map(calculateSemesterProgress);\n return progressAverage(progresses, precision);\n};\n","import { LocalCache } from '../models';\n\n/**\n * Builds a record object by attaching necessary field(s)\n * @param data Data to store\n */\nexport const buildRecordObject = (data: T) => {\n return {\n data,\n lastChecked: Date.now(),\n } as LocalCache.Record;\n};\n\n/**\n * Returns true if the record has expired\n * otherwise returns false\n * @param record Local storage record\n * @param timeout Timeout in minutes\n */\nexport const isRecordExpired = (\n record: LocalCache.Record,\n timeout: number,\n) => {\n return Date.now() > record.lastChecked + timeout * 60 * 1000;\n};\n\n/**\n * Returns true if the record is \"usable\"\n * otherwise returns false\n * @param record Local storage record\n * @param timeout Timeout in minutes\n */\nexport const isRecordUsable = (\n record: LocalCache.Record,\n timeout: number,\n) => {\n return record.data !== undefined && !isRecordExpired(record, timeout);\n};\n","/**\n * Generic GHButton component.\n */\nimport React, { useState, useEffect } from 'react';\nimport { useLocalStorageState } from '../../hooks';\nimport ButtonLink, { ButtonLinkProps } from '../ButtonLink';\nimport { LocalCache } from '../../models';\nimport { buildRecordObject, isRecordUsable } from '../../utils';\n\nexport interface GHButtonProps extends ButtonLinkProps {\n resource: {\n endpoint: string;\n attr: string;\n };\n}\n\nconst GHButton: React.FC = ({\n resource: { attr, endpoint },\n timeout = 10, // 10 mins\n ...btnProps\n}) => {\n const [loading, setLoading] = useState(false);\n const [attrCountRecord, setAttrCountRecord] = useLocalStorageState<\n number | undefined\n >(attr, undefined);\n\n useEffect(() => {\n const fetchApi = async (): Promise => {\n const response = await fetch(endpoint);\n const json = await response.json();\n\n if (json[attr] >= 0) {\n setAttrCountRecord(buildRecordObject(json[attr]));\n }\n\n setLoading(false);\n };\n\n if (!isRecordUsable(attrCountRecord, timeout)) {\n fetchApi();\n }\n });\n\n return (\n \n );\n};\n\nexport default GHButton;\n","import { useState, useEffect } from 'react';\nimport { LocalCache } from '../models';\nimport { buildRecordObject } from '../utils';\n\n/**\n * Custom hook that uses local storage\n * @param key Key\n * @param defaultValue Default value\n */\nexport const useLocalStorageState = (\n key: string,\n defaultValue: T,\n): [\n LocalCache.Record,\n React.Dispatch>>,\n] => {\n const [state, setState] = useState>(() => {\n const defaultObj = buildRecordObject(defaultValue);\n let value;\n\n try {\n value = JSON.parse(\n window.localStorage.getItem(key) || JSON.stringify(defaultObj),\n ) as LocalCache.Record;\n } catch (e) {\n value = defaultObj;\n }\n return value;\n });\n\n useEffect(() => {\n window.localStorage.setItem(key, JSON.stringify(state));\n }, [state, key]);\n\n return [state, setState];\n};\n","/**\n * MainButtons component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\nimport ButtonLink from '../../../../components/ButtonLink';\nimport GHButton, { GHButtonProps } from '../../../../components/GHButton';\nimport { ContactItem } from '../../../../models';\nimport { getGHCredentials } from '../../../../utils';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface MainButtonsProps {\n contactData: ContactItem[];\n repoUrl: string;\n}\n\nconst MainButtons: React.FC = ({ contactData, repoUrl }) => {\n const classes = useStyles();\n\n const { repo, username } = getGHCredentials(repoUrl);\n\n const ghButtons: GHButtonProps[] = [\n // Follow button\n {\n resource: {\n endpoint: `https://api.github.com/users/${username}`,\n attr: 'followers',\n },\n href: `https://github.com/${username}`,\n title: `Follow @${username} on GitHub`,\n icon: ['fab', 'github'],\n size: 'lg',\n text: `Follow @${username}`,\n },\n // Stargazers button\n {\n resource: {\n endpoint: `https://api.github.com/repos/${username}/${repo}`,\n attr: 'stargazers_count',\n },\n href: repoUrl,\n title: `Star ${username}/${repo} on GitHub`,\n icon: 'star',\n size: 'sm',\n text: 'Star',\n },\n ];\n\n const mainContact = contactData.find((c) => c.isMain) as ContactItem;\n\n return (\n
    \n
    \n {ghButtons.map((btn) => (\n \n ))}\n
    \n
    \n \n
    \n
    \n );\n};\n\nexport default MainButtons;\n","/**\n * MainButtons component styles.\n */\nimport { Styles } from 'react-jss';\n\nexport default {\n root: {\n display: 'flex',\n flexDirection: 'column',\n marginTop: '50px',\n '& div': {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n },\n} as Styles;\n","/**\n * Extracts username and repo name from given url.\n * @param repoUrl GitHub url\n */\nexport const getGHCredentials = (\n repoUrl: string,\n): { username: string; repo: string } => {\n const parts = new URL(repoUrl).pathname.split('/');\n const repo = parts.pop() || '';\n const username = parts.pop() || '';\n return { repo, username };\n};\n","import React from 'react';\nimport { Helmet } from 'react-helmet';\nimport metadata from '../../data/json/metadata.json';\n\nexport interface SEOProps {\n title: string;\n description?: string;\n lang?: string;\n meta?: HTMLMetaElement[];\n}\n\nconst SEO: React.FC = ({\n title,\n description,\n lang = 'en',\n meta = [],\n}) => {\n const metaDescription = description || metadata.description;\n\n return (\n \n );\n};\n\nexport default SEO;\n","/**\n * Greeter component styles.\n */\nimport { Styles } from 'react-jss';\n\nimport {\n bgDarkBlue,\n textMid,\n textDark,\n midBlue,\n mllSize,\n lSize,\n breakpoints,\n mlSize,\n sansFont,\n heights,\n} from '../../theme';\n\nexport default {\n root: {\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: `calc(100vh - ${heights.navBar + heights.statusBar}px)`,\n justifyContent: 'center',\n fontFamily: sansFont,\n },\n heading: {\n color: textMid,\n fontWeight: 400,\n fontSize: lSize,\n letterSpacing: '2px',\n margin: '10px 20px',\n padding: '0',\n textShadow: `5px 5px ${bgDarkBlue}`,\n userSelect: 'none',\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n fontSize: mllSize,\n },\n },\n typedWrap: {\n color: textDark,\n fontSize: mllSize,\n fontWeight: 400,\n margin: '5px',\n padding: '0',\n userSelect: 'none',\n '& a': {\n textDecoration: 'none',\n borderBottom: `1px dashed ${textDark}`,\n },\n '& strong': {\n fontWeight: '500',\n },\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n fontSize: mlSize,\n },\n },\n '.typed-cursor': {\n color: midBlue,\n },\n} as Styles;\n","/**\n * Greeter component.\n */\nimport React, { useEffect } from 'react';\nimport Typed from 'typed.js';\nimport { createUseStyles } from 'react-jss';\nimport MainButtons, { MainButtonsProps } from './components/MainButtons';\nimport SEO from '../../components/SEO';\nimport { Static } from '../../models';\nimport { randomHello } from '../../utils';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface GreeterProps extends MainButtonsProps {\n staticData: Static;\n}\n\nconst Greeter: React.FC = ({\n staticData,\n contactData,\n repoUrl,\n}) => {\n const classes = useStyles();\n\n useEffect(() => {\n const options = {\n strings: staticData.typed,\n typeSpeed: 70,\n backSpeed: 50,\n loop: true,\n smartBackspace: true,\n };\n\n const typed = new Typed('#typed-insert-point', options);\n\n return () => {\n // Make sure to destroy Typed instance on unmounting\n // to prevent memory leaks\n typed.destroy();\n };\n }, [staticData]);\n\n const hello = randomHello();\n\n return (\n <>\n \n
    \n

    {staticData.mainLine}

    \n
    \n \n
    \n \n
    \n \n );\n};\n\nexport default Greeter;\n","import hello from '../data/json/hello.json';\n\n/**\n * Says Hello in a random language.\n */\nexport const randomHello = (): string => {\n const randomInt = Math.floor(Math.random() * hello.length);\n return `${hello[randomInt].hello}!`;\n};\n","/**\n * Container component styles.\n */\nimport { Styles } from 'react-jss';\nimport {\n breakpoints,\n midBlue,\n textLightBlue,\n textMid,\n mSize,\n} from '../../theme';\n\nexport default {\n root: {\n maxWidth: '960px',\n padding: '0 20px',\n marginBottom: '200px',\n '& a:hover': {\n color: textMid,\n },\n '& li': {\n listStyle: 'square',\n },\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n marginLeft: 0,\n },\n },\n content: {\n color: textLightBlue,\n fontSize: mSize,\n '& h3': {\n color: midBlue,\n },\n '& ul': {\n '& li': {\n paddingBottom: '4px',\n },\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n paddingLeft: '20px',\n },\n },\n },\n} as Styles;\n","/**\n * Container components used in tabs.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport SEO, { SEOProps } from '../SEO';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface ContainerProps {\n seo?: SEOProps;\n}\n\nconst Container: React.FC = ({ seo, children }) => {\n const classes = useStyles();\n\n return (\n <>\n {!!seo && }\n
    \n
    {children}
    \n
    \n \n );\n};\n\nexport default Container;\n","/**\n * ProgressBar component.\n */\nimport React from 'react';\nimport Color from 'color';\nimport { bgMidBlue, green } from '../../theme';\n\nexport interface ProgressBarProps {\n value: number;\n color?: string;\n bgColor?: string;\n width?: number;\n height?: number;\n}\n\nconst ProgressBar: React.FC = ({\n value,\n color = green,\n bgColor = Color(bgMidBlue).lighten(0.125).string(),\n width = 500,\n height = 3,\n}) => {\n const containerStyles = {\n width,\n height,\n backgroundColor: bgColor,\n marginTop: '3px',\n };\n\n const fillerStyles = {\n height: '100%',\n width: `${value}%`,\n backgroundColor: color,\n transition: 'width 500ms ease',\n };\n\n return (\n
    \n
    \n
    \n );\n};\n\nexport default ProgressBar;\n","/**\n * Book component styles.\n */\nimport { Styles } from 'react-jss';\nimport { bgLightBlue, green } from '../../../../../../theme';\n\nexport default {\n toolTip: {\n boxShadow: '0 0 32px black',\n padding: 0,\n '& img': {\n maxHeight: '180px',\n },\n },\n bookItem: {\n display: 'flex',\n alignItems: 'center',\n marginTop: '6px',\n marginBottom: '6px',\n },\n progress: {\n marginRight: '8px',\n width: '20px',\n '@global': {\n '.CircularProgressbar-path': {\n stroke: green,\n strokeLinecap: 'butt',\n },\n '.CircularProgressbar-trail': {\n stroke: bgLightBlue,\n },\n '.CircularProgressbar-text': {\n // fill: 'yellow',\n },\n '.CircularProgressbar-background': {\n // fill: 'green',\n },\n },\n },\n} as Styles;\n","/**\n * Section component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport { CircularProgressbar } from 'react-circular-progressbar';\nimport 'react-circular-progressbar/dist/styles.css';\nimport { DiplomaTypes } from '../../../../../../models';\nimport { calculateSectionProgress } from '../../../../../../utils';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface SectionProps {\n section: DiplomaTypes.Section;\n}\n\nconst Section: React.FC = ({ section }) => {\n const classes = useStyles();\n const { title, url } = section;\n\n // eslint-disable-next-line\n const thumbnailToolTip = `\n
    \n \n
    \n `;\n\n const progress = calculateSectionProgress(section);\n const progressText = `${progress}% done`;\n\n return (\n
  • \n \n \n \n\n \n {title}\n \n
  • \n );\n};\n\nexport default Section;\n","/**\n * Course component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport clsx from 'clsx';\nimport ProgressBar from '../../../../../components/ProgressBar';\nimport { DetailsPanel, DiplomaTypes } from '../../../../../models';\nimport { calculateCourseProgress } from '../../../../../utils';\nimport Section from './Section';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface CourseProps extends DetailsPanel {\n courseData: DiplomaTypes.Course;\n}\n\nconst Course: React.FC = ({ courseData, showDetails = false }) => {\n const classes = useStyles();\n const { courseName, sections, isOptional } = courseData;\n\n const courseProgress = calculateCourseProgress(courseData);\n let courseProgressText = `${courseProgress}% done`;\n isOptional &&\n (courseProgressText = `Optional Content: ${courseProgressText}`);\n\n return (\n \n \n {courseName}\n \n \n
    \n {sections.map((section) => (\n
    \n ))}\n
    \n \n );\n};\n\nexport default Course;\n","/**\n * Course component styles.\n */\nimport { Styles } from 'react-jss';\n\nexport default {\n courseDetails: {\n marginLeft: '20px',\n marginTop: '10px',\n },\n optional: {\n opacity: 0.7,\n },\n bookPanel: {\n marginLeft: '20px',\n marginTop: '6px',\n paddingBottom: '10px',\n },\n} as Styles;\n","/**\n * Semester component styles.\n */\nimport { Styles } from 'react-jss';\nimport { orange, bgDarkBlue, sSize } from '../../../../theme';\n\nexport default {\n root: {\n // marginTop: '10px',\n marginBottom: '10px',\n },\n overDue: {\n marginLeft: '10px',\n padding: '2px 4px',\n fontSize: sSize,\n fontWeight: '700',\n textTransform: 'uppercase',\n backgroundColor: orange,\n color: bgDarkBlue,\n borderRadius: '8px',\n },\n} as Styles;\n","/**\n * Semester component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport { DetailsPanel, DiplomaTypes } from '../../../../models';\nimport {\n calculateSemesterProgress,\n formatDate,\n isOverDue,\n} from '../../../../utils';\nimport Course from './Course';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface SemesterProps extends DetailsPanel {\n semesterData: DiplomaTypes.Semester;\n showOptionalCourses?: boolean;\n}\n\nconst Semester: React.FC = ({\n semesterData,\n showDetails = true,\n showOptionalCourses = false,\n}) => {\n const classes = useStyles();\n const {\n name,\n courses,\n dates: { start, end },\n } = semesterData;\n\n const semDuration =\n start && end\n ? `${formatDate(start)} - ${formatDate(end)}`\n : 'Dates not set';\n const semProgress = calculateSemesterProgress(semesterData);\n const overDue = isOverDue(end, semProgress);\n\n return (\n
    \n \n \n {name}\n {overDue && overdue}\n \n \n {courses\n .filter((course) => showOptionalCourses || !course.isOptional)\n .map((course) => (\n \n ))}\n
    \n );\n};\n\nexport default Semester;\n","/**\n * Diploma component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport ReactTooltip from 'react-tooltip';\nimport Container from '../../components/Container';\nimport Semester from './components/Semester';\nimport { DiplomaTypes } from '../../models';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface DiplomaProps {\n diplomaData: DiplomaTypes.Curriculum;\n}\n\nconst Diploma: React.FC = ({ diplomaData }) => {\n const classes = useStyles();\n const {\n semesters,\n metadata: { title, subtitle, info },\n } = diplomaData;\n\n return (\n \n \n

    {title}

    \n \n {subtitle &&

    {subtitle}

    }\n \n
    \n {semesters.map((s) => (\n \n ))}\n
    \n \n
    \n );\n};\n\nexport default Diploma;\n","/**\n * Diploma component styles.\n */\nimport { Styles } from 'react-jss';\n\nexport default {\n title: {\n display: 'inline-block',\n cursor: 'help',\n '&>h2': {\n display: 'inline-block',\n marginBottom: '0',\n },\n '&>svg': {\n marginLeft: '8px',\n },\n '&>p': {\n fontSize: '1.8rem',\n marginTop: '0.3em',\n },\n },\n tip: {\n maxWidth: '360px',\n fontSize: '1.5rem !important',\n lineHeight: '2rem',\n },\n contents: {\n '&>details': {\n '& summary': {\n border: 'none',\n outline: 'none',\n '& span': {\n cursor: 'pointer',\n },\n },\n padding: '10px 0',\n\n '&:last-child': {\n paddingBottom: '200px',\n },\n },\n },\n} as Styles;\n","import React from 'react';\nimport Greeter from '../views/Greeter';\nimport Diploma from '../views/Diploma';\nimport { PageLink, TabLink } from '../models';\nimport { jsOrange, midBlue, green, pink } from '../theme/colors';\n\nimport staticData from './json/static.json';\nimport contactData from './json/contact.json';\nimport sweData from './json/swe.json';\nimport baData from './json/ba.json';\nimport pkg from '../../package.json';\n\nimport { calculateDiplomaProgress } from '../utils';\n\nexport const pages: PageLink[] = [\n {\n name: 'Home',\n url: '/',\n icon: 'home',\n isInternal: true,\n comp: () => (\n \n ),\n },\n {\n name: 'Software Engineering',\n url: '/swe',\n icon: 'graduation-cap',\n isInternal: true,\n badge: `${calculateDiplomaProgress(sweData, 0)}%`,\n comp: () => ,\n },\n {\n name: 'Business Administration',\n url: '/ba',\n icon: 'graduation-cap',\n isInternal: true,\n badge: `${calculateDiplomaProgress(baData, 0)}%`,\n comp: () => ,\n },\n];\n\nexport const tabs: TabLink[] = [\n {\n name: 'skills.js',\n url: '/skills',\n icon: ['fab', 'js'],\n color: jsOrange,\n mdFileName: 'skills',\n },\n {\n name: '.educationrc',\n url: '/education',\n icon: 'university',\n color: midBlue,\n mdFileName: 'education',\n },\n {\n name: 'projects.config',\n url: '/projects',\n icon: 'sliders-h',\n color: green,\n mdFileName: 'projects',\n },\n {\n name: 'certificates.sass',\n url: '/certificates',\n icon: ['fab', 'sass'],\n color: pink,\n mdFileName: 'certificates',\n },\n];\n","/**\n * LeftBar component styles.\n */\nimport { Styles } from 'react-jss';\nimport Color from 'color';\nimport { bgLightBlue, breakpoints, widths } from '../../../../theme';\n\nexport default {\n root: {\n alignItems: 'center',\n background: bgLightBlue,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n height: '100vh',\n position: 'fixed',\n left: '0',\n top: '0',\n width: `${widths.leftBar}px`,\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n display: 'none',\n },\n '& div': {\n display: 'flex',\n alignItems: 'center',\n flexDirection: 'column',\n padding: '10px 0',\n },\n },\n divider: {\n height: '1px',\n background: Color(bgLightBlue).lighten(0.35).string(),\n width: '95%',\n marginTop: '4px',\n marginBottom: '12px',\n },\n} as Styles;\n","/**\n * LeftBar component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport IconLink from '../../../../components/IconLink';\nimport { ContactItem } from '../../../../models';\nimport { pages } from './../../../../data';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface LeftBarProps {\n contactData: ContactItem[];\n}\n\nconst LeftBar: React.FC = ({ contactData }) => {\n const classes = useStyles();\n\n // Internal links.\n const internals = pages.map(({ name, url, icon, isInternal, badge }) => ({\n name,\n url,\n icon,\n isInternal,\n badge,\n }));\n\n const bottom: ContactItem[] = [\n {\n name: 'Useless button!',\n url: '',\n icon: 'cog',\n isInternal: true,\n },\n ];\n\n const renderData = (data: ContactItem[]) => {\n return data.map((contactItem) => (\n \n ));\n };\n\n const renderDivider = () => ;\n\n return (\n
    \n
    \n {renderData(internals)}\n {renderDivider()}\n {renderData(contactData)}\n
    \n
    {renderData(bottom)}
    \n
    \n );\n};\n\nexport default LeftBar;\n","/**\n * Explorer component styles.\n */\nimport { Styles } from 'react-jss';\nimport { widths, bgDarkBlue } from '../../../../theme';\n\nexport default {\n root: {\n background: bgDarkBlue,\n height: '100vh',\n position: 'fixed',\n top: '0',\n left: widths.leftBar,\n width: widths.explorer,\n '& li': {\n listStyle: 'none',\n padding: '6px 12px',\n },\n },\n closed: {\n display: 'none',\n },\n} as Styles;\n","/**\n * Explorer component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport clsx from 'clsx';\nimport { TabProps } from '../..';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface ExplorerProps {\n open: boolean;\n}\n\nconst Explorer: React.FC = ({ tabs, open }) => {\n const classes = useStyles();\n\n return (\n
    \n {tabs.map((t) => (\n
  • {t.mdFileName}
  • \n ))}\n
    \n );\n};\n\nexport default Explorer;\n","/**\n * StatusBar component styles.\n */\nimport { Styles } from 'react-jss';\nimport {\n bgDarkBlue,\n bgMidBlue,\n textLightBlue,\n sSize,\n sansFont,\n heights,\n} from '../../../../theme';\n\nexport default {\n root: {\n bottom: '0',\n background: bgDarkBlue,\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n fontFamily: sansFont,\n fontWeight: 400,\n left: '0',\n position: 'fixed',\n width: '100vw',\n height: heights.statusBar,\n '& span, & a': {\n display: 'inline-block',\n padding: '2px 8px',\n '&:hover': {\n background: bgMidBlue,\n cursor: 'pointer',\n },\n },\n },\n icon: {\n color: textLightBlue,\n },\n text: {\n color: textLightBlue,\n fontSize: sSize,\n padding: '0 4px',\n },\n} as Styles;\n","/**\n * StatusBar component.\n */\nimport React from 'react';\nimport { createUseStyles } from 'react-jss';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport styles from './styles';\nimport pkg from '../../../../../package.json';\n\nconst useStyles = createUseStyles(styles);\n\nconst StatusBar: React.FC = () => {\n const classes = useStyles();\n\n return (\n \n );\n};\n\nexport default StatusBar;\n","/**\n * Main layout styles.\n */\nimport Color from 'color';\nimport { Styles } from 'react-jss';\nimport {\n bgMidBlue,\n textLightBlue,\n mSize,\n monoFont,\n breakpoints,\n widths,\n} from '../../theme';\n\n// Notice that it's an object containing\n// global \"base\" values for the rest of the app.\nexport default {\n '@global': {\n html: {\n fontSize: '62.5%',\n },\n body: {\n fontFamily: monoFont,\n fontSize: mSize,\n background: bgMidBlue,\n boxSizing: 'border-box',\n },\n button: {\n cursor: 'pointer',\n '&:disabled': {\n cursor: 'default',\n },\n },\n a: {\n color: textLightBlue,\n textDecoration: 'none',\n transition: 'color 500ms ease',\n '&:visited': {\n color: Color(textLightBlue).darken(0.1).string(),\n },\n },\n '.color-transform': {\n transform: 'color 500ms ease',\n },\n },\n root: {\n position: 'absolute',\n height: '100vh',\n width: `calc(100% - ${widths.leftBar}px)`,\n padding: 0,\n margin: 0,\n },\n content: {\n position: 'relative',\n top: 0,\n left: `${widths.leftBar}px`,\n right: 0,\n width: '100%',\n [`@media screen and (max-width: ${breakpoints.desktop})`]: {\n left: '0',\n },\n },\n explorerOpen: {\n left: `${widths.leftBar + widths.explorer}px`,\n },\n} as Styles;\n","/**\n * Main layout.\n */\nimport React, { useState } from 'react';\nimport { createUseStyles } from 'react-jss';\nimport clsx from 'clsx';\nimport Header from './components/Header';\nimport LeftBar from './components/LeftBar';\nimport Explorer from './components/Explorer';\nimport StatusBar from './components/StatusBar';\nimport { ContactItem, TabLink } from '../../models';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface TabProps {\n tabs: TabLink[];\n}\n\nexport interface ContactProps {\n contactData: ContactItem[];\n}\n\nexport type MainLayoutProps = TabProps & ContactProps;\n\nconst MainLayout: React.FC = ({\n children,\n tabs,\n contactData,\n}) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [explorerOpen, setExplorerOpen] = useState(false);\n\n const classes = useStyles();\n\n return (\n
    \n \n \n \n
    \n {children}\n \n \n
    \n );\n};\n\nexport default MainLayout;\n","/**\n * MDTab component.\n */\nimport React, { useEffect, useState } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport Container from '../Container';\nimport { createUseStyles } from 'react-jss';\nimport styles from './styles';\n\nconst useStyles = createUseStyles(styles);\n\nexport interface MDTabProps {\n fileName: string;\n}\n\nconst MDTab: React.FC = ({ fileName }) => {\n const [contents, setContents] = useState('');\n\n const classes = useStyles();\n\n useEffect(() => {\n const loadFile = async () => {\n const file = await import(`../../data/tabs/${fileName}.md`);\n const response = await fetch(file.default);\n const text = await response.text();\n setContents(text);\n };\n loadFile();\n }, [fileName]);\n\n return (\n \n \n \n );\n};\n\nexport default MDTab;\n","/**\n * MDTab component styles.\n */\nimport { Styles } from 'react-jss';\n\nexport default {\n mdpage: {\n paddingBottom: '10rem',\n },\n} as Styles;\n","import React from 'react';\nimport { RouteComponentProps, Redirect } from '@reach/router';\nimport MDTab, { MDTabProps } from './components/MDTab';\nimport { PageProps } from './models';\n\nimport { pages, tabs } from './data/';\n\ntype ViewProps = RouteComponentProps & PageProps;\nconst View: React.FC = ({ comp: Comp, ...rest }) => {\n return ;\n};\n\ntype TabProps = RouteComponentProps & MDTabProps;\nconst Tab: React.FC = ({ fileName }) => {\n return ;\n};\n\nexport default [\n pages.map(({ name, url, comp, ...rest }) => (\n \n )),\n tabs.map(({ name, url, mdFileName }) => (\n \n )),\n ,\n];\n","import React from 'react';\nimport { Router } from '@reach/router';\nimport MainLayout from './layouts/Main';\nimport routes from './routes';\n\nimport { tabs } from './data';\nimport contactData from './data/json/contact.json';\n\nconst App: React.FC = () => (\n \n {routes}\n \n);\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\n/* eslint-disable */\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/,\n ),\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA',\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.',\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.',\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n\n/* eslint-enable */\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport 'normalize.css';\nimport './theme/icons';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\nimport dotenv from 'dotenv';\ndotenv.config();\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root'),\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""} \ No newline at end of file