{"version":3,"file":"7062.32a9293144414d5c9a9d.7062.js","mappings":"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","sources":["webpack:///./src/routes/_components/shortcut/Shortcut.html","webpack:///./src/routes/_utils/shortcuts.js"],"sourcesContent":["\n","import { store } from '../_store/store.js'\n\n// A map of scopeKey to KeyMap\nlet scopeKeyMaps\n\n// Current scope, starting with 'global'\nlet currentScopeKey\n\n// Previous current scopes\nlet scopeStack\n\n// Currently active prefix map\nlet prefixMap\n\n// Scope in which prefixMap is valid\nlet prefixMapScope\n\n// A map of key to components or other KeyMaps\nfunction KeyMap () {}\n\nexport function initShortcuts () {\n currentScopeKey = 'global'\n scopeStack = []\n scopeKeyMaps = null\n prefixMap = null\n prefixMapScope = null\n}\ninitShortcuts()\n\n// Sets scopeKey as current scope.\nexport function pushShortcutScope (scopeKey) {\n scopeStack.push(currentScopeKey)\n currentScopeKey = scopeKey\n}\n\n// Go back to previous current scope.\nexport function popShortcutScope (scopeKey) {\n if (scopeKey !== currentScopeKey) {\n return\n }\n currentScopeKey = scopeStack.pop()\n}\n\n// Call component.onKeyDown(event) when a key in keys is pressed\n// in the given scope.\nexport function addToShortcutScope (scopeKey, keys, component) {\n if (scopeKeyMaps == null) {\n window.addEventListener('keydown', onKeyDown)\n scopeKeyMaps = {}\n }\n let keyMap = scopeKeyMaps[scopeKey]\n if (!keyMap) {\n keyMap = new KeyMap()\n scopeKeyMaps[scopeKey] = keyMap\n }\n mapKeys(keyMap, keys, component)\n}\n\nexport function removeFromShortcutScope (scopeKey, keys, component) {\n const keyMap = scopeKeyMaps[scopeKey]\n if (!keyMap) {\n return\n }\n unmapKeys(keyMap, keys, component)\n if (Object.keys(keyMap).length === 0) {\n delete scopeKeyMaps[scopeKey]\n }\n if (Object.keys(scopeKeyMaps).length === 0) {\n scopeKeyMaps = null\n window.removeEventListener('keydown', onKeyDown)\n }\n}\n\nconst FALLBACK_KEY = '__fallback__'\n\n// Call component.onKeyDown(event) if no other shortcuts handled\n// the current key.\nexport function addShortcutFallback (scopeKey, component) {\n addToShortcutScope(scopeKey, FALLBACK_KEY, component)\n}\n\nexport function removeShortcutFallback (scopeKey, component) {\n removeFromShortcutScope(scopeKey, FALLBACK_KEY, component)\n}\n\n// Direct the given event to the appropriate component in the given\n// scope for the event's key.\nexport function onKeyDownInShortcutScope (scopeKey, event) {\n if (prefixMap) {\n let handled = false\n if (prefixMap && prefixMapScope === scopeKey) {\n handled = handleEvent(scopeKey, prefixMap, event.key, event)\n }\n prefixMap = null\n prefixMapScope = null\n if (handled) {\n return\n }\n }\n const keyMap = scopeKeyMaps[scopeKey]\n if (!keyMap) {\n return\n }\n if (!handleEvent(scopeKey, keyMap, event.key, event)) {\n handleEvent(scopeKey, keyMap, FALLBACK_KEY, event)\n }\n}\n\nfunction handleEvent (scopeKey, keyMap, key, event) {\n const value = keyMap[key] || keyMap[key.toLowerCase()] // treat uppercase and lowercase the same (e.g. caps lock)\n if (!value) {\n return false\n }\n if (KeyMap.prototype.isPrototypeOf(value)) { // eslint-disable-line no-prototype-builtins\n prefixMap = value\n prefixMapScope = scopeKey\n } else {\n value.onKeyDown(event)\n }\n return true\n}\n\nfunction onKeyDown (event) {\n if (store.get().disableHotkeys) {\n return\n }\n if (!acceptShortcutEvent(event)) {\n return\n }\n onKeyDownInShortcutScope(currentScopeKey, event)\n}\n\nfunction mapKeys (keyMap, keys, component) {\n keys.split('|').forEach(\n (seq) => {\n const seqArray = seq.split(' ')\n const prefixLen = seqArray.length - 1\n let currentMap = keyMap\n let i = -1\n while (++i < prefixLen) {\n let prefixMap = currentMap[seqArray[i]]\n if (!prefixMap) {\n prefixMap = new KeyMap()\n currentMap[seqArray[i]] = prefixMap\n }\n currentMap = prefixMap\n }\n currentMap[seqArray[prefixLen]] = component\n })\n}\n\nfunction unmapKeys (keyMap, keys, component) {\n keys.split('|').forEach(\n (seq) => {\n const seqArray = seq.split(' ')\n const prefixLen = seqArray.length - 1\n let currentMap = keyMap\n let i = -1\n while (++i < prefixLen) {\n const prefixMap = currentMap[seqArray[i]]\n if (!prefixMap) {\n return\n }\n currentMap = prefixMap\n }\n const lastKey = seqArray[prefixLen]\n if (currentMap[lastKey] === component) {\n delete currentMap[lastKey]\n }\n })\n}\n\nfunction acceptShortcutEvent (event) {\n const { target } = event\n if (\n event.altKey ||\n event.metaKey ||\n event.ctrlKey ||\n (event.shiftKey && event.key !== '?') // '?' is a special case - it is allowed\n ) {\n return false\n }\n if (event.key === 'Escape') {\n // Allow escape everywhere.\n return true\n }\n // Don't allow other keys in text boxes.\n return !(target && (\n target.isContentEditable ||\n ['TEXTAREA', 'SELECT'].includes(target.tagName) ||\n (target.tagName === 'INPUT' && !['radio', 'checkbox'].includes(target.getAttribute('type')))\n ))\n}\n"],"names":["onKeyDown","event","stopPropagation","preventDefault","this","fire","key","timeStamp","scope","get","scopeKeyMaps","currentScopeKey","scopeStack","prefixMap","prefixMapScope","KeyMap","pushShortcutScope","scopeKey","push","popShortcutScope","pop","addToShortcutScope","keys","component","window","addEventListener","keyMap","split","forEach","seq","seqArray","prefixLen","length","currentMap","i","mapKeys","removeFromShortcutScope","lastKey","unmapKeys","Object","removeEventListener","FALLBACK_KEY","addShortcutFallback","removeShortcutFallback","onKeyDownInShortcutScope","handled","handleEvent","value","toLowerCase","prototype","isPrototypeOf","disableHotkeys","target","altKey","metaKey","ctrlKey","shiftKey","isContentEditable","includes","tagName","getAttribute","acceptShortcutEvent"],"sourceRoot":""}