/* All pages share the pointer. Ambient fields/type are opt-in by section;
   photo heroes and existing scroll tracks stay separate. */
.home-ending,.about-ending{background:linear-gradient(#fff 76%,var(--yellow-accent))}
.home-ending>.connect-section,.home-ending>.site-footer,.about-ending>.about-next,.about-ending>.site-footer{background:transparent}
.cursor-field{isolation:isolate}
.cursor-field-positioned{position:relative}
.cursor-dots{position:absolute;inset:0;width:100%;height:100%;z-index:-1;pointer-events:none;user-select:none}
.belle-cursor{position:fixed;left:0;top:0;width:8px;height:8px;border-radius:50%;background:#9782ad;pointer-events:none;z-index:9999;opacity:0;transition:width .24s,height .24s,background .24s,opacity .16s;will-change:transform;contain:layout style}
.belle-cursor.is-visible{opacity:1}
.belle-cursor.is-link{width:42px;height:42px;background:#a794bd55}
.cursor-ink-positioned{position:relative}
.cursor-ink-host{color:transparent!important}
.cursor-ink-layer{position:absolute;inset:0;display:block;pointer-events:none;user-select:none;color:var(--cursor-ink-color);text-shadow:none}
.cursor-glyph{position:absolute;display:block;white-space:pre;transform-origin:50% 70%;pointer-events:none;transition:transform .18s ease-out,text-shadow .18s ease-out}
.cursor-glyph.is-near{transition:none}
/* Low-specificity positioning preserves fixed back-top / absolute carousel
   controls. Clip the wash itself, leaving small controls' hit areas intact. */
:where([data-cursor-button]){position:relative}
[data-cursor-button]{isolation:isolate}
[data-cursor-button]::before{content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;background:#d9d3e1;clip-path:ellipse(80% 50% at 50% 155%);transition:clip-path .5s cubic-bezier(.19,1,.22,1);pointer-events:none}
[data-cursor-button]:is(:hover,:focus-visible):not(:disabled)::before{clip-path:ellipse(110% 90% at 50% 50%)}
/* Dark controls keep their original resting surface; labels turn dark once
   the lavender wash reaches them. No changes to embedded project controls. */
[data-cursor-button]:is(.menu-toggle,.back-top,.corner-menu a,.motion-switch,.project-player button){transition:color .2s}
[data-cursor-button]:is(.menu-toggle,.back-top,.corner-menu a,.motion-switch,.project-player button):is(:hover,:focus-visible){color:#111;transition-delay:.1s}
.back-top[data-cursor-button]:hover{background:var(--ink)}
.corner-menu [data-cursor-button]:hover{background:none}
.language-switch [data-cursor-button]:is(:hover,:focus-visible){opacity:1}
.resource-search [data-cursor-button]{border-radius:50%}
/* Keep selected filter labels legible and preserve their existing colors. */
.resource-filter[aria-pressed=true]::before,.work-filter[aria-pressed=true]::before{display:none}
@media(hover:hover) and (pointer:fine){
 .cursor-tracking body{cursor:none}
 .cursor-tracking :is(a,button,[role=button],.contact-service):not(dialog *){cursor:none!important}
 .cursor-tracking :is(input,textarea,[contenteditable=true]){cursor:text}
 .cursor-tracking dialog,.cursor-tracking dialog *{cursor:revert!important}
}
@media(hover:none),(pointer:coarse),(prefers-reduced-motion:reduce){
 .cursor-dots,.belle-cursor,.cursor-ink-layer{display:none!important}
 .cursor-ink-host{color:var(--cursor-ink-color)!important}
 [data-cursor-button]::before{display:none}
}
.motion-off .cursor-dots,.motion-off .belle-cursor,.motion-off .cursor-ink-layer{display:none!important}
.motion-off .cursor-ink-host{color:var(--cursor-ink-color)!important}
.motion-off [data-cursor-button]::before{display:none}
/* Touch-only, transient overlay. It never takes part in layout or hit testing. */
.belle-touch-layer{position:fixed;inset:0;overflow:hidden;contain:strict;pointer-events:none;z-index:9998}
.belle-touch-field{position:absolute;left:0;top:0;width:288px;height:288px;opacity:0;pointer-events:none;user-select:none;will-change:transform,opacity}
.motion-off .belle-touch-layer{display:none}
@media(prefers-reduced-motion:reduce){.belle-touch-layer{display:none}}
