:root{--category-tech-node:#5fb4b6;--category-tech-hull:rgba(95,180,182,.2);--category-tech-border:rgba(95,180,182,.7);--category-tech-text:#7dd8da;--category-tech-hull-dark:rgba(95,180,182,.15);--category-tech-border-dark:rgba(95,180,182,.8);--category-personal-node:#c594c5;--category-personal-hull:rgba(197,148,197,.2);--category-personal-border:rgba(197,148,197,.7);--category-personal-text:#dbb3db;--category-personal-hull-dark:rgba(197,148,197,.15);--category-personal-border-dark:rgba(197,148,197,.8);--category-projects-node:#fac863;--category-projects-hull:rgba(250,200,99,.2);--category-projects-border:rgba(250,200,99,.7);--category-projects-text:#ffd885;--category-projects-hull-dark:rgba(250,200,99,.15);--category-projects-border-dark:rgba(250,200,99,.8);--category-guides-node:#99c794;--category-guides-hull:rgba(153,199,148,.2);--category-guides-border:rgba(153,199,148,.7);--category-guides-text:#b3dbb0;--category-guides-hull-dark:rgba(153,199,148,.15);--category-guides-border-dark:rgba(153,199,148,.8);--category-smart_home-node:#ec5f67;--category-smart_home-hull:rgba(236,95,103,.2);--category-smart_home-border:rgba(236,95,103,.7);--category-smart_home-text:#f07b82;--category-smart_home-hull-dark:rgba(236,95,103,.15);--category-smart_home-border-dark:rgba(236,95,103,.8);--category-reviews-node:#6c99bb;--category-reviews-hull:rgba(108,153,187,.2);--category-reviews-border:rgba(108,153,187,.7);--category-reviews-text:#8fb1cc;--category-reviews-hull-dark:rgba(108,153,187,.15);--category-reviews-border-dark:rgba(108,153,187,.8);--category-default-hull:hsla(0,0%,60%,.2);--category-default-border:hsla(0,0%,60%,.7);--category-default-text:#bbb;--category-default-hull-dark:hsla(0,0%,60%,.15);--category-default-border-dark:hsla(0,0%,60%,.8);--font-family:"JetBrains Mono",monospace;--line-height:1.20rem;--border-thickness:2px;--text-color:#000;--text-color-alt:#666;--background-color:#fff;--background-color-alt:#eee;--font-weight-normal:500;--font-weight-medium:600;--font-weight-bold:800;font-style:normal;font-weight:500;font-weight:var(--font-weight-normal);font-size:1pc;font-family:JetBrains Mono,monospace;font-family:var(--font-family);font-optical-sizing:auto;font-variant-numeric:tabular-nums lining-nums;font-feature-settings:tabular-nums lining-nums}@font-face{font-style:normal;font-weight:500;src:url(https://spindlers-s3.s3.amazonaws.com/public/static/fonts/jetbrains-mono-regular.woff2) format("woff2");font-family:JetBrains Mono;font-display:swap}@font-face{font-style:normal;font-weight:600;src:url(https://spindlers-s3.s3.amazonaws.com/public/static/fonts/jetbrains-mono-medium.woff2) format("woff2");font-family:JetBrains Mono;font-display:swap}@font-face{font-style:normal;font-weight:800;src:url(https://spindlers-s3.s3.amazonaws.com/public/static/fonts/jetbrains-mono-bold.woff2) format("woff2");font-family:JetBrains Mono;font-display:swap}*{box-sizing:border-box}*+*{margin-top:1.2rem;margin-top:var(--line-height)}html{display:flex;flex-direction:column;align-items:center;padding:0;background:#fff;background:var(--background-color);color:#000;color:var(--text-color)}body,html{width:100%;margin:0}body{position:relative;max-width:calc(min(120ch,round(down,100%,1ch)));padding:1.2rem 2ch;padding:var(--line-height) 2ch;overflow-x:hidden}body,h1,h2,h3,h4{line-height:1.2rem;line-height:var(--line-height)}h1,h2,h3,h4{margin:2.4rem 0 1.2rem;margin:calc(var(--line-height)*2) 0 var(--line-height);font-weight:800;font-weight:var(--font-weight-bold)}h1{margin-bottom:2.4rem;margin-bottom:calc(var(--line-height)*2);font-size:2rem;line-height:2.4rem;line-height:calc(var(--line-height)*2)}h1,h2{text-transform:uppercase}h2{font-size:1rem}hr{position:relative;height:1.2rem;height:var(--line-height);margin:1.8rem 0;margin:calc(var(--line-height)*1.5) 0;border:none;color:#000;color:var(--text-color)}hr,hr:after{display:block}hr:after{position:absolute;top:calc(.6rem - 2px);top:calc(var(--line-height)/2 - var(--border-thickness));left:0;width:100%;height:0;border-top:6px double #000;border-top:calc(var(--border-thickness)*3) double var(--text-color);content:""}a{text-decoration-thickness:2px;text-decoration-thickness:var(--border-thickness)}a:link,a:visited{color:#000;color:var(--text-color)}p{margin-bottom:1.2rem;margin-bottom:var(--line-height);word-break:break-word;word-wrap:break-word;hyphens:auto}strong{font-weight:800;font-weight:var(--font-weight-bold)}em{font-style:italic}table{position:relative}table{top:.6rem;top:calc(var(--line-height)/2);width:calc(round(down,100%,1ch));margin:0 0 2.4rem;margin:0 0 calc(var(--line-height)*2);border-collapse:collapse}td,th{padding:.6rem calc(1ch - 1px) calc(.6rem - 2px);padding:calc(var(--line-height)/2) calc(1ch - var(--border-thickness)/2) calc(var(--line-height)/2 - var(--border-thickness));border:2px solid #000;border:var(--border-thickness) solid var(--text-color);line-height:1.2rem;line-height:var(--line-height);text-align:left;vertical-align:top}table tbody tr:first-child>*{padding-top:calc(.6rem - 2px);padding-top:calc(var(--line-height)/2 - var(--border-thickness))}th{font-weight:700}.width-min{width:0}.width-auto{width:100%}.header{margin-bottom:2.4rem;margin-bottom:calc(var(--line-height)*2)}.header h1{margin:0}.header tr td:last-child{text-align:right}img,video{display:block;width:100%;overflow:hidden;object-fit:contain}img{color:#666;color:var(--text-color-alt);font-style:italic}details{margin-bottom:1.2rem;margin-bottom:var(--line-height);padding:calc(1.2rem - 2px) 1ch;padding:calc(var(--line-height) - var(--border-thickness)) 1ch;border:2px solid #000;border:var(--border-thickness) solid var(--text-color)}summary{font-weight:600;font-weight:var(--font-weight-medium);cursor:pointer}details[open] summary{margin-bottom:1.2rem;margin-bottom:var(--line-height)}details::marker{display:inline-block;margin:0;content:"▶"}details[open]::marker{content:"▼"}details:last-child{margin-bottom:0}pre{margin:1.2rem 0;margin:var(--line-height) 0;white-space:pre}figure pre{margin:0}code,pre{font-family:JetBrains Mono,monospace;font-family:var(--font-family)}code{font-weight:600;font-weight:var(--font-weight-medium)}figure{margin:2.4rem 3ch;margin:calc(var(--line-height)*2) 3ch;overflow-x:auto;overflow-y:hidden}figcaption{display:block;margin-top:1.2rem;margin-top:var(--line-height);font-style:italic}ol,ul{margin:0 0 1.2rem;margin:0 0 var(--line-height);padding:0}ul{padding:0 0 0 2ch;list-style-type:square}ol{padding:0;list-style-type:none;counter-reset:a}ol ol,ol ul,ul ol,ul ul{margin:0;padding:0 0 0 3ch}ol li:before{content:counters(a,".") ". ";font-weight:600;font-weight:var(--font-weight-medium);counter-increment:a}li{margin:0;padding:0}li::marker{line-height:0}::-webkit-scrollbar{height:1.2rem;height:var(--line-height)}button,input,textarea{width:auto;height:2.4rem;height:calc(var(--line-height)*2);margin:0;padding:calc(.6rem - 2px) calc(1ch - 2px);padding:calc(var(--line-height)/2 - var(--border-thickness)) calc(1ch - var(--border-thickness));overflow:visible;border:2px solid #000;border:var(--border-thickness) solid var(--text-color);background:#fff;background:var(--background-color);color:#000;color:var(--text-color);font:inherit;font-weight:inherit;line-height:normal;-webkit-font-smoothing:inherit;-moz-osx-font-smoothing:inherit;-webkit-appearance:none}button:focus,input:focus{--border-thickness:3px;outline:none}input{width:calc(round(down,100%,1ch))}::-moz-placeholder{color:#666;color:var(--text-color-alt);opacity:1}::placeholder{color:#666;color:var(--text-color-alt);opacity:1}::-ms-input-placeholder{color:#666;color:var(--text-color-alt)}button::-moz-focus-inner{padding:0;border:0}button{font-weight:600;font-weight:var(--font-weight-medium);text-transform:uppercase;cursor:pointer}button:hover{background:#eee;background:var(--background-color-alt)}button:active{transform:translate(2px,2px)}label{display:block;width:calc(round(down,100%,1ch));height:auto;margin:0;font-weight:600;font-weight:var(--font-weight-medium);line-height:1.2rem;line-height:var(--line-height)}label input{width:100%}.tree,.tree ul{position:relative;padding-left:0;line-height:1.2rem;line-height:var(--line-height);list-style-type:none}.tree ul{margin:0}.tree ul li{position:relative;margin-left:1.5ch;padding-left:1.5ch;border-left:2px solid #000;border-left:var(--border-thickness) solid var(--text-color)}.tree ul li:before{display:block;position:absolute;top:.6rem;top:calc(var(--line-height)/2);left:0;width:1ch;border-bottom:2px solid #000;border-bottom:var(--border-thickness) solid var(--text-color);content:""}.tree ul li:last-child{border-left:none}.tree ul li:last-child:after{display:block;position:absolute;top:0;left:0;height:.6rem;height:calc(var(--line-height)/2);border-left:2px solid #000;border-left:var(--border-thickness) solid var(--text-color);content:""}.grid{--grid-cells:0;display:flex;width:calc(round(down,100%,(1ch * 0) - (1ch * 0 - 1)));width:calc(round(down,100%,(1ch * var(--grid-cells)) - (1ch * var(--grid-cells) - 1)));margin-bottom:1.2rem;margin-bottom:var(--line-height);gap:1ch}.grid>*,.grid>input{flex:0 0 calc(round(down,(100% - (1ch * (var(--grid-cells) - 1))) / var(--grid-cells),1ch))}.grid:has(>:last-child:first-child){--grid-cells:1}.grid:has(>:last-child:nth-child(2)){--grid-cells:2}.grid:has(>:last-child:nth-child(3)){--grid-cells:3}.grid:has(>:last-child:nth-child(4)){--grid-cells:4}.grid:has(>:last-child:nth-child(5)){--grid-cells:5}.grid:has(>:last-child:nth-child(6)){--grid-cells:6}.grid:has(>:last-child:nth-child(7)){--grid-cells:7}.grid:has(>:last-child:nth-child(8)){--grid-cells:8}.grid:has(>:last-child:nth-child(9)){--grid-cells:9}.blog-posts-table{width:100%;margin:1.2rem 0;margin:var(--line-height) 0;border:2px solid #000;border:var(--border-thickness) solid var(--text-color);border-collapse:collapse}.blog-posts-table td,.blog-posts-table th{padding:.6rem 1ch;padding:calc(var(--line-height)/2) 1ch;border:none;border-bottom:2px solid #000;border-bottom:var(--border-thickness) solid var(--text-color);line-height:1.2rem;line-height:var(--line-height);text-align:left;vertical-align:top}.blog-posts-table tbody tr:last-child td{border-bottom:none}.blog-post-cell{display:flex;align-items:baseline;gap:1ch}.category-bubble{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;min-width:6ch;height:1.2rem;height:calc(var(--line-height)*1);margin-top:.2em;padding:0 .5ch;border:1px solid;border-radius:.6rem;border-radius:calc(var(--line-height)*.5);font-weight:600;font-weight:var(--font-weight-medium);font-size:.7rem;line-height:1;text-transform:lowercase;white-space:nowrap;transition:all .2s ease}.category-bubble:hover{transform:scale(1.05);box-shadow:0 2px 8px rgba(0,0,0,.15)}.category-bubble.category-tech{border-color:rgba(95,180,182,.7);border-color:var(--category-tech-border);background-color:rgba(95,180,182,.2);background-color:var(--category-tech-hull);color:#7dd8da;color:var(--category-tech-text)}.category-bubble.category-personal{border-color:rgba(197,148,197,.7);border-color:var(--category-personal-border);background-color:rgba(197,148,197,.2);background-color:var(--category-personal-hull);color:#dbb3db;color:var(--category-personal-text)}.category-bubble.category-projects{border-color:rgba(250,200,99,.7);border-color:var(--category-projects-border);background-color:rgba(250,200,99,.2);background-color:var(--category-projects-hull);color:#ffd885;color:var(--category-projects-text)}.category-bubble.category-guides{border-color:rgba(153,199,148,.7);border-color:var(--category-guides-border);background-color:rgba(153,199,148,.2);background-color:var(--category-guides-hull);color:#b3dbb0;color:var(--category-guides-text)}.category-bubble.category-smart_home{border-color:rgba(236,95,103,.7);border-color:var(--category-smart_home-border);background-color:rgba(236,95,103,.2);background-color:var(--category-smart_home-hull);color:#f07b82;color:var(--category-smart_home-text)}.category-bubble.category-reviews{border-color:rgba(108,153,187,.7);border-color:var(--category-reviews-border);background-color:rgba(108,153,187,.2);background-color:var(--category-reviews-hull);color:#8fb1cc;color:var(--category-reviews-text)}.category-bubble.category-uncategorized{border-color:hsla(0,0%,60%,.7);border-color:var(--category-default-border);background-color:hsla(0,0%,60%,.2);background-color:var(--category-default-hull);color:#bbb;color:var(--category-default-text)}.messages-container{margin:1.2rem 0;margin:var(--line-height) 0;animation:b .3s ease-out}.message{display:flex;position:relative;align-items:center;justify-content:space-between;margin-bottom:1.2rem;margin-bottom:var(--line-height);padding:calc(1.2rem - 2px) 2ch;padding:calc(var(--line-height) - var(--border-thickness)) 2ch;padding-right:4ch;border:2px solid;border:var(--border-thickness) solid;background:#fff;background:var(--background-color)}.message-text{flex-grow:1;line-height:1.2rem;line-height:var(--line-height)}.message-close{display:flex;position:absolute;top:50%;right:1ch;align-items:center;justify-content:center;width:2ch;height:2ch;padding:0;transform:translateY(-50%);border:none;background:none;color:#000;color:var(--text-color);font-weight:800;font-weight:var(--font-weight-bold);font-size:1.5rem;cursor:pointer;opacity:.7;transition:opacity .2s}.message-close:hover{background:none;opacity:1}.message-close:active{transform:translateY(-50%) scale(.9)}.message-success{border-color:#28a745;background:rgba(40,167,69,.15)}.message-info,.message-success{color:#000;color:var(--text-color)}.message-info{border-color:#17a2b8;background:rgba(23,162,184,.15)}.message-warning{border-color:#ffc107;background:rgba(255,193,7,.15);color:#000;color:var(--text-color)}.message-danger,.message-error{border-color:#dc3545;background:rgba(220,53,69,.15);color:#000;color:var(--text-color)}.message-debug{border-color:#6c757d;background:hsla(208,7%,46%,.15);color:#000;color:var(--text-color)}.tech-pills{display:flex;flex-wrap:wrap;gap:.5ch}.tech-bubble{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;min-width:-moz-fit-content;min-width:fit-content;height:1.2rem;height:calc(var(--line-height)*1);margin-top:.2em;padding:0 .75ch;border:1px solid rgba(108,153,187,.7);border-radius:.6rem;border-radius:calc(var(--line-height)*.5);background-color:rgba(108,153,187,.2);color:#8fb1cc;font-weight:600;font-weight:var(--font-weight-medium);font-size:.7rem;line-height:1;text-transform:none;white-space:nowrap;transition:all .2s ease}.tech-bubble:hover{transform:scale(1.05);box-shadow:0 2px 8px rgba(0,0,0,.15)}.search-results{margin:1.2rem 0 2.4rem;margin:var(--line-height) 0 calc(var(--line-height)*2) 0;padding:0;list-style:none}.search-results li{display:flex;align-items:baseline;margin-bottom:1.2rem;margin-bottom:var(--line-height);gap:1ch}.search-results p{margin:.6rem 0 0 2ch;margin:calc(var(--line-height)/2) 0 0 2ch;color:#666;color:var(--text-color-alt);font-size:.875rem}.search-autocomplete-item{display:flex;align-items:center;justify-content:space-between}.autocomplete-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-type{flex-shrink:0;margin-left:1ch;padding:.25ch 1ch}.autocomplete-type.category-personal{background:#4a90e2}.autocomplete-type.category-projects{background:#50c878}.autocomplete-type.category-reviews{background:#f39c12}.autocomplete-type.category-tech{background:#e74c3c}@media (prefers-color-scheme:dark){:root{--text-color:#fff;--text-color-alt:#aaa;--background-color:#000;--background-color-alt:#111}.category-bubble.category-tech{border-color:rgba(95,180,182,.8);border-color:var(--category-tech-border-dark);background-color:rgba(95,180,182,.15);background-color:var(--category-tech-hull-dark)}.category-bubble.category-personal{border-color:rgba(197,148,197,.8);border-color:var(--category-personal-border-dark);background-color:rgba(197,148,197,.15);background-color:var(--category-personal-hull-dark)}.category-bubble.category-projects{border-color:rgba(250,200,99,.8);border-color:var(--category-projects-border-dark);background-color:rgba(250,200,99,.15);background-color:var(--category-projects-hull-dark)}.category-bubble.category-guides{border-color:rgba(153,199,148,.8);border-color:var(--category-guides-border-dark);background-color:rgba(153,199,148,.15);background-color:var(--category-guides-hull-dark)}.category-bubble.category-smart_home{border-color:rgba(236,95,103,.8);border-color:var(--category-smart_home-border-dark);background-color:rgba(236,95,103,.15);background-color:var(--category-smart_home-hull-dark)}.category-bubble.category-reviews{border-color:rgba(108,153,187,.8);border-color:var(--category-reviews-border-dark);background-color:rgba(108,153,187,.15);background-color:var(--category-reviews-hull-dark)}.category-bubble.category-uncategorized{border-color:hsla(0,0%,60%,.8);border-color:var(--category-default-border-dark);background-color:hsla(0,0%,60%,.15);background-color:var(--category-default-hull-dark)}.message-success{background:rgba(40,167,69,.2)}.message-info,.message-success{color:#000;color:var(--text-color)}.message-info{background:rgba(23,162,184,.2)}.message-warning{background:rgba(255,193,7,.2);color:#000;color:var(--text-color)}.message-danger,.message-error{background:rgba(220,53,69,.2);color:#000;color:var(--text-color)}.message-debug{background:hsla(208,7%,46%,.2);color:#000;color:var(--text-color)}.tech-bubble{border-color:rgba(108,153,187,.8);background-color:rgba(108,153,187,.15)}}@media screen and (max-width:480px){:root{font-size:14px}body{padding:1.2rem 1ch;padding:var(--line-height) 1ch}}.theme-toggle-container{z-index:1000;position:fixed;top:1.2rem;top:var(--line-height);right:2ch;width:8ch;height:3.6rem;height:calc(var(--line-height)*3);padding:1ch}.theme-toggle-btn{display:inline-flex;position:relative;align-items:center;justify-content:center;width:auto;min-width:4ch;height:2.4rem;height:calc(var(--line-height)*2);padding:0 1ch;border:2px solid #000;border:var(--border-thickness) solid var(--text-color);background:#fff;background:var(--background-color);font-weight:600;font-weight:var(--font-weight-medium);font-size:.75rem;font-family:JetBrains Mono,monospace;font-family:var(--font-family);letter-spacing:.05em;text-transform:uppercase;cursor:pointer;opacity:0;pointer-events:none;transition:opacity .3s ease,background .2s ease,transform .2s ease}.theme-toggle-container:hover .theme-toggle-btn{opacity:1;pointer-events:auto}.theme-toggle-btn:hover{background:#eee;background:var(--background-color-alt)}.theme-toggle-btn:active{transform:translate(2px,2px)}.theme-toggle-btn:focus{outline:4px solid #000;outline:calc(var(--border-thickness)*2) solid var(--text-color);outline-offset:2px;opacity:1;pointer-events:auto}.theme-toggle-btn:focus:not(:focus-visible){outline:none}.theme-toggle-btn .theme-text{display:inline-block;transition:opacity .2s ease}.theme-toggle-btn[data-theme=light] .theme-text:after{content:"☀"}.theme-toggle-btn[data-theme=dark] .theme-text:after{content:"☾"}.theme-toggle-btn[data-theme=auto] .theme-text:after{content:"◐"}.theme-light{--text-color:#000;--text-color-alt:#666;--background-color:#fff;--background-color-alt:#eee}.theme-dark{--text-color:#fff;--text-color-alt:#aaa;--background-color:#000;--background-color-alt:#111}.theme-auto{--text-color:#000;--text-color-alt:#666;--background-color:#fff;--background-color-alt:#eee}.theme-dark .category-bubble.category-tech{border-color:rgba(95,180,182,.8);background-color:rgba(95,180,182,.15)}.theme-dark .category-bubble.category-personal{border-color:rgba(197,148,197,.8);background-color:rgba(197,148,197,.15)}.theme-dark .category-bubble.category-projects{border-color:rgba(250,200,99,.8);background-color:rgba(250,200,99,.15)}.theme-dark .category-bubble.category-guides{border-color:rgba(153,199,148,.8);background-color:rgba(153,199,148,.15)}.theme-dark .category-bubble.category-smart_home{border-color:rgba(236,95,103,.8);background-color:rgba(236,95,103,.15)}.theme-dark .category-bubble.category-reviews{border-color:rgba(108,153,187,.8);background-color:rgba(108,153,187,.15)}.theme-dark .category-bubble.category-uncategorized{border-color:hsla(0,0%,60%,.8);background-color:hsla(0,0%,60%,.15)}.theme-light .category-bubble.category-tech{border-color:rgba(95,180,182,.7);background-color:rgba(95,180,182,.2);color:#5fb4b6}.theme-light .category-bubble.category-personal{border-color:rgba(197,148,197,.7);background-color:rgba(197,148,197,.2);color:#c594c5}.theme-light .category-bubble.category-projects{border-color:rgba(250,200,99,.7);background-color:rgba(250,200,99,.2);color:#fac863}.theme-light .category-bubble.category-guides{border-color:rgba(153,199,148,.7);background-color:rgba(153,199,148,.2);color:#99c794}.theme-light .category-bubble.category-smart_home{border-color:rgba(236,95,103,.7);background-color:rgba(236,95,103,.2);color:#ec5f67}.theme-light .category-bubble.category-reviews{border-color:rgba(108,153,187,.7);background-color:rgba(108,153,187,.2);color:#6c99bb}.theme-light .category-bubble.category-uncategorized{border-color:hsla(0,0%,60%,.7);background-color:hsla(0,0%,60%,.2);color:#999}html.theme-transition,html.theme-transition *,html.theme-transition :after,html.theme-transition :before{transition:background-color .3s ease,color .3s ease,border-color .3s ease!important}@media (prefers-color-scheme:dark){.theme-auto{--text-color:#fff;--text-color-alt:#aaa;--background-color:#000;--background-color-alt:#111}}@media screen and (max-width:768px){.theme-toggle-container{top:.9rem;top:calc(var(--line-height)*.75);right:1.5ch}.theme-toggle-btn{min-width:3ch;height:2.1rem;height:calc(var(--line-height)*1.75);padding:0 .75ch;font-size:.7rem}}@media screen and (max-width:480px){.theme-toggle-container{top:.6rem;top:calc(var(--line-height)*.5);right:1ch}.theme-toggle-btn{min-width:2.5ch;height:1.8rem;height:calc(var(--line-height)*1.5);padding:0 .5ch;border-width:1px;font-size:.65rem}}.books-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));grid-gap:2rem;margin:15px 0 2.4rem;margin:15px 0 calc(var(--line-height)*2);padding:0;gap:2rem}.book-item{display:flex;flex-direction:column;margin-top:0!important;cursor:pointer;transition:transform .2s ease}.book-item:hover{transform:translateY(-4px)}.book-cover{position:relative;aspect-ratio:2/3;width:100%;margin-bottom:.6rem;margin-bottom:calc(var(--line-height)/2);overflow:hidden;border:2px solid #000;border:var(--border-thickness) solid var(--text-color);background:#eee;background:var(--background-color-alt)}.book-cover img{width:100%;height:100%;object-fit:cover;transition:opacity .2s ease}.book-item:hover .book-cover img{opacity:.9}.book-info{display:flex;flex:1;flex-direction:column}.book-title{display:-webkit-box;margin:0 0 .3rem!important;margin:0 0 calc(var(--line-height)/4)!important;overflow:hidden;font-weight:600;font-weight:var(--font-weight-medium);font-size:.875rem;line-height:1.2rem;line-height:var(--line-height);text-overflow:ellipsis;text-transform:none;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.book-author{margin:0 0 .6rem;margin:0 0 calc(var(--line-height)/2);font-size:.8rem}.book-author,.book-quote{color:#666;color:var(--text-color-alt)}.book-quote{flex-grow:1;margin:.6rem 0 0;margin:calc(var(--line-height)/2) 0 0;padding-left:1ch;border-left:2px solid #666;border-left:2px solid var(--text-color-alt);font-style:italic;font-size:.75rem;line-height:1.2rem;line-height:var(--line-height)}@media screen and (max-width:768px){.books-grid{grid-template-columns:repeat(auto-fill,minmax(90pt,1fr));gap:1.5rem}}@media screen and (max-width:480px){.books-grid{grid-template-columns:repeat(auto-fill,minmax(75pt,1fr));gap:1rem}.book-title{font-size:.8rem}.book-quote{font-size:.7rem}}@media (prefers-color-scheme:dark){.book-cover{background:#eee;background:var(--background-color-alt)}.book-item:hover .book-cover img{opacity:.95}}:root{--kg-border:var(--background-color-alt);--kg-text:var(--text-color);--kg-bg:var(--background-color);--kg-node-stroke:3px;--kg-transition:all .2s ease}.knowledge-graph-section{margin:1rem 0 2rem}#knowledge-graph-container{position:relative;width:100%;height:25pc;margin-bottom:1rem;overflow:hidden;border:1px solid #eee;border:1px solid var(--kg-border);border-radius:8px}#loading{display:none;z-index:10;position:absolute;top:50%;left:50%;padding:1rem;transform:translate(-50%,-50%);border-radius:8px;background:#fff;background:var(--kg-bg);box-shadow:0 4px 9pt rgba(0,0,0,.1);color:#000;color:var(--kg-text)}#knowledge-graph-svg{width:100%;height:100%;background:transparent}.node{cursor:pointer;transition:all .2s ease;transition:var(--kg-transition)}.node.highlighted,.node:hover{stroke-width:3px;stroke-width:var(--kg-node-stroke);stroke:#000;stroke:var(--kg-text)}.node.highlighted{stroke:#ff6b6b}.node.external_link{stroke-dasharray:3,3;stroke-width:2px}.node.external_link:hover{stroke-width:4px;stroke:#000;stroke:var(--kg-text)}.node.blog-post.tech{filter:brightness(1.1)}.node.blog-post.personal{filter:brightness(1.15)}.node.blog-post.projects{filter:brightness(1.05)}.node.blog-post.guides{filter:brightness(1.1)}.node.blog-post.smart_home{filter:brightness(1.12)}.node.blog-post.reviews{filter:brightness(1.08)}.node.blog-post.tech:hover{filter:brightness(1.3)}.node.blog-post.personal:hover{filter:brightness(1.35)}.node.blog-post.projects:hover{filter:brightness(1.25)}.node.blog-post.guides:hover{filter:brightness(1.3)}.node.blog-post.smart_home:hover{filter:brightness(1.32)}.node.blog-post.reviews:hover{filter:brightness(1.28)}.link{transition:stroke-opacity .2s ease;stroke-linecap:round}.link.highlighted{stroke-opacity:1;stroke-width:3px}.link.external{stroke-dasharray:5,5;stroke-opacity:.8}.node-label{font:600 11px JetBrains Mono,monospace;font:var(--font-weight-medium) 11px var(--font-family);text-anchor:middle;pointer-events:none;fill:#fff;stroke:#000;stroke-width:3px;stroke-linejoin:round;paint-order:stroke;stroke-opacity:.8}.node-label.external-link{font-size:10px;text-anchor:start;dominant-baseline:middle;fill:#fff;stroke:#000;stroke-width:2.5px;stroke-opacity:.8;font-weight:400;opacity:.95;transition:all .2s ease;transition:var(--kg-transition)}.node-label.external-link.highlighted{font-size:11px;fill:#fff;stroke-width:3px;opacity:1}.node-label.blog-post-number{font-weight:700;font-size:13px;stroke-width:4px;letter-spacing:0.5px}.node-label.highlighted{fill:#ff6b6b;stroke:#000;stroke-width:3px}.svg-tooltip{pointer-events:none;transition:opacity .2s ease}.tooltip-background{fill:#fff;fill:var(--kg-bg);stroke:#000;stroke:var(--kg-text);stroke-width:1px;rx:4;opacity:.95}.svg-tooltip text{font:9pt JetBrains Mono,monospace;font:9pt var(--font-family);fill:#000;fill:var(--kg-text);text-anchor:middle;dominant-baseline:middle}.svg-tooltip.hidden{opacity:0}.svg-tooltip.visible{opacity:1}.category-hull{mix-blend-mode:screen;filter:blur(0.5px);pointer-events:none;transition:all .3s ease;stroke-width:2px;stroke-linejoin:round;opacity:.8}.category-label,.category-label-group{pointer-events:none}.category-label{font:700 1pc JetBrains Mono,monospace;font:700 1pc var(--font-family);letter-spacing:1.5px;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;text-anchor:middle;dominant-baseline:middle;fill:#fff;stroke:none;opacity:1}.controls-info{font-size:9pt;fill:#666;opacity:.7}@media (max-width:768px){#knowledge-graph-container{height:25pc}.node-label{font-size:10px}}.photo-albums-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));grid-gap:15px;margin-top:15px;gap:15px}.photo-album-card{position:relative;aspect-ratio:1;margin-top:0!important;overflow:hidden;border:3px solid #fff;border-radius:4px;background:#f0f0f0;box-shadow:0 2px 4px rgba(0,0,0,.1);transition:transform .2s}.photo-album-card:hover{transform:scale(1.05);box-shadow:0 4px 8px rgba(0,0,0,.15)}.photo-album-card img,.photo-album-cover{width:100%;height:100%;object-fit:cover}.photo-album-overlay{position:absolute;right:0;bottom:0;left:0;padding:10px;background:linear-gradient(0deg,rgba(0,0,0,.8),transparent);color:#fff}.photo-album-title{margin:0!important;font-weight:400;font-size:.9em}.photo-album-count{font-size:.75em;opacity:.8}@keyframes b{0%{transform:translateY(10px);opacity:0}to{transform:translateY(0);opacity:1}}pre{position:relative;margin:2.4rem 0;margin:calc(var(--line-height)*2) 0;padding:1.2rem 2ch;padding:var(--line-height) 2ch;overflow-x:auto;overflow-y:hidden;border:2px solid #000;border:var(--border-thickness) solid var(--text-color);background:#eee;background:var(--background-color-alt);animation:b .3s ease-out}pre code{display:block;margin:0;padding:0;background:none;color:#000;color:var(--text-color);font-weight:500;font-weight:var(--font-weight-normal);font-size:.875rem;font-family:JetBrains Mono,monospace;font-family:var(--font-family)}pre code{line-height:1.2rem;line-height:var(--line-height)}pre:has(code.python):before{position:absolute;top:0;right:0;padding:.3rem 1ch;padding:calc(var(--line-height)/4) 1ch;background:#000;background:var(--text-color);content:"PYTHON";color:#fff;color:var(--background-color);font-weight:600;font-weight:var(--font-weight-medium);font-size:.75rem;text-transform:uppercase}pre:has(code.bash):before{position:absolute;top:0;right:0;padding:.3rem 1ch;padding:calc(var(--line-height)/4) 1ch;background:#000;background:var(--text-color);content:"SHELL";color:#fff;color:var(--background-color);font-weight:600;font-weight:var(--font-weight-medium);font-size:.75rem;text-transform:uppercase}pre:has(code.text):before{position:absolute;top:0;right:0;padding:.3rem 1ch;padding:calc(var(--line-height)/4) 1ch;background:#000;background:var(--text-color);content:"OUTPUT";color:#fff;color:var(--background-color);font-weight:600;font-weight:var(--font-weight-medium);font-size:.75rem;text-transform:uppercase}h2 code,h3 code,li code,p code{padding:0 .5ch;border:1px solid #000;border:1px solid var(--text-color);background:#eee;background:var(--background-color-alt);font-weight:600;font-weight:var(--font-weight-medium);font-size:.875em;font-family:JetBrains Mono,monospace;font-family:var(--font-family);white-space:nowrap}pre code .bash .comment,pre code .comment,pre code .python .comment{color:#666;color:var(--text-color-alt);font-style:italic}pre code .string{color:#000;color:var(--text-color);font-weight:600;font-weight:var(--font-weight-medium)}pre code .keyword{font-weight:800;font-weight:var(--font-weight-bold);-webkit-text-decoration:underline;text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px}pre code .function{font-weight:600;font-weight:var(--font-weight-medium)}pre code.text{font-variant-ligatures:none;font-feature-settings:none;letter-spacing:0}pre.line-numbers{padding-left:5ch}pre.line-numbers code{counter-reset:b}pre.line-numbers code .line{position:relative;counter-increment:b}pre.line-numbers code .line:before{position:absolute;left:-4ch;width:3ch;content:counter(b);color:#666;color:var(--text-color-alt);text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none}pre code .important{position:relative}pre code .important,pre code .important:after{font-weight:800;font-weight:var(--font-weight-bold)}pre code .important:after{position:absolute;right:-3ch;content:"←";color:#000;color:var(--text-color)}.comments-section{margin-top:4.8rem;margin-top:calc(var(--line-height)*4);padding-top:2.4rem;padding-top:calc(var(--line-height)*2);border-top:2px solid #000;border-top:var(--border-thickness) solid var(--text-color)}.comments-section h2{margin-bottom:2.4rem;margin-bottom:calc(var(--line-height)*2);font-weight:800;font-weight:var(--font-weight-bold);font-size:1.5rem}.comments-section h3{margin-bottom:1.2rem;margin-bottom:var(--line-height);font-weight:600;font-weight:var(--font-weight-medium);font-size:1.2rem}.alert{margin-bottom:2.4rem;margin-bottom:calc(var(--line-height)*2);padding:1.2rem 2ch;padding:var(--line-height) 2ch;border:2px solid #000;border:var(--border-thickness) solid var(--text-color);background:#eee;background:var(--background-color-alt)}.alert-info{border-color:#06c;color:#06c}.comment-form-container{margin-bottom:1.8rem;margin-bottom:calc(var(--line-height)*1.5);padding:.6rem 2ch;padding:calc(var(--line-height)/2) 2ch;border:2px solid #666;border:var(--border-thickness) solid var(--text-color-alt);background:#eee;background:var(--background-color-alt)}.comment-author-info{margin-bottom:1.2rem;margin-bottom:var(--line-height);color:#666;color:var(--text-color-alt)}.comment-form,.reply-form{margin-top:1.2rem;margin-top:var(--line-height)}.form-group{margin-bottom:1.8rem;margin-bottom:calc(var(--line-height)*1.5)}.form-group label{display:block;margin-bottom:.6rem;margin-bottom:calc(var(--line-height)/2);font-weight:600;font-weight:var(--font-weight-medium)}.comment-textarea,.reply-input,.reply-textarea{width:100%;padding:.6rem 1ch;padding:calc(var(--line-height)/2) 1ch;border:2px solid #666;border:var(--border-thickness) solid var(--text-color-alt);background:#fff;background:var(--background-color);color:#000;color:var(--text-color);font-size:1rem;font-family:JetBrains Mono,monospace;font-family:var(--font-family);resize:vertical}.comment-textarea{min-height:7.2rem;min-height:calc(var(--line-height)*6);line-height:1.5}.reply-textarea{min-height:4.8rem;min-height:calc(var(--line-height)*4);line-height:1.5}.comment-textarea:focus,.reply-input:focus,.reply-textarea:focus{border-color:#000;border-color:var(--text-color);outline:none}.form-text{display:block;margin-top:.3rem;margin-top:calc(var(--line-height)/4);color:#666;color:var(--text-color-alt);font-size:.875rem}.char-count{float:right;font-weight:600;font-weight:var(--font-weight-medium);transition:color .3s ease}.form-errors{margin-top:.6rem;margin-top:calc(var(--line-height)/2);color:#dc3545;font-size:.875rem}.btn-comment-submit,.btn-reply-submit{padding:.6rem 2ch;padding:calc(var(--line-height)/2) 2ch;border:none;background:#000;background:var(--text-color);color:#fff;color:var(--background-color);font-weight:600;font-weight:var(--font-weight-medium);font-family:JetBrains Mono,monospace;font-family:var(--font-family);text-transform:uppercase;cursor:pointer}.btn-comment-submit:hover,.btn-reply-submit:hover{background:#666;background:var(--text-color-alt)}.btn-cancel{margin-left:1ch;padding:.6rem 2ch;padding:calc(var(--line-height)/2) 2ch;border:2px solid #000;border:var(--border-thickness) solid var(--text-color);background:#fff;background:var(--background-color);color:#000;color:var(--text-color);font-weight:600;font-weight:var(--font-weight-medium);font-family:JetBrains Mono,monospace;font-family:var(--font-family);text-transform:uppercase;cursor:pointer}.btn-cancel:hover{background:#eee;background:var(--background-color-alt)}.comments-list{margin-top:2.4rem;margin-top:calc(var(--line-height)*2)}.comment{margin-bottom:1.8rem;margin-bottom:calc(var(--line-height)*1.5);padding:.6rem 2ch;padding:calc(var(--line-height)/2) 2ch;border:2px solid #666;border:var(--border-thickness) solid var(--text-color-alt);background:#fff;background:var(--background-color);animation:b .3s ease-out}.comment:target{border-color:#000;border-color:var(--text-color);background:#eee;background:var(--background-color-alt)}.comment-header{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;margin-bottom:.6rem;margin-bottom:calc(var(--line-height)/2);padding-bottom:.3rem;padding-bottom:calc(var(--line-height)/4);gap:1ch;border-bottom:2px solid #666;border-bottom:var(--border-thickness) solid var(--text-color-alt)}.comment-header-left{display:flex;flex-wrap:wrap;align-items:baseline;gap:1ch}.comment-header-right{display:flex;align-items:center}.comment-author{color:#000;color:var(--text-color);font-weight:800;font-weight:var(--font-weight-bold)}.staff-badge{display:inline-block;margin-right:.5ch;padding:0 .5ch;background:#000;background:var(--text-color);color:#fff;color:var(--background-color);font-weight:600;font-weight:var(--font-weight-medium);font-size:.75rem;text-transform:uppercase}.comment-date{font-size:.875rem}.comment-date,.comment-edited{color:#666;color:var(--text-color-alt)}.comment-edited{font-style:italic;font-size:.75rem}.comment-content{margin:.6rem 0;margin:calc(var(--line-height)/2) 0;line-height:1.2rem;line-height:var(--line-height)}.comment-actions{display:flex;flex-wrap:nowrap;align-items:center;margin-top:.6rem;margin-top:calc(var(--line-height)/2);gap:1ch}.btn-approve,.btn-delete,.btn-reply{display:inline-block;padding:.3rem 1ch;padding:calc(var(--line-height)/4) 1ch;border:2px solid #000;border:var(--border-thickness) solid var(--text-color);background:#fff;background:var(--background-color);color:#000;color:var(--text-color);font-weight:600;font-weight:var(--font-weight-medium);font-size:.875rem;line-height:1.2;font-family:JetBrains Mono,monospace;font-family:var(--font-family);text-transform:uppercase;vertical-align:baseline;cursor:pointer}.btn-approve:hover,.btn-delete:hover,.btn-reply:hover{background:#000;background:var(--text-color);color:#fff;color:var(--background-color)}.btn-delete{border-color:#dc3545;color:#dc3545}.btn-delete:hover{background:#dc3545;color:#fff;color:var(--background-color)}.btn-approve{border-color:#28a745;color:#28a745}.btn-approve:hover{background:#28a745;color:#fff;color:var(--background-color)}.inline-form{display:inline-flex;align-items:center;margin:0;padding:0;vertical-align:baseline}.reply-form-container{padding:.6rem 2ch;padding:calc(var(--line-height)/2) 2ch;border:2px solid #666;border:var(--border-thickness) solid var(--text-color-alt);background:#eee;background:var(--background-color-alt)}.replies,.reply-form-container{margin-top:.6rem;margin-top:calc(var(--line-height)/2)}.replies{margin-left:2ch;padding-left:2ch;border-left:4px solid #666;border-left:calc(var(--border-thickness)*2) solid var(--text-color-alt)}.reply{margin-bottom:.6rem;margin-bottom:calc(var(--line-height)/2);padding:.6rem 2ch;padding:calc(var(--line-height)/2) 2ch;border:2px solid #666;border:var(--border-thickness) solid var(--text-color-alt);background:#eee;background:var(--background-color-alt)}.reply:target{border-color:#000;border-color:var(--text-color);background:#fff;background:var(--background-color)}.reply .replies{margin-left:1ch;padding-left:1ch}.reply .comment-actions{flex-wrap:nowrap;min-height:1.8rem;min-height:calc(var(--line-height)*1.5)}.reply .btn-approve,.reply .btn-delete,.reply .btn-reply{display:inline-flex;align-items:center;justify-content:center;height:auto;min-height:1.44rem;min-height:calc(var(--line-height)*1.2);white-space:nowrap}.no-comments{padding:2.4rem 0;padding:calc(var(--line-height)*2) 0;color:#666;color:var(--text-color-alt);font-style:italic;text-align:center}.comment-votes{margin:0;gap:.3ch}.comment-votes,.vote-btn{display:inline-flex;align-items:center}.vote-btn{position:relative;justify-content:center;width:2pc;height:2pc;padding:0;border:none;border-radius:4px;background:transparent;color:#666;color:var(--text-color-alt);cursor:pointer;transition:all .15s ease}.vote-btn:hover:not([disabled]){background:#eee;background:var(--background-color-alt);color:#000;color:var(--text-color)}.vote-btn:active:not([disabled]){transform:scale(.95)}.vote-btn[disabled]{cursor:not-allowed;opacity:.4}.vote-btn.upvote.active{background:rgba(40,167,69,.1);color:#28a745}.vote-btn.upvote.active:hover{background:rgba(40,167,69,.15)}.vote-btn.downvote.active{background:rgba(220,53,69,.1);color:#dc3545}.vote-btn.downvote.active:hover{background:rgba(220,53,69,.15)}.vote-btn svg{width:20px;height:20px;stroke-width:2.5px;transition:transform .15s ease}.vote-btn.upvote:hover:not([disabled]) svg{transform:translateY(-2px)}.vote-btn.downvote:hover:not([disabled]) svg{transform:translateY(2px)}.vote-score{display:inline-flex;align-items:center;justify-content:center;min-width:2.5ch;height:2pc;padding:0 4px;color:#666;color:var(--text-color-alt);font-weight:800;font-weight:var(--font-weight-bold);font-size:1rem;line-height:2pc;text-align:center;transition:all .2s ease}.vote-score.positive{color:#28a745}.vote-score.negative{color:#dc3545}@media screen and (max-width:480px){pre{margin-right:-1ch;margin-left:-1ch;padding:1.2rem 1ch;padding:var(--line-height) 1ch;border-right:none;border-left:none}pre code{font-size:.8rem}pre:has(code.bash):before,pre:has(code.python):before,pre:has(code.text):before{padding:.2rem .75ch;padding:calc(var(--line-height)/6) .75ch;font-size:.65rem}.comments-section{margin-top:2.4rem;margin-top:calc(var(--line-height)*2)}.comment,.comment-form-container{padding:1.2rem 1ch;padding:var(--line-height) 1ch}.replies{margin-left:1ch;padding-left:1ch}.reply{padding:.6rem 1ch;padding:calc(var(--line-height)/2) 1ch}.comment-actions{flex-wrap:wrap}.btn-approve,.btn-cancel,.btn-delete,.btn-reply{font-size:.75rem}.comment-votes{gap:.25ch}.vote-btn{width:28px;height:28px}.vote-btn svg{width:1pc;height:1pc}.vote-score{height:28px;font-size:.875rem;line-height:28px}}@media (prefers-color-scheme:dark){pre code .keyword{text-decoration-color:#666;text-decoration-color:var(--text-color-alt)}}.search-autocomplete{z-index:1000;position:absolute;width:100%;max-width:600px;max-height:25pc;overflow-y:auto;border:2px solid #000;border:var(--border-thickness) solid var(--text-color);border-top:none;background:#fff;background:var(--background-color);box-shadow:0 4px 6px rgba(0,0,0,.1)}.search-autocomplete-item{display:block;padding:.6rem 1ch;padding:calc(var(--line-height)/2) 1ch;border-bottom:2px solid #666;border-bottom:var(--border-thickness) solid var(--text-color-alt);color:#000;color:var(--text-color);-webkit-text-decoration:none;text-decoration:none;cursor:pointer;transition:background-color .15s ease}.search-autocomplete-item:last-child{border-bottom:none}.search-autocomplete-item.selected,.search-autocomplete-item:hover{background:#eee;background:var(--background-color-alt)}.autocomplete-title{font-size:.875rem;line-height:1.6}.autocomplete-type{display:inline-block;margin-left:.25ch;padding:.125rem .5rem;border-radius:2px;background:#000;background:var(--text-color);color:#fff;color:var(--background-color);font-size:.75rem;line-height:1;vertical-align:middle;white-space:nowrap}.autocomplete-type.category-tech{background:#5fb4b6;background:var(--category-tech-node);color:#fff}.autocomplete-type.category-personal{background:#c594c5;background:var(--category-personal-node);color:#fff}.autocomplete-type.category-projects{background:#fac863;background:var(--category-projects-node);color:#fff}.autocomplete-type.category-guides{background:#99c794;background:var(--category-guides-node);color:#fff}.autocomplete-type.category-smart_home{background:#ec5f67;background:var(--category-smart_home-node);color:#fff}.autocomplete-type.category-reviews{background:#6c99bb;background:var(--category-reviews-node);color:#fff}.search-autocomplete::-webkit-scrollbar{width:8px}.search-autocomplete::-webkit-scrollbar-track{background:#fff;background:var(--background-color)}.search-autocomplete::-webkit-scrollbar-thumb{border-radius:4px;background:#666;background:var(--text-color-alt)}.search-autocomplete::-webkit-scrollbar-thumb:hover{background:#000;background:var(--text-color)}@media (max-width:768px){.search-autocomplete{max-width:100%;max-height:300px}.autocomplete-title{font-size:.8125rem}.autocomplete-type{font-size:.6875rem}}