/* SA-HOVER — universal interaction feedback (ported from SaySo, unchanged in substance).
   Rides every module srcdoc AFTER tokens + html css + pack css, so coverage is
   structural: every interactive element answers the pointer, whatever classes
   the module invented. Interaction feedback is NOT decoration — it stays on
   under body.noanim; prefers-reduced-motion keeps the feedback but drops the
   transforms; touch (hover:none) answers with press states instead.
   Timing 150-200ms, ease-out, unmistakable but never bounce-house. */

/* ---- one transition spine for everything that responds ---- */
.mod :is(a,button,[role="button"],[onclick],input[type="submit"],input[type="button"],label[for]){
  transition:transform .17s cubic-bezier(.22,.61,.36,1),filter .17s ease,box-shadow .2s ease,
    color .15s ease,background-color .15s ease,border-color .15s ease,opacity .15s ease,
    text-decoration-color .15s ease;
  -webkit-tap-highlight-color:transparent}

/* ---- buttons + button-shaped anchors: lift, brighten, cast a shadow ---- */
.mod :is(button:not([disabled]),[role="button"],input[type="submit"],input[type="button"],.btn,
  a[class*="btn"],a.sq,a.pill,a.go,a.cta,a.c1,a.c2,a.qgo,a.tel,a.paybtn,a.fbtn):hover{
  transform:translateY(-2px);filter:brightness(1.12) saturate(1.05);
  box-shadow:0 8px 22px rgba(0,0,0,.28)}
.mod :is(button:not([disabled]),[role="button"],input[type="submit"],input[type="button"],.btn,
  a[class*="btn"],a.sq,a.pill,a.go,a.cta,a.c1,a.c2,a.qgo,a.tel,a.paybtn,a.fbtn):active{
  transform:translateY(0) scale(.97);filter:brightness(.95);transition-duration:.06s}

/* ---- card-shaped anchors (block content inside): lift the whole card ---- */
.mod a:not([class*="btn"]):is(:has(img),:has(.ph),:has(div),:has(h1,h2,h3,h4)):hover{
  transform:translateY(-3px);box-shadow:0 12px 28px rgba(0,0,0,.3)}
.mod a:not([class*="btn"]):is(:has(img),:has(.ph),:has(div),:has(h1,h2,h3,h4)):active{
  transform:translateY(-1px);transition-duration:.06s}

/* ---- text links: a 2px underline lands + the ink answers ----
   underline rides currentColor so it is visible on every background, light,
   dark or accent; brightness pulls TOWARD contrast per vibe (.lt = light). */
.mod a:not([class*="btn"]):not(.sq):not(.pill):not(.go):not(.cta):not(.c1):not(.c2):not(.qgo):not(.paybtn):not(.fbtn):not(:has(img,.ph,div,h1,h2,h3,h4)):hover{
  text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:.22em;
  transform:translateY(-1px)}
.mod:not(.lt) a:not([class*="btn"]):not(.sq):not(.pill):not(.go):not(.cta):not(.c1):not(.c2):not(.qgo):not(.paybtn):not(.fbtn):not(:has(img,.ph,div,h1,h2,h3,h4)):hover{filter:brightness(1.25)}
.mod.lt a:not([class*="btn"]):not(.sq):not(.pill):not(.go):not(.cta):not(.c1):not(.c2):not(.qgo):not(.paybtn):not(.fbtn):not(:has(img,.ph,div,h1,h2,h3,h4)):hover{filter:brightness(.72)}
.mod .link:hover{border-color:var(--acc)}

/* ---- generic clickables (onclick spans, chips, labels) ---- */
.mod :is([onclick],label[for]):hover{filter:brightness(1.1);transform:translateY(-1px)}

/* ---- listener-wired clickables (final-fix items 1+5): rows/tiles whose only cue was
   cursor:pointer. The srcdoc runtime stamps data-sacue on the outermost computed-pointer
   element; inline-styled pointers match directly. Feedback = 1px lift + ink shift. ---- */
.mod [data-sacue],.mod [style*="cursor:pointer"],.mod [style*="cursor: pointer"]{
  transition:transform .17s cubic-bezier(.22,.61,.36,1),filter .17s ease,box-shadow .2s ease,
    color .15s ease,background-color .15s ease,opacity .15s ease}
.mod :is([data-sacue],[style*="cursor:pointer"],[style*="cursor: pointer"]):hover{transform:translateY(-1px)}
.mod:not(.lt) :is([data-sacue],[style*="cursor:pointer"],[style*="cursor: pointer"]):hover{filter:brightness(1.18)}
.mod.lt :is([data-sacue],[style*="cursor:pointer"],[style*="cursor: pointer"]):hover{filter:brightness(.9)}
.mod :is([data-sacue],[style*="cursor:pointer"],[style*="cursor: pointer"]):active{transform:translateY(0) scale(.99);filter:brightness(.96);transition-duration:.06s}

/* ---- touch: hover does not exist, the press answers instead ---- */
@media (hover:none){
  .mod :is(a,button,[role="button"],[onclick],input[type="submit"],input[type="button"],[data-sacue],[style*="cursor:pointer"],[style*="cursor: pointer"]):active{
    transform:scale(.97);filter:brightness(.9);transition-duration:.06s}}

/* ---- reduced motion: feedback survives, transforms do not ---- */
@media (prefers-reduced-motion:reduce){
  .mod :is(a,button,[role="button"],[onclick],input[type="submit"],input[type="button"],label[for],[data-sacue],[style*="cursor:pointer"],[style*="cursor: pointer"]):hover,
  .mod :is(a,button,[role="button"],[onclick],input[type="submit"],input[type="button"],label[for],[data-sacue],[style*="cursor:pointer"],[style*="cursor: pointer"]):active{
    transform:none!important}}
