@font-face{font-family:Space Grotesk;src:url(/fonts/space-grotesk-var.woff2) format("woff2-variations");font-weight:300 700;font-style:normal;font-display:swap}@font-face{font-family:Switzer;src:url(/fonts/switzer-400.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Switzer;src:url(/fonts/switzer-500.woff2) format("woff2");font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:Switzer Fallback;src:local("Arial");size-adjust:96%;ascent-override:97%;descent-override:24%;line-gap-override:0%}:root{--bg: #0a0a0a;--surface: #0a0a0a;--text: #f2f2f2;--text-dim: #9a9a9a;--accent: #ccff00;--accent-2: #a78bfa;--font-display: "Space Grotesk", sans-serif;--font-body: "Switzer", "Switzer Fallback", sans-serif;--space: clamp(4rem, 10vh, 8rem);--pad-x: clamp(1.25rem, 5vw, 4rem)}*,*:before,*:after{box-sizing:border-box;margin:0}html{scroll-behavior:smooth}body{background:var(--bg);color:var(--text);font-family:var(--font-body);line-height:1.65;letter-spacing:.005em;-webkit-font-smoothing:antialiased}h1,h2,h3{font-family:var(--font-display);line-height:1.05;letter-spacing:-.02em}h1{font-size:clamp(2.75rem,9vw,7rem);font-weight:700}h2{font-size:clamp(2rem,5vw,3.5rem);margin-bottom:2rem}a{color:var(--text);text-decoration:none}.skip-link{position:absolute;top:-3rem;left:1rem;z-index:30;padding:.6rem 1.2rem;background:var(--accent);color:var(--bg);font-family:var(--font-display);font-weight:600;border-radius:.4rem;transition:top .2s ease}.skip-link:focus-visible{top:1rem;outline-color:var(--bg)}a:focus-visible,button:focus-visible,input:focus-visible,textarea:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:2px}.accent{color:var(--accent)}::selection{background:var(--accent-2);color:var(--bg)}.btn{display:inline-block;padding:.9em 1.8em;border:1px solid var(--accent);border-radius:999px;background:none;color:var(--accent);font-family:var(--font-display);font-size:1rem;font-weight:500;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;transition:background .25s,color .25s}.btn:hover{background:var(--accent);color:var(--bg)}section{padding:var(--space) var(--pad-x);max-width:1200px;margin:0 auto}.cookie-banner{position:fixed;inset:auto 0 0 0;z-index:20;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:1rem;padding:1rem var(--pad-x);background:color-mix(in srgb,var(--bg) 92%,transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-top:1px solid #1c1c1c}.cookie-banner p{margin:0;font-size:.85rem;color:var(--text-dim);max-width:60ch}.cookie-banner p a{display:inline-block;color:var(--text);text-decoration:underline;padding:.3rem 0;margin:-.3rem 0}.cookie-banner__actions{display:flex;align-items:center;gap:1rem;flex-shrink:0}.cookie-banner__decline{color:var(--text-dim);font-size:.85rem;background:none;border:none;cursor:pointer;padding:.4rem .2rem}.cookie-banner__decline:hover{color:var(--text)}.cookie-banner__accept{padding:.55em 1.4em;font-size:.85rem;cursor:pointer}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}.info-card{position:fixed;z-index:50;max-width:300px;width:max-content;padding:1.1rem 1.3rem;background:color-mix(in srgb,var(--surface) 90%,transparent);border:1px solid #2a2a2a;border-left:3px solid var(--accent);border-radius:.9rem;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);box-shadow:0 14px 44px #0000008c;opacity:0;transform:translateY(8px) scale(.98);transition:opacity .25s,transform .25s}.info-card.is-open{opacity:1;transform:none}.info-card__title{font-family:var(--font-display);font-size:1.1rem;margin-bottom:.4rem;padding-right:1rem}.info-card__text{color:var(--text-dim);font-size:.9rem;line-height:1.5}.info-card__close{position:absolute;top:.45rem;right:.6rem;background:none;border:none;color:var(--text-dim);font-size:1.3rem;line-height:1;cursor:pointer;transition:color .2s}.info-card__close:hover{color:var(--accent)}@media(max-width:700px){.info-card{max-width:min(300px,calc(100vw - 3rem))}}.skill-card{grid-column:1 / -1;overflow:hidden;margin-top:.35rem}.skill-card__inner{position:relative;padding:clamp(1.5rem,3vw,2.5rem);padding-right:clamp(3rem,5vw,4rem);border-radius:1rem;background:linear-gradient(180deg,color-mix(in srgb,var(--brand, var(--accent)) 12%,transparent),transparent 55%),var(--surface);border:1px solid color-mix(in srgb,var(--brand, var(--accent)) 22%,#1e1e1e);box-shadow:0 18px 50px #00000073}.skill-card__title{font-family:var(--font-display);font-size:clamp(1.75rem,3.4vw,2.75rem);font-weight:700;letter-spacing:-.035em;line-height:1.05;text-wrap:balance}.skill-card__badge{display:inline-block;margin-top:.85rem;padding:.25rem .7rem;border:1px solid color-mix(in srgb,var(--accent-2) 45%,transparent);border-radius:999px;color:var(--accent-2);font-family:var(--font-display);font-size:.75rem;font-weight:500;letter-spacing:.04em;text-transform:uppercase}.skill-card__badge[hidden]{display:none}.skill-card__text{max-width:46ch;margin-top:1.1rem;color:var(--text-dim);font-size:1.0625rem;line-height:1.6}.skill-card__bullets{list-style:none;margin-top:1.6rem;padding:0;columns:2;column-gap:2.5rem;color:var(--text);font-size:.95rem;line-height:1.55}.skill-card__bullets>li{position:relative;break-inside:avoid;padding-left:1.1rem;margin-bottom:.55rem}.skill-card__bullets>li:before{content:"";position:absolute;left:0;top:.6em;width:5px;height:5px;border-radius:50%;background:var(--brand, var(--accent))}.skill-card__bullets ul{list-style:none;margin:.4rem 0 .7rem;padding:0;color:var(--text-dim);font-size:.875rem}.skill-card__bullets ul li{position:relative;padding-left:1rem;margin-bottom:.25rem}.skill-card__bullets ul li:before{content:"";position:absolute;left:0;top:.62em;width:6px;height:1px;background:currentColor;opacity:.6}.skill-card__close{position:absolute;top:1rem;right:1rem;display:grid;place-items:center;width:2.25rem;height:2.25rem;background:none;border:1px solid #262626;border-radius:50%;color:var(--text-dim);cursor:pointer;transition:color .2s,border-color .2s,transform .2s}.skill-card__close:hover,.skill-card__close:focus-visible{color:var(--text);border-color:var(--brand, var(--accent));transform:rotate(90deg)}@media(max-width:560px){.skill-card__bullets{columns:1}}.nav{position:fixed;inset:0 0 auto 0;display:flex;justify-content:space-between;align-items:center;padding:1rem var(--pad-x);background:color-mix(in srgb,var(--bg) 80%,transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);z-index:10}.nav-logo{display:inline-block;font-family:var(--font-display);font-weight:700;font-size:1.25rem;color:var(--accent);padding:0 .25rem;margin:0 -.25rem}.nav nav{display:flex;gap:1.5rem}.nav nav a{color:var(--text-dim);font-size:.95rem;transition:color .2s}.nav nav a:hover,.nav nav a.active{color:var(--accent)}.scroll-progress{position:absolute;left:0;right:0;bottom:0;height:2px;background:linear-gradient(90deg,var(--accent),var(--accent-2));transform:scaleX(0);transform-origin:left}.hero{min-height:100svh;max-width:none;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:1.5rem;position:relative;overflow:hidden}.hero h1 .hero-line{display:block;overflow:hidden;padding-bottom:.16em;margin-bottom:-.16em}.hero h1 .hero-line-inner{display:block}#hero-canvas{position:absolute;top:0;right:0;width:50%;height:100%;z-index:-1;pointer-events:none;-webkit-mask-image:linear-gradient(90deg,transparent 0%,#000 24%);mask-image:linear-gradient(90deg,transparent 0%,#000 24%)}#hero-canvas canvas{width:100%;height:100%;display:block}.hero-objects button{position:absolute;top:0;left:0;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;padding:0}.hero-objects button:focus{top:5.5rem;left:var(--pad-x);width:auto;height:auto;max-width:calc(100vw - 2 * var(--pad-x));overflow:visible;clip:auto;white-space:normal;z-index:15;padding:.5em .9em;background:var(--bg);color:var(--text);border:1px solid var(--accent);border-radius:8px;font-family:var(--font-body);font-size:.85rem;cursor:pointer}.hero-objects button:disabled{cursor:default}@media(max-width:700px),(max-width:1024px)and (orientation:portrait){#hero-canvas{order:1;position:relative;top:auto;right:auto;width:100%;height:46svh;margin-top:2.5rem;-webkit-mask-image:none;mask-image:none}.hero{padding-bottom:2.5rem}}@media(max-width:700px){.hero .btn{display:none}}.hero-hint{position:absolute;bottom:calc(2.2rem + var(--cookie-banner-h, 0px));right:25%;transform:translate(50%);color:var(--text-dim);font-family:var(--font-display);font-size:.85rem;letter-spacing:.04em;opacity:.75;transition:opacity .4s}.hero-hint.is-hidden{opacity:0;pointer-events:none}@media(max-width:700px),(max-width:1024px)and (orientation:portrait){.hero-hint{order:2;position:static;display:block;width:100%;margin-top:.9rem;text-align:center;transform:none}}@media(min-width:701px)and (max-width:1024px)and (orientation:portrait){.hero h1{font-size:clamp(2.75rem,6.4vw,4.5rem)}.hero-subtitle,.hero-tagline{max-width:40rem}.hero{padding-block:5.5rem 2rem}#hero-canvas{flex:1 1 0;height:auto;min-height:14rem;margin-top:1rem;overflow:hidden}}@media(min-width:701px)and (max-width:1366px)and (orientation:landscape){.hero h1{font-size:clamp(2.5rem,6.2vw,4.5rem)}.hero-subtitle,.hero-tagline{max-width:26rem}}.hero-kicker{color:var(--accent);font-family:var(--font-display);font-size:1.1rem}.hero-subtitle{color:var(--text);font-family:var(--font-display);font-weight:500;font-size:1.3rem;max-width:34rem;margin-top:.5rem}.hero-tagline{color:var(--text-dim);max-width:34rem;font-size:1.15rem;margin-top:.35rem}.marquee{overflow:hidden;border-top:1px solid #1c1c1c;border-bottom:1px solid #1c1c1c;padding:1.1rem 0}.marquee-track{display:flex;width:max-content;animation:marquee 28s linear infinite}.marquee-track span{display:flex;align-items:center;white-space:nowrap;font-family:var(--font-display);font-size:clamp(1.4rem,3.5vw,2.4rem);font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:transparent;-webkit-text-stroke:1px color-mix(in srgb,var(--accent) 70%,transparent)}.marquee-track span:nth-child(2n){-webkit-text-stroke-color:color-mix(in srgb,var(--accent-2) 75%,transparent)}.marquee-track span:after{content:"•";margin:0 1.4rem;-webkit-text-stroke-color:color-mix(in srgb,var(--text-dim) 60%,transparent)}@keyframes marquee{to{transform:translate(-50%)}}@media(prefers-reduced-motion:reduce){.marquee-track{animation:none}.skills-hint{animation:none;background:none;color:var(--text-dim)}.skills.is-focused .skills-grid>li:not(.is-active){filter:none}.hw-line--power-pulse,.hw-line--lan-pulse,.hw-line--ftth-pulse{animation:none;opacity:0}}.about-grid{display:grid;grid-template-columns:2fr 1fr;gap:3rem;align-items:center}.about-grid p{font-size:1.2rem;color:var(--text-dim)}.about-grid p strong{color:color-mix(in srgb,var(--text) 50%,var(--text-dim));font-weight:600}.about-photo{width:100%;height:auto;aspect-ratio:1;border-radius:1rem;object-fit:cover;display:block;background:linear-gradient(135deg,color-mix(in srgb,var(--accent-2) 20%,var(--surface)),color-mix(in srgb,var(--accent) 25%,var(--surface)))}.skill-group+.skill-group{margin-top:clamp(2.5rem,4vw,3.5rem)}.skill-group>h3{display:flex;align-items:baseline;gap:1.25rem;margin-bottom:1.25rem;font-family:var(--font-display);font-size:clamp(1.25rem,2.2vw,1.75rem);font-weight:500;letter-spacing:-.03em;color:var(--text);transition:opacity .4s ease}.skill-group>h3:after{content:"";flex:1;height:1px;background:linear-gradient(90deg,#2a2a2a,transparent)}.skills-grid{list-style:none;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(13.5rem,1fr));gap:.75rem}.skills-grid>li{--tile-wash: 6%;position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:.9rem;padding:1.15rem 1.15rem 1rem;background:linear-gradient(0deg,color-mix(in srgb,var(--brand, var(--accent)) var(--tile-wash),transparent),transparent 70%),var(--surface);border:1px solid #1e1e1e;border-radius:.9rem;cursor:pointer;transition:border-color .25s,transform .25s,background .35s,opacity .35s,filter .35s}.skills-grid>li:hover,.skills-grid>li:focus-visible{--tile-wash: 14%;border-color:color-mix(in srgb,var(--brand, var(--accent)) 45%,#1e1e1e);transform:translateY(-3px)}.skills-grid li:focus-visible{outline:2px solid var(--brand, var(--accent));outline-offset:3px}.skills-grid>li.is-active{--tile-wash: 22%;border-color:color-mix(in srgb,var(--brand, var(--accent)) 70%,transparent);transform:translateY(-3px)}.skill-icon{width:34px;height:34px;transition:transform .25s}.skills-grid>li:hover .skill-icon,.skills-grid>li.is-active .skill-icon{transform:scale(1.08)}.skill-label{font-family:var(--font-display);font-size:.9375rem;font-weight:500;letter-spacing:-.01em;line-height:1.25;text-wrap:balance}.skills.is-focused .skills-grid>li:not(.is-active){opacity:.32;filter:blur(2px)}.skills.is-focused .skill-group:not(.has-open-card)>h3{opacity:.32}.skills-hint{margin-bottom:2.5rem;font-size:clamp(1.1rem,2vw,1.35rem);font-weight:600;letter-spacing:-.01em;transition:opacity .4s ease;background:linear-gradient(90deg,var(--text-dim) 0%,var(--text-dim) 40%,var(--accent) 50%,var(--accent-2) 60%,var(--text-dim) 70%,var(--text-dim) 100%);background-size:300% 100%;background-position:110% center;-webkit-background-clip:text;background-clip:text;color:transparent;animation:hint-shine 3s linear infinite}.skills.is-focused .skills-hint{opacity:0}.projects-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1.5rem}.card{background:var(--surface);border:1px solid #222;border-radius:1rem;padding:1.25rem;display:flex;flex-direction:column;gap:.75rem;transition:border-color .2s,transform .2s;position:relative;overflow:hidden}.card:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:radial-gradient(280px circle at var(--mx, 50%) var(--my, 50%),color-mix(in srgb,var(--accent) 10%,transparent),transparent 70%);opacity:0;transition:opacity .3s;pointer-events:none}.card:hover:before{opacity:1}.card:hover{border-color:var(--accent);transform:translateY(-4px)}.card-thumb{width:100%;height:auto;aspect-ratio:16 / 10;border-radius:.5rem;background:linear-gradient(135deg,#1d1d1d,#101010);object-fit:cover;display:block}.card-thumb--soon{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;border:1px dashed color-mix(in srgb,var(--text-dim) 40%,transparent);background:color-mix(in srgb,var(--text) 4%,var(--bg));color:var(--text-dim);font-size:.85rem}.card-thumb--soon svg{width:28px;height:28px}.card p{color:var(--text-dim);font-size:.95rem}.card-links{display:flex;gap:1rem;margin-top:auto}.card-links a{color:var(--accent);font-size:.9rem}.card-links a:hover{text-decoration:underline}.card-links a:only-child:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit}.contact{text-align:center}.contact p{color:var(--text-dim);margin-bottom:2rem}.contact-links{display:flex;justify-content:center;gap:1.5rem;margin-top:2rem}.contact-links a{color:var(--text-dim)}.contact-links a:hover{color:var(--accent)}.page-hero{padding-top:calc(var(--space) + 4rem)}.homelab-page #project,.homelab-page #description,.homelab-page #hardware,.homelab-page #services{padding-bottom:calc(var(--space) * .4)}.page-hero h1{font-size:clamp(2.5rem,7vw,5rem)}.project-meta{color:var(--text-dim);font-family:var(--font-display);margin-top:1rem}.project-cover{width:100%;aspect-ratio:21 / 9;object-fit:cover;border-radius:1rem;margin-top:3rem;display:block}.project-description p{font-size:1.2rem;color:var(--text-dim);max-width:44rem}.project-description-text p strong{color:color-mix(in srgb,var(--text) 50%,var(--text-dim));font-weight:600}.project-description p+p{margin-top:1.5rem}.project-description-grid{display:grid;grid-template-columns:2fr 3fr;gap:3rem;align-items:start}.project-description-text,.project-description-photos{min-width:0}.project-description-photos{display:flex;flex-direction:column;gap:2rem}.project-photo-row{display:flex;align-items:flex-start;gap:1rem}.project-photo{flex:1;min-width:0;height:auto;aspect-ratio:3 / 4;object-fit:cover;border-radius:1rem;display:block}p.project-specs__kicker{color:var(--accent);font-family:var(--font-display);font-size:.95rem;margin-bottom:1rem}.project-specs__list{display:grid;gap:.85rem}.project-specs__list>div{display:grid;grid-template-columns:7rem 1fr;gap:1rem}.project-specs__list dt{color:var(--text-dim);font-size:.85rem}.project-specs__list dd{margin:0;color:var(--text);font-size:.95rem}.project-specs__credit{margin-top:1.5rem;font-size:.85rem;color:var(--text-dim)}.project-specs__credit a{color:var(--text-dim);transition:color .2s}.project-specs__credit a:hover{color:var(--accent)}.project-specs__credit a:before{content:"↗ ";color:var(--accent-2)}.project-video video{width:100%;height:auto;border-radius:1rem;display:block}.gallery{columns:280px 3;gap:1rem}.gallery img{width:100%;height:auto;border-radius:.75rem;margin-bottom:1rem;display:block}.gallery.is-observed img{opacity:0;transform:translateY(28px);transition:opacity .6s ease-out,transform .6s ease-out}.gallery.is-observed img.is-visible{opacity:1;transform:none}.featured-links{list-style:none;padding:0;display:flex;flex-direction:column;gap:.75rem}.featured-links a{color:var(--text-dim);transition:color .2s}.featured-links a:hover{color:var(--accent)}.featured-links a:before{content:"↗ ";color:var(--accent-2)}.project-back{text-align:center}.homelab-diagram{width:fit-content;max-width:100%}.homelab-services-section{max-width:calc(472px + 3.5rem + 28rem + 2 * var(--pad-x))}.homelab-services-section .section-hint{margin-bottom:2.5rem;font-size:clamp(1.1rem,2vw,1.35rem);font-weight:500;letter-spacing:-.01em;background:linear-gradient(90deg,var(--text-dim) 0%,var(--text-dim) 40%,var(--accent) 50%,var(--accent-2) 60%,var(--text-dim) 70%,var(--text-dim) 100%);background-size:300% 100%;background-position:110% center;-webkit-background-clip:text;background-clip:text;color:transparent;animation:hint-shine 3s linear infinite}@keyframes hint-shine{0%{background-position:110% center}to{background-position:10% center}}@media(prefers-reduced-motion:reduce){.homelab-services-section .section-hint{animation:none;background:none;color:var(--text-dim)}}.hd-tree{position:relative;display:flex;align-items:flex-start;--hd-rule: color-mix(in srgb, var(--text-dim) 50%, transparent);--hd-stub: .78rem;--hd-branch-pad: .9rem;--hd-hub-size: 8.5rem;--hd-gap: 3.5rem;--hd-leaf-h: 1.95rem;--hd-leaf-icon: 23px;--hd-card-pad: 1.5rem;--hd-card-icon: 36px;--hd-hub-icon: 36px}.hd-hub{position:relative;flex:none;width:var(--hd-hub-size);height:var(--hd-hub-size);margin-right:var(--hd-gap);border:1px solid var(--text);border-radius:50%}.hd-hub:after{content:"";position:absolute;left:100%;top:50%;width:var(--hd-gap);border-top:1px solid var(--hd-rule)}.hd-hub__button{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.45rem;width:100%;height:100%;border-radius:50%;font-family:var(--font-display);font-size:1rem;font-weight:700;letter-spacing:-.01em;color:var(--text)}.hd-hub .hd-icon{width:var(--hd-hub-icon);height:var(--hd-hub-icon)}.hd-branches,.hd-leaves{list-style:none;margin:0;padding:0}.hd-branch{position:relative;padding:var(--hd-branch-pad) 0 var(--hd-branch-pad) 2.25rem;border-left:1px solid var(--hd-rule)}.hd-branch:before{content:"";position:absolute;left:0;top:calc(var(--hd-branch-pad) + var(--hd-stub));width:1.6rem;border-top:1px solid var(--hd-rule)}.hd-branch:first-of-type,.hd-branch:last-of-type{border-left-color:transparent}.hd-branch:first-of-type:after,.hd-branch:last-of-type:after{content:"";position:absolute;left:-1px;border-left:1px solid var(--hd-rule)}.hd-branch:first-of-type:after{top:calc(var(--hd-branch-pad) + var(--hd-stub));bottom:0}.hd-branch:last-of-type:after{top:0;height:calc(var(--hd-branch-pad) + var(--hd-stub))}.hd-branch__label{font-family:var(--font-display);font-size:1.3rem;font-weight:500;line-height:1.3;letter-spacing:-.01em;color:var(--text)}.hd-leaves{margin-top:.5rem}.hd-leaf{position:relative;padding-left:1.6rem;border-left:1px solid var(--hd-rule)}.hd-leaf__button{display:flex;align-items:center;gap:.75rem;min-height:var(--hd-leaf-h);padding-right:.4rem;font-size:1rem;color:var(--text-dim)}.hd-leaf:before{content:"";position:absolute;left:0;top:50%;width:1.1rem;border-top:1px solid var(--hd-rule)}.hd-leaf:last-of-type{border-left-color:transparent}.hd-leaf:last-of-type:after{content:"";position:absolute;left:-1px;top:0;height:50%;border-left:1px solid var(--hd-rule)}.hd-hub__button,.hd-leaf__button{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;border:0;background:none;font:inherit;text-align:left;cursor:pointer;transition:color .2s ease,opacity .2s ease}.hd-hub__button:disabled,.hd-leaf__button:disabled{cursor:default}.hd-leaf__button:hover:not(:disabled),.hd-leaf__button[aria-expanded=true]{color:var(--text)}.hd-tree.is-focused .hd-leaf__button:not([aria-expanded=true]) .hd-icon,.hd-tree.is-focused .hd-hub__button:not([aria-expanded=true]) .hd-icon{opacity:.4}.hd-tree.is-focused .hd-leaf__button:not([aria-expanded=true]) .hd-row-label,.hd-tree.is-focused .hd-hub__button:not([aria-expanded=true]) .hd-row-label{color:color-mix(in srgb,var(--text-dim) 83%,var(--bg))}.hd-hub__button[aria-expanded=true]{color:var(--text)}.hd-hub:has(.hd-hub__button[aria-expanded=true]):after{border-top-color:var(--accent)}.hd-branch:has(.hd-leaf__button[aria-expanded=true]){border-left-color:var(--accent)}.hd-branch:has(.hd-leaf__button[aria-expanded=true]):before{border-top-color:var(--accent)}.hd-leaf:has(.hd-leaf__button[aria-expanded=true]){border-left-color:var(--accent)}.hd-leaf:has(.hd-leaf__button[aria-expanded=true]):before{border-top-color:var(--accent)}.hd-icon{flex:none;width:var(--hd-leaf-icon);height:var(--hd-leaf-icon);object-fit:contain}.hd-card{position:relative;max-width:32rem;margin:.75rem 0 .35rem;overflow:hidden}.hd-card__inner{position:relative;padding:var(--hd-card-pad) calc(var(--hd-card-pad) + .1rem) calc(var(--hd-card-pad) + .15rem);border:1px solid color-mix(in srgb,var(--text-dim) 30%,transparent);border-radius:.6rem;background:color-mix(in srgb,var(--text) 4%,var(--bg))}.hd-card__head{display:flex;align-items:center;gap:.75rem;margin-bottom:.75rem;padding-right:1.75rem}.hd-card__head .hd-icon{width:var(--hd-card-icon);height:var(--hd-card-icon)}.hd-card__title{font-family:var(--font-display);font-size:1.3rem;font-weight:500;letter-spacing:-.01em;color:var(--text)}.hd-card__text{font-size:1rem;line-height:1.65;color:var(--text-dim)}.hd-card__close{position:absolute;top:.6rem;right:.6rem;display:grid;place-items:center;width:1.75rem;height:1.75rem;padding:0;border:0;border-radius:.35rem;background:none;color:var(--text-dim);cursor:pointer;transition:color .2s ease}.hd-card__close:hover{color:var(--text)}.hd-card__close svg{width:14px;height:14px}@media(min-width:1200px){.hd-tree{align-items:center}.hd-tree.is-focused{padding-bottom:5rem}.hd-card{position:absolute;left:calc(100% + var(--hd-gap));top:auto;width:28rem;margin:calc(-1 * (var(--hd-leaf-h) / 2 + var(--hd-card-pad) + var(--hd-card-icon) / 2)) 0 0}}.homelab-hardware-scroll{overflow-x:auto;padding-bottom:.75rem;scrollbar-color:color-mix(in srgb,var(--accent-2) 55%,transparent) transparent;scrollbar-width:thin}#homelab-hardware{min-width:45rem;aspect-ratio:1000 / 525}@media(max-width:700px),(max-width:1024px)and (orientation:portrait){#homelab-hardware{min-width:0;max-width:26rem;aspect-ratio:700 / 1025}}.homelab-hardware-scroll::-webkit-scrollbar{height:6px}.homelab-hardware-scroll::-webkit-scrollbar-track{background:transparent}.homelab-hardware-scroll::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--accent-2) 55%,transparent);border-radius:999px}.homelab-hardware{--hw-lan: #22c3d1;position:relative;min-width:45rem;aspect-ratio:1000 / 525;margin:0 auto}.homelab-hardware.is-stacked{min-width:0;max-width:26rem;aspect-ratio:700 / 1025}.homelab-hardware.is-stacked .hw-label{gap:.2rem;font-size:.52rem;max-width:4.5rem}.homelab-hardware.is-stacked .hw-label svg{width:1.4rem;height:1.4rem;padding:.45rem}.homelab-hardware.is-stacked .hw-label--icon{transform:translate(-50%,-1.15rem)}.homelab-hardware.is-stacked .hw-label--room{font-size:.68rem;padding:.22rem .55rem}.homelab-hardware>svg,.homelab-hardware__labels{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%}.hw-grid-line{fill:none;stroke:#2a2a2a;stroke-width:1;opacity:.6}.hw-grid-mask{fill:var(--bg)}.hw-room{fill:color-mix(in srgb,#2a2a2a 12%,transparent);stroke:#2a2a2a;stroke-width:1.5}.hw-room--accent{fill:color-mix(in srgb,var(--accent-2) 5%,transparent);stroke:color-mix(in srgb,var(--accent-2) 55%,#2a2a2a)}.hw-room-bracket{fill:none;stroke:var(--text-dim);stroke-width:3;stroke-linecap:square}.hw-room-bracket--accent{stroke:var(--accent-2)}.hw-group{fill:color-mix(in srgb,var(--accent) 6%,transparent);stroke:var(--accent);stroke-width:1.5}.hw-node-strip{fill:color-mix(in srgb,var(--text) 15%,var(--bg));stroke:var(--text-dim);stroke-width:1}.hw-node-socket{fill:var(--accent)}.hw-line{fill:none}@keyframes hd-travel{to{stroke-dashoffset:-208}}.hw-line--power{stroke:var(--accent);stroke-width:2;stroke-dasharray:6 6;opacity:.6}.hw-line--power-pulse{stroke:var(--accent);stroke-width:2;stroke-dasharray:4 30;animation:hd-travel 2.6s linear infinite}.hw-line--lan{stroke:var(--hw-lan);stroke-width:1.5;opacity:.55}.hw-line--lan-pulse{stroke:var(--hw-lan);stroke-width:2;stroke-dasharray:6 40;animation:hd-travel 1.6s linear infinite}.hw-line--ftth{stroke:var(--accent-2);stroke-width:3;opacity:.6}.hw-line--ftth-pulse{stroke:var(--accent-2);stroke-width:3;stroke-dasharray:8 50;animation:hd-travel 1.4s linear infinite}.hw-line--data{stroke:var(--text-dim);stroke-width:1.5}.hw-line--usb{stroke:var(--text-dim);stroke-width:1.5;stroke-dasharray:2 4}.hw-label{position:absolute;transform:translate(-50%,-50%);display:flex;flex-direction:column;align-items:center;gap:.3rem;text-align:center;font-size:.66rem;color:var(--text);max-width:6rem;line-height:1.25}.hw-label__text{background:var(--bg);padding:.1rem .35rem;border-radius:.25rem}.hw-label svg{flex:none;width:2.1rem;height:2.1rem;padding:.7rem;box-sizing:content-box;border-radius:50%;background:var(--bg);stroke:var(--text)}.hw-label--icon{transform:translate(-50%,-1.75rem)}.hw-label--room{font-family:var(--font-display);font-size:.85rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:var(--text);background:var(--bg);border:1px solid color-mix(in srgb,#2a2a2a 90%,transparent);padding:.3rem .75rem;border-radius:999px;max-width:none;white-space:nowrap}.hw-label--group{transform:translateY(-50%);text-align:left;font-size:.6rem;color:var(--accent);text-transform:uppercase;letter-spacing:.04em;max-width:none;white-space:nowrap}.hw-legend{list-style:none;display:flex;flex-wrap:wrap;gap:1.5rem;max-width:45rem;margin:1rem auto 0;padding-top:1rem;justify-content:center;font-size:.85rem;color:var(--text-dim)}.hw-legend li{display:flex;align-items:center;gap:.5rem}.hw-legend__swatch{width:1.4rem;height:2px}.hw-legend__swatch--power{background:repeating-linear-gradient(to right,var(--accent) 0 4px,transparent 4px 8px)}.hw-legend__swatch--ftth{background:var(--accent-2);height:3px}.hw-legend__swatch--lan{background:var(--hw-lan, #22c3d1)}.footer{text-align:center;padding:2rem var(--pad-x);color:var(--text-dim);font-size:.85rem;border-top:1px solid #1c1c1c}.footer a{display:inline-block;color:inherit;text-decoration:underline;margin-left:.75rem;padding:.35rem 0;margin-top:-.35rem;margin-bottom:-.35rem}.footer .credits{margin-top:.5rem;font-size:.7rem;opacity:.6}@media(max-width:700px){.about-grid{grid-template-columns:1fr}.project-description-grid{grid-template-columns:1fr;gap:1.5rem}.nav nav{gap:1rem}.skills-grid{grid-template-columns:repeat(auto-fill,minmax(8.5rem,1fr));gap:.6rem}.skills-grid>li{padding:.9rem .9rem .85rem;gap:.7rem}.skill-icon{width:28px;height:28px}.skill-label{font-size:.875rem}.hd-tree{flex-direction:column;align-items:flex-start;--hd-branch-pad: .7rem;--hd-hub-size: 5rem;--hd-leaf-icon: 22px;--hd-leaf-h: 1.85rem}.hd-branch__label{font-size:1.15rem}.hd-leaf__button{font-size:.95rem}.hd-hub{margin:0 0 2rem}.hd-hub__button{gap:.25rem;font-size:.7rem}.hd-hub .hd-icon{--hd-hub-icon: 28px}.hd-hub:after{left:50%;top:100%;width:0;height:calc(2rem + var(--hd-branch-pad) + var(--hd-stub));border-top:0;border-left:1px solid var(--hd-rule)}.hd-branches{margin-left:calc(var(--hd-hub-size) / 2)}}
