{"version":3,"file":"create-scoped-keydown-handler.cjs","sources":["../../../../src/core/utils/create-scoped-keydown-handler/create-scoped-keydown-handler.ts"],"sourcesContent":["import { findElementAncestor } from '../find-element-ancestor/find-element-ancestor';\n\nfunction getPreviousIndex(current: number, elements: HTMLButtonElement[], loop: boolean) {\n  for (let i = current - 1; i >= 0; i -= 1) {\n    if (!elements[i].disabled) {\n      return i;\n    }\n  }\n\n  if (loop) {\n    for (let i = elements.length - 1; i > -1; i -= 1) {\n      if (!elements[i].disabled) {\n        return i;\n      }\n    }\n  }\n\n  return current;\n}\n\nfunction getNextIndex(current: number, elements: HTMLButtonElement[], loop: boolean) {\n  for (let i = current + 1; i < elements.length; i += 1) {\n    if (!elements[i].disabled) {\n      return i;\n    }\n  }\n\n  if (loop) {\n    for (let i = 0; i < elements.length; i += 1) {\n      if (!elements[i].disabled) {\n        return i;\n      }\n    }\n  }\n\n  return current;\n}\n\n/** Validates that target element is on the same level as sibling, used to filter out children that have the same sibling selector */\nfunction onSameLevel(\n  target: HTMLButtonElement,\n  sibling: HTMLButtonElement,\n  parentSelector: string\n) {\n  return (\n    findElementAncestor(target, parentSelector) === findElementAncestor(sibling, parentSelector)\n  );\n}\n\ninterface GetElementsSiblingsInput {\n  /** Selector used to find parent node, e.g. '[role=\"tablist\"]', '.raikou-Text-root' */\n  parentSelector: string;\n\n  /** Selector used to find element siblings, e.g. '[data-tab]' */\n  siblingSelector: string;\n\n  /** Determines whether next/previous indices should loop */\n  loop?: boolean;\n\n  /** Determines which arrow keys will be used */\n  orientation: 'vertical' | 'horizontal';\n\n  /** Text direction */\n  dir?: 'rtl' | 'ltr';\n\n  /** Determines whether element should be clicked when focused with keyboard event */\n  activateOnFocus?: boolean;\n\n  /** External keydown event */\n  onKeyDown?: (event: React.KeyboardEvent<HTMLButtonElement>) => void;\n}\n\nexport function createScopedKeydownHandler({\n  parentSelector,\n  siblingSelector,\n  onKeyDown,\n  loop = true,\n  activateOnFocus = false,\n  dir = 'rtl',\n  orientation,\n}: GetElementsSiblingsInput) {\n  return (event: React.KeyboardEvent<HTMLButtonElement>) => {\n    onKeyDown?.(event);\n\n    const elements = Array.from(\n      findElementAncestor(event.currentTarget, parentSelector)?.querySelectorAll<HTMLButtonElement>(\n        siblingSelector\n      ) || []\n    ).filter((node) => onSameLevel(event.currentTarget, node, parentSelector));\n\n    const current = elements.findIndex((el) => event.currentTarget === el);\n    const _nextIndex = getNextIndex(current, elements, loop);\n    const _previousIndex = getPreviousIndex(current, elements, loop);\n    const nextIndex = dir === 'rtl' ? _previousIndex : _nextIndex;\n    const previousIndex = dir === 'rtl' ? _nextIndex : _previousIndex;\n\n    switch (event.key) {\n      case 'ArrowRight': {\n        if (orientation === 'horizontal') {\n          event.stopPropagation();\n          event.preventDefault();\n          elements[nextIndex].focus();\n          activateOnFocus && elements[nextIndex].click();\n        }\n\n        break;\n      }\n\n      case 'ArrowLeft': {\n        if (orientation === 'horizontal') {\n          event.stopPropagation();\n          event.preventDefault();\n          elements[previousIndex].focus();\n          activateOnFocus && elements[previousIndex].click();\n        }\n\n        break;\n      }\n\n      case 'ArrowUp': {\n        if (orientation === 'vertical') {\n          event.stopPropagation();\n          event.preventDefault();\n          elements[_previousIndex].focus();\n          activateOnFocus && elements[_previousIndex].click();\n        }\n\n        break;\n      }\n\n      case 'ArrowDown': {\n        if (orientation === 'vertical') {\n          event.stopPropagation();\n          event.preventDefault();\n          elements[_nextIndex].focus();\n          activateOnFocus && elements[_nextIndex].click();\n        }\n\n        break;\n      }\n\n      case 'Home': {\n        event.stopPropagation();\n        event.preventDefault();\n        !elements[0].disabled && elements[0].focus();\n        break;\n      }\n\n      case 'End': {\n        event.stopPropagation();\n        event.preventDefault();\n        const last = elements.length - 1;\n        !elements[last].disabled && elements[last].focus();\n        break;\n      }\n    }\n  };\n}\n"],"names":["findElementAncestor"],"mappings":"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"}