.sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important;user-select:none}
.motion-text-run,.motion-visual{display:inline}.motion-word{display:inline-block;white-space:nowrap}/* Character reveals only fade: clipping their tight boxes cuts glyph overhangs,
   especially with the negative tracking used by large headings. */
.motion-char-mask{display:inline-block;overflow:visible;vertical-align:bottom;padding-bottom:.12em;margin-bottom:-.12em}
/* Keep the same layout dimensions while allowing ink beyond a word's advance.
   Only moving line reveals need a mask; finished text must remain unclipped. */
.motion-word-mask{display:inline-block;white-space:nowrap;overflow:visible;vertical-align:bottom;padding:.12em .16em .16em;margin:-.12em -.16em -.16em}
.motion-text-ready .motion-word-mask{overflow:clip}.motion-unit{display:inline-block;position:relative}.motion-text-ready .motion-unit{opacity:0}.motion-wait{opacity:0}.motion-rule-ready{position:relative;border-bottom-color:transparent!important}.motion-rule{display:none;position:absolute;left:0;bottom:-1px;width:100%;height:1px;background:currentColor;transform-origin:left center;pointer-events:none}.motion-rule-ready>.motion-rule{display:block}.motion-boot [data-text-reveal],.motion-boot [data-reveal]{visibility:hidden}
/* The first-paint guard recovers even when scripts fail after boot. */
@keyframes motion-emergency-visible{to{visibility:visible}}
.motion-boot [data-text-reveal],.motion-boot [data-reveal]{animation:motion-emergency-visible 0s 5s forwards}
/* Text nested inside a title remains inline after character splitting. */
.hero h1 .motion-char-mask,.hero h1 .motion-word,.hero h1 .motion-word-mask,.hero h1 .motion-unit{display:inline-block}.hero h1 .motion-text-run,.hero h1 .motion-visual{display:inline}
/* Hover movement is separate from the one-time entrance sequence. */
.project-link .project-heading h3{transition:color .25s}.project-link:hover .project-heading h3{color:var(--accent)}.project-view{overflow:hidden}.project-link:hover .project-view .arrow{transform:translate(2px,-2px)}.wide-link,.line-link{position:relative}.discipline-body{animation:details-enter .5s var(--ease)}
@keyframes details-enter{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}
@media(prefers-reduced-motion:reduce){.motion-boot [data-text-reveal],.motion-boot [data-reveal]{visibility:visible!important}.motion-text-ready .motion-unit,.motion-wait{opacity:1!important;transform:none!important}.motion-rule-ready{border-bottom-color:currentColor!important}.motion-rule{display:none!important}.discipline-body{animation:none}}
@media print{.motion-boot [data-text-reveal],.motion-boot [data-reveal]{visibility:visible!important}.motion-text-ready .motion-unit,.motion-wait{opacity:1!important;transform:none!important}}

.detail-heading h1 .motion-word,.wood-article h1 .motion-word{max-width:100%;white-space:normal;overflow-wrap:anywhere}
.detail-image{overflow:hidden}
main{overflow-x:clip}
