*,*:before,*:after{box-sizing:border-box}*{margin:0}:root{--14px: .875rem;--16px: 1rem;--18px: 1.125rem;--21px: 1.3125rem}body{-webkit-font-smoothing:antialiased;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%}h1,h2,h3,h4,h5,h6{text-wrap:balance}img{max-width:100%;height:auto}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}@font-face{font-family:Inter;font-style:normal;font-weight:300;font-display:swap;src:url(/fonts/Inter-Light.woff2) format("woff2")}@font-face{font-family:Inter;font-style:italic;font-weight:300;font-display:swap;src:url(/fonts/Inter-LightItalic.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/Inter-Regular.woff2) format("woff2")}@font-face{font-family:Inter;font-style:italic;font-weight:400;font-display:swap;src:url(/fonts/Inter-Italic.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/Inter-Medium.woff2) format("woff2")}@font-face{font-family:Inter;font-style:italic;font-weight:500;font-display:swap;src:url(/fonts/Inter-MediumItalic.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/Inter-SemiBold.woff2) format("woff2")}@font-face{font-family:Inter;font-style:italic;font-weight:600;font-display:swap;src:url(/fonts/Inter-SemiBoldItalic.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/Inter-Bold.woff2) format("woff2")}@font-face{font-family:Inter;font-style:italic;font-weight:700;font-display:swap;src:url(/fonts/Inter-BoldItalic.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:800;font-display:swap;src:url(/fonts/Inter-ExtraBold.woff2) format("woff2")}@font-face{font-family:Inter;font-style:italic;font-weight:800;font-display:swap;src:url(/fonts/Inter-ExtraBoldItalic.woff2) format("woff2")}@media print{@page{size:auto;margin:2.25cm 2cm 2.5cm 4cm}body{margin:0;padding:0;background-color:transparent!important}}::-moz-selection{background-color:var(--selection-color)}::selection{background-color:var(--selection-color)}body{background-color:var(--color-ghostwhite);font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;line-height:1.5;color:var(--color-primary);font-feature-settings:"ss03";margin:0;padding:0}h1,h2{font-size:1rem;font-weight:600;page-break-after:avoid}h2{margin-top:2rem}p{margin-bottom:1.5em}@media print{p{margin-bottom:1em}}a{color:inherit;text-decoration-thickness:1px;text-decoration-color:var(--color-underline);text-underline-offset:2px;transition:all .1s ease}a:hover{color:var(--color-black);text-decoration-color:var(--color-secondary)}hr{margin:3rem auto;border:none;border-bottom:1px solid var(--color-underline);opacity:.4;max-width:3rem!important}.inline-icon{position:relative;display:inline-block;margin:0 .05em 0 .1em;width:auto;height:.9em;top:.1em;border-radius:0}@media print{html{font-size:14px}}.markdown h2{margin-top:5rem;margin-bottom:1rem}@media print{.markdown h2{margin-top:4rem;margin-bottom:1rem}.markdown h2:first-child{margin-top:3rem}}.markdown ul,.markdown ol{margin:1.5em 0;padding-left:1.25em}@media print{.markdown ul,.markdown ol{margin:1em 0}}.markdown ul li,.markdown ol li{margin-bottom:.75em;padding-left:.25em}.markdown ul li::marker{color:var(--color-underline)}.markdown p+ul,.markdown p+ol{margin-top:-.5em}.markdown img{border-radius:4px}.markdown video{max-width:100%;height:auto}.markdown strong{font-weight:600}.markdown a{font-weight:500;color:var(--color-black)}.markdown code{background-color:#e3e3e4;border-radius:4px;padding:.2em .25em}.markdown .media-wrapper{margin:2em 0 2.5em}.markdown li .media-wrapper{margin:1.25em 0 1.75em}.markdown .media-wrapper .screenshot{margin-bottom:.5em}@media screen and (min-width: 64rem){.markdown .media-wrapper--negative-margins{margin-inline:-100px}}.markdown .media-wrapper--sintra{margin-inline:-.7em}.markdown .video{max-width:100%;border-radius:8px;box-shadow:var(--shadow-elevation-high)}.markdown .screenshot{display:block;box-shadow:var(--shadow-elevation-high);border-radius:4px;margin-bottom:3em;padding:0!important}@media screen and (min-width: 48rem){.markdown .screenshot{border-radius:8px}}.markdown .transit-map{box-shadow:var(--shadow-elevation-medium);border:1px solid rgba(0,0,0,.07);background-clip:padding-box}.markdown .screenshot--small{box-shadow:var(--shadow-elevation-medium);border:1px solid rgba(0,0,0,.08);background-clip:padding-box}@media screen and (min-width: 40rem){.screenshots{display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(0,1fr))}}.screenshots__item{width:100%;height:auto;margin-bottom:1.5em}@media screen and (min-width: 40rem){.screenshots__item{margin-bottom:0}}.screenshots__caption{font-size:var(--14px);margin-bottom:.75rem;font-style:italic}.testimonial{position:relative;margin:2.5em 0 3em;padding-left:1.25rem}.testimonial:before{display:block;position:absolute;content:"";width:3px;top:0;bottom:0;border-radius:1.5px;left:0;background:var(--color-underline);opacity:.67}.testimonial__blockquote{margin-bottom:1em;quotes:"“" "”" "‘" "’";font-style:italic}.testimonial__blockquote:before{content:open-quote}.testimonial__blockquote:after{content:close-quote}.testimonial__author{font-weight:500}.testimonial__author-title{color:var(--color-secondary)}.alert{border:1.5px solid #0070ec;padding:1rem 1.5rem 1.25rem;border-radius:.375rem;background-color:#fafafb;margin:2rem 0;font-size:.9rem}@media screen and (min-width: 768px){.alert{padding-right:3rem}}.alert__title{font-size:inherit;font-weight:600;margin-bottom:.5rem}.alert p:last-child{margin-bottom:0}.header{padding-top:3em;padding-bottom:3em}@media screen and (min-width: 58rem){.header{padding-top:4em}}@media print{.header{padding-top:0}}.header__primary a{color:inherit;text-decoration:none}.header__title{font-weight:600}.header__description{color:var(--color-secondary)}.footer{font-size:var(--14px);margin-top:7rem;padding-bottom:3em;opacity:.7}@media print{.footer{display:none}}.footer__inner{border-top:1px solid #e4e4e5;padding-top:1em;display:flex;justify-content:space-between}.timeline-list{list-style-type:none;margin:1em 0 4em;padding:0;line-height:1.4}.timeline-list__item{display:flex;gap:.5em;border-top:1px solid #e4e4e5;padding:.75em 0 1em}.timeline-list__label{flex-basis:7em;flex-shrink:0;white-space:nowrap}@media screen and (min-width: 48rem){.timeline-list__label{flex-basis:9em}}.timeline-list__content{flex:1}.timeline-list__title{font-weight:500;white-space:nowrap}.timeline-list__link,.timeline-list__title-inner{white-space:normal}.timeline-list__description{margin-top:.25rem}.timeline-list__note{margin-top:.375rem;color:var(--color-tetriary);font-size:var(--14px);line-height:1.45}.timeline-list__description+.timeline-list__note{margin-top:.75em}.timeline-list__star{font-size:.9em;position:relative;bottom:.015em;padding-left:.05em;color:#ff5662}@media (color-gamut: p3){.timeline-list__star{color:oklch(69.83% .2124 20.83)}}.skills{list-style-type:none;margin:1em 0 3em;padding:0}.skills__item{display:inline-block;padding:.5em .75em;background-color:#fdfdfe;margin-right:.5em;margin-bottom:.5em;border-radius:.5em;font-size:var(--14px);line-height:1;white-space:nowrap;box-shadow:var(--shadow-elevation-low)}.skills__item--css{padding-right:0;margin-right:1em;max-width:2.4em}.skills__level{color:var(--color-secondary)}@media screen and (width < 58em){.project-page__header{padding-top:2em}}.project-page__short-description{text-wrap:balance}.project-page__website{margin-top:.75em}.project-page__website a{display:inline-flex;align-items:center;gap:.4em;color:var(--color-primary)}.project-page__website a:hover{color:var(--color-black)}.project-page__website a:hover svg{opacity:.9}.project-page__website svg{width:.9em;height:.9em;opacity:.75}.project-page__additional-things{padding-bottom:4em}:root{--container-max-width: 640px;--color-ghostwhite: #f4f4f5;--color-black: #000001;--color-primary: #222223;--color-secondary: #6a6a6c;--color-tetriary: #4a4a4c;--color-underline: #ababac;--shadow-color: 0deg 0% 75%;--shadow-elevation-low: 0 .5px .6px hsl(var(--shadow-color) / .34), 0 .9px 1px -1.2px hsl(var(--shadow-color) / .34), 0 2.2px 2.5px -2.5px hsl(var(--shadow-color) / .34);--shadow-elevation-medium: 0 .3px .3px hsl(var(--shadow-color) / .12), .1px .9px 1px -.8px hsl(var(--shadow-color) / .12), .1px 2.2px 2.5px -1.7px hsl(var(--shadow-color) / .12), .3px 5.4px 6.1px -2.5px hsl(var(--shadow-color) / .12);--shadow-elevation-high: 0 .3px .3px hsl(var(--shadow-color) / .15), .1px 1.5px 1.7px -.4px hsl(var(--shadow-color) / .15), .2px 2.7px 3px -.7px hsl(var(--shadow-color) / .15), .2px 4.4px 5px -1.1px hsl(var(--shadow-color) / .15), .4px 7px 7.9px -1.4px hsl(var(--shadow-color) / .15), .6px 10.9px 12.3px -1.8px hsl(var(--shadow-color) / .15), .9px 16.5px 18.6px -2.1px hsl(var(--shadow-color) / .15), 1.4px 24.3px 27.4px -2.5px hsl(var(--shadow-color) / .15);--selection-color: #b1e3fb}.container{margin:0 auto;padding:0 20px;max-width:var(--container-max-width)}@media print{.container{padding:0}}.date,.label{color:var(--color-secondary);font-weight:500}.short-description{color:var(--color-secondary)}.grid-wrapper{margin:0 auto;max-width:1200px}@media screen and (min-width: 58rem){.grid-wrapper{display:grid;grid-template-columns:1fr var(--container-max-width) 1fr;align-items:baseline}}.sidebar{padding-top:3em;padding-right:20px;padding-left:20px;font-size:var(--14px);max-width:var(--container-max-width);margin:0 auto}@media screen and (min-width: 58rem){.sidebar{padding-top:4em;margin:0}}@media print{.sidebar{display:none}p{orphans:3;widows:3}}.sidebar a{opacity:.7}.sidebar a:hover{opacity:1}.intro{margin-bottom:6em}.intro strong{font-weight:500}.intro__cta{padding-top:.5em;display:flex;flex-wrap:wrap;gap:1.75rem}.button{display:inline-flex;height:2.75rem;align-items:center;justify-content:center;text-decoration:none;padding:0 1.5rem;text-align:center;font-size:1rem;font-family:inherit;font-weight:500;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s;background-color:var(--color-primary);border-radius:.5rem;border:1px solid transparent;color:#fff;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;cursor:pointer}.button:hover,.button:focus-visible{background-color:var(--color-black);color:#fff}.button--hey{color:#5522fa;background-color:#fff;border:1px solid #5522fa;padding:0 1rem}.button--hey:hover,.button--hey:focus-visible{background-color:#fff;color:#5522fa}.download-link{display:flex;flex-flow:row-reverse;white-space:nowrap;gap:.3em;align-items:center;color:var(--color-secondary)}.download-link svg{width:1em;height:1em;opacity:.9}
