{"version":3,"file":"utils.js","sources":["../../src/RovingFocus/utils.ts"],"sourcesContent":["import { getActiveElement } from '@/shared'\n\nexport type Orientation = 'horizontal' | 'vertical'\nexport type Direction = 'ltr' | 'rtl'\n\nexport const ENTRY_FOCUS = 'rovingFocusGroup.onEntryFocus'\nexport const EVENT_OPTIONS = { bubbles: false, cancelable: true }\n\nexport const MAP_KEY_TO_FOCUS_INTENT: Record = {\n ArrowLeft: 'prev',\n ArrowUp: 'prev',\n ArrowRight: 'next',\n ArrowDown: 'next',\n PageUp: 'first',\n Home: 'first',\n PageDown: 'last',\n End: 'last',\n}\n\nexport function getDirectionAwareKey(key: string, dir?: Direction) {\n if (dir !== 'rtl')\n return key\n return key === 'ArrowLeft'\n ? 'ArrowRight'\n : key === 'ArrowRight'\n ? 'ArrowLeft'\n : key\n}\n\ntype FocusIntent = 'first' | 'last' | 'prev' | 'next'\n\nexport function getFocusIntent(\n event: KeyboardEvent,\n orientation?: Orientation,\n dir?: Direction,\n) {\n const key = getDirectionAwareKey(event.key, dir)\n if (orientation === 'vertical' && ['ArrowLeft', 'ArrowRight'].includes(key))\n return undefined\n if (orientation === 'horizontal' && ['ArrowUp', 'ArrowDown'].includes(key))\n return undefined\n return MAP_KEY_TO_FOCUS_INTENT[key]\n}\n\nexport function focusFirst(candidates: HTMLElement[], preventScroll = false) {\n const PREVIOUSLY_FOCUSED_ELEMENT = getActiveElement()\n for (const candidate of candidates) {\n // if focus is already where we want to go, we don't want to keep going through the candidates\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT)\n return\n candidate.focus({ preventScroll })\n if (getActiveElement() !== PREVIOUSLY_FOCUSED_ELEMENT)\n return\n }\n}\n\n/**\n * Wraps an array around itself at a given start index\n * Example: `wrapArray(['a', 'b', 'c', 'd'], 2) === ['c', 'd', 'a', 'b']`\n */\nexport function wrapArray(array: T[], startIndex: number) {\n return array.map((_, index) => array[(startIndex + index) % array.length])\n}\n"],"names":[],"mappings":";;AAKO,MAAM,WAAc,GAAA;AACpB,MAAM,aAAgB,GAAA,EAAE,OAAS,EAAA,KAAA,EAAO,YAAY,IAAK;AAEzD,MAAM,uBAAuD,GAAA;AAAA,EAClE,SAAW,EAAA,MAAA;AAAA,EACX,OAAS,EAAA,MAAA;AAAA,EACT,UAAY,EAAA,MAAA;AAAA,EACZ,SAAW,EAAA,MAAA;AAAA,EACX,MAAQ,EAAA,OAAA;AAAA,EACR,IAAM,EAAA,OAAA;AAAA,EACN,QAAU,EAAA,MAAA;AAAA,EACV,GAAK,EAAA;AACP;AAEgB,SAAA,oBAAA,CAAqB,KAAa,GAAiB,EAAA;AACjE,EAAA,IAAI,GAAQ,KAAA,KAAA;AACV,IAAO,OAAA,GAAA;AACT,EAAA,OAAO,GAAQ,KAAA,WAAA,GACX,YACA,GAAA,GAAA,KAAQ,eACN,WACA,GAAA,GAAA;AACR;AAIgB,SAAA,cAAA,CACd,KACA,EAAA,WAAA,EACA,GACA,EAAA;AACA,EAAA,MAAM,GAAM,GAAA,oBAAA,CAAqB,KAAM,CAAA,GAAA,EAAK,GAAG,CAAA;AAC/C,EAAA,IAAI,gBAAgB,UAAc,IAAA,CAAC,aAAa,YAAY,CAAA,CAAE,SAAS,GAAG,CAAA;AACxE,IAAO,OAAA,MAAA;AACT,EAAA,IAAI,gBAAgB,YAAgB,IAAA,CAAC,WAAW,WAAW,CAAA,CAAE,SAAS,GAAG,CAAA;AACvE,IAAO,OAAA,MAAA;AACT,EAAA,OAAO,wBAAwB,GAAG,CAAA;AACpC;AAEgB,SAAA,UAAA,CAAW,UAA2B,EAAA,aAAA,GAAgB,KAAO,EAAA;AAC3E,EAAA,MAAM,6BAA6B,gBAAiB,EAAA;AACpD,EAAA,KAAA,MAAW,aAAa,UAAY,EAAA;AAElC,IAAA,IAAI,SAAc,KAAA,0BAAA;AAChB,MAAA;AACF,IAAU,SAAA,CAAA,KAAA,CAAM,EAAE,aAAA,EAAe,CAAA;AACjC,IAAA,IAAI,kBAAuB,KAAA,0BAAA;AACzB,MAAA;AAAA;AAEN;AAMgB,SAAA,SAAA,CAAa,OAAY,UAAoB,EAAA;AAC3D,EAAO,OAAA,KAAA,CAAM,GAAI,CAAA,CAAC,CAAG,EAAA,KAAA,KAAU,OAAO,UAAa,GAAA,KAAA,IAAS,KAAM,CAAA,MAAM,CAAC,CAAA;AAC3E;;;;"}