:root{--paper:#f7f5ee;--ink:#171717;--desktop:#777f76;--chrome:#dedbd2;--chrome-dark:#8a877f;--blue:#263d99;--violet:#6650c7;--red:#a84e3e;--green:#34785b;--line:#222;--shadow:#0000004d;color:var(--ink);background:var(--desktop);font-synthesis:none;font-family:Figtree,system-ui,sans-serif}*{box-sizing:border-box}html,body{background:var(--desktop);min-width:320px;min-height:100%;margin:0}body{font-size:16px;line-height:1.5}button,input,textarea{font:inherit}a{color:inherit}.skip-link{z-index:1000;background:#fff;border:2px solid #000;padding:.6rem .8rem;position:fixed;top:.5rem;left:.5rem;transform:translateY(-150%)}.skip-link:focus{transform:none}.workbench{background:var(--desktop);height:100svh;min-height:620px;font-family:Figtree,system-ui,sans-serif;overflow:hidden}.desktop{background-color:#858b82;background-image:linear-gradient(45deg,#ffffff0b 25%,#0000 25% 75%,#ffffff0b 75%),linear-gradient(45deg,#0000000a 25%,#0000 25% 75%,#0000000a 75%);background-position:0 0,4px 4px;background-size:8px 8px;grid-template-rows:34px minmax(0,1fr) 32px;height:100%;display:grid}.startup{z-index:100;color:#f4f1e7;background:#111;place-items:center;padding:1rem;transition:opacity .38s,transform .38s;display:grid;position:fixed;inset:0}.startup[data-leaving=true]{opacity:0;pointer-events:none;transform:scale(1.025)}.startup-card{text-align:center;border:2px solid;width:min(92vw,490px);padding:2.1rem 2rem 1.6rem;font-family:IBM Plex Mono,monospace;box-shadow:inset 0 0 0 4px #111,inset 0 0 0 5px}.startup-mark{border:3px solid;grid-template-columns:1fr 1fr;width:72px;height:72px;margin:0 auto 1.2rem;display:grid}.startup-mark span{place-items:center;font-size:1.35rem;font-weight:700;display:grid}.startup-mark span+span{color:#111;background:#f4f1e7}.startup-kicker,.startup-version,.startup-hint{margin:.25rem 0;font-size:.75rem}.startup-card h1{margin:.45rem 0 1rem;font:600 1.25rem/1.3 IBM Plex Mono,monospace}.start-button,.restore-window,.contact-actions button{color:#111;cursor:pointer;background:#f4f1e7;border:2px solid;min-height:44px;padding:.65rem 1rem;font:600 .85rem IBM Plex Mono,monospace;box-shadow:3px 3px #777}.startup-hint{color:#aaa;margin-top:1rem}.system-bar,.control-strip{z-index:20;background:var(--chrome);border-bottom:2px solid #111;align-items:center;font:600 .75rem IBM Plex Mono,monospace;display:flex;box-shadow:inset 0 1px #fff}.system-mark{color:#fff;background:#111;border-right:1px solid #777;place-items:center;width:44px;height:100%;text-decoration:none;display:grid}.system-bar nav{align-items:stretch;height:100%;display:flex}.system-bar nav a,.system-bar nav button{white-space:nowrap;cursor:pointer;background:0 0;border:0;border-right:1px solid #0000;align-items:center;padding:0 .75rem;text-decoration:none;display:flex}.system-bar nav a:hover,.system-bar nav a:focus-visible,.system-bar nav button:hover,.system-bar nav button:focus-visible,.system-bar nav a[aria-current=page]{color:#fff;background:#111}.system-clock{white-space:nowrap;margin-left:auto;padding:0 .7rem}.desktop-field{min-height:0;position:relative;overflow:hidden}.desktop-icons{z-index:3;grid-template-columns:repeat(2,82px);gap:.9rem .65rem;display:grid;position:absolute;inset:1.25rem auto auto 1.25rem}.desktop-icon{color:#fff;text-shadow:1px 1px #000;cursor:pointer;text-align:center;background:0 0;border:0;align-content:start;justify-items:center;gap:.3rem;width:82px;min-height:76px;padding:.2rem;font:600 .75rem/1.2 IBM Plex Mono,monospace;text-decoration:none;display:grid}.desktop-icon:hover,.desktop-icon:focus-visible,.desktop-icon[aria-current=page]{outline-offset:2px;background:#0000002e;outline:1px dotted #fff}.icon-art{color:#111;width:42px;height:42px;text-shadow:none;background:#eee;border:2px solid #111;place-items:center;display:grid;position:relative;box-shadow:inset -4px -4px #aaa,2px 2px #333}.icon-art:before{content:"";border:1px solid #555;position:absolute;inset:5px}.icon-art span{z-index:1;font:700 .8rem IBM Plex Mono,monospace;position:relative}.icon-projects{background:#f2ca59}.icon-blogs{background:#fff}.icon-blogs:after{content:"";background:repeating-linear-gradient(#555 0 1px,#0000 1px 5px);position:absolute;inset:10px 7px}.icon-playground{background:#7db0a6}.icon-about{background:#e7b6a8}.icon-resume{background:#fff}.icon-resume:after{content:"";background:repeating-linear-gradient(#333 0 1px,#0000 1px 5px);position:absolute;inset:8px}.icon-music{background:#d6d3cb;border-radius:5px}.icon-contact{background:#c6d0ec}.mac-window{z-index:5;background:var(--paper);border:2px solid #111;grid-template-rows:31px minmax(0,1fr) 24px;width:min(76vw,1050px);height:min(77vh,760px);display:grid;position:absolute;top:50%;left:calc(50% + 72px);transform:translate(-50%,-50%);box-shadow:10px 12px #0000003d,inset 0 0 0 1px #fff}.mac-window[hidden]{display:none}.window-bar{cursor:grab;user-select:none;background:repeating-linear-gradient(0deg,#fff 0 2px,#111 2px 3px);border-bottom:2px solid #111;grid-template-columns:30px 1fr 30px;align-items:center;display:grid}.window-bar h1,.window-bar h2{background:var(--chrome);letter-spacing:0;justify-self:center;margin:0;padding:2px .65rem;font:600 .78rem IBM Plex Mono,monospace}.window-control{background:var(--chrome);cursor:pointer;border:2px solid #111;justify-self:center;width:17px;height:17px;box-shadow:inset 1px 1px #fff}.close-control:after{content:"×";font:700 12px/10px sans-serif;display:block}.zoom-control:after{content:"−";font:700 12px/9px sans-serif;display:block}.window-content{overscroll-behavior:contain;background:var(--paper);min-height:0;padding:clamp(1rem,3vw,2rem);overflow:auto}.window-status{background:var(--chrome);border-top:1px solid #777;justify-content:space-between;align-items:center;padding:0 .55rem;font:500 .7rem IBM Plex Mono,monospace;display:flex}.window-grip{background:repeating-linear-gradient(135deg,#0000 0 3px,#777 3px 4px);width:30px;height:14px}.restore-window{z-index:4;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.control-strip{border-top:2px solid #111;border-bottom:0;justify-content:space-between;padding:0 .7rem}.control-strip button{cursor:pointer;background:#eee;border:1px solid #111;width:28px;height:25px}.mac-dialog{background:var(--paper);border:2px solid #111;width:min(92vw,430px);padding:0;box-shadow:10px 12px #0000004d}.mac-dialog::backdrop{background:#1414147a}.music-player{text-align:center;padding:1.3rem}.music-screen{background:#9cae92;border:2px inset #777;gap:.2rem;margin:0 auto 1rem;padding:.75rem;font:500 .75rem IBM Plex Mono,monospace;display:grid}.click-wheel{background:#dedbd2;border-radius:50%;width:150px;height:150px;margin:0 auto 1rem;position:relative;box-shadow:inset 0 0 0 2px #aaa}.click-wheel>span{width:100%;font:600 .6rem IBM Plex Mono,monospace;position:absolute;top:14px;left:0}.click-wheel button{cursor:pointer;background:#eee;border:1px solid #999;border-radius:50%;width:55px;height:55px;position:absolute;inset:50% auto auto 50%;transform:translate(-50%,-50%)}.music-player p{font-size:.85rem}.contact-form{margin:0}.contact-body{gap:.8rem;padding:1.2rem;display:grid}.contact-body>p{margin:0}.contact-body label{gap:.25rem;font:600 .78rem IBM Plex Mono,monospace;display:grid}.contact-body input,.contact-body textarea{background:#fff;border:2px inset #aaa;width:100%;padding:.55rem}.contact-actions,.contact-links{align-items:center;gap:1rem;display:flex}.contact-actions button{min-height:40px}.contact-status{min-height:1.5rem;font-size:.85rem}.honeypot{left:-9999px;position:absolute!important}.contact-links a{font:600 .75rem IBM Plex Mono,monospace}.project-intro{border-bottom:2px solid #111;justify-content:space-between;align-items:flex-start;gap:2rem;margin-bottom:1.4rem;padding-bottom:1rem;display:flex}.project-intro h2,.page-intro h2{margin:0;font-size:1.25rem}.project-intro p,.page-intro p{color:#54514b;max-width:60ch;margin:.35rem 0 0}.project-list{gap:1rem;display:grid}.project-entry{background:#fff;border:1px solid #777;grid-template-columns:132px 180px minmax(0,1fr);gap:1.1rem;padding:1rem;display:grid;box-shadow:3px 3px #c6c3ba}.project-entry time,.project-entry .group{font:500 .75rem/1.4 IBM Plex Mono,monospace}.project-thumb{aspect-ratio:16/10;background:#eee;border:1px solid #777;display:block;overflow:hidden}.project-thumb img{object-fit:cover;width:100%;height:100%}.project-copy h3{align-items:center;gap:.55rem;margin:0;font-size:1.1rem;display:flex}.project-mark{background:#eee;border:1px solid #777;place-items:center;width:34px;height:34px;font:700 .7rem IBM Plex Mono,monospace;display:grid}.project-mark img{object-fit:contain;width:100%;height:100%}.project-copy p{color:#504e49;margin:.45rem 0}.project-stack{flex-wrap:wrap;gap:.3rem;margin:.6rem 0;padding:0;list-style:none;display:flex}.project-stack li{background:#eee;border:1px solid #aaa;padding:.16rem .35rem;font:500 .7rem IBM Plex Mono,monospace}.project-links{flex-wrap:wrap;gap:.8rem;font:600 .75rem IBM Plex Mono,monospace;display:flex}.project-links a,.project-links button{color:var(--blue);cursor:pointer;font:inherit;background:0 0;border:0;padding:0;text-decoration:underline}.section-label{text-transform:uppercase;margin:1.6rem 0 .8rem;font:600 .8rem IBM Plex Mono,monospace}.parable-runner{border:2px solid #111;width:min(96vw,1180px);height:min(90vh,820px);padding:0}.parable-runner iframe{background:#fff;border:0;width:100%;height:calc(100% - 66px)}.runner-actions{background:var(--chrome);border-top:1px solid #777;align-items:center;gap:1rem;height:34px;padding:0 .7rem;font:600 .72rem IBM Plex Mono,monospace;display:flex}.runner-actions a{color:var(--blue)}.page-intro{margin-bottom:1.25rem}.writing-list{border-top:2px solid #111;gap:0;margin:0;padding:0;list-style:none;display:grid}.writing-row{border-bottom:1px solid #aaa;grid-template-columns:9rem minmax(0,1fr) auto;align-items:start;gap:1rem;padding:1rem 0;display:grid}.writing-row time,.writing-row span{font:500 .75rem IBM Plex Mono,monospace}.writing-row h2{margin:0;font-size:1.1rem}.writing-row p{color:#555;margin:.35rem 0}.gallery-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;display:grid}.gallery-card{background:#fff;border:1px solid #777;margin:0;padding:.65rem;box-shadow:3px 3px #c6c3ba}.gallery-card img,.gallery-card video{aspect-ratio:16/10;object-fit:cover;width:100%}.gallery-card figcaption{margin-top:.45rem;font-size:.85rem}.about-grid{grid-template-columns:minmax(0,1.3fr) minmax(220px,.7fr);gap:1.5rem;display:grid}.about-copy h2{margin-top:0;font-size:1.25rem}.about-copy p{max-width:64ch}.about-photo{margin:0;transform:rotate(1deg)}.about-photo img{object-fit:cover;border:10px solid #fff;width:100%;max-height:480px;box-shadow:4px 5px #aaa}.about-photo figcaption{text-align:center;font:500 .72rem IBM Plex Mono,monospace}.article-shell{max-width:760px;margin:auto}.article-shell h2{font-size:1.5rem}.article-shell h3{font-size:1.25rem}.article-shell pre{color:#fff;background:#171717;padding:1rem;overflow:auto}.article-shell img{max-width:100%}.article-meta{font:500 .75rem IBM Plex Mono,monospace}@media (width<=900px){.desktop{grid-template-rows:auto minmax(0,1fr) 32px}.system-bar{flex-wrap:wrap;align-items:stretch;min-height:68px}.system-mark{height:34px}.system-bar nav{border-top:1px solid #777;order:3;width:100%;overflow-x:auto}.system-bar nav a,.system-bar nav button{flex:1;justify-content:center;min-height:34px;padding:0 .45rem}.system-clock{align-items:center;height:34px;display:flex}.desktop-icons{grid-template-columns:repeat(3,76px);gap:.5rem;inset:.8rem auto auto .6rem}.mac-window{width:calc(100% - 170px);height:calc(100% - 1.2rem);left:calc(50% + 66px)}.project-entry{grid-template-columns:120px minmax(0,1fr)}.project-entry>div:first-child{grid-column:1/-1;gap:1rem;display:flex}.project-thumb{grid-row:2}.gallery-grid{grid-template-columns:1fr}}@media (width<=760px){.workbench{height:auto;min-height:100svh;overflow:visible}.desktop{grid-template-rows:auto auto 32px;min-height:100svh}.desktop-field{flex-direction:column;display:flex;overflow:visible}.desktop-icons{border-bottom:2px solid #111;grid-template-columns:repeat(4,minmax(0,1fr));gap:.5rem;padding:.8rem;display:grid;position:relative;inset:auto}.desktop-icon{width:auto;min-width:0}.mac-window{width:calc(100% - 1rem);height:auto;min-height:65vh;margin:.5rem;position:relative;box-shadow:4px 5px #00000040;top:auto!important;left:auto!important;transform:none!important}.window-content{overflow:visible}.project-entry{grid-template-columns:1fr}.project-entry>div:first-child{grid-column:auto}.project-thumb{grid-row:auto}.about-grid,.writing-row{grid-template-columns:1fr}.system-bar nav{grid-template-columns:repeat(3,1fr);display:grid}.system-bar nav a,.system-bar nav button{border:1px solid #aaa;min-height:44px}.control-strip span:nth-child(2){display:none}.window-bar{cursor:default}}@media (width<=430px){.desktop-icons{grid-template-columns:repeat(3,minmax(0,1fr))}.desktop-icon{font-size:.7rem}.project-intro{display:block}.project-entry{padding:.75rem}.gallery-grid{grid-template-columns:1fr}.startup-card{padding:1.5rem 1rem}.system-bar nav{grid-template-columns:repeat(2,1fr)}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.now-note h2{font-size:1.25rem}.reading-shelf-teaser{background:#e6e1d5;border:1px solid #777;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:1.5rem;margin-top:1.5rem;padding:1rem;display:grid;box-shadow:3px 3px #b5b1a8}.reading-shelf-teaser h2{margin:0;font-size:1.25rem}.reading-shelf-teaser p{max-width:58ch;margin:.35rem 0 .8rem}.reading-shelf-teaser button{background:#f7f5ee;border:1px solid #777;min-height:40px;padding:.45rem .7rem;font:600 .75rem IBM Plex Mono,monospace}.reading-shelf-covers{align-items:end;padding-right:1.5rem;display:flex}.reading-shelf-covers img{object-fit:cover;border:1px solid #555;width:54px;height:81px;margin-right:-1.1rem;box-shadow:2px 2px #777}.reading-shelf-covers img:nth-child(2n){translate:0 -5px}@media (width<=600px){.reading-shelf-teaser{grid-template-columns:1fr;gap:.8rem}.reading-shelf-covers{padding:0 0 .3rem}}@media (pointer:fine) and (prefers-reduced-motion:no-preference) and (forced-colors:none){html,body,body *{cursor:url(/cursors/retro-arrow.svg) 3 2,auto!important}body :is(a,button,select,input[type=range],input[type=checkbox],summary){cursor:url(/cursors/retro-arrow.svg) 3 2,pointer!important}body :is(input:not([type=range]):not([type=checkbox]),textarea,[contenteditable=true]){cursor:text!important}body [data-drag-handle]{cursor:url(/cursors/retro-arrow.svg) 3 2,grab!important}body [data-drag-handle]:active{cursor:url(/cursors/retro-arrow.svg) 3 2,grabbing!important}dialog::backdrop{cursor:url(/cursors/retro-arrow.svg) 3 2,auto}}
