Stephen Vergara
\ No newline at end of file
+Stephen Vergara
\ No newline at end of file
diff --git a/static/css/818.b6e58dde.chunk.css b/static/css/101.b341df98.chunk.css
similarity index 94%
rename from static/css/818.b6e58dde.chunk.css
rename to static/css/101.b341df98.chunk.css
index 42139a7..5dad2b0 100644
--- a/static/css/818.b6e58dde.chunk.css
+++ b/static/css/101.b341df98.chunk.css
@@ -1,2 +1,2 @@
-.background_bg2__XB2Tl,.background_bg3__WZ4Pm,.background_bg__rHR4m{animation:background_slide__Sq8xw 3s ease-in-out infinite alternate;bottom:0;left:-50%;opacity:.5;position:fixed;right:-50%;top:0;z-index:-1}.background_bg2__XB2Tl{animation-direction:alternate-reverse;animation-duration:4s}.background_bg3__WZ4Pm{animation-duration:5s}@keyframes background_slide__Sq8xw{0%{transform:translateX(-25%)}to{transform:translateX(25%)}}.aboutMeCardBody_body__px0Z-{row-gap:24px}.aboutMeCardBody_base__HWSO5,.aboutMeCardBody_glimmer__ztngv,.aboutMeCardBody_image__r0pwR{align-self:center;justify-self:center}.aboutMeCardBody_glimmer__ztngv{border-radius:var(--bs-card-inner-border-radius);height:300px;width:300px}.aboutMeCardBody_image__r0pwR{max-height:300px;max-width:300px}.aboutMeCardBody_imageColumn__Decwz{display:grid}.text_bold__TiUuq{font-weight:700}.text_italic__fvjzk{font-style:italic}.footer_buttons__X-wEA{column-gap:8px;display:inline-flex;justify-content:center}.footer_resume__j2AKe{align-self:center;display:inline-flex;justify-content:center}.email_button__FW\+sr{align-items:center;background:linear-gradient(#5e72e3,#70f0fe) padding-box,linear-gradient(#5e72e3,#70f0fe) border-box;color:#fff;column-gap:8px;cursor:pointer;display:inline-flex;font-weight:700;justify-content:center;text-decoration:none}.email_button__FW\+sr,.email_button__FW\+sr:hover{border:.125rem solid #0000}.linkButton_github__ltM-y{align-items:center;border-color:#171515;color:#171515;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_github__ltM-y:hover{background-color:#171515;color:#fff}.linkButton_linkedin__MRpaF{align-items:center;border-color:#0077b5;color:#0077b5;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_linkedin__MRpaF:hover{background-color:#0077b5;color:#fff}.linkButton_steam__qizUa{align-items:center;border-color:#145c8f;color:#145c8f;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_steam__qizUa:hover{background-color:#145c8f;color:#fff}.linkButton_discord__zToU1{align-items:center;border-color:#7289da;color:#7289da;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_discord__zToU1:hover{background-color:#7289da;color:#fff}.resume_resume__92JEE{align-items:center;column-gap:8px;display:inline-flex;font-weight:700;text-decoration:none}.card_header__C3ziB{margin-bottom:0;text-align:center}.timeline_timeline__VfjcF{display:flex;flex-direction:column;margin:40px 0;position:relative}.timeline_bar__V3BAE{height:100%;left:calc(50% - 2px);position:absolute;width:4px}.tooltip_tooltip__5pJPW{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.timelineItem_item__005F5{display:flex;justify-content:flex-end;margin:10px 0;padding-right:30px;position:relative;width:50%}.timelineItem_item__005F5 .timelineItem_circle__ADJyP{background-color:#fff;border-radius:50%;border-style:solid;border-width:3px;height:20px;position:absolute;right:-10px;top:calc(50% - 10px);width:20px;z-index:100}.timelineItem_item__005F5 .timelineItem_in__PSeNd{animation:timelineItem_fadeInLeft__vvxlT 1s;z-index:100}.timelineItem_item__005F5:nth-child(2n){align-self:flex-end;justify-content:flex-start;padding-left:30px;padding-right:0}.timelineItem_item__005F5:nth-child(2n) .timelineItem_circle__ADJyP{left:-10px;right:auto}.timelineItem_item__005F5:nth-child(2n) .timelineItem_content__izpwq{align-items:flex-start;text-align:left}.timelineItem_item__005F5:nth-child(2n) .timelineItem_content__izpwq:after{box-shadow:-1px 1px 1px #0003;left:-7.5px;right:auto}.timelineItem_item__005F5:nth-child(2n) .timelineItem_in__PSeNd{animation:timelineItem_fadeInRight__uPKi\+ 1s;z-index:100}.timelineItem_content__izpwq{align-items:flex-end;background-color:#fff;border-radius:5px;box-shadow:0 0 5px #0000004d;display:flex;flex-direction:column;max-width:70%;min-width:-webkit-min-content;min-width:min-content;padding:15px;position:relative;row-gap:16px;text-align:right;width:400px}.timelineItem_content__izpwq .timelineItem_header__H24TC{align-items:center;display:inline-flex;justify-content:space-between;width:100%}.timelineItem_content__izpwq h6{align-self:center;font-style:italic;font-weight:700;margin:0}.timelineItem_content__izpwq img{align-self:center;margin:8px 0;width:50%}.timelineItem_content__izpwq p{margin:0}.timelineItem_content__izpwq .timelineItem_tag__k8jMy{border-radius:5px;color:#fff;font-size:12px;font-weight:700;letter-spacing:1px;padding:5px;text-transform:uppercase}.timelineItem_content__izpwq time{color:#777;font-size:12px;font-weight:700;text-transform:uppercase}.timelineItem_content__izpwq:after{background-color:#fff;box-shadow:1px -1px 1px #0003;content:" ";height:15px;position:absolute;right:-7.5px;top:calc(50% - 7.5px);transform:rotate(45deg);width:15px}@media only screen and (max-width:1023px){.timelineItem_content__izpwq{max-width:100%}}@media only screen and (max-width:767px){.timelineItem_content__izpwq,.timelineItem_item__005F5:nth-child(odd) .timelineItem_content__izpwq{align-items:center;padding:15px 10px;text-align:center}.timelineItem_content__izpwq .timelineItem_header__H24TC{display:flex;flex-direction:column}.timelineItem_content__izpwq .timelineItem_tag__k8jMy{text-align:center}}@keyframes timelineItem_fadeInLeft__vvxlT{0%{opacity:0;transform:translateX(-50%)}to{opacity:1;transform:translateX(0)}}@keyframes timelineItem_fadeInRight__uPKi\+{0%{opacity:0;transform:translateX(50%)}to{opacity:1;transform:translateX(0)}}.skillsList_list__-3yy3{align-self:center}.skillsList_skills__Q4\+OB{font-style:italic;font-weight:700}.pageBody_body__aNOKo{display:flex;flex-direction:column;margin-top:24px;row-gap:24px}.pageMargin_page__oYkHI{margin-left:10%;margin-right:10%}.item_button__GmSRm,.item_collapse__JYgde,.item_expand__4Sxrl,.item_firstExpand__kSWZa{align-items:center;display:inline-flex;height:100%;justify-content:space-between;padding:.5rem 1rem;width:100%}.item_collapse__JYgde{background:none;border:none;color:#000}.item_expand__4Sxrl,.item_firstExpand__kSWZa{border-width:0}.item_firstExpand__kSWZa{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.item_header__w8Yjy{padding:0}.navbar_brand__zDvLc{color:inherit;font-size:4vmin;text-decoration:none}.navbar_navbar__pEuvw,.navbar_rightContent__ikOZ0{align-items:center;display:inline-flex}.navbar_rightContent__ikOZ0{column-gap:2rem;justify-content:flex-end}.colorPicker_fallback__pvhTA{align-items:center;display:flex;height:262px;justify-content:center;width:177px}
-/*# sourceMappingURL=818.b6e58dde.chunk.css.map*/
\ No newline at end of file
+.background_bg2__XB2Tl,.background_bg3__WZ4Pm,.background_bg__rHR4m{animation:background_slide__Sq8xw 3s ease-in-out infinite alternate;bottom:0;left:-50%;opacity:.5;position:fixed;right:-50%;top:0;z-index:-1}.background_bg2__XB2Tl{animation-direction:alternate-reverse;animation-duration:4s}.background_bg3__WZ4Pm{animation-duration:5s}@keyframes background_slide__Sq8xw{0%{transform:translateX(-25%)}to{transform:translateX(25%)}}.aboutMeCardBody_body__px0Z-{row-gap:24px}.aboutMeCardBody_base__HWSO5,.aboutMeCardBody_glimmer__ztngv,.aboutMeCardBody_image__r0pwR{align-self:center;justify-self:center}.aboutMeCardBody_glimmer__ztngv{border-radius:var(--bs-card-inner-border-radius);height:300px;width:300px}.aboutMeCardBody_image__r0pwR{max-height:300px;max-width:300px}.aboutMeCardBody_imageColumn__Decwz{display:grid}.text_bold__TiUuq{font-weight:700}.text_italic__fvjzk{font-style:italic}.footer_buttons__X-wEA{column-gap:8px;display:inline-flex;justify-content:center}.footer_resume__j2AKe{align-self:center;display:inline-flex;justify-content:center}.email_button__FW\+sr{align-items:center;background:linear-gradient(#5e72e3,#70f0fe) padding-box,linear-gradient(#5e72e3,#70f0fe) border-box;color:#fff;column-gap:8px;cursor:pointer;display:inline-flex;font-weight:700;justify-content:center;text-decoration:none}.email_button__FW\+sr,.email_button__FW\+sr:hover{border:.125rem solid #0000}.linkButton_github__ltM-y{align-items:center;border-color:#171515;color:#171515;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_github__ltM-y:hover{background-color:#171515;color:#fff}.linkButton_linkedin__MRpaF{align-items:center;border-color:#0077b5;color:#0077b5;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_linkedin__MRpaF:hover{background-color:#0077b5;color:#fff}.linkButton_steam__qizUa{align-items:center;border-color:#145c8f;color:#145c8f;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_steam__qizUa:hover{background-color:#145c8f;color:#fff}.linkButton_discord__zToU1{align-items:center;border-color:#7289da;color:#7289da;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_discord__zToU1:hover{background-color:#7289da;color:#fff}.resume_resume__92JEE{align-items:center;column-gap:8px;display:inline-flex;font-weight:700;text-decoration:none}.card_header__C3ziB{margin-bottom:0;text-align:center}.timeline_timeline__VfjcF{display:flex;flex-direction:column;margin:40px 0;position:relative}.timeline_bar__V3BAE{height:100%;left:calc(50% - 2px);position:absolute;width:4px}.tooltip_tooltip__5pJPW{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.timelineItem_item__005F5{display:flex;justify-content:flex-end;margin:10px 0;padding-right:30px;position:relative;width:50%}.timelineItem_item__005F5 .timelineItem_circle__ADJyP{background-color:#fff;border-radius:50%;border-style:solid;border-width:3px;height:20px;position:absolute;right:-10px;top:calc(50% - 10px);width:20px;z-index:100}.timelineItem_item__005F5 .timelineItem_in__PSeNd{animation:timelineItem_fadeInLeft__vvxlT 1s;z-index:100}.timelineItem_item__005F5:nth-child(2n){align-self:flex-end;justify-content:flex-start;padding-left:30px;padding-right:0}.timelineItem_item__005F5:nth-child(2n) .timelineItem_circle__ADJyP{left:-10px;right:auto}.timelineItem_item__005F5:nth-child(2n) .timelineItem_content__izpwq{align-items:flex-start;text-align:left}.timelineItem_item__005F5:nth-child(2n) .timelineItem_content__izpwq:after{box-shadow:-1px 1px 1px #0003;left:-7.5px;right:auto}.timelineItem_item__005F5:nth-child(2n) .timelineItem_in__PSeNd{animation:timelineItem_fadeInRight__uPKi\+ 1s;z-index:100}.timelineItem_content__izpwq{align-items:flex-end;background-color:#fff;border-radius:5px;box-shadow:0 0 5px #0000004d;display:flex;flex-direction:column;max-width:70%;min-width:-webkit-min-content;min-width:min-content;padding:15px;position:relative;row-gap:16px;text-align:right;width:400px}.timelineItem_content__izpwq .timelineItem_header__H24TC{align-items:center;display:inline-flex;justify-content:space-between;width:100%}.timelineItem_content__izpwq h6{align-self:center;font-style:italic;font-weight:700;margin:0}.timelineItem_content__izpwq img{align-self:center;margin:8px 0;width:50%}.timelineItem_content__izpwq p{margin:0}.timelineItem_content__izpwq .timelineItem_tag__k8jMy{border-radius:5px;color:#fff;font-size:12px;font-weight:700;letter-spacing:1px;padding:5px;text-transform:uppercase}.timelineItem_content__izpwq time{color:#777;font-size:12px;font-weight:700;text-transform:uppercase}.timelineItem_content__izpwq:after{background-color:#fff;box-shadow:1px -1px 1px #0003;content:" ";height:15px;position:absolute;right:-7.5px;top:calc(50% - 7.5px);transform:rotate(45deg);width:15px}@media only screen and (max-width:1023px){.timelineItem_content__izpwq{max-width:100%}}@media only screen and (max-width:767px){.timelineItem_content__izpwq,.timelineItem_item__005F5:nth-child(odd) .timelineItem_content__izpwq{align-items:center;padding:15px 10px;text-align:center}.timelineItem_content__izpwq .timelineItem_header__H24TC{display:flex;flex-direction:column}.timelineItem_content__izpwq .timelineItem_tag__k8jMy{text-align:center}}@keyframes timelineItem_fadeInLeft__vvxlT{0%{opacity:0;transform:translateX(-50%)}to{opacity:1;transform:translateX(0)}}@keyframes timelineItem_fadeInRight__uPKi\+{0%{opacity:0;transform:translateX(50%)}to{opacity:1;transform:translateX(0)}}.skillsList_list__-3yy3{align-self:center}.skillsList_skills__Q4\+OB{font-style:italic;font-weight:700}.pageBody_body__aNOKo{display:flex;flex-direction:column;margin-top:24px;row-gap:24px}.pageMargin_page__oYkHI{margin-left:10%;margin-right:10%}.item_button__GmSRm,.item_collapse__JYgde,.item_expand__4Sxrl,.item_firstExpand__kSWZa{align-items:center;display:inline-flex;height:100%;justify-content:space-between;padding:.5rem 1rem;width:100%}.item_collapse__JYgde{background:none;border:none;color:#000}.item_expand__4Sxrl,.item_firstExpand__kSWZa{border-width:0}.item_firstExpand__kSWZa{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.item_header__w8Yjy{padding:0}.navbar_brand__zDvLc{color:inherit;font-size:4vmin;text-decoration:none}.navbar_navbar__pEuvw{align-items:center;display:inline-flex}.navbar_pushTime__jdH3p{font-size:1.75vmin;text-align:center}.navbar_rightContent__ikOZ0{align-items:center;column-gap:2rem;display:inline-flex;justify-content:flex-end}.colorPicker_fallback__pvhTA{align-items:center;display:flex;height:262px;justify-content:center;width:177px}
+/*# sourceMappingURL=101.b341df98.chunk.css.map*/
\ No newline at end of file
diff --git a/static/css/101.b341df98.chunk.css.map b/static/css/101.b341df98.chunk.css.map
new file mode 100644
index 0000000..5bf2199
--- /dev/null
+++ b/static/css/101.b341df98.chunk.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"static/css/101.b341df98.chunk.css","mappings":"AAAA,oEACI,oEACA,SACA,UACA,WACA,eACA,WACA,MACA,WAGJ,uBAEI,sCACA,sBAGJ,uBAEI,sBAGJ,mCACI,GACI,2BAEJ,GACI,2BCpBR,6BACC,aAGD,2FACC,kBACA,oBAGD,gCAIC,iDAjBA,YAHW,CAIX,WAgBA,CAGD,8BApBC,gBAHW,CAIX,eAJW,CA4BZ,oCACC,aC7BD,kBACI,gBAGJ,oBACI,kBCLJ,uBAEC,eADG,oBAEA,uBAGJ,sBACC,kBACG,oBACA,uBCTJ,sBACI,mBACA,oGAGA,WACA,eACH,eACA,oBACA,gBACG,uBACH,qBAEG,kDATA,0BAUI,CCNJ,0BCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,gCACI,wBAQE,CAPF,WAPR,4BCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,kCACI,wBAQE,CAPF,WAPR,yBCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,+BACI,wBAQE,CAPF,WAPR,2BCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,iCACI,wBAQE,CAPF,WEfZ,sBACI,mBACH,eACA,oBACA,gBACA,qBCLD,oBACI,gBACA,kBCFJ,0BACI,aACA,sBAEA,cADA,iBACA,CAGJ,qBAGI,YACA,qBAHA,kBACA,SAEA,CCXJ,wBACI,0ECDJ,0BACI,aACA,yBAGA,cAFA,mBACA,kBAEA,UAEA,sDACI,sBACA,kBACA,mBACA,iBAKA,YAJA,kBAEA,YADA,qBAEA,WAEA,YAGJ,kDACI,4CACA,YAGJ,wCACI,oBACA,2BACA,kBACA,gBAEA,oEAEI,WADA,UACA,CAGJ,qEAEI,uBADA,eACA,CAEA,2EAGI,8BADA,YADA,UAEA,CAIR,gEACI,8CACA,YAKZ,6BACI,qBAGA,sBADA,kBADA,6BAGA,aACA,sBAKA,cAJA,oDACA,aACA,kBACA,aAEA,iBACA,YAEA,yDACI,mBACA,oBACA,8BACA,WAGJ,gCACI,kBACA,kBACA,gBACA,SAGJ,iCACI,kBACA,aACA,UAGJ,+BACI,SAGJ,sDACI,kBACA,WACA,eACA,gBACA,mBACA,YACA,yBAGJ,kCACI,WACA,eAEA,gBADA,wBACA,CAGJ,mCAEI,sBACA,8BAFA,YAQA,YALA,kBACA,aACA,sBACA,wBACA,UACA,CAIR,0CACI,6BACI,gBAIR,yCACI,mGAII,mBAFA,kBACA,iBACA,CAGJ,yDACI,aACA,sBAGJ,sDACI,mBAIR,0CACI,GACI,UACA,2BAEJ,GACI,UACA,yBAIR,4CACI,GACI,UACA,0BAEJ,GACI,UACA,yBCtKR,wBACI,kBAGJ,2BACI,kBACA,gBCNJ,sBACI,aACA,sBACA,gBACA,aCJJ,wBACI,gBACA,iBCFJ,uFAGI,mBAFA,oBAGA,YAFA,8BAGA,mBACA,WAGJ,sBAEI,gBACA,YACA,WAGJ,6CAEI,eAGJ,yBAEI,+DACA,gEAGJ,oBACI,UC5BJ,qBACI,cACA,gBACA,qBAGJ,sBACI,mBACA,oBAGJ,wBACI,mBACA,kBAGJ,4BACI,mBACA,gBACA,oBACA,yBCpBJ,6BAEC,mBADG,aAGH,aADA,uBAEA","sources":["impl/styles/background.module.scss","impl/styles/body/about/aboutMeCardBody.module.scss","impl/styles/body/about/text.module.scss","impl/styles/body/about/footer.module.scss","impl/styles/body/buttons/email.module.scss","impl/styles/colors.scss","impl/styles/body/buttons/linkButton.module.scss","impl/styles/body/buttons/resume.module.scss","impl/styles/body/experience/card.module.scss","impl/styles/body/experience/timeline.module.scss","impl/styles/tooltip.module.scss","impl/styles/body/experience/timelineItem.module.scss","impl/styles/body/experience/skillsList.module.scss","impl/styles/pageBody.module.scss","impl/styles/pageMargin.module.scss","impl/styles/body/skills/item.module.scss","impl/styles/nav/navbar.module.scss","impl/styles/nav/colorPicker.module.scss"],"sourcesContent":[".bg {\n animation: slide 3s ease-in-out infinite alternate;\n bottom: 0;\n left: -50%;\n opacity: .5;\n position: fixed;\n right: -50%;\n top: 0;\n z-index: -1;\n}\n\n.bg2 {\n @extend .bg;\n animation-direction: alternate-reverse;\n animation-duration: 4s;\n}\n \n.bg3 {\n @extend .bg;\n animation-duration: 5s;\n}\n\n@keyframes slide {\n 0% {\n transform: translateX(-25%);\n }\n 100% {\n transform: translateX(25%);\n }\n}","$dimension: 300px;\n\n@mixin dimensions($max: false) {\n\t#{if($max, max-, null)}height: $dimension;\n\t#{if($max, max-, null)}width: $dimension;\n}\n\n.body {\n\trow-gap: 24px;\n}\n\n.base {\n\talign-self: center;\n\tjustify-self: center;\n}\n\n.glimmer {\n\t@extend .base;\n\t@include dimensions;\n\n\tborder-radius: var(--bs-card-inner-border-radius);\n}\n\n.image {\n\t@extend .base;\n\t@include dimensions($max: true);\n}\n\n.imageColumn {\n\tdisplay: grid;\n}",".bold {\n font-weight: bold;\n}\n\n.italic {\n font-style: italic;\n}",".buttons {\n display: inline-flex;\n\tcolumn-gap: 8px;\n justify-content: center;\n}\n\n.resume {\n\talign-self: center;\n display: inline-flex;\n justify-content: center;\n}",".button {\n align-items: center;\n background: linear-gradient(#5e72e3, #70f0fe) padding-box,\n linear-gradient(#5e72e3, #70f0fe) border-box;\n border: 0.125rem solid transparent;\n color: white;\n column-gap: 8px;\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\tfont-weight: bold;\n justify-content: center;\n\ttext-decoration: none;\n\n &:hover {\n border: 0.125rem solid transparent;\n }\n}","$colors: (\n \"github\": #171515,\n \"linkedin\": #0077b5,\n \"steam\": #145c8f,\n \"discord\": #7289da,\n);\n\n@mixin hover($color, $hex) {\n .#{$color} {\n border-color: $hex;\n color: $hex;\n @content;\n\n &:hover {\n background-color: $hex;\n color: white;\n }\n }\n}\n\n@mixin color-setter($property, $suffix-key: null) {\n @each $color, $hex in $colors {\n $hex: #{$hex};\n\n @if $suffix-key == \"hover\" {\n @include hover($color, $hex) {\n @content;\n };\n }\n }\n}","@use '../../colors';\n\n@include colors.color-setter(color, \"hover\") {\n align-items: center;\n display: inline-flex;\n height: 48px;\n justify-content: center;\n width: 57px;\n}\n",".resume {\n align-items: center;\n\tcolumn-gap: 8px;\n\tdisplay: inline-flex;\n\tfont-weight: bold;\n\ttext-decoration: none;\n}\n",".header {\n margin-bottom: 0px;\n text-align: center;\n}",".timeline {\n display: flex;\n flex-direction: column;\n position: relative;\n margin: 40px 0;\n}\n\n.bar {\n position: absolute;\n width: 4px;\n height: 100%;\n left: calc(50% - 2px);\n}\n",".tooltip {\n text-decoration: underline dotted;\n}",".item {\n display: flex;\n justify-content: flex-end;\n padding-right: 30px;\n position: relative;\n margin: 10px 0;\n width: 50%;\n\n .circle {\n background-color: white;\n border-radius: 50%;\n border-style: solid;\n border-width: 3px;\n position: absolute;\n top: calc(50% - 10px);\n right: -10px;\n width: 20px;\n height: 20px;\n z-index: 100;\n }\n\n .in {\n animation: fadeInLeft 1s;\n z-index: 100;\n }\n\n &:nth-child(even) {\n align-self: flex-end;\n justify-content: flex-start;\n padding-left: 30px;\n padding-right: 0;\n \n .circle {\n right: auto;\n left: -10px;\n }\n \n .content {\n text-align: left;\n align-items: flex-start;\n\n &::after {\n right: auto;\n left: -7.5px;\n box-shadow: -1px 1px 1px rgba(0, 0, 0, 0.2);\n }\n }\n \n .in {\n animation: fadeInRight 1s;\n z-index: 100;\n }\n }\n}\n\n.content {\n align-items: flex-end;\n box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);\n border-radius: 5px;\n background-color: white;\n display: flex;\n flex-direction: column;\n min-width: min-content;\n padding: 15px;\n position: relative;\n row-gap: 16px;\n max-width: 70%;\n text-align: right;\n width: 400px;\n\n .header {\n align-items: center;\n display: inline-flex;\n justify-content: space-between;\n width: 100%;\n }\n\n h6 {\n align-self: center;\n font-style: italic;\n font-weight: bold;\n margin: 0;\n }\n\n img {\n align-self: center;\n margin: 8px 0;\n width: 50%;\n }\n\n p {\n margin: 0;\n }\n\n .tag {\n border-radius: 5px;\n color: white;\n font-size: 12px;\n font-weight: bold;\n letter-spacing: 1px;\n padding: 5px;\n text-transform: uppercase;\n }\n\n time {\n color: #777;\n font-size: 12px;\n text-transform: uppercase;\n font-weight: bold;\n }\n\n &::after{\n content: ' ';\n background-color: #fff;\n box-shadow: 1px -1px 1px rgba(0, 0, 0, 0.2);\n position: absolute;\n right: -7.5px;\n top: calc(50% - 7.5px);\n transform: rotate(45deg);\n width: 15px;\n height: 15px;\n }\n}\n\n@media only screen and (max-width: 1023px) {\n .content {\n max-width: 100%;\n }\n}\n\n@media only screen and (max-width: 767px) {\n .content,\n .item:nth-child(odd) .content {\n padding: 15px 10px;\n text-align: center;\n align-items: center;\n }\n\n .content .header {\n display: flex;\n flex-direction: column;\n }\n\n .content .tag {\n text-align: center;\n }\n}\n\n@keyframes fadeInLeft {\n 0% {\n opacity: 0;\n transform: translateX(-50%);\n }\n 100% {\n opacity: 1;\n transform: translateX(0%);\n }\n}\n\n@keyframes fadeInRight {\n 0% {\n opacity: 0;\n transform: translateX(50%);\n }\n 100% {\n opacity: 1;\n transform: translateX(0%);\n }\n}\n",".list {\n align-self: center;\n}\n\n.skills {\n font-style: italic;\n font-weight: bold;\n}",".body {\n display: flex;\n flex-direction: column;\n margin-top: 24px;\n row-gap: 24px;\n}\n",".page {\n margin-left: 10%;\n margin-right: 10%;\n}",".button {\n display: inline-flex;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n padding: 0.5rem 1rem;\n width: 100%;\n}\n\n.collapse {\n @extend .button;\n background: none;\n border: none;\n color: black;\n}\n\n.expand {\n @extend .button;\n border-width: 0;\n}\n\n.firstExpand {\n @extend .expand;\n border-top-left-radius: var(--bs-accordion-inner-border-radius);\n border-top-right-radius: var(--bs-accordion-inner-border-radius);\n}\n\n.header {\n padding: 0;\n}",".brand {\n color: inherit;\n font-size: 4vmin;\n text-decoration: none;\n}\n\n.navbar {\n align-items: center;\n display: inline-flex;\n}\n\n.pushTime {\n font-size: 1.75vmin;\n text-align: center;\n}\n\n.rightContent {\n align-items: center;\n column-gap: 2rem;\n display: inline-flex;\n justify-content: flex-end;\n}\n",".fallback {\n display: flex;\n\talign-items: center;\n\tjustify-content: center;\n\theight: 262px;\n\twidth: 177px;\n}\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/static/css/818.b6e58dde.chunk.css.map b/static/css/818.b6e58dde.chunk.css.map
deleted file mode 100644
index 10dfa61..0000000
--- a/static/css/818.b6e58dde.chunk.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"static/css/818.b6e58dde.chunk.css","mappings":"AAAA,oEACI,oEACA,SACA,UACA,WACA,eACA,WACA,MACA,WAGJ,uBAEI,sCACA,sBAGJ,uBAEI,sBAGJ,mCACI,GACI,2BAEJ,GACI,2BCpBR,6BACC,aAGD,2FACC,kBACA,oBAGD,gCAIC,iDAjBA,YAHW,CAIX,WAgBA,CAGD,8BApBC,gBAHW,CAIX,eAJW,CA4BZ,oCACC,aC7BD,kBACI,gBAGJ,oBACI,kBCLJ,uBAEC,eADG,oBAEA,uBAGJ,sBACC,kBACG,oBACA,uBCTJ,sBACI,mBACA,oGAGA,WACA,eACH,eACA,oBACA,gBACG,uBACH,qBAEG,kDATA,0BAUI,CCNJ,0BCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,gCACI,wBAQE,CAPF,WAPR,4BCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,kCACI,wBAQE,CAPF,WAPR,yBCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,+BACI,wBAQE,CAPF,WAPR,2BCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,iCACI,wBAQE,CAPF,WEfZ,sBACI,mBACH,eACA,oBACA,gBACA,qBCLD,oBACI,gBACA,kBCFJ,0BACI,aACA,sBAEA,cADA,iBACA,CAGJ,qBAGI,YACA,qBAHA,kBACA,SAEA,CCXJ,wBACI,0ECDJ,0BACI,aACA,yBAGA,cAFA,mBACA,kBAEA,UAEA,sDACI,sBACA,kBACA,mBACA,iBAKA,YAJA,kBAEA,YADA,qBAEA,WAEA,YAGJ,kDACI,4CACA,YAGJ,wCACI,oBACA,2BACA,kBACA,gBAEA,oEAEI,WADA,UACA,CAGJ,qEAEI,uBADA,eACA,CAEA,2EAGI,8BADA,YADA,UAEA,CAIR,gEACI,8CACA,YAKZ,6BACI,qBAGA,sBADA,kBADA,6BAGA,aACA,sBAKA,cAJA,oDACA,aACA,kBACA,aAEA,iBACA,YAEA,yDACI,mBACA,oBACA,8BACA,WAGJ,gCACI,kBACA,kBACA,gBACA,SAGJ,iCACI,kBACA,aACA,UAGJ,+BACI,SAGJ,sDACI,kBACA,WACA,eACA,gBACA,mBACA,YACA,yBAGJ,kCACI,WACA,eAEA,gBADA,wBACA,CAGJ,mCAEI,sBACA,8BAFA,YAQA,YALA,kBACA,aACA,sBACA,wBACA,UACA,CAIR,0CACI,6BACI,gBAIR,yCACI,mGAII,mBAFA,kBACA,iBACA,CAGJ,yDACI,aACA,sBAGJ,sDACI,mBAIR,0CACI,GACI,UACA,2BAEJ,GACI,UACA,yBAIR,4CACI,GACI,UACA,0BAEJ,GACI,UACA,yBCtKR,wBACI,kBAGJ,2BACI,kBACA,gBCNJ,sBACI,aACA,sBACA,gBACA,aCJJ,wBACI,gBACA,iBCFJ,uFAGI,mBAFA,oBAGA,YAFA,8BAGA,mBACA,WAGJ,sBAEI,gBACA,YACA,WAGJ,6CAEI,eAGJ,yBAEI,+DACA,gEAGJ,oBACI,UC5BJ,qBACI,cACA,gBACA,qBAQJ,kDAJI,mBACA,mBAOA,CAJJ,4BAEI,gBAEA,yBCfJ,6BAEC,mBADG,aAGH,aADA,uBAEA","sources":["impl/styles/background.module.scss","impl/styles/body/about/aboutMeCardBody.module.scss","impl/styles/body/about/text.module.scss","impl/styles/body/about/footer.module.scss","impl/styles/body/buttons/email.module.scss","impl/styles/colors.scss","impl/styles/body/buttons/linkButton.module.scss","impl/styles/body/buttons/resume.module.scss","impl/styles/body/experience/card.module.scss","impl/styles/body/experience/timeline.module.scss","impl/styles/tooltip.module.scss","impl/styles/body/experience/timelineItem.module.scss","impl/styles/body/experience/skillsList.module.scss","impl/styles/pageBody.module.scss","impl/styles/pageMargin.module.scss","impl/styles/body/skills/item.module.scss","impl/styles/nav/navbar.module.scss","impl/styles/nav/colorPicker.module.scss"],"sourcesContent":[".bg {\n animation: slide 3s ease-in-out infinite alternate;\n bottom: 0;\n left: -50%;\n opacity: .5;\n position: fixed;\n right: -50%;\n top: 0;\n z-index: -1;\n}\n\n.bg2 {\n @extend .bg;\n animation-direction: alternate-reverse;\n animation-duration: 4s;\n}\n \n.bg3 {\n @extend .bg;\n animation-duration: 5s;\n}\n\n@keyframes slide {\n 0% {\n transform: translateX(-25%);\n }\n 100% {\n transform: translateX(25%);\n }\n}","$dimension: 300px;\n\n@mixin dimensions($max: false) {\n\t#{if($max, max-, null)}height: $dimension;\n\t#{if($max, max-, null)}width: $dimension;\n}\n\n.body {\n\trow-gap: 24px;\n}\n\n.base {\n\talign-self: center;\n\tjustify-self: center;\n}\n\n.glimmer {\n\t@extend .base;\n\t@include dimensions;\n\n\tborder-radius: var(--bs-card-inner-border-radius);\n}\n\n.image {\n\t@extend .base;\n\t@include dimensions($max: true);\n}\n\n.imageColumn {\n\tdisplay: grid;\n}",".bold {\n font-weight: bold;\n}\n\n.italic {\n font-style: italic;\n}",".buttons {\n display: inline-flex;\n\tcolumn-gap: 8px;\n justify-content: center;\n}\n\n.resume {\n\talign-self: center;\n display: inline-flex;\n justify-content: center;\n}",".button {\n align-items: center;\n background: linear-gradient(#5e72e3, #70f0fe) padding-box,\n linear-gradient(#5e72e3, #70f0fe) border-box;\n border: 0.125rem solid transparent;\n color: white;\n column-gap: 8px;\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\tfont-weight: bold;\n justify-content: center;\n\ttext-decoration: none;\n\n &:hover {\n border: 0.125rem solid transparent;\n }\n}","$colors: (\n \"github\": #171515,\n \"linkedin\": #0077b5,\n \"steam\": #145c8f,\n \"discord\": #7289da,\n);\n\n@mixin hover($color, $hex) {\n .#{$color} {\n border-color: $hex;\n color: $hex;\n @content;\n\n &:hover {\n background-color: $hex;\n color: white;\n }\n }\n}\n\n@mixin color-setter($property, $suffix-key: null) {\n @each $color, $hex in $colors {\n $hex: #{$hex};\n\n @if $suffix-key == \"hover\" {\n @include hover($color, $hex) {\n @content;\n };\n }\n }\n}","@use '../../colors';\n\n@include colors.color-setter(color, \"hover\") {\n align-items: center;\n display: inline-flex;\n height: 48px;\n justify-content: center;\n width: 57px;\n}\n",".resume {\n align-items: center;\n\tcolumn-gap: 8px;\n\tdisplay: inline-flex;\n\tfont-weight: bold;\n\ttext-decoration: none;\n}\n",".header {\n margin-bottom: 0px;\n text-align: center;\n}",".timeline {\n display: flex;\n flex-direction: column;\n position: relative;\n margin: 40px 0;\n}\n\n.bar {\n position: absolute;\n width: 4px;\n height: 100%;\n left: calc(50% - 2px);\n}\n",".tooltip {\n text-decoration: underline dotted;\n}",".item {\n display: flex;\n justify-content: flex-end;\n padding-right: 30px;\n position: relative;\n margin: 10px 0;\n width: 50%;\n\n .circle {\n background-color: white;\n border-radius: 50%;\n border-style: solid;\n border-width: 3px;\n position: absolute;\n top: calc(50% - 10px);\n right: -10px;\n width: 20px;\n height: 20px;\n z-index: 100;\n }\n\n .in {\n animation: fadeInLeft 1s;\n z-index: 100;\n }\n\n &:nth-child(even) {\n align-self: flex-end;\n justify-content: flex-start;\n padding-left: 30px;\n padding-right: 0;\n \n .circle {\n right: auto;\n left: -10px;\n }\n \n .content {\n text-align: left;\n align-items: flex-start;\n\n &::after {\n right: auto;\n left: -7.5px;\n box-shadow: -1px 1px 1px rgba(0, 0, 0, 0.2);\n }\n }\n \n .in {\n animation: fadeInRight 1s;\n z-index: 100;\n }\n }\n}\n\n.content {\n align-items: flex-end;\n box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);\n border-radius: 5px;\n background-color: white;\n display: flex;\n flex-direction: column;\n min-width: min-content;\n padding: 15px;\n position: relative;\n row-gap: 16px;\n max-width: 70%;\n text-align: right;\n width: 400px;\n\n .header {\n align-items: center;\n display: inline-flex;\n justify-content: space-between;\n width: 100%;\n }\n\n h6 {\n align-self: center;\n font-style: italic;\n font-weight: bold;\n margin: 0;\n }\n\n img {\n align-self: center;\n margin: 8px 0;\n width: 50%;\n }\n\n p {\n margin: 0;\n }\n\n .tag {\n border-radius: 5px;\n color: white;\n font-size: 12px;\n font-weight: bold;\n letter-spacing: 1px;\n padding: 5px;\n text-transform: uppercase;\n }\n\n time {\n color: #777;\n font-size: 12px;\n text-transform: uppercase;\n font-weight: bold;\n }\n\n &::after{\n content: ' ';\n background-color: #fff;\n box-shadow: 1px -1px 1px rgba(0, 0, 0, 0.2);\n position: absolute;\n right: -7.5px;\n top: calc(50% - 7.5px);\n transform: rotate(45deg);\n width: 15px;\n height: 15px;\n }\n}\n\n@media only screen and (max-width: 1023px) {\n .content {\n max-width: 100%;\n }\n}\n\n@media only screen and (max-width: 767px) {\n .content,\n .item:nth-child(odd) .content {\n padding: 15px 10px;\n text-align: center;\n align-items: center;\n }\n\n .content .header {\n display: flex;\n flex-direction: column;\n }\n\n .content .tag {\n text-align: center;\n }\n}\n\n@keyframes fadeInLeft {\n 0% {\n opacity: 0;\n transform: translateX(-50%);\n }\n 100% {\n opacity: 1;\n transform: translateX(0%);\n }\n}\n\n@keyframes fadeInRight {\n 0% {\n opacity: 0;\n transform: translateX(50%);\n }\n 100% {\n opacity: 1;\n transform: translateX(0%);\n }\n}\n",".list {\n align-self: center;\n}\n\n.skills {\n font-style: italic;\n font-weight: bold;\n}",".body {\n display: flex;\n flex-direction: column;\n margin-top: 24px;\n row-gap: 24px;\n}\n",".page {\n margin-left: 10%;\n margin-right: 10%;\n}",".button {\n display: inline-flex;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n padding: 0.5rem 1rem;\n width: 100%;\n}\n\n.collapse {\n @extend .button;\n background: none;\n border: none;\n color: black;\n}\n\n.expand {\n @extend .button;\n border-width: 0;\n}\n\n.firstExpand {\n @extend .expand;\n border-top-left-radius: var(--bs-accordion-inner-border-radius);\n border-top-right-radius: var(--bs-accordion-inner-border-radius);\n}\n\n.header {\n padding: 0;\n}",".brand {\n color: inherit;\n font-size: 4vmin;\n text-decoration: none;\n}\n\n.navbar {\n align-items: center;\n display: inline-flex;\n}\n\n.rightContent {\n align-items: center;\n column-gap: 2rem;\n display: inline-flex;\n justify-content: flex-end;\n}\n",".fallback {\n display: flex;\n\talign-items: center;\n\tjustify-content: center;\n\theight: 262px;\n\twidth: 177px;\n}\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/static/css/996.c3a1c8b7.chunk.css b/static/css/996.62743da9.chunk.css
similarity index 88%
rename from static/css/996.c3a1c8b7.chunk.css
rename to static/css/996.62743da9.chunk.css
index 82a64c4..ff24274 100644
--- a/static/css/996.c3a1c8b7.chunk.css
+++ b/static/css/996.62743da9.chunk.css
@@ -1,2 +1,2 @@
-.background_background__jno86{background:radial-gradient(ellipse at bottom,#1b2735 0,#090a0f 100%);height:100%;overflow:hidden;position:fixed;width:100%}.background_stars__SBhqV{animation:background_animStar__vPf6G 50s linear infinite;background:#0000;height:1px;width:1px}.background_stars__SBhqV:after{background:#0000;content:" ";height:1px;position:absolute;top:2000px;width:1px}.background_stars2__qibmf{animation:background_animStar__vPf6G 100s linear infinite;background:#0000;height:2px;width:2px}.background_stars2__qibmf:after{background:#0000;content:" ";height:2px;position:absolute;top:2000px;width:2px}.background_stars3__sA9u9{animation:background_animStar__vPf6G 150s linear infinite;background:#0000;height:3px;width:3px}.background_stars3__sA9u9:after{background:#0000;content:" ";height:3px;position:absolute;top:2000px;width:3px}@keyframes background_animStar__vPf6G{0%{transform:translateY(0)}to{transform:translateY(-2000px)}}.pageBody_body__aNOKo{display:flex;flex-direction:column;margin-top:24px;row-gap:24px}.pageMargin_page__oYkHI{margin-left:10%;margin-right:10%}.footer_buttons__X-wEA{column-gap:8px;display:inline-flex;justify-content:center}.footer_resume__j2AKe{align-self:center;display:inline-flex;justify-content:center}.linkButton_github__ltM-y{align-items:center;border-color:#171515;color:#171515;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_github__ltM-y:hover{background-color:#171515;color:#fff}.linkButton_linkedin__MRpaF{align-items:center;border-color:#0077b5;color:#0077b5;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_linkedin__MRpaF:hover{background-color:#0077b5;color:#fff}.linkButton_steam__qizUa{align-items:center;border-color:#145c8f;color:#145c8f;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_steam__qizUa:hover{background-color:#145c8f;color:#fff}.linkButton_discord__zToU1{align-items:center;border-color:#7289da;color:#7289da;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_discord__zToU1:hover{background-color:#7289da;color:#fff}.header_header__dljDF{column-gap:2px;display:inline-flex;justify-content:center}.header_header__dljDF span{animation:header_wavy__GVntJ 1.5s ease-in-out infinite;display:inline-block;font-weight:700;text-shadow:-1px 0 #000,0 1px #000,1px 0 #000,0 -1px #000}.header_header__dljDF span:last-of-type{animation-delay:0s}.header_header__dljDF span:nth-last-of-type(2){animation-delay:-.1s}.header_header__dljDF span:nth-last-of-type(3){animation-delay:-.2s}.header_header__dljDF span:nth-last-of-type(4){animation-delay:-.3s}.header_header__dljDF span:nth-last-of-type(5){animation-delay:-.4s}.header_header__dljDF span:nth-last-of-type(6){animation-delay:-.5s}.header_header__dljDF span:nth-last-of-type(7){animation-delay:-.6s}.header_header__dljDF span:nth-last-of-type(8){animation-delay:-.7s}.header_header__dljDF span:nth-last-of-type(9){animation-delay:-.8s}.header_header__dljDF span:nth-last-of-type(10){animation-delay:-.9s}@keyframes header_wavy__GVntJ{0%{transform:translateY(.3em)}60%{transform:translateY(-.3em)}to{transform:translateY(.3em)}}.aboutMeCardBody_body__px0Z-{row-gap:24px}.aboutMeCardBody_base__HWSO5,.aboutMeCardBody_glimmer__ztngv,.aboutMeCardBody_image__r0pwR{align-self:center;justify-self:center}.aboutMeCardBody_glimmer__ztngv{border-radius:var(--bs-card-inner-border-radius);height:300px;width:300px}.aboutMeCardBody_image__r0pwR{max-height:300px;max-width:300px}.aboutMeCardBody_imageColumn__Decwz{display:grid}.navbar_brand__zDvLc{color:inherit;font-size:4vmin;text-decoration:none}.navbar_navbar__pEuvw,.navbar_rightContent__ikOZ0{align-items:center;display:inline-flex}.navbar_rightContent__ikOZ0{column-gap:2rem;justify-content:flex-end}.colorPicker_fallback__pvhTA{align-items:center;display:flex;height:262px;justify-content:center;width:177px}
-/*# sourceMappingURL=996.c3a1c8b7.chunk.css.map*/
\ No newline at end of file
+.background_background__jno86{background:radial-gradient(ellipse at bottom,#1b2735 0,#090a0f 100%);height:100%;overflow:hidden;position:fixed;width:100%}.background_stars__SBhqV{animation:background_animStar__vPf6G 50s linear infinite;background:#0000;height:1px;width:1px}.background_stars__SBhqV:after{background:#0000;content:" ";height:1px;position:absolute;top:2000px;width:1px}.background_stars2__qibmf{animation:background_animStar__vPf6G 100s linear infinite;background:#0000;height:2px;width:2px}.background_stars2__qibmf:after{background:#0000;content:" ";height:2px;position:absolute;top:2000px;width:2px}.background_stars3__sA9u9{animation:background_animStar__vPf6G 150s linear infinite;background:#0000;height:3px;width:3px}.background_stars3__sA9u9:after{background:#0000;content:" ";height:3px;position:absolute;top:2000px;width:3px}@keyframes background_animStar__vPf6G{0%{transform:translateY(0)}to{transform:translateY(-2000px)}}.pageBody_body__aNOKo{display:flex;flex-direction:column;margin-top:24px;row-gap:24px}.pageMargin_page__oYkHI{margin-left:10%;margin-right:10%}.footer_buttons__X-wEA{column-gap:8px;display:inline-flex;justify-content:center}.footer_resume__j2AKe{align-self:center;display:inline-flex;justify-content:center}.linkButton_github__ltM-y{align-items:center;border-color:#171515;color:#171515;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_github__ltM-y:hover{background-color:#171515;color:#fff}.linkButton_linkedin__MRpaF{align-items:center;border-color:#0077b5;color:#0077b5;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_linkedin__MRpaF:hover{background-color:#0077b5;color:#fff}.linkButton_steam__qizUa{align-items:center;border-color:#145c8f;color:#145c8f;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_steam__qizUa:hover{background-color:#145c8f;color:#fff}.linkButton_discord__zToU1{align-items:center;border-color:#7289da;color:#7289da;display:inline-flex;height:48px;justify-content:center;width:57px}.linkButton_discord__zToU1:hover{background-color:#7289da;color:#fff}.header_header__dljDF{column-gap:2px;display:inline-flex;justify-content:center}.header_header__dljDF span{animation:header_wavy__GVntJ 1.5s ease-in-out infinite;display:inline-block;font-weight:700;text-shadow:-1px 0 #000,0 1px #000,1px 0 #000,0 -1px #000}.header_header__dljDF span:last-of-type{animation-delay:0s}.header_header__dljDF span:nth-last-of-type(2){animation-delay:-.1s}.header_header__dljDF span:nth-last-of-type(3){animation-delay:-.2s}.header_header__dljDF span:nth-last-of-type(4){animation-delay:-.3s}.header_header__dljDF span:nth-last-of-type(5){animation-delay:-.4s}.header_header__dljDF span:nth-last-of-type(6){animation-delay:-.5s}.header_header__dljDF span:nth-last-of-type(7){animation-delay:-.6s}.header_header__dljDF span:nth-last-of-type(8){animation-delay:-.7s}.header_header__dljDF span:nth-last-of-type(9){animation-delay:-.8s}.header_header__dljDF span:nth-last-of-type(10){animation-delay:-.9s}@keyframes header_wavy__GVntJ{0%{transform:translateY(.3em)}60%{transform:translateY(-.3em)}to{transform:translateY(.3em)}}.aboutMeCardBody_body__px0Z-{row-gap:24px}.aboutMeCardBody_base__HWSO5,.aboutMeCardBody_glimmer__ztngv,.aboutMeCardBody_image__r0pwR{align-self:center;justify-self:center}.aboutMeCardBody_glimmer__ztngv{border-radius:var(--bs-card-inner-border-radius);height:300px;width:300px}.aboutMeCardBody_image__r0pwR{max-height:300px;max-width:300px}.aboutMeCardBody_imageColumn__Decwz{display:grid}.navbar_brand__zDvLc{color:inherit;font-size:4vmin;text-decoration:none}.navbar_navbar__pEuvw{align-items:center;display:inline-flex}.navbar_pushTime__jdH3p{font-size:1.75vmin;text-align:center}.navbar_rightContent__ikOZ0{align-items:center;column-gap:2rem;display:inline-flex;justify-content:flex-end}.colorPicker_fallback__pvhTA{align-items:center;display:flex;height:262px;justify-content:center;width:177px}.tooltip_tooltip__5pJPW{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}
+/*# sourceMappingURL=996.62743da9.chunk.css.map*/
\ No newline at end of file
diff --git a/static/css/996.62743da9.chunk.css.map b/static/css/996.62743da9.chunk.css.map
new file mode 100644
index 0000000..f5c097a
--- /dev/null
+++ b/static/css/996.62743da9.chunk.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"static/css/996.62743da9.chunk.css","mappings":"AAmBA,8BAGE,qEAFA,YAIA,gBADA,eAFA,UAGA,CAGF,yBAnBE,yDAPA,iBACA,UA0BoB,CAzBpB,SAKA,CAEA,+BATA,iBAYE,YAXF,UA0BoB,CAdlB,kBACA,WAZF,SAYE,CAgBJ,0BAvBE,0DAPA,iBACA,UA8BqB,CA7BrB,SAKA,CAEA,gCATA,iBAYE,YAXF,UA8BqB,CAlBnB,kBACA,WAZF,SAYE,CAoBJ,0BA3BE,0DAPA,iBACA,UAkCqB,CAjCrB,SAKA,CAEA,gCATA,iBAYE,YAXF,UAkCqB,CAtBnB,kBACA,WAZF,SAYE,CAwBJ,sCACE,GACE,wBAEF,GACE,+BC5CJ,sBACI,aACA,sBACA,gBACA,aCJJ,wBACI,gBACA,iBCFJ,uBAEC,eADG,oBAEA,uBAGJ,sBACC,kBACG,oBACA,uBCDA,0BCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,gCACI,wBAQE,CAPF,WAPR,4BCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,kCACI,wBAQE,CAPF,WAPR,yBCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,+BACI,wBAQE,CAPF,WAPR,2BCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,iCACI,wBAQE,CAPF,WEfZ,sBACI,eACA,oBACA,uBAEA,2BACI,uDACA,qBACA,gBACA,0DAII,wCACI,kBAHA,CAEJ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,gDACI,oBACQ,CAMxB,8BACI,GACE,2BAEF,IACE,4BAEF,GACE,4BCtBN,6BACC,aAGD,2FACC,kBACA,oBAGD,gCAIC,iDAjBA,YAHW,CAIX,WAgBA,CAGD,8BApBC,gBAHW,CAIX,eAJW,CA4BZ,oCACC,aC7BD,qBACI,cACA,gBACA,qBAGJ,sBACI,mBACA,oBAGJ,wBACI,mBACA,kBAGJ,4BACI,mBACA,gBACA,oBACA,yBCpBJ,6BAEC,mBADG,aAGH,aADA,uBAEA,YCLD,wBACI","sources":["impl/styles/body/personal/background.module.scss","impl/styles/pageBody.module.scss","impl/styles/pageMargin.module.scss","impl/styles/body/about/footer.module.scss","impl/styles/colors.scss","impl/styles/body/buttons/linkButton.module.scss","impl/styles/body/personal/about/header.module.scss","impl/styles/body/about/aboutMeCardBody.module.scss","impl/styles/nav/navbar.module.scss","impl/styles/nav/colorPicker.module.scss","impl/styles/tooltip.module.scss"],"sourcesContent":["@mixin stars-common($dimension) {\n background: transparent;\n height: $dimension;\n width: $dimension;\n}\n\n@mixin stars($delay, $dimension) {\n @include stars-common($dimension);\n animation: animStar $delay linear infinite;\n\n &::after {\n @include stars-common($dimension);\n\n content: \" \";\n position: absolute;\n top: 2000px;\n }\n}\n\n.background {\n height: 100%;\n width: 100%;\n background: radial-gradient(ellipse at bottom, #1B2735 0%, #090A0F 100%);\n position: fixed;\n overflow: hidden;\n}\n\n.stars {\n @include stars(50s, 1px);\n}\n \n.stars2 {\n @include stars(100s, 2px);\n}\n \n.stars3 {\n @include stars(150s, 3px);\n}\n \n@keyframes animStar {\n from {\n transform: translateY(0px);\n }\n to {\n transform: translateY(-2000px);\n }\n}\n ",".body {\n display: flex;\n flex-direction: column;\n margin-top: 24px;\n row-gap: 24px;\n}\n",".page {\n margin-left: 10%;\n margin-right: 10%;\n}",".buttons {\n display: inline-flex;\n\tcolumn-gap: 8px;\n justify-content: center;\n}\n\n.resume {\n\talign-self: center;\n display: inline-flex;\n justify-content: center;\n}","$colors: (\n \"github\": #171515,\n \"linkedin\": #0077b5,\n \"steam\": #145c8f,\n \"discord\": #7289da,\n);\n\n@mixin hover($color, $hex) {\n .#{$color} {\n border-color: $hex;\n color: $hex;\n @content;\n\n &:hover {\n background-color: $hex;\n color: white;\n }\n }\n}\n\n@mixin color-setter($property, $suffix-key: null) {\n @each $color, $hex in $colors {\n $hex: #{$hex};\n\n @if $suffix-key == \"hover\" {\n @include hover($color, $hex) {\n @content;\n };\n }\n }\n}","@use '../../colors';\n\n@include colors.color-setter(color, \"hover\") {\n align-items: center;\n display: inline-flex;\n height: 48px;\n justify-content: center;\n width: 57px;\n}\n",".header {\n column-gap: 2px;\n display: inline-flex;\n justify-content: center;\n\n span {\n animation: wavy 1.5s ease-in-out infinite;\n display: inline-block;\n font-weight: bold;\n text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;\n\n $delay: 0.0s;\n @for $i from 1 through 10 {\n &:nth-last-of-type(#{$i}) {\n animation-delay: $delay;\n $delay: $delay - 0.1s;\n }\n }\n }\n}\n\n@keyframes wavy {\n 0% {\n transform: translateY(0.3em);\n }\n 60% {\n transform: translateY(-0.3em);\n }\n 100% {\n transform: translateY(0.3em);\n }\n }","$dimension: 300px;\n\n@mixin dimensions($max: false) {\n\t#{if($max, max-, null)}height: $dimension;\n\t#{if($max, max-, null)}width: $dimension;\n}\n\n.body {\n\trow-gap: 24px;\n}\n\n.base {\n\talign-self: center;\n\tjustify-self: center;\n}\n\n.glimmer {\n\t@extend .base;\n\t@include dimensions;\n\n\tborder-radius: var(--bs-card-inner-border-radius);\n}\n\n.image {\n\t@extend .base;\n\t@include dimensions($max: true);\n}\n\n.imageColumn {\n\tdisplay: grid;\n}",".brand {\n color: inherit;\n font-size: 4vmin;\n text-decoration: none;\n}\n\n.navbar {\n align-items: center;\n display: inline-flex;\n}\n\n.pushTime {\n font-size: 1.75vmin;\n text-align: center;\n}\n\n.rightContent {\n align-items: center;\n column-gap: 2rem;\n display: inline-flex;\n justify-content: flex-end;\n}\n",".fallback {\n display: flex;\n\talign-items: center;\n\tjustify-content: center;\n\theight: 262px;\n\twidth: 177px;\n}\n",".tooltip {\n text-decoration: underline dotted;\n}"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/static/css/996.c3a1c8b7.chunk.css.map b/static/css/996.c3a1c8b7.chunk.css.map
deleted file mode 100644
index 3d60cfb..0000000
--- a/static/css/996.c3a1c8b7.chunk.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"static/css/996.c3a1c8b7.chunk.css","mappings":"AAmBA,8BAGE,qEAFA,YAIA,gBADA,eAFA,UAGA,CAGF,yBAnBE,yDAPA,iBACA,UA0BoB,CAzBpB,SAKA,CAEA,+BATA,iBAYE,YAXF,UA0BoB,CAdlB,kBACA,WAZF,SAYE,CAgBJ,0BAvBE,0DAPA,iBACA,UA8BqB,CA7BrB,SAKA,CAEA,gCATA,iBAYE,YAXF,UA8BqB,CAlBnB,kBACA,WAZF,SAYE,CAoBJ,0BA3BE,0DAPA,iBACA,UAkCqB,CAjCrB,SAKA,CAEA,gCATA,iBAYE,YAXF,UAkCqB,CAtBnB,kBACA,WAZF,SAYE,CAwBJ,sCACE,GACE,wBAEF,GACE,+BC5CJ,sBACI,aACA,sBACA,gBACA,aCJJ,wBACI,gBACA,iBCFJ,uBAEC,eADG,oBAEA,uBAGJ,sBACC,kBACG,oBACA,uBCDA,0BCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,gCACI,wBAQE,CAPF,WAPR,4BCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,kCACI,wBAQE,CAPF,WAPR,yBCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,+BACI,wBAQE,CAPF,WAPR,2BCLA,mBDMI,oBAaM,CAZN,aAYM,CClBV,oBACA,YACA,uBACA,WDMI,iCACI,wBAQE,CAPF,WEfZ,sBACI,eACA,oBACA,uBAEA,2BACI,uDACA,qBACA,gBACA,0DAII,wCACI,kBAHA,CAEJ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,+CACI,oBACQ,CAFZ,gDACI,oBACQ,CAMxB,8BACI,GACE,2BAEF,IACE,4BAEF,GACE,4BCtBN,6BACC,aAGD,2FACC,kBACA,oBAGD,gCAIC,iDAjBA,YAHW,CAIX,WAgBA,CAGD,8BApBC,gBAHW,CAIX,eAJW,CA4BZ,oCACC,aC7BD,qBACI,cACA,gBACA,qBAQJ,kDAJI,mBACA,mBAOA,CAJJ,4BAEI,gBAEA,yBCfJ,6BAEC,mBADG,aAGH,aADA,uBAEA","sources":["impl/styles/body/personal/background.module.scss","impl/styles/pageBody.module.scss","impl/styles/pageMargin.module.scss","impl/styles/body/about/footer.module.scss","impl/styles/colors.scss","impl/styles/body/buttons/linkButton.module.scss","impl/styles/body/personal/about/header.module.scss","impl/styles/body/about/aboutMeCardBody.module.scss","impl/styles/nav/navbar.module.scss","impl/styles/nav/colorPicker.module.scss"],"sourcesContent":["@mixin stars-common($dimension) {\n background: transparent;\n height: $dimension;\n width: $dimension;\n}\n\n@mixin stars($delay, $dimension) {\n @include stars-common($dimension);\n animation: animStar $delay linear infinite;\n\n &::after {\n @include stars-common($dimension);\n\n content: \" \";\n position: absolute;\n top: 2000px;\n }\n}\n\n.background {\n height: 100%;\n width: 100%;\n background: radial-gradient(ellipse at bottom, #1B2735 0%, #090A0F 100%);\n position: fixed;\n overflow: hidden;\n}\n\n.stars {\n @include stars(50s, 1px);\n}\n \n.stars2 {\n @include stars(100s, 2px);\n}\n \n.stars3 {\n @include stars(150s, 3px);\n}\n \n@keyframes animStar {\n from {\n transform: translateY(0px);\n }\n to {\n transform: translateY(-2000px);\n }\n}\n ",".body {\n display: flex;\n flex-direction: column;\n margin-top: 24px;\n row-gap: 24px;\n}\n",".page {\n margin-left: 10%;\n margin-right: 10%;\n}",".buttons {\n display: inline-flex;\n\tcolumn-gap: 8px;\n justify-content: center;\n}\n\n.resume {\n\talign-self: center;\n display: inline-flex;\n justify-content: center;\n}","$colors: (\n \"github\": #171515,\n \"linkedin\": #0077b5,\n \"steam\": #145c8f,\n \"discord\": #7289da,\n);\n\n@mixin hover($color, $hex) {\n .#{$color} {\n border-color: $hex;\n color: $hex;\n @content;\n\n &:hover {\n background-color: $hex;\n color: white;\n }\n }\n}\n\n@mixin color-setter($property, $suffix-key: null) {\n @each $color, $hex in $colors {\n $hex: #{$hex};\n\n @if $suffix-key == \"hover\" {\n @include hover($color, $hex) {\n @content;\n };\n }\n }\n}","@use '../../colors';\n\n@include colors.color-setter(color, \"hover\") {\n align-items: center;\n display: inline-flex;\n height: 48px;\n justify-content: center;\n width: 57px;\n}\n",".header {\n column-gap: 2px;\n display: inline-flex;\n justify-content: center;\n\n span {\n animation: wavy 1.5s ease-in-out infinite;\n display: inline-block;\n font-weight: bold;\n text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;\n\n $delay: 0.0s;\n @for $i from 1 through 10 {\n &:nth-last-of-type(#{$i}) {\n animation-delay: $delay;\n $delay: $delay - 0.1s;\n }\n }\n }\n}\n\n@keyframes wavy {\n 0% {\n transform: translateY(0.3em);\n }\n 60% {\n transform: translateY(-0.3em);\n }\n 100% {\n transform: translateY(0.3em);\n }\n }","$dimension: 300px;\n\n@mixin dimensions($max: false) {\n\t#{if($max, max-, null)}height: $dimension;\n\t#{if($max, max-, null)}width: $dimension;\n}\n\n.body {\n\trow-gap: 24px;\n}\n\n.base {\n\talign-self: center;\n\tjustify-self: center;\n}\n\n.glimmer {\n\t@extend .base;\n\t@include dimensions;\n\n\tborder-radius: var(--bs-card-inner-border-radius);\n}\n\n.image {\n\t@extend .base;\n\t@include dimensions($max: true);\n}\n\n.imageColumn {\n\tdisplay: grid;\n}",".brand {\n color: inherit;\n font-size: 4vmin;\n text-decoration: none;\n}\n\n.navbar {\n align-items: center;\n display: inline-flex;\n}\n\n.rightContent {\n align-items: center;\n column-gap: 2rem;\n display: inline-flex;\n justify-content: flex-end;\n}\n",".fallback {\n display: flex;\n\talign-items: center;\n\tjustify-content: center;\n\theight: 262px;\n\twidth: 177px;\n}\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/static/js/101.2074eee1.chunk.js b/static/js/101.2074eee1.chunk.js
new file mode 100644
index 0000000..058bb13
--- /dev/null
+++ b/static/js/101.2074eee1.chunk.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunksverg84_github_io=self.webpackChunksverg84_github_io||[]).push([[101],{1101:(e,t,n)=>{n.r(t),n.d(t,{Component:()=>_e});var s=n(2791),a=n(8025);const i={bg:"background_bg__rHR4m",bg3:"background_bg3__WZ4Pm",bg2:"background_bg2__XB2Tl",slide:"background_slide__Sq8xw"};var r=n(184);function o(){const e=function(){const{color:e}=(0,s.useContext)(a.Z);return{backgroundImage:"linear-gradient(-60deg, ".concat(e," 50%, white 50%)")}}();return(0,r.jsx)(r.Fragment,{children:[i.bg,i.bg2,i.bg3].map((t=>(0,r.jsx)("div",{className:t,style:e},t)))})}var l=n(8957),c=n(2982),d=n(8188),u=n(1694),m=n.n(u),h=n(2426),g=n.n(h),p=n(1087),x=n(4769);const f={bold:"text_bold__TiUuq",italic:"text_italic__fvjzk"},j=new Date("1998-05-06T10:47:00.000-06:00");function _(e){let{language:t}=e;const n=(0,x.Z)();return(0,r.jsx)("span",{className:f.bold,style:n,children:t})}function b(){const e=(0,x.Z)(),t=g().duration(g()().diff(j)).years();return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(l.Z.Text,{as:"h2",className:m()("text-center","text-xl-start"),style:e,children:"About Me"}),(0,r.jsx)(l.Z.Text,{as:"h6",className:m()(f.italic,"text-center","text-xl-start"),children:"Front-End Software Engineer, Web Developer"}),(0,r.jsxs)(l.Z.Text,{children:["Hi there! My name is"," ",(0,r.jsx)("span",{className:m()(f.bold,f.italic),style:e,children:c.Z}),". I am a ",t," year-old software engineer with a fondness for user interface and user experience (UI/UX) development."]}),(0,r.jsxs)(l.Z.Text,{children:["I started learning to code during my senior year of high school when I took an introduction course to ",(0,r.jsx)(_,{language:"Java"})," on a whim, and I loved learning as much as I could since then! Throughout my time at university, I applied myself to a substantial amount of coursework in"," ",(0,r.jsx)(_,{language:"C++"})," and ",(0,r.jsx)(_,{language:"Python"})," with a splash of ",(0,r.jsx)(_,{language:"JavaScript"}),","," ",(0,r.jsx)(_,{language:"OCaml"}),", and ",(0,r.jsx)(_,{language:"C#"}),"."]}),(0,r.jsxs)(l.Z.Text,{children:["All of my full-time experience (as of Summer 2023) stems from my time at Meta where I challenged myself further in exploring web programming, learning ",(0,r.jsx)(_,{language:"PHP"})," and"," ",(0,r.jsx)(_,{language:"React"})," for the first time in a rigorous, fast-paced environment."]}),(0,r.jsxs)(l.Z.Text,{children:["Since parting with Meta, I have been self-teaching"," ",(0,r.jsx)(_,{language:"TypeScript"})," in order to keep my UI-building skills fresh, replete with ",(0,r.jsx)(_,{language:"SCSS"})," modules."]}),(0,r.jsxs)(l.Z.Text,{children:["Click"," ",(0,r.jsx)(p.rU,{className:f.bold,style:e,to:"/personal",children:"here"})," ","if you would like to learn more about me beyond my career!"]})]})}function y(){return(0,r.jsx)(d.Z,{alt:"Picture of ".concat(c.Z),src:"/sverg.jpeg",children:(0,r.jsx)(b,{})})}var v=n(2677),Z=n(9743),k=n(775),w=n(9841),M=n(9806),C=n(3360),N=n(2381);const S={button:"email_button__FW+sr"};function I(){const{isHovering:e,...t}=(0,N.Z)();return(0,r.jsx)(C.Z,{className:S.button,href:"mailto:sverg84@gmail.com",...t,children:(0,r.jsx)(M.G,{fade:e,icon:w.FU,size:"2xl"})})}var T=n(8036),L=n(5943),P=n(1791);function E(){return(0,r.jsx)(P.Z,{className:L.Z.github,href:"https://github.com/sverg84",icon:T.zh})}var R=n(1561);function H(){return(0,r.jsx)(P.Z,{className:L.Z.linkedin,href:"https://www.linkedin.com/in/stephen-vergara-2bab8614b/",icon:R.D9})}var z=n(517),F=n(5791);const B={resume:"resume_resume__92JEE"};function K(){const{isHovering:e,...t}=(0,N.Z)(),n=function(e){const{color:t}=s.useContext(a.Z),n=(0,F.Z)(),i=e?n:t;return{backgroundColor:e?t:void 0,borderColor:i,boxShadow:"4px 4px ".concat(t),color:i}}(e);return(0,r.jsxs)(C.Z,{className:B.resume,href:"/sverg_resume.pdf",style:n,target:"_blank",variant:"outline-light",...t,children:[(0,r.jsx)("span",{children:"Download resume"}),(0,r.jsx)(M.G,{beat:e,icon:z.q7})]})}function U(){return(0,r.jsx)(l.Z.Footer,{children:(0,r.jsxs)(Z.Z,{className:"gy-3",xs:1,sm:2,md:2,lg:3,children:[(0,r.jsx)(v.Z,{className:k.Z.resume,children:(0,r.jsx)(K,{})}),(0,r.jsx)(v.Z,{className:k.Z.resume,children:(0,r.jsx)(I,{})}),(0,r.jsxs)(v.Z,{className:k.Z.buttons,sm:12,md:12,children:[(0,r.jsx)(E,{}),(0,r.jsx)(H,{})]})]})})}function D(){return(0,r.jsxs)(l.Z,{id:"about",children:[(0,r.jsx)(y,{}),(0,r.jsx)(U,{})]})}const A={header:"card_header__C3ziB"};function q(e){let{children:t,id:n,title:s}=e;const a=(0,x.Z)();return(0,r.jsxs)(l.Z,{id:n,children:[(0,r.jsx)(l.Z.Header,{as:"h2",className:A.header,style:a,children:s}),(0,r.jsx)(l.Z.Body,{children:t})]})}var O=n(7093);const G={timeline:"timeline_timeline__VfjcF",bar:"timeline_bar__V3BAE"};var Q=n(949),W=n(3441);const J={item:"timelineItem_item__005F5",circle:"timelineItem_circle__ADJyP",in:"timelineItem_in__PSeNd",fadeInLeft:"timelineItem_fadeInLeft__vvxlT",content:"timelineItem_content__izpwq",fadeInRight:"timelineItem_fadeInRight__uPKi+",header:"timelineItem_header__H24TC",tag:"timelineItem_tag__k8jMy"},V={list:"skillsList_list__-3yy3",skills:"skillsList_skills__Q4+OB"};function Y(e){let{skillsList:t,style:n}=e;return(0,r.jsxs)("p",{className:V.list,children:[(0,r.jsxs)("span",{className:V.skills,style:n,children:["Skills:"," "]}),t.join(", ")]})}function X(e){let{data:t,isOdd:n}=e;const i=(0,O.Z)(),o=function(){const{color:e}=s.useContext(a.Z);return{borderColor:e}}(),l=(0,x.Z)(),{inView:c,ref:d}=(0,W.YD)({triggerOnce:!0,rootMargin:"-200px 0px"}),u=(0,r.jsx)("span",{className:J.tag,style:i,children:t.tag}),h=(0,r.jsx)("time",{children:t.timeframe}),g=n?(0,r.jsxs)(r.Fragment,{children:[u,h]}):(0,r.jsxs)(r.Fragment,{children:[h,u]});return(0,r.jsxs)("div",{className:J.item,children:[(0,r.jsxs)("div",{className:m()(J.content,c?J.in:"opacity-0"),ref:d,children:[(0,r.jsx)("div",{className:J.header,children:g}),(0,r.jsx)("h6",{style:l,children:t.title}),(0,r.jsx)("img",{loading:"lazy",src:t.src,width:"100%"}),t.description,(0,r.jsx)(Y,{style:l,skillsList:t.skillsList})]}),(0,r.jsx)("span",{className:J.circle,style:o})]})}const $=[{description:(0,r.jsx)("p",{children:"Full-stack product software engineer (PHP/Hack and JS/React) for the Org Effectiveness team within the Enterprise Engineering division. Released multiple high-priority stakeholder feature requests pertaining to HR-sensitive employee data. Leader of team app performance optimization opportunities."}),skillsList:["PHP","React","GraphQL","MySQL"],src:"/meta.gif",tag:"Meta Platforms, Inc.",timeframe:"2020-2023",title:"Software Engineer"},{description:(0,r.jsx)("p",{children:"Intern for the Traffic Analytics team within the Infrastructure division. Created monitoring tool for team oncall to measure network packet failures with interactive web page."}),skillsList:["C++","Python","Apache Thrift","MySQL"],src:"/meta.gif",tag:"Meta Platforms, Inc.",timeframe:"Summer 2019",title:"Software Engineer Intern"},{description:(0,r.jsxs)("p",{children:["Assistant at the university's Transportation Research Institute as part of the Undergraduate Research Opportunity Program (UROP). Participated in"," ",(0,r.jsx)(Q.Z,{content:"anthropometric",tooltip:"of or relating to the scientific study of the measurements and proportions of the human body"})," ","study for Defence Research & Development Canada (DRDC)."]}),skillsList:["MATLAB","Wolfram Mathematica"],src:"/umich.jpeg",tag:"University of Michigan",timeframe:"2016-2017",title:"Research Assistant"}];function ee(){const e=(0,O.Z)();return(0,r.jsxs)("div",{className:G.timeline,children:[(0,r.jsx)("div",{className:G.bar,style:e}),$.map(((e,t)=>(0,r.jsx)(X,{data:e,isOdd:t%2!==0},e.title)))]})}function te(){return(0,r.jsx)(q,{id:"experience",title:"Experience",children:(0,r.jsx)(ee,{})})}var ne=n(5364),se=n(4559);const ae={cpp:"C++",csharp:"C#",graphql:"GraphQL",hack:"Hack",mysql:"MySQL",python:"Python",react:"React",typescript:"TypeScript"};var ie=n(6055),re=n(7749),oe=n(7361),le=n(9578),ce=n(5912),de=n(7333);const ue={button:"item_button__GmSRm",expand:"item_expand__4Sxrl",firstExpand:"item_firstExpand__kSWZa",collapse:"item_collapse__JYgde",header:"item_header__w8Yjy"};function me(e){let{eventKey:t}=e;const{activeEventKey:n}=s.useContext(ce.Z),a=(0,O.Z)(),i=(0,de.k)(t),o=n===t,l=[];return o?l.push(t===ae.react?ue.firstExpand:ue.expand):l.push(ue.collapse),(0,r.jsxs)("button",{className:m()(l),style:o?a:void 0,onClick:i,children:[t,(0,r.jsx)(M.G,{icon:o?le.mT:oe.pt})]})}function he(e){let{children:t,eventKey:n}=e;return(0,r.jsxs)(re.Z,{eventKey:n,children:[(0,r.jsx)(me,{eventKey:n}),(0,r.jsx)(ie.Z,{eventKey:n,children:(0,r.jsx)(l.Z.Body,{children:t})})]})}function ge(){return(0,r.jsx)(q,{id:"skills",title:"Skills",children:(0,r.jsxs)(se.Z,{defaultActiveKey:ae.react,children:[(0,r.jsx)(he,{eventKey:ae.react,children:"Ramped up on React skills while transitioning from web infra (PHP) to UI programming in my full-time position at Meta. Developed an expertise in applying Hooks, code-splitting APIs, and React18 concurrency features to create seamless user experiences while optimizing app/page performance. Expanding upon Meta-internal skills with public React app building (e.g., this web page!)."}),(0,r.jsx)(he,{eventKey:ae.typescript,children:'Self-taught during the summer of 2023 in order to create a modern React app at home while still enforcing type safety. Very similar to Meta\'s "Flow" but with broader appeal.'}),(0,r.jsx)(he,{eventKey:ae.hack,children:"First programming language learned while working full-time at Meta. Built multiple scalable features by focusing on asynchronous programming. Moved to implementing GraphQL queries and mutations on the server side in addition to server-calling React routes and their corresponding components."}),(0,r.jsx)(he,{eventKey:ae.graphql,children:"Learned back-end GraphQL field implementation skills while learning Hack, and gained client-side GraphQL experience in tandem with coding in React while full-time at Meta."}),(0,r.jsx)(he,{eventKey:ae.mysql,children:"Database management skills applied during both the internship and full-time Meta experiences. MySQL queries created for mass aggregates of traffic data in C++/Python, queries and mutations optimized for employee directory information in Hack."}),(0,r.jsx)(he,{eventKey:ae.python,children:"First applied in class projects around web development (e.g., Flask, Jinja, REST) while at the University of Michigan, later used to create data pipeline jobs for traffic aggregation as an intern at Meta. Presently, using FastAPI and PostgreSQL for personal projects."}),(0,r.jsx)(he,{eventKey:ae.cpp,children:"First programming language learned as an undergraduate at the University of Michigan. Used for package building and app compression while coding as a Meta intern. Skills in asynchronous programming (e.g., threads, mutexes, semaphores, etc.) and file system management as part of a course on operating systems."}),(0,r.jsx)(he,{eventKey:ae.csharp,children:"Onboarded as part of university senior capstone project at Michigan. Gained experience in C# in order to create a video game as part of a team of four (4) using the Unity game engine."})]})})}function pe(){return(0,r.jsxs)(ne.Z,{children:[(0,r.jsx)(D,{}),(0,r.jsx)(te,{}),(0,r.jsx)(ge,{})]})}const xe=835;function fe(){const[e,t]=s.useState(window.innerWidth>xe),[a,i]=s.useState(null),o=()=>{t(window.innerWidth>xe)};return s.useEffect((()=>(window.addEventListener("resize",o),()=>window.removeEventListener("resize",o))),[]),s.useEffect((()=>{(async()=>{i(s.lazy((async()=>await(e?n.e(306).then(n.bind(n,9306)):n.e(560).then(n.bind(n,560))))))})()}),[e]),null!=a?(0,r.jsx)(s.Suspense,{fallback:null,children:(0,r.jsx)(a,{})}):null}var je=n(9911);function _e(){return(0,r.jsx)(je.Z,{background:(0,r.jsx)(o,{}),breadcrumbs:(0,r.jsx)(fe,{}),children:(0,r.jsx)(pe,{})})}},949:(e,t,n)=>{n.d(t,{Z:()=>l});n(2791);var s=n(5862),a=n(2576),i=n(3441);const r={tooltip:"tooltip_tooltip__5pJPW"};var o=n(184);function l(e){let{content:t,tooltip:n}=e;const{ref:l,entry:c}=(0,i.YD)({rootMargin:"-50% 0px 0px"});return(0,o.jsx)(s.Z,{placement:null!==c&&void 0!==c&&c.isIntersecting?"top":"bottom",overlay:(0,o.jsx)(a.Z,{children:n}),children:(0,o.jsx)("span",{className:r.tooltip,ref:l,children:t})})}},9911:(e,t,n)=>{n.d(t,{Z:()=>I});var s=n(2791),a=n(8025),i=n(1694),r=n.n(i),o=n(7022),l=n(2677),c=n(2251),d=n(1087),u=n(2982),m=n(7093);const h={brand:"navbar_brand__zDvLc",navbar:"navbar_navbar__pEuvw",pushTime:"navbar_pushTime__jdH3p",rightContent:"navbar_rightContent__ikOZ0"};var g=n(5),p=n(5088),x=n(9806),f=n(192),j=n(4849);const _={fallback:"colorPicker_fallback__pvhTA"};var b=n(9415),y=n(184);const v=(0,b.Z)((()=>n.e(154).then(n.bind(n,1154))));function Z(){return(0,y.jsx)(f.Z,{align:"end",className:_.icon,renderMenuOnMount:!1,title:(0,y.jsx)(x.G,{icon:p.q2,bounce:!0}),onMouseEnter:()=>{v.preload()},children:(0,y.jsx)(s.Suspense,{fallback:(0,y.jsx)("div",{className:_.fallback,children:(0,y.jsx)(j.Z,{animation:"border",variant:"secondary"})}),children:(0,y.jsx)(v,{})})})}var k=n(949);const w=new Intl.RelativeTimeFormat(void 0,{numeric:"auto"}),M=[{unit:"year",ms:31536e6},{unit:"month",ms:2628e6},{unit:"day",ms:864e5},{unit:"hour",ms:36e5},{unit:"minute",ms:6e4},{unit:"second",ms:1e3}];function C(e){for(const{unit:t,ms:n}of M)if(Math.abs(e)>=n||"second"===t)return w.format(Math.round(e/n),t);return""}function N(){const[e,t]=s.useState(null);if(s.useEffect((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/sverg84/sverg84.github.io");if(!e.ok)throw new Error("".concat(e.status,": ").concat(e.statusText));const n=(await e.json()).pushed_at;t(new Date(n))}catch(e){console.warn(e)}})()}),[]),null==e)return null;const n=e.getTime()-(new Date).getTime();return(0,y.jsxs)(y.Fragment,{children:["Last Updated:"," ",(0,y.jsx)(k.Z,{content:C(n),tooltip:e.toLocaleString(void 0)})]})}function S(e){let{breadcrumbs:t}=e;const n=(0,m.Z)();return(0,y.jsx)(c.Z,{expand:!1,sticky:"top",style:n,children:(0,y.jsxs)(o.Z,{className:r()(g.Z.page,h.navbar),children:[(0,y.jsx)(l.Z,{children:(0,y.jsx)(d.rU,{className:h.brand,to:"/",children:u.Z})}),(0,y.jsx)(l.Z,{className:h.pushTime,children:(0,y.jsx)(N,{})}),(0,y.jsxs)(l.Z,{className:h.rightContent,children:[t,(0,y.jsx)(Z,{})]})]})})}function I(e){let{background:t,breadcrumbs:n,children:i}=e;const[r,o]=(0,s.useState)("#2e3134");return(0,y.jsxs)(a.Z.Provider,{value:{color:r,setColor:o},children:[t,(0,y.jsx)(S,{breadcrumbs:n}),i]})}},5364:(e,t,n)=>{n.d(t,{Z:()=>l});var s=n(1694),a=n.n(s);n(2791);const i={body:"pageBody_body__aNOKo"};var r=n(5),o=n(184);function l(e){let{children:t}=e;return(0,o.jsx)("div",{className:a()(r.Z.page,i.body),children:t})}},8188:(e,t,n)=>{n.d(t,{Z:()=>h});var s=n(2791),a=n(8957),i=n(2677),r=n(7022),o=n(9743),l=n(6638),c=n(5267),d=n(184);const u=s.lazy((async()=>await n.e(217).then(n.bind(n,1217))));function m(e){return(0,d.jsx)(s.Suspense,{fallback:(0,d.jsx)(c.Z,{animation:"wave",as:"div",bg:"secondary",className:l.Z.glimmer}),children:(0,d.jsx)(u,{...e})})}function h(e){let{children:t,...n}=e;return(0,d.jsx)(a.Z.Body,{children:(0,d.jsx)(r.Z,{children:(0,d.jsxs)(o.Z,{className:l.Z.body,xs:1,children:[(0,d.jsx)(i.Z,{className:l.Z.imageColumn,xl:4,children:(0,d.jsx)(m,{...n})}),(0,d.jsx)(i.Z,{xl:8,children:t})]})})})}},1791:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(9806),a=(n(2791),n(3360)),i=n(2381),r=n(184);function o(e){let{className:t,href:n,icon:o}=e;const{isHovering:l,...c}=(0,i.Z)();return(0,r.jsx)(a.Z,{className:t,href:n,target:"_blank",variant:"link",...c,children:(0,r.jsx)(s.G,{icon:o,size:"2xl"})})}},2982:(e,t,n)=>{n.d(t,{Z:()=>s});const s="Stephen Vergara"},8025:(e,t,n)=>{n.d(t,{Z:()=>s});const s=(0,n(2791).createContext)({color:"#2e3134",setColor:()=>{}})},7093:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(2791),a=n(8025),i=n(5791);function r(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";const{color:t}=s.useContext(a.Z),n=(0,i.Z)();return{backgroundColor:"".concat(t).concat(e),color:n}}},4769:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(2791),a=n(8025);function i(){const{color:e}=s.useContext(a.Z);return{color:e}}},2381:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(2791);function a(){const[e,t]=s.useState(!1);return{isHovering:e,onMouseEnter:()=>{t(!0)},onMouseLeave:()=>{t(!1)}}}},5791:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(2791),a=n(8025);const i=128,r=.299,o=.587,l=.114;function c(){const{color:e}=s.useContext(a.Z);return s.useMemo((()=>{const t=Math.floor((e.length-1)/3),n=((e,t)=>e.match(new RegExp(".{".concat(t,"}"),"g")))(e.slice(1),t),[s,a,c]=(null!==n&&void 0!==n?n:[]).map((e=>parseInt(e.repeat(2/e.length),16)));return Math.round((null!==s&&void 0!==s?s:0)*r+(null!==a&&void 0!==a?a:0)*o+(null!==c&&void 0!==c?c:0)*l)>i?"black":"white"}),[e])}},9415:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(2791);function a(e){return Object.assign(s.lazy(e),{preload:e})}},6638:(e,t,n)=>{n.d(t,{Z:()=>s});const s={body:"aboutMeCardBody_body__px0Z-",base:"aboutMeCardBody_base__HWSO5",image:"aboutMeCardBody_image__r0pwR",glimmer:"aboutMeCardBody_glimmer__ztngv",imageColumn:"aboutMeCardBody_imageColumn__Decwz"}},775:(e,t,n)=>{n.d(t,{Z:()=>s});const s={buttons:"footer_buttons__X-wEA",resume:"footer_resume__j2AKe"}},5943:(e,t,n)=>{n.d(t,{Z:()=>s});const s={github:"linkButton_github__ltM-y",linkedin:"linkButton_linkedin__MRpaF",steam:"linkButton_steam__qizUa",discord:"linkButton_discord__zToU1"}},5:(e,t,n)=>{n.d(t,{Z:()=>s});const s={page:"pageMargin_page__oYkHI"}}}]);
+//# sourceMappingURL=101.2074eee1.chunk.js.map
\ No newline at end of file
diff --git a/static/js/101.2074eee1.chunk.js.map b/static/js/101.2074eee1.chunk.js.map
new file mode 100644
index 0000000..b1a9fbf
--- /dev/null
+++ b/static/js/101.2074eee1.chunk.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"static/js/101.2074eee1.chunk.js","mappings":"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","sources":["webpack://sverg84.github.io/./src/impl/styles/background.module.scss?ebba","impl/components/AppBackground.tsx","impl/hooks/useBackgroundStyle.ts","webpack://sverg84.github.io/./src/impl/styles/body/about/text.module.scss?83aa","impl/components/body/about/AboutMeText.tsx","impl/components/body/about/AboutMeCardBody.tsx","webpack://sverg84.github.io/./src/impl/styles/body/buttons/email.module.scss?9739","impl/components/buttons/EmailButton.tsx","impl/components/buttons/GitHubButton.tsx","impl/components/buttons/LinkedInButton.tsx","webpack://sverg84.github.io/./src/impl/styles/body/buttons/resume.module.scss?5a4c","impl/components/buttons/ResumeButton.tsx","impl/hooks/usePageColorButtonStyle.ts","impl/components/body/about/AboutMeCardFooter.tsx","impl/components/body/about/AboutMeCard.tsx","webpack://sverg84.github.io/./src/impl/styles/body/experience/card.module.scss?9595","impl/components/body/BodyCard.tsx","webpack://sverg84.github.io/./src/impl/styles/body/experience/timeline.module.scss?0093","webpack://sverg84.github.io/./src/impl/styles/body/experience/timelineItem.module.scss?2c42","webpack://sverg84.github.io/./src/impl/styles/body/experience/skillsList.module.scss?e95e","impl/components/body/experience/ExperienceTimelineSkillsList.tsx","impl/components/body/experience/ExperienceTimelineItem.tsx","impl/hooks/useBorderColorStyle.ts","impl/components/body/experience/ExperienceTimeline.tsx","impl/components/body/experience/ExperienceCard.tsx","impl/consts/EventKeys.ts","webpack://sverg84.github.io/./src/impl/styles/body/skills/item.module.scss?a30c","impl/components/body/skills/SkillsItemToggle.tsx","impl/components/body/skills/SkillsItem.tsx","impl/components/body/skills/SkillsCard.tsx","impl/components/body/JobSeekerBody.tsx","impl/components/nav/JobSeekerNavWrapper.tsx","impl/components/AppJobSeeker.tsx","webpack://sverg84.github.io/./src/impl/styles/tooltip.module.scss?f869","impl/components/AppTooltip.tsx","webpack://sverg84.github.io/./src/impl/styles/nav/navbar.module.scss?5af6","webpack://sverg84.github.io/./src/impl/styles/nav/colorPicker.module.scss?f351","impl/components/nav/PageNavColorPicker.tsx","impl/components/nav/PageNavLatestPushTimestamp.tsx","impl/components/nav/PageNavBar.tsx","impl/components/Page.tsx","webpack://sverg84.github.io/./src/impl/styles/pageBody.module.scss?5416","impl/components/body/PageBody.tsx","impl/components/body/about/AboutMeCardLazyImage.tsx","impl/components/body/about/AboutMeCardBodyContainer.tsx","impl/components/buttons/ExternalLinkButton.tsx","impl/consts/MyName.ts","impl/contexts/ColorContext.ts","impl/hooks/useBackgroundColorStyle.ts","impl/hooks/useColorStyle.ts","impl/hooks/useHover.ts","impl/hooks/useTextColorForCustomBackground.ts","impl/utils/lazyWithPreload.ts","webpack://sverg84.github.io/./src/impl/styles/body/about/aboutMeCardBody.module.scss?747a","webpack://sverg84.github.io/./src/impl/styles/body/about/footer.module.scss?b32c","webpack://sverg84.github.io/./src/impl/styles/body/buttons/linkButton.module.scss?4ee4","webpack://sverg84.github.io/./src/impl/styles/pageMargin.module.scss?e8bc"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"bg\":\"background_bg__rHR4m\",\"bg3\":\"background_bg3__WZ4Pm\",\"bg2\":\"background_bg2__XB2Tl\",\"slide\":\"background_slide__Sq8xw\"};","import * as React from 'react';\n\nimport useBackgroundStyle from '../hooks/useBackgroundStyle';\nimport styles from '../styles/background.module.scss';\n\nexport default function AppBackground(): React.JSX.Element {\n\tconst color = useBackgroundStyle();\n\treturn (\n\t\t<>\n\t\t\t{[styles.bg, styles.bg2, styles.bg3].map(bg => (\n\t\t\t\t\n\t\t\t))}\n\t\t>\n\t);\n}\n","import { useContext } from 'react';\n\nimport ColorContext from '../contexts/ColorContext';\n\nexport default function useBackgroundStyle(): React.CSSProperties {\n\tconst {color} = useContext(ColorContext);\n\treturn {backgroundImage: `linear-gradient(-60deg, ${color} 50%, white 50%)`};\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"bold\":\"text_bold__TiUuq\",\"italic\":\"text_italic__fvjzk\"};","import classNames from 'classnames';\nimport moment from 'moment';\nimport * as React from 'react';\nimport Card from 'react-bootstrap/esm/Card';\nimport { Link } from 'react-router-dom';\n\nimport MyName from '../../../consts/MyName';\nimport useColorStyle from '../../../hooks/useColorStyle';\nimport styles from '../../../styles/body/about/text.module.scss';\n\nconst BIRTHDATE: Date = new Date('1998-05-06T10:47:00.000-06:00'); // 6 May 1998 11:47 A.M. US Central Time\n\nfunction Language({language}: {language: string}): React.JSX.Element {\n\tconst color = useColorStyle();\n\treturn (\n\t\t\n\t\t\t{language}\n\t\t\n\t);\n}\n\nexport default function AboutMeText(): React.JSX.Element {\n\tconst color = useColorStyle();\n\tconst age = moment.duration(moment().diff(BIRTHDATE)).years();\n\n\treturn (\n\t\t<>\n\t\t\t\n\t\t\t\tAbout Me\n\t\t\t\n\t\t\t\n\t\t\t\tFront-End Software Engineer, Web Developer\n\t\t\t\n\t\t\t\n\t\t\t\tHi there! My name is{' '}\n\t\t\t\t\n\t\t\t\t\t{MyName}\n\t\t\t\t\n\t\t\t\t. I am a {age} year-old software engineer with a fondness for user\n\t\t\t\tinterface and user experience (UI/UX) development.\n\t\t\t\n\t\t\t\n\t\t\t\tI started learning to code during my senior year of high school when I\n\t\t\t\ttook an introduction course to {} on a whim,\n\t\t\t\tand I loved learning as much as I could since then! Throughout my time\n\t\t\t\tat university, I applied myself to a substantial amount of coursework in{' '}\n\t\t\t\t{} and {} with\n\t\t\t\ta splash of {},{' '}\n\t\t\t\t{}, and {}.\n\t\t\t\n\t\t\t\n\t\t\t\tAll of my full-time experience (as of Summer 2023) stems from my time at\n\t\t\t\tMeta where I challenged myself further in exploring web programming,\n\t\t\t\tlearning {} and{' '}\n\t\t\t\t{} for the first time in a rigorous,\n\t\t\t\tfast-paced environment.\n\t\t\t\n\t\t\t\n\t\t\t\tSince parting with Meta, I have been self-teaching{' '}\n\t\t\t\t{} in order to keep my UI-building\n\t\t\t\tskills fresh, replete with {} modules.\n\t\t\t\n\t\t\t\n\t\t\t\tClick{' '}\n\t\t\t\t{\n\t\t\t\t\t\n\t\t\t\t\t\there\n\t\t\t\t\t\n\t\t\t\t}{' '}\n\t\t\t\tif you would like to learn more about me beyond my career!\n\t\t\t\n\t\t>\n\t);\n}\n","import * as React from 'react';\n\nimport MyName from '../../../consts/MyName';\nimport AboutMeCardBodyContainer from './AboutMeCardBodyContainer';\nimport AboutMeText from './AboutMeText';\n\nexport default function AboutMeCardBody(): React.JSX.Element {\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"button\":\"email_button__FW+sr\"};","import { solid } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport * as React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport useHover from '../../hooks/useHover';\nimport styles from '../../styles/body/buttons/email.module.scss';\n\nexport default function EmailButton(): React.JSX.Element {\n\tconst {isHovering, ...mouseEvents} = useHover();\n\n\treturn (\n\t\t\n\t);\n}\n","import { brands } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport * as React from 'react';\n\nimport styles from '../../styles/body/buttons/linkButton.module.scss';\nimport ExternalLinkButton from './ExternalLinkButton';\n\nexport default function GitHubButton(): React.JSX.Element {\n\treturn (\n\t\t\n\t);\n}\n","import { brands } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport * as React from 'react';\n\nimport styles from '../../styles/body/buttons/linkButton.module.scss';\nimport ExternalLinkButton from './ExternalLinkButton';\n\nexport default function LinkedInButton(): React.JSX.Element {\n\treturn (\n\t\t\n\t);\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"resume\":\"resume_resume__92JEE\"};","import { solid } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport * as React from 'react';\nimport Button from 'react-bootstrap/Button';\n\nimport useHover from '../../hooks/useHover';\nimport usePageColorButtonStyle from '../../hooks/usePageColorButtonStyle';\nimport styles from '../../styles/body/buttons/resume.module.scss';\n\nexport default function ResumeButton(): React.JSX.Element {\n\tconst {isHovering, ...mouseEvents} = useHover();\n\tconst style = usePageColorButtonStyle(isHovering);\n\n\treturn (\n\t\t\n\t);\n}\n","import * as React from 'react';\n\nimport ColorContext from '../contexts/ColorContext';\nimport useTextColorForCustomBackground from './useTextColorForCustomBackground';\n\nexport default function usePageColorButtonStyle(\n\tisHovering: boolean,\n): React.CSSProperties {\n\tconst {color} = React.useContext(ColorContext);\n\tconst hoverTextColor = useTextColorForCustomBackground();\n\n\tconst borderAndTextColor = isHovering ? hoverTextColor : color;\n\n\treturn {\n\t\tbackgroundColor: isHovering ? color : undefined,\n\t\tborderColor: borderAndTextColor,\n\t\tboxShadow: `4px 4px ${color}`,\n\t\tcolor: borderAndTextColor,\n\t};\n}\n","import * as React from 'react';\nimport Card from 'react-bootstrap/Card';\nimport Col from 'react-bootstrap/Col';\nimport Row from 'react-bootstrap/Row';\n\nimport styles from '../../../styles/body/about/footer.module.scss';\nimport EmailButton from '../../buttons/EmailButton';\nimport GitHubButton from '../../buttons/GitHubButton';\nimport LinkedInButton from '../../buttons/LinkedInButton';\nimport ResumeButton from '../../buttons/ResumeButton';\n\nexport default function AboutMeCardFooter(): React.JSX.Element {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n}\n","import * as React from 'react';\nimport Card from 'react-bootstrap/Card';\n\nimport AboutMeCardBody from './AboutMeCardBody';\nimport AboutMeCardFooter from './AboutMeCardFooter';\n\nexport default function AboutMeCard(): React.JSX.Element {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t);\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"header\":\"card_header__C3ziB\"};","import * as React from 'react';\nimport Card from 'react-bootstrap/Card';\n\nimport useColorStyle from '../../hooks/useColorStyle';\nimport styles from '../../styles/body/experience/card.module.scss';\n\ntype Props = Readonly<{\n\tchildren: React.JSX.Element;\n\tid?: string;\n\ttitle: string;\n}>;\n\nexport default function BodyCard({\n\tchildren,\n\tid,\n\ttitle,\n}: Props): React.JSX.Element {\n\tconst color = useColorStyle();\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{title}\n\t\t\t\n\t\t\t{children}\n\t\t\n\t);\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"timeline\":\"timeline_timeline__VfjcF\",\"bar\":\"timeline_bar__V3BAE\"};","// extracted by mini-css-extract-plugin\nexport default {\"item\":\"timelineItem_item__005F5\",\"circle\":\"timelineItem_circle__ADJyP\",\"in\":\"timelineItem_in__PSeNd\",\"fadeInLeft\":\"timelineItem_fadeInLeft__vvxlT\",\"content\":\"timelineItem_content__izpwq\",\"fadeInRight\":\"timelineItem_fadeInRight__uPKi+\",\"header\":\"timelineItem_header__H24TC\",\"tag\":\"timelineItem_tag__k8jMy\"};","// extracted by mini-css-extract-plugin\nexport default {\"list\":\"skillsList_list__-3yy3\",\"skills\":\"skillsList_skills__Q4+OB\"};","import * as React from 'react';\n\nimport styles from '../../../styles/body/experience/skillsList.module.scss';\n\ntype Props = Readonly<{\n\tskillsList: ReadonlyArray;\n\tstyle?: React.CSSProperties;\n}>;\n\nexport default function ExperienceTimelineSkillsList({\n\tskillsList,\n\tstyle,\n}: Props): React.JSX.Element {\n\treturn (\n\t\t
\n\t);\n}\n","import * as React from 'react';\n\nimport ColorContext from '../contexts/ColorContext';\n\nexport default function useBorderColorStyle(): React.CSSProperties {\n\tconst {color} = React.useContext(ColorContext);\n\n\treturn {borderColor: color};\n}\n","import * as React from 'react';\n\nimport useBackgroundColorStyle from '../../../hooks/useBackgroundColorStyle';\nimport styles from '../../../styles/body/experience/timeline.module.scss';\nimport AppTooltip from '../../AppTooltip';\nimport ExperienceTimelineItem from './ExperienceTimelineItem';\n\nexport type TimelineItemData = Readonly<{\n\tdescription: React.JSX.Element;\n\tskillsList: ReadonlyArray;\n\tsrc: string;\n\ttag: string;\n\ttimeframe: string;\n\ttitle: string;\n}>;\n\nconst items: ReadonlyArray = [\n\t{\n\t\tdescription: (\n\t\t\t
\n\t\t\t\tFull-stack product software engineer (PHP/Hack and JS/React) for the Org\n\t\t\t\tEffectiveness team within the Enterprise Engineering division. Released\n\t\t\t\tmultiple high-priority stakeholder feature requests pertaining to\n\t\t\t\tHR-sensitive employee data. Leader of team app performance optimization\n\t\t\t\topportunities.\n\t\t\t
\n\t\t\t\tIntern for the Traffic Analytics team within the Infrastructure\n\t\t\t\tdivision. Created monitoring tool for team oncall to measure network\n\t\t\t\tpacket failures with interactive web page.\n\t\t\t
\n\t\t\t\tAssistant at the university's Transportation Research Institute as part\n\t\t\t\tof the Undergraduate Research Opportunity Program (UROP). Participated\n\t\t\t\tin{' '}\n\t\t\t\t{' '}\n\t\t\t\tstudy for Defence Research & Development Canada (DRDC).\n\t\t\t
\n\t\t),\n\t\tskillsList: ['MATLAB', 'Wolfram Mathematica'],\n\t\tsrc: '/umich.jpeg',\n\t\ttag: 'University of Michigan',\n\t\ttimeframe: '2016-2017',\n\t\ttitle: 'Research Assistant',\n\t},\n];\n\nexport default function ExperienceTimeline(): React.JSX.Element {\n\tconst color = useBackgroundColorStyle();\n\treturn (\n\t\t
\n\t);\n}\n","import * as React from 'react';\n\nimport BodyCard from '../BodyCard';\nimport ExperienceTimeline from './ExperienceTimeline';\n\nexport default function ExperienceCard(): React.JSX.Element {\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n}\n","const EventKeys = {\n\tcpp: 'C++',\n\tcsharp: 'C#',\n\tgraphql: 'GraphQL',\n\thack: 'Hack',\n\tmysql: 'MySQL',\n\tpython: 'Python',\n\treact: 'React',\n\ttypescript: 'TypeScript',\n} as const;\n\nexport default EventKeys;\n","// extracted by mini-css-extract-plugin\nexport default {\"button\":\"item_button__GmSRm\",\"expand\":\"item_expand__4Sxrl\",\"firstExpand\":\"item_firstExpand__kSWZa\",\"collapse\":\"item_collapse__JYgde\",\"header\":\"item_header__w8Yjy\"};","import { solid } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { AccordionContext, useAccordionButton } from 'react-bootstrap';\n\nimport EventKeys from '../../../consts/EventKeys';\nimport useBackgroundColorStyle from '../../../hooks/useBackgroundColorStyle';\nimport styles from '../../../styles/body/skills/item.module.scss';\n\ntype Props = Readonly<{\n\teventKey: string;\n}>;\n\nexport default function SkillsItemToggle({eventKey}: Props): React.JSX.Element {\n\tconst {activeEventKey} = React.useContext(AccordionContext);\n\tconst color = useBackgroundColorStyle();\n\tconst onClick = useAccordionButton(eventKey);\n\n\tconst isCurrentEventKey = activeEventKey === eventKey;\n\n\tconst classnames: Array = [];\n\n\tif (isCurrentEventKey) {\n\t\tclassnames.push(\n\t\t\teventKey === EventKeys.react ? styles.firstExpand : styles.expand,\n\t\t);\n\t} else {\n\t\tclassnames.push(styles.collapse);\n\t}\n\n\treturn (\n\t\t\n\t);\n}\n","import * as React from 'react';\nimport AccordionCollapse from 'react-bootstrap/esm/AccordionCollapse';\nimport AccordionItem from 'react-bootstrap/esm/AccordionItem';\nimport Card from 'react-bootstrap/esm/Card';\n\nimport SkillsItemToggle from './SkillsItemToggle';\n\ntype Props = Readonly<{\n\tchildren: React.ReactNode;\n\teventKey: string;\n}>;\n\nexport default function SkillsItem({\n\tchildren,\n\teventKey,\n}: Props): React.JSX.Element {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{children}\n\t\t\t\n\t\t\n\t);\n}\n","import * as React from 'react';\nimport Accordion from 'react-bootstrap/Accordion';\n\nimport EventKeys from '../../../consts/EventKeys';\nimport BodyCard from '../BodyCard';\nimport SkillsItem from './SkillsItem';\n\nexport default function SkillsCard(): React.JSX.Element {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\tRamped up on React skills while transitioning from web infra (PHP) to\n\t\t\t\t\tUI programming in my full-time position at Meta. Developed an\n\t\t\t\t\texpertise in applying Hooks, code-splitting APIs, and React18\n\t\t\t\t\tconcurrency features to create seamless user experiences while\n\t\t\t\t\toptimizing app/page performance. Expanding upon Meta-internal skills\n\t\t\t\t\twith public React app building (e.g., this web page!).\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tSelf-taught during the summer of 2023 in order to create a modern\n\t\t\t\t\tReact app at home while still enforcing type safety. Very similar to\n\t\t\t\t\tMeta's \"Flow\" but with broader appeal.\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tFirst programming language learned while working full-time at Meta.\n\t\t\t\t\tBuilt multiple scalable features by focusing on asynchronous\n\t\t\t\t\tprogramming. Moved to implementing GraphQL queries and mutations on\n\t\t\t\t\tthe server side in addition to server-calling React routes and their\n\t\t\t\t\tcorresponding components.\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tLearned back-end GraphQL field implementation skills while learning\n\t\t\t\t\tHack, and gained client-side GraphQL experience in tandem with coding\n\t\t\t\t\tin React while full-time at Meta.\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tDatabase management skills applied during both the internship and\n\t\t\t\t\tfull-time Meta experiences. MySQL queries created for mass aggregates\n\t\t\t\t\tof traffic data in C++/Python, queries and mutations optimized for\n\t\t\t\t\temployee directory information in Hack.\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tFirst applied in class projects around web development (e.g., Flask,\n\t\t\t\t\tJinja, REST) while at the University of Michigan, later used to create\n\t\t\t\t\tdata pipeline jobs for traffic aggregation as an intern at Meta.\n\t\t\t\t\tPresently, using FastAPI and PostgreSQL for personal projects.\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tFirst programming language learned as an undergraduate at the\n\t\t\t\t\tUniversity of Michigan. Used for package building and app compression\n\t\t\t\t\twhile coding as a Meta intern. Skills in asynchronous programming\n\t\t\t\t\t(e.g., threads, mutexes, semaphores, etc.) and file system management\n\t\t\t\t\tas part of a course on operating systems.\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tOnboarded as part of university senior capstone project at Michigan.\n\t\t\t\t\tGained experience in C# in order to create a video game as part of a\n\t\t\t\t\tteam of four (4) using the Unity game engine.\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n}\n","import * as React from 'react';\n\nimport AboutMeCard from './about/AboutMeCard';\nimport ExperienceCard from './experience/ExperienceCard';\nimport PageBody from './PageBody';\nimport SkillsCard from './skills/SkillsCard';\n\nexport default function JobSeekerBody(): React.JSX.Element {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t);\n}\n","import * as React from 'react';\n\nconst SCREEN_WIDTH_BREAKPOINT = 835;\n\nexport default function JobSeekerNavWrapper(): React.JSX.Element | null {\n\tconst [isDesktop, setIsDesktop] = React.useState(\n\t\twindow.innerWidth > SCREEN_WIDTH_BREAKPOINT,\n\t);\n\n\tconst [Module, setModule] = React.useState React.JSX.Element\n\t> | null>(null);\n\n\tconst updateMedia = () => {\n\t\tsetIsDesktop(window.innerWidth > SCREEN_WIDTH_BREAKPOINT);\n\t};\n\n\tReact.useEffect(() => {\n\t\twindow.addEventListener('resize', updateMedia);\n\t\treturn () => window.removeEventListener('resize', updateMedia);\n\t}, []);\n\n\tReact.useEffect(() => {\n\t\tconst conditionalImport = async () => {\n\t\t\tsetModule(\n\t\t\t\tReact.lazy(\n\t\t\t\t\tasync () =>\n\t\t\t\t\t\tawait (isDesktop\n\t\t\t\t\t\t\t? import('./JobSeekerNavBreadcrumbs')\n\t\t\t\t\t\t\t: import('./JobSeekerNavDropdown')),\n\t\t\t\t),\n\t\t\t);\n\t\t};\n\t\tconditionalImport();\n\t}, [isDesktop]);\n\n\treturn Module != null ? (\n\t\t\n\t\t\t\n\t\t\n\t) : null;\n}\n","import * as React from 'react';\n\nimport AppBackground from './AppBackground';\nimport JobSeekerBody from './body/JobSeekerBody';\nimport JobSeekerNavWrapper from './nav/JobSeekerNavWrapper';\nimport Page from './Page';\n\nexport function Component(): React.JSX.Element {\n\treturn (\n\t\t}\n\t\t\tbreadcrumbs={}>\n\t\t\t\n\t\t\n\t);\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"tooltip\":\"tooltip_tooltip__5pJPW\"};","import * as React from 'react';\nimport OverlayTrigger from 'react-bootstrap/OverlayTrigger';\nimport Tooltip from 'react-bootstrap/Tooltip';\nimport { useInView } from 'react-intersection-observer';\n\nimport styles from '../styles/tooltip.module.scss';\n\ntype Props = Readonly<{\n\tcontent: string;\n\ttooltip: string;\n}>;\n\nexport default function AppTooltip({\n\tcontent,\n\ttooltip,\n}: Props): React.JSX.Element {\n\tconst {ref, entry} = useInView({\n\t\trootMargin: '-50% 0px 0px',\n\t});\n\n\treturn (\n\t\t{tooltip}}>\n\t\t\t{content}\n\t\t\n\t);\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"brand\":\"navbar_brand__zDvLc\",\"navbar\":\"navbar_navbar__pEuvw\",\"pushTime\":\"navbar_pushTime__jdH3p\",\"rightContent\":\"navbar_rightContent__ikOZ0\"};","// extracted by mini-css-extract-plugin\nexport default {\"fallback\":\"colorPicker_fallback__pvhTA\"};","import { solid } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport * as React from 'react';\nimport NavDropdown from 'react-bootstrap/esm/NavDropdown';\nimport Spinner from 'react-bootstrap/Spinner';\n\nimport styles from '../../styles/nav/colorPicker.module.scss';\nimport lazyWithPreload from '../../utils/lazyWithPreload.ts';\n\nconst PageNavColorPickerMenu = lazyWithPreload(() =>\n\timport('./PageNavColorPickerMenu.tsx'),\n);\n\nexport default function PageNavColorPicker(): React.JSX.Element {\n\tconst onMouseEnter = () => {\n\t\tPageNavColorPickerMenu.preload();\n\t};\n\n\treturn (\n\t\t\n\t\t\t}\n\t\t\tonMouseEnter={onMouseEnter}>\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}>\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n}\n","import * as React from 'react';\n\nimport AppTooltip from '../AppTooltip';\n\n// https://stackoverflow.com/questions/6108819/javascript-timestamp-to-relative-time\nconst RTF = new Intl.RelativeTimeFormat(undefined, {numeric: 'auto'});\n\nconst UNITS: {unit: Intl.RelativeTimeFormatUnit; ms: number}[] = [\n\t{unit: 'year', ms: 31536000000},\n\t{unit: 'month', ms: 2628000000},\n\t{unit: 'day', ms: 86400000},\n\t{unit: 'hour', ms: 3600000},\n\t{unit: 'minute', ms: 60000},\n\t{unit: 'second', ms: 1000},\n];\n\nfunction relativeTimeFromElapsed(elapsed: number): string {\n\tfor (const {unit, ms} of UNITS) {\n\t\tif (Math.abs(elapsed) >= ms || unit === 'second') {\n\t\t\treturn RTF.format(Math.round(elapsed / ms), unit);\n\t\t}\n\t}\n\treturn '';\n}\n\nexport default function PageNavLatestPushTimestamp(): React.JSX.Element | null {\n\tconst [lastUpdatedTime, setLastUpdatedTime] = React.useState(\n\t\tnull,\n\t);\n\n\tReact.useEffect(() => {\n\t\tconst fetchTime = async () => {\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(\n\t\t\t\t\t'https://api.github.com/repos/sverg84/sverg84.github.io',\n\t\t\t\t);\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`${response.status}: ${response.statusText}`);\n\t\t\t\t}\n\t\t\t\tconst data = await response.json();\n\t\t\t\tconst updateTime: string = data['pushed_at'];\n\t\t\t\tsetLastUpdatedTime(new Date(updateTime));\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(error);\n\t\t\t}\n\t\t};\n\n\t\tfetchTime();\n\t}, []);\n\n\tif (lastUpdatedTime == null) {\n\t\treturn null;\n\t}\n\n\tconst timeSinceLastUpdate = lastUpdatedTime.getTime() - new Date().getTime();\n\n\treturn (\n\t\t<>\n\t\t\tLast Updated:{' '}\n\t\t\t\n\t\t>\n\t);\n}\n","import classNames from 'classnames';\nimport * as React from 'react';\nimport Container from 'react-bootstrap/Container';\nimport Col from 'react-bootstrap/esm/Col';\nimport Navbar from 'react-bootstrap/Navbar';\nimport { Link } from 'react-router-dom';\n\nimport MyName from '../../consts/MyName.ts';\nimport useBackgroundColorStyle from '../../hooks/useBackgroundColorStyle.ts';\nimport navStyles from '../../styles/nav/navbar.module.scss';\nimport pageStyles from '../../styles/pageMargin.module.scss';\nimport PageNavColorPicker from './PageNavColorPicker.tsx';\nimport PageNavLatestPushTimestamp from './PageNavLatestPushTimestamp.tsx';\n\ntype Props = Readonly<{\n\tbreadcrumbs?: React.JSX.Element | undefined;\n}>;\n\nexport default function PageNavBar({breadcrumbs}: Props): React.JSX.Element {\n\tconst style = useBackgroundColorStyle();\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t{breadcrumbs}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n}\n","import * as React from 'react';\nimport { useState } from 'react';\n\nimport ColorContext from '../contexts/ColorContext';\nimport PageNavBar from './nav/PageNavBar';\n\ntype Props = Readonly<{\n\tbackground: React.JSX.Element;\n\tbreadcrumbs?: React.JSX.Element;\n\tchildren: React.ReactNode;\n}>;\n\nexport default function Page({\n\tbackground,\n\tbreadcrumbs,\n\tchildren,\n}: Props): React.JSX.Element {\n\tconst [hex, setHex] = useState('#2e3134');\n\n\treturn (\n\t\t\n\t\t\t{background}\n\t\t\t\n\t\t\t{children}\n\t\t\n\t);\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"body\":\"pageBody_body__aNOKo\"};","import classNames from 'classnames';\nimport * as React from 'react';\n\nimport pageBodyStyles from '../../styles/pageBody.module.scss';\nimport pageStyles from '../../styles/pageMargin.module.scss';\n\ntype Props = Readonly<{\n\tchildren: React.ReactNode;\n}>;\n\nexport default function PageBody({children}: Props): React.JSX.Element {\n\treturn (\n\t\t
\n\t\t\t{children}\n\t\t
\n\t);\n}\n","import * as React from 'react';\nimport Placeholder from 'react-bootstrap/esm/Placeholder';\n\nimport styles from '../../../styles/body/about/aboutMeCardBody.module.scss';\nimport type { Props as ImageProps } from '../about/AboutMeCardImage';\n\nconst AboutMeCardImage = React.lazy(\n\tasync () => await import('../about/AboutMeCardImage'),\n);\n\nexport default function AboutMeCardLazyImage(\n\tprops: ImageProps,\n): React.JSX.Element {\n\treturn (\n\t\t\n\t\t\t}>\n\t\t\t\n\t\t\n\t);\n}\n","import * as React from 'react';\nimport Card from 'react-bootstrap/Card';\nimport Col from 'react-bootstrap/Col';\nimport Container from 'react-bootstrap/Container';\nimport Row from 'react-bootstrap/Row';\n\nimport styles from '../../../styles/body/about/aboutMeCardBody.module.scss';\nimport type { Props as ImageProps } from './AboutMeCardImage';\nimport AboutMeCardLazyImage from './AboutMeCardLazyImage';\n\ntype Props = Readonly<{\n\tchildren: React.JSX.Element;\n}> &\n\tImageProps;\n\nexport default function AboutMeCardBodyContainer({\n\tchildren,\n\t...imageProps\n}: Props): React.JSX.Element {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t
{children}\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n}\n","import { IconProp } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport * as React from 'react';\nimport Button from 'react-bootstrap/Button';\n\nimport useHover from '../../hooks/useHover';\n\ntype Props = Readonly<{\n\tclassName?: string;\n\thref: string;\n\ticon: IconProp;\n}>;\n\nexport default function ExternalLinkButton({\n\tclassName,\n\thref,\n\ticon,\n}: Props): React.JSX.Element {\n\tconst {isHovering: _isHovering, ...mouseEvents} = useHover();\n\n\treturn (\n\t\t\n\t);\n}\n","const MyName: string = \"Stephen Vergara\";\n\nexport default MyName;\n","import { createContext } from 'react';\n\ntype ContextType = Readonly<{\n\tcolor: string;\n\tsetColor: React.Dispatch>;\n}>;\n\nexport default createContext({\n\tcolor: '#2e3134',\n\tsetColor: () => {},\n});\n","import * as React from 'react';\n\nimport ColorContext from '../contexts/ColorContext';\nimport useTextColorForCustomBackground from './useTextColorForCustomBackground';\n\nexport default function useBackgroundColorStyle(\n\talpha: string = '',\n): React.CSSProperties {\n\tconst {color} = React.useContext(ColorContext);\n\tconst textColor = useTextColorForCustomBackground();\n\n\treturn {backgroundColor: `${color}${alpha}`, color: textColor};\n}\n","import * as React from 'react';\n\nimport ColorContext from '../contexts/ColorContext';\n\nexport default function useColorStyle(): React.CSSProperties {\n const {color} = React.useContext(ColorContext);\n\n return {color};\n}","import * as React from 'react';\n\ntype ReturnType = Readonly<{\n\tisHovering: boolean;\n\tonMouseEnter: () => void;\n\tonMouseLeave: () => void;\n}>;\n\nexport default function useHover(): ReturnType {\n\tconst [isHovering, setIsHovering] = React.useState(false);\n\n\tconst onMouseEnter = () => {\n\t\tsetIsHovering(true);\n\t};\n\n\tconst onMouseLeave = () => {\n\t\tsetIsHovering(false);\n\t};\n\n\treturn {isHovering, onMouseEnter, onMouseLeave};\n}\n","import * as React from 'react';\n\nimport ColorContext from '../contexts/ColorContext';\n\nconst BRIGHTNESS_THRESHOLD = 128;\n\n// NTSC luminance formula (linear approximation): Y = .299r' + .587g' + .114b'\nconst RED_LUMINANCE_COEFFICIENT = 0.299;\nconst GREEN_LUMINANCE_COEFFICIENT = 0.587;\nconst BLUE_LUMINANCE_COEFFICIENT = 0.114;\n\nexport default function useTextColorForCustomBackground(): string {\n\tconst {color} = React.useContext(ColorContext);\n\n\treturn React.useMemo(() => {\n\t\tconst getChunksFromString = (st: string, chunkSize: number) =>\n\t\t\tst.match(new RegExp(`.{${chunkSize}}`, 'g'));\n\n\t\tconst convertHexUnitTo256 = (hexStr: string) =>\n\t\t\tparseInt(hexStr.repeat(2 / hexStr.length), 16);\n\n\t\tconst chunkSize = Math.floor((color.length - 1) / 3);\n\t\tconst hexArr = getChunksFromString(color.slice(1), chunkSize);\n\n\t\tconst [red, green, blue] = (hexArr ?? []).map(convertHexUnitTo256);\n\n\t\tconst brightness = Math.round(\n\t\t\t(red ?? 0) * RED_LUMINANCE_COEFFICIENT +\n\t\t\t\t(green ?? 0) * GREEN_LUMINANCE_COEFFICIENT +\n\t\t\t\t(blue ?? 0) * BLUE_LUMINANCE_COEFFICIENT,\n\t\t);\n\n\t\treturn brightness > BRIGHTNESS_THRESHOLD ? 'black' : 'white';\n\t}, [color]);\n}\n","import * as React from 'react';\n\ninterface PreloadedExoticComponent>\n\textends React.LazyExoticComponent {\n\tpreload: () => {};\n}\n\nexport default function lazyWithPreload>(\n\tfactory: () => Promise<{\n\t\tdefault: T;\n\t}>,\n): PreloadedExoticComponent {\n\treturn Object.assign(React.lazy(factory), {preload: factory});\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"body\":\"aboutMeCardBody_body__px0Z-\",\"base\":\"aboutMeCardBody_base__HWSO5\",\"image\":\"aboutMeCardBody_image__r0pwR\",\"glimmer\":\"aboutMeCardBody_glimmer__ztngv\",\"imageColumn\":\"aboutMeCardBody_imageColumn__Decwz\"};","// extracted by mini-css-extract-plugin\nexport default {\"buttons\":\"footer_buttons__X-wEA\",\"resume\":\"footer_resume__j2AKe\"};","// extracted by mini-css-extract-plugin\nexport default {\"github\":\"linkButton_github__ltM-y\",\"linkedin\":\"linkButton_linkedin__MRpaF\",\"steam\":\"linkButton_steam__qizUa\",\"discord\":\"linkButton_discord__zToU1\"};","// extracted by mini-css-extract-plugin\nexport default {\"page\":\"pageMargin_page__oYkHI\"};"],"names":["AppBackground","color","useContext","ColorContext","backgroundImage","concat","useBackgroundStyle","_jsx","_Fragment","children","styles","bg","bg2","bg3","map","className","style","BIRTHDATE","Date","Language","_ref","language","useColorStyle","bold","AboutMeText","age","moment","diff","years","_jsxs","Card","Text","as","classNames","italic","MyName","Link","to","AboutMeCardBody","AboutMeCardBodyContainer","alt","src","EmailButton","isHovering","mouseEvents","useHover","Button","button","href","FontAwesomeIcon","fade","icon","_faEnvelope","size","GitHubButton","ExternalLinkButton","github","_faGithub","LinkedInButton","linkedin","_faLinkedin","ResumeButton","React","hoverTextColor","useTextColorForCustomBackground","borderAndTextColor","backgroundColor","undefined","borderColor","boxShadow","usePageColorButtonStyle","resume","target","variant","beat","_faDownload","AboutMeCardFooter","Footer","Row","xs","sm","md","lg","Col","buttons","AboutMeCard","id","BodyCard","title","Header","header","Body","ExperienceTimelineSkillsList","skillsList","list","skills","join","ExperienceTimelineItem","data","isOdd","background","useBackgroundColorStyle","border","useBorderColorStyle","inView","ref","useInView","triggerOnce","rootMargin","tag","time","timeframe","item","content","in","loading","width","description","circle","items","AppTooltip","tooltip","ExperienceTimeline","timeline","bar","idx","ExperienceCard","cpp","csharp","graphql","hack","mysql","python","react","typescript","SkillsItemToggle","eventKey","activeEventKey","AccordionContext","onClick","useAccordionButton","isCurrentEventKey","classnames","push","EventKeys","firstExpand","expand","collapse","_faChevronUp","_faChevronDown","SkillsItem","AccordionItem","AccordionCollapse","SkillsCard","Accordion","defaultActiveKey","JobSeekerBody","PageBody","SCREEN_WIDTH_BREAKPOINT","JobSeekerNavWrapper","isDesktop","setIsDesktop","window","innerWidth","Module","setModule","updateMedia","addEventListener","removeEventListener","async","conditionalImport","fallback","Component","Page","breadcrumbs","entry","OverlayTrigger","placement","isIntersecting","overlay","Tooltip","PageNavColorPickerMenu","lazyWithPreload","PageNavColorPicker","NavDropdown","align","renderMenuOnMount","_faPalette","bounce","onMouseEnter","preload","Spinner","animation","RTF","Intl","RelativeTimeFormat","numeric","UNITS","unit","ms","relativeTimeFromElapsed","elapsed","Math","abs","format","round","PageNavLatestPushTimestamp","lastUpdatedTime","setLastUpdatedTime","response","fetch","ok","Error","status","statusText","updateTime","json","error","console","warn","fetchTime","timeSinceLastUpdate","getTime","toLocaleString","PageNavBar","Navbar","sticky","Container","pageStyles","page","navStyles","navbar","brand","pushTime","rightContent","hex","setHex","useState","Provider","value","setColor","pageBodyStyles","body","AboutMeCardImage","AboutMeCardLazyImage","props","Placeholder","glimmer","imageProps","imageColumn","xl","_isHovering","createContext","alpha","arguments","length","textColor","setIsHovering","onMouseLeave","BRIGHTNESS_THRESHOLD","RED_LUMINANCE_COEFFICIENT","GREEN_LUMINANCE_COEFFICIENT","BLUE_LUMINANCE_COEFFICIENT","chunkSize","floor","hexArr","getChunksFromString","st","match","RegExp","slice","red","green","blue","hexStr","parseInt","repeat","factory","Object","assign"],"sourceRoot":""}
\ No newline at end of file
diff --git a/static/js/154.c895d1c8.chunk.js.map b/static/js/154.c895d1c8.chunk.js.map
index 12d3232..3dc48b3 100644
--- a/static/js/154.c895d1c8.chunk.js.map
+++ b/static/js/154.c895d1c8.chunk.js.map
@@ -1 +1 @@
-{"version":3,"file":"static/js/154.c895d1c8.chunk.js","mappings":"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","sources":["../node_modules/react-colorful/src/hooks/useEventCallback.ts","../node_modules/react-colorful/src/utils/clamp.ts","../node_modules/react-colorful/src/components/common/Interactive.tsx","../node_modules/react-colorful/src/utils/format.ts","../node_modules/react-colorful/src/components/common/Pointer.tsx","../node_modules/react-colorful/src/utils/round.ts","../node_modules/react-colorful/src/utils/convert.ts","../node_modules/react-colorful/src/components/common/Hue.tsx","../node_modules/react-colorful/src/components/common/Saturation.tsx","../node_modules/react-colorful/src/utils/compare.ts","../node_modules/react-colorful/src/hooks/useColorManipulation.ts","../node_modules/react-colorful/src/utils/nonce.ts","../node_modules/react-colorful/src/hooks/useIsomorphicLayoutEffect.ts","../node_modules/react-colorful/src/hooks/useStyleSheet.ts","../node_modules/react-colorful/src/components/common/ColorPicker.tsx","../node_modules/react-colorful/src/components/HexColorPicker.tsx","../node_modules/react-colorful/src/utils/validate.ts","../node_modules/react-colorful/src/components/common/ColorInput.tsx","../node_modules/react-colorful/src/components/HexColorInput.tsx","webpack://sverg84.github.io/./src/impl/styles/nav/colorPickerMenu.module.scss?0d60","impl/components/nav/PageNavColorPickerMenu.tsx"],"sourcesContent":["import { useRef } from \"react\";\n\n// Saves incoming handler to the ref in order to avoid \"useCallback hell\"\nexport function useEventCallback(handler?: (value: T) => void): (value: T) => void {\n const callbackRef = useRef(handler);\n const fn = useRef((value: T) => {\n callbackRef.current && callbackRef.current(value);\n });\n callbackRef.current = handler;\n\n return fn.current;\n}\n","// Clamps a value between an upper and lower bound.\n// We use ternary operators because it makes the minified code\n// 2 times shorter then `Math.min(Math.max(a,b),c)`\nexport const clamp = (number: number, min = 0, max = 1): number => {\n return number > max ? max : number < min ? min : number;\n};\n","import React, { useRef, useMemo, useEffect } from \"react\";\n\nimport { useEventCallback } from \"../../hooks/useEventCallback\";\nimport { clamp } from \"../../utils/clamp\";\n\nexport interface Interaction {\n left: number;\n top: number;\n}\n\n// Check if an event was triggered by touch\nconst isTouch = (event: MouseEvent | TouchEvent): event is TouchEvent => \"touches\" in event;\n\n// Finds a proper touch point by its identifier\nconst getTouchPoint = (touches: TouchList, touchId: null | number): Touch => {\n for (let i = 0; i < touches.length; i++) {\n if (touches[i].identifier === touchId) return touches[i];\n }\n return touches[0];\n};\n\n// Finds the proper window object to fix iframe embedding issues\nconst getParentWindow = (node?: HTMLDivElement | null): Window => {\n return (node && node.ownerDocument.defaultView) || self;\n};\n\n// Returns a relative position of the pointer inside the node's bounding box\nconst getRelativePosition = (\n node: HTMLDivElement,\n event: MouseEvent | TouchEvent,\n touchId: null | number\n): Interaction => {\n const rect = node.getBoundingClientRect();\n\n // Get user's pointer position from `touches` array if it's a `TouchEvent`\n const pointer = isTouch(event) ? getTouchPoint(event.touches, touchId) : (event as MouseEvent);\n\n return {\n left: clamp((pointer.pageX - (rect.left + getParentWindow(node).pageXOffset)) / rect.width),\n top: clamp((pointer.pageY - (rect.top + getParentWindow(node).pageYOffset)) / rect.height),\n };\n};\n\n// Browsers introduced an intervention, making touch events passive by default.\n// This workaround removes `preventDefault` call from the touch handlers.\n// https://github.com/facebook/react/issues/19651\nconst preventDefaultMove = (event: MouseEvent | TouchEvent): void => {\n !isTouch(event) && event.preventDefault();\n};\n\n// Prevent mobile browsers from handling mouse events (conflicting with touch ones).\n// If we detected a touch interaction before, we prefer reacting to touch events only.\nconst isInvalid = (event: MouseEvent | TouchEvent, hasTouch: boolean): boolean => {\n return hasTouch && !isTouch(event);\n};\n\ninterface Props {\n onMove: (interaction: Interaction) => void;\n onKey: (offset: Interaction) => void;\n children: React.ReactNode;\n}\n\nconst InteractiveBase = ({ onMove, onKey, ...rest }: Props) => {\n const container = useRef(null);\n const onMoveCallback = useEventCallback(onMove);\n const onKeyCallback = useEventCallback(onKey);\n const touchId = useRef(null);\n const hasTouch = useRef(false);\n\n const [handleMoveStart, handleKeyDown, toggleDocumentEvents] = useMemo(() => {\n const handleMoveStart = ({ nativeEvent }: React.MouseEvent | React.TouchEvent) => {\n const el = container.current;\n if (!el) return;\n\n // Prevent text selection\n preventDefaultMove(nativeEvent);\n\n if (isInvalid(nativeEvent, hasTouch.current) || !el) return;\n\n if (isTouch(nativeEvent)) {\n hasTouch.current = true;\n const changedTouches = nativeEvent.changedTouches || [];\n if (changedTouches.length) touchId.current = changedTouches[0].identifier;\n }\n\n el.focus();\n onMoveCallback(getRelativePosition(el, nativeEvent, touchId.current));\n toggleDocumentEvents(true);\n };\n\n const handleMove = (event: MouseEvent | TouchEvent) => {\n // Prevent text selection\n preventDefaultMove(event);\n\n // If user moves the pointer outside of the window or iframe bounds and release it there,\n // `mouseup`/`touchend` won't be fired. In order to stop the picker from following the cursor\n // after the user has moved the mouse/finger back to the document, we check `event.buttons`\n // and `event.touches`. It allows us to detect that the user is just moving his pointer\n // without pressing it down\n const isDown = isTouch(event) ? event.touches.length > 0 : event.buttons > 0;\n\n if (isDown && container.current) {\n onMoveCallback(getRelativePosition(container.current, event, touchId.current));\n } else {\n toggleDocumentEvents(false);\n }\n };\n\n const handleMoveEnd = () => toggleDocumentEvents(false);\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const keyCode = event.which || event.keyCode;\n\n // Ignore all keys except arrow ones\n if (keyCode < 37 || keyCode > 40) return;\n // Do not scroll page by arrow keys when document is focused on the element\n event.preventDefault();\n // Send relative offset to the parent component.\n // We use codes (37←, 38↑, 39→, 40↓) instead of keys ('ArrowRight', 'ArrowDown', etc)\n // to reduce the size of the library\n onKeyCallback({\n left: keyCode === 39 ? 0.05 : keyCode === 37 ? -0.05 : 0,\n top: keyCode === 40 ? 0.05 : keyCode === 38 ? -0.05 : 0,\n });\n };\n\n function toggleDocumentEvents(state?: boolean) {\n const touch = hasTouch.current;\n const el = container.current;\n const parentWindow = getParentWindow(el);\n\n // Add or remove additional pointer event listeners\n const toggleEvent = state ? parentWindow.addEventListener : parentWindow.removeEventListener;\n toggleEvent(touch ? \"touchmove\" : \"mousemove\", handleMove);\n toggleEvent(touch ? \"touchend\" : \"mouseup\", handleMoveEnd);\n }\n\n return [handleMoveStart, handleKeyDown, toggleDocumentEvents];\n }, [onKeyCallback, onMoveCallback]);\n\n // Remove window event listeners before unmounting\n useEffect(() => toggleDocumentEvents, [toggleDocumentEvents]);\n\n return (\n \n );\n};\n\nexport const Interactive = React.memo(InteractiveBase);\n","export const formatClassName = (names: unknown[]): string => names.filter(Boolean).join(\" \");\n","import React from \"react\";\nimport { formatClassName } from \"../../utils/format\";\n\ninterface Props {\n className?: string;\n top?: number;\n left: number;\n color: string;\n}\n\nexport const Pointer = ({ className, color, left, top = 0.5 }: Props): JSX.Element => {\n const nodeClassName = formatClassName([\"react-colorful__pointer\", className]);\n\n const style = {\n top: `${top * 100}%`,\n left: `${left * 100}%`,\n };\n\n return (\n
\n );\n};\n\nexport const Saturation = React.memo(SaturationBase);\n","import { hexToRgba } from \"./convert\";\nimport { ObjectColor } from \"../types\";\n\nexport const equalColorObjects = (first: ObjectColor, second: ObjectColor): boolean => {\n if (first === second) return true;\n\n for (const prop in first) {\n // The following allows for a type-safe calling of this function (first & second have to be HSL, HSV, or RGB)\n // with type-unsafe iterating over object keys. TS does not allow this without an index (`[key: string]: number`)\n // on an object to define how iteration is normally done. To ensure extra keys are not allowed on our types,\n // we must cast our object to unknown (as RGB demands `r` be a key, while `Record` does not care if\n // there is or not), and then as a type TS can iterate over.\n if (\n ((first as unknown) as Record)[prop] !==\n ((second as unknown) as Record)[prop]\n )\n return false;\n }\n\n return true;\n};\n\nexport const equalColorString = (first: string, second: string): boolean => {\n return first.replace(/\\s/g, \"\") === second.replace(/\\s/g, \"\");\n};\n\nexport const equalHex = (first: string, second: string): boolean => {\n if (first.toLowerCase() === second.toLowerCase()) return true;\n\n // To compare colors like `#FFF` and `ffffff` we convert them into RGB objects\n return equalColorObjects(hexToRgba(first), hexToRgba(second));\n};\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport { ColorModel, AnyColor, HsvaColor } from \"../types\";\nimport { equalColorObjects } from \"../utils/compare\";\nimport { useEventCallback } from \"./useEventCallback\";\n\nexport function useColorManipulation(\n colorModel: ColorModel,\n color: T,\n onChange?: (color: T) => void\n): [HsvaColor, (color: Partial) => void] {\n // Save onChange callback in the ref for avoiding \"useCallback hell\"\n const onChangeCallback = useEventCallback(onChange);\n\n // No matter which color model is used (HEX, RGB(A) or HSL(A)),\n // all internal calculations are based on HSVA model\n const [hsva, updateHsva] = useState(() => colorModel.toHsva(color));\n\n // By using this ref we're able to prevent extra updates\n // and the effects recursion during the color conversion\n const cache = useRef({ color, hsva });\n\n // Update local HSVA-value if `color` property value is changed,\n // but only if that's not the same color that we just sent to the parent\n useEffect(() => {\n if (!colorModel.equal(color, cache.current.color)) {\n const newHsva = colorModel.toHsva(color);\n cache.current = { hsva: newHsva, color };\n updateHsva(newHsva);\n }\n }, [color, colorModel]);\n\n // Trigger `onChange` callback only if an updated color is different from cached one;\n // save the new color to the ref to prevent unnecessary updates\n useEffect(() => {\n let newColor;\n if (\n !equalColorObjects(hsva, cache.current.hsva) &&\n !colorModel.equal((newColor = colorModel.fromHsva(hsva)), cache.current.color)\n ) {\n cache.current = { hsva, color: newColor };\n onChangeCallback(newColor);\n }\n }, [hsva, colorModel, onChangeCallback]);\n\n // Merge the current HSVA color object with updated params.\n // For example, when a child component sends `h` or `s` only\n const handleChange = useCallback((params: Partial) => {\n updateHsva((current) => Object.assign({}, current, params));\n }, []);\n\n return [hsva, handleChange];\n}\n","declare const __webpack_nonce__: string | undefined;\nlet nonce: string | undefined;\n\n/**\n * Returns a nonce hash included by Webpack or the one defined manually by developer.\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/nonce\n * https://webpack.js.org/guides/csp/\n */\nexport const getNonce = (): string | undefined => {\n if (nonce) return nonce;\n if (typeof __webpack_nonce__ !== \"undefined\") return __webpack_nonce__;\n return undefined;\n};\n\n/**\n * Signs the style tag with a base64-encoded string (nonce) to conforms to Content Security Policies.\n * This function has to be invoked before any picker is rendered if you aren't using Webpack for CSP.\n */\nexport const setNonce = (hash: string): void => {\n nonce = hash;\n};\n","import { useLayoutEffect, useEffect } from \"react\";\n\n// React currently throws a warning when using useLayoutEffect on the server.\n// To get around it, we can conditionally useEffect on the server (no-op) and\n// useLayoutEffect in the browser.\nexport const useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n","import { RefObject } from \"react\";\n\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\nimport { getNonce } from \"../utils/nonce\";\n\n// Bundler is configured to load this as a processed minified CSS-string\nimport styles from \"../css/styles.css\";\n\nconst styleElementMap: Map = new Map();\n\n/**\n * Injects CSS code into the document's \n */\nexport const useStyleSheet = (nodeRef: RefObject): void => {\n useIsomorphicLayoutEffect(() => {\n const parentDocument = nodeRef.current ? nodeRef.current.ownerDocument : document;\n\n if (typeof parentDocument !== \"undefined\" && !styleElementMap.has(parentDocument)) {\n const styleElement = parentDocument.createElement(\"style\");\n styleElement.innerHTML = styles;\n styleElementMap.set(parentDocument, styleElement);\n\n // Conform to CSP rules by setting `nonce` attribute to the inline styles\n const nonce = getNonce();\n if (nonce) styleElement.setAttribute(\"nonce\", nonce);\n\n parentDocument.head.appendChild(styleElement);\n }\n }, []);\n};\n","import React, { useRef } from \"react\";\n\nimport { Hue } from \"./Hue\";\nimport { Saturation } from \"./Saturation\";\n\nimport { ColorModel, ColorPickerBaseProps, AnyColor } from \"../../types\";\nimport { useColorManipulation } from \"../../hooks/useColorManipulation\";\nimport { useStyleSheet } from \"../../hooks/useStyleSheet\";\nimport { formatClassName } from \"../../utils/format\";\n\ninterface Props extends Partial> {\n colorModel: ColorModel;\n}\n\nexport const ColorPicker = ({\n className,\n colorModel,\n color = colorModel.defaultColor,\n onChange,\n ...rest\n}: Props): JSX.Element => {\n const nodeRef = useRef(null);\n useStyleSheet(nodeRef);\n\n const [hsva, updateHsva] = useColorManipulation(colorModel, color, onChange);\n\n const nodeClassName = formatClassName([\"react-colorful\", className]);\n\n return (\n
\n \n \n
\n );\n};\n","import React from \"react\";\n\nimport { ColorPicker } from \"./common/ColorPicker\";\nimport { ColorModel, ColorPickerBaseProps } from \"../types\";\nimport { equalHex } from \"../utils/compare\";\nimport { hexToHsva, hsvaToHex } from \"../utils/convert\";\n\nconst colorModel: ColorModel = {\n defaultColor: \"000\",\n toHsva: hexToHsva,\n fromHsva: ({ h, s, v }) => hsvaToHex({ h, s, v, a: 1 }),\n equal: equalHex,\n};\n\nexport const HexColorPicker = (props: Partial>): JSX.Element => (\n \n);\n","const matcher = /^#?([0-9A-F]{3,8})$/i;\n\nexport const validHex = (value: string, alpha?: boolean): boolean => {\n const match = matcher.exec(value);\n const length = match ? match[1].length : 0;\n\n return (\n length === 3 || // '#rgb' format\n length === 6 || // '#rrggbb' format\n (!!alpha && length === 4) || // '#rgba' format\n (!!alpha && length === 8) // '#rrggbbaa' format\n );\n};\n","import React, { useState, useEffect, useCallback } from \"react\";\n\nimport { useEventCallback } from \"../../hooks/useEventCallback\";\nimport { ColorInputBaseProps } from \"../../types\";\n\ninterface Props extends ColorInputBaseProps {\n /** Blocks typing invalid characters and limits string length */\n escape: (value: string) => string;\n /** Checks that value is valid color string */\n validate: (value: string) => boolean;\n /** Processes value before displaying it in the input */\n format?: (value: string) => string;\n /** Processes value before sending it in `onChange` */\n process?: (value: string) => string;\n}\n\nexport const ColorInput = (props: Props): JSX.Element => {\n const { color = \"\", onChange, onBlur, escape, validate, format, process, ...rest } = props;\n const [value, setValue] = useState(() => escape(color));\n const onChangeCallback = useEventCallback(onChange);\n const onBlurCallback = useEventCallback>(onBlur);\n\n // Trigger `onChange` handler only if the input value is a valid color\n const handleChange = useCallback(\n (e: React.ChangeEvent) => {\n const inputValue = escape(e.target.value);\n setValue(inputValue);\n if (validate(inputValue)) onChangeCallback(process ? process(inputValue) : inputValue);\n },\n [escape, process, validate, onChangeCallback]\n );\n\n // Take the color from props if the last typed color (in local state) is not valid\n const handleBlur = useCallback(\n (e: React.FocusEvent) => {\n if (!validate(e.target.value)) setValue(escape(color));\n onBlurCallback(e);\n },\n [color, escape, validate, onBlurCallback]\n );\n\n // Update the local state when `color` property value is changed\n useEffect(() => {\n setValue(escape(color));\n }, [color, escape]);\n\n return (\n \n );\n};\n","import React, { useCallback } from \"react\";\nimport { ColorInputBaseProps } from \"../types\";\n\nimport { validHex } from \"../utils/validate\";\nimport { ColorInput } from \"./common/ColorInput\";\n\ninterface HexColorInputProps extends ColorInputBaseProps {\n /** Enables `#` prefix displaying */\n prefixed?: boolean;\n /** Allows `#rgba` and `#rrggbbaa` color formats */\n alpha?: boolean;\n}\n\n/** Adds \"#\" symbol to the beginning of the string */\nconst prefix = (value: string) => \"#\" + value;\n\nexport const HexColorInput = (props: HexColorInputProps): JSX.Element => {\n const { prefixed, alpha, ...rest } = props;\n\n /** Escapes all non-hexadecimal characters including \"#\" */\n const escape = useCallback(\n (value: string) => value.replace(/([^0-9A-F]+)/gi, \"\").substring(0, alpha ? 8 : 6),\n [alpha]\n );\n\n /** Validates hexadecimal strings */\n const validate = useCallback((value: string) => validHex(value, alpha), [alpha]);\n\n return (\n \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"header\":\"colorPickerMenu_header__OJJvr\",\"picker\":\"colorPickerMenu_picker__6xE7X\",\"dropdown\":\"colorPickerMenu_dropdown__qTmIa\"};","import * as React from 'react';\nimport NavDropdown from 'react-bootstrap/esm/NavDropdown';\nimport { HexColorInput, HexColorPicker } from 'react-colorful';\n\nimport ColorContext from '../../contexts/ColorContext';\nimport menuStyles from '../../styles/nav/colorPickerMenu.module.scss';\n\nexport default function PageNavColorPickerMenu(): React.JSX.Element {\n\tconst {color, setColor} = React.useContext(ColorContext);\n\n\treturn (\n\t\t<>\n\t\t\t\n\t\t\t\tColor Picker\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t>\n\t);\n}\n"],"names":["i","e","t","r","n","current","s","f","v","ownerDocument","defaultView","self","d","getBoundingClientRect","o","length","identifier","touches","left","pageX","pageXOffset","width","top","pageY","pageYOffset","height","h","preventDefault","m","a","onMove","l","onKey","c","g","p","b","_","x","buttons","addEventListener","removeEventListener","nativeEvent","changedTouches","focus","which","keyCode","C","E","H","u","onTouchStart","onMouseDown","className","ref","onKeyDown","tabIndex","role","filter","Boolean","join","color","style","backgroundColor","Math","pow","round","PI","L","substring","parseInt","w","K","I","y","q","floor","D","toString","max","min","S","hue","onChange","T","hsva","F","X","toLowerCase","Y","toHsva","equal","fromHsva","Object","assign","R","V","window","J","Map","Q","document","has","createElement","innerHTML","set","__webpack_nonce__","setAttribute","head","appendChild","U","colorModel","defaultColor","W","Z","qe","ke","onBlur","escape","validate","format","process","target","value","spellCheck","Ie","Oe","prefixed","alpha","replace","exec","PageNavColorPickerMenu","setColor","React","ColorContext","_jsxs","_Fragment","children","_jsx","NavDropdown","Header","menuStyles","header","picker","HexColorPicker","HexColorInput"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"static/js/154.c895d1c8.chunk.js","mappings":"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","sources":["../node_modules/react-colorful/src/hooks/useEventCallback.ts","../node_modules/react-colorful/src/utils/clamp.ts","../node_modules/react-colorful/src/components/common/Interactive.tsx","../node_modules/react-colorful/src/utils/format.ts","../node_modules/react-colorful/src/components/common/Pointer.tsx","../node_modules/react-colorful/src/utils/round.ts","../node_modules/react-colorful/src/utils/convert.ts","../node_modules/react-colorful/src/components/common/Hue.tsx","../node_modules/react-colorful/src/components/common/Saturation.tsx","../node_modules/react-colorful/src/utils/compare.ts","../node_modules/react-colorful/src/hooks/useColorManipulation.ts","../node_modules/react-colorful/src/utils/nonce.ts","../node_modules/react-colorful/src/hooks/useIsomorphicLayoutEffect.ts","../node_modules/react-colorful/src/hooks/useStyleSheet.ts","../node_modules/react-colorful/src/components/common/ColorPicker.tsx","../node_modules/react-colorful/src/components/HexColorPicker.tsx","../node_modules/react-colorful/src/utils/validate.ts","../node_modules/react-colorful/src/components/common/ColorInput.tsx","../node_modules/react-colorful/src/components/HexColorInput.tsx","webpack://sverg84.github.io/./src/impl/styles/nav/colorPickerMenu.module.scss?0d60","impl/components/nav/PageNavColorPickerMenu.tsx"],"sourcesContent":["import { useRef } from \"react\";\n\n// Saves incoming handler to the ref in order to avoid \"useCallback hell\"\nexport function useEventCallback(handler?: (value: T) => void): (value: T) => void {\n const callbackRef = useRef(handler);\n const fn = useRef((value: T) => {\n callbackRef.current && callbackRef.current(value);\n });\n callbackRef.current = handler;\n\n return fn.current;\n}\n","// Clamps a value between an upper and lower bound.\n// We use ternary operators because it makes the minified code\n// 2 times shorter then `Math.min(Math.max(a,b),c)`\nexport const clamp = (number: number, min = 0, max = 1): number => {\n return number > max ? max : number < min ? min : number;\n};\n","import React, { useRef, useMemo, useEffect } from \"react\";\n\nimport { useEventCallback } from \"../../hooks/useEventCallback\";\nimport { clamp } from \"../../utils/clamp\";\n\nexport interface Interaction {\n left: number;\n top: number;\n}\n\n// Check if an event was triggered by touch\nconst isTouch = (event: MouseEvent | TouchEvent): event is TouchEvent => \"touches\" in event;\n\n// Finds a proper touch point by its identifier\nconst getTouchPoint = (touches: TouchList, touchId: null | number): Touch => {\n for (let i = 0; i < touches.length; i++) {\n if (touches[i].identifier === touchId) return touches[i];\n }\n return touches[0];\n};\n\n// Finds the proper window object to fix iframe embedding issues\nconst getParentWindow = (node?: HTMLDivElement | null): Window => {\n return (node && node.ownerDocument.defaultView) || self;\n};\n\n// Returns a relative position of the pointer inside the node's bounding box\nconst getRelativePosition = (\n node: HTMLDivElement,\n event: MouseEvent | TouchEvent,\n touchId: null | number\n): Interaction => {\n const rect = node.getBoundingClientRect();\n\n // Get user's pointer position from `touches` array if it's a `TouchEvent`\n const pointer = isTouch(event) ? getTouchPoint(event.touches, touchId) : (event as MouseEvent);\n\n return {\n left: clamp((pointer.pageX - (rect.left + getParentWindow(node).pageXOffset)) / rect.width),\n top: clamp((pointer.pageY - (rect.top + getParentWindow(node).pageYOffset)) / rect.height),\n };\n};\n\n// Browsers introduced an intervention, making touch events passive by default.\n// This workaround removes `preventDefault` call from the touch handlers.\n// https://github.com/facebook/react/issues/19651\nconst preventDefaultMove = (event: MouseEvent | TouchEvent): void => {\n !isTouch(event) && event.preventDefault();\n};\n\n// Prevent mobile browsers from handling mouse events (conflicting with touch ones).\n// If we detected a touch interaction before, we prefer reacting to touch events only.\nconst isInvalid = (event: MouseEvent | TouchEvent, hasTouch: boolean): boolean => {\n return hasTouch && !isTouch(event);\n};\n\ninterface Props {\n onMove: (interaction: Interaction) => void;\n onKey: (offset: Interaction) => void;\n children: React.ReactNode;\n}\n\nconst InteractiveBase = ({ onMove, onKey, ...rest }: Props) => {\n const container = useRef(null);\n const onMoveCallback = useEventCallback(onMove);\n const onKeyCallback = useEventCallback(onKey);\n const touchId = useRef(null);\n const hasTouch = useRef(false);\n\n const [handleMoveStart, handleKeyDown, toggleDocumentEvents] = useMemo(() => {\n const handleMoveStart = ({ nativeEvent }: React.MouseEvent | React.TouchEvent) => {\n const el = container.current;\n if (!el) return;\n\n // Prevent text selection\n preventDefaultMove(nativeEvent);\n\n if (isInvalid(nativeEvent, hasTouch.current) || !el) return;\n\n if (isTouch(nativeEvent)) {\n hasTouch.current = true;\n const changedTouches = nativeEvent.changedTouches || [];\n if (changedTouches.length) touchId.current = changedTouches[0].identifier;\n }\n\n el.focus();\n onMoveCallback(getRelativePosition(el, nativeEvent, touchId.current));\n toggleDocumentEvents(true);\n };\n\n const handleMove = (event: MouseEvent | TouchEvent) => {\n // Prevent text selection\n preventDefaultMove(event);\n\n // If user moves the pointer outside of the window or iframe bounds and release it there,\n // `mouseup`/`touchend` won't be fired. In order to stop the picker from following the cursor\n // after the user has moved the mouse/finger back to the document, we check `event.buttons`\n // and `event.touches`. It allows us to detect that the user is just moving his pointer\n // without pressing it down\n const isDown = isTouch(event) ? event.touches.length > 0 : event.buttons > 0;\n\n if (isDown && container.current) {\n onMoveCallback(getRelativePosition(container.current, event, touchId.current));\n } else {\n toggleDocumentEvents(false);\n }\n };\n\n const handleMoveEnd = () => toggleDocumentEvents(false);\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const keyCode = event.which || event.keyCode;\n\n // Ignore all keys except arrow ones\n if (keyCode < 37 || keyCode > 40) return;\n // Do not scroll page by arrow keys when document is focused on the element\n event.preventDefault();\n // Send relative offset to the parent component.\n // We use codes (37←, 38↑, 39→, 40↓) instead of keys ('ArrowRight', 'ArrowDown', etc)\n // to reduce the size of the library\n onKeyCallback({\n left: keyCode === 39 ? 0.05 : keyCode === 37 ? -0.05 : 0,\n top: keyCode === 40 ? 0.05 : keyCode === 38 ? -0.05 : 0,\n });\n };\n\n function toggleDocumentEvents(state?: boolean) {\n const touch = hasTouch.current;\n const el = container.current;\n const parentWindow = getParentWindow(el);\n\n // Add or remove additional pointer event listeners\n const toggleEvent = state ? parentWindow.addEventListener : parentWindow.removeEventListener;\n toggleEvent(touch ? \"touchmove\" : \"mousemove\", handleMove);\n toggleEvent(touch ? \"touchend\" : \"mouseup\", handleMoveEnd);\n }\n\n return [handleMoveStart, handleKeyDown, toggleDocumentEvents];\n }, [onKeyCallback, onMoveCallback]);\n\n // Remove window event listeners before unmounting\n useEffect(() => toggleDocumentEvents, [toggleDocumentEvents]);\n\n return (\n \n );\n};\n\nexport const Interactive = React.memo(InteractiveBase);\n","export const formatClassName = (names: unknown[]): string => names.filter(Boolean).join(\" \");\n","import React from \"react\";\nimport { formatClassName } from \"../../utils/format\";\n\ninterface Props {\n className?: string;\n top?: number;\n left: number;\n color: string;\n}\n\nexport const Pointer = ({ className, color, left, top = 0.5 }: Props): JSX.Element => {\n const nodeClassName = formatClassName([\"react-colorful__pointer\", className]);\n\n const style = {\n top: `${top * 100}%`,\n left: `${left * 100}%`,\n };\n\n return (\n
\n );\n};\n\nexport const Saturation = React.memo(SaturationBase);\n","import { hexToRgba } from \"./convert\";\nimport { ObjectColor } from \"../types\";\n\nexport const equalColorObjects = (first: ObjectColor, second: ObjectColor): boolean => {\n if (first === second) return true;\n\n for (const prop in first) {\n // The following allows for a type-safe calling of this function (first & second have to be HSL, HSV, or RGB)\n // with type-unsafe iterating over object keys. TS does not allow this without an index (`[key: string]: number`)\n // on an object to define how iteration is normally done. To ensure extra keys are not allowed on our types,\n // we must cast our object to unknown (as RGB demands `r` be a key, while `Record` does not care if\n // there is or not), and then as a type TS can iterate over.\n if (\n ((first as unknown) as Record)[prop] !==\n ((second as unknown) as Record)[prop]\n )\n return false;\n }\n\n return true;\n};\n\nexport const equalColorString = (first: string, second: string): boolean => {\n return first.replace(/\\s/g, \"\") === second.replace(/\\s/g, \"\");\n};\n\nexport const equalHex = (first: string, second: string): boolean => {\n if (first.toLowerCase() === second.toLowerCase()) return true;\n\n // To compare colors like `#FFF` and `ffffff` we convert them into RGB objects\n return equalColorObjects(hexToRgba(first), hexToRgba(second));\n};\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport { ColorModel, AnyColor, HsvaColor } from \"../types\";\nimport { equalColorObjects } from \"../utils/compare\";\nimport { useEventCallback } from \"./useEventCallback\";\n\nexport function useColorManipulation(\n colorModel: ColorModel,\n color: T,\n onChange?: (color: T) => void\n): [HsvaColor, (color: Partial) => void] {\n // Save onChange callback in the ref for avoiding \"useCallback hell\"\n const onChangeCallback = useEventCallback(onChange);\n\n // No matter which color model is used (HEX, RGB(A) or HSL(A)),\n // all internal calculations are based on HSVA model\n const [hsva, updateHsva] = useState(() => colorModel.toHsva(color));\n\n // By using this ref we're able to prevent extra updates\n // and the effects recursion during the color conversion\n const cache = useRef({ color, hsva });\n\n // Update local HSVA-value if `color` property value is changed,\n // but only if that's not the same color that we just sent to the parent\n useEffect(() => {\n if (!colorModel.equal(color, cache.current.color)) {\n const newHsva = colorModel.toHsva(color);\n cache.current = { hsva: newHsva, color };\n updateHsva(newHsva);\n }\n }, [color, colorModel]);\n\n // Trigger `onChange` callback only if an updated color is different from cached one;\n // save the new color to the ref to prevent unnecessary updates\n useEffect(() => {\n let newColor;\n if (\n !equalColorObjects(hsva, cache.current.hsva) &&\n !colorModel.equal((newColor = colorModel.fromHsva(hsva)), cache.current.color)\n ) {\n cache.current = { hsva, color: newColor };\n onChangeCallback(newColor);\n }\n }, [hsva, colorModel, onChangeCallback]);\n\n // Merge the current HSVA color object with updated params.\n // For example, when a child component sends `h` or `s` only\n const handleChange = useCallback((params: Partial) => {\n updateHsva((current) => Object.assign({}, current, params));\n }, []);\n\n return [hsva, handleChange];\n}\n","declare const __webpack_nonce__: string | undefined;\nlet nonce: string | undefined;\n\n/**\n * Returns a nonce hash included by Webpack or the one defined manually by developer.\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/nonce\n * https://webpack.js.org/guides/csp/\n */\nexport const getNonce = (): string | undefined => {\n if (nonce) return nonce;\n if (typeof __webpack_nonce__ !== \"undefined\") return __webpack_nonce__;\n return undefined;\n};\n\n/**\n * Signs the style tag with a base64-encoded string (nonce) to conforms to Content Security Policies.\n * This function has to be invoked before any picker is rendered if you aren't using Webpack for CSP.\n */\nexport const setNonce = (hash: string): void => {\n nonce = hash;\n};\n","import { useLayoutEffect, useEffect } from \"react\";\n\n// React currently throws a warning when using useLayoutEffect on the server.\n// To get around it, we can conditionally useEffect on the server (no-op) and\n// useLayoutEffect in the browser.\nexport const useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n","import { RefObject } from \"react\";\n\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\nimport { getNonce } from \"../utils/nonce\";\n\n// Bundler is configured to load this as a processed minified CSS-string\nimport styles from \"../css/styles.css\";\n\nconst styleElementMap: Map = new Map();\n\n/**\n * Injects CSS code into the document's \n */\nexport const useStyleSheet = (nodeRef: RefObject): void => {\n useIsomorphicLayoutEffect(() => {\n const parentDocument = nodeRef.current ? nodeRef.current.ownerDocument : document;\n\n if (typeof parentDocument !== \"undefined\" && !styleElementMap.has(parentDocument)) {\n const styleElement = parentDocument.createElement(\"style\");\n styleElement.innerHTML = styles;\n styleElementMap.set(parentDocument, styleElement);\n\n // Conform to CSP rules by setting `nonce` attribute to the inline styles\n const nonce = getNonce();\n if (nonce) styleElement.setAttribute(\"nonce\", nonce);\n\n parentDocument.head.appendChild(styleElement);\n }\n }, []);\n};\n","import React, { useRef } from \"react\";\n\nimport { Hue } from \"./Hue\";\nimport { Saturation } from \"./Saturation\";\n\nimport { ColorModel, ColorPickerBaseProps, AnyColor } from \"../../types\";\nimport { useColorManipulation } from \"../../hooks/useColorManipulation\";\nimport { useStyleSheet } from \"../../hooks/useStyleSheet\";\nimport { formatClassName } from \"../../utils/format\";\n\ninterface Props extends Partial> {\n colorModel: ColorModel;\n}\n\nexport const ColorPicker = ({\n className,\n colorModel,\n color = colorModel.defaultColor,\n onChange,\n ...rest\n}: Props): JSX.Element => {\n const nodeRef = useRef(null);\n useStyleSheet(nodeRef);\n\n const [hsva, updateHsva] = useColorManipulation(colorModel, color, onChange);\n\n const nodeClassName = formatClassName([\"react-colorful\", className]);\n\n return (\n
\n \n \n
\n );\n};\n","import React from \"react\";\n\nimport { ColorPicker } from \"./common/ColorPicker\";\nimport { ColorModel, ColorPickerBaseProps } from \"../types\";\nimport { equalHex } from \"../utils/compare\";\nimport { hexToHsva, hsvaToHex } from \"../utils/convert\";\n\nconst colorModel: ColorModel = {\n defaultColor: \"000\",\n toHsva: hexToHsva,\n fromHsva: ({ h, s, v }) => hsvaToHex({ h, s, v, a: 1 }),\n equal: equalHex,\n};\n\nexport const HexColorPicker = (props: Partial>): JSX.Element => (\n \n);\n","const matcher = /^#?([0-9A-F]{3,8})$/i;\n\nexport const validHex = (value: string, alpha?: boolean): boolean => {\n const match = matcher.exec(value);\n const length = match ? match[1].length : 0;\n\n return (\n length === 3 || // '#rgb' format\n length === 6 || // '#rrggbb' format\n (!!alpha && length === 4) || // '#rgba' format\n (!!alpha && length === 8) // '#rrggbbaa' format\n );\n};\n","import React, { useState, useEffect, useCallback } from \"react\";\n\nimport { useEventCallback } from \"../../hooks/useEventCallback\";\nimport { ColorInputBaseProps } from \"../../types\";\n\ninterface Props extends ColorInputBaseProps {\n /** Blocks typing invalid characters and limits string length */\n escape: (value: string) => string;\n /** Checks that value is valid color string */\n validate: (value: string) => boolean;\n /** Processes value before displaying it in the input */\n format?: (value: string) => string;\n /** Processes value before sending it in `onChange` */\n process?: (value: string) => string;\n}\n\nexport const ColorInput = (props: Props): JSX.Element => {\n const { color = \"\", onChange, onBlur, escape, validate, format, process, ...rest } = props;\n const [value, setValue] = useState(() => escape(color));\n const onChangeCallback = useEventCallback(onChange);\n const onBlurCallback = useEventCallback>(onBlur);\n\n // Trigger `onChange` handler only if the input value is a valid color\n const handleChange = useCallback(\n (e: React.ChangeEvent) => {\n const inputValue = escape(e.target.value);\n setValue(inputValue);\n if (validate(inputValue)) onChangeCallback(process ? process(inputValue) : inputValue);\n },\n [escape, process, validate, onChangeCallback]\n );\n\n // Take the color from props if the last typed color (in local state) is not valid\n const handleBlur = useCallback(\n (e: React.FocusEvent) => {\n if (!validate(e.target.value)) setValue(escape(color));\n onBlurCallback(e);\n },\n [color, escape, validate, onBlurCallback]\n );\n\n // Update the local state when `color` property value is changed\n useEffect(() => {\n setValue(escape(color));\n }, [color, escape]);\n\n return (\n \n );\n};\n","import React, { useCallback } from \"react\";\nimport { ColorInputBaseProps } from \"../types\";\n\nimport { validHex } from \"../utils/validate\";\nimport { ColorInput } from \"./common/ColorInput\";\n\ninterface HexColorInputProps extends ColorInputBaseProps {\n /** Enables `#` prefix displaying */\n prefixed?: boolean;\n /** Allows `#rgba` and `#rrggbbaa` color formats */\n alpha?: boolean;\n}\n\n/** Adds \"#\" symbol to the beginning of the string */\nconst prefix = (value: string) => \"#\" + value;\n\nexport const HexColorInput = (props: HexColorInputProps): JSX.Element => {\n const { prefixed, alpha, ...rest } = props;\n\n /** Escapes all non-hexadecimal characters including \"#\" */\n const escape = useCallback(\n (value: string) => value.replace(/([^0-9A-F]+)/gi, \"\").substring(0, alpha ? 8 : 6),\n [alpha]\n );\n\n /** Validates hexadecimal strings */\n const validate = useCallback((value: string) => validHex(value, alpha), [alpha]);\n\n return (\n \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"header\":\"colorPickerMenu_header__OJJvr\",\"picker\":\"colorPickerMenu_picker__6xE7X\",\"dropdown\":\"colorPickerMenu_dropdown__qTmIa\"};","import * as React from 'react';\nimport NavDropdown from 'react-bootstrap/esm/NavDropdown';\nimport { HexColorInput, HexColorPicker } from 'react-colorful';\n\nimport ColorContext from '../../contexts/ColorContext';\nimport styles from '../../styles/nav/colorPickerMenu.module.scss';\n\nexport default function PageNavColorPickerMenu(): React.JSX.Element {\n\tconst {color, setColor} = React.useContext(ColorContext);\n\n\treturn (\n\t\t<>\n\t\t\t\n\t\t\t\tColor Picker\n\t\t\t\n\t\t\t