@mantine/hooks
Version:
A collection of 50+ hooks for state and UI management
1 lines • 1.85 kB
Source Map (JSON)
{"version":3,"file":"scope-tab.mjs","names":[],"sources":["../../src/use-focus-trap/scope-tab.ts"],"sourcesContent":["import { findTabbableDescendants } from './tabbable';\n\nexport function scopeTab(node: HTMLElement, event: KeyboardEvent) {\n const tabbable = findTabbableDescendants(node);\n if (!tabbable.length) {\n event.preventDefault();\n return;\n }\n const finalTabbable = tabbable[event.shiftKey ? 0 : tabbable.length - 1];\n const root = node.getRootNode() as unknown as DocumentOrShadowRoot;\n let leavingFinalTabbable = finalTabbable === root.activeElement || node === root.activeElement;\n\n const activeElement = root.activeElement as Element;\n const activeElementIsRadio =\n activeElement.tagName === 'INPUT' && activeElement.getAttribute('type') === 'radio';\n if (activeElementIsRadio) {\n const activeRadioGroup = tabbable.filter(\n (element) =>\n element.getAttribute('type') === 'radio' &&\n element.getAttribute('name') === activeElement.getAttribute('name')\n );\n leavingFinalTabbable = activeRadioGroup.includes(finalTabbable);\n }\n\n if (!leavingFinalTabbable) {\n return;\n }\n\n event.preventDefault();\n\n const target = tabbable[event.shiftKey ? tabbable.length - 1 : 0];\n\n if (target) {\n target.focus();\n }\n}\n"],"mappings":";;;AAEA,SAAgB,SAAS,MAAmB,OAAsB;CAChE,MAAM,WAAW,wBAAwB,KAAK;AAC9C,KAAI,CAAC,SAAS,QAAQ;AACpB,QAAM,gBAAgB;AACtB;;CAEF,MAAM,gBAAgB,SAAS,MAAM,WAAW,IAAI,SAAS,SAAS;CACtE,MAAM,OAAO,KAAK,aAAa;CAC/B,IAAI,uBAAuB,kBAAkB,KAAK,iBAAiB,SAAS,KAAK;CAEjF,MAAM,gBAAgB,KAAK;AAG3B,KADE,cAAc,YAAY,WAAW,cAAc,aAAa,OAAO,KAAK,QAO5E,wBALyB,SAAS,QAC/B,YACC,QAAQ,aAAa,OAAO,KAAK,WACjC,QAAQ,aAAa,OAAO,KAAK,cAAc,aAAa,OAAO,CACtE,CACuC,SAAS,cAAc;AAGjE,KAAI,CAAC,qBACH;AAGF,OAAM,gBAAgB;CAEtB,MAAM,SAAS,SAAS,MAAM,WAAW,SAAS,SAAS,IAAI;AAE/D,KAAI,OACF,QAAO,OAAO"}