.nav-header-wrapper{padding:2em 0}.py-nav-compact{display:none}.py-nav{text-align:left;letter-spacing:.01em;max-width:1200px;margin:0 auto;padding:0 2em;font-family:Fira Code,JetBrains Mono,Consolas,Monaco,Courier New,monospace;font-size:.82em;line-height:1.85}.py-line{white-space:nowrap}.py-indent{padding-left:2em}.py-var{color:#7ecff4}.py-operator{color:#d4d4d4bf}.py-bracket{color:#f2849ed9}.py-string{color:#e6eef6d9}.py-link{color:#e6eef6;text-underline-offset:.3em;cursor:pointer;padding:.25em 0;-webkit-text-decoration:underline #e6eef659;text-decoration:underline #e6eef659;text-decoration-thickness:1px;transition:color .18s,text-decoration-color .18s,text-shadow .18s;display:inline-block}.py-link:hover{color:#f2849e;text-decoration-color:#f2849ed9}.py-link.active{color:#f2849e;font-weight:600;text-decoration-color:#f2849ef2}.py-link.active:hover{color:#ff96b0;text-decoration-color:#ff96b0}.nav-caret{vertical-align:-2px;background:#f2849e;width:.55em;height:1.05em;margin-left:7px;animation:1.1s step-end infinite navCaretBlink;display:inline-block}@keyframes navCaretBlink{50%{opacity:0}}@media screen and (width<=980px){.py-nav{padding:0 1em;font-size:.78em}}@media screen and (width<=736px){.nav-header-wrapper{padding:1.2em 0}.py-nav{display:none}.py-nav-compact{max-width:720px;margin:0 auto;padding:0 .9em;display:block;position:relative}.py-nav-compact select{appearance:none;color:#fff;background:#ffffff08;border:1px solid #ffffff0f;border-radius:8px;width:100%;min-height:44px;padding:.6em 3em .6em .8em;font-size:1em}.py-nav-compact:after{content:"▾";pointer-events:none;color:#fff;opacity:.95;font-size:1.5em;position:absolute;top:50%;right:1.1em;transform:translateY(-50%)}}#menu{display:none!important}a:focus-visible,button:focus-visible,select:focus-visible,[tabindex]:focus-visible{outline-offset:2px;border-radius:4px;outline:2px solid #f2849e}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}:where(.projects-page) .projects-grid{grid-template-columns:repeat(auto-fit,minmax(350px,1fr));gap:2rem;margin-top:3rem;display:grid}:where(.projects-page) .project-card{background:#ffffff08;border:1px solid #ffffff1a;border-radius:16px;flex-direction:column;padding:2rem;transition:all .3s cubic-bezier(.4,0,.2,1);display:flex;position:relative;overflow:hidden}:where(.projects-page) .project-card:before{content:"";transform-origin:0;background:linear-gradient(90deg,#f2849e 0%,#7ecff4 100%);height:4px;transition:transform .3s;position:absolute;top:0;left:0;right:0;transform:scaleX(0)}:where(.projects-page) .project-card:hover:before{transform:scaleX(1)}:where(.projects-page) .project-card:hover{background:#ffffff0d;border-color:#f2849e66;transform:translateY(-8px);box-shadow:0 20px 40px #0006,0 0 0 1px #f2849e33}:where(.projects-page) .project-header{align-items:flex-start;gap:1rem;margin-bottom:1.5rem;display:flex}:where(.projects-page) .project-icon{color:#f2849e;background:#f2849e1a;border:1px solid #f2849e4d;border-radius:12px;flex-shrink:0;justify-content:center;align-items:center;width:48px;height:48px;display:flex}:where(.projects-page) .project-icon svg{width:28px;height:28px}:where(.projects-page) .project-title{color:#fff;white-space:normal;overflow-wrap:anywhere;word-break:normal;-webkit-hyphens:auto;hyphens:auto;flex-wrap:wrap;align-items:center;gap:.75rem;max-width:100%;margin:0;font-size:clamp(1.1rem,1.2vw + .6rem,1.5rem);font-weight:700;line-height:1.25;display:flex}@media (width<=420px){:where(.projects-page) .project-title{font-size:1.15rem}}:where(.projects-page) .rag-badge{letter-spacing:.1em;text-transform:uppercase;color:#fff;background:linear-gradient(135deg,#f2849e 0%,#ff96b0 100%);border:1px solid #fff3;border-radius:6px;padding:.3rem .7rem;font-size:.55em;font-weight:700;display:inline-block;box-shadow:0 2px 8px #f2849e4d}:where(.projects-page) .project-description{color:#ffffffb3;flex-grow:1;margin-bottom:1.5rem;line-height:1.7}:where(.projects-page) .project-description p{margin:0 0 1rem}:where(.projects-page) .project-tech{flex-wrap:wrap;gap:.5rem;margin-bottom:1.5rem;display:flex}:where(.projects-page) .tech-badge{letter-spacing:.05em;text-transform:uppercase;color:#fffc;background:#ffffff0f;border:1px solid #ffffff1f;border-radius:6px;padding:.4rem .8rem;font-size:.8em;font-weight:600;transition:all .2s;display:inline-block}:where(.projects-page) .tech-badge:hover{color:#f2849e;background:#f2849e26;border-color:#f2849e66}:where(.projects-page) .project-actions{flex-wrap:wrap;gap:.75rem;display:flex}:where(.projects-page) .project-btn,:where(.projects-page) .project-btn-alt{border:2px solid;border-radius:8px;justify-content:center;align-items:center;padding:.75rem 1.5rem;font-size:.9em;font-weight:600;text-decoration:none;transition:all .2s;display:inline-flex}:where(.projects-page) .project-btn{color:#fff;background:#f2849e;border-color:#f2849e}:where(.projects-page) .project-btn:hover{background:#ff96b0;border-color:#ff96b0;transform:translateY(-2px);box-shadow:0 8px 20px #f2849e4d}:where(.projects-page) .project-btn-alt{color:#ffffffe6;background:0 0;border-color:#fff3}:where(.projects-page) .project-btn-alt:hover{color:#7ecff4;background:#7ecff41a;border-color:#7ecff4;transform:translateY(-2px)}:where(.projects-page) .project-btn-alt.is-disabled{cursor:not-allowed;opacity:.65;pointer-events:none;color:#fff9;background:#ffffff08;border-color:#ffffff1f}@media screen and (width<=736px){:where(.projects-page) .projects-grid{grid-template-columns:1fr;gap:1.5rem}:where(.projects-page) .project-card{padding:1.5rem}:where(.projects-page) .project-title{font-size:1.3em}}:root{--ink-mute:#9aa69d}.cv__head .avatar.small{box-shadow:0 20px 60px -20px var(--accent-glow);border:0}.cv__head .portrait-trigger{width:120px;height:120px;box-shadow:none;cursor:zoom-in;background:0 0;border:0;border-radius:50%;flex-shrink:0;padding:0;line-height:0;display:block;position:relative}.portrait-trigger .avatar{display:block}.portrait-zoom{background:var(--surface-2);width:28px;height:28px;color:var(--accent);border-radius:50%;place-items:center;display:grid;position:absolute;bottom:0;right:0}.portrait-zoom svg{width:17px;height:17px}.portrait-trigger:hover .portrait-zoom{background:var(--accent);color:var(--bg)}.dialog .portrait-enlarged{object-fit:contain;width:100%;height:auto;max-height:calc(100dvh - 130px);margin:0;padding:16px;display:block}.hero-actions .button,.cta-actions .button{color:#24131a!important}.hero-actions .button.alt,.cta-actions .button.alt{box-shadow:inset 0 0 0 1px #7e596c;color:var(--ink)!important}.project-actions .button:not(.is-disabled){color:var(--ink)!important}.project-actions .button.primary,.project-actions .project-btn{color:#24131a!important}.project-actions .project-btn-alt:not(.is-disabled){background:#f2849e0f;border-color:#7e596c}.project-actions .project-btn-alt:not(.is-disabled):hover{border-color:var(--accent);background:#f2849e24}.project-actions .button.is-disabled{border-color:var(--border);opacity:1;background:0 0;color:#9aa69d!important}.status-board-head,.status-state,.gh-total-label,.gh-link,.gh-legend{font-size:.75rem;line-height:1.6}.status-board-head{flex-wrap:wrap;gap:8px 16px}.projects-page .rag-badge{color:#24131a;font-size:.75rem}.projects-page .tech-badge{padding:.3rem .65rem;font-size:.75rem}.projects-page .project-header{margin-bottom:1rem}.projects-page .project-description{flex-grow:0;margin-bottom:1rem}.projects-page .project-tech{gap:.5rem;margin-bottom:1.25rem}.projects-page .project-actions{gap:.625rem;margin-top:auto}.projects-page .project-actions .button{white-space:normal;text-align:center;height:auto;min-height:44px;padding:.7rem 1rem;line-height:1.4}.projects-page .project-thumb{aspect-ratio:16/9;margin:-24px -24px 1.5rem}.projects-page button.project-thumb{width:calc(100% + 48px)}.projects-page .project-thumb img{aspect-ratio:16/9;object-fit:contain;object-position:center;height:auto}.projects-page .project-thumb.thumb-zoom img{padding:12px}.projects-page .project-card:hover .project-thumb img{transform:none}.featured-thumb{aspect-ratio:16/9}.featured-thumb img{object-fit:contain;object-position:center}.chat-widget-header{flex-wrap:wrap;gap:8px}.chat-status{color:var(--ink-mute);font:500 .75rem/1.5 var(--font-mono);margin-left:auto}.chat-status[data-busy=true]{color:var(--accent-2)}.chat-widget[data-busy=true] .chat-widget-header .dot{background:var(--accent-2);box-shadow:0 0 10px #7ecff499}.chat-widget .chat-input-row button:disabled{cursor:not-allowed}.chat-widget[data-busy=true] .chat-input-row button{cursor:progress}@media (width<=736px){.py-nav-compact .nav-label{font:500 .75rem/1.5 var(--font-mono);color:var(--ink-mute);letter-spacing:.06em;margin:0 0 6px;display:block}.py-nav-compact select{border-color:#42424f}.py-nav-compact:after{top:auto;bottom:22px;transform:translateY(50%)}}:root{--pink:var(--accent);--blue:var(--accent-2);--surface-raised:var(--surface-2);--mono:var(--font-mono)}.dialog{border-radius:var(--radius);background:var(--surface);width:min(720px,100vw - 32px);max-width:calc(100vw - 32px);max-height:calc(100dvh - 32px);color:var(--ink);border:1px solid #43485e;margin:auto;padding:0;overflow:auto;box-shadow:0 40px 120px #0009}.dialog-wide{width:min(1080px,100vw - 32px,177.778dvh - 320px)}.dialog::backdrop{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:#090a10db}.dialog-header{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;gap:16px;padding:12px 16px 12px 24px;display:flex}.dialog-header h2{font-family:var(--mono);letter-spacing:0;color:var(--pink);font-size:.8rem;line-height:1.6}.close-button{border:1px solid var(--border);background:var(--surface-raised);width:44px;height:44px;color:var(--ink);border-radius:50%;flex-shrink:0;place-items:center;padding:0;font-size:1.6rem;line-height:1;display:grid}.close-button:hover{border-color:var(--pink);color:var(--pink)}.video-frame{aspect-ratio:16/9;background:var(--bg);position:relative}.video-frame iframe{border:0;width:100%;height:100%;position:absolute;inset:0}.dialog-body{padding:22px 24px}.dialog-body h3{margin-bottom:8px;font-size:1rem}.dialog-diagram{object-fit:contain;width:100%;max-height:75dvh;padding:16px}.apology-text{white-space:pre-wrap}.skip-link{z-index:100;background:var(--pink);color:var(--bg);padding:12px;position:fixed;top:8px;left:8px;transform:translateY(-200%)}.skip-link:focus{transform:none}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.dialog .close-button{width:44px;min-width:44px;height:44px;box-shadow:none;text-transform:none;letter-spacing:0;padding:0;line-height:1}.dialog-header h2:before{content:none}.dialog .dialog-body{padding:22px 24px}.dialog-body h3{margin-bottom:8px}.dialog .dialog-diagram{margin:0}.dialog .video-frame iframe{border:0;width:100%;height:100%;position:absolute;inset:0}.video-preview{aspect-ratio:16/9;background:var(--surface);width:100%;height:auto;box-shadow:none;text-transform:none;letter-spacing:normal;border:0;border-radius:0;padding:0;line-height:normal;display:block;position:relative;overflow:hidden}.video-preview img{object-fit:cover;width:100%;height:100%;position:absolute;inset:0}.video-preview .play-icon{background:var(--accent);width:56px;height:56px;color:var(--bg);z-index:1;border-radius:50%;place-items:center;display:grid;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 0 0 7px #f2849e26}.play-icon svg{fill:currentColor;width:24px;height:24px;margin-left:3px}.video-preview:focus-visible{outline-offset:-4px}.error,.chat-error{color:#ffb2c4}.chat-error{margin:0;padding:8px 16px;font-size:.85rem}.chat-widget .chat-message{flex-shrink:0}.chat-widget .chat-trace{border-bottom:0;max-height:180px;margin:0;overflow:auto}.chat-trace summary{cursor:pointer;min-height:32px}.chat-trace ul{padding-left:18px}.chat-trace p{margin:6px 0}.chat-widget-body{overscroll-behavior:contain}.chat-input-row input{min-width:0}.chat-input-row button:disabled{cursor:wait}.gh-heatmap svg{width:100%;height:auto;display:block}.gh-axis-label{font-family:var(--font-mono)}.resource-message{color:var(--ink-soft);border:1px solid var(--border);border-radius:6px;padding:20px;font-size:.9rem}.resource-message a{margin-left:8px}.nojs-nav{display:none}.cta-banner h2{margin:0 0 .75rem}.cta-banner p{max-width:600px;margin:0 auto 1.5rem}@media (width<=736px){.nojs-nav{gap:20px;padding:0 16px;display:flex}.dialog-wide{width:calc(100vw - 24px)}.cv .timeline:not(.timeline-compact) .timeline-item:before{left:calc(-1 * var(--s-5) - 4px)}}
