lisn.js
Version:
Simply handle user gestures and actions. Includes widgets.
1 lines • 13 kB
Source Map (JSON)
{"version":3,"file":"gesture-key.cjs","names":["MC","_interopRequireWildcard","require","MH","_settings","_directions","_gesture","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","getKeyGestureFragment","events","options","_options$scrollHeight","isIterableObject","LINE","settings","deltaLineHeight","PAGE","deltaPageHeight","CONTENT","scrollHeight","deltasUp","amount","deltasDown","deltasLeft","deltasRight","deltasIn","deltasOut","direction","S_NONE","intent","deltaX","deltaY","deltaZ","event","_deltasForKey$event$k","isKeyboardEvent","type","S_KEYDOWN","deltasForKey","SK_UP","SK_ARROWUP","SK_PAGEUP","Home","SK_DOWN","SK_ARROWDOWN","SK_PAGEDOWN","End","SK_LEFT","SK_ARROWLEFT","SK_RIGHT","SK_ARROWRIGHT","shiftKey","ctrlKey","theseDeltas","key","thisDeltaX","thisDeltaY","thisDeltaZ","thisIntent","S_ZOOM","S_SCROLL","addDeltaZ","S_UNKNOWN","S_AMBIGUOUS","S_IN","S_OUT","getVectorDirection","angleDiffThreshold","device","S_KEY","exports","SK_PAGE","SK_ARROW"],"sources":["../../../src/ts/utils/gesture-key.ts"],"sourcesContent":["/**\n * @module Utils\n */\n\nimport * as MC from \"@lisn/globals/minification-constants\";\nimport * as MH from \"@lisn/globals/minification-helpers\";\n\nimport { settings } from \"@lisn/globals/settings\";\n\nimport { Direction, GestureIntent } from \"@lisn/globals/types\";\n\nimport { getVectorDirection } from \"@lisn/utils/directions\";\n\nimport { GestureFragment, addDeltaZ } from \"@lisn/utils/gesture\";\n\n/**\n * Returns a {@link GestureFragment} for the given events. Only \"keydown\"\n * events will be considered.\n *\n * If there are no \"keydown\" events in the given list of events, returns\n * `false`.\n *\n * The deltas of all events are summed together before determining final delta\n * and direction.\n *\n * If the events are of conflicting types, i.e. some scroll, some zoom, then\n * the intent will be \"unknown\" and the direction will be \"ambiguous\".\n *\n * Otherwise, if the deltas sum up to 0, the direction will be \"none\".\n *\n * **IMPORTANT NOTES ON THE DELTA VALUES**\n *\n * For key gestures the deltas are unreliable. You should not assume they\n * correspond to the would-be scroll or zoom amount that the browser would do.\n * But they can be used to determine relative amounts for animating, etc.\n *\n * Key press events can be divided into 3 categories: that scroll by a \"line\"\n * (e.g. arrow keys), by a \"page\" (e.g. PageUp/PageDown) or by the full content\n * height/width (e.g. Home/End). The actual scroll amount that _would_ result\n * from the event is dependent on the browser, the window size or the element's\n * scroll width/height, so ours can only be a best guess.\n *\n * Since the actual pixel equivalent is browser specific, we use reasonable\n * default values of delta for each of these \"line\", \"page\" or \"content\" modes,\n * similar to what\n * {@link Utils.getWheelGestureFragment | getWheelGestureFragment} does:\n * - For \"line\", then a configurable fixed value is used\n * ({@link settings.deltaLineHeight}).\n * - For \"page\", then a configurable fixed value is used\n * ({@link settings.deltaPageHeight}).\n * - For \"content\", the element's scroll height is used if given, otherwise\n * the viewport height (same as \"page\"). We do not try to get the current\n * scroll height of the target element, (which would be the best guess value\n * of `deltaY` in case of Home/End key presses), as that would either involve\n * an asynchronous action or would result in forced layout. If the caller is\n * already tracking the scroll height of the target, you can pass this as an\n * argument. Otherwise, we'll default to using the viewport height, same as\n * for PageUp/Down.\n *\n * If the key gesture fragment is a result of multiple events that were\n * accumulated, the deltas are summed as usual, e.g. if a \"page\" is equal to 20\n * \"lines\", then pressing PageDown and then 10 times Up, would result in a\n * delta equal to 10 \"lines\" down.\n *\n * For zoom intents, `deltaZ` gives a relative change of scale, whereby each\n * press of + or - steps up by 15% or down by ~13% (`1 / 1.15` to be exact)\n * since the previous one.\n *\n * @param [options.angleDiffThreshold] See {@link getVectorDirection}\n * @param [options.scrollHeight] Use this as deltaY when Home/End is\n * pressed.\n *\n * @returns `false` if there are no \"keydown\" events in the list, otherwise a\n * {@link GestureFragment}.\n *\n * @category Gestures\n */\nexport const getKeyGestureFragment = (\n events: Event | readonly Event[],\n options?: {\n angleDiffThreshold?: number;\n scrollHeight?: number;\n },\n): GestureFragment | false => {\n if (!MH.isIterableObject(events)) {\n events = [events];\n }\n\n const LINE = settings.deltaLineHeight;\n const PAGE = settings.deltaPageHeight;\n const CONTENT = options?.scrollHeight ?? PAGE;\n\n const deltasUp = (amount: number): DeltasArr => [0, -amount, 1];\n const deltasDown = (amount: number): DeltasArr => [0, amount, 1];\n const deltasLeft = (amount: number): DeltasArr => [-amount, 0, 1];\n const deltasRight = (amount: number): DeltasArr => [amount, 0, 1];\n const deltasIn: DeltasArr = [0, 0, 1.15];\n const deltasOut: DeltasArr = [0, 0, 1 / 1.15];\n\n let direction: Direction = MC.S_NONE;\n let intent: GestureIntent | null = null;\n let deltaX = 0,\n deltaY = 0,\n deltaZ = 1;\n\n for (const event of events) {\n if (!MH.isKeyboardEvent(event) || event.type !== MC.S_KEYDOWN) {\n continue;\n }\n\n const deltasForKey: Record<string, DeltasArr | null> = {\n [SK_UP]: deltasUp(LINE),\n [SK_ARROWUP]: deltasUp(LINE),\n [SK_PAGEUP]: deltasUp(PAGE),\n Home: deltasUp(CONTENT),\n [SK_DOWN]: deltasDown(LINE),\n [SK_ARROWDOWN]: deltasDown(LINE),\n [SK_PAGEDOWN]: deltasDown(PAGE),\n End: deltasDown(CONTENT),\n [SK_LEFT]: deltasLeft(LINE),\n [SK_ARROWLEFT]: deltasLeft(LINE),\n [SK_RIGHT]: deltasRight(LINE),\n [SK_ARROWRIGHT]: deltasRight(LINE),\n \" \": (event.shiftKey ? deltasUp : deltasDown)(PAGE),\n \"+\": deltasIn,\n \"=\": event.ctrlKey ? deltasIn : null,\n \"-\": deltasOut,\n };\n\n const theseDeltas = deltasForKey[event.key] ?? null;\n if (!theseDeltas) {\n // not a relevant key\n continue;\n }\n\n const [thisDeltaX, thisDeltaY, thisDeltaZ] = theseDeltas;\n const thisIntent = thisDeltaZ !== 1 ? MC.S_ZOOM : MC.S_SCROLL;\n\n deltaX += thisDeltaX;\n deltaY += thisDeltaY;\n deltaZ = addDeltaZ(deltaZ, thisDeltaZ);\n\n if (!intent) {\n intent = thisIntent;\n } else if (intent !== thisIntent) {\n // mixture of zoom and scroll\n intent = MC.S_UNKNOWN;\n }\n }\n\n if (!intent) {\n return false; // no relevant events\n } else if (intent === MC.S_UNKNOWN) {\n direction = MC.S_AMBIGUOUS;\n } else if (intent === MC.S_ZOOM) {\n direction = deltaZ > 1 ? MC.S_IN : deltaZ < 1 ? MC.S_OUT : MC.S_NONE;\n } else {\n direction = getVectorDirection(\n [deltaX, deltaY],\n options?.angleDiffThreshold,\n );\n }\n\n return direction === MC.S_NONE\n ? false\n : {\n device: MC.S_KEY,\n direction,\n intent,\n deltaX,\n deltaY,\n deltaZ,\n };\n};\n\n// --------------------\n\ntype DeltasArr = [number, number, number];\n\nconst SK_UP = \"Up\";\nconst SK_DOWN = \"Down\";\nconst SK_LEFT = \"Left\";\nconst SK_RIGHT = \"Right\";\nconst SK_PAGE = \"Page\";\nconst SK_ARROW = \"Arrow\";\nconst SK_PAGEUP = (SK_PAGE + SK_UP) as `${typeof SK_PAGE}${typeof SK_UP}`;\nconst SK_PAGEDOWN = (SK_PAGE + SK_DOWN) as `${typeof SK_PAGE}${typeof SK_DOWN}`;\nconst SK_ARROWUP = (SK_ARROW + SK_UP) as `${typeof SK_ARROW}${typeof SK_UP}`;\nconst SK_ARROWDOWN = (SK_ARROW +\n SK_DOWN) as `${typeof SK_ARROW}${typeof SK_DOWN}`;\nconst SK_ARROWLEFT = (SK_ARROW +\n SK_LEFT) as `${typeof SK_ARROW}${typeof SK_LEFT}`;\nconst SK_ARROWRIGHT = (SK_ARROW +\n SK_RIGHT) as `${typeof SK_ARROW}${typeof SK_RIGHT}`;\n"],"mappings":"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","ignoreList":[]}