keyboard.mjs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import { isPressing } from './state.mjs';
  2. /**
  3. * Filter out events that are not "Enter" keys.
  4. */
  5. function filterEvents(callback) {
  6. return (event) => {
  7. if (event.key !== "Enter")
  8. return;
  9. callback(event);
  10. };
  11. }
  12. function firePointerEvent(target, type) {
  13. target.dispatchEvent(new PointerEvent("pointer" + type, { isPrimary: true, bubbles: true }));
  14. }
  15. const enableKeyboardPress = (focusEvent, eventOptions) => {
  16. const element = focusEvent.currentTarget;
  17. if (!element)
  18. return;
  19. const handleKeydown = filterEvents(() => {
  20. if (isPressing.has(element))
  21. return;
  22. firePointerEvent(element, "down");
  23. const handleKeyup = filterEvents(() => {
  24. firePointerEvent(element, "up");
  25. });
  26. const handleBlur = () => firePointerEvent(element, "cancel");
  27. element.addEventListener("keyup", handleKeyup, eventOptions);
  28. element.addEventListener("blur", handleBlur, eventOptions);
  29. });
  30. element.addEventListener("keydown", handleKeydown, eventOptions);
  31. /**
  32. * Add an event listener that fires on blur to remove the keydown events.
  33. */
  34. element.addEventListener("blur", () => element.removeEventListener("keydown", handleKeydown), eventOptions);
  35. };
  36. export { enableKeyboardPress };