{"version":3,"file":"useInputModality.cjs","sources":["../../../../src/hooks/internal/useInputModality.ts"],"sourcesContent":["import {\n  type FocusEvent,\n  type KeyboardEvent,\n  type PointerEvent,\n  useCallback,\n} from 'react';\n\nconst MODIFIER_KEYS = new Set(['Meta', 'Control', 'Alt', 'Shift', 'CapsLock']);\n\n/**\n * WCAG SC 2.4.7 requires a visible keyboard focus indicator, but hover\n * styling is not mandated and adding a focus ring on hover would be\n * visually disruptive. Radix uses a single `data-highlighted` attribute\n * for both hover and keyboard focus, so we track input modality on the\n * container to let CSS distinguish the two.\n *\n * Spread the returned props onto a menu container element.\n */\n\n// Global modality tracks the last input method so that menus opened via\n// keyboard can seed their container's data attribute before any per-container\n// event fires (the triggering keydown happens on the trigger, not the content).\nlet lastGlobalModality: 'keyboard' | 'pointer' = 'pointer';\n\nif (typeof document !== 'undefined') {\n  document.addEventListener(\n    'keydown',\n    (e: globalThis.KeyboardEvent) => {\n      if (!MODIFIER_KEYS.has(e.key)) {\n        lastGlobalModality = 'keyboard';\n      }\n    },\n    true\n  );\n  document.addEventListener(\n    'pointerdown',\n    () => {\n      lastGlobalModality = 'pointer';\n    },\n    true\n  );\n  document.addEventListener(\n    'pointermove',\n    () => {\n      lastGlobalModality = 'pointer';\n    },\n    true\n  );\n}\n\nexport const useInputModality = () => {\n  const onKeyDownCapture = useCallback((e: KeyboardEvent<HTMLElement>) => {\n    if (!MODIFIER_KEYS.has(e.key)) {\n      e.currentTarget.dataset.inputModality = 'keyboard';\n    }\n  }, []);\n\n  const onPointerMove = useCallback((e: PointerEvent<HTMLElement>) => {\n    e.currentTarget.dataset.inputModality = 'pointer';\n  }, []);\n\n  const onPointerDown = useCallback((e: PointerEvent<HTMLElement>) => {\n    e.currentTarget.dataset.inputModality = 'pointer';\n  }, []);\n\n  const onFocusCapture = useCallback((e: FocusEvent<HTMLElement>) => {\n    e.currentTarget.dataset.inputModality = lastGlobalModality;\n  }, []);\n\n  return { onKeyDownCapture, onPointerMove, onPointerDown, onFocusCapture };\n};\n"],"names":["useCallback"],"mappings":";;;;;;AAOA,MAAM,aAAA,uBAAoB,GAAA,CAAI,CAAC,QAAQ,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,UAAU,CAAC,CAAA;AAe7E,IAAI,kBAAA,GAA6C,SAAA;AAEjD,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,EAAA,QAAA,CAAS,gBAAA;AAAA,IACP,SAAA;AAAA,IACA,CAAC,CAAA,KAAgC;AAC/B,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,EAAG;AAC7B,QAAA,kBAAA,GAAqB,UAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,QAAA,CAAS,gBAAA;AAAA,IACP,aAAA;AAAA,IACA,MAAM;AACJ,MAAA,kBAAA,GAAqB,SAAA;AAAA,IACvB,CAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,QAAA,CAAS,gBAAA;AAAA,IACP,aAAA;AAAA,IACA,MAAM;AACJ,MAAA,kBAAA,GAAqB,SAAA;AAAA,IACvB,CAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,MAAM,mBAAmB,MAAM;AACpC,EAAA,MAAM,gBAAA,GAAmBA,iBAAA,CAAY,CAAC,CAAA,KAAkC;AACtE,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,EAAG;AAC7B,MAAA,CAAA,CAAE,aAAA,CAAc,QAAQ,aAAA,GAAgB,UAAA;AAAA,IAC1C;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,iBAAA,CAAY,CAAC,CAAA,KAAiC;AAClE,IAAA,CAAA,CAAE,aAAA,CAAc,QAAQ,aAAA,GAAgB,SAAA;AAAA,EAC1C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,iBAAA,CAAY,CAAC,CAAA,KAAiC;AAClE,IAAA,CAAA,CAAE,aAAA,CAAc,QAAQ,aAAA,GAAgB,SAAA;AAAA,EAC1C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBA,iBAAA,CAAY,CAAC,CAAA,KAA+B;AACjE,IAAA,CAAA,CAAE,aAAA,CAAc,QAAQ,aAAA,GAAgB,kBAAA;AAAA,EAC1C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,gBAAA,EAAkB,aAAA,EAAe,aAAA,EAAe,cAAA,EAAe;AAC1E;;"}