h1{font-size:3.6rem;line-height:1.25}h2{font-size:2.8rem;line-height:1.3}h3{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h4{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5}h5{font-size:1.6rem;letter-spacing:0;line-height:1.4}h6{font-size:1.4rem;letter-spacing:0;line-height:1.2}pre{padding:1em}select{width:auto}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert p{margin-bottom:0}.alert:empty{display:none}.invalid-feedback{color:#a94442;display:block;margin:-1rem 0 2rem}.phx-no-feedback.invalid-feedback,.phx-no-feedback .invalid-feedback{display:none}.phx-click-loading{opacity:.5;transition:opacity 1s ease-out}.phx-loading{cursor:wait}.phx-modal{opacity:1!important;position:fixed;z-index:1;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:#0006}.phx-modal-content{background-color:#fefefe;margin:15vh auto;padding:20px;border:1px solid #888;width:80%}.phx-modal-close{color:#aaa;float:right;font-size:28px;font-weight:700}.phx-modal-close:hover,.phx-modal-close:focus{color:#000;text-decoration:none;cursor:pointer}.fade-in-scale{animation:.2s ease-in 0s normal forwards 1 fade-in-scale-keys}.fade-out-scale{animation:.2s ease-out 0s normal forwards 1 fade-out-scale-keys}.fade-in{animation:.2s ease-out 0s normal forwards 1 fade-in-keys}.fade-out{animation:.2s ease-out 0s normal forwards 1 fade-out-keys}@keyframes fade-in-scale-keys{0%{scale:.95;opacity:0}to{scale:1;opacity:1}}@keyframes fade-out-scale-keys{0%{scale:1;opacity:1}to{scale:.95;opacity:0}}@keyframes fade-in-keys{0%{opacity:0}to{opacity:1}}@keyframes fade-out-keys{0%{opacity:1}to{opacity:0}}.phx-hero{text-align:center;border-bottom:1px solid #e3e3e3;background:#eee;border-radius:6px;padding:3em 3em 1em;margin-bottom:3rem;font-weight:200;font-size:120%}.phx-hero input{background:#ffffff}.phx-logo{min-width:300px;margin:1rem;display:block}.phx-logo img{width:auto;display:block}header{width:100%;background:#fdfdfd;border-bottom:1px solid #eaeaea;margin-bottom:2rem}header section{align-items:center;display:flex;flex-direction:column;justify-content:space-between}header section :first-child{order:2}header section :last-child{order:1}header nav ul,header nav li{margin:0;padding:0;display:block;text-align:right;white-space:nowrap}header nav ul{margin:1rem;margin-top:0}header nav a{display:block}@media (min-width: 40rem){header section{flex-direction:row}header nav ul{margin:1rem}.phx-logo{flex-basis:527px;margin:2rem 1rem}}.montserrat,.montserrat *:not(i):not(.fa):not(.fab):not(.fas):not(.far):not(.fal):not(.fad):not(.fat){font-family:Montserrat,sans-serif!important;font-optical-sizing:auto;font-style:normal}.dm-sans,.dm-sans *:not(i):not(.fa):not(.fab):not(.fas):not(.far):not(.fal):not(.fad):not(.fat){font-family:DM Sans,sans-serif!important;font-optical-sizing:auto;font-style:normal}.quicksand,.quicksand *:not(i):not(.fa):not(.fab):not(.fas):not(.far):not(.fal):not(.fad):not(.fat){font-family:Quicksand,sans-serif!important;font-optical-sizing:auto;font-style:normal}.figtree,.figtree *:not(i):not(.fa):not(.fab):not(.fas):not(.far):not(.fal):not(.fad):not(.fat){font-family:Figtree,sans-serif!important;font-optical-sizing:auto;font-style:normal}.lexend,.lexend *:not(i):not(.fa):not(.fab):not(.fas):not(.far):not(.fal):not(.fad):not(.fat){font-family:Lexend,sans-serif!important;font-optical-sizing:auto;font-style:normal}.m-0{margin:0!important}.m-1{margin:var(--spacing-sm)!important}.m-2{margin:var(--spacing-md)!important}.m-3{margin:var(--spacing-lg)!important}.m-4{margin:var(--spacing-xl)!important}.m-5{margin:calc(var(--spacing-xl) * 1.5)!important}.mt-0{margin-top:0!important}.mt-1{margin-top:var(--spacing-sm)!important}.mt-2{margin-top:var(--spacing-md)!important}.mt-3{margin-top:var(--spacing-lg)!important}.mt-4{margin-top:var(--spacing-xl)!important}.mt-5{margin-top:calc(var(--spacing-xl) * 1.5)!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:var(--spacing-sm)!important}.mb-2{margin-bottom:var(--spacing-md)!important}.mb-3{margin-bottom:var(--spacing-lg)!important}.mb-4{margin-bottom:var(--spacing-xl)!important}.mb-5{margin-bottom:calc(var(--spacing-xl) * 1.5)!important}.ml-0{margin-left:0!important}.ml-1{margin-left:var(--spacing-sm)!important}.ml-2{margin-left:var(--spacing-md)!important}.ml-3{margin-left:var(--spacing-lg)!important}.ml-4{margin-left:var(--spacing-xl)!important}.ml-5{margin-left:calc(var(--spacing-xl) * 1.5)!important}.mr-0{margin-right:0!important}.mr-1{margin-right:var(--spacing-sm)!important}.mr-2{margin-right:var(--spacing-md)!important}.mr-3{margin-right:var(--spacing-lg)!important}.mr-4{margin-right:var(--spacing-xl)!important}.mr-5{margin-right:calc(var(--spacing-xl) * 1.5)!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:var(--spacing-sm)!important;margin-right:var(--spacing-sm)!important}.mx-2{margin-left:var(--spacing-md)!important;margin-right:var(--spacing-md)!important}.mx-3{margin-left:var(--spacing-lg)!important;margin-right:var(--spacing-lg)!important}.mx-4{margin-left:var(--spacing-xl)!important;margin-right:var(--spacing-xl)!important}.mx-5{margin-left:calc(var(--spacing-xl) * 1.5)!important;margin-right:calc(var(--spacing-xl) * 1.5)!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:var(--spacing-sm)!important;margin-bottom:var(--spacing-sm)!important}.my-2{margin-top:var(--spacing-md)!important;margin-bottom:var(--spacing-md)!important}.my-3{margin-top:var(--spacing-lg)!important;margin-bottom:var(--spacing-lg)!important}.my-4{margin-top:var(--spacing-xl)!important;margin-bottom:var(--spacing-xl)!important}.my-5{margin-top:calc(var(--spacing-xl) * 1.5)!important;margin-bottom:calc(var(--spacing-xl) * 1.5)!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.p-0{padding:0!important}.p-1{padding:var(--spacing-sm)!important}.p-2{padding:var(--spacing-md)!important}.p-3{padding:var(--spacing-lg)!important}.p-4{padding:var(--spacing-xl)!important}.p-5{padding:calc(var(--spacing-xl) * 1.5)!important}.pt-0{padding-top:0!important}.pt-1{padding-top:var(--spacing-sm)!important}.pt-2{padding-top:var(--spacing-md)!important}.pt-3{padding-top:var(--spacing-lg)!important}.pt-4{padding-top:var(--spacing-xl)!important}.pt-5{padding-top:calc(var(--spacing-xl) * 1.5)!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:var(--spacing-sm)!important}.pb-2{padding-bottom:var(--spacing-md)!important}.pb-3{padding-bottom:var(--spacing-lg)!important}.pb-4{padding-bottom:var(--spacing-xl)!important}.pb-5{padding-bottom:calc(var(--spacing-xl) * 1.5)!important}.pl-0{padding-left:0!important}.pl-1{padding-left:var(--spacing-sm)!important}.pl-2{padding-left:var(--spacing-md)!important}.pl-3{padding-left:var(--spacing-lg)!important}.pl-4{padding-left:var(--spacing-xl)!important}.pl-5{padding-left:calc(var(--spacing-xl) * 1.5)!important}.pr-0{padding-right:0!important}.pr-1{padding-right:var(--spacing-sm)!important}.pr-2{padding-right:var(--spacing-md)!important}.pr-3{padding-right:var(--spacing-lg)!important}.pr-4{padding-right:var(--spacing-xl)!important}.pr-5{padding-right:calc(var(--spacing-xl) * 1.5)!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:var(--spacing-sm)!important;padding-right:var(--spacing-sm)!important}.px-2{padding-left:var(--spacing-md)!important;padding-right:var(--spacing-md)!important}.px-3{padding-left:var(--spacing-lg)!important;padding-right:var(--spacing-lg)!important}.px-4{padding-left:var(--spacing-xl)!important;padding-right:var(--spacing-xl)!important}.px-5{padding-left:calc(var(--spacing-xl) * 1.5)!important;padding-right:calc(var(--spacing-xl) * 1.5)!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:var(--spacing-sm)!important;padding-bottom:var(--spacing-sm)!important}.py-2{padding-top:var(--spacing-md)!important;padding-bottom:var(--spacing-md)!important}.py-3{padding-top:var(--spacing-lg)!important;padding-bottom:var(--spacing-lg)!important}.py-4{padding-top:var(--spacing-xl)!important;padding-bottom:var(--spacing-xl)!important}.py-5{padding-top:calc(var(--spacing-xl) * 1.5)!important;padding-bottom:calc(var(--spacing-xl) * 1.5)!important}.d-none{display:none!important}.d-block{display:block!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-grid{display:grid!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.justify-start{justify-content:flex-start!important}.justify-end{justify-content:flex-end!important}.justify-center{justify-content:center!important}.justify-between{justify-content:space-between!important}.justify-around{justify-content:space-around!important}.align-start{align-items:flex-start!important}.align-end{align-items:flex-end!important}.align-center{align-items:center!important}.align-baseline{align-items:baseline!important}.align-stretch{align-items:stretch!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.gap-0{gap:0!important}.gap-1{gap:var(--spacing-sm)!important}.gap-2{gap:var(--spacing-md)!important}.gap-3{gap:var(--spacing-lg)!important}.gap-4{gap:var(--spacing-xl)!important}.gap-5{gap:calc(var(--spacing-xl) * 1.5)!important}.text-left{text-align:left!important}.text-center{text-align:center!important}.text-right{text-align:right!important}.text-justify{text-align:justify!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.cursor-pointer{cursor:pointer!important}.cursor-default{cursor:default!important}.cursor-not-allowed{cursor:not-allowed!important}.border-0{border:0!important}.border{border:1px solid var(--km-border)!important}.border-top{border-top:1px solid var(--km-border)!important}.border-bottom{border-bottom:1px solid var(--km-border)!important}.border-left{border-left:1px solid var(--km-border)!important}.border-right{border-right:1px solid var(--km-border)!important}.rounded-0{border-radius:0!important}.rounded{border-radius:.375rem!important}.rounded-lg{border-radius:.5rem!important}.rounded-full{border-radius:9999px!important}.shadow-none{box-shadow:none!important}.shadow-sm{box-shadow:0 1px 2px #0000000d!important}.shadow{box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f!important}.shadow-lg{box-shadow:0 4px 12px #0000001a!important}:root{--km-primary: #2563eb;--km-primary-hover: #1d4ed8;--km-dark: #1e293b;--km-light: #f8fafc;--km-border: #e2e8f0;--km-text: #334155;--km-text-light: #64748b;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem;--spacing-xl: 3rem}*{box-sizing:border-box}html{font-size:62.5%}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;color:var(--km-text);line-height:1.6;margin:0;padding:0;font-size:1.6rem}.pure-g{max-width:1200px;margin:0 auto;padding:0 2rem}.pure-g>div{box-sizing:border-box}.pure-g [class*=pure-u]{padding:0 1rem}.site-header{background:var(--km-dark);color:#fff;padding:var(--spacing-xl) 0;margin-bottom:calc(var(--spacing-xl) * 1.5)}.header-flex{display:flex;justify-content:space-between;align-items:center;gap:var(--spacing-lg)}.site-title{font-size:3.6rem;font-weight:700;margin:0;text-align:center}.site-subtitle{font-size:1.6rem;font-weight:300;color:var(--km-text-light);text-align:center;margin:var(--spacing-sm) 0 0}.font-selector{display:flex;align-items:center;gap:var(--spacing-sm);white-space:nowrap}.font-selector label{color:#fff;font-size:1.4rem;margin:0}.font-selector select{background:white;color:var(--km-dark);border:1px solid var(--km-border);border-radius:.375rem;padding:.6rem 1rem;font-size:1.4rem;cursor:pointer;min-width:15rem}.section-header{font-size:2.8rem;font-weight:600;margin:0 0 var(--spacing-lg);color:var(--km-dark)}.projects-grid{margin:calc(var(--spacing-xl) * 1.5) 0}.projects-grid>div{padding:0 1rem;margin-bottom:var(--spacing-xl)}.project-card{background:white;border:1px solid var(--km-border);border-radius:.5rem;padding:var(--spacing-lg);height:100%;display:flex;flex-direction:column;transition:transform .2s,box-shadow .2s}.project-card:hover{transform:translateY(-2px);box-shadow:0 4px 12px #0000001a}.project-card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:var(--spacing-md)}.project-card-content{flex:1;display:flex;flex-direction:column}.project-card-footer{display:flex;gap:var(--spacing-md);margin-top:var(--spacing-lg);padding-top:var(--spacing-md);border-top:1px solid var(--km-border)}.project-title{font-size:1.8rem;font-weight:600;margin:0;color:var(--km-dark);flex:1;line-height:1.2}.project-description{color:var(--km-text);margin:0 0 var(--spacing-md) 0;line-height:1.5;font-size:1.6rem}.btn{display:inline-block;padding:.5rem 1rem;border-radius:.375rem;text-decoration:none;font-weight:500;transition:background-color .2s,transform .1s;border:none;cursor:pointer}.btn:active{transform:scale(.98)}.btn-primary{background:var(--km-primary);color:#fff}.btn-primary:hover{background:var(--km-primary-hover)}.btn-secondary{background:white;color:var(--km-primary);border:1px solid var(--km-primary)}.btn-secondary:hover{background:var(--km-light)}.btn-github{background:#24292e;color:#fff}.btn-github:hover{background:#1b1f23}.btn-demo{background:#10b981;color:#fff}.btn-demo:hover{background:#059669}.btn-icon{display:inline-flex;align-items:center;justify-content:center;width:4rem;height:4rem;border-radius:5px;background:var(--km-light);color:var(--km-text);font-size:1.8rem;transition:all .2s;text-decoration:none;border:1px solid var(--km-border)}.btn-icon:hover{background:var(--km-primary);color:#fff;border-color:var(--km-primary);transform:scale(1.1)}.btn-icon-npm:hover{background:#CB3837;border-color:#cb3837}.btn-icon-nuget:hover{background:#004880;border-color:#004880}.project-tags{display:flex;gap:var(--spacing-sm);flex-wrap:wrap;margin-top:auto;margin-bottom:0}.tag{display:inline-flex;align-items:center;padding:.5rem 1rem;background:var(--km-light);color:var(--km-text-light);border-radius:.25rem;font-size:1.2rem;font-weight:500;border:1px solid var(--km-border);cursor:pointer;transition:all .2s;box-shadow:0 1px 2px #0000000d}.tag:hover{background:#e2e8f0;border-color:#cbd5e1;transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.tag--active{background:var(--km-primary);color:#fff;border-color:var(--km-primary);box-shadow:0 2px 4px #2563eb33}.tag--active:hover{background:var(--km-primary-hover);border-color:var(--km-primary-hover);box-shadow:0 3px 6px #2563eb4d}.tag--dismissible{gap:.6rem}.tag__remove{font-size:1.8rem;line-height:1;font-weight:700;margin-left:.2rem}.category-section{margin-bottom:calc(var(--spacing-xl) * 1.5)}.category-title{font-size:2.2rem;font-weight:600;margin:0 0 calc(var(--spacing-lg) * 1.5);padding-bottom:var(--spacing-md);border-bottom:2px solid var(--km-border);color:var(--km-dark)}.error-container{text-align:center;padding:var(--spacing-xl) 0}.error-title{font-size:2rem;color:#dc2626;margin-bottom:var(--spacing-md)}.error-message{color:var(--km-text-light);font-size:1.125rem}.markdown-content h1,.markdown-content h2,.markdown-content h3{color:var(--km-dark);margin-top:var(--spacing-lg);margin-bottom:var(--spacing-md)}.markdown-content a{color:var(--km-primary);text-decoration:none}.markdown-content a:hover{text-decoration:underline}.markdown-content code{background:var(--km-light);padding:.125rem .375rem;border-radius:.1875rem;font-family:Courier New,monospace;font-size:.875em}.markdown-content pre{background:var(--km-dark);color:var(--km-light);padding:var(--spacing-md);border-radius:.375rem;overflow-x:auto}.markdown-content pre code{background:none;padding:0;color:inherit}.search-input{width:100%;padding:1.2rem 1.6rem;font-size:1.6rem;border:2px solid var(--km-border);border-radius:.5rem;transition:border-color .2s,box-shadow .2s;outline:none}.search-input:focus{border-color:var(--km-primary);box-shadow:0 0 0 3px #2563eb1a}.search-results-info{margin-top:var(--spacing-sm);color:var(--km-text-light);font-size:1.4rem;text-align:center}.selected-tags-container{margin-top:var(--spacing-md);padding:var(--spacing-md);background:var(--km-light);border-radius:.5rem;border:1px solid var(--km-border);display:flex;justify-content:space-between;align-items:center;gap:var(--spacing-md);flex-wrap:wrap}.selected-tags-list{display:flex;gap:var(--spacing-sm);flex-wrap:wrap;flex:1}.clear-tags-btn{padding:.6rem 1.2rem;background:white;color:var(--km-text);border:1px solid var(--km-border);border-radius:.375rem;font-size:1.3rem;cursor:pointer;transition:all .2s;white-space:nowrap}.clear-tags-btn:hover{background:#f1f5f9;border-color:var(--km-text-light)}.no-results{text-align:center;padding:var(--spacing-xl) 0;color:var(--km-text-light);font-size:1.125rem}.favorite-btn{background:none;border:none;font-size:2rem;color:var(--km-text-light);cursor:pointer;padding:0;transition:color .2s,transform .1s;line-height:1;flex-shrink:0}.favorite-btn:hover{color:#fbbf24;transform:scale(1.15)}.favorite-btn-active{color:#fbbf24}.favorites-sidebar{position:sticky;top:var(--spacing-lg);background:white;padding:var(--spacing-lg);margin-bottom:var(--spacing-lg)}.favorites-title{font-size:2rem;font-weight:600;margin:0 0 var(--spacing-md);color:var(--km-dark)}.favorites-empty{color:var(--km-text-light);font-size:1.4rem;margin:0;text-align:center}.favorites-list{display:flex;flex-direction:column;gap:var(--spacing-md)}.favorite-item{display:flex;flex-direction:column;gap:var(--spacing-sm)}.favorite-item-header{display:flex;align-items:center;justify-content:space-between;gap:var(--spacing-md);padding:var(--spacing-sm) 0}.favorite-item-title{font-size:1.8rem;font-weight:700;margin:0;color:var(--km-dark);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.favorite-item-links{display:flex;gap:var(--spacing-sm)}.btn-block{display:block;width:100%;text-align:center}.site-footer{background:var(--km-light);border-top:1px solid var(--km-border);padding:var(--spacing-xl) 0;margin-top:calc(var(--spacing-xl) * 2)}.footer-text{text-align:center;color:var(--km-text-light);font-size:1.4rem;margin:0}.footer-link{color:var(--km-primary);text-decoration:none;font-weight:600;transition:color .2s}.footer-link:hover{color:var(--km-primary-hover);text-decoration:underline}@media screen and (max-width: 64em){.favorites-sidebar{position:static;margin-top:var(--spacing-lg)}}
