/* ============ SITE CURSOR — one shared tier (cursor.css + cursor.js) ============
   EXACTLY three cursor treatments exist site-wide, as tokens on :root, and NOTHING outside
   this file may declare a cursor anywhere (no page, no component, no inline style — they
   were all removed rather than out-specified, so the tier cannot be regressed by a new
   page rule).

     --cursor-pointer  the custom hand: url("/assets/images/icons/cursor-hand.png") 12 5 (32px export of
                       uploads/Pointer.svg, hotspot 12 5 = the measured index fingertip;
                       cursor-hand-2x.png shipped alongside for HiDPI). The `pointer`
                       keyword ALWAYS stays as fallback, so a failed asset load never
                       leaves anyone cursorless.
     --cursor-text     the standard I-beam, on text inputs / textareas / editable fields.
     --cursor-default  the Intro/Work FACE ornament: native cursor hidden (cursor:none)
                       plus the JS ring + face group. SCOPED TO THE INTRO/WORK SCENES PAGE
                       ONLY (cursor.js gates .curon by path).

   SCOPES — decided by two classes cursor.js puts on <html>:
     .curon   the Intro/Work scenes page: face cursor as the default, swapping to the hand
              over interactive elements, I-beam in fields. Unchanged behaviour.
     .curhand EVERY other page and surface (Expertise, Kind words, About me, Get in touch
              outside its fields, all case studies, the menu panel, modals, tooltip
              triggers, the curtain/transition overlays): the HAND AT ALL TIMES — over
              non-interactive area and interactive elements alike. It never swaps to
              anything but the I-beam inside an editable field.
   Both are additionally gated on .curfine (fine pointer). Touch devices run NO custom
   cursor logic at all (cursor.js returns before adding any class), as required.

   All rules are !important and the hand rule reaches every descendant, so nothing in a
   page can surface a browser-default arrow, a not-allowed, a grab or a resize cursor.
   Keep the hotspot + the two selector lists in sync with cursor.js. LOADED RENDER-BLOCKING
   IN <head> on every page (link + script directly after pagetrans.js, with a preload for
   cursor-hand.png), so the scope class and the hand token exist on the very first covered
   frame of every arrival — Nav's helmet copy remains only as a late fallback for pages
   without the head block. */
:root{--cursor-default:none;--cursor-pointer:url("/assets/images/icons/cursor-hand.png?v=2") 12 5,pointer;--cursor-text:text;--color-cursor-fill:#C4756A}
@media (hover:hover) and (pointer:fine){
/* 1 — NON-SCENE PAGES: the hand is the cursor at all times, on the root and every
   descendant (the root declaration is also what the ::view-transition pseudo tree and the
   curtain overlay inherit, so the hand persists through page transitions). */
:root.curhand,:root.curhand *{cursor:var(--cursor-pointer)!important}
/* Best-effort on styled scrollbar parts; native OS scrollbars stay outside CSS reach. */
:root.curhand ::-webkit-scrollbar,:root.curhand ::-webkit-scrollbar-track,:root.curhand ::-webkit-scrollbar-thumb,:root.curhand ::-webkit-scrollbar-corner{cursor:var(--cursor-pointer)!important}
/* 2 — INTRO/WORK SCENES PAGE: the face ornament is the default … */
:root.curon,:root.curon *{cursor:var(--cursor-default,none)!important}
/* … swapping to the hand on interactive elements (and their children; the blanket rule
   above would otherwise out-cascade inheritance). */
:root.curon :is(a,button,select,summary,label,[role="button"],[role="link"],[role="tab"],[role="menuitem"],[tabindex]:not([tabindex="-1"]),.hot,.tcard:not(.foc),[data-cursor="pointer"]),
:root.curon :is(a,button,select,summary,label,[role="button"],[role="link"],[role="tab"],[role="menuitem"],[tabindex]:not([tabindex="-1"]),.hot,.tcard:not(.foc),[data-cursor="pointer"]) *{cursor:var(--cursor-pointer)!important}
/* 2b — TRANSITION WINDOWS on the scenes page: while any transition attribute is up the face
   ornament stands down (rule at the bottom of this file), so cursor:none would leave the
   user cursorless over the moving snapshots / arriving curtain. The hand takes over for
   exactly those windows; the face returns the frame the attribute clears. Same attribute
   list as the stand-down rule — keep them in sync. */
:root.curon[data-vtmode],:root.curon[data-vtmode] *,:root.curon[data-pgvt],:root.curon[data-pgvt] *,:root.curon[data-pgleave],:root.curon[data-pgleave] *,:root.curon[data-pgsweep],:root.curon[data-pgsweep] *{cursor:var(--cursor-pointer)!important}
/* 2c — the curtain overlay itself, both scopes (belt-and-braces: it is pointer-events:none,
   so the cursor normally comes from the page beneath, which the rules above already cover). */
:root.curfine .pgsweep,:root.curfine .pgsweep *{cursor:var(--cursor-pointer)!important}
/* 3 — I-BEAM on text-editing surfaces, in BOTH scopes and last word in the cascade (a
   field inside a label, or inside the blanket hand, still gets the I-beam). */
:root.curfine :is(input:not([type]),input[type="text"],input[type="email"],input[type="search"],input[type="tel"],input[type="url"],input[type="number"],input[type="password"],textarea,[contenteditable="true"],[contenteditable=""]),
:root.curfine :is(textarea,[contenteditable="true"],[contenteditable=""]) *{cursor:var(--cursor-text,text)!important}
}
/* ---- The ring/face ornament (Intro/Work only; geometry/timing from the Intro/Work build:
   ring lerps at .12, the face leads by clamped velocity) ---- */
.sc-cring{position:fixed;top:0;left:0;width:36px;height:36px;margin:-18px 0 0 -18px;background:var(--color-cursor-fill,#C4756A);box-shadow:0 3px 12px rgba(0,0,0,.16);border-radius:50%;pointer-events:none;z-index:2147482700;opacity:0;transition:width .6s var(--ease,cubic-bezier(.45,.05,.55,.95)),height .6s var(--ease,cubic-bezier(.45,.05,.55,.95)),margin .6s var(--ease,cubic-bezier(.45,.05,.55,.95)),border-width .6s var(--ease,cubic-bezier(.45,.05,.55,.95)),opacity .5s var(--ease,cubic-bezier(.45,.05,.55,.95))}
.sc-cdot{position:fixed;top:0;left:0;width:20px;height:20px;margin:-10px 0 0 -10px;pointer-events:none;z-index:2147482700;opacity:0;transition:opacity .5s var(--ease,cubic-bezier(.45,.05,.55,.95))}
.sc-cdot svg{display:block;width:100%;height:100%}
.sc-cring.live,.sc-cdot.live{opacity:1}
/* Page transitions run on SNAPSHOTS: the ornament is a live-view accessory, never part of
   the landscape, so it stands down whenever any transition attribute is up. */
:root[data-vtmode] .sc-cring,:root[data-vtmode] .sc-cdot,:root[data-pgvt] .sc-cring,:root[data-pgvt] .sc-cdot,:root[data-pgleave] .sc-cring,:root[data-pgleave] .sc-cdot,:root[data-pgsweep] .sc-cring,:root[data-pgsweep] .sc-cdot{opacity:0}
