{"version":3,"sources":["../../../../src/components/List/ListItem/useListItem.ts"],"sourcesContent":["'use client';\n\nimport type * as React from 'react';\nimport { useListItemBase_unstable } from '@fluentui/react-list';\nimport { useFluent_unstable } from '@fluentui/react-shared-contexts';\nimport { getRTLSafeKey, isHTMLElement, useEventCallback } from '@fluentui/react-utilities';\nimport {\n  ArrowDown,\n  ArrowLeft,\n  ArrowRight,\n  ArrowUp,\n  End,\n  Escape,\n  Home,\n  PageDown,\n  PageUp,\n} from '@fluentui/keyboard-keys';\n\nimport type { ListItemProps, ListItemState } from './ListItem.types';\nimport { getListFocusableElements } from '../listNavigation';\nimport { useListNavigationMode } from '../listNavigationContext';\nimport { toDataAttributeValue } from '../../../utils';\n\nconst editableTargetSelector =\n  'input:not([type=\"checkbox\" i]):not([type=\"radio\" i]):not([type=\"button\" i]):not([type=\"submit\" i]):not([type=\"reset\" i]):not([type=\"image\" i]):not([type=\"hidden\" i]), ' +\n  'textarea, select, [contenteditable=\"\"], [contenteditable=\"true\" i], [contenteditable=\"plaintext-only\" i], ' +\n  'audio[controls], video[controls], iframe, object';\n\n/**\n * Returns the state for a ListItem component, given its props and ref.\n * The returned state can be modified with hooks before being passed to `renderListItem`.\n */\nexport const useListItem = (props: ListItemProps, ref: React.Ref<HTMLLIElement | HTMLDivElement>): ListItemState => {\n  const baseState = useListItemBase_unstable(props, ref);\n  const navigationMode = useListNavigationMode();\n  const { dir } = useFluent_unstable();\n  const onKeyDown: React.KeyboardEventHandler<HTMLElement> | undefined = baseState.root.onKeyDown;\n\n  const handleKeyDown: React.KeyboardEventHandler<HTMLElement> = useEventCallback(event => {\n    onKeyDown?.(event);\n\n    if (\n      event.defaultPrevented ||\n      navigationMode !== 'composite' ||\n      event.altKey ||\n      event.ctrlKey ||\n      event.metaKey ||\n      event.shiftKey\n    ) {\n      return;\n    }\n\n    const root = event.currentTarget;\n    const target = event.target;\n    const list = root.closest<HTMLElement>('[data-list]');\n    if (\n      !isHTMLElement(target) ||\n      target.closest('[data-navigable]') !== root ||\n      target.closest('[data-list]') !== list\n    ) {\n      return;\n    }\n\n    const key = getRTLSafeKey(event.key, dir);\n    if (target !== root && key !== Escape && target.closest(editableTargetSelector)) {\n      return;\n    }\n\n    if (key === ArrowRight || key === ArrowLeft) {\n      const controls = getListFocusableElements(root).filter(\n        element => element.closest('[data-navigable]') === root && element.closest('[data-list]') === list,\n      );\n      const step = key === ArrowRight ? 1 : -1;\n      const start = target === root ? -1 : controls.indexOf(target);\n\n      for (let index = start + step; index >= 0 && index < controls.length; index += step) {\n        controls[index].focus();\n        if (controls[index].matches(':focus')) {\n          event.preventDefault();\n          return;\n        }\n      }\n\n      if (key === ArrowLeft && target !== root) {\n        root.focus();\n        event.preventDefault();\n      }\n      return;\n    }\n\n    if (key === Escape && target !== root) {\n      root.focus();\n      event.preventDefault();\n      return;\n    }\n\n    if (target !== root && key !== ArrowUp && key !== ArrowDown) {\n      return;\n    }\n\n    const rows = (list ? getListFocusableElements(list) : []).filter(\n      element => element.hasAttribute('data-navigable') && element.closest('[data-list]') === list,\n    );\n    let step: number;\n    let start: number;\n\n    switch (key) {\n      case ArrowUp:\n        step = -1;\n        start = rows.indexOf(root) - 1;\n        break;\n      case ArrowDown:\n        step = 1;\n        start = rows.indexOf(root) + 1;\n        break;\n      case Home:\n      case PageUp:\n        step = 1;\n        start = 0;\n        break;\n      case End:\n      case PageDown:\n        step = -1;\n        start = rows.length - 1;\n        break;\n      default:\n        return;\n    }\n\n    for (let index = start; index >= 0 && index < rows.length; index += step) {\n      rows[index].focus();\n      if (rows[index].matches(':focus')) {\n        event.preventDefault();\n        return;\n      }\n    }\n\n    root.focus();\n    event.preventDefault();\n  });\n\n  return {\n    ...baseState,\n    root: {\n      ...baseState.root,\n      'data-selectable': toDataAttributeValue(baseState.selectable),\n      'data-navigable': toDataAttributeValue(baseState.navigable),\n      'data-selected': toDataAttributeValue(baseState.root['aria-selected']),\n      'data-disabled': toDataAttributeValue(baseState.root['aria-disabled']),\n      ...(navigationMode === 'composite' && { focusgroup: undefined, onKeyDown: handleKeyDown }),\n    },\n  };\n};\n"],"names":["useListItem","editableTargetSelector","props","ref","baseState","useListItemBase_unstable","navigationMode","useListNavigationMode","dir","useFluent_unstable","onKeyDown","root","handleKeyDown","useEventCallback","event","defaultPrevented","altKey","ctrlKey","metaKey","shiftKey","currentTarget","target","list","closest","isHTMLElement","key","getRTLSafeKey","Escape","ArrowRight","ArrowLeft","controls","getListFocusableElements","filter","element","step","start","indexOf","index","length","focus","matches","preventDefault","ArrowUp","ArrowDown","rows","hasAttribute","Home","PageUp","End","PageDown","toDataAttributeValue","selectable","navigable","focusgroup","undefined"],"mappings":"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"}