/*
 * Aether Gloves ("Astral Filigree") cursor — the single definition point for every cursor in the
 * game and on the website.
 *
 * The six state variables are declared here, on html, valued with the image itself. That is what
 * makes `cursor: var(--aog-cursor-pointer, pointer)` safe in the ~90 element rules across the
 * menus: their keyword fallback is unreachable while these exist, so a missing, blocked or failed
 * runtime cannot turn every hovered button into the OS hand. Before this the variables existed only
 * after JavaScript had verified all 21 images, so one dropped preload request could silently
 * downgrade a whole session to OS cursors — invisible in the DOM, because the computed style still
 * reported a valid cursor image.
 *
 * filigree.js still owns size and the "System" preference: it writes these same variables as inline
 * styles on <html>, which outrank this rule. "System" is expressed by writing the keyword itself.
 *
 * Paths are root-absolute because a url() that arrives through a custom property is resolved
 * against the stylesheet that CONSUMES it, not the one that declared it (measured 2026-09-24: the
 * same relative value resolved to /assets/cursors/x.png for a rule in this file and to /x.png for a
 * rule in the menu's inline dev stylesheet, and 404ed). "/assets/cursors/…" is therefore the only
 * form that is correct for the dev server and the deployed site. It does not resolve under
 * file:// in Electron — where the runtime always writes its own absolute file:// values, including
 * on the sign-in and startup pages — so nothing depends on it there.
 *
 * One size, fixed: 32px. Chrome refuses a cursor image larger than that once the pointer is moved into
 * the window edge — measured 2026-09-25 with the probe, where 36/40/44/48/64 were all replaced by the
 * OS cursor there and only 32 held. Since a chosen size cannot be honoured consistently across the
 * screen, the set ships at the size that always works and there is no size setting to contradict it.
 * One image per state, then the keyword: an unusable image falls through to an OS cursor, which is
 * loud and reportable rather than subtly wrong.
 *
 * Hotspots mirror the runtime: round(size * 0.1) for pointing poses, centred for grab/grip.
 */
html {
  --aog-cursor-default: url("/assets/cursors/default-32.png") 3 3, default;
  --aog-cursor-pointer: url("/assets/cursors/hover-32.png") 3 3, pointer;
  --aog-cursor-grab: url("/assets/cursors/grab-32.png") 16 16, grab;
  --aog-cursor-grabbing: url("/assets/cursors/grip-32.png") 16 16, grabbing;
  --aog-cursor-not-allowed: url("/assets/cursors/muted-32.png") 3 3, not-allowed;
  --aog-cursor-help: url("/assets/cursors/default-32.png") 3 3, help;
  cursor: var(--aog-cursor-default);
}
a[href], button, summary, select, [role="button"], input[type="checkbox"], input[type="radio"], input[type="range"] { cursor: var(--aog-cursor-pointer, pointer); }
[draggable="true"] { cursor: var(--aog-cursor-grab, grab); }
:disabled, [aria-disabled="true"] { cursor: var(--aog-cursor-not-allowed, not-allowed); }
textarea, input:not([type]), input[type="text"], input[type="email"], input[type="password"], input[type="search"], input[type="number"], input[type="url"], [contenteditable="true"] { cursor: text; }
.cursor-pointer { cursor: var(--aog-cursor-pointer, pointer); }
.cursor-grab { cursor: var(--aog-cursor-grab, grab); }
.cursor-grabbing { cursor: var(--aog-cursor-grabbing, grabbing); }
