*,*: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-background);font-family:var(--font-family);line-height:1.6;color:var(--color-foreground);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-contrast);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}table{width:100%;border-collapse:collapse;margin-bottom:2em}th{text-align:left;font-weight:500;font-size:.875em}th,td{padding:.625em 1em;border:0;border-bottom:1px solid var(--color-border);vertical-align:top}th{border-bottom-width:2px}th:first-child,td:first-child{padding-left:0}th:last-child,td:last-child{padding-right:0}tr:last-child td{border-bottom:none}.inline-icon{position:relative;display:inline-block;margin:0 .05em 0 .1em;width:auto;height:.9em;top:.1em;border-radius:0}pre,code{font-family:var(--font-family-mono)}code{background-color:var(--color-code-background);border-radius:.4em;padding:.1875em .3125em;font-size:.875em;color:var(--color-contrast);font-weight:500}kbd{font-family:var(--font-family);font-weight:500;display:inline-block;background-color:var(--color-skill-background);white-space:nowrap;padding:.1em .6em;border-radius:.4em;border:1px solid var(--color-border);font-size:.8125em}.nowrap{white-space:nowrap}.footnotes{margin-top:6rem;font-size:.875em}#footnote-label{font-size:.875rem;font-weight:500;color:var(--color-secondary)}.footnotes .data-footnote-backref{color:var(--color-secondary);font-size:.875em;text-decoration:none}@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{list-style-type:disc}.markdown ul li::marker{color:var(--color-underline)}.markdown ol li::marker{color:var(--color-secondary);font-size:.875em}.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-contrast)}.markdown a.external-link{position:relative;padding-right:.75em}.markdown a.external-link:after{content:" ↗";position:absolute;opacity:.7;margin-left:-.125em;color:var(--color-secondary);font-size:.6875em;transition:opacity .2s ease;white-space:nowrap;text-decoration:none;pointer-events:none}.markdown a.external-link:hover:after{opacity:1}.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-medium)}.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 var(--color-alert-border);padding:1rem 1.5rem 1.25rem;border-radius:.375rem;background-color:var(--color-alert-background);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 var(--color-border);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 var(--color-border);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:var(--color-star)}@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:var(--color-skill-background);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-foreground)}.project-page__website a:hover{color:var(--color-contrast)}.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;--font-family: "Inter", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;--font-family-mono: ui-monospace, "Cascadia Code", "Source Code Pro", Menlo, Consolas, "DejaVu Sans Mono", monospace;--color-background: #f4f4f3;--color-foreground: #232222;--color-contrast: #010100;--color-secondary: #6c6c6a;--color-tetriary: #4c4c4a;--color-underline: #acacab;--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) / .08), .1px 1.5px 1.7px -.4px hsl(var(--shadow-color) / .08), .2px 2.7px 3px -.7px hsl(var(--shadow-color) / .08), .2px 4.4px 5px -1.1px hsl(var(--shadow-color) / .08), .4px 7px 7.9px -1.4px hsl(var(--shadow-color) / .08), .6px 10.9px 12.3px -1.8px hsl(var(--shadow-color) / .08), .9px 16.5px 18.6px -2.1px hsl(var(--shadow-color) / .08), 1.4px 24.3px 27.4px -2.5px hsl(var(--shadow-color) / .08);--selection-color: #b1e3fb;--color-button-background: #222223;--color-button-background-hover: #111;--color-button-text: #fff;--color-alert-background: #fafafb;--color-alert-border: #0070ec;--color-hey-primary: #5522fa;--color-hey-background: #fff;--color-code-background: #e7e6e4;--color-border: #e3e3e1;--color-star: #ff5662;--color-skill-background: #fff}@media (prefers-color-scheme: dark){:root{--color-background: #1a1c21;--color-foreground: #d1d2d3;--color-contrast: #f1f2f3;--color-secondary: #858689;--color-tetriary: #9b9b9f;--color-underline: #555657;--shadow-color: 0deg 0% 5%;--selection-color: #1d3148;--color-button-background: #38383d;--color-button-background-hover: #3e3e42;--color-alert-background: #131315;--color-alert-border: #0070ec;--color-hey-primary: #6b46c1;--color-hey-background: #1a1a1a;--color-code-background: #2e2e33;--color-border: #2e2e33;--color-star: #ff6b75;--color-skill-background: #2e2e33}}.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:4em}.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-button-background);border-radius:.5rem;border:1px solid transparent;color:var(--color-button-text);-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-button-background-hover);color:var(--color-button-text)}.button--hey{color:var(--color-hey-primary);background-color:var(--color-hey-background);border:1px solid var(--color-hey-primary);padding:0 1rem}.button--hey:hover,.button--hey:focus-visible{background-color:var(--color-hey-background);color:var(--color-hey-primary)}.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}.timeline-section{background-color:var(--color-skill-background);box-shadow:var(--shadow-elevation-low);padding:1em;border-radius:.5em;margin-bottom:5em}
